mcpField
W
witness

witness

ローカル
github.comメモリ・ナレッジ109 週間前に更新

witness について

witnessは、AIコーディングセッションやその他のテキストコーパスを、出典をたどれる日付付きの属性変化履歴に変換するGo製エンジンです。現在の状態だけでなく、個人の成長やコーパスの変化をエージェントから参照できる記録として残したい人向けです。

主な機能

  1. 01セッションの記録とNDJSONレコードの取り込み
  2. 02根拠に結び付いた観察事項の抽出
  3. 03履歴を上書きせず属性の変化を日付付きで追跡
  4. 04オンデマンドで読みやすいMarkdownプロフィールを生成
  5. 05SQLiteとMarkdownでアーカイブを保存

活用シーン

  1. 01セッションをまたいだコーディング習慣の変化を振り返る
  2. 02過去の作業と記録された根拠をエージェントに照会
  3. 03市場や研究のテキストストリームの変化を追跡
  4. 04会議やインシデントのログから日付付き履歴を作成

MCP 対応

witnessはMCP経由でエージェントにアーカイブを提供します。READMEにはMCP操作`get_profile`が記載され、ファセットをもとにプロフィールをオンデマンド生成すると説明されています。

設定

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

mcp.json · 共通設定
{
"mcpServers": {
"ingtian-witness": {
"command": "npx",
"args": [
"-y",
"@witness-ai/opencode"
]
}
}
}
起動コマンドnpx -y @witness-ai/opencode

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

パッケージ
npm@witness-ai/opencode0.8.0

ツール

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

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

詳細

witness — モノゴトの変化の履歴を残す蒸留エンジン。

License: MIT npm Go Single binary Runtimes

witness はテキストのストリームを、対象がどのように変化したかを記す日付付きの記録に変えます。 AI コーディングセッションを入力すれば、あなたの考え方や仕事の進め方を追跡します。市場の論評、調査メモ、その他のドキュメントストリームを入力すれば、代わりにそれらの変化を追跡します。純粋な Go 製の単一バイナリで、ローカルの SQLite アーカイブとプレーンな Markdown を MCP 経由でエージェントに提供します。

中核となるのは、出所を伴う時間経過による変化です。属性の値が変わると、witness は古い値を上書きせず、日付を付けて終了し、新しい値を開始して、変化を引き起こしたソースレコードを記録します。そのためアーカイブは、単に*「今、何が正しいか」ではなく、「どのようにしてこうなったのか」*に答えられます。

「ああ、ずっとそばにいてくれたんだね。 我が真の師よ…… 我を導く月光よ……」 — 聖剣ルドウイーク

使い方は2通り

1. AI と作業しながら、自分自身の成長を見守る。 Claude Code または OpenCode にインストールすれば、バックグラウンドでセッションを記録します。プロンプトも特別な手順も不要です。数か月にわたって、思考、ワークスタイル、習慣、盲点がどう変化するかを、すべての主張の根拠とともに蒸留します。これが、witness にあらかじめ設定されている標準の構成です。

これはクローン作成ではなく、内省を目的としています。エージェントがあなたを理解できるようにし、あなた自身が読み返せる、思考と成長の記録を残すことが目的です。これはコーチではなく、純粋なツールです。記録、構造化、提供を行います。「これを3回やりましたね……」といったコーチ機能の構築は、出力を読み取る他のプロジェクトに委ねられています。

2. あらゆるテキストコーパスの変化履歴を作る。 何に注目し、どの側面を追跡するかを記述したプロンプトである lens を作成し、NDJSON レコードを witness ingest に渡せば、同じ4段階のエンジンが動作します。処理の仕組みに、人に特化したものはありません。生レコード → 観察 → 日付付きファセット → ナラティブです。

このセクションの執筆中に、最初から最後まで実行した例を紹介します。市場の論評を対象とする regime lens を使用し、人物向け lens を一切有効にしていないアーカイブで、7件のニュースレコードが22件の観察と13件のファセットになりました。その後、相場見通しが強気から弱気へ転換すると、アーカイブはそれを置き換えず、履歴として記録しました。

inflation/core_trend
  "Disinflation has broken rather than paused: core CPI reaccelerating…"   valid_to 2026-06-…
  "Core is disinflating persistently rather than reaccelerating…"          (current)

