Suvadu について
Suvadu は、検索可能なコマンド履歴と AI エージェントのセッション情報を扱う、開発者向けのローカル保存型 CLI です。SQLite に実行情報を記録し、MCP 経由で既定では読み取り専用のツールを提供します。
主な機能
- 01SQLite ベースのコマンド履歴
- 02コマンド記録の検索と閲覧
- 03AI エージェントのセッション記録
- 04コマンドとプロンプトの追跡
- 05失敗コマンドとリスクの分析
- 06共有スキルとブックマークの管理
活用シーン
- 01以前実行したコマンドの検索
- 02エージェントセッションのコマンドとプロンプトの確認
- 03実行情報を使った失敗コマンドの調査
- 04プロジェクトスキルとコマンドテンプレートの共有
MCP 対応
MCP サーバーは既定で読み取り専用のツール 22 個、リソース 8 個、プロンプト 6 個を公開します。書き込みツール 2 個は明示的な有効化が必要で、クライアントからセッション、プロジェクト、失敗、リスク、スキル、ブックマークの情報を参照できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
ターミナルのすべてを記録。AI エージェント間で共有できるメモリ。
Suvadu は、シェルの履歴を SQLite ベースのストアに置き換えます。すべてのコマンドに、終了コード、実行時間、ディレクトリ、実行ツール、セッションといった構造化されたコンテキストが記録されます。AI エージェントは MCP 経由でこれを照会できます。データはすべてローカルに保存されます。
- 主張ではなく、測定結果 — 1 台の M4 Max で 100,000 件を記録した場合、コマンド記録の p95 は 207 µs、履歴全体を対象とした評価付き検索の p95 は 0.05~15 ms です。1 台のマシンでの 1 回の実行結果です。ハーネス、コーパス、未測定の項目については BENCHMARKS.md をご覧ください。
- AI エージェントの追跡 — Claude Code、Codex、OpenCode、Cursor(トークン使用量を除く)ではセッション全体を記録します。pi.dev ではコマンドとプロンプト、Antigravity のエージェントではコマンドを記録します。Windsurf、Aider、Continue、Copilot ではコマンドのタグ付けのみを行います(各ティアで記録される内容)。
- プロンプトエクスプローラー — 記録されたすべてのコマンドを、実行のきっかけとなったプロンプトまでたどれます。
- MCP サーバー — 読み取り専用のツール 22 個、リソース 8 個、プロンプト 6 個を提供し、デフォルトですべて読み取り専用です。 書き込みツール 2 個は、オプトインを有効にするまで使用できません。エージェントセッションの検出、プロジェクトのコンテキスト、失敗からの学習、リスク評価、共有スキルライブラリ、ブックマークしたコマンドテンプレートを利用できます。
suv settingsで設定できます。 - 100% ローカル — クラウド、テレメトリー、アカウントは不要です。Suvadu が独自に行うリクエストは、新しいリリースを 1 日に 1 回確認するものだけで、無効にできます。MIT ライセンスです。
ウェブサイトとドキュメント: suvadu.sh · CLI リファレンス: suvadu.sh/cli · ブログ: suvadu.sh/blog · 更新情報: CHANGELOG
インストール
# Homebrew (macOS & Linux)
brew tap AppachiTech/suvadu && brew install suvadu
# Install script (macOS & Linux)
curl -fsSL https://downloads.appachi.tech/suvadu/install.sh | bash
# Install script, into ~/.local/bin without sudo
curl -fsSL https://downloads.appachi.tech/suvadu/install.sh | bash -s -- --user
# Cargo (Rust 1.95 or newer)
cargo install suvadu
インストールスクリプトは suv を /usr/local/bin に配置します。このディレクトリに書き込めない場合に限り、sudo を使用します。別の場所を選ぶには、--user または --dir DIR(あるいは SUVADU_INSTALL_DIR)を指定してください。スクリプトを再実行すると、スクリプトでインストールした suv が既にある場所で更新されます。スクリプトが suv の隣に作成する suvadu リンクで、スクリプトによるインストールかどうかを判別します。変更がない場合、ダウンロードは行いませんが、そのリンクは修復します。PATH 上の suv が Homebrew または Cargo からインストールされたものなら停止し、そのパッケージマネージャーの更新コマンドを表示します。インストールスクリプトがインストールしたものではない、その他の suv には手を加えません。--user または --dir を指定すると、意図的に別のコピーをインストールします。
ターミナルで実行すると、以下のシェルフックを ~/.zshrc(Linux では ~/.bashrc)に追加するかどうかを尋ねます。まず追加する行を表示し、y と入力しない限り何も書き込みません。また、ファイルのコピーを .suvadu-backup として保存し、シェルフックが二重に追加されることはありません。--no-modify-rc を指定すると、この確認を無効にできます。
次に、シェルフックを追加します。
# Zsh
echo 'eval "$(suv init zsh)"' >> ~/.zshrc && source ~/.zshrc
# Bash
echo 'eval "$(suv init bash)"' >> ~/.bashrc && source ~/.bashrc
確認するには、suv status を実行してください。
各コマンドは、実行時のディレクトリと、Git リポジトリ内の場合は実行開始時のブランチ名(detached HEAD の場合は短縮コミットハッシュ)とともに記録されます。ブランチはリポジトリのファイルから読み取るため、プロンプトで git が実行されることはありません。ブランチはリコールの詳細ペインに表示されます。cd ../other のようにディレクトリを変更するコマンドは、入力したときのブランチに記録されます。ブランチを切り替えるコマンドは、切り替え先のブランチに記録されます。suv settings の Git ブランチを記録、または [shell] capture_git_branch = false で無効にできます。
最新の状態を維持する。 Suvadu は1日に1回、バックグラウンドで最新リリースのバージョン番号を確認します(suv update が読み取るものと同じ version.txt です)。より新しいバージョンがある場合、ターミナルでコマンドを実行する前に1行で通知します。通知は1日に最大1回で、インストール方法に応じた更新コマンド(brew upgrade suvadu、cargo install suvadu、または suv update)も表示されます。あなたに関する情報や履歴が送信されることはありません。シェルフック、リコール、スクリプト、パイプ、CI で実行されることもありません。suv settings の 更新を確認、config.toml の [update] check = false、または SUVADU_NO_UPDATE_CHECK=1 で無効にできます。
上矢印キーでの呼び出し
zsh では、フックが読み込まれるとすぐに、上矢印キーと下矢印キーで Suvadu から履歴を呼び出せるようになります。ほかに設定は必要ありません。上矢印キーを押すと、入力済みの文字列で始まる最新のコマンドが呼び出され、続けて古いコマンドが新しい順に表示されます。同じミリ秒に記録されたコマンドの優先順位を決める場合に限り、現在のディレクトリが使われます。下矢印キーを押すと、入力済みの文字列に向かって履歴を戻ります。呼び出されるのは自分で入力したコマンドだけです。Alt+A を押すと、そのシェルで AI エージェントのコマンドも表示されます。
- 無効にするには、
suv settingsの Shell タブにある Enable Arrow Key Navigation をオフにするか、config.tomlで[shell] enable_arrow_navigation = falseを設定します。この設定は新しいシェル(またはexec zsh)から有効になり、zsh 本来の上矢印キーと下矢印キーの動作が保たれます。Alt+Aには影響しません。 - Bash はまだ対象外です。 Bash のフックが割り当てるのは
Ctrl+Rのみです。上矢印キーと下矢印キーでは、引き続き Bash 本来の履歴が使われます。 - 確認するには、
bindkey '^[[A'を実行すると"^[[A" suvadu-up-arrowと表示され、bindkey '^[OA'(多くのターミナルが送信するシーケンス)を実行すると"^[OA" suvadu-up-arrowと表示されるはずです。 - 上矢印キーが別の動作をする場合は、
eval "$(suv init zsh)"の後に読み込まれたプラグインがキー割り当てを上書きしています。oh-my-zsh のキー割り当て、zsh-history-substring-search、zsh-vi-mode、fzf のキー割り当て、atuin、mcfly は、いずれも上矢印キーを割り当てます。~/.zshrcのeval "$(suv init zsh)"の行を、プラグインマネージャーとプラグインの後に移動して最後に配置し、その後exec zshを実行してください。ZSH_AUTOSUGGEST_STRATEGYのような通常の設定は、その後に置いても問題ありません。zsh-vi-mode は最初のプロンプトでキーを割り当てるため、読み込み前にZVM_INIT_MODE=sourcingも設定してください。 suv doctorで確認できます。 zsh ごとに一度、最初のプロンプトが表示されたとき(~/.zshrcの実行がすべて終わった後)に、フックは上矢印キーが引き続き Suvadu に割り当てられているかを確認し、別の設定に上書きされていればその内容を記録します。doctor の Up-arrow 行に、そのウィジェット名と対処法が表示されます。後から起動した zsh で上矢印キーが再び Suvadu に割り当てられていることが確認されると、この記録は削除されます。この確認では何も表示されず、シェル起動ごとの所要時間は約 0.8 ms(BENCHMARKS.md)です。矢印キーでのナビゲーションが無効な場合は実行されません。
zsh-autosuggestions。 zsh フックには、zsh-autosuggestions 向けのストラテジーが用意されています。入力済みの文字列で始まる最新のコマンド、つまり上矢印キーで呼び出されるコマンドを提案します。Alt+A で表示させない限り、AI エージェントのコマンドは候補に含まれません。候補がない場合は zsh 本来の履歴に切り替わるよう、~/.zshrc で次のように有効にしてください。
ZSH_AUTOSUGGEST_STRATEGY=(suvadu history)
候補の表示にはそれぞれ suv get による検索が 1 回行われます。検索にかかる時間は BENCHMARKS.md に記載されています。zsh-autosuggestions 0.7 はデフォルトで候補を非同期に取得するため、入力が待たされることはありません。
トラブルシューティング
古いパスを指す no such file or directory エラーが表示される場合(例:suv:8: no such file or directory: /opt/homebrew/bin/suv)— シェルフックは、セッション開始時に suv バイナリの絶対パスを記録します。バイナリを移動した場合(パッケージマネージャーの切り替え(例:Homebrew → Cargo)、brew unlink suvadu の実行、またはアンインストール後に別の場所へ再インストールした場合など)、すでに開いているシェルは、削除された古いパスを参照し続けます。シェルを再読み込みして、新しい場所を反映してください。
exec zsh # or: exec bash
(または、新しいターミナルを開いてください)。また、~/.cargo/bin などの新しい場所が PATH に含まれていることも確認してください。
上矢印キーで Suvadu ではなく zsh 本来の履歴が表示される場合 — 確認方法:bindkey '^[[A' または bindkey '^[OA' を実行すると、suvadu-up-arrow 以外のウィジェット(up-line-or-beginning-search や history-substring-search-up など)が表示され、suv doctor の Up-arrow 行には、何がキー割り当てを上書きしたかが表示されます。原因:フックの後に読み込まれたプラグインがキーを上書きした、矢印キーでのナビゲーションが無効になっている(suv settings の Enable Arrow Key Navigation)、またはシェルが Bash であるため、上矢印キーで Bash 本来の履歴が表示されている可能性があります。対処方法:eval "$(suv init zsh)" を ~/.zshrc の末尾に移動して exec zsh を実行するか、設定を再び有効にしてください。上矢印キーでの呼び出しも参照してください。
詳細は suvadu.sh/cli/shell-integration をご覧ください。
クイックスタート
suv # Home: find any feature by what you want to do (also suv home)
suv search # Interactive search TUI (also Ctrl+R)
suv history # Print last 25 commands (pipeable)
suv history --json -n 100 # Last 100 commands as JSONL
suv stats # Stats dashboard with heatmap
suv replay --after today # Timeline of today's commands
suv sessions # Browse shell and AI sessions together
suv doctor # Check installation health
suv agent dashboard # Monitor AI agent activity
suv agent prompts # Browse prompts and their commands
suv agent sessions # List captured Codex/Claude sessions and reported tokens
suv skills # Interactive skills management (browse, add, edit, sync, review)
suv skills add my-skill # Add a skill any MCP-capable agent can read
suv skills sync # Materialize skills into Claude Code/Cursor/Codex
suv skills trust # Trust this repo's .suvadu/skills/*.md so sync writes them
suv bookmarks get box --set host=db1 # Print a bookmark with its {{placeholders}} filled
リポジトリ内のチームスキル
スキルはコードの隣に、.suvadu/skills/ 内の Markdown ファイルとして1つずつコミットします。
---
name: release # optional; defaults to the file name (release.md)
description: How we cut a release
triggers: [release, tag]
targets: [claude-code, codex] # optional; default: every agent
---
1. Bump the version in Cargo.toml.
2. Tag, then push the tag.
リポジトリをクローンした人は誰でもスキルを取得できるため、Suvadu は内容を読むまでスキルを信頼できないものとして扱います。
suv skills list # repo skills show origin 'repo' and 'untrusted'
suv skills show release # read one (its file path, trust, body)
suv skills trust --dry-run # list this repository's skills and their state
suv skills trust # trust them (or: suv skills trust release)
suv skills sync # from the repository root: writes them like project skills
- プロジェクトとは、現在の場所から上にたどって見つかる最も近い
.suvadu/skills/フォルダーを持つディレクトリです。ただし、git リポジトリのルートより上にはたどりません。リポジトリスキルはそのディレクトリから同期され、プロジェクトスキルの配置先と同じ.claude/skills/、.cursor/rules/、AGENTS.mdに配置されます。 - 信頼状態は、ファイルの内容のハッシュを使ってファイルごとに記録されます(別のチェックアウトの場合は
suv skills trust --repo PATH)。ファイルが変更されると(たとえば pull の後)、そのファイルは「信頼後に変更された」状態になります。次回の同期では、そのファイルの書き込みが停止され、Suvadu が書き込んだコピーが削除されます。再び信頼するまで、この状態は続きます。suv skills untrustで信頼を取り消すと、次回の同期でコピーが削除されます。 - Suvadu はリポジトリスキルのファイルを編集、移動、削除することはありません。ファイルを直接編集してください。
suv skillsでは読み取り専用として表示され、パスも示されます。edit、rm、disableは拒否され、変更すべきファイルが示されます。 - 信頼されたリポジトリスキルは、同じプロジェクトに適用される同名のライブラリスキルに置き換わり、そのプロジェクトではグローバルスキルより優先されます。同期時にはその旨が示されます。信頼されていないリポジトリスキルは何も変更しません。
- ファイルを削除すると、次回の同期で同期済みのコピーが削除されます。ただし、Suvadu が書き込み、その後誰も編集していないコピーに限ります。
- MCP を通じて
list_skills、get_skill、search_skillsを実行すると、エージェントが指定したプロジェクト(scope)、またはサーバーが実行されているプロジェクトのリポジトリスキルが、source repo、ファイルパス、信頼状態とともに含まれます。信頼されていないスキルや変更されたスキルは、名前とパスのみが一覧表示されます。信頼するまで説明と本文は提供されません。 - 名前に英字、数字、
-、_以外が含まれるファイル、シンボリックリンク、256 KB を超えるファイル、UTF-8 ではないファイル、本文がないファイル、またはtargetsに未知のエージェントが指定されているファイルは、名前を示す警告とともにスキップされます。
プレースホルダー付きブックマーク
ブックマークをテンプレートにできます。
suv bookmarks add "ssh {{user:root}}@{{host}} -p {{port:22}}" -l box
suv bookmarks # pick it: a popup asks for user, host, port
suv bookmarks get box --set host=db1 # prints: ssh root@db1 -p 22
{{name}}はプレースホルダーです。{{name:default}}のようにすると、デフォルト値を指定できます(最初の:より後はすべてそのまま使われます)。名前の先頭には英字または_を使い、その後には英字、数字、_、-を使えます。{{ name }}のように空白を入れても構いません。- 同じプレースホルダーが複数回使われていても、入力を求められるのは1回だけです。入力した値はすべての箇所に反映されます。
\{{はリテラルの{{です。プレースホルダーではない二重波括弧内の文字列は、その他の場合は入力されたとおりに保持されます。たとえばdocker inspect -f内の{{.State.Status}}や、対応する}}がない{{などです。- 値はそのまま挿入されます。シェル構文を入力するため、空白や
$を含む値はシェルで必要な方法で引用符で囲んでください。 - ピッカーのポップアップでは、
Tab/Enterで次の値に進みます。最後の値でEnterを押すと、入力済みのコマンドがプロンプトに表示されます(実行はされません)。Escを押すと一覧に戻ります。プレースホルダーに値もデフォルト値も設定されていない場合、suv bookmarks getは該当する名前を示して失敗します。 - 入力した値が保存されることはありません。
- MCP の
list_snippetsツールでは、各ブックマークのプレースホルダーとデフォルト値を含めてブックマークが一覧表示されます(読み取り専用)。そのため、エージェントは入力し直す代わりにsuv bookmarks get … --set …を使って値を設定できます。
機能を探す:suv
suv 単独(または suv home)を実行すると、Home が開きます。これは、Suvadu でできることをタスク別にまとめた検索可能な一覧です。
コマンドを探す、セッションを確認する、コマンドを整理する、自分のアクティビティを把握する、AI のアクティビティを確認する、ツールを接続する、Suvadu を管理するといった項目があります。failed、
backup、prompts、atuin などの語で機能を検索できます。履歴は検索されません。それぞれの機能には、何ができるかと、それに対応する実際のコマンドが表示されます。
Enter キーを押すと選択した項目が開きますが、シェル内で何かが実行されることはありません。
- 画面(設定、セッション、統計、エージェントダッシュボードなど)は、シェルから開いた場合と同じように開きます。Esc キーを押すと、元の場所に戻ります。
- ピッカー(検索、ブックマーク)には選択したコマンドが表示され、コマンドをコピーボタンが使えます。コマンドは実行されていません。コマンドをプロンプトに入力するには、引き続きシェルから
Ctrl+Rを使います。 - レポート(ステータス、doctor、バージョン、履歴、タグ、エージェントレポート)は Home 内に表示されます。
- データやシェルを変更する操作(インポート、削除、更新、一時停止、シェルのセットアップ)では、コピー可能な例を含む手順が開きます。
F1 ではキーの一覧が表示され、F2 ではコマンドリファレンスが開きます。コマンドリファレンスには、概要を表示する suv --help と、各コマンド固有のヘルプが記載されています。
引数なしの suv で従来のコマンド概要を表示するには、suv settings で Startup Screen を help に設定するか、config.toml に次のように設定します。
[home]
startup = "help" # or "home" (the default)
icons = "ascii" # or "unicode" for the category markers
この設定は自身の設定ファイルからのみ読み込まれ、プロジェクトの .suvadu.toml から変更することはできません。スクリプト、パイプ、TERM=dumb の場合は、これまでどおり概要が標準エラー出力に表示され、終了ステータスは 2 になります。そのため、対話形式ではない環境で引数なしの suv を実行する動作は変わりません。設定にかかわらず、suv home は Home を開き、suv --help は常に概要を表示します。
履歴検索の照合と順位付け
照合では、どのコマンドが対象になるかを決め、スコープではどこを検索するかを決め、順位付けでは順序だけを決めます。これらは個別に制御され、一つを変更しても、ほかの動作は変わりません。
照合 — --match、または検索 UI で ^X:
| モード | ルール |
|---|---|
terms(デフォルト) | 空白で区切られたすべての単語が、順序を問わず部分文字列として含まれている必要があります。該当するものがない場合は、区切り文字を無視して同じ単語で検索します(下記参照)。 |
literal | 空白や句読点も含め、入力どおりのクエリ全体が含まれている必要があります。 |
prefix | コマンドがクエリで始まる必要があります。 |
fuzzy | クエリ内の文字が、間に文字が入ってもよいので、順番どおりに含まれている必要があります(gco で git checkout が見つかります)。 |
単語はすべて AND 条件で評価され、OR 条件にはなりません。引用符による構文はなく、句読点が取り除かれることもないため、git-push は一つの単語として扱われます。照合では大文字と小文字を区別しません。
terms と fuzzy では Unicode の大文字・小文字も変換されます。ÉCHO で écho が見つかり、σ で ΟΔΟΣ が見つかり、straße で STRASSE が見つかります。terms では、これが適用されるのは ASCII 以外の文字を含む単語です。ASCII だけで入力された単語は検索インデックスで検索され、ASCII の大文字・小文字だけが変換されるため、STRASSE で straße は見つかりません。fuzzy ではクエリ全体が変換されます。literal と prefix は SQLite の LIKE で処理され、大文字・小文字の変換は ASCII に限られます。言語固有のルールはありません。トルコ語の İ は i と結合ドットに変換され、ドットのない ı は別の文字のままです。どのモードでもデータベース内で対象を絞り込むため、該当項目の古さによって見つかるかどうかが決まることはありません。
区切り文字 — 唯一のフォールバックです。 現在のスコープとフィルターで terms クエリに一致するものが何もない場合、区切り文字を無視して再度検索します。空白、-、_、.、/、: は、入力した単語とコマンドの両方から取り除かれます。これにより、hiveagent は hive-agent、hive_agent、hive.agent、hive/agent、hive:agent を見つけ、hive-agent は hiveagent を見つけます。すべての単語が引き続き含まれている必要があります。結果のタイトルには ignoring punctuation (-_./:) と表示され、ステータス行には Match terms (loose) と表示されます。一致したテキストは、内部の区切り文字も含め、通常どおりマークされます。完全一致と混在することはありません。入力どおりに一致するものがあれば、それだけが表示されるため、件数とすべてのページは同じルールに基づきます。literal、prefix、fuzzy にはフォールバックはありません。MCP の search_commands ツールもクエリ全体に対して同じ方法でフォールバックし、レスポンスには no exact matches; showing matches ignoring punctuation (-_./:) と記載されます。
スコープ — --scope、切り替えは ^P、リセットは ^R:
| スコープ | 対象 |
|---|---|
all(デフォルト) | 記録されたすべて |
directory | 現在のディレクトリで完全に実行されたコマンド。サブディレクトリは対象外です。--here も同じです |
workspace | 最も近い親の Git リポジトリ配下の任意の場所で実行されたコマンド。リンクされたワークツリーは独立したワークスペースとして扱われ、入れ子になったリポジトリは親より優先されます |
session | 現在のシェルセッションのコマンド |
適用できないスコープ(リポジトリやセッションがない場合)は、その旨を stderr に表示して明示的にフォールバックします。黙って範囲を広げることはありません。
ランキング — terms と fuzzy は、一致度の高い順に並べます。クエリ全体のプレフィックス、連続した部分文字列、クエリ順に並んだ単語、任意の順序の単語の順です。この階層が常に優先されます。これより下位の要素が、テキスト上でより近い一致を上回ることはありません。 各階層内では、単一のスコアで順位が決まります。これはファジースコアをベースに、コマンドの長さと、エージェントではなくあなたが入力したコマンドかどうかを調整したもので、さらに Smart rank(^S、search.context_boost、デフォルトで有効)では、次の要素を乗算します。
- このディレクトリ:完全にこのディレクトリで実行された回数(
search.cwd_boost_percent); - フレクエンシー:そのコマンドを実行した頻度と最近度です。実行の重みは、最初の1時間は16、その日は8、3日間は4、1週間は1、1か月は0.5、それ以降は0.25です。ブーストは1と合計値の4乗根です。そのため、1〜2日前に20回実行したコマンド(×3.0)は、5分前に1回実行したコマンド(×2.0)より上位になりますが、大きく引き離すことはありません。これは、MCP の
suggest_nextツールがランキングに使うものと同じ定義です; - 実行結果:既知の終了ステータスがある実行が少なくとも3回あり、その半数を超えて通常失敗するコマンドは、スコアが下がります。一度も成功していない場合は4分の1になります。多数の成功の中に失敗が1回あっても変化はなく、Ctrl+C で停止した実行(終了コード130)は失敗として扱われません;
- シーケンス:このシェルで直前に実行したコマンドの後に、普段何を実行するかです。Recall は履歴内にあるそのコマンドの最新500回の実行を調べ、それぞれについて、同じセッション内で10分以内に記録された次のコマンドを確認します。そこで2回以上確認されたコマンドは、次に実行されるコマンドだった頻度に比例して最大×3のブーストを受けます。たとえば
git add -Aの後では、より頻繁に実行するgit statusよりgit commitが先に表示されます。この機能にはシェルセッション(シェルフックが設定する$SUVADU_SESSION_ID)が必要です。また、search.sequence_boost = false(suv settingsの Sequence Boost)を設定すると、このブーストだけを無効にできます。
フレクエンシー、実行結果、シーケンスは、一致したものだけではなく、履歴内にある完全に同じテキストのすべての実行を対象にします。エージェントの実行は、エージェントのコマンドを表示している場合にのみ対象になります。同順位の場合は、対話的に入力されたコマンドが優先され、次に新しいもの(Executions)または実行回数が多いもの(Commands)が優先されます。Recent rank(もう一度 ^S)では、これら4つのブーストは適用されません。各階層内では、ファジースコアと人間による入力のブーストだけが適用され、その後は同じ方法で同順位を処理します。literal、prefix、空のクエリは再ランキングされず、常に新しい順に表示されます。
一致する項目のうち、並べ替えられるのは最大 5,000 件です。これはランキング処理の上限であり、検索対象となる履歴の量や、アクセスできる履歴の量を制限するものではありません。一致判定と件数の集計はデータベース内で完了するため、結果数は実際の一致件数を示し、その全ページを開けます。ランキング対象の範囲を超えるページは、新しい順に表示されます。結果セットの一部だけを使って算出した関連度順では、その範囲で恣意的な並び順になってしまうためです。
入力中に検索を待つことはありません。 クエリはそれぞれ専用の読み取り専用接続を使い、バックグラウンドスレッドで実行されます。クエリを変更するキー入力があると、実行中の検索は中断され、SQLite はスキャンをその場で停止します。古いクエリの結果が届いても破棄されます。Enter、矢印キー、その他の結果を操作するキーは、まず現在入力されている内容の検索結果を待つため、選択する項目は常に画面上のクエリに一致します。結果が届くまでは、結果のタイトルに searching… と表示されます。
リストの見方。 クエリに一致した文字は、通常の構文色に重ねて各行で下線と強調表示されるため、コマンドが一致した理由がわかります。Recall は Commands で開きます。ここでは同じコマンドが 1 行にまとめられ、最後に実行された日時と一致した実行回数が表示されるため、50 回実行したコマンドがほかの候補をすべて画面から押し出すことはありません。^U で Executions(記録されたすべての実行とその時刻、ディレクトリ、結果)に切り替え、また戻ることができます。結果のタイトルには、現在表示している内容と、その単位での件数が表示されます。また、切り替え後も選択中のコマンドはそのまま選択されています。最初に Executions を表示するには、search.show_unique_by_default = false を設定するか、suv settings で Start in Commands View をオフにします。リストに収まらない長さの行は末尾が … になり、選択した行はすべて見えるよう折り返されます。
コマンドはテキストが完全に同じ場合にのみまとめられるため、通常は見えない空白も表示されます。先頭または末尾の空白は ·、改行とタブは ↵ と ⇥ で示されます。タブ、ゼロ幅スペース、方向上書き文字など、画面上では読み取れない文字がコマンドに含まれる場合、詳細ペインにエスケープされた Raw 形式が追加表示されます。^V を押すと、長さにかかわらず、どのコマンドでもその Raw 表示をスクロールして確認できます。すべての空白は · で示され、隠れた文字はすべてエスケープされ、改行ごとに行が分かれ、正確な長さも表示されます。
Enter を押すと、コマンドがプロンプトに入力されます(suv search の場合は出力されます)。コマンドが実行されることはありません。フッターには基本的なキー操作のみが表示され、? ですべてのショートカットを確認できます。
上矢印/下矢印による Recall は、よりシンプルな別の方法です。前方一致で新しい順に表示し、重複をまとめません。同じミリ秒に記録されたコマンドの順序を決める場合に限り、現在のディレクトリを使用します。詳しくは上矢印による Recallを参照してください。
suv search --compact は画面全体を切り替える代わりに、プロンプトの下に同じ UI をインラインで表示するため、読んでいた出力をそのまま確認できます。
選択を既定値にする。 search.match_mode、search.scope、search.compact は、すべての Recall で使用される既定値を設定します。suv settings の Search タブ(Default Match Mode、Starting Scope、Compact Recall)か、データストレージに記載されている設定ディレクトリ内の config.toml の [search] セクションで設定します。suv settings から保存しても、そのファイル内のほかのキーはすべて保持され、認識されないキーもそのまま残ります。3 つの設定はいずれも、以前のリリースと同じ動作が既定値です。
既存の履歴を取り込む
suv import --from bash-history --dry-run ~/.bash_history # preview counts, writes nothing
suv import --from bash-history ~/.bash_history # import
suv import --from zsh-history ~/.zsh_history # zsh equivalent
入力ファイルは読み取り専用で、変更されることはありません。同じインポートを再実行しても何も追加されませんが、ファイル内で実際に繰り返し実行されたコマンドはすべて保持されます。
どちらのインポーターも、ライブ記録とまったく同じように、秘匿化パターンと除外パターンを適用し、除外または秘匿化された件数を、コマンドのテキストを出力せずに報告します。どちらも、事前に Suvadu データベースのバックアップを作成しません。バックアップを作成するのは Atuin インポーターだけです。バックアップが必要な場合は、ご自身で suv backup を実行してください。
Bash の履歴ファイルから取得できる情報とできない情報は次のとおりです。
| フィールド | インポート内容 |
|---|---|
| コマンドのテキスト | はい。ライブ記録の場合とまったく同じように、秘匿化パターンと除外パターンが適用されます |
| タイムスタンプ | コマンド実行時に HISTTIMEFORMAT が設定されていた場合のみ(#<epoch> 行)。そうでない場合は、明示的に合成された 1970-01-01 のプレースホルダーが使われます。時刻が作り出されることはありません |
| 複数行のコマンド | タイムスタンプ付きのファイルでは復元されます(#<epoch> 行が記録の境界です)。通常のファイルには境界がないため、各行がそれぞれ個別のコマンドとしてインポートされます |
| ディレクトリ、終了コード、実行時間、実行者 | ファイルには含まれていないため、不明として保存されます。推測されることはなく、正常終了として記録されることもありません |
Atuin からの移行
suv import --from atuin-db --dry-run ~/.local/share/atuin/history.db # preview, writes nothing
suv import --from atuin-db ~/.local/share/atuin/history.db # import
Atuin データベースは読み取り専用で開かれます。Suvadu がデータベースに書き込んだり、SQLite の管理外でファイルをコピーしたりすることはありません。また、Atuin の実行中に記録を続けられるよう、すべての履歴を 1 つのトランザクション内で読み取ります。書き込み前に、Suvadu は自身のデータベースの整合性のあるバックアップを作成し、復元に使う cp コマンドを表示します。その後、Atuin のファイルがバイト単位で同一であることと、書き込んだとするエントリーが実際に存在することを検証します。インポートを再実行しても何も追加されません。
Atuin 18.0.0~18.23.0(履歴スキーマ 20210422143411~20260818000000)でテスト済みです。18.23.0 は、実際の Atuin 18.23.0 バイナリが書き込んだデータベースを、scripts/test-atuin-import.sh を使ってインポートしてテストしています。このリリースでテストされていないマイグレーションを含むデータベースは、推測ではなくマイグレーション ID を示して拒否されます。suv update を実行してから、もう一度お試しください。
| Atuin のフィールド | インポート先 |
|---|---|
command | コマンドのテキストをそのまま保持します(複数行と Unicode も保持されます)。ライブ記録とまったく同じように、秘匿化パターンと除外パターンが適用されます。Atuin がその行を記録したディレクトリを基準に解決されるため、プロジェクトの .suvadu.toml もインポートした履歴に適用されます |
timestamp(ナノ秒) | started_at にミリ秒単位で切り捨てて保存され、それ以外には使われません。同じ 1 ミリ秒以内に実行された 2 つのコマンドは同じ started_at を持ちますが、別々のエントリーとして保持されます。行は時刻ではなく Atuin の id で識別されます |
duration(ナノ秒) | duration_ms / ended_at にミリ秒単位で切り捨てて保存されます。Atuin の -1(「未完了」)はゼロの実行時間ではなく、不明として保存されます |
exit | exit_code。Atuin の -1 は NULL になります。正常終了として捏造されることはありません |
cwd | ディレクトリ。空欄、または Atuin のリテラル "unknown" は不明になります |
session | Atuin のセッションごとに Suvadu セッションが作成され、ID は atuin-<session> になります |
hostname(host:user) | セッションのホスト名に加え、エントリーのコンテキストに atuin_user が保存されます |
author, author_kind | executor と executor_type(1→人間、2→エージェント)。種別が明示されていない場合は不明のままです。Atuin は既知の作者名から「エージェント」と推測しますが、Suvadu は明示された内容のみを記録します |
id, intent, shell | エントリーの context(atuin_id, atuin_intent, atuin_shell)に保持されます。Suvadu にはこれらを保存する列がありません。再インポート時に何も追加しないためにも atuin_id が使われます。自由記述のフィールドには、コマンドと同じ秘匿化パターンと除外パターンが適用されます。除外に一致したフィールドは保留され、context.withheld_fields に名前が記録されます |
deleted_at | Atuin で削除した行はスキップされ、件数が記録されます。復元されることはありません |
| — | 1 ミリ秒未満の精度は失われます(行自体は保持されますが、同じ 1 ミリ秒内での順序だけが失われます)。Atuin には引き継げるタグ、メモ、コマンド出力がなく、Suvadu は Atuin の同期状態やレコードストアの状態も保持しません |
AI エージェントのセットアップ
suv init claude-code # Claude Code — commands, sessions, tokens + MCP
suv init codex # Codex — commands, sessions, tokens + MCP
suv init cursor # Cursor — commands, sessions (no tokens) + MCP
suv init opencode # OpenCode — plugin + full session capture (commands, sessions, tokens)
suv init pi # pi.dev — extension + prompt capture
suv init antigravity # Antigravity — agent commands (via ~/.zshenv)
セットアップ後、設定したエージェントを再起動してください。どちらの VS Code 拡張機能を使う場合も、VS Code を完全に終了してから再度開いてください。Codex では、プロンプトが表示されたとき(または /hooks を使って)、Suvadu のフックを確認して信頼する必要もあります。どちらのインストーラーも無関係なフックを保持し、Suvadu MCP サーバーを設定します。Codex は既存の hooks.json を変更前にバックアップし、CODEX_HOME が設定されている場合はそれを使用します。
各エージェントで実際に利用できる機能
「AI エージェントのサポート」と呼ばれるものは、3 種類あります。利用できる機能は次のとおりです。
| エージェント | suv init | コマンド | プロンプト | ネイティブのセッションタイムライン | テスト対象 |
|---|---|---|---|---|---|
| Claude Code | claude-code | はい(フック) | はい | はい | 特定のバージョンに固定されていません — 下記の注意事項をご覧ください |
| Codex | codex | はい(フック) | はい | はい | CLI 0.153.4 |
| OpenCode | opencode | はい(プラグイン) | はい | はい | CLI 1.18.30 |
| Cursor | cursor | はい(フック) | はい | はい — プロンプト、最終応答、ターン終了。トークン使用量は対象外 | バージョン未固定 |
| pi.dev | pi | はい(拡張機能) | はい(拡張機能により500文字に制限) | いいえ | バージョン未固定 |
| Antigravity | antigravity | はい(~/.zshenv キャプチャスクリプト) | いいえ | いいえ | zsh 5.9 を使用した Antigravity IDE 2.5.5 |
| Windsurf、Aider、Continue、Copilot | — | シェルフック経由 | いいえ | いいえ | — |
最後の行はコマンドのタグ付けであり、統合ではありません。シェルフックは、これらのツールが設定する環境変数を認識し、適切な実行元をコマンドに付与します。インストールするものはなく、プロンプトもキャプチャされません。
Antigravity のエージェントは、言語サーバーから各コマンドを zsh -c '<command>' として実行します。このシェルは ~/.zshrc を読み込まないため、シェルフックでは検出できません。suv init antigravity はキャプチャスクリプトを ~/.config/suvadu/hooks/antigravity-zsh.sh に書き込み、~/.zshenv(設定されている場合は $ZDOTDIR/.zshenv)に識別用ブロックを追加します。その際、既存ファイルは .zshenv.suvadu-backup-<id> としてバックアップされます。このブロックは、非対話型 zsh で -c コマンドを実行しており、$ANTIGRAVITY_AGENT が設定されている場合にのみスクリプトを読み込み、それ以外のシェルでは処理をスキップします。各エージェントコマンドは、そのシェルの終了時に終了コード、実行時間、ディレクトリとともに記録されます。記録先は Antigravity の実行ごとのセッション(antigravity-<pid>)です。対象となるのは zsh のみです。Antigravity が exec を使って開始したコマンドや、シグナルによって終了したコマンドは記録されません。コマンドの記録を可能にするためにシェルを待機させる目的で、スクリプトは何もしない EXIT トラップを設定します。このトラップは、これらのシェルに限り、~/.zshenv で以前に設定された EXIT トラップを置き換えます。suv uninstall を実行すると、このブロックが削除されます。
上記のうち、Suvadu が実際に動作を確認したバージョンは Codex と OpenCode のみです。実行時にこれらのバージョンが強制されることはありません。ただし、スキーマが実際に検証される Atuin のインポートは例外です。エージェントがフックやプラグインの仕様を変更すると、キャプチャ機能が気付かれないまま劣化する可能性があります。suv doctor では、エージェントごとにプロセスが検出されたか、統合がインストールされているか、コマンド、ネイティブセッション、MCP 登録が確認されているかが報告されます。
失敗の理由:失敗時の出力(オプトイン)
[capture] failure_output = true(suv settings の 失敗時の出力を保持。デフォルトではオフ)にすると、失敗したコマンドは出力の末尾 4 KB を保持します。Suvadu がすでにその出力を取得している場合に限ります。
| パス | 保持される出力 |
|---|---|
| Claude Code | Exit code N の行を除いた、PostToolUseFailure のエラーテキスト |
| Cursor | afterShellExecution の output |
| Codex | 終了コードも含まれる場合の、PostToolUse のレスポンスの output、aggregated_output、または stdout/stderr のテキスト |
| OpenCode | プラグインが送信する bash ツールの出力(suv init opencode を再実行してください) |
suv wrap -- cmd | コマンドの stderr。実行中は変更せず、そのままターミナルに渡されます |
| zsh および Bash のフック | 何もありません — ターミナルの出力を取得するには、プログラムとターミナルの間に入る必要があり、対話型プログラムが動作しなくなります |
Recall の詳細ペインでは失敗したコマンドの下に表示されます(長い場合は Shift+Tab でスクロールできます)。また、MCP の what_failed、command_status、learn_from_failures ツールと failures/recent リソースには末尾 3 行が表示されます(detail=true の場合は全体)。これは指示ではなく、コマンド自体のテキストとして示されます。出力がない場合は、コマンドが失敗した理由は不明だとはっきり伝えます。
エスケープコードと進捗表示の再描画は取り除かれ、シークレットはコマンドと同じルールおよびディレクトリごとのポリシーで(テキストを切り詰める前に)マスキングされます。除外されたコマンドの出力は保持されません。また、プロジェクトの .suvadu.toml でこの機能をオフにできますが、オンにはできません。suv wrap ではコマンドの stderr はパイプになるため、ターミナル上でのみ色付けやアニメーションを行うプログラムの出力は通常の表示になります。また、コマンドが終了後も実行し続けるバックグラウンドプロセスは、suv wrap の終了後に stderr を失います。出力は suv delete でコマンドと一緒に削除され、JSON および JSONL エクスポートにも含まれます。suv gc --failure-output を実行すると、コマンドを保持したまま出力をすべて削除します。
「前回これが失敗したときは、これで直しました……」
コマンドが失敗すると、Recall の詳細ペインには以前何で直したかが表示されます。たとえば Last time this failed, you fixed it with: git status (3×) のように表示されます。MCP の what_failed および learn_from_failures ツールには fixed before (inferred) の行が追加されます。このために新しい情報を記録することはありません。問い合わせ時に履歴から推定します。対象は、そのコマンドと完全に一致する最新の失敗 50 件です(終了ステータスが 0 以外、または Ctrl+C による 130)。失敗ごとに、Suvadu は同じセッションで 15 分以内に開始された、同じディレクトリ内の後続コマンド 20 件を確認し、ほかの失敗はスキップします。
- 失敗したコマンドに類似した成功コマンドは、その修正として扱われます。同じプログラムで最初の非フラグ引数が同じコマンド(
cargo build→cargo build --release)、または行を少し修正したコマンド(gti status→git status。8 文字につき変更は最大 1 つ)です。 - 失敗したコマンドが変更なしで再度実行された場合は、それより前に成功したセットアップ手順(同じプログラムの実行(
npm testの前のnpm installなど)、またはパッケージのインストール)が修正として扱われます(you fixed it with: npm install, then reran it)。セットアップ手順がない場合は、変更せずに再実行したら成功しましたと表示されます。 - 途中で状況を確認するコマンド(
cd、ls、cat、git status/diff/log/show、エディター)はスキップされます。それ以外の成功コマンドがあると、修正が見つからないまま検索を終了します。
修正はこれらの失敗を通じて集計され、最も多いものが表示されます。これは次に実行されたコマンドからの推定であり、実際に原因を確認したものではありません。コマンド履歴 100,000 件でも各検索にかかる時間は 1 ミリ秒未満(BENCHMARKS.md)で、Recall は選択された失敗コマンドごとに 1 回だけ検索します。
変更点:エージェントの Git スナップショット
Claude Code、Codex、OpenCode、または Cursor のセッションが Git リポジトリ内で作業すると、Suvadu はセッションの最初のプロンプト時と各ターンの終了時(Claude Code と Codex の UserPromptSubmit および
Stop/SessionEnd、OpenCode のプロンプトおよび session.idle)に、そのリポジトリの Git スナップショットを取得します。記録されるのは、チェックアウトされているコミットとブランチ、および git status がステージ済み、未ステージ、未追跡、名前変更済み、削除済み、または競合ありと報告したパスです。パスのみです。ファイルの内容も差分も記録しません。 最初のスナップショットは保持され、各ターンの終了時に最後のスナップショットを置き換えるため、セッションが保持するスナップショットは最大 2 件です。
gitを実行するのはそのタイミングだけで、コマンドごとには実行しません。core.fsmonitorを無効にした状態でgit --no-optional-locks status --porcelain=v2 --branch -zを実行するため、エージェントからインデックスのロックを奪うことはなく、リポジトリ独自の設定によってプログラムが実行されることもありません。実行時間の上限は 2 秒です。それを超えた場合、PATHに見つからない場合、またはディレクトリがリポジトリ内にない場合は何も記録せず、エージェントのフックはそのまま続行します。リポジトリ外ではgitプロセスは起動しません。10,000 ファイルのリポジトリでは、スナップショットによって取得対象のフックに約 30~35 ms が追加され、その大半はgit statusにかかる時間です(Apple M4 Max。BENCHMARKS.md を参照)。以降のプロンプトで追加される時間は 1 ms 未満です。exclusionsに一致するパスは除外され、その件数が記録されます。それ以外のパスとブランチ名はコマンドテキストと同様に編集され、保持されるパスは最大 500 件です。変更がそれ以上ある場合、スナップショットにその旨が示されます。suv settingsの Record Agent Git Snapshots または[agent] record_git_snapshots = falseで無効にできます。プロジェクトの.suvadu.tomlで無効にすることもできますが、再び有効にすることはできません。キャプチャが一時停止されている間は何も記録されません。- スナップショットは
suv agent delete-sessionでセッションとともに削除されます。suv gcは、セッションにほかの記録が残っていない場合、1 日以上前のスナップショットを削除します。スナップショットは、それが属するエージェントセッションと同様、エクスポートされません。
Cursor のセッションでも、beforeSubmitPrompt と stop の時点でスナップショットが取得されます。
MCP の what_changed ツールは、これらを読み取ります。session_id を指定すると、セッションの 2 件のスナップショットを比較し、その間に Git のステータスが変化したパスと、2 つの HEAD 間で作成されたコミットを provenance: observed として報告します。コミットはその時点でリポジトリに問い合わせて取得します(git rev-list、git log、git diff --name-only。いずれも同じく 2 秒が上限です)。そのため、セッション中に作成されたコミットは、件名と変更したファイルとともに一覧表示されます。コミットの件名とパスは保存されず、表示前にリポジトリ独自の除外設定と編集が適用されます。リポジトリまたはコミットがなくなっている場合は、2 つの HEAD だけを返します。リポジトリ内で変更されたパスは、必ずしもエージェントが変更したとは限りません。また、開始時点ですでに変更があり、終了時点でも同じ変更が確認されたパスは、その間に再び変更されていても一覧に含まれません。両方のスナップショットがない場合は、セッションのコマンドを読み取ってその影響を推定し、推定であることを示して理由を説明します。代わりにディレクトリと時間範囲を指定すると、通常のコマンドテキストの内訳を示す前に、その範囲でスナップショットを持つセッションを一覧表示します。
suv sessions では、幅が 100 列以上のターミナルの場合、AI セッションのタイムラインのヘッダーにスナップショットで確認された内容が Changed: 3 files, 1 commit のように表示されます。ハンドオフのひな形(h)では、2 件のスナップショットを根拠として、Changed-file evidence の下にコミットと変更されたパスが一覧表示されます。
記録されないもの
- コマンド出力とファイルの内容。 Suvadu が記録するのは、コマンドが実行されたこと、終了時の状態、所要時間、および実行場所です。出力された内容や変更された内容は記録しません。ただし、オプトインの失敗出力(上記のとおり、失敗したエージェントまたは
suv wrapコマンドの出力末尾)は例外です。エージェントの Git スナップショットには、変更されたパスが記録されますが、その内容は記録されません。 - ネイティブのトランスクリプトから取得する情報: 思考ブロック、添付ファイル、画像、ファイルの内容、生のツール結果。Codex のコメントや推論、注入された AGENTS/環境コンテキスト、開発者向け指示も除外されます。
- シェル以外のツール呼び出しとファイル編集、およびセッションから開始された子セッション。各セッションのヘッダーに
capture.unverifiableと記載されます。 - サイズ制限: フック入力は最大 16 MiB まで読み込み、Suvadu が記録するフィールドのみを保持するため、大きなツール出力によってコマンドが遅くなることはありません。16 MiB を超えた場合、上限に達する前に届いたコマンドは引き続き記録され、それ以外の場合は名前付きエラーでフックが失敗します。ネイティブのトランスクリプトの各レコードは 16 MiB に制限されています。上限を超えるレコードは、黙って切り詰めるのではなく、名前付きエラーで拒否されます。プロンプトのテキストは
agent.prompt_capture_max_chars(デフォルトは 4000)に制限されます。 - エージェントによって、タイミングと終了コードの信頼性は異なります。 Codex と Claude Code のフックのタイムスタンプは実行時刻ではなく、受信時刻です(Codex は
timing_source = hook_receivedを記録します)。Codex が構造化された終了コードを提供しない場合、終了コードは不明のままです。Claude Code と Cursor は成功フックから 0 を推定します。pi.dev の bash ツールは終了コードを公開しないため、拡張機能が推測します。
そのため、セッションヘッダーでは、Suvadu が把握している記録漏れ(known_missing:一時停止中のウィンドウ、記録がオフになっていたディレクトリ、追跡できなかったトークン数など)と、そもそも観測しない情報とを分けて報告します。complete は記録された欠落がないことを意味するだけで、エージェントの行動がすべて記録されているという意味ではありません。
suv history --executor openai-codex
suv agent prompts --executor openai-codex
Codex のシェルコマンドは、同じターンのプロンプトにリンクされます。コマンドが記録されていないプロンプトは、プロンプトエクスプローラーに表示されません。記録には、Suvadu の記録設定と編集設定が適用されます。フックのタイムスタンプは受信時刻を示します。Codex が構造化された終了コードを提供しない場合、終了ステータスは不明のままです。これには、UserPromptSubmit および PostToolUse フックに対応した Codex バージョンが必要です(CLI 0.153.4 でテスト済み)。Stop フックと SessionEnd フックも、シェルコマンドとは独立して、プロンプト、アシスタントの最終回答、プロバイダーが報告したトークン使用量を含む Codex のネイティブトランスクリプトを段階的にインポートします(レコードごとに最大 16 MiB)。この機能には、Stop/SessionEnd フックにも対応した Codex バージョンが必要です。
Claude Code のコマンドは、トランスクリプトの照合後、ネイティブのプロンプトターンにリンクされます。Stop フックと SessionEnd フックは、プロンプト、アシスタントのテキスト、モデル、プロバイダーが報告したトークン使用量を含むローカルのトランスクリプトレコードを段階的にインポートします。思考ブロック、添付ファイル、画像、ファイルの内容、生のツール結果は Suvadu に保存されません。
suv init opencodeを実行すると、~/.opencode/plugins/suvadu.jsにプラグインをインストールし、そのディレクトリを~/.config/opencode/opencode.jsoncのplugin配列にも登録します。OpenCodeは、ディレクトリにあるプラグインだけでは確実に自動読み込みされないためです。opencode.jsoncにすでにJSONC形式のコメントが含まれている場合、この手順で安全に解析して書き換えると設定のほかの部分に影響するおそれがあるため、自分で追加する正確な行が表示されます。OpenCodeが実行するBashコマンドは直ちに記録されます。プロンプト、アシスタントの応答、モデル、トークン使用量は、セッションがアイドル状態になったときに、OpenCode独自のsession.messages APIを介して取得されます。プラグインがSuvaduに渡すのは、保存対象となる各メッセージのテキスト、モデル、トークン数だけです。ツールの出力や推論は渡されません。また、すでにインポート済みのメッセージは除外されるため、長いセッションでもアイドル状態になるたびに、新しいメッセージだけが対象になります。SuvaduまたはOpenCodeをアップグレードした後にsudo init opencodeを再実行し、OpenCodeを完全に終了してから再起動すると、更新されたプラグインと設定が有効になります。OpenCode CLI 1.18.30でテスト済みです。OpenCodeのアップグレード後にプラグイン読み込みエラーが表示された場合は、プラグインの仕様が再度変更されている可能性があり、suv init opencodeにも対応する更新が必要です。
suv init cursorを実行すると、すでに設定済みのフックを残したまま、~/.cursor/hooks.jsonに4つのフックを登録します。afterShellExecution(コマンド)、beforeSubmitPrompt(プロンプト)、afterAgentResponseとstop(各ターンの最終応答と、その終了方法)です。Cursorの各会話は、cursor-<conversation_id>という1つのセッションになり、会話内のコマンドは、それが実行されたターン(Cursorのgeneration id)に紐付けられます。注意点はCursorの仕様によるものです。フックからはトークン使用量が報告されないため、Cursorセッションのトークン数は「0」ではなく取得できません。取得状況にもその旨が表示されます。フックにはタイムスタンプが含まれないため、イベントはフックの受信時刻で記録されます。Cursorから送られるのは各ターンの最終応答テキストだけなので、中間のアシスタントメッセージ、思考(afterAgentThought。インストールされません)、シェルコマンド以外のツール呼び出しは記録されません。また、Cursorがワークスペースを指定した場合に限りイベントが記録され、そのワークスペースの.suvadu.tomlによって、秘匿化と除外の設定が決まります。Suvaduをアップグレードした後にsuv init cursorを再実行し、Cursorを再起動してください。
MCPを設定したエージェントには、次のように質問してください。「このプロジェクトで最近失敗したコマンドは何ですか?」
プロンプトエクスプローラーとセッションタイムラインの違いは?
どちらも異なる2つのストアから「エージェントが何をしたか」を表示するもので、互いを置き換えるものではありません。
- プロンプトエクスプローラー(
suv agent prompts)は、記録されたシェルコマンドをもとに構成されます。コマンドの実行時に有効だったプロンプトごとにコマンドをグループ化し、そのターンのコマンド数、成功数、失敗数、合計時間を表示します。記録されたコマンドを一つも生まなかったプロンプトは、グループ化する対象がないため表示されません。プロンプトを取得できるすべてのエージェントで使えます。セッションタイムラインがないpi.devも含まれます。また、期間と実行元のフィルターを指定して、複数のセッションを横断して参照できます。 - セッションタイムライン(
suv sessionsと、非対話型表示のsuv agent sessions)は、エージェント独自のトランスクリプトをもとに、段階的にインポートして構成されます。プロンプト、アシスタントの応答、中断されたターン、確認されたすべてのモデル、プロバイダーが報告したトークン合計(コマンドが一つもないセッションも含みます)に加えて、取得の完全性、保存済みの要約(s)、引き継ぎのひな形(h)を表示します。利用できるのはClaude Code、Codex、OpenCode、Cursorのみです。
MCP:デフォルトでは読み取り専用
サーバーは読み取り専用ツール22個、リソース8個、プロンプト6個を公開します。 これらはすべて読み取り専用です。書き込みツールはちょうど2つあり、オプトインを有効にするまで、どちらもオフになっています。
| 書き込みツール | オプトイン | できること |
|---|---|---|
save_session_summary | mcp.allow_session_summaries | 呼び出したエージェントが生成した要約を、依頼に応じて保存します |
propose_skill | mcp.allow_skill_proposals | スキルを提案します。常にレビュー待ちとなり、suv skills(Ctrl+P)で承認するまで有効になりません |
有効にするには、suv settingsを実行してMCPタブに移動し(Tabで切り替え)、Writesの下にある対象の行でEnterを押します。Ctrl+Sで保存した後に、MCP クライアントを再起動してください。サーバーは起動時に一度だけ設定を読み込むため、実行中のクライアントは再接続するまで以前の設定を使い続けます。
次に、*「現在のセッションを要約して保存してください。」*と依頼します。
同じタブに、各ツールとリソースの実効状態が一覧表示されます。書き込みツールがオフの場合は、オプトインがオフのため、そのツールをオフにしたため、またはその両方のためと、オフになっている理由が表示されます。互いに食い違う可能性のあるスイッチが2つ表示されることはありません。オプトインを再びオフにすると、新たな書き込みが停止します。すでに保存された要約は保持されます。
サーバーが読み込む設定。 ツールとリソースの利用可否、2つの書き込みオプトイン、mcp.exclude_dirs、および MCP のデフォルト設定は、グローバルのconfig.tomlのみから取得されます。プロジェクトの.suvadu.tomlオーバーレイによって、どの MCP 機能が有効かが変わることはありません。レダクション、除外設定、およびカスタムリスクルールはオーバーレイを通じて解決されますが、MCP サーバープロセスの起動時に、そのプロセスを起動したディレクトリから一度だけ読み込まれます。どちらの場合も、設定変更後にクライアントの再起動が必要です。
すべての応答は一貫した規約に従うため、呼び出し側は信頼度を判断できます。RFC 3339形式のタイムスタンプ、欠損値を示す唯一のトークンとしてのunknown、常に分数も含むパーセンテージ、next_offsetを伴うlimit/offset、切り詰めが見える形式、すべての行に付与される安定したcommand-<id>、そしてobserved(Suvaduが保存した記録)、inferred(そこから導き出された情報)、またはcaller-reported(エージェントが記述したテキスト)を示すprovenance:行です。推論された情報には、Suvaduが記録するのはコマンド、終了コード、実行時間であり、ファイルの内容は記録せず、コマンド出力を記録するのは、失敗したエージェントコマンドまたはsuv wrapコマンドのオプトインを有効にした場合に限ることも、必ず明記されます。
保存される要約はエージェント自身のテキストであり、そのまま保存されます。Suvaduはモデルを呼び出さず、文章も生成しません。作成したエージェントとモデルは、検証済みの身元情報ではなく、呼び出し側が申告したメタデータとして記録されます。また、要約で引用されたエビデンス ID が、そのセッションに存在することも確認されます。Suvaduは、現在のCodex、Claude Code、またはOpenCodeのセッションを推測せずに解決します。作業ディレクトリが指定されていなければ解決せず、一致する候補が複数ある場合は、必ずユーザーが選択します。後続の依頼では、保存されたイベントとコマンドのオフセットから追記専用のチェックポイントを引き継ぎます。根拠となったエビデンスに変更があった場合、エージェントはセッション全体を基に作り直します。
統合ガイド全文とMCP サーバーのドキュメントを参照してください。
他のクライアントに MCP サーバーを手動で追加するには、stdio サーバーとしてsuvadu mcp-serve(またはsuv mcp-serve)を実行します。
- MCP Registry 名:
mcp-name: io.github.AppachiTech/suvadu
主な機能
| 機能 | 詳細 |
|---|---|
| ホーム | suv(または suv home)だけで起動できます。タスクから S uvadu の機能を検索し、それぞれの背後にある実際のコマンドを確認したり、画面、ピッカー、レポートを開いたり、データを変更する操作のコピー可能な手順を読んだりできます。suv settings の スタートアップ画面 で、従来の概要画面に戻せます |
| 検索 | 履歴全体を対象とする検索 TUI。4 つのマッチングモード(^X)と 4 つのスコープ(^P)、各行でのマッチ箇所の強調表示、すべての実行履歴または同一コマンドのグループ化(最終使用時刻と実行回数を表示、^U)、デフォルトでは自分のコマンドのみ表示(Ctrl+A ですべてのエージェントを表示、Ctrl+E で失敗のみ表示)、フィルター、スマートランク、詳細ペイン、正確なテキストを確認するための生データインスペクター(^V)、ブックマーク、インラインで履歴を呼び出す --compact |
| 履歴 | フィルターと --json に対応し、ほかのツールにパイプで渡せる、非対話型の suv history |
| エージェントダッシュボード | タイムライン、リスク評価、エージェント別の分析、エクスポート可能なレポートを利用できます。ローカル CI/git フックでの判定には suv agent report --fail-on <low|medium|high|critical> を使用します |
| MCP サーバー | 読み取り専用ツール 22 個、リソース 8 個、プロンプト 6 個に加え、デフォルトでは無効になっているオプトインの書き込みツール 2 個を備えています。エージェントセッションの再生、エージェント間の増分サマリーチェックポイント、プロジェクトコンテキスト、失敗からの学習に対応し、出典を明示する統一された応答規約を採用しています |
| スキルライブラリ | suv skills — 共有スキルの参照、追加、編集、削除、同期、確認を行う対話型 TUI です。各ツールが独自のコピーを保持する代わりに、MCP 対応のエージェントが読み取れます。sync --dry-run は、生成ファイルごとに管理対象領域の差分を表示します。Suvadu の外で編集された領域は競合として報告され、上書きせずにスキップされます(--force で上書きできます)。削除または無効化されたスキルのファイルは削除されます。信頼できるチームスキルは .suvadu/skills/*.md にコミットして同期できます。詳しくはリポジトリ内のチームスキルを参照してください。add/list/show/edit/rm/disable/enable/sync/cleanup/trust/untrust は、スクリプトから実行できるサブコマンドとしても使えます |
| プロンプトエクスプローラー | suv agent prompts は、記録されたコマンドを、それを実行させたプロンプトごとにグループ化し、そのターンの成功、失敗、所要時間を表示します。記録されたコマンドを実行しなかったプロンプトは表示されません。エージェント自身のトランスクリプトを見るには、セッションタイムラインを使用してください |
| 統合セッション | suv sessions では、人間と AI のセッションをまとめて閲覧できます。Capture 列は、記録された欠落箇所のみをもとに full または gaps: N を表示します。終了コードから推測することはありません。Codex、Claude Code、OpenCode のネイティブセッションでは、プロンプト、応答、コマンド、観測されたすべてのモデル、プロバイダーが報告したトークン合計を確認できます。s で保存済みのサマリーを開きます(CURRENT/NEW ACTIVITY/EVIDENCE CHANGED のバッジを表示。Tab でレンダリング表示と生データ表示を切り替え、Ctrl+Y でコピー)。h では、取得済みの記録のみを使って引き継ぎ用のひな形を作成します |
| 統計 | ヒートマップ、時間帯別の分布、上位コマンド、実行元の内訳を確認できます。--human(または TUI で Ctrl+H)を指定すると、AI エージェントのアクティビティを除外します |
| 診断 | suv doctor は、シェル履歴の記録を妨げる問題と任意の連携機能を分けて表示し、チェック項目ごとに修復方法を提示します。保存データが実際に裏付ける内容を報告し、データの保持期間を変更するルールと並べて、カテゴリ別のストレージ使用量を一覧表示します |
| 整理 | タグ、ブックマーク(suv bookmarks で対話型ピッカーが開き、ブックマークをプロンプトに呼び出せます。{{name}}/{{name:default}} のプレースホルダーを含むブックマークでは、まず値の入力を求められます。suv bookmarks get <label> --set name=value で値を埋めた状態の内容を表示できます。詳しくはプレースホルダー付きブックマークを参照してください)、メモ、シェルエイリアスを追加・編集・削除できる対話型マネージャー suv aliases に対応し、頻繁に入力する長いコマンドの候補も提示します |
| プライバシーと安全性 | スペースで始まるコマンドの除外、正規表現パターン、シークレットのマスキング(redaction.extra_patterns で拡張可能)に対応し、ローカル環境のみで動作します。これらは、インポートや保存済みサマリーを含むすべての取り込み経路に適用されます。suv backup、suv delete の実行前に自動で作成されるスナップショット、削除対象のコマンドと削除後に残る内容を確認できる suv delete --dry-run を利用できます。SECURITY.mdを参照してください。 |
| 矢印キー | 直近のコマンドを優先する Up/Down 履歴呼び出しに対応します。直近のコマンドが先に表示され、プレフィックスで絞り込まれます。同じミリ秒に記録されたコマンドを区別する場合にのみ、現在のディレクトリが使われます。デフォルトではエージェントのコマンドは非表示です。Alt+A(シェルごと)または --include-agents で表示できます。Zsh のみ対応(Bash は独自の Up/Down を使用)。後から読み込まれたプラグインが Up を上書きしている場合は、suv doctor が警告します。詳しくは上矢印キーでの履歴呼び出しを参照してください。同じ検索機能を使う zsh-autosuggestions のストラテジーも利用できます。ZSH_AUTOSUGGEST_STRATEGY=(suvadu history) |
| Git ブランチ | git リポジトリ内で記録された各コマンドには、実行開始時のブランチが保持されます。git プロセスを起動せずに .git から読み取り、履歴呼び出しの詳細ペインと MCP の詳細行に表示します。ワークツリーとサブモジュールもたどります。detached HEAD の場合は短縮ハッシュを保持します。 |
| Vim キーバインド | 検索 TUI で、任意の Vim 風ナビゲーション j/k/Ctrl+U/Ctrl+D を使用できます |
| 機能の詳細については、suvadu.sh/cliをご覧ください。 |
その他のデモ
架空のデータを使用し、Suvadu 0.5.0 で録画しました。上の検索デモでは Ctrl+R による再呼び出しを紹介しています。以下のデモでは、機能の確認と AI セッションを取り上げます。AI の例では、実際のエージェント実行ではなく、あらかじめ用意した記録を使用しています。
機能を確認 — suv を実行し、タスクで検索して、ツールを開きます
AI のアクティビティ — プロンプト、コマンド、終了ステータス、応答を1つのタイムラインで確認できます
開発
git clone https://github.com/AppachiTech/suvadu.git
cd suvadu
make dev # Run the app
make test # Run tests
make lint # Run clippy + format check
ガイドラインとリリースチェックリストについてはCONTRIBUTING.mdを、検索の測定方法についてはBENCHMARKS.mdをご覧ください。
セキュリティ
脆弱性の報告、データ保存の設計、プライバシーの詳細については、SECURITY.mdをご覧ください。
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。