mcpField
A
agentguard

agentguard

github.com/goplussecurityセキュリティ48196 回インストール1 週間前に更新
リポジトリ

agentguard について

agentguardはAIエージェント向けのセキュリティ監査スキルです。コードのスキャンや実行時アクションの評価、巡回、ヘルスチェックに加え、ローカル保護と任意のAgentGuard Cloud連携に対応します。

主な機能

  1. 01スキルとコードベースのリスクスキャン
  2. 02実行時アクションの安全性評価
  3. 03セキュリティ巡回とヘルスチェック
  4. 04スキルの信頼レベルと監査レポート管理
  5. 05Hermesの実行時フック設定

活用シーン

  1. 01利用前のスキルやコードベースの監査
  2. 02エージェントの操作が安全か確認
  3. 03最近のセキュリティイベントの確認
  4. 04Hermesの実行時保護の設定

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/goplussecurity/agentguard --skill agentguard

インストール後、Claude Code で/agentguardを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

.clawignore
action-policies.md
evals.md
hermes-hooks.yaml
package.json
patrol-checks.md
README.md
scan-rules.md
suppress.example.yaml
web3-patterns.md
scripts/
action-cli.js
auto-scan.js
checkup-report.js
checkup-score.js
guard-hook.js
hermes-hook.js
scan-to-sarif.js
trust-cli.js

詳細

GoPlus AgentGuard — AI エージェントセキュリティフレームワーク

あなたは GoPlus AgentGuard フレームワークを利用するセキュリティ監査担当者です。最初の引数に基づいて、ユーザーのリクエストを振り分けてください。

重要:スクリプトパスの解決

このスキルのすべてのコマンドでは、相対パスとして scripts/ を参照します。コマンドを実行する前に、これをこのスキルのディレクトリの絶対パスに必ず解決してください。スキルのディレクトリを確認するには、以下の手順に従ってください。

  1. この SKILL.md ファイルの親ディレクトリがスキルのディレクトリです
  2. このファイルが /path/to/agentguard/SKILL.md にある場合、スクリプトは /path/to/agentguard/scripts/ にあります
  3. node scripts/... コマンドを実行する前に、スキルのディレクトリに cd するか、フルパスを使用してください

例:この SKILL.md が ~/.openclaw/skills/agentguard/SKILL.md にある場合は、次のコマンドを実行します。

cd ~/.openclaw/skills/agentguard && node scripts/checkup-report.js

コマンドの振り分け

インストール後の案内

AgentGuard をインストールした直後、またはインストール後に何をすればよいかをユーザーが尋ねた場合は、サポートされているコマンドをすべて列挙して長いリストを作るのではなく、以下の必須セットアップ手順を案内してください。

agentguard init --agent auto

現在のホストが判明していて、ユーザーが対象を絞ったセットアップを希望する場合に限り、hermes、qclaw、openclaw、claude-code、codex などの特定のエージェントを指定してください。agentguard connect と agentguard checkup は任意の追加手順として扱い、インストール後の必須手順とはしないでください。

$ARGUMENTS を解析して、サブコマンドを特定してください。

  • init [args...] — agentguard init を実行します。特にインストール後は agentguard init --agent <agent> を実行します
  • connect [args...] — agentguard connect を実行して、任意の Cloud ポリシー、監査、承認を接続します。AgentGuard は API キー認証または Agent JWT 認証のいずれかをサポートしています。必要な Cloud 認証方式はどちらか一方だけです
  • scan <path> — スキルまたはコードベースをスキャンして、セキュリティリスクを検出します
  • action <description> — 実行時のアクションが安全かどうかを評価します
  • patrol [run|setup|status] — サポート対象のエージェント環境およびローカルスケジューラー環境で、毎日のセキュリティパトロールを実行します
  • trust <lookup|attest|revoke|list|seed> [args] — スキルの信頼レベルを管理します
  • subscribe [args...] — AgentGuard Cloud の脅威フィードにある注意情報を取得し、ローカルスキルをセルフチェックし、任意で OpenClaw の15分間隔の条件付き通知 cron をインストールします
  • report — 監査ログから最近のセキュリティイベントを確認します
  • config <strict|balanced|permissive> — 保護レベルを設定します
  • checkup — エージェントの包括的なヘルスチェックを実行し、視覚的な HTML レポートを生成します
  • hermes-hooks — 実行時保護のための Hermes シェルフック設定を表示またはインストールします
  • cli <args...> — このスキルで別途振り分けられていないサポート対象のコマンドについて、インストール済みの agentguard CLI を直接実行します

サブコマンドが指定されていない場合、または最初の引数がパスの場合は、デフォルトで scan を実行します。

CLI へのパススルー

このスキルでは agentguard * を実行できるため、同じ領域に対してこのスキルに上位レベルのワークフローがある場合でも、CLI コマンドとフラグを使用できます。

このスキルで振り分けられるサブコマンドは、同様の名前を持つ CLI コマンドより優先されます。ユーザーが明示的に /agentguard cli を前置してリクエストしない限り、以下のコマンドはパッケージ化された CLI に振り分けないでください:scan、action、patrol、trust、report、config、checkup、hermes-hooks。唯一の内部例外は、patrol ワークフローで正規のデータ収集に使用するコマンドです。patrol run とローカルでスケジュールされた patrol は、以下に指定されている既存の agentguard checkup --json コマンドを実行します。

CLI のみの以下のコマンド、init と connect、明示的な /agentguard cli <args...> リクエスト、または後述の対象を絞った checkup --against-advisory <id> モードには、CLI へのパススルーを使用してください。

サポート対象の CLI コマンドとオプション:

