continuum について
Continuum は、コーディングエージェント向けの共有メモリとオーケストレーションを提供するローカル MCP サーバーです。学んだ内容を SQLite 上のベクトルインデックス付きナレッジベースに保存し、分離された git worktree にエージェントを割り当てます。同じプロジェクトで Claude Code、Codex、Cline を複数実行する開発者向けです。
主な機能
- 01sqlite-vec によるベクトルナレッジベース
- 02本文より先にメタデータを返す検索
- 034 段階のオーケストレーションワークフロー
- 04衝突を防ぐ reserved_paths の管理
- 05プロジェクトとナレッジを確認する Web パネル
活用シーン
- 01並行するコーディングエージェント間の編集競合の防止
- 02プロジェクトの規約を検索可能な知見として蓄積
- 03分離された worktree へのコーディングタスクの割り当て
MCP 対応
Continuum は MCP サーバーとして、プロジェクト、エージェント登録、ナレッジ関連のツールを Streamable HTTP 経由で Claude Code、Codex、Cline などのクライアントに提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm -e ORCHESTRATOR_DB_PATH -e EMBEDDER_URL -e EMBEDDER_MODEL -e EMBEDDER_DIM docker.io/pouyahasanamreji/continuum:0.3.0ORCHESTRATOR_DB_PATHSQLite path inside containerEMBEDDER_URLOptional HTTP embedder (Ollama/TEI/OpenAI-compatible). Unset = in-process embedder.EMBEDDER_MODELEmbedding model idEMBEDDER_DIMEmbedding vector dimensionローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
コーディングエージェントのための共有メモリ+オーケストレーション。
MCP サーバーは 1 つ。どのクライアントにもプロットを読むよう伝えれば、そのクライアントがオーケストレーターになります。
分離された worktree で新しいエージェントを起動し、プロジェクト内のすべての Claude Code / Codex / Cline のチャット間で学びを共有します。
クイックスタート • メモリとベクトル • ワークフロー • MCP ツール • 組み込み方法 • 設定

