本文へスキップ

AGENTS.mdテンプレート集:Next.js・Rails・FastAPI・Go・Astro のスタック別雛形

AGENTS.mdをNext.js / Rails / FastAPI / Go / Astroの5スタック向けに、コマンド・ディレクトリ構成・テスト方針・禁止事項・PRルールの型で各30〜45行にまとめました。構成とコマンドは各フレームワークの公式ドキュメントで2026年9月14日に確認したものだけを使っています。

SHAYOUWORLD 更新 約4分

AGENTS.md はスタックごとに「エージェントが踏みやすい落とし穴」が違います。Next.js なら予約ファイル名、Rails なら schema.rb の直編集、Go なら internal/ の境界。 この記事では、5つのスタックについて公式ドキュメントのプロジェクト構成から落とし穴を逆算し、コピペしてすぐ使える AGENTS.md を各30〜45行で用意しました。

「何を書くべきか」の一般論は AGENTS.md完全ガイド で書いています。ここでは具体物だけを並べます。

共通の型

  1. Commands — 正規のコマンドを先頭に。npm run dev のような scripts は中身(= next dev)も併記する
  2. Layout — 公式の予約ディレクトリと「触ってはいけない生成物」だけ書く。コードを読めば分かる構造は書かない
  3. Testing — 「何を変えたらどのテストを回すか」の対応を書く
  4. Do not — パス単位・ファイル名単位で書く。「気をつける」は書かない
  5. PR rules — 完了報告に何を貼るか(コマンド出力、ルート一覧、スクリーンショット)を決める

5つのテンプレートは全部この5節で統一しています。エージェントが複数のリポジトリを渡り歩くとき、節の並びが同じだと「Commands はどこだ」と探す手間が減ります。

どのスタックでも同じ
スタックごとに変わる
Commands
dev / build / test / lint の4つを先頭に置く
コマンドの実体(next / bin/rails / uv run / go / astro)
Layout
予約ディレクトリと生成物だけ書く
予約名(page.tsx、_test.go、src/pages/)と生成物(.next、db/schema.rb、dist)
Testing
「変更箇所→回すテスト」の対応表
テスト配置の慣習(test/models、app/test_main.py、*_test.go)
Do not
秘密ファイルの非コミット、生成物の手編集禁止
.env.local、master.key、go.sum、.astro/ など具体名
PR rules
完了報告に貼るもの
Route 一覧、migration のロールバック手順、/docs の確認
5テンプレートの節構成。共通部分を固定し、右列だけをスタックごとに差し替える

1. Next.js(App Router)

公式の「Project structure」で確認できる予約ファイル名(layout / page / loading / not-found / error / route / template / default)と、バージョン管理しないファイル(.env* と next-env.d.ts)を Do not に落とし込みます。現行の next CLI のコマンド表には dev / build / start / info / telemetry / typegen / upgrade / experimental-analyze があり、lint はありません。

# AGENTS.md — Next.js (App Router)
## Commands
- dev: `npm run dev`(= next dev。HMR 付き。開発ビルドは .next/dev に出る)
- build: `npm run build`(= next build。出力の Route 一覧で新規ルートが Static / Dynamic どちらか確認する)
- start: `npm run start`(= next start。必ず build 後)
- 型検査: `npx next typegen && npx tsc --noEmit`(ルート型を生成してから tsc)
- lint: `npx eslint .`(設定は eslint.config.mjs。`next lint` は現行 CLI に無いので使わない)
## Layout
- `app/` … App Router。フォルダ = URL セグメント。`page.tsx` か `route.ts` を置いた時点で公開ルートになる
- `app/**/layout.tsx` … 共有 UI。`loading` `error` `not-found` `template` `default` は予約名
- `app/**/_components/` `_lib/` … アンダースコア始まりはルーティング対象外(コロケーション用)
- `(group)/` … URL に出ないグループ。`@slot/` はパラレルルート
- `public/` … 静的ファイル。`src/` を使う構成では `app/` も `src/` 配下
- `proxy.ts` … リクエストプロキシ。`instrumentation.ts` … 計測。どちらもルート直下
## Testing
- 新しいルートを足したら `npm run build` を通し、出力の Route 一覧に載ることを確認する
- テストランナーは package.json の `test` スクリプトに従う(未設定なら追加前に相談)
- 型を触ったら `npx next typegen && npx tsc --noEmit` を通す
## Do not
- `.env` `.env.local` `.env.production` `.env.development` `next-env.d.ts` をコミットしない
- `app/` 配下に予約名と衝突する独自ファイルを作らない(`page.ts` を「ページ一覧ユーティリティ」に使うなど)
- `next.config.js` の変更は理由を PR 本文に書く
- `.next/` を手で触らない
## PR rules
- 1 PR = 1 ルートまたは 1 機能。`next build` の Route 一覧の差分を PR に貼る
- Server Component / Client Component の境界を変えたら PR 本文に明記する