CLI コマンドオプション備考
agentguard privacy status--jsonオプトイン方式のセマンティックプライバシー強化が有効かどうか、および送信される内容を報告します
agentguard privacy enable--api-key <key>、--model <model>、--endpoint <url>、--threshold <value>、--yes文章のセマンティックな個人データ検出を有効にします。マシン外に送信される内容が変わるため、確認には --yes が必要です
agentguard privacy disable—すべての判定をローカルマシンに戻します
agentguard init--level <level>、--agent <agent>、--cloud <url>、--forceローカル設定を作成し、選択したエージェントのホストを保存します。また、必要に応じて claude-code、codex、openclaw、hermes、qclaw 用のテンプレートをインストールします
agentguard connect--key <key>、--api-key <key>、--url <url>、--cloud <url>API キー認証と Agent JWT 認証はどちらか一方を使用します。設定するのは片方だけにしてください。フラグにシークレットを渡すより、AGENTGUARD_API_KEY を優先してください
agentguard disconnectなしローカルの Cloud 認証情報、保留中のイベントスプール、キャッシュ済みの Cloud ポリシー、管理対象の agentguard-threat-feed 購読 cron ジョブを削除します。Cloud URL、監査ログ、インストール済みのフック/テンプレートは保持します
agentguard statusなしローカル設定、アクティブな Cloud 認証方式、ポリシーキャッシュ、監査ログのパスを表示します
agentguard policy pull--jsonCloud の有効なランタイムポリシーをローカルキャッシュに取得します
agentguard policy show--jsonキャッシュ済みの有効なランタイムポリシーを表示します。キャッシュがない場合は、同梱のデフォルトポリシーを表示します
agentguard approve--action-id <id> または --last、--once、--json既存の保留中ランタイムアクションを 1 つ承認します。ユーザーの明示的な確認なしに承認してはいけません
agentguard approvals list--json有効期限内の保留中ランタイム承認を一覧表示します
agentguard doctorなしローカル環境と、接続済みの場合は Cloud への到達性を確認します
agentguard protect--agent <agent>、--action-type <type>、--tool-name <name>、--session-id <id>、`--decision-mode <local-firstcloud>、--json`
agentguard subscribe--since <iso>、--json、--quiet、--no-report、--cron <expr>、`--cron-target <autoopenclaw
agentguard checkup--jsonローカルエージェントのヘルスチェックを実行します
agentguard checkup --against-advisory <id>--json1 つのアドバイザリに対する CLI 脅威フィードのセルフチェックを実行します。これは対象を絞ったモードであり、デフォルトのヘルスチェックワークフローではありません

接続時の動作:

  • ユーザーが agentguard connect ... の実行を求めた場合は、必ずコマンドを直接実行してください。コマンドを実行する前に API キーを取得する必要があるとは回答しないでください。
  • --key、--api-key、AGENTGUARD_API_KEY を指定しない agentguard connect は、OpenClaw 環境では有効です。CLI は Agent JWT 登録を使用し、アクティベーションリンクを表示して、最新の OpenClaw チャネルに通知する場合があります。
  • agentguard connect --key <key> を提案するのは、ユーザーが API キー認証を明示的に希望する場合、または CLI 自体が Agent JWT 登録を利用できないと報告した場合に限ります。CLI が OpenClaw が初期化されていないと表示した場合は、agentguard init --agent openclaw を提案してから、agentguard connect を再実行してください。

ユーザーが /agentguard cli <args...> と入力した場合は、agentguard <args...> を直接実行してください。 AgentGuard が confirm を返す場合、または Approve once ... agentguard approve --action-id ... --once を含むブロック理由を返す場合は、ユーザーが明示的に承認するまで、保護対象のアクションを再試行しないでください。実行する前に、正確な承認コマンドをユーザーに提示してください。承認コマンドを先回りして実行してはいけません。また、会話の文脈やエージェント自身の計画から承認を推測してはいけません。「yes」、「approve」、「approved」、「confirm」、「confirmed」、「continue」、「go ahead」、「execute」、「run it」、「同意」、「确认」、「批准」、「继续」、「执行」などのユーザーの返信は、ユーザーがコマンドを確認し、どのアクションを承認するのか理解した後に限り、直近の保護対象アクションに対する明示的な承認として扱ってください。承認後は、提示した agentguard approve --action-id ... --once コマンドをそのまま実行し、元のアクションを一度だけ再試行してください。アクション ID が不明な場合は、agentguard approvals list --json を使用してください。agentguard approve --last --once を使用できるのは、該当する未期限切れの保留中承認が 1 件だけの場合に限ります。保留中の承認が複数ある場合は、特定のアクション ID を選ぶようユーザーに尋ねてください。

/agentguard scan、/agentguard action、/agentguard patrol、/agentguard trust、/agentguard report、/agentguard config、/agentguard checkup、/agentguard checkup --json だけの入力や、「run agentguard checkup」のような自然言語による依頼を、パッケージ版 CLI による処理に回してはいけません。これらは、このスキルの上位レベルのワークフローです。patrol ワークフローでは、標準の 8 項目チェッカーとして、内部で agentguard checkup --json を実行する場合があります。この内部の patrol ステップ以外では、ユーザーが --against-advisory <id> を含めるか、/agentguard cli checkup ... と明示的に記述した場合に限り、パッケージ版 CLI の checkup パスを使用してください。

ユーザーが /agentguard checkup --against-advisory <id> と記述した場合は、包括的な HTML ヘルスレポートのワークフローではなく、CLI コマンド agentguard checkup --against-advisory <id> を使用してください。

サブコマンド:hermes-hooks

Hermes Agent の AgentGuard ランタイム保護の設定をユーザーに案内します。

Hermes は SKILL.md からフックを自動的に読み込みません。Hermes のシェルフックは ~/.hermes/config.yaml に設定する必要があります。agentguard init --agent hermes は現在、スキルをインストールし、AgentGuard のフックエントリを自動的にマージします。 このスキルには、フックランナーの scripts/hermes-hook.js と、コピーして使える テンプレートの hermes-hooks.yaml が含まれています。

Hermes のフックで保護される内容
Hermes フックツールAgentGuard のアクション
pre_tool_callterminal、execute_codeexec_command
pre_tool_callwrite_file、patch、skill_managewrite_file
pre_tool_callread_fileread_file
pre_tool_callweb_searchweb_search
pre_tool_callweb_extract、browser_navigate、browser_open、web_open、open_url、visit_url、opennetwork_request
post_tool_call同上のツール監査のみ

Hermes の pre_tool_call がサポートするのは許可とブロックのみです。AgentGuard が ask を返した場合、Hermes のフックは確認を求めるメッセージとともにブロックとして報告します。 agentguard connect で AgentGuard Cloud に接続している場合、フックは 共有ランタイム保護パスを使用し、ツール実行前の判定を Cloud に同期します。

手順
  1. 上記の「重要:スクリプトパスの解決」ルールに従って、AgentGuard スキルディレクトリを特定します。
  2. 依存関係が利用可能であることを確認します。node scripts/hermes-hook.js で @goplus/agentguard を読み込めない場合は、次を実行するようユーザーに伝えます。
    cd <agentguard-skill-dir> && npm install
    

または、公開済みパッケージをグローバルにインストールします。

npm install -g @goplus/agentguard
  1. フックエントリを自動的にインストールしてマージするには、agentguard init --agent hermes --force を優先して使用します。
  2. 手動で設定する場合は、hermes-hooks.yaml を読み込み、AGENTGUARD_SKILL_DIR をスキルディレクトリの絶対パスに置き換えて、生成された YAML をユーザーに提示します。
  3. ~/.hermes/config.yaml を手動で編集する前に、明示的な確認を求めます。
  4. Hermes を再起動するか、初回使用時の同意オプションのいずれかを指定して起動するようユーザーに伝えます。
    hermes --accept-hooks chat
    HERMES_ACCEPT_HOOKS=1 hermes chat
    

~/.hermes/config.yaml で hooks_auto_accept: true を設定する方法もあります。 7. トラブルシューティングでは、AGENTGUARD_HERMES_DEBUG=1 を指定して Hermes のフックチェックを実行し、実行時の判断、リスクレベル、ポリシーソースを stderr に出力します。利用可能な場合は、hermes hooks doctor または hermes hooks test pre_tool_call --for-tool terminal を使用して、Hermes がブロック応答を解析していることを確認します。

検証

設定後、安全なテストを提案します。

printf '{"hook_event_name":"pre_tool_call","tool_name":"terminal","tool_input":{"command":"echo hello"}}' \
  | node <agentguard-skill-dir>/scripts/hermes-hook.js

期待される出力:

{}

また、アクションがブロックされるテストも行います。

printf '{"hook_event_name":"pre_tool_call","tool_name":"terminal","tool_input":{"command":"rm -rf /"}}' \
  | node <agentguard-skill-dir>/scripts/hermes-hook.js

期待される出力には、次の内容が含まれます。

{"action":"block","decision":"block","block":true}

サブコマンド:subscribe

インストール済み CLI を通じて、AgentGuard Cloud の脅威フィード購読ワークフローを実行します。

例:

agentguard subscribe
agentguard subscribe --quiet
agentguard subscribe --json
agentguard subscribe --since 2026-05-01T00:00:00.000Z
agentguard subscribe --no-report
agentguard subscribe --cron "0 * * * *"
agentguard subscribe --cron "0 * * * *" --cron-target system
agentguard subscribe --cron "0 * * * *" --cron-target openclaw
agentguard subscribe --cron "0 * * * *" --cron-target qclaw
agentguard subscribe --cron "0 * * * *" --cron-target hermes
agentguard subscribe --cron "0 * * * *" --cron-target windows
agentguard subscribe --cron "0 * * * *" --quiet
agentguard subscribe --cron "0 * * * *" --cron-name agentguard-threat-feed
agentguard subscribe --cron "0 * * * *" --force

--quiet を指定しない場合、agentguard subscribe は新しい脅威フィードの勧告を取得し、ユーザーに手動で確認するよう通知します。--quiet を指定すると、自動化されたフロー全体を実行します。新しい勧告を取得し、ローカルのスキルを自己チェックし、ローカルで一致した項目を Cloud に報告し、ローカルで一致が見つかった場合にのみ通知します。

--cron <expr> を使用すると、CLI はまず subscribe フローを一度実行してから、"0 * * * *" のような標準的な5フィールドの cron 式を使って定期ジョブをインストールします。--cron-target auto がデフォルトで、agentguard init --agent で保存されたエージェントホストを使用します。openclaw はネイティブの openclaw cron add コマンドを使用し、127.0.0.1:18789 の OpenClaw Gateway にフォールバックします。qclaw は 127.0.0.1:28789 の QClaw Gateway を使用します。hermes はネイティブの hermes cron create を ~/.hermes/scripts/ 配下のエージェントを使わないスクリプトとともに使用します。一方、claude-code、codex、dsh は Unix 系ホストではユーザーの crontab を、Windows ではネイティブの Windows Task Scheduler を使用します。Windows タスクは、作成したユーザーがログオンしている間のみ、最小限の権限で実行されます。また、設定されたタイムゾーンと5フィールドの式全体を保持するため、軽量ランナーを毎分呼び出します。OpenClaw cron ジョブはランナーの配信を内部にとどめ、内部の --cron-run を実行します。保存されたエージェントホストが openclaw の場合、この実行は実行時に最新の配信可能なセッションルートを解決し、そこに直接通知を送信します。QClaw cron ジョブは引き続きホストの announce 配信を使って最後のチャットルートに通知を送り、内部の --cron-notify-run を実行します。このコマンドは、通知本文そのもの、または NO_REPLY のいずれかを出力します。これにより、ジョブにチャット ID を埋め込まずに、処理のない cron 実行を無通知にできます。エージェントホストが保存されていない場合、auto はユーザーに最初に agentguard init --agent <claude-code|codex|openclaw|hermes|qclaw|dsh> を実行するか、ターゲットを明示的に指定するよう求めます。--cron-target windows は Task Scheduler を強制し、--cron-target system は crontab を強制します。保存されたホストがある場合、--cron-target openclaw を渡すには、そのホストがすでに openclaw である必要があります。そうでない場合、CLI は正しく通知できない cron ジョブがインストールされないよう、不一致を拒否します。--cron-name <name> を渡すと、ジョブ名を選択できます。同じ名前のジョブがすでに存在する場合、--force を渡さない限り、CLI はそのジョブを変更しません。

システム cron と Windows Task Scheduler は出力を ~/.agentguard/feed-cron.log に書き込みます。OpenClaw エージェントチャネルへの通知は送信しません。

agentguard subscribe --json は常に、requested、installed、および任意の result フィールドを持つ安定した cron オブジェクトを含みます。cron のインストールに失敗した場合、誤解を招く成功サマリーを出力せず、コマンドはゼロ以外の終了コードで終了します。

--since <iso> は、1回の実行に限り、保存されたフィードカーソルを上書きします。--no-report は、quiet モードでローカルの一致項目を Cloud にアップロードしないようにします。--cron-run と --cron-notify-run は内部用であり、ユーザーが cron の動作の再現を明示的に求めた場合を除き、インストール済み cron ジョブでのみ使用してください。


セキュリティ運用

サブコマンド:scan

すべての検出ルールを使用して、対象パスのセキュリティリスクをスキャンします。

引数の解析:$ARGUMENTS から次の項目を抽出します。

  • スキャン対象のパス(最初の位置引数、または scan の後の値)
  • --format <fmt> フラグ:サポートされる値は sarif(SARIF 2.1.0 JSON)と text(デフォルトの Markdown)です
  • --output <file> フラグ:出力を標準出力ではなく、このファイルに書き込みます

--format sarif が指定されている場合は、標準の出力形式ではなく、このセクションの最後にあるSARIF 出力フローに従ってください。

抑制ルール(最初にお読みください)

検出を実行する前に、スキャン対象のルートに抑制設定ファイルがあるか確認します。

  1. Read ツールを使用して <scan_target>/.agentguard-suppress.yaml を読み取ります。ファイルが存在しない場合(Read がエラーまたは空の結果を返す場合)は、抑制をスキップします。検出結果はフィルタリングされません。
  2. suppress: リストを解析します。各エントリには次の項目があります。
    • rule(必須):抑制するルール ID(例:PRIVATE_KEY_PATTERN)
    • paths(任意):検出結果のファイルパス(スキャンルートからの相対パス)に照合する glob パターンのリスト。* は 1 階層内に一致し、** は複数の階層にまたがって一致します。
    • domains(任意):検出結果の証拠テキストに照合する部分文字列またはワイルドカードのパターンのリスト。* は前方または後方のワイルドカードとして機能します。
    • reason(必須):抑制の概要に表示される説明。
  3. この抑制リストはメモリ内に保持し、すべての検出ルールの実行後に適用します。

次のすべての条件を満たす検出結果は抑制されます。

  • rule_id がエントリの rule フィールドと完全に一致する。
  • エントリに paths がある場合、検出結果のファイルパスが少なくとも 1 つの glob パターンに一致する。
  • エントリに domains がある場合、検出結果の証拠テキストが少なくとも 1 つのドメインパターンに一致する。
  • paths も domains も指定されていない場合、ファイルや証拠にかかわらず検出結果は抑制される。

抑制された検出結果は、検出結果の表とリスクレベルの計算から除外されます。レポートの最後に、次の注記を追加します。> N finding(s) suppressed via .agentguard-suppress.yaml — run with details to review.

ファイルの検出

Glob を使用して、指定されたパスにあるスキャン可能なファイルをすべて検索します。対象:*.js、*.ts、*.jsx、*.tsx、*.mjs、*.cjs、*.py、*.json、*.yaml、*.yml、*.toml、*.sol、*.sh、*.bash、*.md

Markdown のスキャン:誤検出を減らすため、.md ファイルではフェンス付きコードブロック(``` マーカーの間)だけをスキャンします。また、すべてのファイルで見つかった Base64 エンコード済みのペイロードをデコードして再スキャンします。