エージェントは忘れてしまいます。Continuum は覚えています。
任意の MCP クライアントを Continuum に接続して、プロットを読むよう指示してください。クライアントがオーケストレーターになり、コードベースを調査し、計画を検証し、ディスパッチ記録を保存して、分離された git worktree で動作する新しいエージェント用に、そのまま貼り付けられるプロンプトを用意します。プロジェクト内のほかのすべての Claude Code / Codex / Cline のチャットは、何が確保されているかを把握し、学んだことを共有するため、コードベースを何度も説明し直す必要はありません。ローカルサーバーは 1 つだけです。ベクトルナレッジベース、オーケストレーションプロトコル、エージェントレジストリが、マシン上のすべての MCP 対応アプリで共有されます。
flowchart TD
CC["Claude Code"]
CX["Codex"]
CL["Cline"]
YOU["YOU"]
subgraph CONTINUUM["CONTINUUM ORCHESTRATOR"]
direction LR
PLOT["PLOT.md<br/>protocol"]
KNOW["KNOWLEDGE<br/>(vectorized)"]
AGENTS["AGENTS<br/>registry"]
PANEL["WEB PANEL<br/>(humans)"]
end
DB[("SQLite + sqlite-vec<br/>one file, your disk")]
CC -- MCP --> CONTINUUM
CX -- MCP --> CONTINUUM
CL -- MCP --> CONTINUUM
YOU -- HTTP --> CONTINUUM
CONTINUUM --> DB
SaaS なし。テレメトリなし。管理するキーなし。 数秒で起動し、再起動後も動作し続け、利用規模に合わせて拡張できます。
得られるもの
| 🧠 ベクトル化されたメモリ | エージェントが学んだすべての教訓は、sqlite-vec にインデックス化される 768 次元の埋め込みになります。意味に基づくあいまい検索を瞬時に行えるため、完全一致に頼る必要はありません。 |
| 🔍 RAG ネイティブ検索 | knowledge_search({q: "how do we handle webhook retries?"}) は、ランク付けされたメタデータ(slug + kind + agentSlug + timestamps)を返します。続けて knowledge_get({slug}) を呼び出すと本文を取得できます。まずメタデータを取得することで、上位 K 件のコンテキストにかかるコストを抑えられます。読む価値のある内容だけを取得してください。 |
| 🗺️ 標準ワークフロー | すべてのプロジェクトに、4 フェーズのディスパッチプロトコル(Intake → Research → Verify → Handoff)が設定された PLOT.md が用意されます。プロセスを何度も説明し直す必要はありません。 |
| 🤖 マルチエージェントレジストリ | ステートマシンと予約済みパスの追跡により、複数のエージェントが git worktree 間で互いの変更を上書きするのを防ぎます。 |
| 📚 2 層のナレッジ | fundamental の教訓は、すべてのディスパッチで読み込まれる必須ルールです。situational の教訓は、関連する場合に意味検索で表示されます。 |
| 🖥️ 人間向けウェブパネル | Astro + React の UI で、AI クライアントが MCP 経由ですべてを操作する間に、プロジェクト、エージェント、プロット、ナレッジを閲覧できます。 |
| 🔌 クライアントに依存しない設計 | 標準の MCP / Streamable HTTP に対応しています。Claude Code、Codex、Cline、Cursor など、このプロトコルに対応するあらゆるツールで動作します。 |
| 🔒 ローカルファースト | SQLite ファイルは 1 つだけです。WAL モードを使用し、クラウドは不要です。埋め込みモデルを使うかどうかは任意です(Ollama、TEI、OpenAI 互換のものなら何でも使えます)。 |
| 📦 本番環境ではコンテナ 1 つ | イメージ 1 つ、HTTP ポート 1 つ、マウントするボリューム 1 つです。任意のホストに配置し、MCP クライアントを接続してください。 |
Continuum が存在する理由
| Continuum がない場合 | Continuum がある場合 |
|---|---|
| セッションが終了すると、コンテキストも失われます。 | 教訓は埋め込みベクトルとして保持されます。再起動後も、モデルやクライアントを変更しても、記憶を呼び戻せます。 |
| セッションのたびに規約を説明し直す必要があります。 | knowledge_search が関連度順に教訓を並べ、必要なときに knowledge_get で本文を取得します。 |
| 2 つの並行エージェントが同じファイルを編集してしまいます。 | reserved_paths とステータスのステートマシンにより、ディスパッチ前に競合を検出できます。 |
| 新しいタスクのたびに、オーケストレーションをその場で考える必要があります。 | PLOT.md プロトコルがすべてのプロジェクトに導入されます — 受付 → 調査 → 検証 → 引き継ぎ。 |
| 「先週、Claude は何をした?」 | registry_list でディスパッチのメタデータ(スラッグ、ステータス、ブランチ、予約済みパス)をページネーション表示できます。agent_get({slug}) でレコード全体を取得できます。 |
| ナレッジがチャットログに散在します。 | SQLite データベースは 1 つ。ベクトルインデックスも 1 つ。信頼できる情報源は 1 つです。 |
クイックスタート
🐳 簡単な方法 — Docker コマンドを 1 つ実行
docker compose -f docker-compose.dev.yml up
これで完了です。ホットリロード、SQLite ブラウザー、単一の共有ボリュームを備えたスタック全体が起動します。ホストマシンに Node や pnpm を用意したり、ネイティブビルドに手間をかけたりする必要はありません。
利用できるサービス:
| サービス | URL | 説明 |
|---|---|---|
| api | http://localhost:6685 | NestJS + MCP サーバー。Swagger は /docs です。ファイルの変更時にホットリロードされます。 |
| web | http://localhost:6680 | Astro + React パネル。ホットリロードされます。 |
| sqlite-web | http://localhost:6667 | 稼働中の SQLite データベースを確認するブラウザー UI — プロジェクト、エージェント、ナレッジ、ベクトルを確認できます。sqlite-vec は自動的に読み込まれます。 |
| embedder(任意) | http://localhost:8080 | HTTP エンベッダーを実行する Hugging Face TEI です。デフォルトでは無効です。 |
デフォルトでは、API はプロセス内で埋め込みを生成します(Transformers.js 経由の Snowflake/snowflake-arctic-embed-m-v1.5、768 次元、ONNX q8)。セマンティック検索に外部サービスは必要ありません。EMBEDDER_URL を設定すると、任意の HTTP ベースのエンベッダー(Ollama、TEI、OpenAI 互換)を指定できます。embedder プロファイルで、同梱の TEI コンテナーを有効にできます。
HF_TOKEN=hf_xxx docker compose -f docker-compose.dev.yml --profile embedder up
バインドマウントによってソースツリーはホスト上に保持されるため、編集内容はすぐに反映されます。名前付きボリュームには node_modules が保存されるため、インストール内容は再起動後も維持されます。データベースはホスト上の ./.local-data/dev-orchestrator.db に保存され、Git の追跡対象外なので安全に削除できます。
すべて停止するには:
docker compose -f docker-compose.dev.yml down # keep data
docker compose -f docker-compose.dev.yml down -v # nuke volumes too
🛠️ またはベアメタルで実行
pnpm install
pnpm dev
| API + MCP | http://localhost:7776(Swagger は /docs) |
| Web パネル | http://localhost:7777 |
開発用 SQLite は ./.local-data/orchestrator.db にあります。Git の追跡対象外です。リセットするには削除してください — 次回起動時に再作成され、マイグレーションが適用されます。
Node >=22.12.0 と pnpm 10.33+ が必要です。Compose を使う場合は、どちらも不要です。
メモリとベクトル
ここが最大の特長です。Continuum のナレッジレイヤーによって、エージェントは物忘れをしなくなります。
教訓がメモリになる仕組み
agent finishes a dispatch
│
▼
knowledge_create({
project, agentSlug, slug,
content: "When wiring rate-limit guards in Nest,
register them in app.module.ts AFTER
the auth guard, not before. Order matters.",
kind: 'situational'
})
│
▼
content → embedder (in-process by default, or Ollama / TEI / OpenAI-compatible)
│ Snowflake Arctic Embed v1.5 → 768-dim vector
▼
SQLite row + sqlite-vec index entry
│ freshness profile = (URL, model, dim)
▼
forever queryable by ANY future agent on this project
記憶を呼び戻す仕組み
すべてのディスパッチのフェーズ 1 で、オーケストレーターが次の処理を自動的に行います。
knowledge_list({ project, kind: 'fundamental' })
└─ returns metadata for every binding lesson — slug + agentSlug + timestamps.
knowledge_get({ project, slug }) // for each fundamental slug
└─ full body — base branch, worktree convention, no-AI-attribution, etc.
knowledge_search({ project, q: "rate limit middleware nest interceptor order" })
└─ vector similarity over your prose
└─ returns top-K ranked metadata (no content)
└─ does NOT need exact wording — natural language works
knowledge_get({ project, slug }) // for each relevant hit
└─ pulls the full lesson body
検索と一覧表示で返されるのは、スラッグ、種類、agentSlug、タイムスタンプのメタデータのみです。読む価値のある教訓の本文は、knowledge_get を呼び出して取得します。最初にオーケストレーターが内容を選別し、その後で取得するため、上位 K 件のコンテキストコストを抑えられます。
その結果、タスクを計画しようとしているエージェントは、直近 5 人のエージェントが苦労して学んだことをすでに把握しています。プロンプトエンジニアリングは不要です。「これが私たちの規約です」とコピー&ペーストする必要もありません。
2 種類のナレッジ
| 種類 | 読み込まれるタイミング | 用途 |
|---|---|---|
fundamental | すべてのディスパッチで無条件に | プロジェクト全体のルール:ベースブランチ、ワークツリーの命名規則、コミット規約、追記のみのファイル |
situational | タスクとの意味的な関連性がある場合のみ | 個別の注意点:「認証ガードの順序」「生成アーティファクトのマージ戦略」「Stripe webhook の冪等性キー」 |
鮮度プロファイル
ベクトルは (EMBEDDER_URL, EMBEDDER_MODEL, EMBEDDER_DIM) の組み合わせに紐付けられています。いずれかを変更すると、Continuum は古いベクトルにフラグを付け、次回起動時に再構築します。メモリを管理するエンベッダーは自分で選択できます — ローカルの Ollama、セルフホスト可能な TEI、または OpenAI 互換のものを利用できます。
プラグイン可能なエンベッダー
エンベッダーは必須で、デフォルトではインプロセスで実行されます(Snowflake/snowflake-arctic-embed-m-v1.5、768 次元、ONNX q8)。モデルの重みは API イメージに含まれているため、追加のコンテナーや設定は不要で、セマンティック検索をすぐに利用できます。
EMBEDDER_URL を設定すると、HTTP サービスにエンベディング処理を委任できます。
# Option A — Ollama (simplest, fully local)
ollama pull <embedding-model>
# EMBEDDER_URL=http://127.0.0.1:11434/api/embed
# EMBEDDER_MODEL=<embedding-model> EMBEDDER_DIM=768
# Option B — Hugging Face TEI (production-grade, batched)
HF_TOKEN=hf_xxx docker compose -f docker-compose.dev.yml --profile embedder up embedder
# EMBEDDER_URL=http://127.0.0.1:8080/v1/embeddings
# EMBEDDER_MODEL=<repo-id> EMBEDDER_DIM=768
# Option C — anything OpenAI-compatible /v1/embeddings
# Works out of the box. Match the dim.
sqlite-vec を基盤に構築
ベクトルインデックスは、プロジェクト、エージェント、プロットと同じ SQLite ファイルに格納されます。ファイルは 1 つ。バックアップも 1 つ。復元も 1 回で済みます。別のベクトル DB を用意する必要も、Pinecone の料金も、面倒を見るべき Chroma デーモンもありません。WAL モードにより読み取りと書き込みを並行して実行できます。外部キーによってレジストリの整合性を保ち、busy_timeout = 5000 により競合が発生しても安定して動作します。
AI クライアントに接続する
Claude Code
// ~/.claude.json → mcpServers
{
"mcpServers": {
"continuum": {
"transport": "streamable-http",
"url": "http://127.0.0.1:7776/mcp"
}
}
}
Claude Code を再起動してください。ツールが mcp__continuum__* の名前で表示されます。
Codex
# ~/.codex/config.toml
[mcp_servers.continuum]
transport = "streamable-http"
url = "http://127.0.0.1:7776/mcp"
その他(Cline、Cursor、カスタムクライアント)
MCP 互換クライアントから http://127.0.0.1:7776/mcp に接続してください。Streamable HTTP と、UUID をキーとするステートフルセッションに対応しています。サーバー名は continuum です。
最初のプロジェクト
接続済みのクライアントで、次を実行してください。
Create a Continuum project for /absolute/path/to/my/repo,
then read the PLOT.md and act as orchestrator
for the following task: <describe what you want done>.
実行される内容:
- クライアントが
project_create({project: "/absolute/path/..."})を呼び出します - サーバーが PLOT.md(オーケストレーションプロトコル)と空のナレッジベースを作成します
- クライアントが
plot({project})を呼び出し、プロトコルを読み込んでオーケストレーターモードに入ります - クライアントが 4 フェーズのワークフローに従い、調査と検証を行い、ディスパッチ記録を保存して、Git worktree 内で新しいエージェントを起動するための、そのまま貼り付けられるプロンプトを用意します
プロンプトを新しい Claude Code/Codex セッションに貼り付けます。そのエージェントは、予約されたパスを対象に、分離された worktree 内でコーディングします。他の並列エージェントは、調整ブリーフを通じて新しいエージェントの予約内容を確認できます。
作業がマージされると、オーケストレーターは knowledge_create を使って学んだ内容を記録します。これにより、このプロジェクトに対する今後すべてのディスパッチに、その知見が活用されます。
ワークフロー
1. 要件の整理
registry_list({project, status:'active'}) // paginated metadata: slug + reservedPaths + timestamps
agent_get({project, slug}) // bodies (request/plan/implPrompt/coordinationBrief) per active agent
knowledge_list({project, kind:'fundamental'}) // binding-rule metadata
knowledge_get({project, slug}) // body per fundamental slug — read every one
knowledge_search({project, q: "<task intent>"}) // RAG → ranked metadata
knowledge_get({project, slug}) // body for each relevant hit
2. 調査
Explore/Plan サブエージェントを起動します。読み込まれたナレッジを踏まえてコードベースを調査し、ファイルごとの計画(作成/変更/削除)を作成します。計画のみで、コードは変更しません。
3. 検証
批評エージェントを起動します。変更対象の各ファイルを精査し、孤立したコードや壊れた呼び出し元を探します。また、アクティブなエージェントが予約しているパスと照合し、注釈付きの差分を返します。
4. 引き継ぎ
agent_create({
project, slug, branch, worktree,
reservedPaths, // paths this agent owns
request, // verbatim human task
plan, // final agreed plan
implPrompt, // self-contained prompt for the dispatched agent
coordinationBrief, // short block for every other active agent
})
エージェントは draft として登録されます。ディスパッチ時に agent_update({status:'active'}) で昇格させてください。マージしたら SHA を記録し、学びを蓄積します。
agent_update({ project, slug, status:'merged', mergedCommit, postMergeNotes })
knowledge_create({ project, agentSlug, slug, content, kind:'situational' })
オーケストレーターがソースを編集したり、regen を実行したり、ブランチをマージしたり、コミットをプッシュしたりすることはありません。調査、検証、調整、記録を行います。コードは分離された worktree 内で新しいエージェントが作成します。
MCP ツール
すべてのツールでは、最初の引数として project(正規化された絶対パス)を指定します。
プロジェクト
| ツール | 目的 |
|---|---|
project_list | 登録済みプロジェクトを列挙します |
project_get | 1 つのプロジェクトを取得します |
project_create | プロジェクトを登録し、PLOT.md とナレッジを作成します |
project_rename | プロジェクト名を変更します |
project_delete | プロジェクト、エージェント、レッスンを連鎖的に削除します |
Plot — オーケストレーションプロトコル
| ツール | 目的 |
|---|---|
plot | PLOT.md を読み込みます |
plot_update | 統一 git 形式の差分を適用します(ファジーマッチなし、コンテキストの完全一致が必要です) |
plot_update は --- a/PLOT.md/+++ b/PLOT.md/@@ のヘッダーを厳密に検証します。コンテキストが一致しない場合は、失敗したハンクヘッダーを含む hunk_mismatch エラーが発生します。plot で再読み込みし、差分を再生成して再試行してください。警告なしに上書きされることはありません。
Knowledge — ベクトルメモリ
| ツール | 目的 |
|---|---|
knowledge_list | レッスンのメタデータ(slug、kind、agentSlug、タイムスタンプ)。任意の kind フィルター。コンテンツは含まれません。 |
knowledge_search | セマンティック検索クエリ → ランク付けされたメタデータ。q は自由記述の意図、kind と limit は任意です。コンテンツは含まれません。 |
knowledge_get | slug でレッスンを 1 件読み込みます — 本文全体 |
knowledge_create | 新しいレッスンを記録します — kind: 'fundamental' | 'situational'。自動的に埋め込みが作成されます。 |
knowledge_update | レッスンの内容を置き換えます。保存時に埋め込みが再作成されます。 |
knowledge_delete | レッスンを廃止します |
knowledge_search は sqlite-vec インデックスを使ってベクトル検索を実行します。自然な文章を渡してください。質問、タスクの記述、説明のいずれでも機能します。SQL のワイルドカード構文は使えません。レスポンスはランク付けされたメタデータです。読む価値のある結果の本文を取得するには、knowledge_get({project, slug}) を呼び出してください。knowledge_list も同じパターンです(kind: 'fundamental' を使って拘束力のある一連のレッスンを列挙し、それぞれを取得します)。
エージェント
| ツール | 目的 |
|---|---|
registry_list | ページネーション対応のエージェントメタデータ — {data, page, limit, hasNextPage}。各 data 行には、slug、status、branch、worktree、reservedPaths、タイムスタンプ、mergedCommit、abandonedReason が含まれます。status フィルターは任意です。デフォルトの limit は 10、最大値は 50 です。成果物の本文は含まれません。 |
agent_get | slug で完全なレコードを取得します — request、plan、implPrompt、coordinationBrief、postMergeNotes が含まれます |
agent_create | 下書きのディスパッチレコードを保存します |
agent_update | ステータスを遷移させ、フィールドを編集します |
許可される遷移は draft → active → merged | abandoned です。merged には 7~40 文字のコミット SHA が必要です。abandoned には理由が必要です。パスを予約するのは active のエージェントのみです。
registry_list は、衝突マトリックスのメタデータをページネーション対応の 1 つのエンベロープで返します。ディスパッチの plan または implPrompt を確認するには、続けて agent_get({project, slug}) を呼び出してください。hasNextPage が false になるまで page を進めてください。
セッションの例
human: orchestrate adding rate-limit middleware to /api routes
claude: → registry_list({project, status:'active'}) // 0 active
→ knowledge_list({project, kind:'fundamental'})
// metadata for binding rules
→ knowledge_get({project, slug:'base-branch'}) // → main
→ knowledge_get({project, slug:'worktree-convention'}) // → ../<slug>/
→ knowledge_search({project, q:'rate limit middleware nest interceptor'})
// ✨ 2 ranked hits on guard ordering (metadata)
→ knowledge_get({project, slug:'rate-limit-guard-ordering'}) // bodies fetched
→ spawn Plan subagent → plan returned
→ spawn critique subagent → 1 issue: missed `app.module.ts` registration → fixed
→ agent_create({
slug: 'rate-limit-middleware',
branch: 'feature/rate-limit',
worktree: '/abs/path/../rate-limit-middleware',
reservedPaths: ['apps/api/src/common/rate-limit/**', 'apps/api/src/app.module.ts'],
request: 'orchestrate adding rate-limit middleware to /api routes',
plan: '...',
implPrompt: '...',
coordinationBrief: 'reserves common/rate-limit/**, edits app.module.ts (additive)'
})
→ here's the impl prompt to paste into a fresh session: ...
[ task ships ]
claude: → agent_update({slug:'rate-limit-middleware', status:'merged', mergedCommit:'a1b2c3d'})
→ knowledge_create({
agentSlug: 'rate-limit-middleware',
slug: 'rate-limit-guard-ordering',
kind: 'situational',
content: 'Rate-limit guards must register AFTER auth guard in app.module.ts.
Order in providers array decides execution order. Reverse → 401s
bypass rate limiting.'
})
// ✅ lesson embedded → vector indexed → permanent memory
次回、このプロジェクトでレート制限に関係するものに誰か(あなた、Claude、Codex)が触れると、そのレッスンが自動的に表示されます。
Web パネル


