KeiSeiKit-1.0/skills/dev-guard/SKILL.md
Parfii-bot f3f5f79760 feat(frontend-loop): kei-db-contract primitive + frontend-validator agent + auto-dev-guard hook
Frontend continuous-quality loop landed. Three composable cubes:

Wave 1 — kei-db-contract primitive (~870 LOC, 7 cubes per Constructor Pattern):
- Diffs SQL CREATE TABLE migrations against TypeScript type/interface declarations
- 4 drift modes: ORPHAN-SQL, ORPHAN-TS, TYPE-MISMATCH, NULL-MISMATCH
- Reuses sqlparser-rs (Apache 2.0) + regex + walkdir + serde_json + clap
- CLI: kei-db-contract <project-root> [--output json|text] [--strict]
- 5/5 integration tests pass (cargo check + cargo test green)
- Smoke-tested on keisei-marketplace: drift_count=266 across 30 tables
  (expected — marketplace uses raw better-sqlite3 without explicit row types)

Wave 2 — frontend-validator agent + dev-guard skill extension:
- New _manifests/frontend-validator.toml (substrate_role: edit-local, tools: Bash+Read+Glob+Grep)
- Agent runs: stack detect → tsc --noEmit → eslint → kei-db-contract → playwright (optional)
- Severity rules: TYPE_CHECK FAIL = block, DB_CONTRACT drift > 0 = block, lint = advisory
- skills/dev-guard/SKILL.md extended: 4th agent triggered on .tsx/.ts/.dart edits or DB-layer touches
- adaptive-depth table extended with frontend + DB-layer rows

