openclaw-secret-scanning-maintainer

Triagem, ocultação, limpeza e resolução de alertas de varredura de segredos do OpenClaw GitHub em issues ou PRs.

O que é openclaw-secret-scanning-maintainer?

Esta habilidade permite que mantenedores do repositório OpenClaw processem alertas de varredura de segredos do GitHub de forma segura e eficiente. Ela automatiza a identificação, decisão, redação e limpeza de segredos vazados em issues, pull requests e comentários, com scripts rigorosos para garantir que nenhum texto secreto seja exposto em saídas padrão ou comentários públicos. A habilidade suporta múltiplos tipos de localização, como issue_comment, pull_request_body e discussion_comment, com fluxos específicos para cada um: comentários são deletados e recriados, enquanto corpos de issues/PRs são editados no local. Para corpos já redigidos pelo autor, a notificação pública é pulada para evitar chamar atenção para conteúdo histórico; já para commits, apenas notifica. A resolução dos alertas é baseada em evidências e autoridade do mantenedor, com opções como 'revoked' ou 'false_positive'. A segurança é prioridade máxima: o agente lê o conteúdo e produz a redação, mas todas as operações de API e gerenciamento de arquivos temporários são feitas por scripts, com 'hide_secret=true' e uso de UUIDs aleatórios. A habilidade também lida com comentários de discussão via GraphQL, preservando a estrutura de respostas originais.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/clawdbot/clawdbot/tree/main/.agents/skills/openclaw-secret-scanning-maintainer

Installed? Explore more Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

OpenClaw Secret Scanning Maintainer

Apenas para mantenedores. Esta habilidade requer permissões de admin/mantenedor do repositório para editar ou excluir comentários de outros usuários e resolver alertas de varredura de segredos.

Use esta habilidade ao processar alertas de https://github.com/openclaw/openclaw/security/secret-scanning.

Regra de idioma: Todos os comentários de notificação e comentários de substituição DEVEM ser escritos em inglês.

Script

Todas as operações mecânicas (chamadas de API, gerenciamento de arquivos temporários, aplicação de segurança) são tratadas por:

$REPO_ROOT/.agents/skills/openclaw-secret-scanning-maintainer/scripts/secret-scanning.mjs

O script impõe:

  • hide_secret=true em todas as buscas de alerta (sem segredos em texto puro no stdout)
  • mktemp com UUIDs aleatórios para todos os arquivos temporários
  • -F body=@file para todos os uploads de corpo (sem citação inline em shell)
  • Modelos de notificação ramificados por tipo de localização
  • Nunca imprime .secret ou .body no stdout

Fluxo Geral

Suporta um único alerta ou múltiplos alertas. Para múltiplos alertas, processe em ordem crescente.

Para cada alerta:

  1. Identificar — fetch-alert + fetch-content para obter metadados e corpo
  2. Decidir — O agente lê o arquivo de corpo, identifica se ainda há segredos em texto puro e produz uma versão redigida apenas quando necessário
  3. Redigir — redact-body-if-needed para corpo de issue/PR; pular para comentários (deletar diretamente)
  4. Limpar — delete-comment + recreate-comment para comentários; não é possível limpar histórico de edições do corpo
  5. Notificar — notify publica o modelo correto por tipo de localização, a menos que o corpo atual da issue/PR já esteja redigido
  6. Resolver — resolve fecha o alerta
  7. Sumário — summary imprime resultados formatados

Passo 1: Identificar

# Listar todos os alertas abertos
node secret-scanning.mjs list-open

# Buscar metadados + localizações de um alerta específico
node secret-scanning.mjs fetch-alert <NUMERO>

# Buscar conteúdo de cada localização (salva o corpo em um arquivo temporário)
node secret-scanning.mjs fetch-content '<localizacao-json>'

A saída de fetch-content inclui:

  • body_file: caminho para o arquivo temporário com o conteúdo completo do corpo
  • author: quem publicou
  • issue_number / pr_number: onde está
  • edit_history_count: número de edições existentes
  • type: tipo de localização para roteamento
  • Para discussion_comment, também inclui comment_node_id, discussion_node_id e reply_to_node_id quando o comentário original era uma resposta.

Roteamento por tipo de localização

typeFluxo
issue_commentComentário: deletar+recriar
pull_request_commentComentário: deletar+recriar
pull_request_review_commentComentário: deletar+recriar
discussion_commentComentário de discussão: deletar+recriar (GraphQL)
issue_bodyCorpo: redigir no local
pull_request_bodyCorpo: redigir no local
commitApenas notificar
outroPular e relatar

Passo 2: Decidir (Agente)

O agente lê o arquivo de corpo da saída de fetch-content e:

  1. Identifica TODOS os segredos no conteúdo (pode haver mais do que o alerta sinalizou)
  2. Determina se ainda resta alguma credencial em texto puro no corpo atual
  3. Substitui cada segredo restante por [REDACTED <tipo_do_segredo>] — sem valores parciais, sem prefixo/sufixo
  4. Salva o conteúdo redigido em um novo arquivo temporário

