Veto について
Vetoは、AIコーディング環境に専門エージェント、コード・セキュリティレビュー、メモリー、ワークフローツールを追加するローカルMCPサーバー兼コマンドラインツールです。複数のAI CLIに対応し、決定論的なエージェントはホスト側またはMCP Sampling経由でLLM推論を利用できます。
主な機能
- 0193個のMCPツールと49種の専門エージェント
- 02コード、セキュリティ、依存関係のレビュー
- 03プラットフォーム間で使える永続メモリー
- 04エージェントの並列実行とCouncilの議論
- 05自己学習型タスクルーター
- 06コンパクトなツール検索モード
活用シーン
- 01コードレビューとセキュリティスキャン
- 02インストール前のパッケージ検証
- 03開発タスクに合わせた専門エージェントの連携
- 04セッションをまたいだ決定とコンテキストの保持
MCP 対応
VetoはMCPサーバーを通じて、エージェント、レビュー、メモリー、ルーティング、開発ツールを提供します。対応するAIクライアントに登録でき、利用可能な場合はホスト側の推論またはMCP Samplingを使います。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
veto
93 個のエージェント型ツール。49 人のスペシャリスト。主要な AI CLI に対応。自己学習機能搭載。サブスクリプションの追加料金はゼロです。
お使いのマシン上でローカルに動作する MCP サーバーです。既存のサブスクリプションを使って、Claude Code、Codex CLI、Gemini CLI、Antigravity CLI、Cursor、Windsurf、Zed、JetBrains に接続できます。すべての AI にスペシャリストエージェントの評議会、ローカル LLM のサポート、SDD エージェント、Playwright 自動化、プラットフォームをまたいで保持される永続メモリ、記録されたタスクの結果 20 件ごとに階層のしきい値を自動で再調整する自己学習型ルーター(レビューで結果を記録します。auto_apply_learning で設定可能)、CI/CD ゲート、ワークスペース検出、IDE との双方向通信を提供します。
課金に関する注意:「追加料金ゼロ」はサブスクリプションプラン(Claude Max、Gemini Advanced など)に適用されます。API/トークン単位の課金をご利用の場合、Veto エージェントによる LLM 推論(エージェントループまたは MCP Sampling 経由)は、ほかのターンと同様にトークン使用量に加算されます。
veto initは API キーの環境変数を検出し、自動で警告します。
はじめに
# 1. Install the CLI — puts the bare `veto` command on your PATH
npm i -g @jigyasudham/veto
# 2. Register Veto with every AI client you use (Claude Code, Gemini, Codex, Cursor, …)
veto init
何もインストールしたくない場合は、すべてのコマンドを npx 経由でも実行できます。
npx -y @jigyasudham/veto@latest init
この 2 つは、設計上それぞれ独立しています。veto init は、npx -y --package @jigyasudham/veto@latest veto-server でサーバーを起動する MCP 設定を書き込みます。npx はクライアントが再起動するたびにレジストリで @latest を再解決するため、MCP サーバーは自動更新され、グローバルインストール版によって古いバージョンに固定されることはありません。グローバルインストールで提供されるのは CLI のみです(veto doctor、veto sessions、ステータスラインなど)。veto doctor が古いと通知した場合は、npm i -g @jigyasudham/veto@latest で最新の状態にしてください。
エージェントの仕組み
API キー不要、追加料金ゼロです。 すべてのワーカーエージェントは、中核部分が決定論的なエキスパートモジュールで、その上に 2 つの任意の LLM 推論レイヤーを備えています。推論はすべて、すでに料金を支払っている AI に委任されます。
デフォルト — 決定論的なエキスパートモジュール
初期状態では、42 個のワーカーエージェントはそれぞれ、手書きのエキスパートモジュール(src/agents/ の plan()/analyze())として動作し、LLM ではありません。常に動作し、オフラインでも利用でき、トークンを消費しません。深さは設計によって異なります。分析エージェント(セキュリティスキャナー、シークレット、依存関係の監査、クローン検出、プライバシー、認証、パフォーマンス、互換性など)は、正規表現/AST 検出、OWASP/CWE ルール、ハッシュベースのクローン照合など、実際のアルゴリズムを適用します。一方、計画エージェント(コーダー、デバッガー、テスターなど)は、タスクのカテゴリに応じて厳選された手順、チェックリスト、落とし穴をまとめた構造化エキスパートプレイブックです。自ら推論するのではなく、すでに料金を支払っている AI が推論できるように設計されています。
パス A — エージェントループ(主な対応クライアント:Claude Code、Cursor、Windsurf)
Veto は、スペシャリストの役割、評価基準、出力仕様を llm_upgrade プロンプトとして返します。ホスト AI がスペシャリストとして推論し、構造化 JSON を渡して処理を完了します。これが主要な経路です。既存のサブスクリプション以外に費用はかからず、すべてのクライアントで動作します。
パス B — MCP Sampling(server.createMessage をサポートするクライアント)
Sampling が利用できる場合、同じアップグレードを追加の往復なしでサーバー側で実行します。注:2026 年 7 月の MCP 仕様改訂では、Sampling はプロトコル全体で非推奨となり(12 か月後に終了)、エージェントループ(パス A)が Veto の長期的なデフォルトとなります。Sampling は、利用可能な場合に透過的な最適化として引き続き機能します。
7 エージェントの評議会は LLM を第一に設計されています。その価値は複数エージェントによる議論にありますが、LLM の経路が利用できない場合は、決定論的な判定にフォールバックします。複数のエージェントを実行する場合は、並列で動作します。
専門家の役割
49 人の専門家:6 つのドメインにわたる 42 個の決定論的なワーカーエージェントと、7 人の評議会。 評議会は構築に取りかかる前にトレードオフを議論し、ワーカーエージェントが実務的な分析と計画を担当します。それぞれが、LLM 推論にアップグレードできる決定論的な専門モジュールです。詳しくはエージェントの仕組みをご覧ください。veto agents でいつでも一覧を表示できます。
評議会(7)
Lead Dev · PM · Architect · UX · Devil's Advocate · Legal · Security
開発(12)
Coder · Code Reviewer · Tester · Debugger · Refactor · Database · API · Frontend · Backend · DevOps · Performance · Migration
セキュリティ(6)
Security Scanner · Auth Agent · Data Privacy · Secrets Agent · Dependency Audit · Penetration Tester
メモリ(5)
Context Manager · Decision Logger · Project Mapper · Pattern Learner · Knowledge Base
調査(7)
Researcher · Tech Advisor · Cost Analyzer · Competitor Analyzer · Risk Assessor · Estimator · Ethics & Bias
品質(5)
Code Quality · Documentation · Accessibility · Compatibility · Error Handling
ワークフロー(7)
Task Planner · Task Coordinator · File Manager · Git Agent · Search Agent · Reporter · Automation
MCP ツール(93)
| カテゴリ | ツール |
|---|---|
| セッション | veto_status · veto_session_save · veto_session_restore · veto_sessions_list · veto_autosave_status · veto_session_replay |
| ルーター | veto_route_task · veto_rate_status |
| 評議会 | veto_council_debate · veto_benchmark · veto_adr |
| エージェント | veto_agent_plan · veto_execute_parallel · veto_explain · veto_compose_agents · veto_delegate |
| レビュー | veto_code_review · veto_security_scan · veto_secrets_scan · veto_diff_review · veto_full_review · veto_pr_review |
| パイプライン | veto_ci_gate · veto_pre_commit · veto_new_feature · veto_workflow · veto_task_parse |
| 高度な機能 | veto_local_llm · veto_semantic_search · veto_sdd_agent · veto_playwright · veto_notify_ide |
| 品質 | veto_clone_detector · veto_lint_rules · veto_api_contract · veto_a11y_advisor · veto_type_coverage · veto_test_gaps |
| アドバイザー | veto_dep_advisor · veto_dep_verify · veto_query_advisor · veto_bundle_advisor · veto_dead_code · veto_hitl_checkpoint · veto_drift_check |
| 監視 | veto_watch · veto_watch_poll · veto_watch_stop |
| メモリ | veto_memory_store · veto_memory_search · veto_memory_delete · veto_decisions · veto_project_map_update · veto_project_map_get · veto_pattern_store · veto_patterns_list · veto_memory_export · veto_memory_import |
| 学習 | veto_record_outcome · veto_learning_stats · veto_learning_apply |
| 引き継ぎ | veto_handoff · veto_continue · veto_platform_setup |
| 可観測性 | veto_usage_status · veto_audit_log · veto_health · veto_metrics · veto_snapshot |
| 検出 | veto_discover · veto_summarize · veto_git_blame · veto_changelog · veto_onboard · veto_debt_register |
| 開発ツール | veto_docs_fetch · veto_context_status · veto_openapi_gen · veto_flag_auditor · veto_env_setup · veto_commit_message · veto_pr_description · veto_pr_post · veto_prompt_optimizer · veto_sre_advisor · veto_diagram · veto_rca · veto_doc_gen · veto_postmortem · veto_release_notes · veto_translate · veto_merge_conflict |
| プラグイン | veto_plugins |
コンパクトモード — コンテキストコストを抑えて93個のツールを利用
93個のツールスキーマは、ユーザーが一言入力する前に、クライアントのコンテキストを約20Kトークン消費します。コンパクトモードでは、5〜6分の1のサイズのインターフェイスを公開します。7個のコアツール(veto_status、veto_session_save、veto_session_restore、veto_route_task、veto_council_debate、veto_memory_search、veto_record_outcome)に、2個のメタツールが加わります。veto_find_tools はキーワードでカタログ全体を検索し、一致するスキーマを必要に応じて返します。veto_call は、名前を指定してカタログ内の任意のツールを呼び出します。どちらのモードでも、すべてのツールを直接呼び出せます。コンパクトモードで変わるのは、最初に公開される内容だけです。
MCP サーバー設定の環境変数に VETO_COMPACT=1 を指定するか、~/.veto/config.json に "compact_tools": true を設定して有効にします。
{
"mcpServers": {
"veto": {
"command": "npx",
"args": ["-y", "--package", "@jigyasudham/veto@latest", "veto-server"],
"env": { "VETO_COMPACT": "1" }
}
}
}
依存関係の幻覚を防止
LLM は、もっともらしくても実在しないパッケージ名を提案することがあります。また、攻撃者がその名前を公開レジストリに登録することもあります(スロップスクワッティング)。これはサプライチェーン攻撃の一種であり、ほとんどの AI ワークフローにはインストール前のチェックがありません。veto_dep_verify は、インストールする前に、提案されたすべてのパッケージを実際のレジストリで確認します。
veto_dep_verify { packages: ["axios", "axois", "left-padd"], ecosystem: "npm" }
→ axios verified (14 years old, 40M downloads/month)
→ axois HIGH_RISK (1 edit from "axios" — possible typosquat)
→ left-padd NOT_FOUND (likely hallucinated — do NOT retry the install later:
nonexistent AI-suggested names are prime slopsquat targets)
パッケージごとに、レジストリへの登録状況、登録からの経過期間、月間ダウンロード数、バージョン履歴、非推奨化の有無、人気パッケージとのタイポ距離を確認します。npm、PyPI、crates.io に対応しています。ネットワーク障害時には unverifiable を返し、安全と黙って判定することはありません。
意思決定の逸脱を防止
AI アシスタントはアーキテクチャ上の決定を忘れ、何セッションも後になって再び議論することがあります。これは、長期にわたる AI プロジェクトで最もよくある不満です。Veto のメモリは決定を保存するだけでなく、適用します。決定を一度、機械でチェック可能な制約として記録します。
veto_decisions {
action: "add",
rule: "We use Postgres — no Mongo",
why: "Decided 2026-05: relational data, team expertise",
forbidden_patterns: ["mongoose", "mongodb"],
severity: "block"
}
以降、veto_diff_review と veto_ci_gate は、追加された行が禁止パターンに一致する差分を自動的に失敗とします。たとえば、AI が3セッション後にひそかに mongoose をインポートに追加すると、レビューはルールと根拠を添えて失敗します。パターンには大文字・小文字を区別しない正規表現を使い(部分文字列へのフォールバックあり)、任意でファイルの glob(src/**/*.ts)に適用範囲を限定できます。また、プロジェクト単位または全体に設定でき、重要度は block または warn です。action: list / check / disable / enable で管理します。
これを覚えておく必要はありません。評議会の判定(LLM を使ったもの)または ADR によって何かが決まると、結果には一度だけ使える constraint_invitation が含まれます。AI がそれをルールにするかどうか一度だけ尋ね、回答を invitation_id とともに add または decline として渡します。同じ判定について二度尋ねることはありません。action: list では、招待した数、承認された数、辞退された数を確認できます。この件数はお使いのマシンに保存されます。
ルールがレビューを止めてしまうことはありません。add は、チェックがハングするおそれのあるパターンを拒否します。たとえば、200文字を超えるパターンや、(a+)+ のように、それ自体を繰り返す繰り返しグループなどです。また、すべてのチェックには制限時間が設けられているため、処理に時間のかかるルールは警告となり、veto_ci_gate をブロックしません。
エラーの連鎖を断つサーキットブレーカー
エージェントは、同じ失敗した呼び出しを再試行したり、同じエラーを繰り返し発生させたり、2つのツールを行き来したりと、ループの中で気づかれないまま失敗し、誰かが気づく前にセッション全体を消費してしまうことがあります。veto_drift_check は処理中に最近のツール呼び出しのトレースを調べ、このパターンを検出して、悪循環が深まる前にブレーカーを作動させます。
veto_drift_check
→ DRIFT DETECTED
• 4 consecutive failed calls (veto_diff_review)
• same error repeated 3× ("no diff provided")
• tool veto_route_task called 6× in a row
→ remediation (debugger agent): stop retrying; the diff is empty —
point at a project_dir with uncommitted changes or pass `diff` explicitly.
連続した失敗、重複するエラーメッセージ、単一ツールの繰り返しという3つの逸脱シグナルを検出します。いずれかが閾値に達すると、ループを続けさせず、debugger エージェントにトレースを分析させて、具体的な復旧手順を提示します。エージェントを長時間実行する場合は、定期的なチェックポイントとして呼び出してください。
どのツールを使えばよいですか?
設計上、複数のツールが機能的に重複しています(粒度やエントリーポイントが異なります)。簡単なガイドを紹介します。
コードをレビューする
| 状況 | 使用するツール | 備考 |
|---|---|---|
| 手元にスニペットまたは単一ファイルがある | veto_code_review | git diff を読み取る veto_diff_review ではありません |
| 未コミットのファイル/変更されたファイル(git diff)がある | veto_diff_review | コード、セキュリティ、シークレットのスキャンを並行して実行します |
| コミットを制限したい(シークレットがある場合は厳格にブロック) | veto_pre_commit | コミット時用に調整されています |
| CI を制限したい(終了コードと pass/warn/fail) | veto_ci_gate | GitHub Actions/GitLab CI 向けです |
| マージ前/リリース前に、より詳細なレビュー(品質を含む)を行いたい | veto_full_review | veto_diff_review より詳細です |
| GitHub の PR を番号/URLで指定する | veto_pr_review | diff を取得し、投稿可能なコメントを返します |
情報を記憶する
| 目的 | 使用するツール |
|---|---|
| 解決策、決定事項、参考情報を保存/呼び出す | veto_memory_store / veto_memory_search |
| 繰り返し使うコード規約を管理する | veto_pattern_store / veto_patterns_list |
| ファイルシステムをスキャンせずにコードベースを把握する | veto_project_map_get(veto_project_map_update で更新) |
複数ステップの作業を実行する
| 目的 | 使用するツール |
|---|---|
| 1つのタスクで複数のエージェントを同時に実行する | veto_execute_parallel |
| 合否ゲート付きの逐次パイプラインを実行する | veto_workflow |
| PRD/自然な英語からタスク DAG を作成する | veto_task_parse(veto_workflow に渡します) |
| 新機能をエンドツーエンドで計画する(協議会 → 計画 → タスク) | veto_new_feature |
セッション
| 目的 | 使用するツール |
|---|---|
| 保存されたコンテキストをすべて含めて作業を再開する | veto_session_restore(または、最新のセッションには veto_continue) |
| セッションのイベント/ツール呼び出しのタイムラインを確認する | veto_session_replay |
| 別の AI ツールに作業を引き継ぐ | veto_handoff → veto_continue |
MCP リソース
| URI | 返される内容 |
|---|---|
veto://sessions | すべてのプラットフォームに保存された全セッション |
veto://project-map?dir=<path> | 保存されたプロジェクト構造マップ |
veto://memory?q=<query> | ナレッジベースの検索結果 |
veto://patterns | 学習済みのコーディングパターン |
MCP プロンプト
| プロンプト | 機能 |
|---|---|
code-review | コード全体をレビューします。コードを貼り付けると、スコア付きの指摘を取得できます |
security-audit | CWE 参照情報付きで OWASP Top 10 をスキャンします |
deploy-checklist | リリース前に協議会がデプロイ計画をレビューします |
explain-file | ファイルの種類に応じて自動的に振り分け、あらゆるファイルを専門的に解説します |
CLI コマンド
これらのコマンドは、AI クライアントなしで、どのターミナルでも単独で実行できます。単独の veto コマンドはグローバルインストール(npm i -g @jigyasudham/veto、Getting Started を参照)によって使用できます。インストールしていない場合は、各コマンドの前に npx -y @jigyasudham/veto@latest を付けてください。
veto init # Register Veto with every AI app found + scan project
veto doctor # Per app: does it list Veto, does Veto start, has the app started it?
veto doctor --quick # Same, without launching the server to test it
veto doctor --fix # Also move aside old Veto guides left in Codex/Gemini files
veto status # Version, DB path, session/memory/outcome counts
veto version # Alias for veto status
veto sessions [words] # Newest 20 saved sessions, and how many exist ([auto] = auto-save)
veto sessions --all | --limit N # All of them, or N; add --json for machine output
veto sessions --clean # Remove auto-saves older than 7 days
veto continue <id> --as <client> # Restore a session from a terminal (8-character id prefix is enough) —
# the same code as veto_continue, for an app that did not load Veto
veto memory [query] # Search knowledge base (blank = all entries)
veto patterns [prefix] # List learned agent/routing patterns
veto tools [filter] # List all 93 MCP tools (--json for machine output)
veto agents [filter] # List all 49 specialists — workers + council (--json)
veto routing [status|log|reset] # Inspect the opt-in routing feedback loop
veto transcripts <sub> # Opt-in transcript capture (off by default) —
# enable|status|sources|list|show|purge|disable
veto lessons <sub> # Opt-in note sharing between your AIs (off by default) —
# on|status|list|why|forget|flows|off|exclude|include|alias|recheck
veto statusline <sub> # Veto line under the Claude Code prompt, or beside
# Codex/Gemini — install|status|print|watch|uninstall
veto api <command> # JSON for editor extensions — version|snapshot|recall search|
# recall expand|diagnostics (see "For editor extensions" below)
veto hook install # Install pre-commit secrets scan hook
veto hook remove # Remove the veto pre-commit hook
veto check # Scan staged changes for secrets (used by hook)
veto help # Commands + MCP tools reference
veto help --troubleshoot # Full troubleshooting guide
veto doctor
veto doctor
Veto Doctor — system health check
─────────────────────────────────────────────────────
✓ Node.js v22.13.0 (this terminal)
✓ ~/.veto exists
✓ Database ~/.veto/veto.db
17 sessions · 12 memories · 3 patterns
AI apps — registration · launch test · last start
─────────────────────────────────────────────────────
✓ Claude Code — connected
source: claude mcp list
launch test: answered in 1.2 s — Veto 3.7.0, 93 tools
last started by claude-code 2.1.0 3 h ago — Veto 3.7.0, Node v22.13.0
✗ Antigravity — Veto is only in ~/.gemini/antigravity-cli/mcp_config.json, a file Antigravity no longer reads
fix: veto init (then fully restart the app)
· Gemini CLI — not installed
Fallback guidance — what an AI is told when Veto did not load
─────────────────────────────────────────────────────
✓ ~/.claude/skills/veto/SKILL.md
⚠ 1 issue found. Each has its fix above.
各 ✓ には、その根拠が示されます。登録は、アプリ自身の mcp list が報告する内容(CLI が PATH にない場合は、アプリが読み込むファイル)です。起動テストでは、設定されたコマンドをそのまま実行して MCP のハンドシェイクを完了します。これにより、npx がレジストリに接続できない問題や、起動時に終了するサーバーを検出できます。最終起動の情報はサーバー自体から取得します。アプリが Veto を起動するたびに、どのアプリがどの Node を使ったか、そのアプリのランタイムで SQLite が読み込まれたかを記録します(~/.veto/host-starts.json)。ターミナルとは異なる Node で GUI アプリが Veto を起動していることを検出できるのは、このチェックだけです。問題が見つかった場合、veto doctor は終了ステータス 1 を返すため、スクリプトから結果を利用できます。
AI のアプリが Veto を読み込まなかった場合、 Veto の veto スキル(veto init によって Claude Code、Codex、Antigravity/Gemini のスキルフォルダーに書き込まれます)は、そのことを伝え、Veto のデータベースを手動で読むのではなく、veto continue/veto sessions/veto doctor を使うよう指示します。
このリリースより前のバージョンの veto init は、Veto のガイドを ~/.gemini/GEMINI.md(Gemini 自身のメモリーファイル)と ~/.codex/AGENTS.override.md(Codex が ~/.codex/AGENTS.md の代わりに読み込むファイル)に書き込んでいました。現在のバージョンは、どちらのファイルにも書き込みません。veto doctor は残っているコピーを報告し、veto doctor --fix(または veto init)は、Veto が配布したガイドと完全に一致する場合に限り、コピーの名前を *.veto-backup に変更します。Gemini がガイドの下に保存したメモリーなど、ほかの内容が含まれるファイルは報告されますが、変更されることはありません。古い init によって上書きされた内容は復元できません。
エディター拡張機能向け:veto api
Veto の状態を表示する拡張機能は、Veto のデータベースを直接開くのではなく、veto api を通じて状態を読み取ります。各レスポンスは stdout に出力される 1 つの JSON エンベロープで、contract、command、backend_version、state と、state が ok 以外の場合は message/next_action を含みます。その形式は Veto とは別にバージョン管理されています。contract 1 ではフィールドは追加のみなので、知らないフィールドは無視してください。
| コマンド | リクエスト | 戻り値 |
|---|---|---|
version | — | contract のバージョン、コマンド、CLI のパス、SQLite が読み込まれるかどうか |
snapshot | { project, db? } | キャプチャの状態、プロジェクトのアーカイブ数、レッスンの共有状況と件数、トライアルの進行状況。読み取り専用で、パスではなく件数を返します |
recall search | { project, query, limit?, source?, db? } | そのプロジェクトのアーカイブ済みチャットから、マスキングされた検索結果と、一致したチャットのセグメント |
recall expand | { project, event_id } または { project, archive_id, segment_index } | プロジェクトに属する場合に限り、1 つのターンまたはセグメントのマスキング済みテキスト |
diagnostics | { checks?: ["host_cli", "probe"], db? } | veto doctor のアプリごとのチェック。時間のかかるチェックは指定された場合にのみ実行されます |
リクエストは JSON として stdin に送信し、シェルを介さず、引数配列を使って CLI を起動してください:execFile(process.execPath, [cliPath, 'api', 'recall', 'search', '--stdin'])。cliPath は veto api version から取得します。Windows では veto はシェルからしか起動できない .cmd シムです。また、検索クエリをシェル経由で渡すと、コマンドラインとして解釈されます。project は必ず指定してください。Veto が使用するものとは異なる db は、誤ったデータベースから回答する代わりに db_mismatch として拒否されます。キャプチャをオフにした後も保持されているアーカイブは検索できます。また、各レスポンスにはキャプチャの状態が示されます。アーカイブを削除するには veto transcripts purge を使います。JSON Schema とレスポンス例は、パッケージ内の contracts/api-v1/ に収録されています。
veto statusline
Claude Code では、veto statusline install を実行すると、プロンプトの下に Veto のステータス行が追加されます。最新の評議結果、ルーターの信頼度、リアルタイムのコンテキスト使用量とレート制限の使用状況、メモリサイズが表示されます。メモの共有 が有効な間は、Veto が保持しているメモの数(notes 178)も表示されます。共有が無効な場合は、0 件として表示するのではなく、その件数自体を表示しません。
Codex と Gemini ではカスタムステータス行を実行できず、それぞれ組み込みの項目のみが表示されます(Codex:openai/codex#20244)。そのため、これらの環境では、同じステータス行が AI の横に小さな分割ペインで表示され、現在のフォルダーでそのセッションに追従します。
veto statusline watch # follows whichever AI is working in this folder
veto statusline watch --client=codex # or pin one: claude | codex | gemini
veto statusline install --client=codex # prints the split-pane setup for your terminal; writes nothing
Codex では、Codex 自身のセッションファイルからコンテキストとレート制限の使用状況を読み取ります。Gemini は使用状況の数値を記録しないため、ステータス行にはゲージのないリアルタイムのセッション情報が表示されます。veto statusline print --client=codex は、tmux のステータスバーやスクリプト用に 1 行を出力します。
評議会による討論
2 段階のフローです。API キーなしで Claude Code、Gemini CLI、Antigravity CLI、Codex CLI に対応します。
# Phase 1 — call with task, get instant deterministic result + LLM upgrade prompt
veto_council_debate {
task: "migrate auth from sessions to JWTs",
project_dir: "/your/project",
strictness: "standard"
}
→ {
llm_backed: false,
final_verdict: "YELLOW",
votes: { lead_dev: {...}, architect: {...}, security: {...}, ... },
llm_upgrade: {
available: true,
instruction: "Read debate_prompt, reason as all 7 agents, call again with agent_responses",
debate_prompt: "You are running a Veto Council debate. Analyze the task as each specialist..."
}
}
# Phase 2 — reason as all 7 agents, pass responses back → get LLM-backed verdict
veto_council_debate {
task: "migrate auth from sessions to JWTs",
agent_responses: {
lead_dev: { verdict: "warn", reason: "Stateless JWTs complicate logout — need blocklist", concerns: ["Refresh token rotation must be atomic"], recommendation: "Use short-lived access tokens (15m) + httpOnly refresh tokens" },
pm: { verdict: "approve", reason: "JWT migration unblocks mobile clients", concerns: [], recommendation: "Ship behind a feature flag, roll back if logout issues" },
architect: { verdict: "approve", reason: "Good fit for stateless microservice boundary", concerns: ["Clock skew can break expiry across services"], recommendation: "Add NTP sync check; use relative expiry not absolute timestamps" },
ux: { verdict: "approve", reason: "No user-visible change if migration is seamless", concerns: [], recommendation: "Silent migration — no logout required for existing sessions" },
devil: { verdict: "warn", reason: "What if the refresh token store goes down at 2AM?", concerns: ["Redis outage = all users logged out"], recommendation: "Fallback to session auth if Redis is down; use short rotation window" },
legal: { verdict: "approve", reason: "JWTs are industry standard, no new compliance risk", concerns: [], recommendation: "Document token storage in privacy policy" },
security: { verdict: "warn", reason: "Refresh token rotation must be atomic — TOCTOU risk", concerns: ["localStorage storage of access token is XSS-vulnerable"], recommendation: "Store access token in memory only; refresh token in httpOnly Secure SameSite=Strict cookie" }
}
}
→ {
llm_backed: true,
final_verdict: "YELLOW",
warnings: ["Refresh token rotation must be atomic...", "What if the refresh token store goes down..."],
recommended: "Proceed with JWT. Use httpOnly cookies for refresh tokens, memory-only for access tokens..."
}
評議会の strictness
veto_council_debate { task: "...", strictness: "fast" } # 3 agents, instant
veto_council_debate { task: "...", strictness: "standard" } # 7 agents, default
veto_council_debate { task: "...", strictness: "strict" } # 7 + devil rebuttal
セッションのタグ付けと検索
veto_session_save {
auto_summarize: true,
tags: ["auth", "jwt", "middleware"]
}
veto_sessions_list { query: "auth" }
→ sessions matching "auth" in summary, context, tags, or project_dir
トークン使用量は手動で報告します。veto_status または veto_session_save に token_count を渡すと、Veto はプラットフォームごと、日ごとに記録します。veto_rate_status で報告内容を確認できます。使用量が自動的にカウントされることはありません。
ワークスペースの検出
veto_discover { "project_dir": "/your/project" }
→ {
git: { branch: "main", commit: "a3f2b1", dirty_files: [], recent_commits: [...] },
ecosystems: { node: "my-app v2.1.0" },
tech_stack: ["TypeScript", "React", "Prisma"],
key_files: ["tsconfig.json", "prisma/schema.prisma", ".env.example"],
total_files: 142
}
差分レビュー
veto_diff_review { project_dir: "/your/project" }
→ {
verdict: "warn",
files_changed: 4,
code_review: { score: 78, critical: 0, high: 2, findings: [...] },
security: { score: 91, critical: 0, high: 0, findings: [...] },
secrets: { findings: [] },
summary: "⚠️ WARN — 4 file(s) changed..."
}
順次パイプライン
veto_workflow {
steps: [
{ id: "code", agent: "coder", task: "implement auth middleware", gate: 70 },
{ id: "review", agent: "reviewer", task: "review the implementation", gate: 75 },
{ id: "security", agent: "security-scanner", task: "scan for vulnerabilities", gate: 80 },
{ id: "test", agent: "tester", task: "write test cases" }
],
project_dir: "/your/project"
}
→ { verdict: "passed", steps_passed: 4, steps_failed: 0, results: [...] }
自己学習型ルーター
各エージェントツールは、処理が完了すると品質シグナルを自動記録します。作業セッションの終了後に veto_learning_stats を実行すると最新データが表示され、約 20 回呼び出した後は veto_learning_apply がティアのしきい値を自動調整します。
このループは暗黙的にも自らにフィードバックを返します。veto_learning_stats はツール呼び出しのトレースを分析し、手動で記録されていないシグナルを検出します。たとえば、エージェントが実行するツールがエラーを返した場合や、同じ分析ツールが 1 回のセッション内で数分以内に再実行された場合(通常は最初の回答で要件が満たされなかったことを意味します)などです。こうしたシグナルは、低品質の結果として自動記録されます。
veto_route_task { task: "debug auth issue", file_ext: ".ts" }
→ { ..., recommended_agent: "debugger" } # ← predicted from history
プラグインシステム
// ~/.veto/agents/my-agent.js
export function plan(task, context) {
return {
agent: 'my-agent', task, tier: 2,
approach: 'Your custom approach...',
steps: ['Step 1', 'Step 2'],
checklist: ['[ ] Check 1'],
pitfalls: ['Pitfall 1'],
patterns: ['Pattern 1'],
duration_estimate: '1-2 hours',
};
}
クロスプラットフォームの引き継ぎ
Claude at 90% → veto_handoff { summary, context }
Open Gemini → veto_continue { resuming_as: "gemini" }
Full context restored. Continue exactly where you stopped.
プラットフォームの切り替えは手動です。Veto は veto_rate_status を通じて、残りの予算があるプラットフォームを示します。切り替えるタイミングは自分で判断してください。
| プラットフォーム | サポート |
|---|---|
| Claude Code | ✅ ネイティブ MCP |
| Gemini CLI | ✅ MCP 対応 |
| Antigravity CLI | ✅ MCP 対応 |
| Codex CLI | ✅ MCP 対応 |
| Cursor | ✅ MCP 対応 |
| Windsurf | ✅ MCP 対応 |
| Zed | ✅ MCP 対応(context_servers) |
セッショントランスクリプトの記録(オプトイン)
veto_session_save は約 1k トークンの要約を書き込みます。再開するには十分ですが、「3 週間前、具体的に何を結論づけたのか、そしていつだったのか?」に答えるには不十分です。トランスクリプトを記録することで、要約では失われる詳細を残して検索できるようになります。API キーも、クエリごとのコストも不要で、データがマシンの外に出ることもありません。これはメタデータの目次と、コア SQLite のみで構築されたポータブルな BM25 インデックスです。FTS5 を使わないため、サポート対象のすべての Node で動作します。さらにローカルのセマンティック検索と、再ランキングを行う AI を組み合わせています。
⚠️ 有効にする前にお読みください
Veto は AI クライアント自身の会話メモリをコピーします。 保存時に、Veto はホスト CLI のトランスクリプトファイルをバイト単位で複製し、独自のローカルストアにアーカイブします。送信したすべてのメッセージ、すべての返信、すべてのツール操作が含まれます。
- コピーは独立しています。 元のファイルは変更されませんが、Veto のコピーは元のファイルより長く残ります。AI クライアントの履歴を消去したり、クライアントが独自のログをローテーションしたりしても、アーカイブは削除されません。削除されるのは
veto transcripts purgeを実行した場合、または保持期間が過ぎた場合のみです。- セッションに含まれていた内容はそのまま引き継がれます。 シークレット、顧客データ、第三者の情報など、貼り付けた内容はアーカイブに含まれます。検出されたシークレットは AI が読み取れるすべての場所でマスキングされますが、ディスク上の生のアーカイブはプライベートデータです。シェル履歴と同じように扱ってください。
- ローカルのみです。 アップロードも共有もされません。アーカイブディレクトリはクラウド同期フォルダーを意図的に避けており、同期パスが検出されると警告が表示されます。
- 明示するまで無効です。 記録はデフォルトで無効です。
veto transcripts enableを実行すると、この開示内容がすべて表示され、バージョン管理された同意が記録されます。開示内容に重要な変更があった場合は、再度確認を求められます。
veto transcripts enable # Opt in — prints what/where/retention, records consent
veto transcripts status # State, archive dir, retention, disk usage
veto transcripts sources # Per-CLI: where sessions live + what Veto can see
veto transcripts list # Archived sessions
veto transcripts show <id> # One session's table-of-contents + facts (any AI's session id)
veto transcripts purge <id> # Delete an archive (also --project=<dir> | --all; --source=codex to narrow)
veto transcripts disable # Stop capturing (existing archives are kept)
Claude Code、Codex CLI、Gemini CLI、Antigravity CLI で動作します
4 つすべてが、それぞれ独自のフォーマットアダプターを使って同じパイプラインで記録・検索され、Veto は実行中のホストを自動的に判別します。MCP ハンドシェイクでホストが識別されるため、AI が正しく報告するかどうかには左右されません。Veto は保存時に各ホストのセッションファイルをディスク上で検出します(Claude Code のステータスラインがインストールされている場合は、セッションをリアルタイムで報告する機能もあります)。プロジェクトフォルダーは、ホストごとに異なる表記でも一致します。たとえば、保存時に D:\Veto と呼ばれるフォルダーを、Gemini は d:\veto として記録します。Antigravity の会話は、Veto が読み取り専用で開く Antigravity 独自の会話インデックスを通じてプロジェクトと照合されます。
veto transcripts sources を実行すると、各ホストについて認識できる情報が正確に表示されます。また、保存時に何もアーカイブされなかった場合は、その理由が応答に示されます。
各アダプターはドキュメントではなく実際のトランスクリプトを基に作成されています。その結果、2 つの形式上の落とし穴にも対処できました。Codex はすべてのメッセージを並行する 2 つのストリームに記録し、Gemini のチャットログはメッセージが更新されるたびに新しいコピーを追加します。どちらも、対処しなければ同じメッセージが複数回インデックスに登録されてしまいます。
検索は veto_session_replay を通じて、検索してから展開する 2 回の呼び出しループとして実行されます。
{ query: "npm E404 publish" } → table-of-contents + top hits with snippets
{ expand: { event_id: 412 } } → the exact lines, masked, with a turn + timestamp citation
過去のセッションを、尋ねなくても活用
AI が思い出そうとしなければ検索は役に立ちませんが、実際にはほとんど活用されていませんでした。そのため、履歴によって回答が変わるツールでは、どの AI で行われた会話かにかかわらず、アーカイブ済みのすべてのチャットから履歴を自動的に取得します。
veto_continue/veto_session_restoreは、保存済みセッションの元になったチャット(たとえば Codex のチャット 1 件と Claude Code のチャット 2 件)と、それぞれで最後に尋ねた内容を一覧表示します。veto_memory_searchは、保存済みメモリとともに、過去のチャットから一致する抜粋を返します。- Veto がモデルに渡すすべてのプロンプト(エージェントツールと協議会を含む)に、関連する抜粋が最大 3 件含まれます。
抜粋が添付されるのは、会話の内容であり(ツールのペイロードではなく)、質問と 2 語以上が共通している場合のみです。記録が無効な場合は、何も添付されません。抜粋には指示ではなく過去のデータであることが明記され、決定論的なアナライザーには渡されないため、過去の抜粋が検出結果になることはありません。
セマンティック検索 — うろ覚えのことを見つける
キーワード検索では、本当に知りたいことを見つけられない場合があります。覚えているのは、どんな言葉で書かれていたかではなく、何が決まったかです。そのため、「なぜアップロードに失敗したのか」と検索しても、「認証情報の有効期限が切れていた」と書かれたメモは見つかりません。
Veto は言葉だけでなく意味も検索します。記録されたイベントはそれぞれ、重なり合うウィンドウに分割してローカルで埋め込みを生成します。クエリも同じ方法で埋め込みを生成し、キーワードと意味による2つのランキングを統合するため、どちらかがもう一方を埋もれさせることはありません。E404のような正確な識別子は引き続き最上位に表示され、回答と共通する語彙がない質問でも、答えを見つけられます。
これはすべてお使いのマシン上で実行されます。 API キーも、クエリごとの料金も、ディスク外へのテキストの送信も必要なく、オフラインでも動作します。これを実現するのは、通常の依存関係としてインストールされる7 MB の埋め込みテーブルです。
- npm の共有キャッシュによって、プロジェクトごとではなくマシンごとに一度だけダウンロードされます。
- トランスクリプトの記録を有効にするかどうかにかかわらず、Veto に同梱されます。これが設計上の正直なコストです。不変のパッケージを固定することで、リリース済みのバージョンでバイト列が変わることはありません。また、オンデマンド取得方式で必要になる実行時のダウンロード、チェックサム、ミラーの仕組みも不要になります。
- 最初のセマンティッククエリで遅延読み込みされ、起動時には読み込まれません。 見つからない場合や破損している場合、検索はキーワードのみの方式にひそかに切り替わり、Veto は引き続き動作します。
このテーブルは、baai/bge-base-en-v1.5を蒸留して int8 に再パッケージ化した、Minish Labによるpotion-base-8M(MIT)です。これは静的なルックアップテーブルであり、ニューラルネットワークではありません。クエリの実行時にモデルを動かす必要がないため、検索にかかる時間は数ミリ秒です。推論コードは Veto 独自のものです。
AI 間で共有するメモ(オプトイン、試験運用中)
Claude、Codex、Gemini はそれぞれ独自のメモリにメモを保存します。Claude のプロジェクトごとのメモリフォルダー、~/.codex/AGENTS.md、~/.gemini/GEMINI.md です。それぞれの AI が何かを学んでも、ほかの AI に伝わることはありません。同じことを、2つのプロジェクトで二度学ぶことになります。Veto はそれらのメモを読み、役立つ場所で共有できます。プロジェクト間、そしてAI 間で共有できます。
⚠️ 有効にするとどうなるか
- プロジェクト間: あるプロジェクトで作業しているときに書かれた、あなたやこのコンピューターに関するメモを、ほかのプロジェクトにも共有できます。
- AI 間: Claude が書いたメモを Codex や Gemini に届けることができ、その逆も可能です。AI に渡したメモは、ほかに送信するものと同様に、会話の一部としてその AI を提供する企業に送られます。
- 読み取り専用です。 Veto が AI のメモリファイルを変更したり削除したりすることはありません。各メモのコピーを独自のローカルデータベースに保存します。その前に、メールアドレス、ホームフォルダー、パスワードやキーと思われるものは取り除かれます。Veto 自体が何かをアップロードすることはありません。
- あなたが有効にするまでオフで、あなた以外は有効にできません。
veto lessons onを実行すると、この説明が表示され、自分の端末でyesと入力するよう求められます。AI がこのコマンドを実行すると拒否されるため、AI があなたに代わって共有を有効にすることはできません。アップグレードによって有効になることはありません。また、共有の内容に重要な変更があった場合は、再度確認を求められます。- 現時点では試験運用です。 Veto はまだどの AI にもメモを渡しません。共有を有効にしても、それ以外のことは始まりません。別途、
veto lessons trialを自分で実行すると、Veto が Codex のセッションに渡す予定のメモを記録する試験運用を開始できます。開始前に確認を求められます。詳しくは試験運用をご覧ください。Veto が AI にメモを渡し始める前に、もう一度確認を求めます。
ほとんどのメモがプロジェクトの外に出ることはありません。そのプロジェクトに関するメモや、コマンド、ウェブアドレス、認証情報、何かを取得・送信・実行する指示が含まれるメモは、そのプロジェクトにとどまります。秘密や個人情報に関するメモがプロジェクトの外に出ることはありません。共有される可能性があるのは、あなたに関するメモ(Claude の user および feedback のメモ、CLI のグローバル指示)か、このコンピューター(シェル、コンソール、ネットワーク)に関するメモだけです。共有されたメモには、別の AI セッションから得た情報であることが示され、指示として扱われることはありません。
veto lessons on # Read the disclosure; type yes to accept (your own terminal only)
veto lessons trial # The trial: its lists and progress; starts it when you type yes (your own terminal only)
veto lessons trial ignore [dir] # Before it starts: record sessions in this project as skipped (also: use [dir], clear)
veto lessons # Status: notes found, how many may travel, anything switched off, and the trial so far
veto lessons list # Every note Veto has read, by project (--shared, --held, --scope=, --source=, --json)
veto lessons why <id> # One note: who wrote it, when, why it stays or travels, where it may go
veto lessons flows # Where each AI's notes may go, per project
veto lessons forget <id> # Stop one note for good, with its copies in your other checkouts
veto lessons exclude [dir] # Keep a project out entirely: nothing leaves it, nothing enters it
veto lessons include [dir] # Undo exclude: the project's notes are read again
veto lessons alias # Memory on a drive that isn't plugged in: suggests the command that links it
veto lessons recheck <ai> # Read an AI's memory again after Veto stopped because its format changed
veto lessons off # Turn sharing off and delete everything Veto copied, trial records included
保存時に取り込み
共有を有効にすると、veto_session_save を実行するたびに各 AI のメモリを再読み込みし、変更内容を記録します。そのため、AI が今日書いたメモも、何も実行せずに取り込まれます。変更されていないファイルについては、サイズと日付を確認するだけなので、保存に約 20 ms 追加されます。この処理は保存ごとに最大 150 ms で打ち切られ、処理しきれなかった分は次回の保存まで保留されます。また、保存が失敗する原因になることはありません。共有を有効にすると、最初にすべてを一度読み込みます。また、veto lessons コマンドは毎回すべてのファイルを確認します。保存時の処理だけを停止するには、~/.veto/config.json で lessons.harvest_on_save を false に設定してください。
試用
Veto が AI にメモを渡す前に、渡すメモが実際に役立つものだと示す必要があります。そのための仕組みが試用です。Veto が「渡していたはず」の内容を記録しますが、実際には何も渡しません。試用はそれ自体がオプトインで、共有をオンにしても開始されません。
-
プロジェクトの選択(任意): 開始する前に、
veto lessons trial ignore <dir>を実行すると、そのプロジェクトのセッションをスキップ対象として記録し、veto lessons trial use <dir>を実行すると、指定したプロジェクトだけが対象になります。veto lessons trial clearを実行すると、両方のリストが空になります。プロジェクトは Git の履歴で照合されるため、同じプロジェクトのチェックアウトはすべて同じものとして扱われます。Git を使っていないフォルダーはパスで照合されます。リストは誰でも設定でき、AI も設定できます。また、リストは~/.veto/config.jsonにのみ保存されます。 -
開始:
veto lessons trialを実行すると、試用で記録される内容と両方のリストが表示され、自分のターミナルでyesと入力すると開始します。AI が代わりに開始することはできません。開始後はリストを変更できません。 -
終了時期: 10 週間後、または選ばれたメモが 12 件に達した時点の、いずれか早い方です。
-
対象となるもの: 選択できるメモがあるプロジェクトでの Codex セッションです。セッションの最初のリクエストは、そのセッション開始時点で Veto が保持していたメモと照合されるため、後から届いたり変更されたりしたメモは対象になりません。サブエージェントは二重にカウントされません。無視対象のプロジェクトでのセッションはスキップとして記録され、そのメッセージは使われず、メモも選ばれません。Claude Code のセッションはこの試用の対象外です。Claude はすでに自身のプロジェクトのメモを読み込んでおり、追加できるものはほとんどないためです。
-
ユーザーにしていただくこと: メモのあるプロジェクトで実際の作業に Codex を使い、各セッションの冒頭でタスクを適切に説明してください。メモはその内容と照合されるためです。
-
確認できる内容:
veto lessonsとveto lessons trialで、試用の進行状況を確認できます。また、リクエストがまったくないセッションが連続した場合にも警告が表示されます。これは通常、該当するメモがなかったというより、Codex が形式を変更した可能性が高いことを示します。Trial: day 18 of 70 · 4 of 12 notes chosen 23 Codex sessions counted · 3 with notes chosen · 20 with none that fitted · 9 skipped -
記録はユーザーの手元に保管されます: 記録はお使いのマシンに保存され、Veto が収集することはありません。
veto lessons offを実行すると削除されます。トランスクリプトの記録がオンの場合、対象となる試用セッションは、Veto で保存していない Codex セッションも含めて終了後にアーカイブされるため、各選択の根拠が保管されます。 -
配信の判断方法: Veto の作者自身のマシンで、記録開始前に定めて封印されたルールに従って試用を行います。終了後、独立した AI の判定者が、選ばれた各メモをそのセッションで後に行われた内容と照らし合わせて、一度だけ評価します。メモが実際に役立つとはっきり確認できなければ、配信は行われません。確認できた場合は配信方法を設計できますが、メモが AI に届く前に、Veto はすべてのユーザーに改めて同意を求めます。
3.6.0~3.8.0 からのアップグレード
共有はオンのまま維持され、再度確認を求められることはありません。これらのバージョンでは、共有に同意すると試用が自動的に開始されていました。3.9.0 ではアップグレード時に試用を停止し、veto lessons trial を実行して新しい試用を自分で開始しない限り、それ以上は何も記録されません。以前の試用で記録された内容は保持され、veto lessons には「Trial 1: ended」と表示されます。また、veto lessons off を実行すると引き続き削除されます。
3.5.0 からのアップグレード
3.6.0 では、改めて同意を求められます。3.5.0 の説明では、Veto がどのメモを渡すかを推測することはないとしていましたが、試用ではまさにそれを行うためです。自分のターミナルで veto lessons on を実行して同意するまで、共有は一時停止されます。何も読み取られず、保存時の収集も停止し、試用も開始されません。Veto がすでに保持しているメモはそのまま残ります。
リリースノート
3.9.0
- ノートのトライアルは、自分で開始する方式になりました。 これまでは、共有を承認すると共有を有効にしたすべてのコンピューターでトライアルが自動的に開始されていましたが、そのトライアルの情報がコンピューターの外に送信されることはありませんでした。今後は、
veto lessons trialを実行するとトライアルで記録される内容が表示され、自分のターミナルでyesと入力した場合にのみ開始されます。AI が代わりに開始することはできません。開始前にveto lessons trial ignore <dir>とuse <dir>を実行すると、対象とするプロジェクトを選べます。無視対象のプロジェクトのセッションはスキップとして記録され、ノートは選ばれません。トライアルは 10 週間が経過するか、選ばれたノートが 12 件に達すると終了します。トライアルをご覧ください。 - 3.6.0〜3.8.0 で共有を有効にした場合: 新たな確認はなく、共有は引き続き有効です。これは、同意文からトライアルが自動的に始まるという説明だけが削除されたためです。実行中のトライアルはアップグレード時に停止します。記録は保持され、「Trial 1: ended」と表示されます。
veto lessons offを実行すれば、引き続き削除できます。 - バグ修正:トライアルがすでに終了しているのに、
veto doctorが次の保存時に Codex のセッションを調べると表示していました。 終了したトライアルでは何も調べず、doctor にもそのような表示が出なくなりました。また、トライアルの記録があるのに実行中のトライアルがない場合も警告するようになりました。これは Veto の設定が破損しているか、手動で編集されたことを意味します。 veto api snapshotは、トライアルのtrial_id、stop_on、notes_chosen、notes_target、skipped件数を報告します。これらのフィールドは contract v1 に追加されますが、既存の項目は削除されず、フォルダーの一覧が返されることもありません。
3.8.0
- 新機能:エディター拡張機能向け JSON API、
veto api。 VS Code 拡張機能では Veto のデータベースは表示できましたが、トランスクリプトの取得が有効か、ノートのトライアルで何が見つかったか、過去のチャットの内容は確認できなかったため、「不明」と表示するしかありませんでした。veto api snapshotは、プロジェクトの取得、レッスン、トライアルの状態を報告します。読み取り専用で、何も変更しません。読み取り専用の接続を使い、マイグレーション、収集、トライアルの処理は実行せず、フォルダーではなく件数を返します。veto api recall searchとrecall expandは、veto_session_replayと同じ検索を提供します。エディターに必要なスコープは Veto が確認します。プロジェクトの指定が必須で、別のプロジェクトに属するイベントやセグメントは拒否され、テキストはマスキングされ、元のソースが返されることはありません。veto api diagnosticsは、veto doctorによるアプリごとのチェック結果をデータとして返します。リクエストは JSON として標準入力から渡されるため、検索テキストがシェルを通ることはありません。API の仕様は Veto とは別にバージョン管理され、JSON Schema と使用例はcontracts/api-v1/に同梱されています。エディター拡張機能向けをご覧ください。 - バグ修正:Codex のサンドボックス内で
veto continueとveto sessionsが失敗していました。 Veto のツールが Codex に読み込まれない場合、vetoスキルは正しく Codex にveto continueを実行させていました。しかし、Codex のデフォルトのサンドボックスではコマンドによる書き込みはワークスペース内に限られている一方、Veto は読み取りだけの場合も、データベースを開くたびに書き込んでいました。そのため、どちらのコマンドもattempt to write a readonly databaseで停止していました。現在は、書き込みを行わずにデータベースを読み取る方法にフォールバックします。veto continueは引き続き保存済みセッション全体を返し、再開した人の記録と過去のセッションの抜粋の追加ができなかったことを伝えます。Codex 独自のサンドボックス(codex sandbox)でテスト済みです。3.7.1 では失敗し、3.8.0 ではセッションを復元できます。 - バグ修正:Antigravity のチャットが取得されていませんでした。 トランスクリプトの取得が有効な状態で Antigravity から保存しても、Veto が Antigravity のチャットを読み取れなかったため、何もアーカイブされませんでした。現在は
~/.gemini/antigravity-cli/brain/<conversation>/からチャットを読み取り、読み取り専用で開いた Antigravity 独自の会話インデックスから各会話のプロジェクトを特定します。また、別の会話によって開始された会話と、Antigravity エディターの会話はスキップします。Antigravity のチャットもほかのチャットと同様に検索・展開できるようになり、veto transcripts sourcesに表示され、veto doctorで取得が適切に続いているか確認できるようになりました。これは、すでに与えられた取得への同意の対象です。この同意では、特定のアプリは指定されていません。
3.7.1
- バグ修正:Veto が Antigravity 上で動作していることを認識できませんでした。 Antigravity は Veto の起動時に自身を
antigravity-clientと名乗りますが、Veto はこれを認識していませんでした。そのため、モデルが別の名前を指定しない限り、そこで保存されたセッションにはclaudeというラベルが付いていました。また、そこで再開したセッションは Antigravity で再開されたと記録されず、モデルが自身をgeminiと説明した場合、トランスクリプトのキャプチャによって、別のアプリの会話である Gemini CLI のチャットがアーカイブされていました。Antigravity が独立したアプリとして認識されるようになりました。保存と再開にはantigravityというラベルが付けられ、キャプチャではスキップされます(Veto は Antigravity のチャットを読み取れません)。また、ツールが使用中のアプリを尋ねるすべての箇所で、antigravityが有効な値として受け付けられます。veto_healthもアプリを報告します。 - バグ修正:Antigravity に
vetoスキルが表示されませんでした。 3.7.0 ではスキルを~/.gemini/skillsに書き込んでいましたが、Antigravity はこのフォルダーを読み取りません。そのため、Veto のツールが利用できなくても、ガイダンスは表示されませんでした。スキルは Antigravity が一覧表示する~/.gemini/config/skillsに保存されるようになりました。Veto を無効にした状態でテストしたところ、Antigravity はスキルを読み込み、Veto のツールが読み込まれていないと伝えたうえで、ディスクを検索する代わりにveto continueを実行しました。更新後にveto initを実行して、スキルをその場所にインストールしてください。
3.7.0
- バグ修正:Antigravity が Veto を読み込まない問題。 Antigravity は
~/.gemini/config/mcp_config.jsonから MCP サーバーを読み込みますが、veto initは読み込まれない~/.gemini/antigravity-cli/mcp_config.jsonに書き込んでおり、veto doctorも同じファイルを確認して ✓ を表示していました。initは、CLI があるアプリでは各アプリ独自の CLI(claude mcp add、codex mcp add、agy mcp add)を使って登録するようになりました。これにより、設定の保存場所はアプリ側で決まります。CLI がない場合は、アプリが読み込むファイルにのみ書き込みます。以前の書き込み処理が「読み取り不可」としてスキップしていた、Antigravity が作成する空のファイルも処理できるようになりました。また、コメントを含むファイル(Zed のファイルなど)や壊れた JSON ファイルを書き換えることはありません。 veto doctorは、各アプリが Veto を実際に実行するかを確認するようになりました。 ファイルに Veto の記載があるかどうかではなく、アプリ自身が報告する内容(無効化された項目も含む)を読み取り、設定されたコマンドを起動して応答を確認します。また、各アプリが最後に Veto を起動した時刻、そのときの Node、SQLite が動作したかどうかも表示します。トランスクリプトの取得とレッスンの試行が最新の状態を保っているかも確認し、問題があれば終了コード 1 で終了します。Node のチェックにも誤りがありました。永続化が動作しない 22.5~22.12 も受け入れていました。- 新機能:
veto continue <id> --as <client>とveto sessions --all | --limit N | [words]。 アプリが Veto を読み込まなかった AI は、以前のように Veto のデータベースを読んだり、そのファイルをインポートしたりせず、ターミナルからveto_continueと同じコードを使ってセッションを復元できます。veto_continueとveto continueは、一覧に表示される 8 文字の ID プレフィックスを受け付けます。veto sessionsは最新 20 件だけでなく、セッションの総数も表示します。 - 新機能:
vetoスキル。veto initによって Claude Code、Codex、Antigravity/Gemini のスキルフォルダーに書き込まれます。Veto が読み込まれなかった場合でも AI に表示される唯一の指示です。読み込まれなかったことを伝え、CLI を使い、データベースは決して読まないよう指示します。自分で作成したvetoスキルを置き換えることはありません。 - バグ修正:ツールが埋め草を結果として返す問題。 LLM の処理がない場合、ジェネレーターは無関係なテキストで出力を埋めていました。たとえば
veto_diagramは"mermaid": "Documentation looks complete."を返し、veto_pr_description、veto_release_notes、veto_prompt_optimizer、veto_rca、veto_postmortem、veto_onboardも同様でした。各ツールは計算した内容(コミット、ルート、件数、エラーバジェットの計算、スタックトレースのコードなど)のみを返し、それ以外はgeneration: "needs_llm"として、完成させるためのプロンプトを示すようになりました。生成された出力は返す前に検証されます。veto_doc_genはコードが失われたファイルを拒否し、veto_diagramは Mermaid ではないテキストを拒否し、veto_openapi_genは OpenAPI ではないドキュメントを拒否します。 - バグ修正:ツールが入力を受け取らない問題。
veto_secrets_scanはtextを受け取っていませんでした。veto_translateはテキストも言語も受け取っていませんでした。veto_semantic_searchはクエリを受け取っておらず、veto_explain、veto_merge_conflict、veto_a11y_advisorはファイルを読み込んでいませんでした。すべての入力がエージェントに届くようになり、ファイルも読み込まれます(ファイルが見つからない場合はエラーになります)。分析ツールは最初に Veto 独自のスキャナーを実行し、LLM がなくても検出結果を返します。 - バグ修正:何も検出できなかったスキャナー。
veto_dead_codeとveto_flag_auditorは GNU grep のオプションをgit grepに渡していたため、常に何も検出しませんでした。両方とも実際にスキャンするようになり、他のファイルから使われていないエクスポート、コメントアウトされたコード、場所を含む機能フラグを検出します。セキュリティスキャナーは最も一般的な SQL インジェクション("… id = '" + req.params.id)を見逃していましたが、該当する行を報告するようになりました。veto_clone_detectorはコードを自分自身のクローンとして報告し、1 つのコピーを複数の検出結果に分割していました。veto_openapi_genはroute*/api*という名前のファイルしか確認していませんでした。 - バグ修正:数値の誤り。
veto_dep_advisorは^4.19.2の依存関係について OSV に4.0.0を問い合わせていました。インストール済み、またはロックされたバージョンを使うようになり、各アドバイザリの概要、深刻度、修正バージョンを返します。veto_debt_registerはすべての項目を「complexity, 2 hours」としていました。また、複数のツールが結果として固定された空欄やゼロを返していました。 - バグ修正:キーワード判定をレビューとして提示する問題。 LLM が利用できない場合、評議会の投票はキーワードルールに基づいています。このような判定には暫定であることが表示されるようになり、プロジェクトの最新の判定として保存されたり、決定としてメモリに保存されたりしなくなりました。また、
veto_new_featureをブロックすることもなくなりました。veto_benchmarkは、その判定から「勝者」を選ばなくなりました。メンバーの大半の回答が欠けている評議会の回答が、LLM に全面的に裏付けられていると報告することもなくなりました。 - その他の修正。
veto_project_map_getは、マップがオブジェクトとして保存された後にクラッシュしていました。veto_git_blameはproject_dirを無視していました。veto_pr_postは GitHub に拒否されるレビューコメントを送信していました(レビュー本文に記載するようになりました)。veto_env_setupは既存の.env.exampleをプレースホルダーで置き換える可能性がありました。veto_workflowは不正なステップを実行していました。veto_notify_ideは MCP が実行できない操作について「送信済み」と表示していました。veto_code_reviewは説明で約束していたエディター診断を保存するようになりました。Windows では、プロジェクトの検索時に各アプリがフォルダー名に使う大文字・小文字を問わず一致するようになり、veto memory export --format=markdownでプロジェクトの項目が再び見つかるようになりました。 - バグ修正:Claude Code のシークレットフックが実行されない問題。
veto initがインストールしたフックは、Claude Code が設定しない環境変数からファイルパスを読み取っていたため、すべてのファイルを通過させていました。Claude Code のフック入力を読み取り、検出結果を Claude に返すフックに、その場で置き換えられます。Claude Code が実行しないフックファイル 2 つは、Veto が書き込んだものと完全に一致する場合に限り削除されます。 - Windows:Veto 自身のバックグラウンドコマンドでコンソールウィンドウが一瞬表示されなくなりました。また、更新チェックに失敗した場合は、起動のたびに再試行するのではなく、1 時間ごとに再試行します。
3.6.0
- 共有メモの試験で、メモが役立つかどうかを測定するようになりました。 Veto が AI にメモを渡す前に、渡す予定のメモが実在し、有用であることを示す必要があります。8 週間または Codex のセッション 20 回のいずれか早い方まで、Veto はプロジェクト内の各 Codex セッションの最初のメッセージを Codex 自身のセッションファイルから読み取り、そのセッションに渡す予定だったメモを判断して、その選択だけを記録します。メッセージは一切保存せず、AI にメモを渡すこともありません。セッションは Veto の接続ではなく Codex 自身のファイルから検出されます。Codex VS Code 拡張機能は 1 つのプロセスで多数の会話を実行するため、そうしないと見落とされてしまうためです。セッション開始時に Veto が保持していたメモだけが対象となり、サブエージェントは重複して数えられません。
veto lessonsで試験の進捗を確認できます。また、セッションからリクエストが得られなくなった場合、Codex が形式を変更したことを意味するため、警告が表示されます。トランスクリプトの記録が有効な場合、試験が完了したセッションはアーカイブされ、各選択を後から確認できます。記録はお使いのマシンに保存され、評価されることはありません。配信を実施するかどうかは、試験開始前に定められたルールに従い、作者自身のマシンで行われる試験によって決まります。 - 再度同意するまで共有が一時停止されます。 同意のバージョンが 3 に更新されます。バージョン 2 の文面では、Veto はどのメモを渡すかを判断しないとされていましたが、試験によってこれは事実ではなくなったためです。3.5.0 で共有を有効にした場合、
veto lessons onを自分のターミナルで実行して新しい文面に同意するまで、何も読み取られずに共有が一時停止されます。すでに収集されたデータが削除されることはありません。実際に AI にメモを渡す前に、Veto は改めて確認を求めます。 - アップグレード後の追いつきが大幅に速くなりました。 Veto がメモの読み取り方法を変更するたびに、すべてのメモリファイルを再読み込みする必要があります。これまでは、保存時の収集が追いつくまでに 16~25 回の保存が必要で、毎回、割り当てられた時間をすべて使っていました。その大半は、保存のたびにすべてのプロジェクトフォルダーで git を再実行することに費やされていました。Veto は各フォルダーがどのプロジェクトに属するかを記憶するようになり、追いつくまでに必要な保存は 3~5 回になりました。
veto lessonsコマンドでは、引き続き各フォルダーをその都度調べます。 - 削除:未使用のシャドーログ。 3.4.0 と 3.5.0 では、試験用のテーブルが作成されていましたが、実際に書き込まれることはありませんでした。その設計では各セッションのプロンプトが保存されることになっており、試験でそれを行うことは決してありません。アップグレード時に空のまま削除され、選択だけを保存する試験専用のテーブルに置き換えられます。
3.5.0
- 新機能、オプトインの試験機能:Veto が AI のメモを読み取ります。 Claude Code、Codex、Gemini はそれぞれ独自のメモリに学んだことを書き込みますが、互いの学びを知ることはありません。共有を有効にすると、Veto はそれらのメモを読み取り、マスキングしたコピーを自身のローカルデータベースに保存し、プロジェクト間および AI 間で安全に共有できるメモを判断します。現時点では、どの AI にもメモを渡しません。それは次の段階であり、実行する前に Veto が改めて確認します。共有は、手元のターミナルで
veto lessons onを実行してyesと入力するまで無効です。AI がこのコマンドを実行した場合は拒否され、アップグレードによって共有が有効になることもありません。AI 間で共有されるメモをご覧ください。 - 新機能:
veto lessons。 Veto が何を読み取り、その理由は何かを確認できます。listはプロジェクトごとにすべてのメモを表示し、why <id>はメモの出所と共有先の候補を表示し、flowsは各 AI のメモの共有先候補を表示します。forget <id>で特定のメモを今後共有しないようにし、excludeでプロジェクトを完全に除外し、aliasで接続されていないドライブ上のメモリを関連付け、offで共有を無効にして Veto がコピーしたデータをすべて削除できます。 - 今日書いたメモは、保存時に取り込まれます。 共有が有効な場合、
veto_session_saveは各 AI のメモリも再読み込みして変更を記録するため、別途実行する必要はありません。変更のないファイルで必要なのは stat 1 回だけなので、メモリファイルが 90 個ある場合でも、保存への追加時間は約 20 ms です。処理は保存ごとに最大 150 ms に制限されます。処理しきれなかったものは次回の保存まで待機し、保存が失敗する原因になることはありません。共有を有効にすると、最初にすべてを一度読み取ります。保存時の処理だけを停止するには、~/.veto/config.jsonでlessons.harvest_on_saveをfalseに設定します。 - 共有が有効な場合に限り、ステータス行に Veto が保持しているメモの数が表示されます(
notes 175)。メモが保持されていないのに保持されていると誤解させる可能性があるため、ゼロは表示しません。 - バグ修正:エージェントから形式の異なる応答が返されても、結果として報告されていました。 エージェントの応答スキーマではすべてのフィールドにデフォルト値があったため、Veto が読み取れない応答でも、デフォルト値から組み立てた完全な回答として検証を通過していました。分析の場合、これはスコア 70、「警告付きで承認」を意味していました。読み取り不能なセキュリティスキャンが、検出事項なしで概ね合格と報告され、
veto_execute_parallelは確信に満ちた空のレビューを返していました。今後、応答には内容を示すフィールドが含まれている必要があります(計画にはアプローチまたは手順、分析には検出事項、スコア、判定、または要約が必要です)。それ以外は、実際に受け取ったキーを示すエラーになります。範囲外のフィールドは、スコア 150 を 100 に制限するなど、従来どおり補正されます。 - バグ修正:評議会による 7 件の分析が、気付かれずに破棄されることがありました。
veto_council_debateはフェーズ 2 の応答を JSON オブジェクトとしてのみ受け付けていましたが、モデルは JSON 文字列を返すことがよくありました。文字列はフェーズ 1 に回され、実際の判定に見える決定論的な判定が返されましたが、書き込み済みの分析が破棄されたことは示されませんでした。今後は文字列もオブジェクトと同様に読み取ります。実際に読み取れない応答には、受け取った内容と期待されていた形式を示すエラーが返されます。
3.4.0
- 過去のセッションが、どの AI からでも、必要なツールに届くようになりました。 トランスクリプトの検索は、AI がそれを求めたときにしか役立たず、実際に求められることはほとんどありませんでした。今では
veto_continueとveto_session_restoreが、保存済みセッションの背後にあるアーカイブ済みチャット(たとえば、その作業に取り組んだ Codex のチャットと Claude Code のチャット 2 件)を、それぞれ最後に尋ねられた内容とともに一覧表示します。veto_memory_searchは保存されたメモリとともに一致する抜粋を返し、エージェントツールと評議会向けに Veto がモデルへ渡すすべてのプロンプトには、関連する抜粋が最大 3 件含まれます。抜粋が添付されるのは会話の場合だけで、生のツールペイロードは対象外です。また、質問と少なくとも 2 語が一致する必要があります。キャプチャがオフの間は何も添付されません。抜粋には指示ではなく履歴データであることが明記され、決定論的アナライザーには渡されないため、古い抜粋が検出結果につながることはありません。 - 新機能:Codex と Gemini の横に Veto のステータスラインを表示します。 どちらの CLI もカスタムステータスラインを実行できず、それぞれ組み込み項目だけを表示します。そのため
veto statusline watchは、AI の横に小さな分割ペインで Veto のステータスラインを描画し、現在のフォルダーにあるそのセッションを追跡します。Codex では、Codex 自身のセッションファイルから読み取ったコンテキストとレート制限の使用状況が表示されます。Gemini は使用状況の数値を記録しないため、ステータスラインにはゲージなしで現在のセッションが表示されます。veto statusline install --client=codex(またはgemini)は、Windows Terminal、tmux、または VS Code 用の 1 行のセットアップ手順を表示し、何も変更しません。 - バグ修正:
veto initが他の AI CLI 独自のメモリファイルを上書きしていました。 1.4.5 以降、init は Gemini のメモリファイルである~/.gemini/GEMINI.mdを Veto のガイドで置き換え、Codex が~/.codex/AGENTS.mdの代わりに読み込む~/.codex/AGENTS.override.mdを書き込んでいたため、Codex のグローバルな指示が隠れていました。init は今後どちらのファイルも書き込みません。veto doctorは旧バージョンが残したコピーを報告し、新しいveto doctor --fix(またはveto init)は、Veto が配布したガイドとバイト単位で完全に一致する場合に限り、ファイル名を*.veto-backupに変更します。Gemini がガイドの下に保存したメモリなど、ほかの内容が含まれるファイルは報告されますが、変更されることはありません。残存ファイルがある間、AI はセッションごとに 1 回、クリーンアップを提案します。旧バージョンの init が上書きした内容は復元できません。 - バグ修正:トランスクリプトのキャプチャで、何もアーカイブされない、または誤ったチャットがアーカイブされることがあり、そのことも通知されていませんでした。 Gemini はプロジェクトフォルダーを小文字(
d:\veto)で記録しますが、保存時にはD:\Vetoとして指定されるため、大文字と小文字を区別する照合では Windows 上の Gemini のチャットが見つかりませんでした。Windows ではフォルダーの照合で大文字と小文字、およびスラッシュの向きを区別しなくなりました。veto transcripts showとpurgeは Claude Code のチャットだけを対象にしていました。Codex または Gemini のチャットを削除しようとすると「✓ Purged 0 archive(s)」と表示され、何も削除されませんでした。どちらも、任意の AI のセッション ID を受け付けるようになり、一致するものがない場合はその旨を表示します。Claude Code のチャットは、Veto のステータスラインがインストールされている場合にのみキャプチャされていましたが、今後は Claude Code 自身のプロジェクトフォルダーから見つけられます。保存時にプロジェクト名が指定されていない場合は何もキャプチャされませんでしたが、今後はそのセッションについてすでに把握しているプロジェクトが使われます。アーカイブ対象が何もない場合、すべての保存でその理由が表示されるようになりました。 - バグ修正:モデルが名乗った AI の名前でセッションが表示されていました。 Claude だと名乗ったモデルが Codex から保存したセッションは、「claude から復元」として再開されていました。実際に接続した AI が記録されるようになり、保存応答では不一致が通知され、セッションを再開すると最後に保存した AI の名前が表示されます。
veto_continueとveto_session_restoreの出力では、created_byがsaved_byに変更されました。 - バグ修正:手動で設定したステータスラインが、未インストールとして扱われていました。 Veto は
veto statusline printという完全一致のコマンドだけを認識していたため、node …/dist/cli.js statusline print、veto.cmd、npx、--captureなど、ほかの形式はすべて未設定と判断されていました。その結果、すべてのセッションに「status line not enabled」というヒントが表示され、veto statusline statusは未設定と報告し、installは--forceを要求していました。Veto のstatusline printを実行するコマンドは、どれも設定済みとして認識されるようになりました。アンインストール時には、引き続き Veto が書き込んだ完全一致の行だけが削除されるため、ほかの人が設定したコマンドが消されることはありません。 - 同梱されていますが、無効です:各 AI が学習した内容を共有するための基盤です。 Harvest-and-Share は、Claude Code、Codex、Gemini がそれぞれ独自のメモリに保存しているメモを読み取り、ほかの AI に提供します。このリリースには基盤のみが含まれています。まだ何も読み取らず、共有もしません。コマンドもまだなく、アップグレードによって有効になることのない個別のオプトインが必要です。
3.3.0
- Veto が、決定をルールとして適用するかどうかを確認するようになりました。
veto_decisionsは以前から、記録済みの決定を、退けた内容を再導入する差分を失敗させるルールに変えることができました。しかし、誰かがルールを書こうと思わなければルールは存在せず、それを促す仕組みもありませんでした。今回、評議会の判定(LLM を利用するもの)または ADR で何かが決まると、その結果に一度限りの確認が付くようになりました。AI が一行で、その決定をルールにするかどうかを尋ねます。「はい」の場合は、確認の ID を使って自分の言葉でveto_decisions addを実行し、「いいえ」の場合は新しいdeclineアクションを実行します。同じ判定について二度尋ねることはなく、行き詰まりの後に尋ねることもありません。また、長期的に残るものが何も決まらなかった判定はスキップするよう、AI に指示されます。veto_decisions listには、確認が何件提示され、承認され、辞退されたかが表示されます。この件数はお使いのマシンに保存され、アップロードされることはありません。 - 決定ルールによってレビューが停滞することはなくなりました。 ルールは
veto_diff_reviewとveto_ci_gateの内部で実行されるため、形式の不適切なパターンによってどちらも停止する可能性がありました。addは、その原因となる形式を受け付けなくなりました。200 文字を超えるパターンや、(a+)+のように、それ自体が繰り返しを含む繰り返しグループなどです。各チェックにも制限があります。追加された各行の先頭 2,000 文字だけを読み取るため、極端に長い行(たとえば、圧縮されたバンドル)の途中にある一致は検出されません。2 秒経過すると処理を停止して、その旨を報告するため、遅いルールはマージを妨げず、警告になります。以前のバージョンで保存されたルールがこれらのチェックに通らない場合は、通常のテキストとして照合されます。 - バグ修正:再開したセッションに、最後に保存した時刻ではなく開始時刻が表示されていました。
veto_continueとveto_session_restoreはセッションを最初に保存した時刻を報告していたため、開始から 18 日後に更新されたセッションは、再開時に 18 日前の状態のように見えていました。内部では、最終保存時刻が 2 つの形式で保存されており、これがさらに 2 つの不具合を引き起こしていました。セッション ID を指定せずに呼び出されたveto_continueは、あるセッションが更新され、別のセッションが同じ日に初めて保存された場合、誤ったセッションを復元することがありました。VS Code 拡張機能も同じ方法で最新のセッションを選択していました。また、veto_metricsは、今日保存され、まだ更新されていないセッションを、今日のセッションとして 0 件と数えていました。既存のレコードは、3.3.0 がデータベースを開いた初回に自動で一度だけ変換されます。時刻自体は変わりません。veto sessionsにも最終保存時刻が表示されるようになりました。
3.2.1
- バグ修正:macOS または Linux で npm や npx を通じてインストールすると、
veto-serverが起動しませんでした。 プロセスはエラーも成功ステータスも返さずに直ちに終了するため、クライアントには「initialize 中に接続が閉じられました」とだけ報告されていました。原因は、サーバーが直接実行されたのか、単にインポートされたのかを判定するチェックでした。実行中のモジュールのパスと、呼び出しに使われたパスを比較していましたが、これらのプラットフォームでは npm がコマンドをシンボリックリンクとしてインストールするため、一方はリンク経由で解決され、もう一方は解決されていませんでした。両者が一致せず、サーバーが起動しませんでした。この問題は 2.1.0 以降のすべてのリリースに存在していました。Windows では影響がありませんでした。npm が実際のパスを渡す別の種類のシムを作成するためです。そのため、この不具合はローカルテストを 10 回のリリースで通り抜けていました。また、node .../dist/server.jsを直接実行する構成(Desktop Extension バンドルを含む)にも影響はありませんでした。パッケージ化されたコマンドは、起動すべきかを推測するのではなく、無条件に起動する専用のエントリーポイントになりました。また、テストスイートはパッケージマネージャーと同じ方法でビルド済み成果物を起動するようになりました。これが不足していたチェックです。この問題は @khaliqgant が #39 で報告、診断、再現しました。
3.2.0
- トランスクリプトの取得が、Claude Code だけでなく Codex CLI と Gemini CLI でも機能するようになりました。 3つのいずれかで行ったセッションは、同じパイプラインを通じてアーカイブ、インデックス化、呼び出し、展開され、同じ同意、マスキング、保持のルールが適用されます。両アダプターはドキュメントではなく、開発マシン上にある実際のトランスクリプトすべてを対象に作成しました。対象は、6つの CLI バージョンにまたがる Codex のロールアウト12件と Gemini のチャットファイル2,365件で、認識できないレコードを出さずにすべて解析できます。また、単一のサンプルファイルからは見つけられない、2つの形式上の落とし穴も明らかになりました。Codex は各メッセージを交互に並ぶ2つのストリームに書き込み、どちらも単独では完全なレコードになりません。Gemini のログはメッセージではなく リビジョン の追記形式で、テキストが増えるたびに同じメッセージ ID の内容を再追記します。これらに対処しないと、検索で各メッセージが2回ずつ数えられてしまいます。何も破棄されません。重複したコピーも引き続き保存され、バイト単位で参照できます。ただし、インデックスには登録されません。
- Veto が Codex と Gemini のセッションを自動的に見つけるようになりました。 トランスクリプトのパスを Veto に渡すフックを備えているのは Claude Code だけです。そのため、ほかの2つについては Veto がディスク上のセッションファイルを探します。
veto transcripts sourcesは、各 CLI について実際に確認できる内容を報告します。これは、取得が有効になっていることと、現在の環境で取得が実際に機能することの違いを示します。 - Veto が、モデルの申告を信頼するのではなく、MCP ハンドシェイクから実行中の CLI を特定するようになりました。 以前は、デフォルトが
claudeのplatform引数からトランスクリプトを選んでいました。そのため、Codex で実行中のモデルがデフォルトのままにすると、エラーも出ずに何もアーカイブされませんでした。ホスト CLI はinitializeハンドシェイクから読み取るようになりました。これはモデルの申告ではなく、プロセスについての事実です。認識できないクライアントの場合は、推測するよりも誤った CLI のセッションをアーカイブするほうが問題となるため、取得をスキップします。また、検出されたホストがveto doctor/veto_healthに表示されるようになり、「何も取得されなかった」原因を特定できます。 - 深い検索で2回目の呼び出しを行う価値が生まれました。 検索は、ランク付けされたスニペットをクエリし、次にヒットを元の行まで展開する2回の呼び出しからなるループです。しかし測定の結果、実際の利用ではこのループが一度も完了していないことがわかりました。原因はランキングではなく、2つの段階の調整にありました。スニペットは平均97文字で、関連性を判断するには短すぎました。展開では保存された生の行が上限なしで返され、1回の呼び出しで最大139 KBの JSON エンベロープに達していました。これは128kのコンテキストウィンドウの約3分の1に相当します。また、目次が付くのはすべての結果が単一のアーカイブ済みセッションから得られた場合だけで、その目次が必要な複数セッションのプロジェクトでは表示されませんでした。スニペットはおよそ4倍の幅になり、展開では明示的な上限の範囲内で読みやすい会話テキストを返し、切り詰めが発生した場合はその旨を示すようになりました。目次は、結果を生成したすべてのセッションを対象とします。ランキングに変更はありません。
raw: trueは引き続き元のバイト列を完全に返します。また、拡張されたどちらの経路にも引き続きマスキングが適用され、貼り付けられたシークレットがどちらからも漏れないことをリグレッションテストで確認しています。 - 新機能:
veto transcripts metricは、Veto がすでに記録しているツール呼び出しのトレースから、トランスクリプト検索が実際に利用されているかどうかを報告します。新たな計測は不要で、検索呼び出しの形式だけを読み取り、クエリのテキストは読み取りません。ローカルのデータベースを1つ読み取るだけで、データがマシンの外に出ることはありません。そのため、これは自分自身の利用状況を確認するヘルスチェックであり、ほかの人の利用状況を示すものではありません。
3.1.2
- Veto がインストールする埋め込みテーブルが、署名付きアーティファクトになりました。 Veto は
@jigyasudham/veto-modelを特定のバージョンに固定しており、その固定先が1.0.1になりました。このバージョンは、プロベナンス(パッケージをビルドしたリポジトリ、ワークフロー、コミットを結び付ける署名付きアテステーション)付きで CI から公開されています。1.0.0は手動で公開されたため、アテステーションを付与することはできません。そこで、固定先を変更することが唯一の解決方法でした。ペイロード自体は、2 つのバージョン間でバイト単位まで完全に同一です。埋め込み、スケール、トークナイザー、ベクトルはすべて同じです。検索の動作、結果、ランキングに変更はありません。
3.1.1
- バグ修正:
veto memory export --markdownが常に失敗していました。 Markdown エクスポートでは、プロジェクトフィルターをORDER BYの後に配置してクエリを組み立てていましたが、これは無効な SQL です。そのため、ファイルを書き出す代わりにエクスポートが失敗していました。CLI は常に現在のプロジェクトでフィルターするため、このコマンドは決して成功しませんでした。プロジェクトが指定された場合、MCP ツールveto_memory_exportも同じ理由で失敗していました。プロジェクトフィルターなしのエクスポートには影響がなかったため、この問題は見逃されていました。両方のクエリを修正し、回帰テストで確認しています。
3.1.0
- セマンティック検索 — 入力した言葉だけでなく、意図した内容を検索できます。 トランスクリプト検索で、既存のキーワードインデックスとローカルのセマンティック検索を組み合わせるようになりました。そのため、質問と回答で語彙がまったく共通していなくても見つけられます。たとえば、「アップロードが失敗した理由」を検索すると、「認証情報の有効期限が切れていた」というメモが見つかります。各記録イベントは、重複するウィンドウに分割して、最も一致する部分のスコアで評価します。イベント全体を埋め込むと、質問に答える一文の情報が薄まってしまうためです。正確な識別子には影響しません。
E404は引き続き最上位にランクされます。2 つのランキングはスコアを混ぜるのではなく、逆順位で統合するため、どちらか一方のランカーが他方の結果を埋もれさせることはありません。 - マシン上でオフライン実行でき、クエリごとのコストもかかりません。 その代わりに必要となるのが、Minish Lab による potion-base-8M(MIT)を int8 に再パッケージした 7 MB の埋め込みテーブルです。このモデルは
baai/bge-base-en-v1.5から蒸留され、固定パッケージ@jigyasudham/veto-modelとして提供されます。npm のキャッシュにより、ダウンロードはマシンごとに 1 回だけです。キャプチャを有効にしているかどうかにかかわらず、Veto とともにインストールされます。不変バージョンに固定することで、実行時にダウンロード、チェックサム、ミラーの仕組みを使わなくても、リリース後にバイト列が変わることはありません。これはニューラルネットワークではなく静的なルックアップテーブルです。クエリ時に実行されるものはなく、推論コードは Veto 独自のものです。 - モデルがなくても、ほかの機能に支障はありません。 モデルは最初のセマンティッククエリ時に解決され、起動時には解決されません。そのため、モデルのコピーが見つからない、または破損している場合は、ほかのすべてに影響を与えることなく、検索がキーワードのみの検索に切り替わります。Veto 自体のパッケージサイズは変わりません。テーブルはパッケージの内容ではなく依存関係です。
- キーワード検索を含め、規模が大きい場合の検索速度が約 5 倍になりました。 50 セッションのアーカイブを対象としたプロジェクト全体の検索は、インデックスをクエリごとに再読み込みするのではなく、一度だけ読み込むことで、178 ms から 38 ms になりました。キーワードのみの検索も 65 ms から 13 ms になりました。これにより、3.0.0 に影響していたレイテンシの上限も解消されます。1 つのプロジェクトでアーカイブ済みセッションがおよそ 100 件を超えると、検索精度は徐々に低下しますが、引き続き実用的な範囲です。
- 3.0.0 のリリースノートを訂正します。 リリースノートでは、トランスクリプト検索を「SQLite FTS5/BM25」と説明していました。FTS5 は一部の Node ビルドに含まれていないため、3.0.0 の公開前に削除されていました。インデックスは一貫して、コア SQLite 上で動作する移植可能な BM25 でした。
3.0.0
- セッションを二度と失わないために — オプトイン方式の文字起こし記録と、ベクトル検索を使わない想起。 保存されたセッションには以前から約1kトークンの要約が含まれており、セッションの再開には十分ですが、「3週間前に具体的に何を結論づけたのか、そしてそれはいつだったのか」という質問には答えられません。Veto では、ホストの CLI が生成した会話の文字起こしのコピーをアーカイブし、その上にメモリピラミッドを構築できるようになりました。内容は、gzip 圧縮された元データ、決定的な事実、会話の要点、既存の要約です。メタデータの目次と、コアの SQLite のみを使うポータブルな BM25 インデックスで検索できるため、サポート対象のすべての Node で動作します。埋め込み、モデルのダウンロード、API キー、新たなランタイム依存関係は不要です。想起は
veto_session_replayを介した2回の呼び出しで行います。まず目次とランキングされたスニペットを検索し、次に該当箇所を展開して、ターンとタイムスタンプ付きの引用とともに正確な原文を取得します。実際の784行のセッションで検証し、要約からは再構成できなかった結論を想起によって特定できました。このリリースで対応しているアダプターは Claude Code のみです。 - キャプチャは有効にするまでオフで、必要な内容を明確に伝えます。
veto transcripts enableは、Veto が AI クライアント自身のセッション履歴をコピーすること、そのコピーがクライアント側の履歴より長く保持されること、アーカイブには貼り付けた内容の機密性が引き継がれること、ディスク上の保存場所を平易な言葉で説明します。その後、バージョン管理された同意を記録し、説明内容に重要な変更があった場合は再度確認を求めます。アーカイブは手元のマシンに保存され、クラウド同期ディレクトリには置かれません。設定可能な保持期間に従って削除され、veto transcripts purgeを実行すると、孤立した行を残さず関連データをすべて連鎖的に削除します。 - シークレットが AI のコンテキストに渡ることはありません。 検出された認証情報は、派生するすべてのレイヤーに取り込まれる際に
REDACTED[sha256:…]でマスクされ、さらに元データのアーカイブから返されるすべてのバイト範囲でも再度マスクされます。そのため、変更されていない元データに残っているシークレットが、想起を通じてモデルに届くこともありません。想起した内容は命令ではなくデータとして返され、ツールの結果は信頼できない入力として扱われます。 veto.dbは変更されません。 キャプチャの状態はすべてサイドカーのtranscripts.dbに保存されるため、VS Code HUD の読み取り契約に影響しません。
2.9.0
- さらに4つのエージェントが実際の分析を行うようになりました。 プライバシー、パフォーマンス、認証、互換性のエージェントは、構造化されたプレイブックでしたが、手書きの決定論的チェックを備えたデュアルモードのアナライザーになりました。個人情報(PII)/保護対象保健情報(PHI)の取り扱い、ランタイムのアンチパターン、認証の欠陥(例:JWT の
alg: none)、古い API の使用状況をチェックし、分析可能なエージェントは8から12に増えました。それぞれ、セキュリティスキャナーやシークレットエージェントの検出結果と重複しないよう対象を限定しており、すべてLLMによるアップグレードへの道筋も維持しています。 - エージェント対応ツールでLLMアップグレードの往復処理が完了できるようになりました。 エージェント対応のアドバイザー、ジェネレーター、Git ツールの全19個は、LLMアップグレード用のプロンプトを出力していましたが、推論結果を渡す方法がありませんでした。各ツールが
agent_responseパラメーターを受け付けるようになりました。ツールを呼び出し、専門エージェントとして推論した後、構造化 JSON を指定して再度呼び出すと、アップグレードされた結果を取得できます。いずれの場合も決定論的な回答は必ず返され、アップグレード結果はそれに付随するもので、置き換わることはありません。 - Council の判定がプロジェクト単位になりました。 VS Code HUD と CLI のステータス行に表示される最新の判定は、以前は全体で最新の Council 議論だったため、別のワークスペースの結果が表示される場合がありました。Council の結果に
project_dirが追加されました(既存の行に列を追加し、関連付けられたセッションから値を補完する、冪等な移行処理が一度だけ実行されます)。ステータス行ではアクティブなワークスペースに判定を限定し、明示的なproject_dirを指定せずに議論を実行した場合は、プロジェクトを指定せずに保存するのではなく、アクティブなプロジェクトが使われます。プロジェクトにまだ議論の結果がない場合は、別のフォルダーの結果を流用せず、判定の表示が単に消えます。 - 拒否ツールは再実装せず、呼び出すようになりました。 性能の低いモデル(例:Gemini Flash)は、単独の
veto_*コマンドを手作業で行うタスクだと解釈することがありました。ソースからツールをリバースエンジニアリングし、使い捨てスクリプトを書き、データベースを直接操作していたため、捏造された、対象範囲の誤った結果が生じていました。常に表示される使用指示と、veto_continue/veto_handoff/veto_session_saveに対する明示的なトリガーにより、すべてのクライアントに、稼働中の MCP ツールを直接呼び出すよう指示します。
2.8.0
- 決定論的な Council の判定が再び正確になりました。 LLM 対応の経路なしで Council を実行すると、各専門エージェントは以前、タスクに無関係な定型の「トピック」警告を出していました。広範なキーワード照合により(タスクで「テスト」や「計画」に言及するなど)、定型的な懸念事項が出力されて積み重なり、実際のシグナルがないまま YELLOW 判定を招いていました。こうしたトピックに関する洞察は、現在、投票に影響しないアドバイスになっています。エージェントは承認に投票し、判定に影響しない 💡
[advisory]の注記としてガイダンスを提示します。Devil's Advocate は引き続き必ず異議を唱えますが、トピックの調査によって判定がエスカレートすることはなくなりました。具体的なルールへの一致(ハードコードされたシークレット、localStorageのトークン、GPL ライセンス、レート制限の欠如など)は、これまでどおり判定をエスカレートさせます。 - VS Code HUD が、あらゆるワークスペースでセッションとメモリを見つけられるようになりました。 セッションとメモリは
project_dirによってワークスペースと照合されますが、以前は呼び出し元から渡されたドライブ文字の大文字・小文字をそのまま保存していました(通常は大文字のD:\)。一方、拡張機能は VS Code のfsPath(ドライブ文字が小文字で、大文字・小文字を区別)を使って照会していたため、保存に成功していても HUD に「アクティブなセッションはありません」/「メモリエントリー 0 件」と表示されていました。現在は読み取りと書き込みのたびにproject_dirが正規化され(Windows のドライブ文字を小文字に統一)、次回起動時に既存の行を修正する冪等な移行処理が一度だけ実行されます。
2.7.4
node:sqliteがないランタイムでもサーバーが動作するようになりました。 sqlite の組み込み機能(Node ≥ 22.5)は、インポート時ではなく、初めてデータベースを使用するときに遅延読み込みされるようになりました。古い Node やレジストリの機能スキャナーなど、この機能がないランタイムでも、サーバーは起動してinitializeに応答し、93 個すべてのツールを一覧表示できるようになりました。永続化ツール(memory、sessions、learning)のみが、「Node をアップグレードしてください」という明確なエラーを返します。MCP ハンドシェイクの前にプロセス全体が終了することはありません。対応する Node での動作に変更はありません。同じデータベース、同じスキーマ、同じクエリを使用します。- クラッシュしないステータスラインの
printにも同じ対応を適用しました。読み取り専用の DB を開く処理で、既存の例外を決してスローしないガード内で sqlite を必要とするようになりました。
2.7.3
- グローバル CLI インストールを、ドキュメントで案内する方法として復活させました。 2.7.1 では、グローバルコピーが npx をシャドウし、MCP サーバーを古いバージョンに固定する可能性があったため、すべての
npm i -gの推奨を削除しました。しかし、2.7.1 自体の@latestピンによってそのシャドウ化は起きなくなり、README には PATH にvetoを追加する方法がないまま、15 個のプレーンなvetoコマンドだけが記載されていました。CLI のインストール方法としてnpm i -g @jigyasudham/vetoをドキュメントに記載するようになりました(新しいはじめにセクション)。MCP サーバーは、ピン留めされた npx 設定によって引き続き自動更新されます。 veto doctorがグローバルインストールを問題扱いしなくなりました。 グローバル CLI のインストールを正常と報告し、レジストリのバージョンより古い場合にのみ警告(修正方法としてnpm i -g @latestを表示)し、グローバルインストールがない場合は参考情報を表示するようになりました。トラブルシューティングの説明と起動時の更新案内も、「グローバル版を削除」ではなく「グローバル版を更新」という内容に合わせて更新されました。veto statusline installが PATH を確認するようになりました。 ステータスラインのホットパスでは、プロンプトを描画するたびに実行するには遅すぎる npx ではなく、プレーンなvetoを呼び出します。そのため、vetoが PATH にない場合、インストール時に何も表示されないままになるのではなく、警告を表示するようになりました。- npm パッケージの展開サイズを 22.6 MB から 2.2 MB に削減しました。
package.jsonにfilesの許可リスト(dist/とserver.json)を追加したため、20 MB のmcp-publisher.exe(2.5.0 以降、同梱されていました)を含むローカルの作業ファイルは、パッケージに含まれなくなりました。すべてのユーザーで npx の初回起動が速くなります。
2.7.2
veto initが壊れた Claude Code の登録を自動修復します。 ユーザースコープのvetoMCP エントリがnode <script>を起動するものの、そのスクリプトが存在しなくなっている場合(npm rm -gによって削除されたグローバルインストールのdist/server.jsを指す古いエントリが典型例です)、initは「登録済み」としてスキップするのではなく、正規のピン留めされた npx コマンドで再登録するようになりました。明らかに実行不能なnodeパスのエントリのみを変更し、動作中の設定やカスタム設定には手を加えません。- Windows:Claude の登録で
npx.cmdを使用します。 Windows では Claude Code がプレーンなnpxを解決できないため、veto initは Windows 上で Claude Code をnpx.cmdを使って登録するようになりました。これは安定して接続できる形式です。
2.7.1
- 修正:
npxが古いバージョンを黙って実行することがありました。 生成される MCP 設定では、バージョンを固定しない--package @jigyasudham/vetoを使用していたため、npx は最新を取得せず、キャッシュ済みまたはグローバルにインストールされたコピーを再利用していました。そのため、再インストールして再起動してもアップグレードされませんでした。生成されるすべての設定と、ドキュメントに記載された登録コマンドで@latestを指定するようになりました。これにより、npx は起動のたびにレジストリでバージョンを再解決するため、クライアントを再起動すると自動更新されます。また、npm i -g @jigyasudham/vetoの推奨はすべて削除しました(グローバルインストールこそが、そもそも npx より優先される原因です)。 - 起動時のアップデート通知。 新しい Veto が公開されると、実行中のサーバーが MCP の
instructionsフィールドを通じてエージェントに「アップデートが利用可能です。反映するには再起動してください」という1行のヒントを表示します。処理を妨げず、オフラインでも安全です。最新バージョンのキャッシュを読み取り、バックグラウンドで1日に最大1回更新します。最新の状態になると通知は自動的に消えます。 veto --version/-v。 以前は「Unknown command」が返されていました。veto doctorでも、新しいバージョンが利用可能かどうかを報告するようになり、優先されてしまうグローバルインストールがある場合はnpm rm -gで修正するよう案内します。- 説明の修正。 レジストリ/ディレクトリの説明を「API コストゼロ」から「API キー不要」に変更しました(トークンごとの従量課金 API では、サンプリング呼び出しにも料金が発生します)。
2.7.0
- ステータスラインに凍結された集計値ではなく、リアルタイムのセッションゲージを表示。 以前のトークン表示は、Veto のツールでしか増加しない Veto 独自の
rate_usageテーブルを参照していたため、通常の使用中は値が更新されませんでした。veto statusline printは、Claude Code がstatusLineコマンドの標準入力に渡す JSON を読み取り、3つのリアルタイムゲージを表示するようになりました。ctx N%(コンテキストウィンドウの使用率)、5h N%(5時間のレート制限)、7d N%(週間レート制限)です。各ゲージは70%以上で黄色、90%以上で赤色になり、値を取得できない場合(セッション開始直後//compactの実行後)は非表示になります。たとえば⬡ veto GREEN · router 94% · ctx 37% · 5h 74% · 7d 8% · mem 15のように表示し、ニュートラルな⬡ vetoにフォールバックします。また、TTY ガードと200ミリ秒のタイムアウトにより、クラッシュを防ぎ、処理を妨げません。Veto 独自のプラットフォーム別日次集計は、引き続きveto_rate_status/veto_snapshotで利用できます。 - 初回起動時のステータスライン案内。 ステータスラインがインストールされるまで、Veto は MCP の
instructionsフィールドを通じてエージェントに1行の案内を表示します。コマンドの奥に隠れず、機能を見つけやすくします。ユーザーの同意を尊重し(同意なしにsettings.jsonを編集しません)、インストール後は案内が自動的に消えます。 veto statusline print --capture <file>。 表示された行とともに Claude Code の生のペイロードを追記する診断機能です。リアルタイムゲージの値を、クライアントが実際に送信した値と照合できます。デフォルトでは無効で、ベストエフォートで動作し、描画を妨げることはありません。
2.6.0
veto statusline— あらゆる AI CLI のプロンプト下に Veto の簡潔な行を表示。veto statusline installは Claude Code の settings.json にstatusLineコマンドを設定します(バックアップを作成し、uninstallするとバイト単位で元に戻します)。printの処理経路は読み取り専用で、高速かつクラッシュしにくく、たとえば⬡ veto GREEN · router 94% · claude 42% · mem 15のように表示します。DB がない場合やロックされている場合は、ニュートラルな⬡ vetoにフォールバックします。VS Code の HUD だけでなく、あらゆるターミナルで Veto ユーザーが利用できるよう、CLI に搭載されています。veto_snapshot— エディター/HUD 向けの一括集約。{ session, council, routerTop, rate, memoryCount, health }を1回の読み取り専用呼び出しで返すため、エディター連携(veto-vscode)は内部テーブルを直接読み取る必要がなくなります。ツール数は93になりました。- 読み取り契約の安定したバージョン管理。
veto.dbは、開くたびにPRAGMA user_version(VETO_DB_SCHEMA_VERSION)を設定するようになりました。これにより、外部の読み取り側はスキーマの不整合を検知し、情報を黙って空にするのではなく、適切に機能を縮退できます。
2.5.0
veto_drift_check— 複合エラーのサーキットブレーカー。 直近のツール呼び出しトレースをスキャンし、連続した失敗、繰り返されるエラーメッセージ、単一ツールの過剰な連続使用を検出したうえで、debuggerエージェントを実行し、具体的な復旧手順を提示します。複合エラーのサーキットブレーカーを参照してください。- Council のキャリブレーションを修正。 決定論的な Council のパターントリガーを厳密化し、一般的な単語(例:「server」「transport」)や
v2.5.0のようなセマンティックバージョン文字列で誤作動しないようにしました。また、エージェントの推論に残っていた古いハードコードのツール数を削除しました。
2.4.0
veto_decisions— 意思決定ドリフトの強制。 アーキテクチャ上の決定を機械で検証可能な制約として一度記録すると、veto_diff_reviewとveto_ci_gateが、追加行によって禁止パターンが再導入されるあらゆる差分を自動的に失敗させます。意思決定ドリフトの強制を参照してください。
2.3.0
veto_dep_verify— 依存関係の幻覚を防止。 インストール前に、提案されたすべてのパッケージを稼働中の npm/PyPI/crates.io レジストリで検証し、幻覚による名前やタイポスクワッティングを検出します(スロップスクワッティング対策)。依存関係の幻覚防止を参照してください。
2.2.0
- コンパクトモード(
VETO_COMPACT=1)—veto_find_tools/veto_callメタツールを含む 9 個のツールを公開し、スキーマを約 5~6 倍削減します。コンパクトモードを参照してください。 - 暗黙的な結果の抽出 —
veto_learning_statsがツール呼び出しトレースから結果を自動的に抽出するようになりました(エラーになった呼び出し、短時間での再実行)。veto_record_outcomeを手動で呼び出す必要はありません。 - ストリーム可能な HTTP トランスポート(実験的)(
veto-server --http)。HTTP トランスポートを参照してください。
HTTP トランスポート(実験的)
veto-server --http [port] は、stdio の代わりに、ストリーム可能な HTTP を通じて http://127.0.0.1:<port>/mcp で MCP を提供します(デフォルトのポートは 3939)。ゲートウェイ、リモートクライアント、サブプロセスを起動できない環境などで利用できます。ステートレスで動作し(セッション ID はありません。2026 年 7 月の MCP 仕様が目指す方向です)、ループバックインターフェースのみにバインドします。意図的に外部へ公開する場合は VETO_HTTP_HOST を設定してください。
プロジェクト構成
Veto は、93 個のツール、MCP リソース、プロンプトを登録し、各ツールの呼び出しをドメインごとのハンドラーレジストリ経由でディスパッチする単一の MCP サーバー(src/server.ts)です。巨大な switch 文はありません。各ドメインは、src/server/handlers/ 配下に HandlerMap モジュールを持ちます。
| モジュール | ツール | ドメイン |
|---|---|---|
workers.ts | 15 | 単一エージェントによる作業の委任(code_review、security_scan、explain、…) |
generators.ts | 11 | 単一エージェントによる成果物の生成(adr、diagram、rca、doc_gen、onboard、…) |
memory.ts | 9 | ナレッジベース、パターン、プロジェクトマップ |
observability.ts | 7 | ヘルス、メトリクス、使用状況、監査、コンテキスト/レートのステータス |
advisors.ts | 8 | プロジェクトスキャナー(dep、query、bundle、dead-code、flag、openapi、HITL、drift-check) |
session.ts | 6 | 保存 · 復元 · 一覧表示 · 引き継ぎ · 続行 · 再生 |
review.ts | 5 | diff · ci · pr · フルレビューとコミット前パイプライン |
git.ts | 5 | blame · changelog · コミットメッセージ · PR の説明/投稿 |
core.ts | 5 | ステータス · ルーティング · プラットフォームのセットアップ · ドキュメントの取得 · 検出 |
agents.ts | 5 | agent_plan · execute_parallel · delegate · workflow · task_parse |
devtools.ts | 5 | プラグイン · ローカル LLM · クローン検出器 · compose · IDE への通知 |
council.ts | 3 | council_debate · benchmark · new_feature |
learning.ts | 3 | record_outcome · learning_stats · learning_apply |
watch.ts | 3 | 監視 · ポーリング · 停止 |
共有され、個別にテストできる内部モジュールは src/server/ にあります。
registry.ts—ToolContext({ request, args, server })とHandlerMapの型runtime.ts— 共有の可変状態(アクティブなプロジェクトディレクトリ、自動保存、サーバーのヘルス、VERSION)scan-core.ts— git 差分リーダー、トリプルスキャン、エージェント型ワーカーループ(ユニットテスト済み)
すべてのハンドラーモジュールは単独でインポートできるため、動作は tests/server/dispatch.test.ts(callTool の動作を網羅するテスト)と tests/tools/definitions.test.ts(89 個のツールのレジストリ網羅性チェック)でテストされています。
技術スタック
- 言語: TypeScript(strict モード)
- ランタイム: Node.js 22.13+ または 23.4+(組み込みの
node:sqliteを使用。ネイティブコンパイルは不要)。22.5 から利用できますが、--experimental-sqliteが必要なため、実質的な最低バージョンは 22.13 です。 - 依存関係:
@modelcontextprotocol/sdkのみ。パッケージは 1 つで、ネイティブアドオンはありません。 - メモリ: ローカル SQLite。設定不要、オフラインで動作し、JSON エクスポートで持ち運び可能です。
- プラットフォーム: Claude Code · Gemini CLI · Antigravity CLI · Codex CLI · Cursor · Windsurf · Zed
ライセンス
MIT © 2026 Jigyasu Dham
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。