CommitLore について
CommitLoreはリポジトリの判断記録をGitに保存し、編集対象のパスに関係する有効な判断をコーディングエージェントに提供します。判断のライフサイクルと信頼度を管理し、失効した指針を現行のものとして提示しません。
主な機能
- 01制約や却下した案の記録
- 02Git trailerまたはnotesへの保存
- 03有効、置換済み、期限切れの判断を管理
- 04リポジトリのパスに応じたコンテキスト選択
- 05記録の信頼度評価
活用シーン
- 01編集前に関連する判断をエージェントへ提示
- 02チームの制約をコードとともに保存
- 03却下済みの案の再提案を防止
- 04判断のライフサイクルを確認・管理
MCP 対応
Gemini CLI、Cursor、Windsurf、opencodeなどのホスト向けに、MCP経由で判断手順とパス別コンテキストを提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
CommitLore
同じ誤ったアイデアを何度もレビューするのはやめましょう。
Git が管理する、コーディングエージェントのための意思決定の根拠。
制約、却下した代替案、警告を Git に保存し、現在も有効なものだけを届けます。これにより、リポジトリですでに覆された判断をエージェントに渡さずに済みます。
ホスト型のメモリーはありません。記録はリポジトリが管理します。
一度インストール。 あとは、使いたい各リポジトリで初期化します。
curl -fsSL https://raw.githubusercontent.com/MongLong0214/commitlore/v1.7.5/install.sh | sh -s v1.7.5
先にインストーラーを確認しますか?
curl -fsSLO https://raw.githubusercontent.com/MongLong0214/commitlore/v1.7.5/install.sh
sh install.sh v1.7.5
# Or skip the script: the checkout it makes is one you can make yourself.
git clone --depth 1 --branch v1.7.5 https://github.com/MongLong0214/commitlore
node commitlore/dist/commitlore.mjs --version
ソースを固定したチェックアウトと、node <checkout>/dist/commitlore.mjs を実行するラッパーをインストールします。コンパイル済みのダウンロードも、ビルド手順もありません。
コードは残ります。判断の根拠は残りません。
エージェントがあるアプローチを提案します。チームは、見落としやすい制約を理由にそれを却下します。最終的なコードには結論が反映されますが、通常、代替案を却下した理由までは残りません。後から別のエージェントがコードだけを見て、同じアイデアを再び提案します。
CommitLore は、その判断の根拠をコードと一緒に保持します。
CommitLore の機能
| 動作 | 製品上の経路 | |
|---|---|---|
| 記録 | 差分からは分からない制約、却下した代替案、警告を保持します。候補はセッションのトランスクリプトとステージ済みの差分に照らして確認されます。 | commitlore capture |
| 保持 | 承認された記録を、ホスト型のメモリーデータベースではなく、Git のトレーラーまたはノートに保存します。 | コミットフック · refs/notes/commitlore |
| ライフサイクルを追跡 | 有効、置き換え済み、期限切れの判断を区別して保持します。 | commitlore stale |
| スコープを設定 | エージェントが編集しようとしているパスに応じて、判断を選択します。 | commitlore context |
| 信頼度を評価 | 記録を指示、主張、または保留コンテンツとして提示します。 | デフォルト/署名モード |
| 提示 | 対応するエージェントに、編集前の最新コンテキストを提供します。 | プラグインフック · MCP |
ほとんどのコミットに記録は必要ありません。CommitLore は、コードでは保持できない判断の根拠のためのものであり、変更のすべてを説明するためのものではありません。
60 秒で判断を理解するエージェントを導入
1. CLI をインストール
macOS と Linux:
curl -fsSL https://raw.githubusercontent.com/MongLong0214/commitlore/v1.7.5/install.sh | sh -s v1.7.5
Windows:
& ([scriptblock]::Create((irm https://raw.githubusercontent.com/MongLong0214/commitlore/v1.7.5/install.ps1))) v1.7.5
Node.js 22.23.2+ と Git が必要です。スクリプトは何かを書き込む前に、両方があることを確認します。
2. エージェントを接続
Claude Code:
/plugin marketplace add MongLong0214/commitlore
/plugin install commitlore@commitlore
Codex:
commitlore plugin install-codex
プラグインは commitlore を PATH に追加しないため、以下のコマンドを使うには CLI もインストールする必要があります。インストーラーは、安全に設定できる場合、対応する MCP ホストも検出して接続します。対応状況の一覧は以下をご覧ください。
3. リポジトリを初期化する
cd your-repository
commitlore init
commitlore context .
プラグインをインストールまたは更新した後は、新しいエージェントセッションを開始してください。実行中のセッションでは、読み込み済みのランタイムがそのまま使用されます。
その後は、通常どおり作業してコミットできます。対応するスキル統合では、通常のコミット依頼時に CommitLore が考慮され、記録する価値があるものがなければ何も行いません。コミットのたびに CommitLore を指定する必要はありません。
受け入れた記録を、記録ごとの確認なしでステージングしたい場合は、リポジトリで一度だけ commitlore auto on を有効にできます。このポリシーはリポジトリが管理し、チーム全体に適用されるため、このページによって暗黙的に有効になることはありません。
エージェントが受け取る内容
src/pricing.ts を編集する前に:
commitlore: active records for src/pricing.ts
Limit
[claim] r-price01 a1b2c3d4 calculatePrice owns final checkout pricing only
Ruled-out
[claim] r-price01 a1b2c3d4 Reuse it for admin quotes | eligibility and rounding semantics differ
[claim] は「情報として考慮する」という意味です。リポジトリでは、より強い署名付き権限モードを有効にできます。情報を渡すことでエージェントにコンテキストを提供しますが、編集を妨げることはありません。
なぜ Git なのか?
リポジトリが、そのコードに関する判断を管理するべきです。
CommitLore は通常の Git トレーラーとノートに記録を保存するため、記録はブランチ、マージ、クローン、レビューが可能で、説明対象のコードとともにプロバイダーの変更後も保持されます。
SQLite は再構築可能なインデックスにすぎません。削除しても、記録は Git に残ります。
過去の判断を見つけるだけでは不十分です
一般的なメモリーシステムや検索システムでは、次のように尋ねます。
関連しているように見える過去のテキストはどれですか?
CommitLore では、次のように尋ねます。
記録された判断のうち、今このパスに適用されるものはどれですか?
置き換えられた判断は非常に関連性が高くても、現在の指針としては誤っている可能性があります。関連性と権限は別の問題です。
仕組み
- 記録 — エージェントは、差分からは分からない判断のコンテキストだけを下書きします。
- 検証 — CommitLore は、下書きをセッションおよびステージ済み差分と照合します。
- 保持 — 受け入れられた記録は、識別情報とライフサイクル情報とともに Git に保存されます。
- 提供 — 以降の編集前に、そのパスに有効な記録だけが返されます。
ほとんどのコミットには記録がありません。コミットフックは、記録がある場合にそれを検証します。記録を作り出すことはありません。
既存のフックは上書きされません。commitlore init は core.hooksPath を尊重し、すでにインストールされているフックを <hook>.commitlore-chained に移動して、先に呼び出します。commitlore hooks uninstall を実行すると元に戻ります。
自動で行われること
| ホスト | 編集前の情報提供 | 検証済み記録ワークフロー | 毎回のコミットでの決定的な記録 |
|---|---|---|---|
| Claude Code | プラグイン経由で自動 | プラグインスキルから利用可能 | 認定されていません |
| Codex | プラグイン経由で自動 | プラグインスキルから利用可能 | 認定されていません |
| Hermes | commitlore hermes install の実行後に利用可能 | ホストのインストール後に利用可能 | 認定されていません |
| Gemini CLI、Cursor、Windsurf、opencode | ホストが登録を使用する場合は MCP 経由で情報提供 | MCP 経由で手順を提供 | なし |
AGENTS.md ホスト | 手順のみ | 手順のみ | なし |
「利用可能」とは、prepare → verify → stage のワークフローが存在することを意味します。対象となるすべてのコミットが自動的に評価されるという意味ではありません。
対応するスキルホストのユーザーは、コミットのたびに「CommitLore に記録して」と伝える必要はありません。残る制約はホスト側での開始方法であり、記録ごとにユーザーがコマンドを指定する必要はありません。
スカッシュマージするリポジトリ
スカッシュマージでは、ブランチのコミットが新しい1つのコミットに置き換えられます。そのコミットには、ブランチのトレーラーは引き継がれません。リポジトリでスカッシュボタンを使ってマージする場合、ブランチ上で作成された記録は、スカッシュしたコミットに何かが引き継がない限り、マージ時に失われます。
この問題には2つの対処方法があり、そのうち1つは一度だけセットアップが必要です。
| スカッシュの方法 | 記録を引き継ぐもの | セットアップ |
|---|---|---|
ローカルでの git merge --squash | SQUASH_MSG を使う、インストール済みの prepare-commit-msg フック | 不要 — commitlore init で設定済みです |
| GitHub の Squash and merge ボタン | action/preserve GitHub Action | 以下のワークフロー |
GitHub は独自のサーバー上でこのマージを実行するため、ローカルの git フックは一切実行されず、マージを認識できません。その時点で必要な情報、つまりプルリクエスト、そのコミット群、そしてそれらがスカッシュされた先のコミットをすべて持っているのは、この Action だけです。
.github/workflows/commitlore-preserve.yml を追加してください。
name: CommitLore squash inheritance
# pull_request_target, not pull_request: a pull request from a fork gets a
# read-only token on pull_request, so the job would build the record and then
# fail to publish it.
on:
pull_request_target:
types: [closed]
permissions:
contents: write # the one push to refs/notes/commitlore
concurrency:
group: commitlore-notes
cancel-in-progress: false
jobs:
preserve:
if: github.event.pull_request.merged == true
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
# the merge commit is on the base branch, and a closed pull request
# has no merge ref left to check out
ref: ${{ github.event.pull_request.base.ref }}
fetch-depth: 0
# the mirror this action writes; publishing from a checkout that never
# read it would fork the notes history
- run: git fetch --no-tags origin '+refs/notes/commitlore:refs/notes/commitlore'
# a squash merge usually deletes the branch, and then the pull request's
# own ref is the only one still reaching the commits that carry records
- run: git fetch --no-tags --force origin
'+refs/pull/${{ github.event.pull_request.number }}/head:refs/commitlore/pr-head'
# The action runs CommitLore from a checkout of this repository: the
# package is private, so there is no published npm name to fall back to.
# `dist/` is committed (ADR-0011), so nothing needs building.
- uses: actions/checkout@v4
with:
repository: MongLong0214/commitlore
ref: v1.7.5
path: .commitlore-cli
persist-credentials: false
- uses: MongLong0214/commitlore/action/[email protected]
with:
cli-path: .commitlore-cli/dist/cli.js
次にこの設定を編集する人のために、2つのルールがあります。pull_request_target は書き込み可能なトークンで実行されるためです。ここではプルリクエストの head をチェックアウトしないこと、また refs/commitlore/pr-head から到達できるものを絶対に実行しないことです。フォークのコミットは、実行するコードではなく、トレーラーを読み取るためのデータとして扱ってください。
commitlore doctor は、squash inheritance の項目で、この設定が有効になっているかを報告します。記録が失われる前にそのことを示します。すでに失われた記録を報告する行は squash conservation です。
マージコミットまたはリベースでマージする場合、記録は自動的に残るため、この設定は不要です。
測定結果ではなく、ある現場の報告
無関係なリポジトリで、v1.2.1 を初めてインストールした人による、ある1回の実行結果です。ここに書かれていることは何も測定されておらず、証拠ログにも含まれていません。このページに載せているのは、上の段落が、ここにあるどの表にも含まれていないループについて述べているからです。
その人はエージェントに丸め誤差のバグを修正するよう頼み、ある十進数ライブラリはすでに検討され、採用を見送ったことをついでに伝え、最後に「コミットして」と指示しました。CommitLore の名前は一度も出ていません。コミットに含まれていた内容の一部です。
Ruled-out: adopting a decimal library such as Decimal.js | the backend is a
number contract, so it is meaningless
Warn: do not revert the test file to console.assert: it exits 0 even on
failure, so CI passes silently
Provenance: drafted
Warn はエージェントに指示されたものではありません。作業中に落とし穴に気づき、次に作業する人のために残したものです。Provenance: drafted は、記録を人間が読んでいないことを示しており、そのため claim と評価されます。これは命令ではなく、判断材料として検討すべき報告として提示されます。
共有履歴のない後のセッションで、今度は十進数ライブラリを採用するよう求められました。エージェントは採用せず、その理由としてこの記録を挙げました。また、評価も確認しています。claim は指示ではないため、同意する前に、記載された理由をコードと照らし合わせて確認しました。
メモリーストレージとの違い
| 一般的なメモリー/RAG | CommitLore | |
|---|---|---|
| 主な問い | 関連する古いテキストはどれですか? | どの決定が今ここでも有効ですか? |
| 権限の所在 | メモリーストアまたはプロバイダー | Git |
| 適用範囲 | 意味的な類似性 | リポジトリのパス |
| ライフサイクル | 多くの場合、追加を優先 | 有効 · 置き換え済み · 期限切れ |
| 信頼性 | 取得したテキスト | 指示 · 主張 · ブロック済み |
| 取り込み | トランスクリプトまたはメモの保存 | 証拠を確認した決定記録 |
| 移植性 | バックエンドに依存 | 通常の Git |
CommitLore は意図的に対象を絞っています。一般的なユーザーメモリーシステムでも、会話アーカイブでも、ベクトルデータベースの代替でもありません。
エビデンス
| 質問 | 測定結果 | 範囲 |
|---|---|---|
| 登録済みの研究で、主張の根拠となるコンテキストによって再提案は変化しましたか? | CommitLore を使用した場合は 2.8%(16/580)、使用しなかった場合は 18.8%(109/579) | 1 つのモデル、1 つのハーネス、構築されたタスク |
| ライフサイクルのフィルタリングにより、測定対象のアクティブなビューに失効したレコードが含まれなくなりましたか? | 失効したレコードは 0 件 | 置き換えられたレコードは存在しましたが、期限切れのレコードはありませんでした |
| インデックス検索はスケールしますか? | 10 万件のコミットで p50 が 496 ms | インデックスを使用しないフォールバックははるかに低速です |
インデックスの構築時間は、コミット数ではなくレコード数に応じて増加します。負荷の高い処理はレコードごとに 1 回実行されるため、レコードの記録が少ない長い履歴のほうが、レコードが密集した短い履歴よりも速く構築できます。
大きな履歴がモデルに届かないようにするのは、パスのスコープです。#167 のコーパスでは、10,002 件のレコードのうち、モデルに届いたのは 2 件だけでした。
| 経路 | モデルに表示されたレコード | 関連レコード | モデルに表示されたトークン数 |
|---|---|---|---|
| すべてを注入 | 10,002 | 2/2 | 1,004,554 |
| 上位 k 件の語彙検索 | 2 | 1/2 | 190 |
| CommitLore のパススコープ | 2 | 2/2 | 335 |
これは、レコード数を 2 件に固定した場合の情報露出と再現率を測定したものであり、トークンコスト、請求額、精度、エージェントの振る舞いを測定したものではありません。1 つのコーパス、1 つのクエリ、固定された 1 つの埋め込みモデルに基づいています。
エージェントの研究は、あらゆるモデルに共通する効果を示すものではありません。情報が提供されたことは、モデルがレコードを読んだ、またはそれに従った証明にはなりません。
制限、信頼性、プライバシー
- キャプチャは支援機能であり、決定論的ではありません。 対応するスキルは通常のコミット要求を考慮しますが、対象となるすべてのコミットを評価できると認定されたホストはありません。
- デフォルトのディレクティブモードは認証ではありません。 コミットの作成者ヘッダーと照合しますが、コミットを書き込める人なら誰でもそのヘッダーを設定できるため、デフォルトモードでの
[directive]はポリシーメタデータであり、本人確認の証明ではありません。 署名モードではさらに、Git 自身の検証済みステータスと、リポジトリローカルのcommitlore.trustedSigner許可リストとの一致が必要です。署名者の許可リストが存在しない、空である、または読み取れない場合は誰も許可されず、このモードはフェイルクローズします。 - ガードは実験的な助言機能であり、安全網ではありません。 417 件の判断コーパスにおける適合率は 44.8%(95% Wilson 信頼区間 32.7%~57.5%)、再現率は 22.0%です。ガード結果が空でも、安全性が保証されたわけではありません。
- 配信では、一致するツール呼び出しごとにトークンを消費します。 編集前フックは
Edit、Write、MultiEdit、NotebookEditだけでなくReadの際にも起動するため、編集エージェントがコミットする頻度を大幅に上回ります。起動するたびに、デフォルトで 800 トークンのペイロード予算を上限として消費します。この上限は--budgetで変更できます。レコードのないリポジトリでは何も消費されません。つまり、このコストはインストール時ではなく、利用が始まってから発生します。 - 回答が一部のみの場合があります。 カバレッジは開示されます。一部のみの結果に記録が含まれていなくても、その記録が存在しない証拠にはなりません。
commitlore coverageはスキャンが到達した範囲を報告します。 - コミットトレーラーはクローンとともに移行しますが、ノートは移行しません。 Git はデフォルトでは
refs/notes/*をフェッチしないため、refs/notes/commitlore内のレコードは、commitlore initでそのミラーを設定するまで通常のクローンには含まれません。 - ホスト型バックエンドはありません。 ただし、サーバーまたはフックがコンテキストを返した後は、ホストが自身のポリシーに従ってそのコンテキストを処理します。CommitLore はそのデータフローを制御しません。
セキュリティと信頼モデル
レコードは、評価されるまでは信頼できません。デフォルトの作成者照合はポリシーメタデータであり、認証ではありません。署名付きディレクティブモードでは、Git による検証とリポジトリローカルの署名者許可リストが必要です。許可リストが存在しない、または読み取れない場合は誰も許可されません。インジェクションを意図した形式のペイロードは、モデルが読み取れるルートへの配信を保留されます。
インストール、アップグレード、旧世代のフック
CLI インストーラーは、認識していないリポジトリ内のフックを書き換えることができません。また、実行中のホストセッションでは、読み込み済みのランタイムがそのまま使われます。commitlore doctor はこの両方の状態と修復方法を示し、commitlore upgrade はより新しいリリースがあるかどうかを報告します。
プロトコルと Git ストレージ
レコードは通常の Git トレーラーまたはノートです。プロトコル 2.0 では、ライフサイクル、信頼度、検証、互換性を定義します。
履歴のあるリポジトリでお試しください。
パスの範囲、ライフサイクル、キャプチャ、インストールで問題が発生する箇所をお知らせください。
## ドキュメント
コントリビューション
CONTRIBUTING.md では、このリポジトリが遵守する記録プロトコル、リリースゲート、および証拠を再現する方法について説明しています。
ライセンス
MIT — LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。