1回のレビューで、5つのファセットがこのように終了して再開しました。生成されたブリーフでは、以前の「順序」に関する仮説が新しいデータによって反証されたことまで示されました。最新のスナップショットだけでなく、履歴を残す意味はまさにそこにあります。

正直に言うと: エンジンは汎用ですが、witness に同梱されているものはすべて人物向けです。組み込みの default lens、サンプル lens、要約プロンプトはいずれも「その人物について気づいたこと」を扱います。人物以外のコーパスでは、独自の lens(3つのファイル)を作成し、必要であれば要約プロンプトを1つのファイルで上書きしてください。市場向けや調査向けの lens プリセットはまだありません。処理の仕組みはドメインに依存しませんが、同梱されている設定はそうではありません。

これはあなたのことですか?

次のようなことを実現したいと思ったことがあるなら、witness がその答えです。

  • AI コーディングセッションで学んだことを覚えておく — Claude Code や OpenCode で、コンテキストウィンドウがリセットされても失われないようにします。
  • 自分の考え方、ワークスタイル、習慣を記憶し、エージェントから照会できるセカンドブレイン/AI メモリーを持つこと。
  • 開発者として時間とともにどう成長しているかを追跡する — 何度も陥り、そこから抜け出す落とし穴を記録し、記録したすべての変化の出所を確認できます。
  • 自分の考え方や変化を日記/振り返りとして残し、数カ月後に読み返せるようにすること。
  • 大切なコーパスを要約する — 市場ニュース、ナレッジベース、調査メモ、会議ログなどを、要約の寄せ集めではなく、その状態がどう変化したかを日付順に記録した履歴にします。witness ingest で NDJSON を取り込みます。
  • 毎回コンテキストを説明し直す代わりに、MCP 経由でエージェントから上記のあらゆる情報を照会すること。

目次: 仕組み · レンズ · 例 · アーカイブを読む · コマンド · インストール · 設定 · データはあなたのものです

仕組み

4 つのレイヤー — 正本となる 1 つと、そこから再生成可能な 3 つの派生レイヤーです。

レイヤー種類内容
raw (L0)正本すべてのターンをそのまま記録します — 安定した Claude Code フックのフィールド(UserPromptSubmit.prompt、Stop.last_assistant_message)、または OpenCode のローカル SQLite セッション DB(message/part のテキスト)から取得します。追記専用で、LLM による変更はありません。
observations (L1)派生セッションごとの軽量なワーカーが、レンズのタグを付けて、あなたについての原子的で証拠に基づく観察事項を抽出します。追記専用です。
facets (L2)派生、二時点管理定期的なレビュアーが観察事項を統合し、進化するファセットを作成します。それぞれが変更履歴(valid_from/valid_to)を保持するため、アーカイブは「今の自分はどんな人か」だけでなく、「どう変化したか」にも答えられます。古い値が削除されることはありません。
profile (L4)派生ナラティブファセットから抽出した、人が読みやすい短い Markdown の要約です。レンズごとに 1 つと、レンズ横断のunifiedな人物像が生成されます。読み取り時に生成されます。witness profile(または MCP のget_profile)を実行すると、ファセットに変更があった場合にのみ再構築されるため、読まれていないプロフィールにはコストがかかりません。キャッシュ済みの読み取りは瞬時に完了し、再構築には約 13 秒かかります。

アーカイブは収集専用/プル専用です。witness はあらゆる場所で情報を取得して要約しますが、セッションに何かを注入することはありません。何もプッシュされません — あなた(またはエージェント)が必要に応じてプロフィールを読み取ります。raw/observations/facets は単一の組み込み SQLite データベース(witness.db)に保存され、プロフィールはprofile/以下のプレーンな Markdown です。

レンズ

すべての観察事項/ファセットにはレンズのタグが付きます。

  • default — グローバルなレンズです。すべてのセッションで実行され、複数の領域にまたがります。これこそが、単一領域のトラッカーでは実現できない部分です。「不足点を正確に診断する」という傾向が、数学でもコーディングでもキャリアでも現れることを捉えます。
  • 登録済みレンズ(例:math) — 一度登録し、グローバルに有効化する領域固有のレンズです。witness lens register math ./math/で定義(ディレクトリ)を中央レジストリに追加し、witness lens enable mathでdefaultと併せてすべてのセッションで実行されるようにします。レンズはリポジトリに紐付けられず、共有されます。そのため、同じmathレンズで数学に関するすべての作業を対象にできます。
