OpenClaw シークレットスキャニング保守管理 は何をしますか?
メンテナー専用。 このスキルを使用するには、リポジトリの管理者/メンテナー権限が必要です。他のユーザーのコメントを編集・削除したり、シークレットスキャニングアラートを解決したりできます。
このスキルは、https://github.com/openclaw/openclaw/security/secret-scanning からのアラートを処理する際に使用します。
言語ルール: すべての通知コメントおよび置き換えコメントは英語で記述する必要があります。
スクリプト
すべての機械的操作(API 呼び出し、一時ファイル管理、セキュリティ強制)は、以下で処理されます:
$REPO_ROOT/.agents/skills/openclaw-secret-scanning-maintainer/scripts/secret-scanning.mjs
スクリプトは以下を強制します:
- すべてのアラート取得で
hide_secret=true(プレーンテキストのシークレットは標準出力に出力されない) - すべての一時ファイルでランダム UUID を使用した
mktemp - すべてのボディアップロードで
-F body=@file(インラインシェルクォーティング禁止) - ロケーションタイプ別に分岐する通知テンプレート
.secretや.bodyを標準出力に出力しない
全体的な流れ
単一または複数のアラートをサポートします。複数のアラートの場合は、昇順で処理します。
各アラートに対して:
- 特定 —
fetch-alert+fetch-contentでメタデータとボディを取得 - 判断 — エージェントがボディファイルを読み取り、プレーンテキストのシークレットが残っているか特定し、必要な場合にのみ編集バージョンを作成
- 編集 — Issue/PR ボディの場合は
redact-body-if-needed、コメントの場合はスキップ(直接削除) - 削除 — コメントの場合は
delete-comment+recreate-comment(ボディの編集履歴は削除不可) - 通知 — 現在の Issue/PR ボディがすでに編集されていない限り、
notifyがロケーションタイプに応じた適切なテンプレートを投稿 - 解決 —
resolveでアラートをクローズ - サマリー —
summaryでフォーマットされた結果を出力
ステップ 1: 特定
# すべてのオープンアラートを一覧表示
node secret-scanning.mjs list-open
# 特定のアラートのメタデータ+ロケーションを取得
node secret-scanning.mjs fetch-alert <NUMBER>
# 各ロケーションのコンテンツを取得(ボディを一時ファイルに保存)
node secret-scanning.mjs fetch-content '<location-json>'
fetch-content の出力には以下が含まれます:
body_file: 完全なボディコンテンツが保存された一時ファイルへのパスauthor: 投稿者issue_number/pr_number: 存在する場所edit_history_count: 既存の編集回数type: ルーティング用のロケーションタイプdiscussion_commentの場合、元のコメントが返信だった場合にはcomment_node_id、discussion_node_id、reply_to_node_idも含まれます。
ロケーションタイプのルーティング
| タイプ | フロー |
|---|---|
issue_comment | コメント:削除+再作成 |
pull_request_comment | コメント:削除+再作成 |
pull_request_review_comment | コメント:削除+再作成 |
discussion_comment | ディスカッションコメント:削除+再作成 (GraphQL) |
issue_body | ボディ:その場で編集 |
pull_request_body | ボディ:その場で編集 |
commit | 通知のみ |
| その他 | スキップして報告 |
ステップ 2: 判断(エージェント)
エージェントは fetch-content の出力からボディファイルを読み取り、以下の処理を行います:
- コンテンツ内のすべてのシークレットを特定(アラートでフラグされたもの以外も含む可能性あり)
- 現在のボディにプレーンテキストの認証情報が残っているか判断
- 残っている各シークレットを
[REDACTED <secret_type>]に置き換え — 部分的な値やプレフィックス/サフィックスは含めない - 編集済みコンテンツを新しい一時ファイルに保存
これは意味理解が必要な唯一のステップです。それ以外はすべて機械的です。
issue_body および pull_request_body の場合:現在のボディがすでに作者によって編集され、プレーンテキストの認証情報が残っていない場合は、公開通知コメントを投稿しないでください。これにより、過去の機密コンテンツへの新たな公開ポインタが作成されるのを防ぎます。その編集を個別に記録し、ステップ 6 で証拠がアラートの解決をサポートしているかどうかを判断します。
ステップ 3: 編集
コメントの場合(issue_comment / PR コメント)
編集しないでください。 直接ステップ 4(削除+再作成)にスキップします。DELETE の前に PATCH すると、不要な編集履歴リビジョンが作成されます。
Issue ボディ / Pull Request ボディの場合
node secret-scanning.mjs redact-body-if-needed <issue|pr> <NUMBER> <current-body-file> <redacted-body-file> <result-file>
fetch-content の body_file を <current-body-file> として使用します。このコマンドは <result-file> に notify_required を書き込み、編集済みファイルが現在のボディと異なる場合にのみ PATCH でボディを更新します。
ステップ 4: 編集履歴の削除
コメント — 削除と再作成
Issue/PR コメントの場合:
# オリジナルを削除(すべての編集履歴が消える)
node secret-scanning.mjs delete-comment <COMMENT_ID>
# 編集済みコンテンツで再作成
node secret-scanning.mjs recreate-comment <ISSUE_NUMBER> <body-file>
ディスカッションコメントの場合(GraphQL を使用):
# オリジナルを削除
node secret-scanning.mjs delete-discussion-comment <COMMENT_NODE_ID>
# 編集済みコンテンツで再作成
node secret-scanning.mjs recreate-discussion-comment <DISCUSSION_NODE_ID> <body-file> [REPLY_TO_NODE_ID]
discussion_comment の fetch-content 出力には、これらのコマンド用の comment_node_id と discussion_node_id が含まれます。元のディスカッションコメントが返信だった場合には reply_to_node_id も含まれるため、そのオプションの第3引数を渡して、編集済みの置き換えが元のスレッドに残るようにします。
再作成されるコメントは、以下の形式に従う必要があります:
> **Note:** The original comment by @<AUTHOR> has been removed due to secret leakage. Below is the redacted version of the original content.
---
<redacted original content>
Issue ボディ / Pull Request ボディ — 編集履歴の削除不可
編集により、編集前のプレーンテキストを含む編集履歴リビジョンが作成されます。これは API 経由では消去できません。
公開コメントで作者に Issue の削除/再作成や PR のクローズ/再オープンを勧めないでください。過去のコンテンツに注目を集める可能性があります。削除ガイダンスはメンテナー専用にしてください。
メンテナー端末のみに出力(公開コメントには絶対に出力しない):
⚠️ Issue/PR ボディの編集履歴には、まだプレーンテキストのシークレットが含まれています。
GitHub サポートに連絡して削除を依頼してください:https://support.github.com/contact
Issue/PR #{NUMBER} の userContentEdits の削除をリクエストしてください。
重要: 公開コメントや解決コメントで、編集履歴や「編集済み」ボタンについて言及しないでください。
コミット
クリーンアップできません。作者にブランチを削除するか、フォースプッシュするように通知します(マージされていない PR の場合)。
ステップ 5: 通知
node secret-scanning.mjs notify <TARGET> <AUTHOR> <LOCATION_TYPE> <SECRET_TYPES> [REPLY_TO_NODE_ID|BODY_REDACTION_RESULT_FILE]
- ディスカッションタイプ以外の場合、
<TARGET>は Issue/PR 番号です。 discussion_commentの場合、<TARGET>はfetch-contentから返されたdiscussion_node_idです。- 返信形式の
discussion_commentロケーションの場合、fetch-contentからのオプションのreply_to_node_idを渡して、通知が同じスレッドに残るようにします。 issue_bodyおよびpull_request_bodyの場合、redact-body-if-neededからの<result-file>を渡します。スクリプトは、notify_requiredがfalseの場合は通知をスキップし、このファイルなしではボディ通知を拒否します。
シークレットタイプはカンマ区切り:"Discord Bot Token,Feishu App Secret"
スクリプトは適切なテンプレートを選択します:
- コメントタイプ: 「your comment … removed and replaced」
- ボディタイプ: 「your issue/PR description … redacted in place」
- コミット: 「code you committed」
issue_body および pull_request_body の場合、現在のボディにまだプレーンテキストが含まれており、メンテナーが編集した場合のみ通知します。ユーザーがすでに現在のボディを編集している場合、通知をスキップしてステップ 6 に進みます。
ステップ 6: 解決
node secret-scanning.mjs resolve <ALERT_NUMBER> <RESOLUTION> [COMMENT]
証拠とメンテナーの権限によってサポートされる明示的な解決を選択します:
revoked: 認証情報の所有者または発行者が失効を確認しました。false_positive: 検出が誤検知であることが確認されました。used_in_tests: 認証情報がテストに使用されたことが確認されました。wont_fix: 権限のあるメンテナーがリスクを受け入れ、是正しないことを決定しました。その決定をコメントに記録します。
編集と認証情報のローテーションリクエストは、失効を確立するものではありません。実証された解決がない場合は、アラートをオープンのままにし、編集と通知の結果を個別に報告します。このコマンドにはデフォルトの解決はなく、解決が指定された場合にのみ解決コメントを追加します。
ステップ 7: サマリー
処理後、JSON 結果ファイルを作成し、サマリーコマンドに渡します:
node secret-scanning.mjs summary /tmp/results.json
スクリプトは、---BEGIN SUMMARY--- と ---END SUMMARY--- で区切られたブロックを出力します。これらのマーカー間のコンテンツをそのままユーザーに出力する必要があります。言い換え、フォーマット変更、省略、独自のサマリー作成はしないでください。 スクリプトは、すべてのアラートとロケーションの完全な URL をすでに含んでいます。
JSON 形式:
[
{
"number": 72,
"secret_type": "Discord Bot Token",
"location_label": "Issue #63101 comment",
"location_url": "https://github.com/openclaw/openclaw/issues/63101#issuecomment-xxx",
"actions": "Deleted+Recreated+Notified",
"history_cleared": true
}
]
サポートされていないタイプの場合は、"skipped": true, "unsupported_type": "<type>" を追加します。
安全ルール
- エージェントがコンテンツを読み取り、シークレットを特定し、編集を作成します。 スクリプトはすべての API 呼び出しを処理します。
- 公開コメント、編集マーカー、端末出力にシークレットの一部を含めないでください。
- 公開コメントにアラートの URL や番号を含めないでください。
- コメントの場合、PATCH はスキップし、直接 DELETE + 再作成を行ってください。
- 公開コンテンツで編集履歴、「編集済み」ボタン、コミット SHA について言及しないでください。
- コメントを削除する前に確認を求めてください。
- ユーザーがバッチを要求しない限り、一度に1つのアラートを処理してください。
- すべての公開コメントは英語で記述してください。
- サポートされていないロケーションタイプはスキップし、サマリーで報告してください。