mcpField
R
RepoCanon

RepoCanon

ローカル
github.comその他01 日前に更新

RepoCanon について

RepoCanonは、AIコーディングエージェントを使うチーム向けのローカルなプロジェクトメモリです。プロジェクトのルールを集約し、Gitを使ってコードと食い違う古い文書を検出します。

主な機能

  1. 01AGENTS.mdと.ai/による共有メモリ
  2. 02選択したエージェント向けのポインタ生成
  3. 03コードモジュール単位のルール生成
  4. 04Gitによる文書の鮮度チェック
  5. 05既存のエージェント向け指示の取り込み

活用シーン

  1. 01コーディングエージェントに共通ルールを適用
  2. 02コード変更後に古い指示を検出
  3. 03モノレポ各モジュールのメモリを整理

MCP 対応

MCP経由でエージェントが`rc_prepare_fill`を呼び出し、`.ai/*.md`を作成できます。MCPを使わず、生成したプロンプトで文書を埋める方法もあります。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"awalhadi-repocanon": {
"command": "npx",
"args": [
"-y",
"repocanon"
]
}
}
}
起動コマンドnpx -y repocanon

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmrepocanon0.7.0

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

RepoCanon

AI コーディングエージェント向けの検証済み AGENTS.md とプロジェクトメモリです。 小さな .ai/ フォルダーひとつで、Claude Code、Cursor、GitHub Copilot、OpenAI Codex、Gemini CLI、Windsurf、Cline にプロジェクトの仕組みを伝え、git がその内容が今も正しいかをチェックします。

npm version npm downloads license: MIT node dependencies: 0 MCP server

Framimo の提供でお送りします。ブラウザー上で、あらゆるクリップを GIF、WebP、AVIF、MP4 に変換できます。

RepoCanon の概要アニメーション:AI コーディングエージェントはリポジトリの情報を学び直し、ルールを見落とします。npx repocanon init は、Claude Code、Cursor、GitHub Copilot、Codex、Gemini CLI、Windsurf、Cline 向けに AGENTS.md と .ai/ ナレッジレイヤーを作成します。作業中は適切なモジュールのルールがエージェントに届き、すべてのルールが git によってコードと照合されます。ベンチマーク結果、シークレットとプロンプトインジェクションのチェックも表示されます。

30 秒でわかること

  • これは何か: すべての AI コーディングエージェントが読む、小さなローカルのプロジェクトメモリレイヤー(AGENTS.md + .ai/)です。ルール、決定事項、コードだけではわからない注意点を記録します。
  • できること: 1 つのコマンドで、すべてのツール向けにセットアップできます。作業中は各モジュールのルールをエージェントに届け、すべてのルールを git でコードと照合するため、古くなったルールを信頼するのではなく、警告として検出できます。
  • 役立つ理由: エージェントは推測ではなく、プロジェクトのルールに従います(ルールを書き留めた後、タスクの合格率は 8% から 100% に向上しました)。作業中にドキュメントも正しく保たれます。ローカルで動作し、LLM を呼び出さず、依存関係もありません。

選ばれる理由

  • エージェントはタスクのたびにリポジトリの情報を学び直します。 ファイルをスキャンしてトークンを消費しても、コードには書かれていないルールを見落とします。ステートマシン、金銭や権限に関する不変条件、ある選択をした理由などです。
  • 手書きの CLAUDE.md やルールファイルは、気づかれないまま古くなります。 コードと一致しなくなっても、誰も気づきません。
  • ツールごとに別のファイルが必要です。 CLAUDE.md、.cursor/rules、Copilot の指示、GEMINI.md、.windsurfrules、.clinerules などです。

RepoCanon は単一のナレッジレイヤー(AGENTS.md + .ai/)を維持し、使用するすべてのツールから参照できるようにします。また、コードの変更後にどのドキュメントが古くなったかを git で知らせます。ローカルで動作し、LLM を呼び出さず、依存関係もありません。

クイックスタート

Node.js 18 以降と git リポジトリが必要です。

cd your-project
npx repocanon init          # pick your AI tools (↑/↓, space, enter)
表示される内容
◆ repocanon init · shop

  Stack  Node.js, Express
  Tools  Claude Code, Cursor

Files
  +  .repocanon.json            created
  +  .ai/.gitignore             created
  +  .ai/INDEX.md               created
  +  .ai/PROJECT.md             created
  +  .ai/DOMAIN.md              created
  +  .ai/CONVENTIONS.md         created
  +  .ai/DECISIONS.md           created
  +  .ai/STATE.md               created
  +  .ai/prompts/update.md      created
  +  .ai/modules/_TEMPLATE.md   created
  +  AGENTS.md                  created
  +  CLAUDE.md                  created
  +  .cursor/rules/project.mdc  created

Generated
  ✓  Module map    2 module(s) → .ai/INDEX.md
  ·  Scoped rules  up to date
  ✓  Skills        3 file(s) updated: .ai/skills/rc-verify-change/SKILL.md, .claude/skills/rc-verify-change/SKILL.md, .agents/skills/rc-verify-change/SKILL.md

✓ Knowledge layer created

Next
  npx repocanon setup        connect the MCP server to your tools
  npx repocanon prompt fill  brief for your agent to fill the docs (or ask it over MCP)
  npx repocanon doctor       check the result