レンズの作成

レンズは、次の3つのファイルからなるディレクトリです。

math/
  lens.json     settings: name, dimensions, optional per-lens models
  extract.md    per-session — mines observations (the whole file is the prompt)
  review.md     periodic — synthesizes observations into facets (the whole file is the prompt)
// math/lens.json
{ "name": "math", "dimensions": ["speed", "independence", "proof_rigor", "abstraction", "confusion_tolerance"] }

You are observing one session through a MATH-LEARNING lens. Notice things about the
person as a mathematician — how they reason, get stuck, and climb out…
Return ONLY a JSON array. Each element:
[{ "dimension": "proof_rigor", "observation": "…", "evidence": "…", "poignancy": 6 }]

覚えておくべきルールは1つです。各プロンプトファイルはそのままシステムプロンプトとして使われ、組み込みのdefaultプロンプトを拡張するのではなく置き換えるため、出力JSONスキーマも含めて、各ファイルを単独で完結させる必要があります(ツールはユーザーメッセージとしてトランスクリプト/観察結果を追加しますが、スキーマは挿入しません)。

出発点として、そのままコピーして使える完全なレンズが2つ用意されています。ディレクトリをコピーし、対象分野に合わせて評価軸と文章を書き換えてください。

  • prompts/lens/example/ — 人物レンズ(数学学習)。取り組み中の人を追跡します。
  • prompts/lens/corpus-example/ — 人物以外のレンズ(市場レジーム)。自分ではない対象を追跡します。調査メモ、ナレッジベース、インシデントレポート、またはドキュメントストリームにはここから始めてください。対象が人物ではなくなったときに何を変更する必要があるかは、READMEで説明しています。
cp -R "$CLAUDE_PLUGIN_ROOT/prompts/lens/example" ./math   # edit the files, then:
witness lens register math ./math      # copies the definition into your store (a snapshot)
witness lens enable  math               # start running it on every session

registerはコピーを保存します。登録後に元のファイルを編集しても、再登録するまでは反映されません。実際に実行するには、別途enableで有効にする必要があります。

レンズごとのモデル(任意)。 デフォルトでは、すべてのレンズがデフォルトのモデル(witness config set triage_model / distill_model)を使用します。負荷の高いレンズに限り、各セッションで費用をかけることなく、そのレンズ専用に、より高性能なモデルを指定できます。その場合は、lens.jsonにextract_model / review_modelを追加します。

{ "name": "math", "dimensions": ["proof_rigor"], "extract_model": "claude-sonnet-5" }

フィールドを省略するか、空欄にすると、デフォルトが使われます。registerはスナップショットを保存するため、登録済みのコピーである<witness-data-dir>/lenses/<name>/lens.jsonを編集するか、ソースを編集して再登録してください。witness lens show <name>で、レンズに解決された設定を確認できます。

ソースディレクトリはどこに置いてもかまいません。推奨される標準的な場所として、witnessは登録済みのコピーをconfig.tomlの隣にある<witness-data-dir>/lenses/<name>/に保存します(通常は~/.local/share/witness/lenses/<name>/、または$WITNESS_HOME/lenses/<name>/)。登録済みのコピーは直接編集できますが、この場所は慣例であり、lens registerに渡すディレクトリを制限するものではありません。

例:ある瞬間を最初から最後まで

セッションに次のやり取りが含まれているとします(架空の例です)。

あなた: prodではマイグレーションが何度も失敗するのに、ローカルでは通る。手動で実行して先に進もう

あなた: ……待てよ、prodで実際に何が違うんだろう?何かに手を出す前に、2つのスキーマの差分を取ってみよう

各レイヤーでは、これを次のように扱います。

raw(L0) — 解釈を加えず、そのまま記録します。

user  the migration keeps failing on prod but passes locally — I'll just run it by hand and move on
user  wait, what's actually different about prod? let me diff the two schemas before I touch anything

observations(L1) — ワーカーが、証拠に根ざした原子的な気づきを1つ抽出します。

[thinking] Caught the urge to hand-patch around a failure and redirected to isolating the
           prod/local difference before acting.
  evidence: "run it by hand and move on" → "what's different about prod? diff before I touch anything"
  poignancy: 6    lens: default