Esta é a única etapa que requer compreensão semântica. Todo o resto é mecânico.

Para issue_body e pull_request_body: se o corpo atual já foi redigido pelo autor e nenhuma credencial em texto puro permanece, não publique um comentário público de notificação. Isso evita criar um novo ponteiro público para conteúdo histórico sensível. Registre essa redação separadamente e use o Passo 6 para decidir se a evidência suporta a resolução do alerta.

Passo 3: Redigir

Para comentários (issue_comment / comentários de PR)

NÃO redigir. Pule diretamente para o Passo 4 (deletar + recriar). Usar PATCH antes de DELETE cria uma revisão desnecessária no histórico de edições.

Para issue_body / pull_request_body

node secret-scanning.mjs redact-body-if-needed <issue|pr> <NUMERO> <arquivo-corpo-atual> <arquivo-corpo-redigido> <arquivo-resultado>

Use o body_file de fetch-content como <arquivo-corpo-atual>. O comando escreve notify_required no <arquivo-resultado> e só aplica PATCH no corpo quando o arquivo redigido difere do corpo atual.

Passo 4: Limpar Histórico de Edições

Comentários — Deletar e Recriar

Para comentários de issue/PR:

# Deletar original (todo histórico de edições desaparece)
node secret-scanning.mjs delete-comment <ID_DO_COMENTARIO>

# Recriar com conteúdo redigido
node secret-scanning.mjs recreate-comment <NUMERO_DA_ISSUE> <arquivo-corpo>

Para comentários de discussão (usa GraphQL):

# Deletar original
node secret-scanning.mjs delete-discussion-comment <ID_DO_NO_DO_COMENTARIO>

# Recriar com conteúdo redigido
node secret-scanning.mjs recreate-discussion-comment <ID_DO_NO_DA_DISCUSSAO> <arquivo-corpo> [ID_DO_NO_DE_RESPOSTA]

A saída de fetch-content para discussion_comment inclui comment_node_id e discussion_node_id para esses comandos. Quando o comentário original da discussão era uma resposta, também inclui reply_to_node_id; passe esse argumento opcional para que a substituição redigida permaneça no tópico original.

O comentário recriado deve seguir este formato:

> **Nota:** O comentário original de @<AUTOR> foi removido devido a vazamento de segredo. Abaixo está a versão redigida do conteúdo original.

---

<conteúdo original redigido>

issue_body / pull_request_body — Não é possível limpar histórico de edições

Editar cria uma revisão no histórico de edições com o texto puro anterior. Isso não pode ser limpo via API.

Não oriente autores publicamente a deletar/recriar issues ou fechar/reabrir PRs. Isso pode chamar atenção para conteúdo histórico. Mantenha a orientação de limpeza apenas para mantenedores.

Saída apenas no terminal do mantenedor (nunca em comentários públicos):

⚠️ O histórico de edições do corpo da issue/PR ainda contém segredos em texto puro.
Entre em contato com o Suporte do GitHub para limpar: https://support.github.com/contact
Solicite a limpeza das userContentEdits da issue/PR #{NUMERO}.

CRÍTICO: Não mencione o histórico de edições ou o botão "editado" em nenhum comentário público ou comentário de resolução.

Commits

Não é possível limpar. Notifique o autor para deletar o branch ou fazer force push (para PRs não mesclados).

Passo 5: Notificar

node secret-scanning.mjs notify <ALVO> <AUTOR> <TIPO_DE_LOCALIZACAO> <TIPOS_DE_SEGREDO> [ID_DO_NO_DE_RESPOSTA|ARQUIVO_RESULTADO_DA_REDACAO_DO_CORPO]
  • Para tipos que não são de discussão, <ALVO> é o número da issue/PR.
  • Para discussion_comment, <ALVO> é o discussion_node_id retornado por fetch-content.
  • Para localizações de discussion_comment do tipo resposta, passe o reply_to_node_id opcional de fetch-content para que a notificação permaneça no mesmo tópico.
  • Para issue_body e pull_request_body, passe o <arquivo-resultado> de redact-body-if-needed. O script pula a notificação quando notify_required é false e recusa notificações de corpo sem este arquivo.

Os tipos de segredo são separados por vírgula: "Discord Bot Token,Feishu App Secret"

O script escolhe o modelo correto:

  • tipos de comentário: "seu comentário … removido e substituído"
  • tipos de corpo: "sua descrição de issue/PR … redigida no local"
  • commit: "código que você commitou"

Para issue_body e pull_request_body, notifique apenas quando o corpo atual ainda continha texto puro e mantenedores o redigiram. Se o usuário já redigiu o corpo atual, pule a notificação e continue para o Passo 6.

