Aletheia について
Aletheiaは、コーディングエージェント向けのプロジェクトメモリです。記憶した主張をソースコードの証拠に結び付け、呼び出すたびに検証することで、古いコード情報への依存を防ぎ、関連ファイルのマップや行番号も示します。
主な機能
- 01各メモリにコード上の証拠を付与
- 02呼び出しのたびに証拠を再検証
- 03古い主張を隠し、移動したコードを通知
- 04関連ファイルと行番号を含むマップを生成
- 05共有メモリをMarkdownファイルで保存
活用シーン
- 01コーディングセッション間で検証済みの事実を維持
- 02呼び出した主張に対応する現在のソース行を特定
- 03コード変更で無効になったメモリの利用を回避
- 04チームでプロジェクトメモリを共有
MCP 対応
stdio経由でrecall、remember、get、verifyの4つのMCPツールを提供します。MCP非対応のエージェントはコマンドラインを利用できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
4掲載時のツール一覧 · 4 日前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| tag | string | いいえ | |
| full | boolean | いいえ | |
| query | string | いいえ | |
| stale | boolean | いいえ | |
| budget | number | いいえ | |
| session | string | いいえ |
詳細
コーディングエージェントが検証できるメモリー。
すべてのメモリーには、コードに基づく証拠が含まれます。Aletheia は想起のたびに証拠を再確認し、
エージェントに該当する行を正確に示し、古くなった事実がコンテキストに入らないようにします。
問題
コーディングエージェントはセッション間の内容をすべて忘れるため、毎回同じファイルを読み直します。メモリーツールは忘却を解決しますが、メモリーを類似度で順位付けするため、古いメモリーも、それに取って代わった事実と同じくらい関連性が高く見えてしまいます。その結果、エージェントは数週間前に真実ではなくなった情報を前提に作業を進めます。自信満々に誤った内容を示すメモリーは、メモリーがないよりも悪いのです。
仕組み
- メモリーには証拠が含まれます。 各メモリーは、主張とアンカーで構成されます。アンカーには、存在し続ける必要がある関数、一致し続ける必要がある行、残り続ける必要があるファイルが含まれます。
- 想起のたびに証拠を確認します。 確認は機械的に行われ、モデル呼び出しも、埋め込みも、ネットワークも必要ありません。証拠が無効になったメモリーはエージェントに表示されず、その旨を1行で伝えます。
- 移動したコードを追跡します。 Go の宣言が変更されずに別のファイルへ移動すると、そのメモリーは古くならず、新しい場所とともに
[moved]として戻ってきます。 - 想起結果には行番号が示されます。
builtin_test.go:263のようなポインターは、その時点のファイルから計算されるため、エージェントは該当箇所を探し回らずに正しい行を開けます。 - マップは自動で作成されます。 エージェントが処理を終えると、Aletheia はセッションのトランスクリプトを読み取り、タスクによって変更されたファイルを記録します。同じ種類の次のタスクはその情報を起点に始まり、エージェントが記録のためにターンを費やす必要はありません。
- 削除されることはありません。 置き換えられたメモリーは旧版として扱われ、長期間古くなったメモリーは
aletheia lethe(忘却の川、Lethe)によってアーカイブされます。
クイックスタート
1. インストールします。 お好きな方法でインストールできます。どの方法でも同じ単一のバイナリが提供されます。
npm install -g @firatmio/aletheia # Node 18+, any OS
go install github.com/firatmio/aletheia/cmd/aletheia@latest # Go 1.24+
scoop bucket add firatmio https://github.com/firatmio/scoop-bucket; scoop install aletheia # Windows
brew install --cask firatmio/tap/aletheia # macOS, Linux
Linux、macOS、Windows 用のビルド済みアーカイブはリリースページにあります。
2. エージェントを接続します。
プラグインを使用する Claude Code(推奨)。 MCP サーバーと両方のフックが含まれています。続いて /aletheia:setup を実行すると、プロジェクトが初期化されます。
/plugin marketplace add firatmio/aletheia
/plugin install aletheia@aletheia
/aletheia:setup
プラグインを使用しない Claude Code。 プロジェクトをセットアップし、2 つのフックを自分で追加します。これでプロンプトのたびにリコールが行われ、エージェントのコストはかかりません。
cd your-project
aletheia init --agents --claude-hooks # .aletheia/, usage notes in CLAUDE.md and AGENTS.md, hooks in .claude/settings.json
aletheia hook --dry-run # what an agent would get (add a prompt to try one); changes nothing
--claude-hooks は自分で実行してください。エージェントが自分自身のフックを変更することは通常許可されておらず、それは意図的な設計です。プラグインをインストールしている場合は、これらのフックを追加しないでください。プラグインに同じ 2 つのフックが含まれています。init はプラグインを検出して、その旨を表示します。代わりにファイルを手動で編集するには、次を使用してください。
{
"hooks": {
"UserPromptSubmit": [{ "hooks": [{ "type": "command", "command": "aletheia hook" }] }],
"Stop": [{ "hooks": [{ "type": "command", "command": "aletheia hook" }] }]
}
}
その他のエージェント。 Cursor、VS Code、Claude Desktop、Codex は MCP 経由で接続します。MCP に対応していないエージェントでは CLI を使用します。詳しくは、以下のその他のエージェントをご覧ください。npx を設定した MCP クライアントは、インストール不要で次のように利用できます。{"command": "npx", "args": ["-y", "@firatmio/aletheia", "serve"]}。
エージェントはエージェントガイドを使ってセットアップを行うこともできます。フックの手順は、あの 1 つのコマンドを実行するよう、あなたに引き継ぎます。
メモリーは .aletheia/memories/*.md にプレーンな Markdown として保存されます。メモリーをコミットすると、チーム全員とすべてのエージェントが、各マシンで検証される共通のメモリーを使えます。
アップグレード: npm update -g @firatmio/aletheia、scoop update aletheia、または brew upgrade --cask aletheia を実行します。Go の場合は、同じ go install を再度実行してください。プラグインは claude plugin update aletheia@aletheia で更新します。
- 実行されるバージョン: フックは新しいバイナリをすぐに使います。MCP サーバーはエージェントを再起動するまで古いバイナリを使い続けます。
- Windows で
go installを使用する場合: エージェントの実行中は、MCP サーバーがaletheia.exeを開いたままにするため、インストールは「ファイルが使用中」というエラーで失敗します。先にエージェントを終了するか、古いバイナリを別の場所に移動してください。Windows では、実行中の exe でも移動できます。
これはアップグレードのたびに機能します。使用されなくなった古いコピーを削除し、ランダムな名前を使うため、まだ実行中のバイナリと名前が重複することもありません。
$bin = "$(go env GOPATH)\bin"
Remove-Item "$bin\aletheia-old*.exe" -ErrorAction SilentlyContinue
Rename-Item "$bin\aletheia.exe" "aletheia-old-$(Get-Random).exe"
go install github.com/firatmio/aletheia/cmd/aletheia@latest
結果
実際のリポジトリでヘッドレス Claude Code(Opus 5.5)を使用して測定しました。各タスクを Aletheia の有無それぞれで実行し、同じ非公開の受け入れテストで成否を判定しました。
| リポジトリ | タスク | コスト | その他 | 合格したタスク |
|---|---|---|---|---|
| gohugoio/hugo、大規模なサイトジェネレーター(Go のコード 233k 行) | 5 種類のタスクを各 1 回、計 14 タスク | −15%:1 種類の 7 タスクでは −22%、複数種類の組み合わせでは −7% | 入力トークン −27%、ターン数 −21% | 14/14、Aletheia なしの場合と同じ |
| expr-lang/expr、中規模の式言語 | 7 タスクを 2 回実行 | −9%、両方の実行で同じ | 最初の編集前に読んだコード −48% | 14/14、Aletheia なしの場合と同じ |
| go-chi/chi、小規模で整然としたルーター | 7 つの小規模タスクを 2 回実行 | +5% と −5%:損益なし | 14/14、Aletheia なしの場合と同じ |
適切な場所を見つけるコストが大きい中規模以上のコードベースでは、Aletheia の効果が得られます。同じ種類の変更が繰り返される場合に、最も効果を発揮します。日常的な作業では、複数種類のタスクを混ぜた場合の数値を目安にしてください。エージェントが 1、2 回の呼び出しで読み取れる小規模なパッケージでは、削減できるコストはほとんどありません。手法、生の測定値、うまくいかなかったことについては、docs/dogfood-4.2.mdをご覧ください。
リファレンス
アンカー
| アンカー | 保持される条件 | 例 |
|---|---|---|
symbol:PATH::NAME | ファイルがその関数、メソッド(Type.Method)、型、var、または const を宣言している | symbol:store.go::Store.Get |
contains:PATH::REGEX | ファイルが正規表現に一致している | contains:go.mod::^go 1\.23$ |
exists:PATH | パスが存在している | exists:src/auth |
file:PATH | ファイルの内容が変更されていない(保存時にハッシュで封印) | file:go.mod |
メモリが古くなった場合は、主張を再確認してから、次を実行します。
aletheia verify 3f9a1c --reseal # still true: refresh the evidence
aletheia remember "…new claim…" --anchor … --supersedes 3f9a1c # changed: replace it
--reseal は、contains、exists、symbol のアンカーが成立しなくなっている場合は拒否するため、誤った主張がひそかに承認されることはありません。
コードマップ
aletheia map "<topic>" は、トピックに最も関連するファイルを、それぞれの主要な宣言と現在の行番号とともに一覧表示します。
optimizer/fold.go: fold.Visit 15-311, fold 10-13, toFloat 329-335
builtin/builtin.go: Builtins 35-1081, Index 18
ファイルは Aider のリポジトリマップと同様に、パスと宣言名がトピックにどれだけ一致するかに基づいて、まずランク付けされます。非表示のファイル、依存関係のファイル、生成されたファイルは除外されます。ビルド、テスト、リリースに関する質問の場合、およびトピックを指定しない概要の場合、マップはビルドファイルから始まります。build and CI: go.mod, Makefile, scripts/, .github/workflows/ci.yml。フックはセッションの最初のプロンプトとともに、プロジェクトの規模に合わせたマップを送信します。ソースファイルが25個未満の場合は送信されず、それ以上の場合は300または600トークンです(--map-budget N で上書きできます)。
他のエージェント:Claude Desktop、VS Code、Cursor、Codex、Aider
Aletheia は stdio 経由で MCP を使用し、4つのツール(recall、remember、get、verify)を提供します。また、通常の CLI としても動作するため、シェルコマンドを実行できるエージェントなら利用できます。
{
"mcpServers": {
"aletheia": { "command": "aletheia", "args": ["serve", "--dir", "/absolute/path/to/your-project"] }
}
}
グローバルインストールを行わない場合は、"command": "npx", "args": ["-y", "@firatmio/aletheia", "serve", "--dir", "…"] を使います。サーバーは --dir で指定されたディレクトリ、またはクライアントが起動したディレクトリから .aletheia/ を探します。.aletheia/ がないプロジェクトでは、ツールは失敗する代わりにセットアップ方法を案内し、aletheia init の実行後すぐに動作を開始します。
メモリファイル
---
id: "3f9a1c"
claim: "Auth tokens are issued by IssueToken, HS256 with a 15 minute expiry"
confidence: 0.8
status: "active"
source: "claude-code"
created: "2026-10-21T09:12:44Z"
updated: "2026-10-21T09:12:44Z"
tags:
- "auth"
anchors:
- "symbol:src/auth/jwt.go::IssueToken@7370a7fe3669256c"
- "contains:src/auth/jwt.go::jwt\\.SigningMethodHS256"
---
Refresh tokens are handled separately, by RefreshToken.
@7370a7fe3669256c というサフィックスは、IssueToken が移動してもメモリを追跡できるようにする、封印されたフィンガープリントです。
メモリは手作業で編集したり、プルリクエストでレビューしたり、grep したりできます。単なるファイルです。
CLI
aletheia init [dir] [--agents] [--claude-hooks]
aletheia remember <claim> [--anchor SPEC]... [--body TEXT|-] [--tag T]... [--ttl 30d]
[--confidence 0.8] [--supersedes ID]... [--source NAME] [--force]
aletheia remember - [--source NAME] [--force] # several at once: one JSON object per line on stdin
aletheia recall [query] [--budget N] [--limit N] [--full] [--stale] [--tag T] [--session ID] [--json]
aletheia get <id> [--json]
aletheia verify [id] [--reseal] [--ttl 30d] [--json] # exits 1 if anything is stale (CI-friendly)
aletheia map [topic] [--budget 600]
aletheia hook [--budget N] [--map-budget N] [--dry-run [prompt]] # Claude Code hook; every command takes --help
aletheia lethe [--days 30] [--apply] [--json] # archive superseded and long-stale memories
aletheia stats [--json]
aletheia serve [--dir DIR] # MCP server on stdio
aletheia version
すべてのコマンドで --help を利用できます。また、別の場所からプロジェクトを指定するには --dir DIR(または ALETHEIA_DIR)を使います。
remember は、主張が既存のメモリと重複するか、よく似ている場合、終了コード 3 を返して該当するメモリの名前を表示します。これにより、エージェントは代わりに --supersedes を指定できます。
remember - を使うと、1 回の呼び出しで複数のメモリを保存できます。標準入力の各行は MCP ツールのキーを含む JSON オブジェクトで、各メモリは個別に保存されます。
aletheia remember - <<'EOF'
{"claim": "Builtins are registered in builtin/registry.go", "anchors": ["symbol:builtin/registry.go::Builtins"]}
{"claim": "go.mod targets Go 1.18", "anchors": ["contains:go.mod::^go 1\\.18$"], "tags": ["toolchain"]}
EOF
結果は 1 行につき 1 件、順番に出力されます。すべて保存された場合は 0、失敗が競合のみの場合は 3、それ以外の場合は 1 を返します。シェルを通る際に \\ が \ に変わった正規表現(1\.18)も受け付けます。MCP の remember ツールでは、同じオブジェクトを memories として渡します。
安全性
- **何も実行しません。**アンカーはファイルを読み取るだけです。「確認のためにこのコマンドを実行する」というアンカーはありません。
- **プロジェクト内にとどまります。**アンカーのパスは相対パスであり、シンボリックリンク経由も含め、ルートの外に出ることはできません。
- **メモリは指示ではなくデータです。**MCP サーバーはその旨をエージェントに伝え、
CLAUDE.md/AGENTS.mdのブロックでも繰り返し説明します。 - **ネットワーク通信、テレメトリー、依存関係はありません。**Go の標準ライブラリだけを使う、単一の静的バイナリです。起動する唯一のプログラムは
init中に実行するgit check-ignoreで、CLAUDE.md が無視対象かどうかを確認します。 - **プライバシー:**Aletheia は何も収集しません。フックはお使いのマシン上でプロンプトとセッショントランスクリプトを読み取り、マップメモリはプロンプトの短縮コピーを
.aletheia/に保持します。プライバシーポリシーをご覧ください。
ロードマップ
- 根拠に紐づくメモリ。想起のたびに検証
- 想起フック、リアルタイムの行ポインター、コードマップ、Stop フックによるタスクマップ
- 実際のリポジトリでのペア実行に対応したベンチマークハーネス
- フィンガープリントで追跡する移動後の Go コード(
[moved]) - ビルド済みバイナリ、npm、Homebrew、Scoop、Claude Code プラグイン。MCP Registry に掲載
- Go 以外にも対応する、封印された
symbolアンカーと[moved]:まずは TypeScript/JavaScript と Python -
aletheia doctor:古くなり続けているアンカーを見つけ、より堅牢なものを提案 - より多くのリポジトリと繰り返し発生する変更パターンを使った、より長期的なベンチマーク
- 個人の好みに関する、プロジェクト横断のグローバルメモリ
各リリースでの変更点は CHANGELOG.md に記載されています。
貢献
イシューとプルリクエストを歓迎します。CONTRIBUTING.md と行動規範をご覧ください。Aletheia によってエージェントが誤った判断をした場合は、「An agent was misled」イシューフォームから報告するのが最も役立ちます。セキュリティ上の問題は、SECURITY.md の説明に従って非公開で報告してください。
ライセンス
Apache-2.0 © Fırat Tuna Arslan
ἀ-λήθεια:真実。文字どおりには「忘却を取り除くこと」
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。