facets(L2) — このような瞬間がいくつか積み重なると、レビュアーが変化する属性を統合し、履歴を保持します(これが重要です。現在の状態だけでなく、変化を示します)。

default · thinking · diagnoses_before_acting                        confidence 0.82
  2026-05 → now       Catches the reflex to work around a failure and isolates the
                      mechanism first; gates action on understanding the cause.
  2026-02 → 2026-05   Tended to apply the first workaround that unblocked the task.   (superseded)

profile(L4) — 実際に読むナラティブです(witness profile)。

default

あなたは、まず診断から始める働き方へと移行してきました。数か月前は、タスクを先に進められるものなら何でも頼ろうとしていました。今ではその衝動に気づき、何かに手を出す前に、仕組みを切り分けるようになっています……

ここでセッションに何かが追加されるわけではありません。読みたいときに読み(witness profile)、またはエージェントが必要に応じて関連するファセットを取得します。

独自の要約プロンプトを書く

付属の unified プロンプトは、個人の成長を描くポートレートを作成します。アーカイブの内容が別のものであれば ――市場の記録、研究メモ、プロジェクトログなど――独自のプロンプトを配置すれば、そちらが優先されます。

<data-root>/summarize/unified.md    your prompt (overrides the built-in one)
<data-root>/summarize/lens.md       same, for the per-lens summaries

witness doctor でデータルートが表示されます。このファイルがインターフェースのすべてです。実行するコマンドも、登録手順もありません。組み込みプロンプトに戻すには、ファイルを削除してください。

同じ側面から、まったく異なる文書を作成することもできます。たとえば、人物像のポートレートではなく、簡潔なリスクメモにできます。上書き設定がない場合は組み込みプロンプトが引き続き使われるため、witness のアップグレードで改良版のデフォルトが提供されれば、それも反映されます。上書き設定をすると、アップグレードによってファイルが変更されることはありません。

アーカイブを読む

人間はナラティブを読み、エージェントは構造化データを読みます。MCP 経由では、次のように操作できます。

  • get_profile(lens) — ナラティブ形式のプロフィールです。lens を省略すると、統合ポートレートが返されます。
  • get_facets(lens) — 現在の構造化された側面です。
  • search_observations(query, lens) — 観察記録をローカルでベクトル検索します。
  • record_observation(...) — セッション中のエージェントが、判断に関する観察記録を直接書き込みます(そのまま渡されます)。後から確認する人が見落とすような文脈を記録できます。
  • delete_observation(obs_id) — 誤った観察記録を削除します。

コマンド

witness --help のグループ分けに従った、ユーザー向けの入口です。

グループコマンド
アーカイブを読むstatus · profile · facets · observations · ingest
レンズlens
設定config
セットアップdoctor · install · wire · unwire
メンテナンスcleanup · export

