
AIコーディングエージェント用のフライトレコーダー兼シークレットスキャナー。Claude Code、Codex、Gemini CLI ほか9つのツールが実行した内容を読み取り、危険な操作や漏洩したキーを検出します。ローカルで動作し、テレメトリなし、MIT。
AIエージェントのためのフライトレコーダー、そしてエージェントが持つ権限のスキャナー。 Claude Code および他の11のコーディングエージェント向けのAIコーディングエージェントセキュリティ、あなた自身のマシン上で実行。 アカウント不要、テレメトリなし、依存関係なし。
ウェブサイトとドキュメント: https://ranwhat.com
あなたのコーディングエージェントはあなたのシェル、鍵、リポジトリを持っています。ranwhat はエージェントが実際に実行した内容を読み取り、知っておく価値のある数少ない不可逆的な操作を浮かび上がらせます。
$ ranwhat watch --days 90
ranwhat watch · local agent flight recorder
----------------------------------------------------------------------------
Read Claude Code: 4 transcripts, last 90 days
2 critical 2 high
* Credential material accessed 2026-09-30 18:13:00 Bash
cat ~/.ssh/id_rsa
-> The agent read a file whose only purpose is to hold secrets. Whatever
it read is now in a model context you do not control.
* Bulk or recursive deletion 2026-09-28 14:42:00 Bash
…rm -rf '@'
-> Recursive deletion. Recoverable only if something else was backing it
up.
* Package or release published 2026-09-21 11:05:00 Bash
npm publish
-> Something was pushed to a registry other people may install from.
Supply-chain reach, and usually irreversible.
* Destructive git operation 2026-09-15 17:30:00 Bash
git push --force origin main
-> History rewriting or branch deletion. This is the class of action
that destroys the record of what else happened.
----------------------------------------------------------------------------
Read locally. Nothing was transmitted.
Claude Code は、あなたが
cleanupPeriodDays
より長く使用していないセッションのトランスクリプトを削除します。デフォルトでは30日です。したがって --days 90 は、あなたがこの値を引き上げていればより多くを見つけ、その期間内に再開したセッションにそれより古い操作が含まれていればそれも見つけ、また Claude Desktop や Cowork で開始または最後に継続されたセッションについても見つけます。これらは Claude Code v2.1.248 以降では
デフォルトで年齢に関係なく保持されます。
何もインストールせずに一度だけ実行する:
uvx ranwhat check
またはパスに追加する:
pipx install ranwhat
pip install ranwhat
その後 ranwhat demo で、同梱のサンプルに対する権限スキャンを見ることができます。
Python 3.9+。依存関係はなく、あなたのマシン上でビルドされるものもありません。
ranwhat check: 知っておくべきすべてを、1回の読み取り専用パスでwatch と clean をまとめて実行し、何も変更しません。
ターミナル上では、check、watch、clean は読み取り中に stderr に1行のステータス行を保ち、各パスを通じてトランスクリプトを数えます: indexing secrets(初回は (first run))、checking actions、looking for secrets。stderr がターミナルでない場合、または --json の場合は何も書き込まれません。
ranwhat watch: Claude Code と他のエージェントが実行した内容を監査するClaude Code と他のコーディングエージェントがすでにディスクに書き込んだ内容を読み取ります。ラッパーもプロキシもなく、クリティカルパスに何も入れません。以下の各エージェントはデフォルトで読み取られ、それぞれが履歴を保持する場所から読み取られます(括弧内の変数は、エージェント自体を移動させるのと同じように、その場所を移動させます)。マシン上にないものはスキップされます。
| ソース | 場所 | 形式 |
|---|---|---|
| Claude Code | ~/.claude/projects/*/*.jsonl および各セッションの subagents/**/agent-*.jsonl、または設定されている場合は $CLAUDE_CONFIG_DIR/projects 以下の同じもの | JSONL |
| Codex (CLI, IDE extension, desktop app) | ~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl および archived_sessions/ ($CODEX_HOME); history.jsonl、shell_snapshots/ およびその SQLite スレッドインデックスはシークレットを検索される | JSONL; SQLite は読み取り専用; .jsonl.zst は読み取り専用、Python 3.14 または zstd コマンドがある場合 |
| Gemini CLI | ~/.gemini/tmp/<project>/chats/session-*.jsonl および古い session-*.json ($GEMINI_CLI_HOME) | JSONL, JSON |
| GitHub Copilot CLI | ~/.copilot/session-state/<session>/events.jsonl ($COPILOT_HOME) | JSONL |
| Qwen Code | ~/.qwen/projects/<project>/chats/*.jsonl および古い tmp/<hash>/chats/session-*.json ($QWEN_RUNTIME_DIR, $QWEN_HOME) | JSONL, JSON |
| Grok Build | ~/.grok/sessions/<folder>/<session>/updates.jsonl ($GROK_HOME) | JSONL |
| Droid | ~/.factory/sessions/*.jsonl、およびその下の -<cwd>/*.jsonl と btw/*.jsonl ($FACTORY_HOME_OVERRIDE) | JSONL |
| Kimi Code | ~/.kimi-code/sessions/<folder>/<session>/agents/*/wire.jsonl ($KIMI_CODE_HOME) | JSONL |
| Kimi CLI | ~/.kimi/sessions/<folder>/<session>/wire.jsonl および context*.jsonl ($KIMI_SHARE_DIR) | JSONL |
| Pi | ~/.pi/agent/sessions/--<cwd>--/*.jsonl ($PI_CODING_AGENT_DIR) | JSONL |
| Muse Code | ~/.local/share/muse/sessions/YYYY/MM/DD/<session>/session.jsonl ($XDG_DATA_HOME/muse) | JSONL |
| OpenClaw | $OPENCLAW_STATE_DIR/agents/*/agent/openclaw-agent.sqlite | SQLite, 読み取り専用 |
Meta Muse は Meta のクラウドで実行され、あなたのマシンには何も保持しないため、読むものがありません。Meta のコーディング CLI である Muse Code はサポートされています。 Grok Bot は、あなたのマシン上で実行するコマンドについても、その履歴を xAI のクラウドに保持します。xAI のコーディング CLI である Grok Build はサポートされています。現在の Amp はスレッドを ampcode.com に保持します。Cursor は次です。その形式が一次情報源と照合され次第です。
9つのルール: 認証情報アクセス、ツール呼び出し内のシークレット形状の文字列、パッケージ公開、クラウドリソースの変更、金融API呼び出し、ログ改ざん、破壊的な git、再帰的削除、curl でアップロードされたローカルファイル。各エージェントのツール呼び出しは同じルールで判定され、すべての操作はどのエージェントが実行したかを示します。
ranwhat watch --days 30
ranwhat watch --source codex # one agent (repeatable)
ranwhat watch --path codex=~/work/.codex # an agent's history elsewhere
ranwhat watch --json
ranwhat sources # every agent, where it looked, what it found
--root と --state-dir は今でも動作します。--path claude-code= と --path openclaw= の名前としてです。
ranwhat clean: Claude Code と他のエージェントのトランスクリプト内のシークレットを見つけるエージェントが cat .env を実行すると、その出力がトランスクリプトに書き込まれます: あなたのデータベースパスワード、JWTシークレット、プロバイダトークンが、平文で、Claude Code がデフォルトで30日間保持するファイルの中に。
ranwhat clean # report, then open a review session
ranwhat clean --apply # mask everything without asking
clean はすべてのエージェントの履歴を検索し、エージェントが書き換えを許可するファイル内でのみ値をマスクします: 過去2分間に何も書き込まれていないプレーンな JSONL、JSON、またはテキストファイルです。データベース(Codex のスレッドインデックス、OpenClaw のエージェントデータベース)と圧縮ファイルは読み取り専用です: レポートは、シークレットを保持するそれぞれの名前と、エージェント内でそれを削除する方法を示します。
実際の履歴のスキャンには時間がかかるため、セッションは、あなたに再スキャンさせて対応させるのではなく、たった今見つけた内容に対して開かれたままになります:
ranwhat> list the findings again
ranwhat> show 3 where it appears, and what to roll it at
ranwhat> mask 3 mask just that one
ranwhat> mask all mask everything listed
ranwhat> keep 3 leave it alone
ranwhat> rotate what to rotate, grouped by provider
各検出結果は、それがどのプロジェクトで見つかったか、そしてトランスクリプトがそれを名指ししている場合は、それが読み出されたファイルを示します。なぜなら、64文字の文字列は、どの .env から漏れたかを知らなければ役に立たないからです:
* Stripe live secret key sk_…dc 32 chars seen 8x
read from api/.env
in /Users/you/Desktop/app
リダクションは修復ではありません。 ここで値をマスクしても、それが露出されなかったことにはなりません。それはすでにディスク上にあり、すでにあなたが制御しないモデルコンテキスト内にありました。ローテーションが修正であり、マスクはそれが二度目に漏れるのを止めるだけです。レポートは、安全であるとほのめかすのではなく、そう述べています。
値のそばのキーがそれをシークレットとして名指ししている場合、または値が認識可能な認証情報の形状を帯びている場合にのみ、値をマスクします。プレースホルダー、テンプレートファイル、通常の設定はそのままにされ、公開されたドキュメントの例(AWS の AKIAIOSFODNN7EXAMPLE)や、AKIA1234567890ABCDEF のような明らかなテストフィクスチャも同様です。バックアップは ~/.ranwhat/backups に置かれ、書き換えられたファイルは元のファイルを置き換える前にパースし直されます。
コマンドに入力されたパスワードで、そばにキーがないものは、コマンドがそれを受け取る場所で見つかります: mysql -pPASSWORD(および mysqldump、mysqladmin、mariadb)、sshpass -p、redis-cli -a、docker login -p、curl -u user:password、--password、そして sqlcmd、mongosh、ldapsearch、htpasswd、keytool、ConvertTo-SecureString -AsPlainText、smbclient の同じ場所です。そこにある変数、たとえば -p$MYSQL_PWD はそのままにされます。
check と watch は、clean があなたの履歴のどこかで、すべてのエージェントの中で見つけたすべてのシークレットを隠します。--days と --source が何と言おうと、そのコピーがどこに現れようと: Codex セッションで読み取られたパスワードは、Claude Code がそれを入力した場所で隠されます。毎回すべてのトランスクリプトを読むことなくそれらを知るために、これらは ~/.ranwhat/known/(それが設定されている場合は $RANWHAT_HOME/known/)にインデックスを保持し、Claude Code のトランスクリプトディレクトリごとに1ファイルを持ち、ファイルのサイズまたは変更時刻が変わったときにのみそのファイルを再度読み取ります。初回実行はそれらすべてを読み取り、そう告げます。check は自身のシークレット検索からそれを埋めるので、シークレットのためにトランスクリプトが二度読まれることはありません。
インデックスはソルト付きフィンガープリントを保持し、シークレットそのものは決して保持しません: それぞれについて、その最初の6文字の鍵付き BLAKE2b ハッシュの16ビット(非常に多くの先頭が共有するタグであり、それらについての推測を16ビットを超えて絞り込むことはありません)、その長さ、そして値全体とそのマスクが保持するフィンガープリントの鍵付きハッシュです。鍵はランダムで、マシンごとに一度作られ、インデックスのそばに置かれます。両方のファイルはあなただけが読めます。clean はマスクする前に各シークレットを追加するので、見逃したコピーも、セッションがどう終わろうと隠されたままになります。