Claude Skill

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.

LLM Mart · 0 points · 12 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download TserenTserenov-FMT-exocortex-template-.claude_skills_check-secret-52c884b.zip · 4 KB
Part of tserentserenov/fmt-exocortex-template — 50 skills

Install

skills CLI npx skills add https://github.com/TserenTserenov/FMT-exocortex-template/tree/main/.claude/skills/check-secret
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install tserentserenov-fmt-exocortex-template@llmmart
Git 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, 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 "$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 использует тот же набор.
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.

No comments yet.

Reviews (0)

No reviews yet.

Related