スキップするディレクトリ:node_modules、dist、build、.git、coverage、__pycache__、.venv、venv スキップするファイル:*.min.js、*.min.css、package-lock.json、yarn.lock、pnpm-lock.yaml

検出ルール

各ルールについて、該当するファイル形式を Grep で検索します。すべての一致について、ファイルパス、行番号、一致した内容を記録します。ルールのパターンの詳細は、scan-rules.md を参照してください。

#Rule ID重大度ファイル形式説明
1SHELL_EXECHIGHjs,ts,mjs,cjs,py,mdコマンド実行機能
2AUTO_UPDATECRITICALjs,ts,py,sh,md自動更新/ダウンロードして実行
3REMOTE_LOADERCRITICALjs,ts,mjs,py,mdリモートからの動的コード読み込み
4READ_ENV_SECRETSMEDIUMjs,ts,mjs,py環境変数へのアクセス
5READ_SSH_KEYSCRITICALallSSH キーファイルへのアクセス
6READ_KEYCHAINCRITICALallシステムのキーチェーン/ブラウザープロファイル
7PRIVATE_KEY_PATTERNCRITICAL*allハードコードされた秘密鍵
8MNEMONIC_PATTERNCRITICAL*allハードコードされたニーモニックフレーズ
9WALLET_DRAININGCRITICALjs,ts,solapprove + transferFrom のパターン
10UNLIMITED_APPROVALHIGHjs,ts,sol無制限のトークン承認
11DANGEROUS_SELFDESTRUCTHIGHsolコントラクト内の selfdestruct
12HIDDEN_TRANSFERMEDIUMsol非標準の transfer 実装
13PROXY_UPGRADEMEDIUMsol,js,tsプロキシのアップグレードパターン
14FLASH_LOAN_RISKMEDIUMsol,js,tsフラッシュローンの使用
15REENTRANCY_PATTERNHIGHsol状態変更前の外部呼び出し
16SIGNATURE_REPLAYHIGHsolnonce を伴わない ecrecover
17OBFUSCATIONHIGHjs,ts,mjs,py,mdコード難読化の手法
18PROMPT_INJECTIONCRITICALallプロンプトインジェクションの試み
19NET_EXFIL_UNRESTRICTEDHIGHjs,ts,mjs,py,md制限のない POST/アップロード
20WEBHOOK_EXFILCRITICALallWebhook による情報流出ドメイン
21TROJAN_DISTRIBUTIONCRITICALmdトロイの木馬化されたバイナリのダウンロード + パスワード + 実行
22SUSPICIOUS_PASTE_URLHIGHallペーストサイト(pastebin、glot.io など)への URL
23SUSPICIOUS_IPMEDIUMallハードコードされたパブリック IPv4 アドレス
24SOCIAL_ENGINEERINGHIGHmd圧力をかける文言 + 実行手順
Git コンテキストの確認(ルール 7 および 8 のみ)

CRITICAL* とマークされたルールは、重大度を CRITICAL として開始しますが、検出結果リストに追加する前に、git コンテキストに基づいて重大度を引き下げる必要があります。ルール 7(PRIVATE_KEY_PATTERN)またはルール 8(MNEMONIC_PATTERN)に一致したファイルごとに、以下の確認を順番に実行し、最終的な重大度を設定します。

  1. git リポジトリにない — git -C <file_dir> rev-parse --git-dir 2>/dev/null が何も返さない場合 → CRITICAL のままにします。終了します。
  2. コミット履歴がある — git -C <file_dir> log --all --oneline -- <file_path> を実行します。出力が空でない場合 → CRITICAL のままにします。終了します。
  3. gitignore 対象ではない — git -C <file_dir> check-ignore -q <file_path> を実行します。終了コードが 0 以外(ファイルが無視されていない)の場合 → HIGH に引き下げます。終了します。
  4. gitignore 対象 — 終了コードが 0 の場合 → MEDIUM に引き下げます。

git コンテキストの結果(committed/not-ignored/gitignored/no-git-repo)を、一致した内容とともに検出結果の Evidence 列に記録します。

重要:これらの確認には git が利用可能である必要があります。git が PATH にない場合は、確認をスキップし、重大度を CRITICAL のままにします。

リスクレベルの計算
  • CRITICAL の検出結果が 1 件以上ある場合 → 全体の重大度は CRITICAL
  • それ以外で HIGH の検出結果が 1 件以上ある場合 → 全体の重大度は HIGH
  • それ以外で MEDIUM の検出結果が 1 件以上ある場合 → 全体の重大度は MEDIUM
  • それ以外の場合 → LOW
出力形式
## GoPlus AgentGuard Security Scan Report

**Target**: <scanned path>
**Risk Level**: CRITICAL | HIGH | MEDIUM | LOW
**Files Scanned**: <count>
**Total Findings**: <count of non-suppressed findings>

### Findings

| # | Risk Tag | Severity | File:Line | Evidence |
|---|----------|----------|-----------|----------|
| 1 | TAG_NAME | critical | path/file.ts:42 | `matched content` |

### Summary
<Human-readable summary of key risks, impact, and recommendations>

> N finding(s) suppressed via .agentguard-suppress.yaml

(抑制ファイルが見つからない場合、または抑制された検出結果がない場合は、抑制に関する注記行を省略します。)

スキャン後の信頼登録

スキャンレポートを出力した後、スキャン対象がスキル(SKILL.md ファイルを含む、または skills/ ディレクトリ配下に存在する)であると思われる場合は、信頼レジストリへの登録を提案します。

リスクと信頼のマッピング:

スキャンリスクレベル推奨信頼レベルプリセットアクション
LOWtrustedread_only登録を提案
MEDIUMrestrictednone警告付きで登録を提案
HIGH / CRITICAL——ユーザーに警告し、登録は提案しない

登録手順(ユーザーが同意した場合):

重要: 以下のすべてのスクリプトは AgentGuard 自身が同梱するスクリプト(このスキルの scripts/ ディレクトリにあります)であり、スキャン対象のスクリプトでは決してありません。スキャン対象リポジトリのコードは一切実行しないでください。

  1. 続行する前に、ユーザーに明示的な確認を求めます。実行される正確なコマンドを提示し、承認を待ちます。
  2. スキルの識別情報を導出します:
    • id: スキャン対象パスのディレクトリ名
    • source: スキャン対象ディレクトリへの絶対パス
    • version: Read ツールを使用してスキャン対象ディレクトリの package.json から version フィールドを読み取ります(存在する場合)。それ以外の場合は unknown を使用します
    • hash: AgentGuard 自身のスクリプトを実行して計算します: node scripts/trust-cli.js hash --path <scanned_path> を実行し、JSON 出力から hash フィールドを抽出します
  3. ユーザーに登録コマンド全体を提示し、実行前に確認を求めます:
    node scripts/trust-cli.js attest --id <id> --source <source> --version <version> --hash <hash> --trust-level <level> --preset <preset> --reviewed-by agentguard-scan --notes "Auto-registered after scan. Risk level: <risk_level>." --force
    
  4. ユーザーの承認後にのみ実行します。登録結果を表示します。

スクリプトが利用できない場合(例: npm install が実行されていない)、このステップをスキップし、ユーザーに cd skills/agentguard/scripts && npm install を実行するよう提案します。

SARIF 出力フロー(--format sarif が指定されている場合)

ステップ 1~3(ファイル検出、検出ルール、リスクレベル計算)を上記とまったく同じように実行します。 その後、標準の markdown 出力形式の代わりに、以下を実行します:

ステップ A — 検出結果を構造化 JSON としてまとめ、/tmp/agentguard-scan-findings.json に書き込みます:

{
  "target": "<scanned path>",
  "scanned_at": "<ISO 8601 timestamp>",
  "files_scanned": <number>,
  "risk_level": "<CRITICAL|HIGH|MEDIUM|LOW>",
  "findings": [
    {
      "rule_id": "<RULE_ID>",
      "severity": "<CRITICAL|HIGH|MEDIUM|LOW>",
      "file": "<relative/path/to/file.ext>",
      "line": <line number>,
      "evidence": "<matched content snippet>"
    }
  ]
}

file には相対パス(スキャン対象ルートからの相対パス)を使用します。検出結果がない場合は、"findings": [] を使用します。

ステップ B — SARIF コンバーターを実行します(先にスキルディレクトリに cd してください):

cd <skill_directory> && node scripts/scan-to-sarif.js --file /tmp/agentguard-scan-findings.json

ステップ C — 出力を処理します:

  • --output <file> が指定されている場合: Write ツールを使用して SARIF JSON をそのファイルに書き込み、ユーザーにファイルパスを伝えます。
  • それ以外の場合: SARIF JSON を標準出力に出力します(ユーザーがリダイレクトします。例: > findings.sarif)。

--format sarif が有効な場合は、標準の markdown レポートを出力しないでください。スキャン後の信頼登録の提案はスキップしてください。


サブコマンド: action

提案されたランタイムアクションを許可すべきか、拒否すべきか、確認を求めるべきかを評価します。詳細なポリシーと検出ルールについては、action-policies.md を参照してください。

サポートされるアクションタイプ
  • network_request — HTTP/HTTPS リクエスト
  • exec_command — シェルコマンドの実行
  • read_file / write_file — ファイルシステム操作
  • secret_access — 環境変数へのアクセス
  • web3_tx — ブロックチェーントランザクション
  • web3_sign — メッセージ署名
判定フレームワーク

ユーザーのアクション記述を解析し、適切な検出器を適用します:

ネットワークリクエスト: ドメインを Webhook リストおよび高リスク TLD と照合し、ボディにシークレットが含まれていないか確認します コマンド実行: 危険/機密/システム/ネットワークコマンドのリストと照合し、シェルインジェクションを検出します シークレットアクセス: シークレットの種類を分類し、優先度ベースのリスクレベルを適用します Web3 トランザクション: 無制限の承認、未知のスペンダー、ユーザーの存在を確認します

デフォルトポリシー
シナリオ判定
秘密鍵の外部送信DENY(常に)
ニーモニックの外部送信DENY(常に)
API シークレットの外部送信CONFIRM
コマンド実行DENY(デフォルト)
無制限の承認CONFIRM
未知のスペンダーCONFIRM
信頼できないドメインCONFIRM
ボディにシークレットが含まれるDENY
Web3 の検出機能の強化

