$npx -y skills add TserenTserenov/FMT-exocortex-template --skill check-secretCheck a text fragment for potential secrets (API keys, tokens, passwords) BEFORE sending to chat / committing / publishing. Third protection layer on top of pre-commit hook (B7.7a) and PostToolUse redact (B7.7b). Manual gate — user explicitly calls on potentially sensitive text.
| 1 | # Check Secret — manual gate (B7.7c, WP-212) |
| 2 | |
| 3 | > **Принцип:** B7.7a блокирует Bash-команды с секретами; B7.7b редактирует tool output; этот skill закрывает третий gap — **проверка произвольного текста** который пользователь готовится опубликовать (commit message, slack post, docs paragraph, чат-ответ). |
| 4 | > |
| 5 | > **Покрывает паттерны:** 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. |
| 6 | > |
| 7 | > **Архитектурное ограничение** (см. B7.7 в WP-212): не покрывает Claude-generated text без tool-use — для этого нужен внешний wrapper над Claude Code. |
| 8 | |
| 9 | ## Шаг 1. Получить вход |
| 10 | |
| 11 | Аргумент `$ARGUMENTS` — это **либо**: |
| 12 | - (а) **путь к файлу** (если `$ARGUMENTS` существует как файл) — прочитать содержимое; |
| 13 | - (б) **сам текст** (inline) — взять как есть. |
| 14 | |
| 15 | Если нет аргумента — попросить пользователя вставить текст. |
| 16 | |
| 17 | ## Шаг 2. Запустить проверку |
| 18 | |
| 19 | ```bash |
| 20 | bash "$IWE_SCRIPTS/route-task.sh" --skill check-secret --args "$ARGUMENTS" |
| 21 | ``` |
| 22 | |
| 23 | Скрипт принимает либо путь либо текст. Возвращает: |
| 24 | - exit 0 + `OK: no secrets detected` — если ничего не найдено; |
| 25 | - exit 1 + список найденных паттернов с line numbers — если найдены потенциальные секреты. |
| 26 | |
| 27 | ## Шаг 3. Интерпретировать результат |
| 28 | |
| 29 | **Если OK:** сообщить «✅ Текст безопасен для публикации» — пользователь может коммитить / постить. |
| 30 | |
| 31 | **Если найдены секреты:** |
| 32 | 1. Перечислить найденные паттерны (с метками: Neon API key, GitHub token, и т.д.). |
| 33 | 2. Для каждого — рекомендация: |
| 34 | - Если плейсхолдер/тест/документация — добавить маркер `# secret-ok` в строку или `[REDACTED]` placeholder. |
| 35 | - Если реальный секрет — НЕ публиковать; запустить cascade rotation (см. `DP.RUNBOOK.003-cascade-secret-rotation.md`); см. правило 25 в `feedback_behaviour.md`. |
| 36 | 3. После redaction — повторить проверку. |
| 37 | |
| 38 | ## Шаг 4. Лог |
| 39 | |
| 40 | Каждое использование скилла логируется в `~/IWE/.claude/logs/check-secret.jsonl` (только metadata: timestamp, hash аргумента, decision; **не сами секреты**). |
| 41 | |
| 42 | ## Связи |
| 43 | |
| 44 | - **Расширение:** B7.7a (`secret-leak-block.sh`) и B7.7b (`secret-leak-redact.sh`) — три-слойная защита. |
| 45 | - **Правило поведения:** Правило 25 в `memory/feedback_behaviour.md` — secrets никогда в чат как плейнтекст. |
| 46 | - **Runbook:** `DP.RUNBOOK.003-cascade-secret-rotation.md` для процедуры reactive ротации. |
| 47 | - **Канон паттернов:** `$IWE_SCRIPTS/pre-commit-secret-scan.sh` — единая точка для regex-паттернов; check.sh использует тот же набор. |
| 48 | |
| 49 | <!-- USER-SPACE --> |
| 50 | <!-- /USER-SPACE --> |