check-secret
Check a text fragment for potential secrets (API keys, tokens, passwords) BEFORE sending to chat / committing / publishing. Second protection layer on top of the pre-commit hook — manual gate, user explicitly calls on potentially sensitive text.
Install
npx skills add https://github.com/TserenTserenov/FMT-exocortex-template/tree/main/.claude/skills/check-secret
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install tserentserenov-fmt-exocortex-template@llmmart
git clone https://github.com/TserenTserenov/FMT-exocortex-template.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole tserentserenov/fmt-exocortex-template collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
Check Secret — manual gate (WP-212)
Принцип (issue #410, актуализировано 2026-08-12): в поставке реально работает один автоматический слой — pre-commit хук (
scripts/pre-commit-secret-scan.sh), который проверяет только то, что попадает в git-коммит. Этот skill закрывает соседний gap — проверка произвольного текста до публикации (commit message, slack post, docs paragraph, чат-ответ), который никогда не пойдёт в коммит и потому мимо хука. B7.7a (блок Bash-команд с секретами) и B7.7b (PostToolUse redact tool output) в поставке не существуют — если появятся, вернуть формулировку «третий слой».Покрывает паттерны: Better Stack
ust_, Telegram bot token, hex secret в env, Neonnapi_, DATABASE_URL с user:pass, Anthropicsk-ant-api, GitHubghp_/gho_/ghs_/ghr_/ghu_, AWSAKIA, generic 40+ char API token.Архитектурное ограничение (см. B7.7 в WP-212): не покрывает Claude-generated text без tool-use — для этого нужен внешний wrapper над Claude Code.
Шаг 1. Получить вход
Аргумент $ARGUMENTS — это либо:
- (а) путь к файлу (если
$ARGUMENTSсуществует как файл) — прочитать содержимое; - (б) сам текст (inline) — взять как есть.
Если нет аргумента — попросить пользователя вставить текст.
Шаг 2. Запустить проверку
bash "$IWE_SCRIPTS/route-task.sh" --skill check-secret --args "$ARGUMENTS"
Скрипт принимает либо путь либо текст. Возвращает:
- exit 0 +
OK: no secrets detected— если ничего не найдено; - exit 1 + список найденных паттернов с line numbers — если найдены потенциальные секреты.
Шаг 3. Интерпретировать результат
Если OK: сообщить «✅ Текст безопасен для публикации» — пользователь может коммитить / постить.
Если найдены секреты:
- Перечислить найденные паттерны (с метками: Neon API key, GitHub token, и т.д.).
- Для каждого — рекомендация:
- Если плейсхолдер/тест/документация — добавить маркер
# secret-okв строку или[REDACTED]placeholder. - Если реальный секрет — НЕ публиковать; запустить cascade rotation (см.
DP.RUNBOOK.003-cascade-secret-rotation.md); см. правило 25 вfeedback_behaviour.md.
- Если плейсхолдер/тест/документация — добавить маркер
- После redaction — повторить проверку.
Шаг 4. Лог
Каждое использование скилла логируется в ~/IWE/.claude/logs/check-secret.jsonl (только metadata: timestamp, hash аргумента, decision; не сами секреты).
Связи
- Слои защиты (issue #410, актуализировано 2026-08-12): ровно два, не три — pre-commit хук (
scripts/pre-commit-secret-scan.sh, автоматический) и этот скилл (ручной, до вставки в чат/публикацию). B7.7a (блок Bash) и B7.7b (PostToolUse redact) в поставке не существуют — если появятся, дописать сюда третьим слоем. - Правило поведения: Правило 25 в
memory/feedback_behaviour.md— secrets никогда в чат как плейнтекст. - Runbook:
DP.RUNBOOK.003-cascade-secret-rotation.mdдля процедуры reactive ротации. - Канон паттернов:
$IWE_SCRIPTS/pre-commit-secret-scan.sh— единая точка для regex-паттернов; check.sh использует тот же набор.
Files (fmt-exocortex-template)
-
check.sh 3.5 KB
#!/bin/bash # check-secret skill backend (B7.7c, WP-212) # Принимает: путь к файлу или inline текст. # Возвращает: exit 0 + "OK" или exit 1 + список найденных паттернов. # # Использует те же regex что pre-commit-secret-scan.sh + secret-leak-block.sh # (single source of truth — хочется синхронизации; пока копия, future: shared lib). set -uo pipefail export PATH="/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin:${PATH:-}" # Load unified environment: WORKSPACE_DIR, IWE_ROOT, IWE_SCRIPTS, etc. SKILL_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" CLAUDE_DIR="$(cd "$SKILL_DIR/../.." && pwd)" # shellcheck source=../../lib/iwe-env-bootstrap.sh source "$CLAUDE_DIR/lib/iwe-env-bootstrap.sh" || exit 1 LOG_FILE="$IWE_ROOT/.claude/logs/check-secret.jsonl" mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true input="${*:-}" if [ -z "$input" ]; then echo "Usage: check.sh <file-path-or-text>" echo " cat file.txt | check.sh -" exit 2 fi # Если -, читаем из stdin if [ "$input" = "-" ]; then text=$(cat) elif [ -f "$input" ]; then text=$(cat "$input") else text="$input" fi if [ -z "$text" ]; then echo "OK: empty input, no secrets detected" exit 0 fi # Паттерны (label|regex) declare -a patterns=( "Better Stack API token|ust_[A-Za-z0-9]{20,}" "Telegram bot token|[0-9]{8,10}:[A-Za-z0-9_-]{35}" "Hex secret в env|(_SECRET|_HMAC|_TOKEN|_API_KEY)[[:space:]]*=[[:space:]]*\"?[a-f0-9]{32,}" "Neon API key|napi_[A-Za-z0-9]{30,}" "DATABASE_URL с user:pass|postgresql(ql)?://[^:[:space:]]+:[^@[:space:]]{4,}@" "Anthropic API key|sk-ant-api[0-9]{2}-[A-Za-z0-9_-]{30,}" "GitHub token|gh[poshru]_[A-Za-z0-9]{30,}" "AWS access key|AKIA[0-9A-Z]{16}" "AWS secret key|[Aa][Ww][Ss].{0,24}([Ss]ecret|[Pp]rivate).{0,24}[=:][[:space:]]*[\"']?[A-Za-z0-9/+=]{40}" "Generic 40+ char API token|(_API_KEY|_TOKEN|_KEY)[[:space:]]*=[[:space:]]*\"?[A-Za-z0-9_/+=-]{40,}\"?" ) violations="" match_count=0 for entry in "${patterns[@]}"; do label="${entry%%|*}" pat="${entry#*|}" hits=$(printf '%s' "$text" | grep -nE "$pat" || true) if [ -n "$hits" ]; then violations="${violations} [$label] $hits " match_count=$((match_count + 1)) fi done ts=$(date -u +"%Y-%m-%dT%H:%M:%SZ") input_hash=$(printf '%s' "$text" | shasum -a 256 | cut -c1-16) if [ -z "$violations" ]; then jq -nc \ --arg ts "$ts" \ --arg hash "$input_hash" \ --arg len "${#text}" \ '{ts:$ts, skill:"check-secret", input_hash:$hash, input_len:($len|tonumber), decision:"clean"}' \ >> "$LOG_FILE" 2>/dev/null || true echo "OK: no secrets detected (input: ${#text} chars)" exit 0 fi jq -nc \ --arg ts "$ts" \ --arg hash "$input_hash" \ --arg cnt "$match_count" \ '{ts:$ts, skill:"check-secret", input_hash:$hash, decision:"detected", patterns_matched:($cnt|tonumber)}' \ >> "$LOG_FILE" 2>/dev/null || true echo "" echo "🚫 SECRETS DETECTED ($match_count pattern(s)):" echo "$violations" echo "" echo "Действия:" echo " - Если плейсхолдер/тест — заменить на [REDACTED] или добавить '# secret-ok' маркер в строку." echo " - Если реальный секрет — НЕ публиковать. Cascade rotation: ~/IWE/DS-ecosystem-development/.../Runbooks/DP.RUNBOOK.003-cascade-secret-rotation.md" echo " - Правило поведения: ~/IWE/memory/feedback_behaviour.md Правило 25." echo "" exit 1 -
SKILL.md 4.9 KB
--- name: check-secret description: Check a text fragment for potential secrets (API keys, tokens, passwords) BEFORE sending to chat / committing / publishing. Second protection layer on top of the pre-commit hook — manual gate, user explicitly calls on potentially sensitive text. argument-hint: "<text-or-file-path>" version: 1.0.0 layer: L1 status: active browser_safe: false triggers: slash: [/check-secret] phrases: [] routing: executor: script deterministic: true script_path: ".claude/skills/check-secret/check.sh" optimization_priority: 2 --- # Check Secret — manual gate (WP-212) > **Принцип (issue #410, актуализировано 2026-08-12):** в поставке реально работает один автоматический слой — pre-commit хук (`scripts/pre-commit-secret-scan.sh`), который проверяет только то, что попадает в git-коммит. Этот skill закрывает соседний gap — **проверка произвольного текста до публикации** (commit message, slack post, docs paragraph, чат-ответ), который никогда не пойдёт в коммит и потому мимо хука. B7.7a (блок Bash-команд с секретами) и B7.7b (PostToolUse redact tool output) в поставке не существуют — если появятся, вернуть формулировку «третий слой». > > **Покрывает паттерны:** Better Stack `ust_`, Telegram bot token, hex secret в env, Neon `napi_`, DATABASE_URL с user:pass, Anthropic `sk-ant-api`, GitHub `ghp_/gho_/ghs_/ghr_/ghu_`, AWS `AKIA`, generic 40+ char API token. > > **Архитектурное ограничение** (см. B7.7 в WP-212): не покрывает Claude-generated text без tool-use — для этого нужен внешний wrapper над Claude Code. ## Шаг 1. Получить вход Аргумент `$ARGUMENTS` — это **либо**: - (а) **путь к файлу** (если `$ARGUMENTS` существует как файл) — прочитать содержимое; - (б) **сам текст** (inline) — взять как есть. Если нет аргумента — попросить пользователя вставить текст. ## Шаг 2. Запустить проверку ```bash bash "$IWE_SCRIPTS/route-task.sh" --skill check-secret --args "$ARGUMENTS" ``` Скрипт принимает либо путь либо текст. Возвращает: - exit 0 + `OK: no secrets detected` — если ничего не найдено; - exit 1 + список найденных паттернов с line numbers — если найдены потенциальные секреты. ## Шаг 3. Интерпретировать результат **Если OK:** сообщить «✅ Текст безопасен для публикации» — пользователь может коммитить / постить. **Если найдены секреты:** 1. Перечислить найденные паттерны (с метками: Neon API key, GitHub token, и т.д.). 2. Для каждого — рекомендация: - Если плейсхолдер/тест/документация — добавить маркер `# secret-ok` в строку или `[REDACTED]` placeholder. - Если реальный секрет — НЕ публиковать; запустить cascade rotation (см. `DP.RUNBOOK.003-cascade-secret-rotation.md`); см. правило 25 в `feedback_behaviour.md`. 3. После redaction — повторить проверку. ## Шаг 4. Лог Каждое использование скилла логируется в `~/IWE/.claude/logs/check-secret.jsonl` (только metadata: timestamp, hash аргумента, decision; **не сами секреты**). ## Связи - **Слои защиты (issue #410, актуализировано 2026-08-12):** ровно два, не три — pre-commit хук (`scripts/pre-commit-secret-scan.sh`, автоматический) и этот скилл (ручной, до вставки в чат/публикацию). B7.7a (блок Bash) и B7.7b (PostToolUse redact) в поставке не существуют — если появятся, дописать сюда третьим слоем. - **Правило поведения:** Правило 25 в `memory/feedback_behaviour.md` — secrets никогда в чат как плейнтекст. - **Runbook:** `DP.RUNBOOK.003-cascade-secret-rotation.md` для процедуры reactive ротации. - **Канон паттернов:** `$IWE_SCRIPTS/pre-commit-secret-scan.sh` — единая точка для regex-паттернов; check.sh использует тот же набор. <!-- USER-SPACE --> <!-- /USER-SPACE -->
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.