openclaw-secret-scanning-maintainer
Skill59 starsChanged 16 days agoMITView on GitHub
Triage, redact, clean up, and resolve OpenClaw GitHub Secret Scanning alerts in issues or PRs.
We split this skill into the rules it gives an agent
8 rules. About 0 are common, 5 are distinctive, and 3 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈5
Distinctive · estimate
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 10
Use this skill when processing alerts from https://github.com/openclaw/openclaw/security/secret-scanning.
- Distinctive: line 12
Language rule: All notification comments and replacement comments MUST be written in English.
- Distinctive: line 16
All mechanical operations (API calls, temp file management, security enforcements) are handled by:
- Very specific: line 28
Never prints .secret or .body to stdout
- Very specific: line 110
Use the body_file from fetch-content as <current-body-file>.
- Distinctive: line 152
Do not advise authors publicly to delete/recreate issues or close/reopen PRs.
- Distinctive: line 201
After processing, create a JSON results file and pass it to the summary command:
- Distinctive: line 233
Ask for confirmation: before deleting any comment.
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
OpenClaw Secret Scanning Maintainer
Maintainer-only. This skill requires repo admin / maintainer permissions to edit or delete other users' comments and resolve secret scanning alerts.
Use this skill when processing alerts from https://github.com/openclaw/openclaw/security/secret-scanning.
Language rule: All notification comments and replacement comments MUST be written in English.
Script
All mechanical operations (API calls, temp file management, security enforcements) are handled by:
$REPO_ROOT/.agents/skills/openclaw-secret-scanning-maintainer/scripts/secret-scanning.mjsThe script enforces:
hide_secret=trueon all alert fetches (no plaintext secrets in stdout)mktempwith random UUIDs for all temp files-F body=@filefor all body uploads (no inline shell quoting)- Notification templates branched by location type
- Never prints
.secretor.bodyto stdout
Overall Flow
Supports single or multiple alerts. For multiple alerts, process in ascending order.
For each alert:
- Identify —
fetch-alert+fetch-contentto get metadata and body - Decide — Agent reads the body file, identifies whether plaintext secrets remain, and produces a redacted version only when needed
- Redact —
redact-body-if-neededfor issue/PR body; skip for comments (delete directly) - Purge —
delete-comment+recreate-commentfor comments; cannot purge body history - Notify —
notifyposts the right template per location type, unless the current issue/PR body is already redacted - Resolve —
resolvecloses the alert - Summary —
summaryprints formatted results
Step 1: Identify
# List all open alerts
node secret-scanning.mjs list-open
# Fetch specific alert metadata + locations
node secret-scanning.mjs fetch-alert <NUMBER>
# Fetch content for each location (saves body to temp file)
node secret-scanning.mjs fetch-content '<location-json>'The fetch-content output includes:
body_file: path to temp file with full body contentauthor: who posted itissue_number/pr_number: where it isedit_history_count: number of existing editstype: location type for routing- For
discussion_comment, it also includescomment_node_id,discussion_node_id, andreply_to_node_idwhen the original comment was a reply.
Location type routing
| type | Flow |
issue_comment | Comment: delete+recreate |
pull_request_comment | Comment: delete+recreate |
pull_request_review_comment | Comment: delete+recreate |
discussion_comment | Discussion comment: delete+recreate (GraphQL) |
issue_body | Body: redact in place |
pull_request_body | Body: redact in place |
commit | Notify only |
| other | Skip and report |
Step 2: Decide (Agent)
The agent reads the body file from fetch-content output and:
- Identifies ALL secrets in the content (there may be more than the alert flagged)
- Determines whether any plaintext credential remains in the current body
- Replaces each remaining secret with
[REDACTED <secret_type>]— no partial values, no prefix/suffix - Saves the redacted content to a new temp file
This is the only step that requires semantic understanding. Everything else is mechanical.
For issue_body and pull_request_body: if the current body has already been redacted by the author and no plaintext credential remains, do not post a public notification comment. Resolve the alert with a maintainer-only resolution comment such as:
node secret-scanning.mjs resolve <ALERT_NUMBER> revoked "Current issue/PR body is already redacted; no public notification posted."This avoids creating a fresh public pointer to historical sensitive content.
Step 3: Redact
For comments (issue_comment / PR comments)
Do NOT redact. Skip directly to Step 4 (delete + recreate). PATCHing before DELETE creates an unnecessary edit history revision.
For issue_body / pull_request_body
node secret-scanning.mjs redact-body-if-needed <issue|pr> <NUMBER> <current-body-file> <redacted-body-file> <result-file>Use the body_file from fetch-content as <current-body-file>. The command writes notify_required to <result-file> and only PATCHes the body when the redacted file differs from the current body.
Step 4: Purge Edit History
Comments — Delete and Recreate
For issue/PR comments:
# Delete original (all edit history gone)
node secret-scanning.mjs delete-comment <COMMENT_ID>
# Recreate with redacted content
node secret-scanning.mjs recreate-comment <ISSUE_NUMBER> <body-file>For discussion comments (uses GraphQL):
# Delete original
node secret-scanning.mjs delete-discussion-comment <COMMENT_NODE_ID>
# Recreate with redacted content
node secret-scanning.mjs recreate-discussion-comment <DISCUSSION_NODE_ID> <body-file> [REPLY_TO_NODE_ID]The fetch-content output for discussion_comment includes comment_node_id and discussion_node_id for these commands. When the original discussion comment was a reply, it also includes reply_to_node_id; pass that optional third argument so the redacted replacement stays in the original thread.
The recreated comment should follow this format:
> **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_body / pull_request_body — Cannot Purge Edit History
Editing creates an edit history revision with the pre-edit plaintext. This cannot be cleared via API.
Do not advise authors publicly to delete/recreate issues or close/reopen PRs. That can draw attention to historical content. Keep purge guidance maintainer-only.
Output to maintainer terminal only (never in public comments):
⚠️ Issue/PR body edit history still contains plaintext secrets.
Contact GitHub Support to purge: https://support.github.com/contact
Request purge of issue/PR #{NUMBER} userContentEdits.CRITICAL: Do NOT mention edit history or the "edited" button in any public comment or resolution_comment.
Commits
Cannot clean. Notify author to delete branch or force-push (for unmerged PRs).
Step 5: Notify
node secret-scanning.mjs notify <TARGET> <AUTHOR> <LOCATION_TYPE> <SECRET_TYPES> [REPLY_TO_NODE_ID|BODY_REDACTION_RESULT_FILE]- For non-discussion types,
<TARGET>is the issue/PR number. - For
discussion_comment,<TARGET>is thediscussion_node_idreturned byfetch-content. - For reply-style
discussion_commentlocations, pass the optionalreply_to_node_idfromfetch-contentso the notification stays in the same thread. - For
issue_bodyandpull_request_body, pass the<result-file>fromredact-body-if-needed. The script skips notification whennotify_requiredisfalseand refuses body notifications without this file.
Secret types are comma-separated: "Discord Bot Token,Feishu App Secret"
The script picks the right template:
- comment types: "your comment … removed and replaced"
- body types: "your issue/PR description … redacted in place"
- commit: "code you committed"
For issue_body and pull_request_body, only notify when the current body still contained plaintext and maintainers redacted it. If the user already redacted the current body, skip this step and resolve silently.
Step 6: Resolve
node secret-scanning.mjs resolve <ALERT_NUMBER>
# or with custom resolution:
node secret-scanning.mjs resolve <ALERT_NUMBER> revoked "Custom comment"Resolution is revoked by default. As maintainers we cannot control whether users rotate — our responsibility is to remove current plaintext exposure and notify only when public notification is useful. The revoked means "this secret should be considered leaked", not "I confirmed it was revoked".
Step 7: Summary
After processing, create a JSON results file and pass it to the summary command:
node secret-scanning.mjs summary /tmp/results.jsonThe script outputs a block delimited by ---BEGIN SUMMARY--- and ---END SUMMARY---. You MUST output the content between these markers verbatim to the user. Do NOT rephrase, reformat, abbreviate, or create your own summary. The script already includes full URLs for every alert and location.
The JSON format:
[
{
"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
}
]For unsupported types, add "skipped": true, "unsupported_type": "<type>".
Safety Rules
- Agent reads content, identifies secrets, produces redaction. Script handles all API calls.
- Never include any portion of a secret in public comments, redaction markers, or terminal output.
- Never include alert URLs or numbers in public comments.
- For comments, skip PATCH — go directly to DELETE + recreate.
- Never mention edit history, "edited" button, or commit SHAs in any public content.
- Ask for confirmation before deleting any comment.
- One alert at a time unless user requests batch.
- All public comments in English.
- Skip unsupported location types and report in summary.
Other versions12 projects use a version of this.
Word for word · 11
- steipete/warelay★ 394k100% same
- moltbot/clawdbot★ 394k100% same
- moltbot/moltbot★ 394k100% same
- clawdbot/clawdbot★ 394k100% same
- steipete/clawdis★ 394k100% same
- openclaw/openclaw★ 394k100% same
- molt-bot/clawdbot★ 391k100% same
- friuns2/openclaw-android-assistant★ 573100% same
- OpenClawAndroid/openclaw-android-assistant★ 556100% same
- clawsouls/soulclaw★ 9100% same
1 more not listed
Edited · 1
- QVerisAI/QVerisBot★ 18490% same
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
Used alongsideProjects with it also use openclaw-performance.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
clawdbotSkillopenclaw-performance
Performance work in OpenClaw: a slow or heavy flow (latency, CPU, memory, SQL, RPC, renders), writing or reviewing a perf PR, or adding a cache. Count the work, delete waste first, cache last.
Also in 6 projects that use this
In this repository107 other files it gives its agents.
- AGENTS.mdAGENTS.md
- docs/AGENTS.mdAGENTS.md
- extensions/AGENTS.mdAGENTS.md
- scripts/AGENTS.mdAGENTS.md
- test/AGENTS.mdAGENTS.md
- ui/AGENTS.mdAGENTS.md
- agent-transcriptSkill
- auto-qaSkill
- autoreviewSkill
- channel-message-flowsSkill
- clawdtributorSkill
- claw-scoreSkill
- clawsweeperSkill
- control-ui-e2eSkill
- crabboxSkill
- discord-clawdSkill
- discord-e2eSkill
- discord-user-postSkill
- discrawlSkill
- gitcrawlSkill
- graincrawlSkill
- notcrawlSkill
- openclaw-changelog-updateSkill
- openclaw-ci-limitsSkill
- openclaw-debuggingSkill
- openclaw-docker-e2e-authoringSkill
- openclaw-ghsa-maintainerSkill
- openclaw-live-updaterSkill
- openclaw-parallels-smokeSkill
- openclaw-pr-maintainerSkill
- openclaw-qa-testingSkill
- openclaw-refactor-docsSkill
- openclaw-release-validationSkill
- openclaw-repair-sweepSkill
- openclaw-test-heap-leaksSkill
- openclaw-testingSkill
- openclaw-test-performanceSkill
- openclaw-updateSkill
- parallels-discord-roundtripSkill
- plugin-sdk-impactSkill
- proof-videoSkill
- prototype-openclaw-tuiSkill
- pr-simplifySkill
- release-openclaw-announcementSkill
- release-openclaw-ciSkill
- release-openclaw-macSkill
- release-openclaw-maintainerSkill
- release-openclaw-plugin-testingSkill
- security-triageSkill
- slack-e2eSkill
- slacrawlSkill
- solidSkill
- tag-duplicate-prs-issuesSkill
- technical-documentationSkill
- telegram-e2e-userbotSkill
- test-auditSkill
- update-team-serverSkill
- verify-releaseSkill
- 1passwordSkill
- apple-notesSkill
- The first 60 shown.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