2. Ruby on Rails

Rails Guides の Getting Started にあるディレクトリ表と、Testing ガイドの bin/rails test 系コマンドをそのまま使います。Rails は生成物(db/schema.rb)を手で編集したくなる誘惑が強いので、Do not の1行目に置きます。

# AGENTS.md — Ruby on Rails
## Commands
- server: `bin/rails server`
- console: `bin/rails console`
- generate: `bin/rails generate <model|controller|migration> ...`(生成物の diff を確認し、不要ファイルは削る)
- migrate: `bin/rails db:migrate`(test 環境は `bin/rails db:migrate RAILS_ENV=test`)
- test: `bin/rails test`(1ファイル: `bin/rails test test/models/article_test.rb`、行指定: `...:6`)
- system test: `bin/rails test:system`。全部: `bin/rails test:all`
- lint: `bin/rubocop`(設定は .rubocop.yml)
- routes: `bin/rails routes`
## Layout
- `app/` … controllers / models / views / helpers / mailers / jobs / assets
- `config/` … routes.rb、database.yml、環境設定。`config.ru` は Rack 起動用
- `db/` … スキーマとマイグレーション。`db/schema.rb` は migrate が生成する
- `lib/` … アプリの拡張モジュール。`script/` … 一回きりのスクリプト
- `test/` … models / controllers / integration / system / fixtures / helpers / mailers。共通設定は test/test_helper.rb
- `storage/` … SQLite と Active Storage(Disk)。`tmp/` `log/` は生成物
## Testing
- モデルを触ったら `test/models/`、コントローラなら `test/controllers/` を同じ PR で更新する
- fixture を変えたら `bin/rails test test/models` で関連テストを全部回す
- `bin/rubocop` が通らない差分は完了扱いにしない
## Do not
- `db/schema.rb` を直接編集しない。マイグレーションを追加する
- マージ済みのマイグレーションを書き換えない。新しいマイグレーションで直す
- `config/master.key` `config/credentials/*.key` `.env` をコミットしない
- `storage/` `tmp/` `log/` の中身をコミットしない
- `Gemfile` への gem 追加は事前に相談する(`Gemfile.lock` の差分も PR に含める)
## PR rules
- マイグレーションを含む PR は本文にロールバック手順を書く
- `bin/rails test` と `bin/rubocop` の結果を PR 本文に貼る

3. Python(FastAPI)

FastAPI の「Bigger Applications」で示される app/main.py + app/routers/ + app/dependencies.py + app/internal/ の構成と、Testing チュートリアルの TestClient(httpx が必要)を前提にします。公式は uv run fastapi dev / uv run pytest を使っているので、それに合わせています。