Astro 6 + React 19 のアイランド。Tailwind v4。shadcn/ui。
| ページ | 内容 |
|---|---|
/ | ランディングページ |
/projects | プロジェクト一覧 — TanStack Table、並べ替えとフィルターに対応 |
/agents | プロジェクト横断のレジストリ/ステータスボード |
/knowledge | Markdown ビューアー — GFM、構文ハイライト、アンカー付きセクション、検索 |
/plot | 差分プレビュー付きのプロットビューアー + エディター |
/settings | Embedder の URL + モデル + 次元数、トークナイザーキー、REST ゲート、ログレベル |
app_settings(SQLite)に保存された設定は、環境変数を上書きします。ヘッドレス環境でのデプロイも、環境変数のみで引き続き動作します。
設定
環境変数とパネル設定の両方を利用できます。パネル設定が優先されます。
| 変数 | デフォルト | 目的 |
|---|---|---|
PORT | 7776 | HTTP ポート |
CORS_ORIGIN | unset | * またはカンマ区切りのオリジン |
ORCHESTRATOR_DB_PATH | /data/orchestrator.db | SQLite のパス。開発用スクリプトでは ./.local-data/orchestrator.db に上書きされます |
PANEL_REST_ENABLED | false | REST エンドポイント /api/orchestrator/* をマウントします(パネルで使用) |
NODE_ENV | unset | 本番環境では破壊的なマイグレーションをブロックします |
ORCHESTRATOR_ALLOW_DESTRUCTIVE_MIGRATE | unset | 本番環境で上書きするには 1 を設定します |
ANTHROPIC_API_KEY | unset | トークン数エンドポイント(サーバー側のみ) |
ANTHROPIC_TOKENIZER_MODEL | claude-opus-4-7 | count_tokens 用のモデル名 |
EMBEDDER_URL | unset | HTTP 埋め込みエンドポイント(Ollama / TEI / OpenAI 互換)。未設定の場合はプロセス内 Embedder を使用 |
EMBEDDER_MODEL | Snowflake/snowflake-arctic-embed-m-v1.5 | モデル ID(プロセス内でのデフォルト。HTTP Embedder の設定時は引き渡されます) |
EMBEDDER_DIM | 768 | 想定される埋め込みの次元数 |
スタック
| レイヤー | 技術 |
|---|---|
| メモリ | sqlite-vec ベクトルインデックス • Transformers.js 経由のプロセス内 Snowflake Arctic Embed v1.5(デフォルト) • EMBEDDER_URL 経由の Ollama / TEI / OpenAI 互換エンベッダー • 鮮度固定ベクトル |
| API | NestJS 11 • @rekog/mcp-nest • @modelcontextprotocol/sdk 1.10 • Zod 4 • Swagger |
| 永続化 | better-sqlite3(WAL、FK、busy_timeout 5s) |
| 差分エンジン | diff 9(ファズなしの unified-diff 適用) |
| Web | Astro 6 • React 19 • Tailwind 4 • shadcn/ui • TanStack Table • rehype/remark • highlight.js |
| ツール | Turborepo 2 • pnpm 10.33 • TypeScript 5.9 • Prettier 3 • Jest |
スクリプト
pnpm dev # turbo run dev — api + web in watch
pnpm build # turbo run build
pnpm lint # turbo run lint
pnpm check-types # turbo run check-types
pnpm format # prettier across ts/tsx/js/astro/md/json
pnpm -F @continuum/api dev # api only — nest start --watch
pnpm -F @continuum/api mcp:dev # api with local SQLite at .local-data/
pnpm -F @continuum/api test # jest unit tests
pnpm -F @continuum/api test:e2e # jest e2e
pnpm -F @continuum/web dev # web only — astro dev
pnpm -F @continuum/web build # astro build → dist/
規約
projectは常に正規の絶対パスです。 プロジェクトルートを渡してください。worktree のサブディレクトリは渡さないでください。worktree のパスを指定するとproject_not_foundが発生します。- プロットの変更は unified diff を通じて行います。 全文を書き込むことはできません。コンテキストが不適切な場合、サーバーは失敗した
@@ヘッダーを示して拒否します。 - ナレッジの更新では、コンテンツ全体を置き換えます。 新しい
content全体を渡してください。保存時に再埋め込みされます。 - 予約パスは glob の JSON 配列です。
activeエージェントのみが予約します。 - マイグレーションは起動時に前方向のみ実行されます。 明示的に許可しない限り、本番環境では破壊的なマイグレーションがブロックされます。
トラブルシューティング
| 症状 | 考えられる原因 |
|---|---|
project_not_found | worktree のパスを渡しています。project_create に登録した正規のプロジェクトルートを使用してください。 |
plot_update からの hunk_mismatch | 差分が古くなっています。plot で再読み込みし、現在のコンテンツを基に差分を再生成してから再試行してください。 |
knowledge_search / knowledge_list が空または不自然な結果を返す | エンベッダーに到達できない、モデルが一致しない、または次元数が一致しない(検索のみ)可能性があります。/settings を確認してください。古いベクトルをバックフィルしてください。どちらもメタデータを返すことに注意してください。本文を取得するには knowledge_get({project, slug}) を呼び出してください。 |
| エンベッダーの切り替え後もベクトルが再生成されない | 鮮度プロファイル(URL + model + dim)が変更されている必要があります。バックフィルを開始するにはサーバーを再起動してください。 |
agent_update からの invalid_transition | 許可されるのは draft → active → merged | abandoned です。それ以外はエラーになります。 |
missing_merged_commit / invalid_merged_commit | merged には7~40文字の SHA が必要です。 |
| 本番環境でスキーママイグレーションが拒否される | 本当に必要な場合は ORCHESTRATOR_ALLOW_DESTRUCTIVE_MIGRATE=1 を設定してください。 |
ロードマップ
- プロジェクト間でのナレッジ共有(
kind: 'global') - 小型の再ランキングモデルによる埋め込み再ランキング
- 既存の CLAUDE.md / AGENTS.md / Cursor ルールを基礎情報へ一括インポート
- 読み取り専用の公開ナレッジミラー(プロジェクトの教訓を静的サイトとして公開)
- SessionStart / SessionEnd イベント用の組み込み観測フック
貢献
貢献を歓迎します。フォークし、ブランチを作成し、テストして、PR を送ってください。Prettier のデフォルト設定(100列、ダブルクォート、セミコロン、ES5 の末尾カンマ)に合わせてください。MCP ツールの変更は Zod で型付けしてください。
サポート
| 課題 | GitHub Issues |
| ドキュメント | この README + /docs の Swagger UI + 各プロジェクトにシードされた PLOT.md |
| MCP 仕様 | https://modelcontextprotocol.io |
エージェントに忘れさせるのは、もうやめましょう。
pnpm install && pnpm dev — これで、もう忘れることはありません。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。