キャプチャ、ワーカー、MCP サーバーは、Claude Code/OpenCode が呼び出す内部エントリーポイントであり、手動で入力するものではありません。witness import と witness worker … は非表示です。これらは復旧とデバッグのために存在し、その処理はすべて自動でも行われます。

  • witness profile [lens] — ナラティブプロフィールを表示します(デフォルト:統合プロフィール)。
  • witness facets [lens] — 現在の構造化ファセットを表示します(MCP の get_facets に相当する CLI コマンド)。
  • witness observations search <query> [--lens <lens>] [-k N] — 観察記録を意味検索します。
  • witness observations record --session <id> --dimension <name> --observation <text> — 有効な観察記録を登録し、ワーカーを起動します。
  • witness observations delete <obs_id> — 誤った観察記録を削除します。
  • witness worker review [--full] — L2 レビューを強制実行し、既存の観察記録から L4 プロフィールを再生成します。(ほかの worker コマンドと同様に非表示です。通常、レビューは独自のスケジュール(review_every / review_poignancy)で実行されるため、手動で実行するのは例外的な場合です。--full を指定すると、新たに生じた長期的な変化を検出する処理も実行します。)
  • witness lens register|enable|disable|list — レンズを管理します。
  • witness lens backfill <name> [--fresh] — 履歴全体を対象に指定したレンズで再抽出し、ファセットを更新します。--fresh を指定すると、まずそのレンズの観察記録とファセットを削除します(プロンプトを変更した場合に使用します)。
  • witness lens load-default — 組み込みの「default」人物成長レンズを再シード/復元します(初回使用時に一度だけ自動的にシードされ、完全に削除することもできます。再度読み込む場合はこのコマンドを使用します)。
  • witness import --agent opencode — OpenCode のローカルセッション DB を L0 に差分反映し、待たずにバックグラウンドの蒸留を開始します。
  • witness import --agent claude — すでに取得済みの Claude Code フックデータの蒸留を開始します。
  • witness status — 取得済みのデータ、ワーカーの稼働状況、蒸留データの鮮度を表示します(スクリプトでは --json を指定します)。
  • witness worker run / witness worker stop — バックグラウンドの蒸留ワーカーを操作するための手段です(--help には表示されません。通常はエディターのフックから実行されます)。run はフォアグラウンドで処理を完了し、--detach を指定するとバックグラウンドで実行します。--since / --until を指定すると、最新の生データのタイムスタンプに基づいて処理対象のセッションを選択できます。たとえば witness worker run --since 7d は、過去 7 日間に更新されたセッションを蒸留します。範囲には RFC3339 タイムスタンプまたは UTC の日付(YYYY-MM-DD)も指定でき、選択した範囲外のセッションが削除されることはありません。
  • witness cleanup — 古い生のトランスクリプトを対話形式で整理します(観察記録とプロフィールは保持されます)。
  • witness export <path> — 一貫性のある単一ファイルのデータベーススナップショットを書き出します(安全にバックアップ/クラウド同期できます)。--all を追加すると、<path> は完全なアーカイブ(スナップショットに加えて config.toml、lenses/、profile/ を含む)を格納するディレクトリになります。バックアップには --all を使用してください。詳しくはデータはあなたのものですを参照してください。
  • witness install [--path <dir>] — 指定したパス(またはデフォルトのデータルート)に新しい Witness アーカイブを作成します。ディレクトリ構造とデータベーススキーマを作成します。通常はマシンごとに一度だけ実行します。ソースチェックアウトを利用する場合は install.sh がこれを処理します。
  • witness wire <claude|opencode> — エディター連携を設定します(Claude Code ではフックと MCP、OpenCode ではプラグインと MCP)。ソースチェックアウト用のコマンドで、install.sh が実行します。
  • witness unwire <claude|opencode> — エディター連携の設定を削除します。アーカイブには影響しません。
  • witness ingest [--file <path>] — 構造化レコード(メモ、ログ、市場データ)を NDJSON として受け取り、蒸留してアーカイブに保存します。標準入力またはファイルから読み込みます。レコードの仕様については、prompts/SCHEMA.mdを参照してください。
  • witness doctor — ヘルスチェックを実行します(埋め込みモデルが動作すること、および EN/ZH の検索が機能することを確認します)。

単一バイナリ、ランタイム不要

全体が自己完結型の Go バイナリ 1 つで構成されています。Python、外部サービス、ベクトル DB、クラウドキーは不要です。多言語(英語および中国語)の埋め込みは GoMLX を使用した純粋な Go でローカル実行されます(CGO_ENABLED=0。検証済みで、ONNX Runtime と完全に一致します)。蒸留ではデフォルトで既存の Claude Code 認証を claude -p 経由で使用します。代わりにプライベートな opencode serve ランナーを使うには、runner = opencode を設定します。

インストール

./install.sh claude    # Claude Code: build, fetch model (~448MB once), wire hooks + MCP
./install.sh opencode  # OpenCode: build, fetch model, wire local plugin + MCP

これだけです。冪等性があり、git pull の後に再実行しても安全です。ターゲットの指定は必須です。このスクリプトはバイナリをビルドし、アーカイブを準備して、一致する蒸留ランタイムを config.toml に設定します(runner = claude または runner = opencode)。また、witness コマンドを PATH に追加するかどうかも確認します(witness profile、doctor、lens、import、status、cleanup、ingest 用)。同等の make ターゲットもあります(make install、make install-opencode、make build、make doctor、make uninstall、make uninstall-opencode、make clean)。エディター連携を削除するには、make uninstall または make uninstall-opencode を実行します(連携設定を削除しますが、データには触れません)。

Windows