次に、エージェントにドキュメントを記入してもらいます。方法は 2 つあります。

  • MCP を使う場合(npx repocanon setup、詳細):エージェントに 「RepoCanon のドキュメントを記入して」 と伝えます。エージェントが rc_prepare_fill を呼び出し、.ai/*.md に自分で書き込みます。
  • MCP を使わない場合: npx repocanon prompt fill を実行し、出力をエージェントに貼り付けます。

最後に、結果を確認してコミットします。

npx repocanon doctor        # lint: size caps, TODOs, broken paths, token budget, content agents can infer
git add -A && git commit -m "Add RepoCanon knowledge layer"
npx repocanon stamp --all   # mark the docs verified at that commit
git commit -am "Verify RepoCanon docs"
doctor の表示内容
◆ repocanon doctor · shop

Warnings (1)
  !  scoped rule files are out of date (2: .cursor/rules/rc-billing.mdc, AGENTS.md) — run: npx repocanon rules

Info (1)
  i  27 TODO placeholder(s) remain in .ai/ — run: repocanon prompt fill

Token budget
  Entry context (AGENTS + PROJECT + INDEX)  ~662 tokens
  Whole repo source                         ~820 tokens
  Entry share of the repo                   80.73%
  → estimates: word-aware for docs, bytes/4 for code

Freshness █████████░ 91/100

! 1 warning · 1 note(s)

Next
  npx repocanon prompt fill
  npx repocanon rules
  npx repocanon doctor       run again after fixing
出力の読み方

すべてのコマンドは同じ形式で出力します。ヘッダー、行、一行の判定、そして実行するコマンドを正確に示す Next です。記号には必ず説明の言葉が添えられるため、色がなくても出力を利用できます(NO_COLOR=1、--no-color、CI ログ、スクリーンリーダー)。

記号意味記号意味
✓正常/最新+ファイルを作成
!警告/古い~ファイルを更新
✗エラー/破損-ファイルを削除
i情報/未検証= / ·変更なし

すべてのコマンドで、オプションと使用例を確認できる --help を利用できます。例:npx repocanon status --help。--json と --format=github を使うと、スクリプトや CI で扱える機械可読な出力が得られます。

CLAUDE.md、Cursor ルール、または Cline のメモリーバンクをすでにお使いですか?
npx repocanon adopt --dry-run   # preview: what goes where, what gets removed
npx repocanon adopt             # import into .ai/ (creates it if needed)
git add -A && git commit -m "Adopt RepoCanon"
npx repocanon adopt --move      # originals become pointers, so tools stop reading two copies

adopt は、CLAUDE.md、GEMINI.md、.windsurfrules、.clinerules、.github/copilot-instructions.md、.cursorrules、常時適用される .cursor/rules/*.mdc、リポジトリ全体に適用される Copilot の指示、Cline の memory-bank/ を読み込みます。各セクションを適切なドキュメントに振り分け(用語集 → DOMAIN、決定事項 → DECISIONS、進捗 → STATE、概要 → PROJECT、その他 → CONVENTIONS)、ディレクトリツリー、依存関係リスト、貼り付けられたコードやシークレットを除外し、その結果節約できたトークン数を知らせます。特定のファイルにすでにスコープが設定されているルールは、そのまま維持されます。再実行時はすでにインポート済みの内容をスキップします。--move はコミットされていない変更のあるファイルには決して触れません。

得られるもの

AGENTS.md                 entry point every agent reads: commands, a digest of your rules and decisions, Definition of Done
.ai/
  PROJECT.md              purpose, stack, boundaries
  INDEX.md                path → module map (auto block refreshed by `analyze`)
  DOMAIN.md               business rules, states, invariants, glossary
  CONVENTIONS.md          coding style and patterns
  DECISIONS.md            why things are built this way
  STATE.md                current focus and recent changes
  modules/<name>.md       one doc per module: purpose, invariants, flow, code map, gotchas
.repocanon.json           config (presets, modules, excludes, chosen tools)
CLAUDE.md, .cursor/…      small pointer files, only for the tools you pick

ドキュメントはコードのコピーではなく、セマンティックインデックスです。ドキュメントとコードの内容が食い違う場合は、コードを優先し、ドキュメントを修正します。

ツールの選択

init を実行すると、ナレッジレイヤーを読み込む AI ツールを選択する画面が開きます。AGENTS.md は常に作成され、選択した各ツール向けに小さなポインターファイルが作成されます。

idツール作成されるファイル
claudeClaude CodeCLAUDE.md(@AGENTS.md をインポート)
cursorCursor.cursor/rules/project.mdc
copilotGitHub Copilot.github/copilot-instructions.md
geminiGemini CLI / AntigravityGEMINI.md
windsurfWindsurf.windsurfrules
clineCline.clinerules
codexOpenAI Codex / ChatGPT追加ファイルなし — AGENTS.md をネイティブに読み込みます
  • いつでも再実行できます。 init を再実行すると、保存済みの選択内容で選択画面が開き、各ツールに set up または detected のステータスが表示されます。変更がなければ Up to date と表示されます。
  • ツールの選択を解除すると、 init はそのツールの RepoCanon ブロックを削除するか確認します。削除されるのはそのブロックだけです。独自のテキストは残り、ほかに内容がない場合に限りファイルが削除されます。
  • スクリプトおよび CI(ターミナルを使わない場合):--targets=claude,cursor、--targets=all、または --targets=none を指定します。--yes は保存済みの選択内容を維持し、--prune は選択しなくなったツールのブロックを削除します。

スコープ付きルール:エージェントが編集するモジュールに、そのモジュールの知識を正確に配置

npx repocanon rules は、内容が記入された各モジュールドキュメントをルールファイルに変換します。これらのファイルは、エージェントがそのモジュールのファイルを編集している間だけツールに読み込まれます。他の場所では、ツール呼び出しもトークンの追加消費もありません。

ツールファイル読み込み時
Cursor.cursor/rules/rc-<module>.mdc(globs、alwaysApply: false)モジュールの code_paths 配下にあるファイルの編集時
GitHub Copilot.github/instructions/rc-<module>.instructions.md(applyTo)同じファイルの編集時
Codex、Claude Code(オプトイン)<module folder>/AGENTS.md(モジュールドキュメントへのポインター付き)そのフォルダー内のファイルを編集するとき
  • .ai/modules/<module>.md が唯一の情報源です。生成されたファイルのヘッダーにはその旨が記載されます。ドキュメントを編集してから、再度 rules を実行してください。
  • ファイルは init で選択したツール向けにのみ作成されます。ネストされた AGENTS.md ポインターはデフォルトで無効です。有効にするには、.repocanon.json に "nestedAgents": true を設定します。
  • ドキュメントが空のテンプレートのままのモジュールには、何も作成されません。削除されたドキュメントや選択解除されたツールについては、生成ファイルがクリーンアップされます。独自のルールファイルには一切触れません。
  • init は rules を自動で実行します。doctor はファイルが古い場合に警告し、rules --check は再生成されるまで CI を失敗させます。

スキル:必要なときだけ読み込まれる、リポジトリ独自のチェック

npx repocanon skills(init の実行時にも実行されます)は、このリポジトリで変更を検証する方法をエージェントに伝える Agent Skill を .ai/skills/rc-verify-change/SKILL.md に書き込みます。エージェントのコンテキストに含まれるのは1行の説明だけで、本文はエージェントが「完了しました」と伝える直前に読み込まれます。

  • コマンドはリポジトリ自体から取得されます:package.json / composer.json のスクリプト(パッケージマネージャーで実行)、Makefile、justfile、Taskfile.yml、および .github/workflows/*.yml または .gitlab-ci.yml の run: ステップです。それぞれのコマンドが検出元を示し、重複は統合され、ステップは順番に実行されます:format → lint → typecheck → test(集約コマンド make check が最初に実行されます)。
  • インストール、デプロイ、公開、CI シークレットを使用する処理、および監視サーバーや開発サーバーは含まれません。
  • 編集する場所は .ai/skills/ のみです。生成されたスキルを変更すると、RepoCanon はそのスキルを再生成しなくなります。独自の .ai/skills/<name>/SKILL.md を追加すると、それもコピーされます。
ツールスキルフォルダー
Claude Code.claude/skills/<name>/SKILL.md
Cursor、Codex、Gemini CLI、GitHub Copilot(VS Code).agents/skills/<name>/SKILL.md

コピーが作成されるのは選択したツールに限られ、「Generated by RepoCanon」ヘッダーが付き、ツールの選択を解除すると削除されます。同じ名前のスキルが RepoCanon によって作成されたものでなければ、上書きされることはありません。名前が無効なスキル(小文字とハイフンを使い、フォルダー名と一致させる必要があります)、説明がないスキル、またはシークレットを含むスキルはコピーされず、その理由は doctor が表示します。Windsurf と Cline は、まだスキルフォルダーを読み込みません。

モノレポ

RepoCanon は、pnpm、npm、yarn、bun のワークスペース、lerna、nx(project.json)、turbo、go.work、Cargo のワークスペース、uv のワークスペースを読み込みます。その後、次のように処理します:

  • 各ライブラリパッケージが1つのモジュールになります:packages/ui(@acme/ui)→ ui。
  • アプリは、フレームワークのフォルダーから2つ以上の機能が確認できる場合、機能ごとに分割されます:apps/web(Next.js)→ web-billing、web-pricing、apps/api(NestJS)→ api-users、api-billing。それ以外の場合、アプリは1つのモジュールになります。
  • パッケージの外にあるルートのツール類は、どのモジュールにも属しません。同じ名前のパッケージが2つある場合、パスを使った名前が付けられます(apps-web、packages-web)。

.ai/INDEX.md には、ワークスペースの表(パッケージ、パス、アプリまたはパッケージ、スタック)が追加され、入力用ブリーフにはモノレポであることが記載されます。分割方法を変更するには、.repocanon.json で moduleRoots または modules、あるいは固定の preset を設定します。これらを設定すると、ワークスペースの分割は無効になります。

Claims:根拠となるコードにひも付いたルール

ドキュメントに記された通常のルールは、ドキュメント全体がどれだけ最新かに左右されます。重要なルールに注釈を付けると、RepoCanon は各ルールを個別にチェックします:

## Invariants
- Money is integer cents. 
- Floats are rejected. 
- Never round twice.
レベル記述形式チェック方法問題が起きる場合
enforcedtest=path#test nameテストファイルが存在し、その名前が含まれていることを確認します。CI がテストを実行しますテストが削除または改名される → broken
anchoredanchor=path#symbol(Class.method が使えます。パスだけを指定するとファイル全体がアンカーになります)stamp はシンボルの本文のハッシュを .ai/canon.lock に保存します。再フォーマットでは変更されません本文のロジックが変更される → stale。シンボルがなくなる → broken
asserted通常の箇条書きドキュメント自体の verified_at—
  • repocanon claims は、すべての claim をレベルと状態とともに一覧表示します。broken の claim がある場合、または --ci を指定して stale の claim がある場合は、終了コード 1 を返します。
  • doctor は broken の claim をエラーとして、stale の claim を警告として報告します。
  • rc_context と編集時フックは、ドキュメント全体が最新に見える場合でも、そのドキュメントに stale の claim があることを示します。
  • stamp <doc>(および rc_stamp)は、検証するドキュメントの claim をロックします。コードに未コミットの変更がある claim はロックされません。
  • ハッシュはツールが計算するもので、手作業で記述することはありません。シンボルの検索はパターンベースです(JS/TS、Python、Go、Rust、PHP、Java スタイルのメソッド)。パーサーは使いません。シンボルが見つからない場合は、ファイルをアンカーにしてください。

日々のワークフロー

ターミナル上のrepocanonのステータスと同期:古くなっているドキュメント、変更されたファイル、次に実行するコマンド

自分またはエージェントがコードを変更した後:

npx repocanon sync          # which docs are stale, which files changed, what to inspect
# your agent updates the affected .ai/*.md (or: npx repocanon prompt update → paste)
git commit -am "Update billing + docs"
npx repocanon stamp billing # mark only the docs you actually re-checked (code must be committed)

スタンプによって、そのドキュメントのverified_at(およびverified_by: human)が編集され、次のコミットに含まれます。

コードを変更した後、statusとsyncでずれが確認できます:

◆ repocanon status · shop

  ✓  .ai/INDEX.md            fresh  2 commit(s) since verify
  ✓  .ai/PROJECT.md          fresh  2 commit(s) since verify
  ✓  .ai/DOMAIN.md           fresh  2 commit(s) since verify
  ✓  .ai/CONVENTIONS.md      fresh  2 commit(s) since verify
  ✓  .ai/DECISIONS.md        fresh  2 commit(s) since verify
  ✓  .ai/STATE.md            fresh  2 commit(s) since verify
  ✓  .ai/modules/auth.md     fresh
  !  .ai/modules/billing.md  stale  1 code file(s) changed since verify

Freshness █████████░ 91/100

! 1 stale doc(s) · 8 docs

Next
  npx repocanon sync         what changed and which docs to update
  npx repocanon stamp <doc>  after you re-checked a doc against the code
◆ repocanon sync · shop

Docs to update (1)
  !  billing  1 file(s) changed since a1b2c3d
      src/modules/billing/refund.js
      inspect: git diff a1b2c3d -- src/modules/billing/

! 1 doc(s) to update · 1 up to date · HEAD a1b2c3d

Next
  update the docs above        only where behaviour, rules or flow changed
  npx repocanon stamp billing  after committing, for each doc you re-checked

MCPを接続した状態で「コンテキストドキュメントを更新して」と伝えるだけで、エージェントがrc_sync_reportを呼び出し、ドキュメントを編集して、rc_propose_adr/rc_checkpoint_stateで決定事項と進捗を記録し、再確認した箇所にrc_stampでスタンプを付け、rc_verifyで完了します。エージェントによるスタンプではverified_by: agentが記録されます。ドキュメントは最新として扱われますが、statusにはfresh (agent)と表示され、doctorとPRレポートにも一覧表示されるため、人が再確認できます。人がrepocanon stampを実行すると、そのスタンプが置き換えられます。

任意:npx repocanon hookを実行すると、コミット前フックがインストールされます。コードが変更されたのに.ai/の更新がない場合に警告し(処理はブロックしません)、APIキー、トークン、またはパスワードをAGENTS.mdまたは.ai/ドキュメントに追加するコミットはブロックします(git commit --no-verifyで回避できます)。シークレットチェックには、RepoCanonをローカル(npm i -D repocanon)またはグローバルにインストールする必要があります。

MCP サーバーに接続する

repocanon mcp は stdio の Model Context Protocol サーバーです。エージェントはリポジトリをスキャンする代わりに、予算内のコンテキストパックを取得し、コピー&ペーストせずにドキュメントを更新できます。

RepoCanon に設定を書き込ませる場合:

npx repocanon setup              # the tools you picked in init
npx repocanon setup cursor copilot
◆ repocanon setup · shop

  +  .mcp.json         created · repocanon server added
  +  .cursor/mcp.json  created · repocanon server added

✓ MCP server registered in 2 config(s)

Next
  restart or reload your tool                     so it starts the server
  ask your agent: "use rc_context for this task"  to check it works

setup は独自の repocanon エントリのみを追加します。ファイル内のほかのサーバーや設定はそのまま維持され、再実行しても変更はありません。プレーンな JSON ではないファイル(コメントを含む .vscode/mcp.json など)は変更せず、貼り付けるブロックを表示します。グローバル設定を使うツール(Windsurf、Cline、Codex)には、プロジェクトパスを含む、すぐに貼り付けられるスニペットを表示します。

または手動で追加します。 ほとんどのツールでは、次のブロックを使います。

{
  "mcpServers": {
    "repocanon": { "command": "npx", "args": ["-y", "repocanon", "mcp"] }
  }
}
ツール設定場所
Claude Codeプロジェクト内の .mcp.json、または claude mcp add repocanon -- npx -y repocanon mcp
Cursorプロジェクト内の .cursor/mcp.json
VS Code(Copilot エージェントモード).vscode/mcp.json — このファイルでは "mcpServers" ではなく "servers" を使用します
Gemini CLIプロジェクト内の .gemini/settings.json
Windsurf~/.codeium/windsurf/mcp_config.json(設定 → Cascade → MCP Servers)
ClineCline パネル → MCP Servers → Configure(cline_mcp_settings.json)
OpenAI Codex~/.codex/config.toml:[mcp_servers.repocanon] に command = "npx"、args = ["-y", "repocanon", "mcp", "--root=/abs/path"] を設定

サーバーは起動したフォルダーを対象に動作します。グローバル設定(Windsurf、Cline)では通常、プロジェクトの外で起動するため、パスを追加してください:"args": ["-y", "repocanon", "mcp", "--root=/abs/path/to/project"]。

MCP ツール返される内容
rc_contextタスク向けの予算内コンテキスト:ルールと、最も関連性の高いモジュールのドキュメントを返します。古くなったドキュメントにはラベルが付くため、エージェントはその箇所でコードを信頼できます。最初に呼び出してください。
rc_module1 つのモジュールの完全なドキュメント
rc_find_ownerファイルを所有するモジュール
rc_statusGit と照合した、すべてのドキュメントの鮮度
rc_prepare_fillドキュメント作成用の、根拠を読み込んだ概要
rc_sync_report各ドキュメントの検証後に変更された内容
rc_propose_adr決定を専用ファイル .ai/decisions/<date>-<slug>.md に書き込みます。これにより、並行するブランチ間で競合が発生しません
rc_checkpoint_state作業の焦点、進行中の作業、既知の問題、変更内容を .ai/STATE.md に書き込みます。検証済みとしてマークすることはありません
rc_stamp指定したドキュメントに verified_at と verified_by: agent を書き込みます。コミットされていないコードがある場合は拒否します
rc_verify「完了したか」を確認します。エラー、古くなったドキュメント、スコアを確認し、PASS または FAIL を返します

書き込みツールはファイルを変更する前に検証を行います。各フィールドは 1 行であること、長さの上限を守ること、シークレット、貼り付けたコード、ツリー、依存関係の一覧を含めないことが条件です。書き込みが拒否された場合、何も変更されません。各ツールには MCP アノテーション(readOnlyHint)が付いているため、クライアントは読み取り専用のツールを自動承認できます。

Claude Code プラグイン

このプラグインをインストールすると、Claude Code がナレッジレイヤーに接続され、Claude の作業中もドキュメントが最新の状態に保たれます。

/plugin marketplace add awalhadi/repo-canon
/plugin install repocanon@repocanon
構成要素機能
MCP サーバー開いているプロジェクト向けに、rc_context、rc_sync_report、上記のその他のツールを提供します
セッション開始時ナレッジレイヤーが存在すること、探索の前に rc_context を呼び出すこと、古くなったドキュメントを Claude に知らせます
モジュール内での最初の読み取りまたは編集時そのモジュールの Invariants と Gotchas を追加します(最大約 300 トークン、セッションごとにモジュールあたり 1 回。ドキュメントが古い場合はその旨を表示)。MCP を呼び出すことなく、Claude がコードを変更する前にルールを伝えます
ターン終了時Claude がモジュールのコードを変更したものの、ドキュメントを変更していない場合、ドキュメントを更新するか、変更不要と伝えるように1 回だけ求めます
repocanon スキルワークフロー:まずコンテキストを取得し、変更後にドキュメントを更新します。コード、ファイル一覧、シークレットを貼り付けてはいけません

フックは .ai/ フォルダーがないプロジェクトでは何もしません。npx repocanon を実行するため、最初のセッションで一度だけダウンロードされます。

CI での使用

GitHub Action はすべてのプルリクエストをチェックし、変更された行に問題を注釈し、最新のサマリーコメントを常に 1 つ維持します:

# .github/workflows/repocanon.yml
name: repocanon
on: [pull_request]
permissions:
  contents: read
  pull-requests: write          # for the summary comment
jobs:
  docs:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 0 }   # full history, so freshness can be computed
      - uses: actions/setup-node@v4
        with: { node-version: 20 }
      - uses: awalhadi/[email protected]
        with:
          fail-on: error           # error (default) | stale | never

コメントは次のようになります:

RepoCanon:⚠️ ドキュメントが変更されていないモジュールが 1 件あります
モジュールコードの変更ドキュメント
billing3 file(s)⚠️ 未更新 — .ai/modules/billing.md

鮮度 82/100 · 古いもの 1 件、破損 0 件、未検証 2 件

意味のあるコード変更のみが対象です。テスト、説明文のドキュメント、ロックファイルの編集や、空白のみの変更によってドキュメントが古くなることはありません。driftIgnore で独自のパターンを追加するか、すべての変更を対象にするには "drift": "all" を設定します。

Action を使わない場合 — 同じチェックを通常のコマンドで実行します:

# .github/workflows/repocanon.yml
name: repocanon
on: [pull_request]
jobs:
  docs:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 0 }   # full history, so verified_at commits resolve
      - uses: actions/setup-node@v4
        with: { node-version: 20 }
      - run: npx -y repocanon doctor --ci   # fails on errors; add --strict to fail on warnings too
      - run: npx -y repocanon status --ci   # fails on stale or broken docs
      - run: npx -y repocanon rules --check # fails when scoped rule files are out of date

コマンド

コマンド機能
init [--targets=a,b|all|none] [--yes] [--prune] [--force].ai/、AGENTS.md、.repocanon.json、および選択したツール用のポインターファイルを作成します。スタックと実行/テストコマンドも検出します
adopt [--dry-run] [--move] [--json]既存のエージェントルール(CLAUDE.md、Cursor/Copilot のルール、GEMINI.md、.windsurfrules、.clinerules、memory-bank/)を、推測可能な内容とシークレットを除いて .ai/ にインポートします。--move は元のファイルを退避します
analyze [--scaffold].ai/INDEX.md のモジュールマップを更新します。--scaffold はモジュールドキュメントのひな形を作成します
doctor [--ci] [--strict] [--format=github] [--json]レイヤーを lint します:シークレット(エラー)、サイズ上限、TODO、壊れたパス、ポインターの欠落、トークン予算、およびエージェントがコードから読み取れる内容(ディレクトリツリー、依存関係リスト、貼り付けられたコード、ファイルカタログ)
status [--ci] [--json]各ドキュメントの状態(最新/古い/破損/未検証)と鮮度スコア(0–100)を表示します
report [--base=ref] [--format=markdown|json]プルリクエストのサマリー:ドキュメントの有無別に変更されたモジュール、鮮度スコア、シークレット、古くなったルール
sync [--write] [--since=ref] [--json]各ドキュメントの検証後に変更されたコードを確認し、更新が必要なドキュメントを表示します(--write は .ai/.sync-report.md に保存します)
context [words…] [--files=a,b] [--max=4000]タスク用の予算内コンテキストパックを出力します。古いドキュメントにはラベルが付けられます
stamp <name…> | --all [--force]現在のコミットでドキュメントを検証済みとしてマークします。コードに未コミットの変更がある場合は拒否します
prompt fill [--compact]ドキュメントを記入するようエージェントに渡すブリーフを出力します
prompt updateコード変更後にドキュメントを更新するためのブリーフを出力します
claims [--ci] [--json]コード(anchor=)またはテスト(test=)に紐付いたルールについて、それぞれのティアと状態を表示します。破損した主張がある場合(および --ci を指定した場合は古い主張も)終了コード 1 で終了します
secrets [--staged] [--json] [--quiet]AGENTS.md、.ai/、ツールのポインターファイル(またはステージ済みのバージョン)をスキャンし、API キー、トークン、パスワード、および安全でない指示(不可視文字、指示の上書き、curl … | sh)を検出します。見つかった場合は終了コード 1 で終了します
hookpre-commit フックをインストールします。ドキュメント化されていないコード変更を警告し、ドキュメント内のシークレットと安全でない指示をブロックします
rules [--check] [--json]モジュールごとにスコープを設定したルールファイル(Cursor、Copilot、任意でネストされた AGENTS.md)を書き出します。最新でない場合、--check は終了コード 1 で終了します
skills [--check] [--json]変更の検証スキルを作成し、.ai/skills/ を各ツールのスキルフォルダーにコピーします。最新でない場合、--check は終了コード 1 で終了します
setup [tool…|all] [--json]各ツールの設定に MCP サーバーを登録します(デフォルトでは init で設定したツールが対象です)
mcp標準入出力で MCP サーバーを起動します
agent-hook <session-start|stop|pre-edit>エージェントフック用の出力:セッション開始時のブリーフィング、ターン終了時のドキュメント確認リマインダー、そのモジュールを初めて読み取るときまたは編集するときのルール(Claude Code プラグインで使用)

グローバルフラグ:--root=<dir> は別のフォルダーを対象に実行します。--version、--help。

設定

init によって作成される .repocanon.json:

{
  "preset": "auto",
  "moduleRoots": ["src/domains"],
  "modules": { "checkout": ["app/Services/Checkout/", "app/Models/Order.php"] },
  "exclude": ["legacy/", "vendor/"],
  "targets": ["claude", "cursor"],
  "nestedAgents": false,
  "driftIgnore": ["src/generated/", "*.snap"]
}
  • preset:検出されたスタックに基づく auto、または laravel nextjs nuxt react vue nestjs node fastapi django rails go tauri のいずれかです。プリセットは、1 つのドメインを複数のレイヤーにまたがって統合します。

    プリセット検出対象
    LaravelBilling = Services + Actions + Controllers + Pages フォルダー。フラットなアプリも対象です。Invoice.php + InvoiceController.php + StoreInvoiceRequest.php → invoice。nwidart の Modules/、Filament リソース
    Next.jsApp Router のセグメント((groups) はたどります。[dynamic]、_private、@slots はスキップし、api/billing は billing に統合します)、および src/features、src/modules
    FastAPIrouters/users.py + models/user.py + schemas/user.py → user(app/ または src/<pkg>/ 配下)、および app/modules、app/domains
    Gointernal/*、pkg/*、cmd/*。レイヤー化されたアプリはドメインごとに統合します(internal/handler/user + internal/service/user → user)
    NestJSapp.module.ts のシェルを除く、すべての *.module.ts フォルダー

    モジュールとして認識されるには、名前が少なくとも 2 つのレイヤーに存在する必要があります。そのため、単独の User.php や health.py はモジュールになりません。

  • moduleRoots:子フォルダーをモジュールとして扱う追加フォルダーです。

  • modules:明示的に指定するモジュール → パスです。同じ名前の検出済みモジュールを上書きします。

  • exclude:すべての場所で無視するパスのプレフィックスです。

  • targets:init で設定する AI ツールです(ピッカーで管理します)。

  • nestedAgents:各モジュールフォルダーにもポインタとなる AGENTS.md を書き込みます(デフォルトは false)。

  • entryDigest:.ai/CONVENTIONS.md と .ai/DECISIONS.md のダイジェスト(各決定事項につき 1 行、最大約 700 トークン)を AGENTS.md ブロックに保持します(デフォルトは true)。エージェントはエントリーファイルに記載された内容には確実に従いますが、別ファイルへのポインタは見落とすことがよくあります。false にするとポインタだけが残ります。rules はダイジェストを再生成し、doctor、rules --check、PR レポートはダイジェストが古くなった場合に警告します。

  • driftIgnore:変更されてもドキュメントを古くしない追加パスです(/ で終わるフォルダープレフィックス、* および ** のグロブ)。テスト、説明文のドキュメント、ロックファイル、空白のみの編集は常に無視されます。"drift": "all" にすると、この無視設定は無効になります。

ベンチマーク

プロジェクトの知識は役に立つのでしょうか。また、RepoCanon は手書きの AGENTS.md よりも効果的にその知識を提供できるのでしょうか。Claude Code(claude-sonnet-5-5、CLI 2.1.178)で、JavaScript、Python、PHP、Rust のプロジェクトにおいて 8 つのタスクを実行し、2026-10-27 に 4 つの条件それぞれで 5 回ずつ試しました。合計 160 回です。各タスクでは、コードからは分からないプロジェクトのルールに関わります。隠しテストとルールチェックの両方に合格した実行を、合格として数えます。

条件合格したタスク(95% CI)ルールチェックトークン中央値平均コスト
プロジェクトのドキュメントなし3/40 · 8%(3–20%)58%194k$0.36
手書きの AGENTS.md40/40 · 100%(91–100%)100%236k$0.38
RepoCanon、ポインタのみ(0.5)40/40 · 100%(91–100%)100%415k$0.62
RepoCanon、ルールダイジェストあり(0.6)40/40 · 100%(91–100%)100%380k$0.58

この結果が示すこと、そして示さないこと:

  • 重要なのは、ルールを文書に記録することです。 ルールがない場合、エージェントが合格した実行は 8% でしたが、ルールがある場合はすべての実行に合格しました。
  • これらのタスクでは、RepoCanon の正確性は良質な手書きの AGENTS.md と同等で、コストは約 1.5 倍でした。 RepoCanon のエージェントは 1 回の実行につき .ai/ ドキュメントを 6 つ以上読み、約 2 倍の編集を行い、AGENTS.md の完了の定義に従いました。どちらの知識形式も 100% に達したため、このベンチマークでは正確性の差を判定できません。
  • 0.6 で追加されたルールダイジェストにより、ポインタのみの設計と比べてコストが 8% 削減されました。 これらのヘッドレス実行では、Claude Code は MCP ツールもスキルも呼び出さず、ファイルを直接読みました。
  • RepoCanon が役立つはずの場面は、ここでは測定していません。 時間の経過によるコードとドキュメントの乖離、大規模なリポジトリ、多数のツールです。次回のベンチマークではこれらを対象にします。

手法、タスク、再実行方法:bench/README.md。生データ:bench/results/2026-10-27/。

Drift pilot: コードでドキュメント記載の値が変更されたが、ドキュメントは更新されていない

4つのドリフトタスクはそれぞれ、まずドキュメントを確認し、その後、ドキュメントに記載された値の1つ(手数料率、デフォルト値、上限、エラーコード)を変更するコミットを行います。隠しテストでは、コードの新しい値が想定されます。2026-10-28に、タスクと条件の組み合わせごとに1回、計12回実行しました。

条件合格コードに従った/古いドキュメントに従った平均コスト
手書きのAGENTS.md(現在は古い)4/44 / 0$0.45
RepoCanon 0.64/44 / 0$0.64
フックとクレームアンカーを備えたRepoCanon 0.74/44 / 0$0.77
  • 古いドキュメントがエージェントを誤らせることはありませんでした。 変更された値が、タスクのためにエージェントが読むファイルにある場合、指示されなくてもclaude-sonnet-5-5はコードを信頼します。この設計では古い情報への警告の効果を示せないため、予定していた60回の実行は行いませんでした。
  • フックは実行され(0.7のすべての実行で、該当モジュールのルールが適用されました)、コストは増加しました。その一因は、ターン終了時のフックが、ドキュメントのないフォルダーについてもエージェントに記述を求めていたことです。これは修正済みです。コスト検証の項を参照してください。
  • 条件間の差を明らかにできるドリフトには、変更された事実が、エージェントが通常は確認しない場所にある必要があります。モジュール横断の検証の項を参照してください。

生データ:bench/results/2026-10-28-drift/。

コスト検証:より軽量なエントリーファイル(0.7)

パイロットのツール使用回数から、追加コストの原因はAGENTS.mdにある2つの指示だと分かりました。読み取り順序(実行ごとにナレッジドキュメントを5~10件読む)と、必須の完了定義(9~15件の編集)です。0.7では両方を置き換えました。エントリーには内容のあるドキュメントだけを列挙し、ルール、フロー、または判断が変わった場合にのみドキュメントを編集するよう求めます。2026-10-28にclaude-sonnet-5-5で44回実行しました。

合格平均コストAGENTS.mdとの比較ナレッジドキュメントの読み取り数編集数
手書きのAGENTS.md、コアスイート16/16$0.391×04.4
フックを備えたRepoCanon 0.7、コアスイート24/24$0.541.38×(v1では1.5×)1.1~1.8(以前は6以上)6.3
フックを備えたRepoCanon 0.7、ドリフトスイート4/4$0.591.33×(以前は1.7×)1.57.0
  • 読み取り順序がなくても正確性は維持されました。 モジュールドキュメントにのみルールが記載されたコアタスクも含め、すべての実行が合格しました。
  • 残る差は読み取りではなく、ドキュメントの保守にあります。 実行ごとに約2件の追加編集が発生するのは、ターン終了時のフックが、作業対象のモジュールドキュメントを更新するようエージェントに求めるためです。手書きのAGENTS.mdではこの作業は発生しません。そのため、ドキュメントを最新に保つためのコストとなり、目標の≤1.2×は達成できませんでした。

生データ:bench/results/2026-10-28-cost/および2026-10-28-cost2/。

モジュール間のずれ:ドキュメントの記述が誤った場所を指し、修正は別のモジュールにある

node-cancel-xdrift:ドキュメントには、cancelOrder が在庫を補充し、倉庫のリスナーは出荷を記録するだけだと書かれています。その後のコミットで、在庫の補充処理が order.cancelled の倉庫リスナーに移されます。ドキュメントに従うと、在庫を二重に補充してしまいます。各条件3回、計3ラウンドで各9回実行しました。ずれが最新のコミットにある場合、それと無関係なコミット12件の下に埋もれている場合、さらにその後に採点用チェックでドキュメントを確認する場合です。

条件コードに従った古いドキュメントを修正した(最終ラウンドで測定)平均コスト(最終ラウンド)
手書きの AGENTS.md、現在は古い9/90/3$0.37
RepoCanon 0.69/93/3$0.38
フック付きの RepoCanon 0.79/93/3$0.41
  • 正しさに違いはありません。 どの条件でも、すべての実行でリスナーを見つけ、在庫の二重補充を避けました。エージェントはコード、最近の履歴、自らの失敗テストを読み、ドキュメントよりそれらを信頼しました。
  • ドキュメントの保守には明確な違いがあります。 RepoCanon のエージェントは、すべての実行で誤った記述を修正しました。AGENTS.md のエージェントは一度も修正しませんでした。今回は誰も誤らせなかったドキュメントも、次のエージェントや人にとっては依然として誤ったままです。エージェント自身の要約を基に評価した以前のラウンドでも同じ傾向が見られます(RepoCanon 12/12、AGENTS.md 2/6)。
  • このタスクのコストはほぼ同じで、AGENTS.md の1.05~1.13倍でした。
  • サンプル数は少なく(各セル3回)、数値が示すのは傾向であり、発生率ではありません。生データ:xdrift、埋もれた状態、ドキュメントのチェック。

比較

ツール間で共通git に照らして検証トークン予算ありローカルで動作、LLM 呼び出しなし
手書きの CLAUDE.md/ルールファイルツールごとに1ファイルいいえいいえはい
リポジトリのパッカー(例:Repomix)はい該当なし — 生のコードをパック一部はい
エージェントのメモリーバンク通常は1つのツールいいえいいえさまざま
RepoCanonはいはい(verified_at、code_paths、クレームごとのハッシュ)はいはい

リポジトリのパッカーは、エージェントに「コードが何であるか」を示します。RepoCanon は、コードだけでは伝えられないルール、決定、境界を記録し、その記録が古くなったときに知らせます。

よくある質問

LLM を呼び出したり、コードをアップロードしたりしますか? いいえ。RepoCanon はネットワーク呼び出しを一切行いません。ドキュメントの読み書きは、お使いのエージェントが行います。

エージェントがドキュメントに秘密情報を貼り付けた場合はどうなりますか? doctor がエラーとして報告するため(これにより doctor --ci は失敗します)、npx repocanon secrets でマスクされた状態の一覧を確認でき、プレコミットフックがコミットをブロックします。既知の誤検出は、その行に `` を付けて示してください。

誰かがエージェント向けの指示を仕込んだ場合はどうなりますか? プルリクエスト、依存関係、ビルド手順によって、エージェントが従う AGENTS.md、.ai/、CLAUDE.md にテキストが追加される可能性があります。doctor は、不可視の Unicode 文字(双方向オーバーライド、ゼロ幅文字、タグ文字)、「以前の指示を無視する」形式の上書き、作業をユーザーに隠すルール、偽の <system> マーカー、curl … | sh がある場合に失敗し、git が追跡していない指示ファイルについて警告します。MCP による書き込みも同じテキストを拒否し、プレコミットフックもブロックします。意図したテキストには `` を付けてください。

ChatGPT で使えますか? OpenAI Codex は AGENTS.md をネイティブに読み込みます。ブラウザー版 ChatGPT はリポジトリを参照できませんが、npx repocanon context "your task" を実行すると、貼り付けて使える情報パックが出力されます。

CLAUDE.md やほかのルールファイルは上書きされますか? いいえ。明確な目印が付いたブロックを1つ追加または更新し、ファイルの残りの部分には手を加えません。.ai/ 内のコアドキュメントが置き換えられるのは、init --force を実行した場合だけです。

モノレポではどうなりますか? 現時点では、moduleRoots または modules でパッケージをマッピングできます。パッケージごとのナレッジレイヤーはロードマップに記載されています。

ライブラリとして使えますか? はい。require('repocanon') で、CLI が使用するものと同じ関数を利用できます。CONTRIBUTING を参照してください。

原則

  1. ドキュメントはセマンティックインデックスであり、コードのコピーではありません。矛盾がある場合はコードを優先します。
  2. 段階的に情報を開示します:AGENTS.md(ルールの要約付き)→ PROJECT → INDEX → 1つのモジュール → コード。
  3. 実装の詳細より、不変条件とビジネスルールを重視します。
  4. 最新性は git から算出し、保証しません。
  5. 依存関係はゼロ、Node.js 18+。

ロードマップとコントリビューション

スポンサー

Framimo — ブラウザー上で、あらゆるクリップを GIF、WebP、AVIF、MP4 に変換できます。アニメーションのトリミング、切り抜き、サイズ変更、圧縮に対応。ファイルはお使いのデバイス上で処理されます。

RepoCanon のスポンサーをご希望ですか?イシューを作成してください。

ライセンス

MIT © Md. A Awal Hadi

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。