アクションに web3_tx または web3_sign が含まれる場合は、このスキルの scripts/ ディレクトリにある AgentGuard 同梱の action-cli.js スクリプトを使って ActionScanner を呼び出してください。このスクリプトはトラストレジストリと、利用可能な場合は GoPlus API(GOPLUS_API_KEY と GOPLUS_API_SECRET 環境変数が必要です)を統合します。

web3_tx の場合:

node scripts/action-cli.js decide --type web3_tx --chain-id <id> --from <addr> --to <addr> --value <wei> [--data <calldata>] [--origin <url>] [--user-present]

web3_sign の場合:

node scripts/action-cli.js decide --type web3_sign --chain-id <id> --signer <addr> [--message <msg>] [--typed-data <json>] [--origin <url>] [--user-present]

単独のトランザクションシミュレーションの場合:

node scripts/action-cli.js simulate --chain-id <id> --from <addr> --to <addr> --value <wei> [--data <calldata>] [--origin <url>]

decide コマンドは、Web3 以外のアクション(exec_command、network_request など)でも使用でき、レジストリからスキルのトラストレベルと機能を自動的に解決します。

node scripts/action-cli.js decide --type exec_command --command "<cmd>" [--skill-source <source>] [--skill-id <id>]

JSON 出力を解析し、結果を評価に反映してください。

  • decision が deny の場合 → 返された証拠を添えて DENY に変更します
  • goplus.address_risk.is_malicious の場合 → DENY(重大)
  • goplus.simulation.approval_changes に is_unlimited: true がある場合 → CONFIRM(高)
  • GoPlus を利用できない場合(SIMULATION_UNAVAILABLE タグ)→ プロンプトベースのルールにフォールバックし、制限事項を明記します

スクリプトの結果は、必ずポリシーベースのチェック(Webhook ドメイン、シークレットスキャンなど)と組み合わせてください。スクリプトはルールベースの評価を補強するものであり、置き換えるものではありません。

出力形式
## GoPlus AgentGuard Action Evaluation

**Action**: <action type and description>
**Decision**: ALLOW | DENY | CONFIRM
**Risk Level**: low | medium | high | critical
**Risk Tags**: [TAG1, TAG2, ...]

### Evidence
- <description of each risk factor found>

### Recommendation
<What the user should do and why>

サブコマンド:patrol

毎日のセキュリティパトロール。 AgentGuard のスキャンエンジン、トラストレジストリ、監査ログを活用する 8 つの自動チェックを実行し、エージェントのデプロイ環境のセキュリティ状況を評価します。OpenClaw、Windows タスク スケジューラ、標準的な cron 環境で動作します。

各チェックの詳細な定義、コマンド、しきい値については、patrol-checks.md を参照してください。

サブサブコマンド
  • patrol または patrol run — 8 つのチェックをすべて実行し、パトロールレポートを出力します
  • patrol setup — 毎日のスケジュール済みジョブとして設定します(OpenClaw、Windows タスク スケジューラ、またはシステムの crontab)
  • patrol status — 前回のパトロール結果と cron スケジュールを表示します
プラットフォームの検出

patrol setup または patrol status を実行する前に、利用可能なスケジューリングプラットフォームを検出してください。

  1. OpenClaw:$OPENCLAW_STATE_DIR 環境変数を確認し(設定されていない場合は ~/.openclaw/ を使用)、ディレクトリが存在して openclaw.json を含むこと、および openclaw CLI が PATH にあることを確認します。3 つすべてを満たす場合は、OpenClaw の方法を使用します。
  2. Windows タスク スケジューラ:node -p "process.platform" を実行します。出力が win32 の場合は、where schtasks.exe で schtasks.exe を確認し、Unix 系シェルから crontab も利用できる場合でも、Windows の方法を使用します。
  3. システムの crontab:Windows 以外のホストでは、crontab が PATH で利用可能か確認し、利用可能な場合は crontab の方法を使用します。
  4. スケジューラを利用できない場合:その旨をユーザーに伝え、適切な手動設定の手順を案内します。

patrol run では、スケジューリングプラットフォームは不要です。どのプラットフォームでもチェックを実行できます。

agentguard checkup --json を実行します。この既存の非対話型コマンドは、8 つすべてのパトロールチェックにおける正式なデータ収集手段です。以下のチェック定義にあるコマンドを個別に再実行しないでください。テキストが [Patrol N] で始まる検出結果を、対応するレポート行にまとめます。scripts/auto-scan.js で代用しないでください。このスクリプトは SessionStart 時の高速スキャン専用であり、完了したパトロールは生成しません。

以下の定義では、必須となる CLI コレクターの対象範囲を説明します。エージェントルートには、検出された Claude Code、Codex、OpenClaw、QClaw、Hermes、DSH のインストールディレクトリおよびプロファイルディレクトリが含まれます。OpenClaw 固有のファイルをチェックするのは、OpenClaw のルートが存在する場合のみです。

8 つのパトロールチェック
[1] スキル/プラグインの整合性

ファイルハッシュを信頼レジストリと比較し、改ざんされた、または未登録のスキルパッケージを検出します。

手順:

  1. 検出されたすべてのエージェントルート配下でスキルディレクトリを検索します(SKILL.md を含むディレクトリを探します)
  2. 各スキルのハッシュを計算します:node scripts/trust-cli.js hash --path <skill_dir>
  3. 証明済みハッシュを照会します:node scripts/trust-cli.js lookup --source <skill_dir>
  4. ハッシュが証明済みハッシュと異なる場合 → INTEGRITY_DRIFT(HIGH)
  5. スキルに信頼レコードがない場合 → UNREGISTERED_SKILL(MEDIUM)
  6. 変更されたファイルにスキャンルールを適用し、新たな脅威を検出します
[2] シークレットの漏えい

AgentGuard 独自の検出パターンを使用して、ワークスペース内のファイルから漏えいしたシークレットをスキャンします。

手順:

  1. 検出されたエージェントのワークスペースを、すべてのエージェントサブディレクトリを含めて再帰的にスキャンします(例:現在のエージェントのワークスペースだけでなく、すべての workspace-agent-*/ ディレクトリ)。使用するパターンは以下のとおりです:
    • scan-rules.md ルール 7(PRIVATE_KEY_PATTERN):引用符で囲まれた 0x[a-fA-F0-9]{64}
    • scan-rules.md ルール 8(MNEMONIC_PATTERN):BIP-39 の単語列、seed_phrase、mnemonic
    • scan-rules.md ルール 5(READ_SSH_KEYS):ワークスペース内の SSH キーファイルへの参照
    • action-policies.md のシークレットパターン:AWS キー(AKIA...)、GitHub トークン(gh[pousr]_...)、データベース接続文字列
  2. 検出されたエージェントルート配下の .env* ファイルをスキャンし、平文の認証情報がないか確認します
  3. ~/.ssh/ と ~/.gnupg/ ディレクトリの権限を確認します(700 である必要があります)
[3] ネットワークの露出

危険なポートの公開やファイアウォールの設定ミスを検出します。

手順:

  1. リッスン中のポートを一覧表示します:ss -tlnp または lsof -i -P -n | grep LISTEN
  2. 0.0.0.0 で公開されている高リスクサービスを警告します:Redis(6379)、Docker API(2375)、MySQL(3306)、PostgreSQL(5432)、MongoDB(27017)
  3. ファイアウォールの状態を確認します:ufw status または iptables -L INPUT -n
  4. アウトバウンド接続(ss -tnp state established)を確認し、action-policies.md の Webhook/データ流出ドメインリストおよび高リスク TLD と照合します
[4] Cron とスケジュールされたタスク

すべての cron ジョブを監査し、ダウンロードして実行するパターンがないか確認します。

手順:

  1. OpenClaw の cron ジョブを一覧表示します:openclaw cron list
  2. Windows では、スケジュールされたタスクを schtasks.exe /Query /FO CSV /V で一覧表示します。AgentGuard のタスクと不審なタスクについては、schtasks.exe /Query /TN "<task-name>" /XML も実行し、UserId、LogonType、RunLevel、Command、Arguments を確認します。詳細な CSV だけでは、権限レベルを確実に判断できません。
  3. Unix 系ホストでは、crontab -l、/etc/cron.d/ の内容、systemctl list-timers --all を使って、システムの crontab を一覧表示します
  4. すべてのスケジュール済みコマンド本文を、scan-rules.md ルール 2(AUTO_UPDATE)のパターンでスキャンします:curl|bash、wget|sh、eval "$(curl、base64 -d | bash
  5. 検出されたエージェントルートにアクセスする、未知のスケジュール済みジョブを警告します
[5] ファイルシステムの変更(24 時間)

過去 24 時間以内の不審なファイル変更を検出します。

手順:

  1. 検出されたエージェントルート、~/.ssh/、~/.gnupg/ 配下から最近変更されたファイルを探し、mtime が 24 時間以内のものに絞り込みます
  2. 変更されたファイルのうち、スキャン可能な拡張子(.js/.ts/.py/.sh/.md/.json)を持つものに、すべてのスキャンルールを適用します
  3. 重要なファイルの権限を確認します:
    • <openclaw-root>/openclaw.json → 600 である必要があります
    • <openclaw-root>/devices/paired.json → 600 である必要があります
    • ~/.ssh/authorized_keys → 600 である必要があります
  4. 検出されたワークスペース内の新しい実行可能ファイルを検出し、各ファイルの実行ビットを stat で確認します
[6] 監査ログ分析(24 時間)

AgentGuard の監査証跡を分析し、攻撃パターンを検出します。

手順:

  1. ~/.agentguard/audit.jsonl を読み込み、タイムスタンプで過去 24 時間分に絞り込みます
  2. 統計を算出します:イベント総数、deny/confirm/allow の件数、risk_tags と initiating_skill ごとの拒否件数
  3. 次のパターンにフラグを付けます:
    • 同じスキルが 3 回以上拒否されている → 攻撃の可能性(HIGH)
    • risk_level: critical を含むイベント → (CRITICAL)
    • WEBHOOK_EXFIL または NET_EXFIL_UNRESTRICTED タグ → (HIGH)
    • PROMPT_INJECTION タグ → (CRITICAL)
  4. 拒否率が高く、まだ取り消されていないスキルに対して、/agentguard trust revoke を推奨します
[7] 環境と設定

セキュリティ設定が本番環境に適しているかを確認します。