Windows ではシェルインストーラーではなく、自己完結型の zip を使用します(フックの shim を実行できるシェルが保証されないためです)。リリースページから witness-windows-amd64.zip(Intel/AMD)または witness-windows-arm64.zip をダウンロードしてください。展開すると witness\ フォルダーが作成され、その中に witness.exe と埋め込みモデルが入っています。次に、PowerShell でそのフォルダー内から以下を実行します。

.\witness.exe wire claude      # Claude Code
.\witness.exe wire opencode    # OpenCode

どちらのコマンドも、バンドルを %LOCALAPPDATA%\witness にコピーしてユーザーの PATH に追加し、アーカイブを準備します。zip にはプロンプトテンプレートと約 448MB のモデルが exe と一緒に含まれており、バイナリは自身を基準に両方の場所を解決します。両方を実行しても問題ありません。コピーは冪等で、それぞれ異なるエディターを連携させます。

それぞれの連携内容と違いは次のとおりです。Claude Code はフックを自身で起動するため、wire claude は settings.json に exec 形式のフック({command: witness.exe, args: [...]})を書き込みます。一方、OpenCode では プラグイン が witness を起動するため、wire opencode はインストール済みの witness.exe のパスをプラグインと MCP エントリーに埋め込みます。どちらもシェルや Git Bash は必要ありません。

エディター連携を削除するには、witness.exe unwire claude / unwire opencode を実行します(フック/プラグインと MCP エントリーを削除します)。コピーしたファイルと PATH エントリーはそのまま残ります。もう一方の連携で引き続き使用されている可能性があるためです。

OpenCode のサポート

OpenCode のサポートは 2 つの要素で構成されています。

  • プラグインは、起動時とセッションがアイドル状態になったときに OpenCode の SQLite DB を調整し、その後、ノート PC 向けの自動起動ゲートに、許可されていれば蒸留するよう指示します。ソースからインストールする場合は、ローカルプラグインを ~/.config/opencode/plugins/witness.js に作成します。公開版のインストールでは npm プラグイン @witness-ai/opencode を使用できます。(Windows でもパスは同じです。OpenCode は Windows 固有の分岐なしに、設定先として XDG_CONFIG_HOME、なければ ~/.config を使用するため、プラグインは %USERPROFILE%\.config\opencode\plugins\ に配置されます。)
  • witness という名前の OpenCode MCP エントリーは、Claude Code と同じ MCP サーバーを起動し、get_profile、get_facets、search_observations、record_observation、delete_observation を公開します。

npm パッケージには、OpenCode プラグイン、witness CLI shim、ビルド済みの witness バイナリ、プロンプトが含まれています。設定のみで利用する方法がデフォルトです。プラグインを ~/.config/opencode/opencode.json に追加すると、OpenCode は起動時に Bun を使って自動的にインストールします。mcp.witness が存在しない場合は、プラグインが自動登録します。

npm パッケージは OpenCode 連携と一般的な CLI の使用(witness profile、ingest など)に対応しています。エディター連携の設定(witness wire / unwire)はソースチェックアウトで使用するコマンドです。npm ユーザーは opencode.json でプラグインを直接設定すると、プラグインが MCP を自動登録します。アーカイブの準備とレコードの取り込み(witness install、witness ingest)は npm パッケージでも通常どおり動作します。

npm 配布版が対応しているプラットフォームは、次のとおりです。

オペレーティングシステムアーキテクチャnpm プラットフォームパッケージ
macOSApple Silicon(darwin/arm64)@witness-ai/opencode-darwin-arm64
Linuxx86-64(linux/x64)@witness-ai/opencode-linux-x64

macOS Intel、Linux ARM、Windows は npm 配布版ではサポートされていません。各バイナリはオプションのプラットフォームパッケージとして公開されるため、npm は現在のマシン用のバイナリのみをインストールします。

{
  "$schema": "https://opencode.ai/config.json",
  "plugin": ["@witness-ai/opencode"]
}

現在のプレリリースを latest を置き換えずにテストするには、プラグインエントリを固定します:

{
  "$schema": "https://opencode.ai/config.json",
  "plugin": ["@witness-ai/opencode@beta"]
}

任意:シェルの PATH で witness コマンドも使いたい場合は、グローバルにインストールします:

npm install -g @witness-ai/opencode

任意:グローバルにインストールせず、一時的に実行します:

npm exec --yes --package=@witness-ai/opencode -- witness doctor

