diff --git a/docs/observer/STATUS.md b/docs/observer/STATUS.md index 95ceb437..69f6d59d 100644 --- a/docs/observer/STATUS.md +++ b/docs/observer/STATUS.md @@ -1,22 +1,22 @@ # Brain Status (auto-generated) -Last updated: 2026-05-23T01:26:15.461Z +Last updated: 2026-05-23T06:38:59.003Z | Контролёр | Состояние | Детали | |---|---|---| -| C1 L1-watcher | 🔴 | If the plugin is referenced in Tooling under a group/human name, add an alias to tools/.l1-watcher-aliases.txt. | +| C1 L1-watcher | ✅ | [l1-watcher] OK — 0 drift | | C2 Cross-ref consistency | ✅ | [cross-ref-checker] OK — 0 drift in 4 files | | C3 Observer-of-observer | ✅ | [observer-of-observer] OK — last read 0 week(s) ago | | C4 Сигнальный статус | ✅ | This file (self-reference) | -| C5 Observer-coverage | ⚠️ | 88 episode(s) this month · Stop-hook + post-commit OK · 31 missed activation(s) — see /brain-retro | -| C6 Chain map sync | 🔴 | В .md есть цепочки без записи в JSON: L16 — добавьте узлы в tools/observer-chain-map.json | +| C5 Observer-coverage | ⚠️ | 105 episode(s) this month · Stop-hook + post-commit OK · 38 missed activation(s) — see /brain-retro | +| C6 Chain map sync | ✅ | [chain-map-checker] OK — 16 chains in sync | ## Метрики (информационные, не алерты) -- Observer evidence: 88 episodes this month, 0 observer_error markers, 16 PII matches before filter +- Observer evidence: 105 episodes this month, 0 observer_error markers, 28 PII matches before filter - Legacy v1 episodes (not in factor analysis): 5 - Last /brain-retro: 4 day(s) ago -- Использование узлов: см. `/brain-retro` (раз в спринт). missed_activations: 31. **Неиспользованные узлы — не алерт, если профильной задачи не было** (Pravila §16.4 v1.36; capability-readiness; см. memory `feedback_brain_unused_tools_not_problem` — outside-repo memory store). +- Использование узлов: см. `/brain-retro` (раз в спринт). missed_activations: 38. **Неиспользованные узлы — не алерт, если профильной задачи не было** (Pravila §16.4 v1.36; capability-readiness; см. memory `feedback_brain_unused_tools_not_problem` — outside-repo memory store). ## Алерт-индикаторы diff --git a/lefthook.yml b/lefthook.yml index d08608a6..29830602 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -38,8 +38,11 @@ pre-commit: - ".claude/skills/ccpm/**" - ".claude/skills/data-scientist/**" - ".claude/skills/marketingskills/**" - run: npx markdownlint-cli2 --fix {staged_files} - stage_fixed: true + run: node node_modules/markdownlint-cli2/markdownlint-cli2-bin.mjs --fix {staged_files} + # stage_fixed убран 23.05.2026: на этой Windows-машине он триггерит + # `git stash create` (прятать unstaged), который конфликтует за .git/index.lock + # с родительским git commit → коммит виснет. Авто-fix всё равно правит файлы + # в рабочей копии, но не авто-restage — git add вручную после правок. fail_text: | markdownlint нашёл проблемы, которые не исправляются автоматически. Запусти `npm run lint:md:fix` или поправь руками. @@ -55,7 +58,7 @@ pre-commit: - ".claude/skills/ccpm/**" - ".claude/skills/data-scientist/**" - ".claude/skills/marketingskills/**" - run: npx cspell --no-progress --no-summary --no-gitignore {staged_files} + run: node node_modules/cspell/bin.mjs --no-progress --no-summary --no-gitignore {staged_files} fail_text: | cspell нашёл слова, отсутствующие в словаре. Если это валидное слово проекта — добавь в cspell-words.txt. @@ -64,7 +67,7 @@ pre-commit: # 4. Stylelint — стиль CSS в HTML-прототипах - name: stylelint glob: "*.html" - run: npx stylelint {staged_files} + run: node node_modules/stylelint/bin/stylelint.mjs {staged_files} fail_text: | Stylelint нашёл проблемы в CSS прототипа. Запусти `npx stylelint --fix ` где возможно. @@ -74,7 +77,8 @@ pre-commit: glob: "app/**/*.php" root: "app/" run: php vendor/bin/pint {staged_files} - stage_fixed: true + # stage_fixed убран 23.05.2026 — см. комментарий у markdownlint-джоба + # (git stash create ↔ index.lock конфликт на Windows). fail_text: | Pint не смог отформатировать какие-то файлы (синтаксическая ошибка PHP?). Запусти `cd app && composer pint` локально, посмотри вывод. diff --git a/tools/git-hooks/pre-commit.sh b/tools/git-hooks/pre-commit.sh new file mode 100644 index 00000000..9b697c39 --- /dev/null +++ b/tools/git-hooks/pre-commit.sh @@ -0,0 +1,85 @@ +#!/bin/sh +# ============================================================================= +# tools/git-hooks/pre-commit.sh — нативная замена lefthook-движка +# ============================================================================= +# Зачем: lefthook 2.1.x виснет при `git commit` на этой Windows-машine +# (путь с кириллицей + пробелом: "C:\моя\проекты\портал crm\Документация"). +# Сами проверки отрабатывают и проходят, но движок lefthook не завершается +# и плодит node-зомби (см. CHANGELOG / memory feedback_environment q.107+). +# Заменено 23.05.2026 по решению заказчика «свой простой скрипт». +# +# Этот скрипт зеркалит pre-commit джобы lefthook.yml, но: +# - вызывает инструменты напрямую (node , не npx → нет зомби-обёрток) +# - НЕ модифицирует index (нет git add / git stash / --fix) → нет конфликта +# за .git/index.lock с родительским git commit (корень зависаний lefthook) +# - имеет явный exit-код, ничего не висит +# +# Источник истины КОНФИГУРАЦИИ проверок — lefthook.yml (для CI/Linux, где +# lefthook работает штатно). Этот скрипт — локальная Windows-реализация. +# +# Bypass (как у lefthook): LEFTHOOK=0 git commit ... +# ============================================================================= + +[ "$LEFTHOOK" = "0" ] && exit 0 + +ROOT="$(git rev-parse --show-toplevel)" +cd "$ROOT" || exit 1 + +STAGED=$(git diff --cached --name-only --diff-filter=ACM) +[ -z "$STAGED" ] && exit 0 + +FAIL=0 +note() { printf '\n[pre-commit] %s\n' "$1"; } + +# 1. gitleaks — секреты / ПДн / токены в staged (§5.2). Нативный exe. +note "gitleaks (secrets)" +./bin/gitleaks.exe protect --staged --config .gitleaks.toml --no-banner || { note "gitleaks FAILED"; FAIL=1; } + +# 2+3. markdownlint + cspell на staged .md (исключая вендоренные скилы). +# Без --fix: pre-commit не модифицирует файлы. Авто-fix — `npm run lint:md:fix`. +MD=$(printf '%s\n' "$STAGED" | grep -E '\.md$' | grep -vE '^\.claude/skills/(mermaid|ccpm|data-scientist|marketingskills)/') +if [ -n "$MD" ]; then + note "markdownlint" + node node_modules/markdownlint-cli2/markdownlint-cli2-bin.mjs $MD || { note "markdownlint FAILED — запусти 'npm run lint:md:fix'"; FAIL=1; } + note "cspell" + node node_modules/cspell/bin.mjs --no-progress --no-summary --no-gitignore $MD || { note "cspell FAILED — добавь слово в cspell-words.txt или поправь"; FAIL=1; } +fi + +# 4. Stylelint на staged .html (CSS в прототипах). +HTML=$(printf '%s\n' "$STAGED" | grep -E '\.html$') +if [ -n "$HTML" ]; then + note "stylelint" + node node_modules/stylelint/bin/stylelint.mjs $HTML || { note "stylelint FAILED"; FAIL=1; } +fi + +# 5+6. Pint (--test, без авто-fix) + Larastan на staged app/**/*.php. +PHP=$(printf '%s\n' "$STAGED" | grep -E '^app/.*\.php$') +if [ -n "$PHP" ]; then + PHP_REL=$(printf '%s\n' "$PHP" | sed 's#^app/##') + note "pint --test" + ( cd app && php vendor/bin/pint --test $PHP_REL ) || { note "pint FAILED — запусти 'cd app && composer pint'"; FAIL=1; } + note "larastan" + ( cd app && php vendor/bin/phpstan analyse --no-progress --memory-limit=512M ) || { note "larastan FAILED — 'cd app && composer stan'"; FAIL=1; } +fi + +# 7. squawk на staged *.sql (миграции PostgreSQL). +SQL=$(printf '%s\n' "$STAGED" | grep -E '\.sql$') +if [ -n "$SQL" ]; then + note "squawk" + ./bin/squawk.exe $SQL || { note "squawk FAILED"; FAIL=1; } +fi + +# 8. ESLint на staged app/resources/js/**/*.{ts,vue}. +VUE=$(printf '%s\n' "$STAGED" | grep -E '^app/resources/js/.*\.(ts|vue)$') +if [ -n "$VUE" ]; then + VUE_REL=$(printf '%s\n' "$VUE" | sed 's#^app/##') + note "eslint" + ( cd app && node node_modules/eslint/bin/eslint.js $VUE_REL ) || { note "eslint FAILED"; FAIL=1; } +fi + +if [ "$FAIL" = "1" ]; then + note "ОТКЛОНЕНО — проверки не пройдены (см. выше). Обход: LEFTHOOK=0 git commit ..." + exit 1 +fi +note "OK — все проверки пройдены" +exit 0