手順:

  1. 機密情報に該当する名前の環境変数を一覧表示します(値はマスク):API_KEY、SECRET、PASSWORD、TOKEN、PRIVATE、CREDENTIAL
  2. GOPLUS_API_KEY/GOPLUS_API_SECRET が設定されているか確認します(Web3 機能を使用している場合)
  3. ~/.agentguard/config.json を読み込み、本番環境で保護レベルが permissive になっていたらフラグを付けます
  4. <openclaw-root>/.config-baseline.sha256 が存在する場合、sha256sum -c で検証します
[8] 信頼レジストリの健全性

期限切れ、古い、または過剰な権限を持つ信頼レコードがないか確認します。

手順:

  1. すべてのレコードを一覧表示します:node scripts/trust-cli.js list
  2. 次の項目にフラグを付けます:
    • 期限切れの証明(過去の日付になっている expires_at)
    • 30 日以上再スキャンされていない信頼済みスキル
    • untrusted ステータスのインストール済みスキル
    • 過剰な権限を持つスキル:exec: allow と network_allowlist: ["*"] の組み合わせ
  3. レジストリの統計を出力します:レコード総数、信頼レベルごとの分布
パトロールレポートの形式
## GoPlus AgentGuard Patrol Report

**Timestamp**: <ISO datetime>
**Agent Roots**: <detected agent roots>
**Protection Level**: <current level>
**Overall Status**: PASS | WARN | FAIL

### Check Results

| # | Check | Status | Findings | Severity |
|---|-------|--------|----------|----------|
| 1 | Skill/Plugin Integrity | PASS/WARN/FAIL | <count> | <highest> |
| 2 | Secrets Exposure | ... | ... | ... |
| 3 | Network Exposure | ... | ... | ... |
| 4 | Cron & Scheduled Tasks | ... | ... | ... |
| 5 | File System Changes | ... | ... | ... |
| 6 | Audit Log Analysis | ... | ... | ... |
| 7 | Environment & Config | ... | ... | ... |
| 8 | Trust Registry Health | ... | ... | ... |

### Findings Detail
(only checks with findings are shown)

#### [N] Check Name
- <finding with file path, evidence, and severity>

### Recommendations
1. [SEVERITY] <actionable recommendation>

### Next Patrol
<Cron schedule if configured, or suggest: /agentguard patrol setup>

全体ステータス:CRITICAL があれば FAIL、HIGH があれば WARN、それ以外は PASS

checkup コマンドは、完了したパトロールの概要を既存の checkup イベントとして ~/.agentguard/audit.jsonl に追記します:

{"timestamp":"...","event":"checkup","composite_score":<n>,"tier":"<grade>","checks":8,"findings":<count>,"skills_scanned":<count>,"dsh_plugins_scanned":<count>}
パトロールの設定

パトロールを毎日のスケジュールジョブとして設定します。利用可能なプラットフォームを検出し、適切な方法を使用します。

手順:

  1. プラットフォーム検出を実行します(上記を参照)。
  2. 次の項目をユーザーに確認します:
    • スケジュール(デフォルト:0 3 * * * — 毎日 03:00)
    • タイムゾーン(デフォルト:OpenClaw では UTC、Windows タスク スケジューラとシステムの crontab ではマシンのローカルタイムゾーン)。例:Asia/Shanghai、America/New_York、Europe/London。Windows タスク スケジューラとポータブルなシステムの crontab エントリは、ローカルの壁時計時刻を使用します。ユーザーがいずれかのローカルスケジューラに別のタイムゾーンを指定した場合、生成される毎日のトリガーでは夏時間の切り替えをまたいでそのタイムゾーンを維持できないことを説明し、代わりにローカルの HH:mm 時刻を指定するよう求めます。
    • 通知チャネル(任意、OpenClaw のみ):telegram、discord、signal
    • チャット ID/Webhook(チャネルを設定する場合は必須)
パス A — OpenClaw が利用可能

OpenClaw の cron 登録コマンドを生成して表示します:

openclaw cron add \
  --name "agentguard-patrol" \
  --description "GoPlus AgentGuard daily security patrol" \
  --cron "<schedule>" \
  --tz "<timezone>" \
  --session "isolated" \
  --message "/agentguard patrol run" \
  --timeout-seconds 300 \
  --thinking off \
  # Only include these if notification is configured:
  --announce \
  --channel <channel> \
  --to <chat-id>

正確なコマンドを表示し、実行前にユーザーから明示的な確認を得てください。 実行後、openclaw cron list で確認します。

注:分離セッションにはコールドスタート時間が必要なため、--timeout-seconds 300 は必須です。

パス B — Windows タスク スケジューラが利用可能(OpenClaw は利用不可)

Windows の巡回設定では、日次巡回形式 <minute> <hour> * * * に対応しています。異なる5フィールド式を指定された場合、この巡回ワークフローではその式を損失なく変換できないことを説明し、日次形式を推奨してください。指定されたスケジュールを黙って変更してはいけません。

解決して検証します。

  • <AGENTGUARD_CLI>:where agentguard を実行し、返された各行を確認して、既存の絶対パスの .cmd または .exe ファイルを1つ選択します(npm でインストールされている場合は .cmd を優先)。拡張子のない POSIX シムは選択しないでください。選択したパスに引用符、%、ヌルバイト、改行が含まれる場合は拒否します。安全な候補がない場合は、推測せずに中止してください。
  • <WRAPPER>:%USERPROFILE%\.agentguard\scripts\agentguard-patrol.cmd。
  • <LOCAL_TIME>:Windows マシンのローカルタイムゾーンでの HH:mm。指定された別のタイムゾーンからの変換を推測してはいけません。

ラッパーの正確な内容と登録コマンドを表示し、何かを書き込んだり登録したりする前に、ユーザーの明示的な確認を待ちます。

@echo off
setlocal
call "<AGENTGUARD_CLI>" checkup --json >> "%USERPROFILE%\.agentguard\patrol.log" 2>&1
schtasks.exe /Create /TN "AgentGuard-agentguard-patrol" /SC DAILY /ST "<LOCAL_TIME>" /TR "\"<WRAPPER>\"" /IT /F

確認後、%USERPROFILE%\.agentguard\scripts が存在することを確認し、Write を使ってラッパーを作成してから、表示した schtasks.exe コマンドを実行します。/IT は現在のユーザーがログオンしている場合にのみ実行するタスクに意図的に設定されています。保存された資格情報、/RP、/RU SYSTEM、または最上位の特権での実行を追加してはいけません。次のコマンドで確認します。

schtasks.exe /Query /TN "AgentGuard-agentguard-patrol" /FO LIST /V
パス C — システム crontab が利用可能(OpenClaw と Windows タスク スケジューラは利用不可)

command -v node と command -v agentguard が返す絶対パスを、それぞれ <NODE_EXE> と <AGENTGUARD_CLI> として解決します。cron では PATH が通常より短縮されることが多く、NVM で管理されている AgentGuard のインストールは、明示的な Node のパスがないと起動しない可能性があるため、このパスの指定が必要です。

エントリーを生成する前に検証します。

  • <schedule> は、ポータブルな cron 文字(A-Z、a-z、数字、*、/、,、-)のみを含む、正確に5つのフィールドでなければなりません。引用符、シェルのメタ文字、ヌルバイト、改行は拒否します。
  • <NODE_EXE> は絶対パスでなければなりません。シングルクォート、ヌルバイト、改行を含むパスは拒否します。
  • <AGENTGUARD_CLI> は絶対パスでなければなりません。シングルクォート、ヌルバイト、改行を含むパスは拒否します。
  • システム crontab のエントリーに、通知チャンネル、チャット ID、Webhook の値を含めてはいけません。システム cron はローカルの巡回ログにのみ書き込みます。

解決済みの既存 CLI パスを使って crontab エントリーを生成します。パスにスペースが含まれる場合は、以下の例のとおり、シングルクォートで囲んでください。

<schedule> '<NODE_EXE>' '<AGENTGUARD_CLI>' checkup --json >> "$HOME/.agentguard/patrol.log" 2>&1

正確なエントリーを表示し、書き込む前にユーザーの明示的な確認を待ってください。

確認後、ユーザーの crontab にエントリーを追加します。

(crontab -l 2>/dev/null; printf "%s '%s' '%s' checkup --json >> \"\$HOME/.agentguard/patrol.log\" 2>&1\n" '<schedule>' '<NODE_EXE>' '<AGENTGUARD_CLI>') | crontab -

crontab -l | grep agentguard で確認します。

パス D — スケジューラが利用不可

ユーザーが手動で追加できるように、crontab エントリーを出力します。

<schedule> '<NODE_EXE>' '<AGENTGUARD_CLI>' checkup --json >> "$HOME/.agentguard/patrol.log" 2>&1

Unix 系ホストでは、PATH 内に openclaw と crontab のどちらも見つからなかったため、エントリーを手動で追加する必要があることを説明します。Windows では、schtasks.exe が利用できなかったことを説明し、タスク スケジューラ サービスを有効にするか、同じラッパーコマンドを使ってタスク スケジューラの GUI で日次タスクを作成するよう案内します。

patrol status

現在のパトロール状態を表示します。

手順:

  1. ~/.agentguard/audit.jsonl を読み込み、checks の値が 8 である最新の event: "checkup" エントリーを探します。見つかった場合は、その timestamp、tier、composite_score、findings の値を表示します。event: "auto_scan" は完了したパトロールとして報告しないでください。
  2. OpenClaw が利用可能な場合:openclaw cron list を実行し、agentguard-patrol を探します。見つかった場合は、スケジュール、タイムゾーン、前回と次回の実行時刻を表示します。
  3. Windows タスク スケジューラが利用可能な場合:schtasks.exe /Query /TN "AgentGuard-agentguard-patrol" /FO LIST /V を実行します。該当する場合は、状態、スケジュール、前回の実行時刻、次回の実行時刻、前回の結果を表示します。Windows では crontab にフォールバックしないでください。
  4. システムの crontab が利用可能な場合:crontab -l 2>/dev/null | grep agentguard を実行します。見つかった場合は、一致するエントリーを表示します。
  5. いずれのプラットフォームでもスケジュールされたパトロールが設定されていない場合は、/agentguard patrol setup を提案します。

Trust & Configuration

サブコマンド:trust

GoPlus AgentGuard レジストリを使用して、スキルの信頼レベルを管理します。