メインの npm パッケージにはプラグイン、CLI ラッパー、プロンプトが含まれ、対応するオプションのプラットフォームパッケージにはバイナリが 1 つ含まれます。埋め込みモデルの初回ダウンロードは約 470MB です。パッケージをインストールしても、このダウンロードは開始されません。OpenCode の次回起動時にプラグインがダウンロードを開始します。初回ダウンロードが完了するまで、OpenCode を起動したままにしてください。プラグインがダウンローダーを管理し、シャットダウン時に停止して、後で上限付きバックオフで再試行します。 独自の mcp.witness 設定がすでにある場合、プラグインは変更しません。npm ラッパーは witness wire/witness unwire をサポートしていません。これらのコマンドは、ソースチェックアウトからエディターを接続するためのものです。 カスタムモデルミラーでは、WITNESS_MODEL_BASE_URL とともに WITNESS_MODEL_SHA256 および WITNESS_TOKENIZER_SHA256 を指定する必要があります。

初回ダウンロード後、モデル、OpenCode ランナー、アーカイブ、キューを確認します:

npm exec --yes --package=@witness-ai/opencode@beta -- witness doctor
npm exec --yes --package=@witness-ai/opencode@beta -- witness status

アップグレードに関する注意: 以前の witness リリースでは、蒸留が中断された際に、エージェント名またはタイトルが witness-distill の OpenCode セッションが残ることがありました。現在のリリースでは、OpenCode のユーザーデータベースにこれらのセッションを 作成したり、除外したりすることはありません。アップグレード後に初めてインポートする前に、OpenCode がサポートするセッション管理ツールを使って 残っている witness-distill セッションを削除し、通常のアーカイブデータとして取り込まれないようにしてください。

npm パッケージは npm/opencode にあります。公開する前に、ビルド済みバイナリとプロンプトをステージングします:

make npm-opencode-package
npm publish ./npm/platform/darwin-arm64 --access public --tag beta
npm publish ./npm/platform/linux-x64 --access public --tag beta
(cd npm/opencode && npm publish --access public --ignore-scripts --tag beta)

リリースワークフローを使用する前に、メインパッケージと 2 つのプラットフォームパッケージそれぞれについて、npm Trusted Publishing を設定してください。npm パッケージのページには npm/opencode/README.md が表示されます。ワークフローは公開後に、npm がこれをパッケージの README として認識していること、および公開された tarball に含まれていることを検証します。

プラットフォームパッケージの初回リリース時のみ、GitHub Release を作成する前に両方のプラットフォームパッケージを手動で公開し、その後 npm で Trusted Publisher を設定してください。npm では、パッケージレベルの Trusted Publisher を設定する前に、パッケージが存在している必要があります。リリースワークフローは冪等です。すでに公開済みのパッケージバージョンはスキップし、不足しているプラットフォームバージョンを先に公開してから、メインパッケージを公開します。

手動で検証する方法:

witness lens register math prompts/lens/example   # optional: register an extra lens
witness lens enable math
witness import --agent opencode    # reconciles ~/.local/share/opencode/opencode.db and returns
witness status                    # watch non-blocking distillation progress
witness worker review              # forces L2 facets + L4 markdown profiles (hidden cmd)
witness profile opencode           # per-lens L4 report
witness profile                    # unified L4 report

Configuration

~/.local/share/witness/config.toml(すべて省略可能。妥当なデフォルト値が設定されています):

runner           = "claude"   # "claude" (default) or "opencode"
triage_model     = ""         # MINING (L0 -> L1), once per session; "" = the runner's default
distill_model    = ""         # REVIEW (L1 -> L2/L4), batched; "" falls back to triage_model
review_every     = 5          # run the reviewer every N distilled sessions...
review_poignancy = 30         # ...or sooner once accumulated salience crosses this (0 = off)
auto_distill     = true       # hooks/plugins may start model work automatically
mine_concurrency = 4          # parallel per-session miners (<= 0 restores the default)

モデル ID は使用するランナーにそのまま渡されるため、そのランタイムでの表記を使用してください。 runner = "claude" の場合は claude-haiku-4-5 または claude-sonnet-5、runner = "opencode" の場合は openai/gpt-5.5 のような ID を指定します。どちらも空のままにするのが安全なデフォルトであり、witness install が書き込む設定です。 ただし、claude ランナーで triage_model を空にすると、現在の対話セッションで使われているモデルが引き継がれます。このモデルはセッションごとのマイニングには重すぎる場合があるため、通常は軽量なモデルを指定する価値があります。