# AGENTS.md — FastAPI (Python)
## Commands
- dev: `uv run fastapi dev`(エントリポイントは pyproject.toml の [tool.fastapi] entrypoint = "app.main:app"。直接指定は `uv run fastapi dev app/main.py`)
- test: `uv run pytest`(TestClient は httpx が必要: `uv add httpx`)
- 依存追加: `uv add <pkg>`(pip / poetry のプロジェクトは該当コマンドに読み替える)
## Layout
- `app/__init__.py` … app をパッケージにする(消さない)
- `app/main.py` … `FastAPI()` 本体。ルーターは `app.include_router(...)` で集約する
- `app/dependencies.py` … 共有の Depends(トークン検証など)
- `app/routers/<resource>.py` … `APIRouter(prefix=..., tags=[...])` を 1 リソース 1 ファイル
- `app/internal/` … 管理系など外部公開しないルーター
- テスト … 公式チュートリアルは `app/test_main.py`。本リポジトリでは `tests/` を正とする
## Testing
- ルートを足したら `TestClient` のテストを同じ PR に含める
(`from fastapi.testclient import TestClient`、関数は `def test_...`。`async def` にしない)
- `uv run pytest` が緑でない差分は完了扱いにしない
## Do not
- `app/main.py` にパスオペレーションを直書きしない。`routers/` に置いて include_router する
- `prefix` / `tags` / `dependencies` を router 側と include_router 側の両方に書かない(二重付与)
- `.env` `*.pem` `secrets/` をコミットしない
- `uvicorn` を直接叩く起動手順を増やさない(`fastapi dev` に統一)
## PR rules
- 新しいエンドポイントは `/docs`(OpenAPI)で確認した結果か curl 例を PR に貼る
- レスポンスモデルを変えたら、破壊的変更かどうかを PR タイトル冒頭に書く

4. Go

go.dev の「Organizing a Go module」にある cmd/ と internal/ の使い分けと、「How to Write Go Code」のコマンド(go build / go test / go install / go mod tidy)に沿います。よく見る pkg/ は公式レイアウトに無いので、Do not で「増やさない」と書いています。

# AGENTS.md — Go
## Commands
- build: `go build ./...`
- test: `go test ./...`(1パッケージ: `go test ./internal/auth/`)
- tidy: `go mod tidy`(依存を触ったら必ず。go.sum の差分も PR に含める)
- vet / format: `go vet ./...`、`gofmt -l .`(出力が空で完了)
- install: `go install ./cmd/<prog>`。ローカル確認は `go build -o bin/<prog> ./cmd/<prog>`
## Layout
- `go.mod` … モジュールパス(`module github.com/<org>/<name>`)。変えると import が全部壊れる
- `cmd/<prog>/main.go` … 実行バイナリごとに 1 ディレクトリ。`package main` はここだけ
- `internal/` … 外部から import できないパッケージ。サーバーのロジックは原則ここ
- ルート直下の `*.go` … 公開パッケージ(ライブラリとして import させるものだけ)
- `*_test.go` … テストは同じパッケージ内に置く(`func TestXxx(t *testing.T)`)
## Testing
- 変更したパッケージの `go test` を回し、`go vet ./...` を通す
- 新しい `cmd/` を足したら `go build ./...` が通ることを確認する
## Do not
- `pkg/` を新設しない(公式レイアウトに無い。公開したいものはルート直下、隠すものは internal/)
- `vendor/` を勝手に作らない(`go mod vendor` の採否はチームで決める)
- `go.sum` を手で編集しない
- `cmd/` 配下に共有ロジックを書かない(`internal/` に寄せる)
## PR rules
- 公開 API(ルート直下のパッケージ)のシグネチャ変更は影響範囲を PR 本文に書く
- `go test ./...` と `go vet ./...` の結果を PR に貼る

5. Astro

Astro Docs の「Project Structure」は「Astro が予約しているのは src/pages/ だけ」と明記しています。裏を返せば src/pages/ に置いたものは全部ルートになるので、そこを Do not の中心にします。コマンドは CLI リファレンスの astro dev / build / preview / check / sync です。codeagent.jp 自身がこの型で運用しています。

# AGENTS.md — Astro
## Commands
- dev: `npm run dev`(= astro dev)
- build: `npm run build`(= astro build。dist/ に出力)
- preview: `npm run preview`(= astro preview。build 後の dist/ を配信)
- check: `npx astro check`(.astro の型検査。PR 前に必ず)
- sync: `npx astro sync`(content collections の型を再生成。スキーマを触ったら実行)
## Layout
- `src/pages/` … 唯一の予約ディレクトリ。ファイル = ルート。`*.ts` で GET を export すると静的エンドポイント(例: `llms.txt.ts` → /llms.txt)
- `src/components/` `src/layouts/` … 再利用部品と共通枠
- `src/content/` … content collections。スキーマは `src/content.config.ts`
- `public/` … ビルドを通さずそのままコピーされる(robots.txt、_headers など)
- `astro.config.mjs` … site / integrations。`site` を変えると sitemap と RSS の URL が変わる
## Testing
- UI を触ったら `npm run dev` で該当ページを開いて目視してから完了にする
- frontmatter を触ったら `npx astro check` で content schema のエラーが 0 か確認する
## Do not
- `dist/` `.astro/` `node_modules/` をコミットしない
- `src/pages/` に「ページのつもりではない」ファイルを置かない(全部ルートになる)
- content collection のスキーマ変更は既存記事全件に影響する。`astro check` を通さずにマージしない
- `public/_headers` はルールが結合される。既存ルールの上書きを期待しない
## PR rules
- 記事追加は frontmatter(title / description / pubDate / category / tags)を埋めてから
- ビルド警告(未解決 import、存在しないコンポーネント)を PR で潰す