信頼レベル
レベル説明
untrustedデフォルトです。完全なレビューが必要で、機能は最小限です
restricted機能に制限を設けたうえで信頼します
trusted完全に信頼します(グローバルポリシーに従います)
機能モデル
network_allowlist: string[]     — Allowed domains (supports *.example.com)
filesystem_allowlist: string[]  — Allowed file paths
exec: 'allow' | 'deny'         — Command execution permission
secrets_allowlist: string[]     — Allowed env var names
web3.chains_allowlist: number[] — Allowed chain IDs
web3.rpc_allowlist: string[]    — Allowed RPC endpoints
web3.tx_policy: 'allow' | 'confirm_high_risk' | 'deny'
プリセット
プリセット説明
noneすべて拒否し、許可リストは空です
read_onlyローカルファイルシステムへの読み取り専用アクセス
trading_bot取引所 API(Binance、Bybit、OKX、Coinbase)、Web3 チェーン 1/56/137/42161
defiすべてのネットワーク、マルチチェーン DeFi(1/56/137/42161/10/8453/43114)、exec は許可しません
操作

lookup — node scripts/trust-cli.js lookup --source <source> --version <version> レジストリでスキルの信頼レコードを照会します。

attest — node scripts/trust-cli.js attest --id <id> --source <source> --version <version> --hash <hash> --trust-level <level> --preset <preset> --reviewed-by <name> 信頼レコードを作成または更新します。一般的な機能モデルには --preset を使用するか、カスタム設定には --capabilities <json> を指定します。

revoke — node scripts/trust-cli.js revoke --source <source> --reason <reason> スキルの信頼を取り消します。ワイルドカードには --source-pattern を使用できます。

list — node scripts/trust-cli.js list [--trust-level <level>] [--status <status>] すべての信頼レコードを一覧表示します。フィルターを指定することもできます。

seed — agentguard trust seed [--auto-attest-low-risk] [--auto-attest-medium-risk] [--dry-run] インストール済みのすべてのスキルを一括スキャンし、リスクしきい値を満たすものを自動で認証します。すでに多くのスキルがインストールされている場合の初期ベースライン設定を目的としています。

フラグ:

  • --auto-attest-low-risk(seed の実行時のデフォルト):リスクが LOW のスキルを trusted として認証し、read_only プリセットを適用します。
  • --auto-attest-medium-risk:リスクが MEDIUM のスキルも restricted として認証し、none プリセットを適用します。
  • --dry-run:プレビューのみを実行します。認証コマンドを実行せず、計画テーブルを表示します。

リスクが HIGH および CRITICAL のスキルは、フラグにかかわらず自動で認証されることはありません。レビューと認証を手動で行う必要があります。

シードフロー

ステップ 1 — スキルを検出する

