スキャフォールド
一般的なプロジェクトタイプ向けのプロジェクトスキャフォールディングテンプレートとボイラープレート生成。ベストプラクティスに沿ったデフォルト設定を提供します。
プロジェクトタイプ意思決定ツリー
何を構築しますか?
│
├─ API / バックエンドサービス
│ ├─ REST API
│ │ ├─ Python → FastAPI(非同期、OpenAPI自動ドキュメント)
│ │ ├─ Node.js → Express または Fastify(パフォーマンス重視ならFastify)
│ │ ├─ Go → Gin(使いやすい)または Echo(ミドルウェア豊富)
│ │ └─ Rust → Axum(towerエコシステム、非同期ファースト)
│ ├─ GraphQL API
│ │ ├─ Python → Strawberry + FastAPI
│ │ ├─ Node.js → Apollo Server または Pothos + Yoga
│ │ ├─ Go → gqlgen(コードファースト)
│ │ └─ Rust → async-graphql + Axum
│ └─ gRPCサービス
│ ├─ Python → grpcio + protobuf
│ ├─ Go → google.golang.org/grpc
│ └─ Rust → tonic
│
├─ Webアプリケーション
│ ├─ フルスタック(SSR)
│ │ ├─ Reactエコシステム → Next.js 14+(App Router)
│ │ ├─ Vueエコシステム → Nuxt 3
│ │ ├─ Svelteエコシステム → SvelteKit
│ │ └─ コンテンツ重視/マルチフレームワーク → Astro
│ ├─ SPA(クライアントサイドのみ)
│ │ ├─ React → Vite + React + React Router
│ │ ├─ Vue → Vite + Vue + Vue Router
│ │ └─ Svelte → Vite + Svelte + svelte-routing
│ └─ 静的サイト
│ ├─ ブログ/ドキュメント → Astro または VitePress
│ └─ マーケティング/ランディング → Astro または Next.js(静的エクスポート)
│
├─ CLIツール
│ ├─ Python → Typer(シンプル)または Click(複雑)
│ ├─ Node.js → Commander + Inquirer
│ ├─ Go → Cobra + Viper
│ └─ Rust → Clap(derive API)
│
├─ ライブラリ/パッケージ
│ ├─ npmパッケージ → TypeScript + tsup + Vitest
│ ├─ PyPIパッケージ → uv + pyproject.toml + pytest
│ ├─ Goモジュール → go mod init + go test
│ └─ Rustクレート → cargo init --lib + cargo test
│
└─ モノレポ
├─ JavaScript/TypeScript → Turborepo + pnpm workspaces
├─ フルスタックJS → Nx
├─ Go → Go workspaces (go.work)
├─ Rust → Cargo workspaces
└─ Python → uv workspaces または hatch
スタック選択マトリックス
| プロジェクトタイプ | 言語 | フレームワーク | データベース | ORM/クエリビルダー | デプロイ先 |
|---|
| REST API | Python | FastAPI | PostgreSQL | SQLAlchemy + Alembic | Docker / AWS ECS |
| REST API | Node.js | Fastify | PostgreSQL | Prisma または Drizzle | Docker / Vercel |
| REST API | Go | Gin | PostgreSQL | sqlx (生) または GORM | Docker / Fly.io |
| REST API | Rust | Axum | PostgreSQL | sqlx | Docker / Fly.io |
| Webアプリ | TypeScript | Next.js 14+ | PostgreSQL | Prisma または Drizzle | Vercel / Docker |
| Webアプリ | TypeScript | Nuxt 3 | PostgreSQL | Prisma | Vercel / Netlify |
| Webアプリ | TypeScript | Astro | SQLite / なし | Drizzle | Cloudflare / Netlify |
| CLIツール | Python | Typer | SQLite | sqlite3 stdlib | PyPI |
| CLIツール | Go | Cobra | SQLite / BoltDB | sqlx | GitHub Releases |
| CLIツール | Rust | Clap | SQLite | rusqlite | crates.io |
| ライブラリ | TypeScript | tsup | n/a | n/a | npm |
| ライブラリ | Python | hatch/uv | n/a | n/a | PyPI |
クイックスキャフォールドコマンド
Python (API)
mkdir my-api && cd my-api
uv init --python 3.12
uv add fastapi uvicorn sqlalchemy alembic psycopg2-binary pydantic-settings
uv add --dev pytest pytest-asyncio httpx ruff mypy
Node.js (Webアプリ)
npx create-next-app@latest my-app --typescript --tailwind --eslint --app --src-dir --import-alias "@/*"
npm create vite@latest my-app -- --template react-ts
Go (API)
mkdir my-api && cd my-api
go mod init github.com/user/my-api
go get github.com/gin-gonic/gin
go get github.com/jmoiron/sqlx
go get github.com/lib/pq
Rust (CLI)
cargo init my-cli
cd my-cli
cargo add clap --features derive
cargo add serde --features derive
cargo add anyhow tokio --features tokio/full
モノレポ (Turborepo)
npx create-turbo@latest my-monorepo
mkdir my-monorepo && cd my-monorepo
npm init -y
npm install turbo --save-dev
mkdir -p apps/web apps/api packages/shared
APIプロジェクトテンプレート
ディレクトリ構造 (FastAPI例)
my-api/
├── src/
│ └── my_api/
│ ├── __init__.py
│ ├── main.py # FastAPIアプリ、ライフスパン、ミドルウェア
│ ├── config.py # pydantic-settingsによる設定
│ ├── database.py # SQLAlchemyエンジン、セッション
│ ├── dependencies.py # 共有FastAPI依存関係
│ ├── routers/
│ │ ├── __init__.py
│ │ ├── health.py # ヘルスチェックエンドポイント
│ │ └── users.py # ユーザーCRUDエンドポイント
│ ├── models/
│ │ ├── __init__.py
│ │ └── user.py # SQLAlchemyモデル
│ ├── schemas/
│ │ ├── __init__.py
│ │ └── user.py # Pydanticリクエスト/レスポンススキーマ
│ └── services/
│ ├── __init__.py
│ └── user.py # ビジネスロジック
├── alembic/
│ ├── alembic.ini
│ ├── env.py
│ └── versions/
├── tests/
│ ├── conftest.py # フィクスチャ: テストDB、クライアント、ファクトリ
│ ├── test_health.py
│ └── test_users.py
├── pyproject.toml
├── Dockerfile
├── docker-compose.yml
├── .env.example
├── .gitignore
└── .dockerignore
ディレクトリ構造 (Express/Fastify例)
my-api/
├── src/
│ ├── index.ts # エントリポイント、サーバー起動
│ ├── app.ts # Express/Fastifyアプリ設定
│ ├── config.ts # zod検証付き環境設定
│ ├── database.ts # PrismaクライアントまたはDrizzle設定
│ ├── middleware/
│ │ ├── auth.ts
│ │ ├── error-handler.ts
│ │ └── request-logger.ts
│ ├── routes/
│ │ ├── health.ts
│ │ └── users.ts
│ ├── services/
│ │ └── user.service.ts
│ └── types/
│ └── index.ts
├── prisma/
│ └── schema.prisma
├── tests/
│ ├── setup.ts
│ └── routes/
│ └── users.test.ts
├── package.json
├── tsconfig.json
├── Dockerfile
├── docker-compose.yml
├── .env.example
└── .gitignore
Webアプリケーションプロジェクトテンプレート
ディレクトリ構造 (Next.js App Router)
my-app/
├── src/
│ ├── app/
│ │ ├── layout.tsx # ルートレイアウト
│ │ ├── page.tsx # ホームページ
│ │ ├── loading.tsx # グローバルローディングUI
│ │ ├── error.tsx # グローバルエラーバウンダリ
│ │ ├── not-found.tsx # 404ページ
│ │ ├── globals.css # グローバルスタイル + Tailwind
│ │ ├── (auth)/
│ │ │ ├── login/page.tsx
│ │ │ └── register/page.tsx
│ │ ├── dashboard/
│ │ │ ├── layout.tsx
│ │ │ └── page.tsx
│ │ └── api/
│ │ └── health/route.ts
│ ├── components/
│ │ ├── ui/ # 再利用可能なプリミティブ
│ │ └── features/ # 機能固有のコンポーネント
│ ├── lib/
│ │ ├── db.ts # データベースクライアント
│ │ ├── auth.ts # 認証ヘルパー
│ │ └── utils.ts # 共有ユーティリティ
│ └── types/
│ └── index.ts
├── public/
│ └── favicon.ico
├── tests/
│ ├── setup.ts
│ └── components/
├── next.config.ts
├── tailwind.config.ts
├── tsconfig.json
├── package.json
├── .env.local.example
└── .gitignore
CLIツールプロジェクトテンプレート
ディレクトリ構造 (Python / Typer)
my-cli/
├── src/
│ └── my_cli/
│ ├── __init__.py
│ ├── __main__.py # python -m my_cliのエントリ
│ ├── cli.py # Typerアプリ、コマンドグループ
│ ├── commands/
│ │ ├── __init__.py
│ │ ├── init.py # my-cli init
│ │ └── run.py # my-cli run
│ ├── config.py # 設定ファイルの読み込み (TOML/YAML)
│ └── utils.py
├── tests/
│ ├── conftest.py
│ └── test_commands.py
├── pyproject.toml # [project.scripts] エントリポイント
├── .gitignore
└── README.md
ディレクトリ構造 (Go / Cobra)
my-cli/
├── cmd/
│ ├── root.go # ルートコマンド、グローバルフラグ
│ ├── init.go # my-cli init
│ └── run.go # my-cli run
├── internal/
│ ├── config/
│ │ └── config.go # Viper設定読み込み
│ └── runner/
│ └── runner.go # コアロジック
├── main.go # エントリポイント、cmd.Execute()を呼び出す
├── go.mod
├── go.sum
├── Makefile
└── .gitignore
ライブラリプロジェクトテンプレート
ディレクトリ構造 (npmパッケージ)
my-lib/
├── src/
│ ├── index.ts # 公開APIエクスポート
│ ├── core.ts # コア実装
│ └── types.ts # 公開型定義
├── tests/
│ └── core.test.ts
├── package.json # "type": "module", exportsマップ
├── tsconfig.json # declaration: true, declarationMap: true
├── tsup.config.ts # ビルド設定: cjs + esm
├── vitest.config.ts
├── .npmignore
├── .gitignore
├── CHANGELOG.md
└── LICENSE
ディレクトリ構造 (PyPIパッケージ)
my-lib/
├── src/
│ └── my_lib/
│ ├── __init__.py # 公開API、__version__
│ ├── core.py
│ └── py.typed # PEP 561マーカー
├── tests/
│ ├── conftest.py
│ └── test_core.py
├── pyproject.toml # ビルドシステム、メタデータ、ツール設定
├── .gitignore
├── CHANGELOG.md
└── LICENSE
モノレポテンプレート
Turborepo + pnpm Workspaces
my-monorepo/
├── apps/
│ ├── web/ # Next.jsフロントエンド
│ │ ├── src/
│ │ ├── package.json # @repo/sharedに依存
│ │ └── tsconfig.json # ../../tsconfig.base.jsonを拡張
│ └── api/ # Fastifyバックエンド
│ ├── src/
│ ├── package.json
│ └── tsconfig.json
├── packages/
│ ├── shared/ # 共有型、ユーティリティ、バリデータ
│ │ ├── src/
│ │ ├── package.json # "name": "@repo/shared"
│ │ └── tsconfig.json
│ ├── ui/ # 共有Reactコンポーネント
│ │ ├── src/
│ │ └── package.json # "name": "@repo/ui"
│ └── config/ # 共有設定
│ ├── eslint/
│ ├── typescript/
│ └── package.json
├── turbo.json # パイプライン: build, test, lint
├── pnpm-workspace.yaml # packages: ["apps/*", "packages/*"]
├── package.json # ルートdevDeps: turbo
├── tsconfig.base.json # 共有TypeScript設定
├── .gitignore
└── .npmrc
Cargo Workspaces (Rust)
my-workspace/
├── crates/
│ ├── my-core/ # コアライブラリ
│ │ ├── src/lib.rs
│ │ └── Cargo.toml
│ ├── my-cli/ # CLIバイナリ
│ │ ├── src/main.rs
│ │ └── Cargo.toml # my-coreに依存
│ └── my-server/ # APIバイナリ
│ ├── src/main.rs
│ └── Cargo.toml
├── Cargo.toml # [workspace] members = ["crates/*"]
├── Cargo.lock
├── .gitignore
└── rust-toolchain.toml
よくある追加設定チェックリスト
プロジェクト設定完了? 以下を追加:
│
├─ バージョン管理
│ ├─ [ ] .gitignore(言語固有)
│ ├─ [ ] .gitattributes(改行コード、バイナリファイル)
│ └─ [ ] ブランチ保護ルール
│
├─ CI/CD
│ ├─ [ ] GitHub Actionsワークフロー(PRでテスト、マージでデプロイ)
│ ├─ [ ] マトリックステスト(OS、ランタイムバージョン)
│ └─ [ ] リリース自動化
│
├─ Docker
│ ├─ [ ] マルチステージDockerfile
│ ├─ [ ] docker-compose.yml(アプリ + データベース + キャッシュ)
│ ├─ [ ] .dockerignore
│ └─ [ ] ヘルスチェックエンドポイント
│
├─ コード品質
│ ├─ [ ] リンター(ESLint, Ruff, golangci-lint, Clippy)
│ ├─ [ ] フォーマッター(Prettier, Black/Ruff, gofmt, rustfmt)
│ ├─ [ ] プリコミットフック(Husky, pre-commit)
│ └─ [ ] 型チェック(TypeScript strict, mypy, go vet)
│
├─ テスト
│ ├─ [ ] テストフレームワーク設定(Vitest, pytest, go test)
│ ├─ [ ] カバレッジレポート
│ ├─ [ ] テストデータベース設定
│ └─ [ ] CIテストパイプライン
│
├─ エディタ
│ ├─ [ ] .editorconfig
│ ├─ [ ] .vscode/settings.json
│ └─ [ ] .vscode/extensions.json
│
└─ ドキュメント
├─ [ ] README.md(プロジェクト説明、設定、使い方)
├─ [ ] AGENTS.md — repo-doctorスキルの
│ assets/AGENTS-template.md からシード(Landminesセクションは必須;
│ 原則: rules/agentic-quality.md)
├─ [ ] CONTRIBUTING.md
└─ [ ] APIドキュメント(OpenAPI, godoc, rustdoc)
設定ファイルテンプレート
.editorconfig (汎用)
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.{py,rs}]
indent_size = 4
[*.go]
indent_style = tab
[*.md]
trim_trailing_whitespace = false
[Makefile]
indent_style = tab
pyproject.toml (Python)
[project]
name = "my-project"
version = "0.1.0"
requires-python = ">=3.12"
[tool.ruff]
target-version = "py312"
line-length = 88
[tool.ruff.lint]
select = ["E", "F", "I", "UP", "B", "SIM"]
[tool.pytest.ini_options]
testpaths = ["tests"]
asyncio_mode = "auto"
[tool.mypy]
strict = true
tsconfig.json (TypeScript - 厳格)
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"declaration": true,
"declarationMap": true,
"sourceMap": true,
"outDir": "./dist",
"rootDir": "./src"
},
"include": ["src"],
"exclude": ["node_modules", "dist"]
}
よくある落とし穴
| 落とし穴 | 原因 | 予防策 |
|---|
| 誤った .gitignore (言語に不適切) | 汎用テンプレートを使用し、言語固有のエントリが不足 | gitignore.io またはGitHubのテンプレートをスタックに合わせて使用する |
| .env.example の作成忘れ | チームメンバーが必要な環境変数を把握できない | プロジェクト開始時にすべての変数(値は空)を含む .env.example を作成する |
| ロックファイルの未コミット | 環境間で依存関係のバージョンが不一致 | package-lock.json, uv.lock, go.sum, Cargo.lock をコミットする |
| コード内でのポート/ホストのハードコード | ローカルでは動作するが、Docker/クラウドで壊れる | 常に環境変数から読み取り、適切なデフォルト値を設定する |
| 実際のデータベースに結合したテスト | データベースが動作していないとテストが失敗、CIのセットアップが複雑 | インメモリDBまたはテストコンテナを使用し、テストごとに分離する |
| ビルド成果物の誤った扱い | dist/ や pycache などのコミット忘れ/誤った .gitignore | .gitignore にビルド出力ディレクトリを常に含め、Dockerではマルチステージビルドを使用する |
| プリミティブ型の過度な使用 | アプリケーションの成長に伴い、意図や制約が不明瞭になる | ドメイン固有の型(NewType, 型エイリアス, Pydanticモデル)を作成する |
| 非対称的なエラーハンドリング | 一部のエッジケースだけが適切に処理され、他は無視される | 統一的なエラーハンドリング(Result型、カスタムエラークラス、グローバルミドルウェア)を実装する |