Passo 6: Resolver

node secret-scanning.mjs resolve <NUMERO_DO_ALERTA> <RESOLUCAO> [COMENTARIO]

Escolha uma resolução explícita suportada pela evidência e pela autoridade do mantenedor:

  • revoked: o proprietário ou emissor da credencial confirmou a revogação.
  • false_positive: a detecção foi confirmada como falso positivo.
  • used_in_tests: a credencial foi confirmada como usada para testes.
  • wont_fix: um mantenedor autorizado aceitou o risco e decidiu não remediar; registre essa decisão no comentário.

Redação e um pedido para rotacionar credenciais não estabelecem revogação. Se nenhuma resolução for fundamentada, deixe o alerta aberto e relate os resultados da redação e notificação separadamente. O comando não tem resolução padrão e adiciona um comentário de resolução apenas quando fornecido.

Passo 7: Sumário

Após o processamento, crie um arquivo JSON de resultados e passe-o para o comando de sumário:

node secret-scanning.mjs summary /tmp/results.json

O script gera um bloco delimitado por ---BEGIN SUMMARY--- e ---END SUMMARY---. Você DEVE gerar o conteúdo entre esses marcadores literalmente para o usuário. Não reformule, reformate, abreve ou crie seu próprio sumário. O script já inclui URLs completas para cada alerta e localização.

O formato 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
  }
]

Para tipos não suportados, adicione "skipped": true, "unsupported_type": "<tipo>".

Regras de Segurança

  • O agente lê o conteúdo, identifica segredos e produz a redação. O script lida com todas as chamadas de API.
  • Nunca inclua qualquer parte de um segredo em comentários públicos, marcadores de redação ou saída do terminal.
  • Nunca inclua URLs ou números de alerta em comentários públicos.
  • Para comentários, pule PATCH — vá direto para DELETE + recriar.
  • Nunca mencione histórico de edições, botão "editado" ou SHAs de commit em qualquer conteúdo público.
  • Peça confirmação antes de deletar qualquer comentário.
  • Um alerta por vez a menos que o usuário solicite lote.
  • Todos os comentários públicos em inglês.
  • Pule tipos de localização não suportados e relate no sumário.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

1password

Set up and use 1Password CLI for sign-in, desktop integration, and reading or injecting secrets.

acp-router

Route plain-language requests for Claude Code, Cursor, Copilot, OpenClaw ACP, OpenCode, Gemini CLI, Grok Build, Qwen, Kiro, Kimi, iFlow, Factory Droid, Kilocode, or explicit ACP harness work into either OpenClaw ACP runtime sessions or direct acpx-driven sessions ("telephone game" flow). For coding-agent thread requests, read this skill first, then use only `sessions_spawn` for thread creation. Codex chat binding defaults to the native Codex app-server plugin unless ACP is explicit or background spawn needs ACP.

add-model-provider

Add and live-prove a model provider with non-interactive config one-liners, without exposing credentials.

agent-transcript

Requested GitHub PR/issue agent transcripts: redact, trim, preview, and insert safely.

apple-notes

Create, view, edit, delete, search, move, or export Apple Notes via the memo CLI on macOS.

apple-reminders

List, add, edit, complete, or delete Apple Reminders and reminder lists via remindctl.

auto-qa

Run OpenClaw-wide autonomous QA and live/stress campaigns across independent subsystem lanes, with verified fixes and a resumable evidence report.

autoreview

Structured code review through the shared OpenClaw agent-skills installation.

bear-notes

Create, search, and manage Bear notes via grizzly CLI.

blacksmith-testbox

Run Blacksmith Testbox for CI-parity checks, secrets, hosted services, migrations, or builds local cannot reproduce.

block-kit

Use proactively for structured or interactive Slack replies, and when asked to author or validate native Slack Block Kit JSON.

blogwatcher

Monitor blogs and RSS/Atom feeds for updates using the blogwatcher CLI.

blucli

BluOS CLI (blu) for discovery, playback, grouping, and volume.

bluebubbles

Send and manage iMessages via BlueBubbles, including attachments, tapbacks, edits, replies, and groups.

browser-automation

Use when controlling web pages with the OpenClaw browser tool, especially multi-step flows, login checks, tab management, or recovery from stale refs/timeouts.

camsnap

Capture frames or clips from RTSP/ONVIF cameras and local webcams, including USB pan/tilt/zoom control.

canvas

Present HTML on connected OpenClaw node canvases, navigate/eval/snapshot, and debug canvas host URLs.

channel-message-flows

Use when running QA Lab channel message flow evidence.

clawdtributor

Clawtributor PRs here, last week or another window: discover conversation refs, recheck GitHub, rank by impact.

clawhub

Search ClawHub for plugins by default, or skills when explicitly requested; install, verify, update, uninstall, publish, or sync skills.

Habilidades Relacionadas