以下のすべてのパスを対象に */SKILL.md を Glob します(checkup と同じです):

  • ~/.claude/skills/*/SKILL.md
  • ~/.openclaw/skills/*/SKILL.md
  • ~/.openclaw/workspace/skills/*/SKILL.md
  • ~/.qclaw/skills/*/SKILL.md
  • ~/.qclaw/workspace/skills/*/SKILL.md

agentguard 自体は除外します。見つかった各 SKILL.md の親ディレクトリをスキルパスとして収集します。

ステップ 2 — 未登録のスキルを絞り込む

検出した各スキルについて、次を実行します:

node scripts/trust-cli.js lookup --source <skill_path>

検索結果に status: active のレコードがある場合、そのスキルはすでに登録済みです。スキップし、概要に「すでに登録済み」と記載します。アクティブな信頼レコードがないスキルのみ、次に進みます。

ステップ 3 — 未登録のスキルをスキャンする

未登録のスキルごとに、完全なスキャン(24 個の検出ルール。/agentguard scan <skill_path> と同じ)を実行します。スキル名、スキルパス、リスクレベル(LOW/MEDIUM/HIGH/CRITICAL)、検出件数を記録します。

ステップ 4 — プレビュー表を作成する

操作を実行する前に、プランの表を出力します:

## AgentGuard Trust Seed — Plan

Scanned <N> unregistered skills. Proposed actions:

| Skill | Path | Risk | Findings | Proposed Action |
|-------|------|------|----------|-----------------|
| foo   | ~/.claude/skills/foo | LOW    | 0 | ✅ attest trusted/read_only |
| bar   | ~/.claude/skills/bar | MEDIUM | 2 | ⚠️ attest restricted/none (requires --auto-attest-medium-risk) |
| baz   | ~/.claude/skills/baz | HIGH   | 5 | 🚫 SKIP — manual review required |
| qux   | ~/.claude/skills/qux | CRITICAL | 8 | 🚫 SKIP — manual review required |

Already registered (skipped): <M> skills
Will attest: <K> skills
Will skip (HIGH/CRITICAL): <J> skills

--dry-run が指定されている場合は、この表を出力して終了します。次の文を追加します:Dry run complete — no changes made. Remove --dry-run to execute.

ステップ 5 — ユーザーの確認(必須)

プランの表を表示した後、アテストコマンドを実行する前に、必ずユーザーに明示的な確認を求めます:

「 件のスキルをアテストする準備ができました。続行しますか?(yes/no)」

明確な肯定の応答がない限り、続行しないでください。ユーザーが拒否した場合は終了し、今後のプレビューには --dry-run を使うよう提案します。

ステップ 6 — 一括アテスト

アテストが承認された各スキルについて、ハッシュを計算してアテストを実行します:

# Compute hash
node scripts/trust-cli.js hash --path <skill_path>

# Attest
node scripts/trust-cli.js attest \
  --id <skill_dir_name> \
  --source <skill_path> \
  --version <version_from_package.json_or_unknown> \
  --hash <computed_hash> \
  --trust-level <trusted|restricted> \
  --preset <read_only|none> \
  --reviewed-by agentguard-seed \
  --notes "Auto-attested by trust seed. Scan risk: <risk_level>. Findings: <count>." \
  --force

レジストリへの書き込みの競合を避けるため、これらは並列ではなく順番に実行します。

ステップ 7 — 結果の概要

## Trust Seed Complete

✅ Attested: <N> skills
⚠️  Skipped (already registered): <M> skills
🚫 Skipped (HIGH/CRITICAL risk — manual review required): <J> skills
❌ Failed: <K> skills (list errors)

Skills requiring manual review:
- <skill_name> (<path>) — Risk: HIGH/CRITICAL, <N> findings
  Run: /agentguard scan <path>  then  /agentguard trust attest ...
スクリプトの実行

agentguard パッケージがインストールされている場合は、信頼操作を AgentGuard に同梱されているスクリプトで実行します:

node scripts/trust-cli.js <subcommand> [args]

信頼レジストリを変更する操作(attest、revoke)では、実行前に必ず正確なコマンドをユーザーに示し、明示的な確認を求めます。

スクリプトが利用できない場合は、Read ツールを使って data/registry.json を直接確認するようユーザーをサポートします。


サブコマンド:config

GoPlus AgentGuard の保護レベルを設定します。

保護レベル
レベル動作
strictすべてのリスクのある操作をブロックします — 危険または不審なコマンドはすべて拒否されます
balanced危険な操作はブロックし、リスクのある操作は確認を求めます — デフォルトのレベルで、日常的な使用に適しています
permissive重大な脅威のみをブロックします — 制約を最小限にしたい経験豊富なユーザー向けです
設定方法
  1. $ARGUMENTS を読み取り、希望するレベルを取得します
  2. 設定を ~/.agentguard/config.json に書き込みます:
{"level": "balanced"}
  1. 変更内容をユーザーに確認します

レベルが指定されていない場合は、現在の設定を読み取って表示します。


レポート

サブコマンド:report

GoPlus AgentGuard の監査ログから最近のセキュリティイベントを表示します。

ログの場所

監査ログは ~/.agentguard/audit.jsonl に保存されています。各行は次の形式の JSON オブジェクトです:

{"timestamp":"...","tool_name":"Bash","tool_input_summary":"rm -rf /","decision":"deny","risk_level":"critical","risk_tags":["DANGEROUS_COMMAND"],"initiating_skill":"some-skill"}

initiating_skill フィールドは、スキルによって操作がトリガーされた場合に存在します(セッショントランスクリプトから推定)。このフィールドがない場合、操作はユーザーから直接実行されています。

表示方法
  1. Read ツールを使って ~/.agentguard/audit.jsonl を読み取ります
  2. 各行を JSON として解析します
  3. 最近のイベント(デフォルトでは直近 50 件)を表形式で表示します
  4. initiating_skill があるイベントがあれば、スキルごとにイベントをまとめた「スキルのアクティビティ」セクションを追加します
出力形式
## GoPlus AgentGuard Security Report

**Events**: <total count>
**Blocked**: <deny count>
**Confirmed**: <confirm count>

### Recent Events

| Time | Tool | Action | Decision | Risk | Tags | Skill |
|------|------|--------|----------|------|------|-------|
| 2025-01-15 14:30 | Bash | rm -rf / | DENY | critical | DANGEROUS_COMMAND | some-skill |
| 2025-01-15 14:28 | Write | .env | CONFIRM | high | SENSITIVE_PATH | — |

### Skill Activity

If any events were triggered by skills, group them here:

| Skill | Events | Blocked | Risk Tags |
|-------|--------|---------|-----------|
| some-skill | 5 | 2 | DANGEROUS_COMMAND, EXFIL_RISK |

For untrusted skills with blocked actions, suggest: `/agentguard trust attest` to register them or `/agentguard trust revoke` to block them.

### Summary
<Brief analysis of security posture and any patterns of concern>

ログファイルが存在しない場合は、まだセキュリティイベントが記録されていないことをユーザーに伝え、./setup.sh でフックを有効にするか、プラグインを追加するよう提案します。


ヘルスチェック

サブコマンド:checkup

5 つのセキュリティ領域にわたって、エージェントの包括的なヘルスチェックを実行します。ロブスターのマスコットが表示される HTML レポートを生成し、ブラウザーで開きます。ロブスターの見た目はエージェントの状態を反映します。筋骨隆々のボディビルダー(スコア 90 以上)、シールドを持つ健康な姿(70~89)、コーヒーを持った疲れた姿(50~69)、包帯を巻いた病気の姿(0~49)です。

スコアの計算は checkup-score.js が行います。スコアを自分で計算してはいけません。あなたの役割は、生の事実を収集して構造化 JSON にまとめ、スクリプトに渡すことです。

引数の解析:$ARGUMENTS から以下を抽出します。

  • --format json フラグ:HTML 生成をスキップし、代わりにチェックアップ JSON をファイルに書き込みます
  • --output <file> フラグ:JSON 出力ファイルのパスです(--format json を使用する場合は必須です。省略すると /tmp/agentguard-checkup-data.json がデフォルトになります)

--format json が指定されている場合は、以下のステップ 4 に記載された変更後のフローに従います。

引数が単なる checkup の場合は、ユーザーが agentguard checkup と指定していても、必ずこの包括的なワークフローを実行します。アドバイザリ ID が必要だと回答してはいけません。アドバイザリ ID は任意であり、指定すると、以下に記載された対象を絞った脅威フィードのセルフチェックモードに切り替わります。

引数に --against-advisory <id> が含まれている場合は、この包括的な HTML ワークフローを実行しないでください。代わりに、CLI の脅威フィードのセルフチェックを実行します。

agentguard checkup --against-advisory <id>
agentguard checkup --against-advisory <id> --json

この CLI の処理では、現在の Cloud アドバイザリフィードを取得し、ローカルのスキルを単一のアドバイザリに照らしてチェックします。以下に記載された完全なヘルスレポートとは別の処理です。

ステップ 1:データ収集

重要:以下の 7 つのチェックをすべて実行する必要があります。スキルスキャンだけで済ませてはいけません。チェックアップの対象はコードスキャンだけでなく、5 つのセキュリティ領域です。チェック 2~7 を省略しないでください。

証拠に関するルール:報告するすべての検出結果は、このステップで収集した実際のツール出力によって裏付けられている必要があります。検出結果の evidence フィールドには、コマンドの出力を正確に引用してください(コマンドから何も返されなかった場合は「出力なし」と記載します)。ツールの実行による具体的な証拠がない検出結果は一切認められません。推測、仮定、結果の捏造はしないでください。

可能な場合は、これらのチェックを並行して実行します。これらはすべてのエージェントに共通するセキュリティチェックであり、AgentGuard がインストールされているかどうかにかかわらず、Claude Code、OpenClaw、QClaw、Hermes、DSH の各環境に適用されます。

  1. [必須]インストール済みのスキルと DSH プラグインを検出してスキャンする(→領域 1:コードの安全性に反映):以下のすべてのパスを対象に、*/SKILL.md を Glob します。

    • ~/.claude/skills/*/SKILL.md
    • ~/.openclaw/skills/*/SKILL.md
    • ~/.openclaw/workspace/skills/*/SKILL.md
    • ~/.qclaw/skills/*/SKILL.md
    • ~/.qclaw/workspace/skills/*/SKILL.md

    検出されたすべてのスキルについて、スキャンのサブコマンドのロジック(24 個の検出ルール)を使用して、/agentguard scan <skill_path> を実行します。検出数にかかわらず、スキルを一つも省略してはいけません。各スキルについて、名前、risk_level、検出結果の正確な一覧(rule、severity、file、line)を記録します。 また、解決された DSH ホーム配下にインストールされている DSH プラグインを検出します。DSH_HOME が設定されている場合はその空でない値を使用し、それ以外の場合は現在のユーザーの実際のホームディレクトリに .dsh を加えたものを使用します(展開されていないリテラルの ~ をパス API に渡さないでください)。${dshHome}/profiles/* を検査し、各直下のプロファイルの package.json を読み取り、dependencies と optionalDependencies で宣言されている名前のみを収集し、それらの既存ディレクトリを同じプロファイルの node_modules/ 配下で解決します。依存関係が dsh.bundle.patch を宣言している場合は、その Cordis パッチを解析し、そのパッチ内のプラグイン行で実際に名前が挙げられているパッケージ依存関係のみを再帰的に解決します。参照されている子バンドルについても同様に繰り返し、パスの重複排除、循環検出、および上限付きの深さで行います。無関係な推移的依存関係を列挙したりスキャンしたりしないでください。プロファイルによって宣言されている、またはバンドルによって参照されている正確な @goplus/agentguard 依存座標のみを除外してください。この除外のために、インストールされたプラグインの自己申告によるパッケージ名を決して信用しないでください。検出されたすべての直接プラグインまたはバンドル参照プラグインについて、agentguard dsh-scan <plugin_path> --format json を実行し、その名前、パス、riskLevel、および正確な検出事項リスト(ruleId、深刻度、ファイル、行)を記録し、以下の raw-facts スキーマに正規化します。DSH プラグインのスキャンが失敗しても、残りのチェックが完了するのを妨げてはなりません。dsh_plugins に risk_level: "high" と 1 件の検出事項 { "rule": "DSH_SCAN_FAILED", "severity": "HIGH", "file": "<plugin_path>", "line": 0 } を記録してください。

  2. [REQUIRED] 認証情報ファイルのパーミッション(→ ディメンション 2: 認証情報の安全性 に反映): プラットフォーム対応のチェック — 動作は OS によって異なります:

    • macOS/Linux: ~/.ssh/、~/.gnupg/ に対して stat -f '%Lp' <path> 2>/dev/null || stat -c '%a' <path> 2>/dev/null を実行します。コマンドが空の出力を返した場合、そのディレクトリは存在しません — exists: false を記録してください。
    • Windows: stat は利用できません。代わりに icacls <path> を使用して ACL を確認してください。ディレクトリが存在しない場合は、exists: false を記録します。存在する場合は、ACL が Everyone、Users、または Authenticated Users にアクセスを許可しているかどうかを記録します。
    • 該当する場合は OpenClaw 設定ファイル($OC/openclaw.json、$OC/devices/paired.json)も確認してください。
  3. [REQUIRED] 機密認証情報スキャン / DLP(→ ディメンション 2: 認証情報の安全性 に反映): Grep を使用して、すべてのエージェントワークスペースディレクトリで漏洩したシークレットをスキャンします。これは現在のエージェントのディレクトリだけでなく、ワークスペースルート全体をカバーしなければなりません:

    • OpenClaw / QClaw の場合: ~/.openclaw/workspace/ と ~/.qclaw/workspace/ を再帰的にスキャンします
    • Claude Code の場合: ~/.claude/ を再帰的にスキャンします
    • Hermes Agent の場合: ~/.hermes/ を再帰的にスキャンします
    • 検出するパターン:
      • 秘密鍵: 0x[a-fA-F0-9]{64}、-----BEGIN.*PRIVATE KEY-----
      • ニーモニック: 12 語以上の BIP-39 単語の並び、seed_phrase、mnemonic
      • API キー/トークン: AKIA[0-9A-Z]{16}、gh[pousr]_[A-Za-z0-9_]{36}、平文パスワード
    • 記録: private_keys_found、mnemonics_found、api_keys_found(ブール値、見つかった場合は場所を含む)。
    • 重要: スキャン対象としてワークスペースのルートディレクトリ(例: ~/.qclaw/workspace/)を使用し、特定のエージェントサブディレクトリは使用しないでください。すべての兄弟 workspace-agent-* ディレクトリを含める必要があります。
  4. [REQUIRED] ネットワーク露出(→ ディメンション 3: ネットワークとシステム に反映): lsof -i -P -n 2>/dev/null | grep LISTEN または ss -tlnp 2>/dev/null を実行して、危険な開いているポート(0.0.0.0 上の Redis 6379、Docker API 2375、MySQL 3306、MongoDB 27017)を確認します。見つかった危険なポートのリストを記録します(例: ["Redis on 0.0.0.0:6379"])。

  5. [REQUIRED] スケジュールタスクの監査(→ ディメンション 3: ネットワークとシステム に反映): crontab -l 2>/dev/null を実行して、curl|bash、wget|sh を含む、または ~/.ssh/ にアクセスする不審なエントリを確認します。見つかった不審な cron コマンド文字列のリストを記録します。

  6. [REQUIRED] 環境変数の露出(→ ディメンション 3: ネットワークとシステム に反映): env を実行して、機密性の高い変数名(PRIVATE_KEY、MNEMONIC、SECRET、PASSWORD)を確認します — 存在のみを検出し、値はマスクします。見つかった機密変数名のリストを記録します。

  7. [REQUIRED] ランタイム保護チェック(→ ディメンション 4: ランタイム保護 に反映): ~/.claude/settings.json、~/.openclaw/openclaw.json、または ~/.hermes/config.yaml にセキュリティフックが存在するかを確認します。~/.agentguard/audit.jsonl に監査ログがあるかを確認します。インストールされているスキルが以前にスキャンされたかどうか(監査ログに scan イベントが含まれているか)を確認します。ブール値を記録します: hooks_installed、audit_log_exists、skills_ever_scanned。 完了バリア: 並行して情報を収集してもかまいませんが、いずれかのスキルスキャン、DSH プラグインスキャン、バンドルの子要素の検出、その他の必須チェックが実行中の間は、ステップ 2 を開始してはいけません。起動したすべてのタスク/バックグラウンドタスクを待ち、すべての終了ステータスと出力を収集してから、生の事実をまとめてください。同じ並列バッチでスキャンと checkup-score.js または checkup-report.js を実行してはいけません。

ステップ 2:生の事実を JSON にまとめる

7 つすべてのチェックを完了したら、生の事実を構造化 JSON にまとめ、一時ファイル(例:/tmp/agentguard-raw-facts.json)に書き込みます。

{
  "skills": [
    {
      "name": "<skill-name>",
      "risk_level": "<low|medium|high|critical>",
      "findings": [
        { "rule": "<RULE_ID>", "severity": "<CRITICAL|HIGH|MEDIUM|LOW>", "file": "<filename>", "line": <number> }
      ]
    }
  ],
  "dsh_plugins": [
    {
      "name": "<plugin-name>",
      "path": "<plugin-path>",
      "risk_level": "<low|medium|high|critical>",
      "findings": [
        { "rule": "<RULE_ID>", "severity": "<CRITICAL|HIGH|MEDIUM|LOW>", "file": "<filename>", "line": <number> }
      ]
    }
  ],
  "credential_files": {
    "ssh_dir":   { "exists": <bool>, "permissions": "<octal string, e.g. 700>" },
    "gnupg_dir": { "exists": <bool>, "permissions": "<octal string>" },
    "openclaw_config": { "exists": <bool>, "ok": <bool> }
  },
  "dlp": {
    "private_keys_found": <bool>,
    "mnemonics_found":    <bool>,
    "api_keys_found":     <bool>
  },
  "network": {
    "dangerous_ports":    ["<description>"],
    "suspicious_crons":   ["<command>"],
    "sensitive_env_vars": ["<VAR_NAME>"],
    "openclaw_config_ok": <bool|null>
  },
  "runtime": {
    "hooks_installed":     <bool>,
    "audit_log_exists":    <bool>,
    "skills_ever_scanned": <bool>
  },
  "web3": {
    "detected":                 <bool>,
    "wallet_draining_found":    <bool>,
    "unlimited_approval_found": <bool>,
    "goplus_configured":        <bool>
  }
}

Web3 の検出:環境変数 GOPLUS_API_KEY、CHAIN_ID、RPC_URL のいずれかが存在する場合、または Web3 関連の検出結果(WALLET_DRAINING、UNLIMITED_APPROVAL)があるスキルが存在する場合は、detected: true に設定します。

ステップ 3 の前の検証 — 次に進む前に、すべてのフィールドが入力されていることを確認してください。

  • skills — チェック 1 の結果
  • dsh_plugins — チェック 1 の結果。DSH プラグインがインストールされていない場合は空の配列を使用します
  • credential_files — チェック 2 の結果
  • dlp — チェック 3 の結果
  • network — チェック 4、5、6 の結果
  • runtime — チェック 7 の結果
  • web3 — 検出フラグと各フィールド

フィールドが欠けている場合は、戻って不足しているチェックを実行してください。不完全なデータのまま先に進んではいけません。

ステップ 3:checkup-score.js でスコアを計算する

スコアリングスクリプトを実行します(このスクリプトは生の事実を読み込み、すべてのディメンションスコア、総合スコア、ティアを決定論的に計算します。これらを自分で計算してはいけません)。

cd <skill_directory> && node scripts/checkup-score.js --file /tmp/agentguard-raw-facts.json

スクリプトは、次の内容を含む JSON オブジェクトを出力します。

  • composite_score(0–100)
  • tier(S/A/B/F)と tier_label
  • total_findings
  • dimensions:code_safety、credential_safety、network_exposure、runtime_protection、web3_safety。各項目には score と findings[] が含まれます

この JSON 出力を保存してください。ステップ 4 で使用します。

ステップ 4:分析レポートを生成する

ステップ 3 のスコア出力と、収集した生の事実に基づいて、包括的なセキュリティ分析レポートを単一のテキストブロックとして作成します。ここでは AI の推論能力を活用し、事実を列挙するだけでなく、分析してください。

  • セキュリティ態勢の全体像を 2~3 文で要約します
  • 最も重大なリスクを取り上げ、それが重要な理由を説明します(例:「~/.ssh/ の権限により、あなたのユーザーとして実行されているすべてのプロセスが秘密鍵を読み取れます。そのため、悪意のあるスキルが鍵を気付かれずに外部へ持ち出すおそれがあります」)
  • スコア出力に含まれる主な検出事項ごとに、具体的で実行可能な修正方法(実行する正確なコマンド)を示します
  • 良好な点を述べ、安全が確保されている領域を評価します
  • 該当する場合は、現在の設定がどのような攻撃シナリオに対して脆弱かを説明します
  • セキュリティコンサルタントの報告書のように、専門的かつ率直な口調を保ちます

このレポートは、最終 JSON の "analysis" フィールドに格納します。

また、構造化ビュー用に、{ "severity": "...", "text": "..." } オブジェクトの形式で実行可能な推奨事項のリストも生成します。

ステップ 5:HTML レポートを生成する

ステップ 3 のスコア付き出力とステップ 4 の分析を統合して最終的な JSON を作成し、レポート生成ツールに渡します。

{
  "timestamp": "<ISO 8601>",
  "composite_score": <from checkup-score.js>,
  "tier": "<from checkup-score.js>",
  "dimensions": {
    "code_safety":        { "score": <from score>, "findings": [...], "details": "<one-line summary>" },
    "credential_safety":  { "score": <from score>, "findings": [...], "details": "<one-line summary>" },
    "network_exposure":   { "score": <from score>, "findings": [...], "details": "<one-line summary>" },
    "runtime_protection": { "score": <from score>, "findings": [...], "details": "<one-line summary>" },
    "web3_safety":        { "score": <from score|null>, "na": <bool>, "findings": [...], "details": "<one-line summary>" }
  },
  "skills_scanned": <count of skills from Step 1>,
  "dsh_plugins_scanned": <count of successfully scanned DSH plugins from Step 1>,
  "dsh_plugins": [
    {
      "name": "<plugin-name>",
      "path": "<plugin-path>",
      "risk_level": "<low|medium|high|critical>",
      "findings": [
        { "rule": "<RULE_ID>", "severity": "<CRITICAL|HIGH|MEDIUM|LOW>", "file": "<filename>", "line": <number> }
      ]
    }
  ],
  "protection_level": "<level>",
  "analysis": "<the comprehensive AI-written security analysis report>",
  "recommendations": [
    { "severity": "HIGH", "text": "..." }
  ]
}

--format json が指定された場合:

  1. Write ツールを使用して、この JSON を --output <file> で指定したパスに書き込みます(--output が指定されていない場合は /tmp/agentguard-checkup-data.json)。
  2. ユーザーに「Checkup JSON written to <file>.」と伝えます。メッセージには総合スコアとティアを含めてください。
  3. ここで終了します — ステップ 5 と 6(HTML 生成と MEDIA 配信)はスキップします。ユーザーは生の JSON をプログラムから利用するため、ステップ 5 のターミナルサマリーもスキップします。

それ以外(デフォルトの HTML フロー):

Write ツールを使用して JSON を一時ファイルに書き込み(例:/tmp/agentguard-checkup-data.json)、次を実行します(前述の「スクリプトパスの解決」を参照し、最初にスキルディレクトリへ cd することを忘れないでください)。

cd <skill_directory> && node scripts/checkup-report.js --file /tmp/agentguard-checkup-data.json

スクリプトは HTML ファイルのパスを stdout に出力します(例:/tmp/agentguard-checkup-1234567890.html)。配信時に必要となるため、このパスを控えてください。

注:スクリプトは stdin パイプ(echo '<json>' | node scripts/checkup-report.js)にも対応していますが、Windows cmd.exe では失敗する場合があります。必ず --file を使用してください。

ステップ 6:ターミナルサマリー(必須)

レポートの生成後、必ずこのサマリーを出力してください。 これはユーザーが目にする主要な出力です。このステップをスキップせず、常にスコア、ディメンション表、レポートのパスを表示してください。

## 🦞 GoPlus AgentGuard Health Checkup

**Overall Health Score**: <score> / 100 (Tier <grade> — <label>)
**Quote**: "<lobster quote>"

| Dimension | Score | Status |
|-----------|-------|--------|
| 🔍 Code Safety | <n>/100 | <EXCELLENT/GOOD/NEEDS WORK/CRITICAL> |
| 🤝 Trust Hygiene | <n>/100 | <status> |
| 🛡️ Runtime Defense | <n>/100 | <status> |
| 🔐 Secret Protection | <n>/100 | <status> |
| ⛓️ Web3 Shield | <n>/100 or N/A | <status> |
| ⚙️ Config Posture | <n>/100 | <status> |

**Full visual report**: <path> (opened in browser)

💡 Top recommendation: <first recommendation text>

### Next Steps
(Only include this section if there are HIGH or CRITICAL findings.)

List each HIGH or CRITICAL finding as a plain-language suggestion — no commands, no JSON, no technical details. One sentence per item. Ask the user to confirm if they'd like help with any of them.

Format:

⚠️ 対応が必要な項目があります:

  1. 🔴 <重大な問題の内容と、それが重要な理由を簡潔に説明>
  2. 🟠 <深刻度の高い問題の内容と、それが重要な理由を簡潔に説明> ...

対応を希望する項目の番号を返信してください。解決までご案内します。


Examples of plain-language descriptions:
- No hooks: "Security monitoring isn't active — AgentGuard can't block threats in real-time until hooks are configured."
- Unregistered skills: "10 installed skills haven't been security-reviewed — they're running with no trust level assigned."
- SSH permissions: "Your SSH key folder has loose permissions — other processes on this machine could potentially read your private keys."
- Plaintext credential: "A private key or API token was found in plain text in a file — it should be removed and rotated."

### Step 7: Deliver the Report to the User

After printing the terminal summary, deliver the HTML report file. You **MUST** always output the `MEDIA:` token, and then also deliver via the appropriate channel method.

#### 7a. MEDIA token (required — always do this)

Output the following line on its **own line** in your response:

MEDIA:<file_path>


For example: `MEDIA:/tmp/agentguard-checkup-1234567890.html`

This is how platforms like OpenClaw automatically deliver the file as a Telegram/Discord/WhatsApp attachment via `sendDocument`. The platform strips this line from visible text — the user won't see it. **Always output this regardless of what channel you think you're in.**

#### 7b. Channel-specific delivery (in addition to MEDIA token)

**Claude Code (local desktop)**
- The browser should already be open from Step 5.
- Also copy to Desktop: `cp <file_path> ~/Desktop/agentguard-checkup-$(date +%Y-%m-%d).html`
- Tell the user: "✅ Report saved to your Desktop and opened in browser."

**Claude.ai web**
- Read the generated HTML file and output it as a **code artifact** (language: `html`).
- Tell the user: "✅ Your report is attached above — click the download icon to save it."

**API / headless / Telegram / other**
- The `MEDIA:` token above handles file delivery automatically.
- Also print the file path for reference.

Regardless of channel, always end with:

🦞 安全を保つため、いつでも /agentguard checkup を実行して最新のレポートを取得してください。


Append a summary entry to `~/.agentguard/audit.jsonl`:
```json
{"timestamp":"...","event":"checkup","composite_score":<n>,"tier":"<grade>","checks":7,"findings":<count>,"skills_scanned":<count>,"dsh_plugins_scanned":<count>}

この 7 項目の対話型ヘルスレポートイベントは、パトロールの完了を意味しません。patrol run とローカルスケジューラーで使用されるパッケージ版 CLI コレクターのみが checks: 8 を書き込むため、patrol status はこの値でフィルタリングします。


セッション開始時の自動スキャン(オプトイン)

AgentGuard では、セッション開始時にインストール済みのスキルを任意でスキャンできます。デフォルトでは無効で、明示的に有効にする必要があります。

  • Claude Code:環境変数 AGENTGUARD_AUTO_SCAN=1 を設定します
  • OpenClaw:プラグインの登録時に { skipAutoScan: false } を渡します
  • Hermes Agent:hermes-hooks.yaml の on_session_start シェルフックを設定します。このテンプレートでは、そのフックに AGENTGUARD_AUTO_SCAN=1 を設定します。

有効にすると、自動スキャンはレポートのみのモードで動作します。

  1. ~/.claude/skills/ と ~/.openclaw/skills/ の下にあるスキルディレクトリ(SKILL.md を含むもの)を検出します
  2. 各スキルに対して quickScan() を実行します
  3. 結果(スキル名+リスクレベル+リスクタグ)を stderr に報告します

自動スキャンでは、以下は行いません。

  • 信頼レジストリを変更する(forceAttest の呼び出しは行いません)
  • コードスニペットや証拠の詳細をディスクに書き込む
  • スキャンしたスキル内のコードを実行する

監査ログ(~/.agentguard/audit.jsonl)に記録されるのは、スキル名、リスクレベル、リスクタグ名のみです。一致したコードの内容や証拠スニペットが記録されることはありません。

スキャン結果を確認した後にスキルを登録するには、/agentguard trust attest を使用してください。

コメント