バッテリーに制約のあるマシンでキャプチャのみのモードにするには、auto_distill = false を設定し、電源に接続したときに witness worker run --detach を手動で実行してください。自動ワーカーは短時間だけ動作します。キューにあるセッションを処理している間だけ 埋め込みモデルを読み込み、その後終了します。

runner = opencode の場合、triage_model と distill_model には openai/gpt-5.5 のような OpenCode モデル名を指定してください。空の値を指定すると OpenCode のデフォルトが使われます。空でない OpenCode モデル名は、蒸留の前に opencode models <provider> を使って検証され、witness doctor でも同じチェック結果が opencode models: OK または明示的な無効モデルエラーとして報告されます。

有効なレンズは自動的に管理され(witness lens enable/disable <name>)、各セッションで実行される登録済みレンズをそれぞれ指定したシンプルな行として表示されます。

lens = math

自動的に保持期間を設定する機能はありません。witness cleanup を使って意図的に削除するまで、生のトランスクリプトは保持されます(観察結果やプロファイルには触れません)。

データはあなたのものです

すべてのデータは ~/.local/share/witness/ の下に保存されます(WITNESS_HOME で変更できます。名前変更より前にインストールした場合は、引き続き ~/.local/share/claude-witness/ が使われ、自動的に移行されます)。権限は 0700(DB ファイルとプロファイルファイルは 0600)で、データがマシンの外に送信されることはありません。このリポジトリにはフレームワーク、スキーマ、プロンプトが含まれていますが、誰かのアーカイブは含まれていません。

トラブルシューティング。 蒸留はデタッチされたワーカーで実行されるため、失敗はターミナルではなく $WITNESS_HOME/witness.log(JSON 行形式)に記録されます。ワーカーの起動手順、各マインの入力サイズと所要時間、各モデル呼び出しの結果が記録されるため、モデルの応答が遅いのか、処理が停止しているのかを判断できます。詳細を確認するには、WITNESS_LOG_LEVEL=debug を設定してください(warn / error も指定できます。認識されない値はデフォルトの info に戻るため、設定を間違えても witness のキャプチャが止まることはありません)。

バックアップ/同期。 witness export --all <dir> を使うと、同期ツールに指定できる完全なアーカイブが作成されます。稼働中のデータディレクトリを直接同期しないでください。データベースは WAL モードで動作しており(.db + -wal + -shm)、同期ツールがこれらのファイルと競合すると、データが破損する可能性があります。たとえば、cron/launchd ジョブを自分で設定します。

witness export --all ~/Dropbox/witness-backup --force   # complete archive, safe to sync

データディレクトリにある4つの項目のうち、データベースは1つだけなので、--all が重要です。

--all に含まれる通常の export に含まれるバックアップなしで復元可能か
witness.db — 生のターン、観察結果、ファセットはいはいいいえ
config.toml — 有効なレンズ、ランナー、モデルはいいいえ手動で再設定する必要があります。それまでは蒸留が通知なく停止します
lenses/ — レンズ定義はいいいえいいえ — プロンプトのテキストはデータベースにありません。バンドル済みのレンズは再生成されますが、自分で作成したレンズは失われます
profile/ — ナラティブはいいいえレビューを実行すれば再生成されます。ただし、手動編集した unified.md は除きます

意図的に含めていないもの:witness.log(診断情報)、runtime/(OpenCode の破棄可能なプライベートランタイム)、ロックファイル。どちらの形式でもワーカーの書き込み中に安全に実行できるため、ワーカーを停止する必要はありません。

復元に専用コマンドは必要ありません。 --all のディレクトリはデータディレクトリと同じ構成になっているため、その場所を指定して witness を実行するか(WITNESS_HOME=~/Dropbox/witness-backup)、witness を停止してから内容をデータディレクトリにコピーしてください。データベースのみの通常のスナップショットも witness.db と同じ方法で復元でき、witness worker review を実行すると、そこからナラティブが再生成されます。

ライセンス

MIT — LICENSE を参照してください。

コメント

MCP は初めてですか?

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

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