テンプレートを育てるときの3つの原則

  1. 公式に無い規約を持ち込まない。 Go の pkg/、Rails の app/services/ のような「よく見るが公式ではない」構成は、採用するならチームで決めてから足します。テンプレートの段階では入れません。
  2. 足すのは「同じミスを2回したとき」。 先回りで書いたルールは守られたかどうか検証できません。実際に踏んだ落とし穴を1行ずつ足す方が密度が保てます。
  3. サイズを見張る。 Codex は既定で 32 KiB までしか読まず、Claude Code は 200 行以下を推奨しています。今回のテンプレートはどれも 45 行以内なので、倍になったら見直しの合図です。

Claude Code と併用するなら、CLAUDE.md の先頭に @AGENTS.md と書いて参照させます。3方式を Windows で実測した結果は AGENTS.mdとCLAUDE.mdの違いと同期方法 にまとめました。他ツール向けの変換は AI設定ファイル変換ツール で下書きを作れます。

まとめ

  • 5テンプレートとも Commands / Layout / Testing / Do not / PR rules の5節で統一し、各30〜45行に収めた
  • ディレクトリ名とコマンドは各フレームワークの公式ドキュメント(2026-09-14 確認)にあるものだけ。next lint や Go の pkg/ のような公式に無いものは入れていない
  • スタック固有の落とし穴(予約ファイル名、schema.rb、go.sum、src/pages/)を Do not に落とし込むのが、テンプレートの一番の価値
  • 足すのは同じミスを2回したとき。Codex の 32 KiB、Claude Code の 200 行がサイズの目安

関連記事

関連して読む

この記事の情報・検証メモ
公開日
情報確認
参考リンク
11件
更新性
長く使える
更新管理

仕様・料金・提供範囲が変わりやすいテーマは、公開日・更新日・情報確認日を分けて管理します。 導入前には必ず記事末尾の一次情報と公式ドキュメントで最新状況を確認してください。

検証メモ
各フレームワーク公式ドキュメントの確認日 2026-09-14 Astro テンプレは codeagent.jp 自身の CLAUDE.md 運用に基づく
図解を保存・共有

記事の要点を1枚にまとめました。画像は新しいタブで開いて保存できます。

AGENTS.mdテンプレート集:Next.js・Rails・FastAPI・Go・Astro のスタック別雛形 AGENTS.mdは「コマンド・構成・テスト・禁止・PR」の5節で30〜45行。スタック固有の落とし穴を公式構成から逆算して書く 共通の型:Commands を先頭に置き、npm scripts の中身も併記する。禁止事項はパス単位で書く(「気をつける」は書かない)。PR ルールに「何を貼るか」を決めておく。 スタック別の要点:Next.js: 予約ファイル名と .env 系の非コミット。Rails: schema.rb 直編集禁止とマイグレーション追記。Go: internal/ と cmd/ の役割、go.sum 手編集禁止。 運用:各テンプレは公式の構成に無い規約を持ち込まない。足すのは「同じミスを2回したとき」だけ。CLAUDE.md は @AGENTS.md で参照して二重管理を避ける。
AGENTS.mdテンプレート集:Next.js・Rails・FastAPI・Go・Astro のスタック別雛形 記事の要約 2026.09.14 設計・ワークフロー
Primary sources

一次情報・参考リンク

About the author
SHAYOUWORLD

日本の公共データAPIを使うMCPサーバーを作って公開し、ローカルLLMを自分のGPUで測った記録を、一次情報・検証ログ・失敗例とあわせて整理します。