Wave 3 — auto-dev-guard.sh hook (PostToolUse:Edit|Write):
- Trivial-edit gate: skip if delta < 30 LOC (avoid spawn fatigue)
- File-pattern match: *.tsx|*.ts|*.svelte|*.vue|*.dart OR migrations/*.sql OR src/db/** OR src/types/** OR prisma/schema.prisma OR drizzle.config.*
- Auto-runs kei-db-contract for DB-layer edits if binary on PATH
- Stderr advisory only (exit 0 always — never blocks)
- Bypass: KEI_DISABLED_HOOKS or KEI_HOOK_PROFILE in {advisory-off, minimal, off}
- Smoke-tested with synthetic Edit input (39 LOC delta on .tsx → emits advisory)
- Registered in hooks/hooks.json under PostToolUse:Write|Edit chain

Reusability map (Constructor Pattern compose):
  shared cubes: detect-stack, tsc, eslint, kei-db-contract, kei-visual-snapshot (deferred)
  orchestrators: /dev-start (pre), /dev-guard (during, NOW with frontend-validator),
                 /dev-ship (final), /site-create (init)

Verify-before-commit (RULE 0.13):
- cargo check -p kei-db-contract: PASS
- cargo test -p kei-db-contract: 5 passed
- jq . hooks/hooks.json: valid
- bash hooks/auto-dev-guard.sh < synthetic-input: works (frontend-relevant edit detected, exit 0)

=== STATUS-TRUTH MARKER ===
shipped: functional
stubs: 0
cargo-check: PASS
cargo-test: PASS (5 tests, 0 failures)
behaviour-verified: yes
follow-up-required:
  - kei-visual-snapshot primitive (Playwright wrap) — Wave 4, deferred
  - /dev-start frontend-contract-designer agent + /dev-ship frontend-final-gate — Wave 5, after Wave 1-3 obkatka
  - install.sh wiring for kei-db-contract binary
  - hermes-style emit-on-drift advisory mode

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 15:34:39 +08:00

8.4 KiB
Raw Blame History

name description
dev-guard Continuous parallel quality gate during development — 3 backend agents (security/perf/structure) plus optional 4th frontend-validator agent (TS types ↔ DB schema drift, lint, type-check, visual diff) check every significant code change in real-time. Run after writing code, before committing.

/dev-guard — Continuous Development Guard

wave-audit находит проблемы ПОСЛЕ. dev-guard ловит их ПОКА пишешь код. 3 backend агента + опциональный frontend-validator проверяют каждое значимое изменение.

Команды

  • /dev-guard → проверить текущие изменения (git diff)
  • /dev-guard [file] → проверить конкретный файл
  • /dev-guard commit → guard + auto-commit если clean

Когда запускать

  • После написания нового файла / модуля
  • После изменения auth / payments / data layer
  • Перед каждым commit (или вместо — /dev-guard commit)
  • После рефакторинга 3+ файлов

Phase 0 — Scope Detection (lead)

  1. git diff --name-only → список изменённых файлов
  2. Для каждого файла → классифицировать:
    • HOT: auth, crypto, payments, data layer, resolvers/handlers → все 3 агента
    • WARM: services, utils, config → 2 агента (security skip)
    • COLD: UI components, styles, docs → 1 агент (structure only)
  3. Собрать diff только для HOT/WARM файлов

Phase 1 — Parallel Guard (3 агента одним сообщением)

Agent: dg-security

Только для HOT файлов.

Проверь ТОЛЬКО изменённый код (diff ниже). Проект: [path], стек: [стек].

Diff:
[git diff output]

Checklist на КАЖДОЕ изменение:
- [ ] Новый endpoint/resolver? → есть auth middleware?
- [ ] Принимает input? → есть validation (Zod/joi/validator)?
- [ ] Работает с JWT? → verify(), НЕ decode()
- [ ] Работает с DB? → параметризованные запросы? нет string concat?
- [ ] Работает с файлами? → path traversal check?
- [ ] Новый secret/key? → НЕ в коде, в env?
- [ ] Error response? → не leakает stack trace / internal details?
- [ ] Rate limiting? → есть для auth endpoints?

Формат finding:
- CODE_QUOTE (из diff, 3-7 строк)
- PROBLEM + IMPACT
- FIX (конкретное изменение)
- VERIFY_CMD

Если всё чисто → `SECURITY: CLEAN (N checks passed)`.

Agent: dg-performance

Для HOT и WARM файлов.

Проверь ТОЛЬКО изменённый код (diff ниже). Проект: [path], стек: [стек].

Diff:
[git diff output]

Checklist:
- [ ] DB/API call внутри цикла или map? → N+1 alert
- [ ] Данные объединяются по индексу массива? → join by key instead
- [ ] JSON.parse на cached data? → Date/типы теряются
- [ ] new Service() на каждый request? → singleton/DI
- [ ] Нет limit на pagination/query? → max cap обязателен
- [ ] Sync I/O на async path? → await/async
- [ ] Массив растёт без bounds? → max size
- [ ] Тяжёлая операция без cache? → добавить
- [ ] Resolver fetches data it already has? → pass down, don't re-fetch

Если всё чисто → `PERFORMANCE: CLEAN (N checks passed)`.

Agent: dg-structure

Для ВСЕХ файлов (HOT/WARM/COLD).

Проверь ТОЛЬКО изменённый код (diff ниже). Проект: [path], стек: [стек].

Diff:
[git diff output]

Constructor Pattern Checks:
- [ ] Файл после изменения >200 LOC? → `wc -l [file]`
- [ ] Новая/изменённая функция >30 LOC? → split
- [ ] Новый тип/interface? → уже есть похожий? (grep)
- [ ] Import нового пакета? → уже есть аналог в deps?
- [ ] Дублирование кода? → extract shared util
- [ ] Стиль consistent с остальным проектом?

Для каждого файла ОБЯЗАТЕЛЕН `wc -l` через VERIFY_CMD.
Если всё чисто → `STRUCTURE: CLEAN (N checks passed, all files <200 LOC)`.

Agent: frontend-validator (опциональный 4-й)

Запускается если в diff есть *.tsx | *.ts | *.svelte | *.vue | *.dart ИЛИ затронут DB-layer (migrations/*.sql, src/db/**, src/types/**, prisma/schema.prisma, drizzle.config.*).

Спавнить с subagent_type: "frontend-validator". Prompt:

Frontend continuous-validation pass. Project root: [path], stack: [Next.js / Vite / Flutter / ...].
Changed files: [список из git diff --name-only].

Run in order, emit per-section status:

1. Stack detect (package.json / pubspec.yaml / next.config.*).
2. Type-check (npx tsc --noEmit OR dart analyze). List file:line errors.
3. Lint (npx eslint . --ext .ts,.tsx OR dart analyze). List warnings.
4. DB-contract drift — invoke `kei-db-contract <root> --output json` if binary in PATH AND project
   has migrations/ OR src/db/. Parse drift_count + per-table fields.
5. Visual regression — only if playwright.config.* exists. Skip otherwise.
6. Verdict block: each check status (PASS / WARN / FAIL) + brief evidence.

Output format:
- TYPE_CHECK: <status> [<count> errors]
- LINT: <status> [<count> warnings]
- DB_CONTRACT: <status> [<drift_count> tables drifted]
- VISUAL_DIFF: <status>
- VERDICT: COMMIT_OK / FIX_FIRST / REVIEW_NEEDED

Read-only on the codebase; do NOT autofix. Hand off TS errors to code-implementer-typescript.

Severity rules:

  • TYPE_CHECK FAIL → block commit (hard).
  • DB_CONTRACT drift_count > 0 → block commit, suggest schema-or-types update.
  • LINT warnings → advisory.
  • VISUAL_DIFF mismatch → review needed (user approves new baseline OR fixes regression).

Phase 2 — Quick Synthesis (lead, НЕ агент)

Lead объединяет результаты за 30 секунд:

=== DEV GUARD REPORT ===
Files checked: N (HOT: N, WARM: N, COLD: N)

Security:    CLEAN / N findings
Performance: CLEAN / N findings
Structure:   CLEAN / N findings

[findings if any — grouped by file]

Verdict: COMMIT / FIX FIRST / REVIEW NEEDED

Verdict logic:

  • COMMIT: все CLEAN или только LOW findings → можно коммитить
  • FIX FIRST: есть HIGH/CRITICAL → показать findings, ждать фикс
  • REVIEW NEEDED: спорные findings → показать пользователю для решения

При /dev-guard commit:

  • Если COMMIT → автоматически git add [changed files] && git commit
  • Если FIX FIRST → показать findings, НЕ коммитить
  • Commit message генерируется из diff (semantic: feat/fix/refactor)

Adaptive Depth

Не гонять 3 агента на каждый CSS-файл.

Изменение Агенты Время
auth/crypto/payments security + performance + structure ~2 min
services/utils/config performance + structure ~1 min
UI/styles/docs structure only ~30 sec
1 файл, <20 строк lead проверяет сам (без агентов) ~10 sec
frontend (.tsx/.ts/.dart) + frontend-validator +30-60 sec
DB layer (migrations/, src/db/, schema.prisma) + frontend-validator (DB contract) +20 sec

Integration с git workflow

Pre-commit (рекомендуется):

# В .claude/hooks/ или git hooks
# Запускать /dev-guard перед каждым commit

Post-change (автоматически):

При работе в сессии Claude, после каждого блока изменений (3+ файлов) → lead предлагает /dev-guard.


Safety

  • НЕ блокировать commit на LOW findings
  • НЕ автокоммитить если есть HIGH+
  • НЕ запускать 3 агента на тривиальные изменения
  • Findings без CODE_QUOTE → [UNVERIFIED], понижение severity