@su-record/vibe 2.16.3 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +15 -0
- package/CLAUDE.md +8 -8
- package/README.en.md +46 -29
- package/README.md +41 -24
- package/agents/acceptance-tester.md +56 -0
- package/agents/architect.md +25 -67
- package/agents/build-error-resolver.md +28 -97
- package/agents/code-reviewer.md +89 -0
- package/agents/diagrammer.md +34 -165
- package/agents/documenter.md +43 -0
- package/agents/e2e-tester.md +46 -277
- package/agents/event/event-ops.md +54 -77
- package/agents/event/event-planner.md +63 -0
- package/agents/figma/figma-engineer.md +76 -0
- package/agents/implementer.md +26 -41
- package/agents/security-reviewer.md +56 -0
- package/agents/tester.md +37 -33
- package/agents/ui/design-reviewer.md +62 -0
- package/agents/ui/design-system-gen.md +63 -0
- package/dist/__tests__/agent-model-sync.test.d.ts +2 -0
- package/dist/__tests__/agent-model-sync.test.d.ts.map +1 -0
- package/dist/__tests__/agent-model-sync.test.js +71 -0
- package/dist/__tests__/agent-model-sync.test.js.map +1 -0
- package/dist/cli/auth.d.ts.map +1 -1
- package/dist/cli/auth.js +8 -1
- package/dist/cli/auth.js.map +1 -1
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +1 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/info.d.ts.map +1 -1
- package/dist/cli/commands/info.js +2 -0
- package/dist/cli/commands/info.js.map +1 -1
- package/dist/cli/commands/llm.d.ts +11 -0
- package/dist/cli/commands/llm.d.ts.map +1 -0
- package/dist/cli/commands/llm.js +62 -0
- package/dist/cli/commands/llm.js.map +1 -0
- package/dist/cli/commands/remove.d.ts.map +1 -1
- package/dist/cli/commands/remove.js +8 -10
- package/dist/cli/commands/remove.js.map +1 -1
- package/dist/cli/commands/setup.d.ts.map +1 -1
- package/dist/cli/commands/setup.js +35 -1
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/index.d.ts +0 -4
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +59 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/llm/config.d.ts.map +1 -1
- package/dist/cli/llm/config.js +7 -0
- package/dist/cli/llm/config.js.map +1 -1
- package/dist/cli/llm/index.d.ts +1 -0
- package/dist/cli/llm/index.d.ts.map +1 -1
- package/dist/cli/llm/index.js +1 -0
- package/dist/cli/llm/index.js.map +1 -1
- package/dist/cli/llm/model-refresh.d.ts +29 -0
- package/dist/cli/llm/model-refresh.d.ts.map +1 -0
- package/dist/cli/llm/model-refresh.js +139 -0
- package/dist/cli/llm/model-refresh.js.map +1 -0
- package/dist/cli/llm/zai-commands.d.ts +15 -0
- package/dist/cli/llm/zai-commands.d.ts.map +1 -0
- package/dist/cli/llm/zai-commands.js +64 -0
- package/dist/cli/llm/zai-commands.js.map +1 -0
- package/dist/cli/postinstall/claude-agents.d.ts.map +1 -1
- package/dist/cli/postinstall/claude-agents.js +16 -77
- package/dist/cli/postinstall/claude-agents.js.map +1 -1
- package/dist/cli/postinstall/constants.d.ts.map +1 -1
- package/dist/cli/postinstall/constants.js +81 -296
- package/dist/cli/postinstall/constants.js.map +1 -1
- package/dist/cli/postinstall/cursor-agents.d.ts +5 -0
- package/dist/cli/postinstall/cursor-agents.d.ts.map +1 -1
- package/dist/cli/postinstall/cursor-agents.js +26 -68
- package/dist/cli/postinstall/cursor-agents.js.map +1 -1
- package/dist/cli/postinstall/cursor-skills.d.ts.map +1 -1
- package/dist/cli/postinstall/cursor-skills.js +26 -30
- package/dist/cli/postinstall/cursor-skills.js.map +1 -1
- package/dist/cli/postinstall/main.d.ts.map +1 -1
- package/dist/cli/postinstall/main.js +0 -2
- package/dist/cli/postinstall/main.js.map +1 -1
- package/dist/cli/setup/Provisioner.d.ts.map +1 -1
- package/dist/cli/setup/Provisioner.js +19 -21
- package/dist/cli/setup/Provisioner.js.map +1 -1
- package/dist/cli/types.d.ts +15 -0
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/utils.d.ts +4 -1
- package/dist/cli/utils.d.ts.map +1 -1
- package/dist/cli/utils.js +4 -1
- package/dist/cli/utils.js.map +1 -1
- package/dist/infra/lib/FrameworkDetector.js +4 -4
- package/dist/infra/lib/FrameworkDetector.js.map +1 -1
- package/dist/infra/lib/OrchestrateWorkflow.js +2 -2
- package/dist/infra/lib/OrchestrateWorkflow.js.map +1 -1
- package/dist/infra/lib/browser/launch.js +1 -1
- package/dist/infra/lib/browser/launch.js.map +1 -1
- package/dist/infra/lib/browser/types.d.ts +1 -1
- package/dist/infra/lib/browser/types.js +1 -1
- package/dist/infra/lib/config/GlobalConfigManager.d.ts +2 -0
- package/dist/infra/lib/config/GlobalConfigManager.d.ts.map +1 -1
- package/dist/infra/lib/config/GlobalConfigManager.js +6 -0
- package/dist/infra/lib/config/GlobalConfigManager.js.map +1 -1
- package/dist/infra/lib/constants.d.ts +1 -1
- package/dist/infra/lib/constants.d.ts.map +1 -1
- package/dist/infra/lib/constants.js +4 -5
- package/dist/infra/lib/constants.js.map +1 -1
- package/dist/infra/lib/evolution/__tests__/integration.test.js +7 -7
- package/dist/infra/lib/evolution/__tests__/integration.test.js.map +1 -1
- package/dist/infra/lib/llm-availability.d.ts +4 -0
- package/dist/infra/lib/llm-availability.d.ts.map +1 -1
- package/dist/infra/lib/llm-availability.js +9 -1
- package/dist/infra/lib/llm-availability.js.map +1 -1
- package/dist/infra/lib/memory/index.d.ts +0 -2
- package/dist/infra/lib/memory/index.d.ts.map +1 -1
- package/dist/infra/lib/memory/index.js +0 -2
- package/dist/infra/lib/memory/index.js.map +1 -1
- package/dist/infra/lib/telemetry/SkillTelemetry.test.js +1 -1
- package/dist/infra/lib/telemetry/SkillTelemetry.test.js.map +1 -1
- package/dist/infra/lib/zai/client.d.ts +30 -0
- package/dist/infra/lib/zai/client.d.ts.map +1 -0
- package/dist/infra/lib/zai/client.js +124 -0
- package/dist/infra/lib/zai/client.js.map +1 -0
- package/dist/infra/lib/zai/index.d.ts +11 -0
- package/dist/infra/lib/zai/index.d.ts.map +1 -0
- package/dist/infra/lib/zai/index.js +10 -0
- package/dist/infra/lib/zai/index.js.map +1 -0
- package/dist/infra/lib/zai/orchestration.d.ts +15 -0
- package/dist/infra/lib/zai/orchestration.d.ts.map +1 -0
- package/dist/infra/lib/zai/orchestration.js +54 -0
- package/dist/infra/lib/zai/orchestration.js.map +1 -0
- package/dist/infra/lib/zai/types.d.ts +40 -0
- package/dist/infra/lib/zai/types.d.ts.map +1 -0
- package/dist/infra/lib/zai/types.js +5 -0
- package/dist/infra/lib/zai/types.js.map +1 -0
- package/dist/infra/orchestrator/SmartRouter.d.ts.map +1 -1
- package/dist/infra/orchestrator/SmartRouter.js +16 -34
- package/dist/infra/orchestrator/SmartRouter.js.map +1 -1
- package/dist/infra/orchestrator/index.d.ts +1 -0
- package/dist/infra/orchestrator/index.d.ts.map +1 -1
- package/dist/infra/orchestrator/index.js +11 -9
- package/dist/infra/orchestrator/index.js.map +1 -1
- package/dist/infra/orchestrator/types.d.ts +32 -9
- package/dist/infra/orchestrator/types.d.ts.map +1 -1
- package/dist/infra/orchestrator/types.js +68 -37
- package/dist/infra/orchestrator/types.js.map +1 -1
- package/dist/infra/orchestrator/types.test.d.ts +2 -0
- package/dist/infra/orchestrator/types.test.d.ts.map +1 -0
- package/dist/infra/orchestrator/types.test.js +57 -0
- package/dist/infra/orchestrator/types.test.js.map +1 -0
- package/dist/tools/index.d.ts +0 -4
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +0 -4
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/memory/autoSaveContext.d.ts +0 -1
- package/dist/tools/memory/autoSaveContext.d.ts.map +1 -1
- package/dist/tools/memory/autoSaveContext.js +13 -27
- package/dist/tools/memory/autoSaveContext.js.map +1 -1
- package/hooks/scripts/__tests__/code-check-detectors.test.js +2 -2
- package/hooks/scripts/__tests__/run-ledger.test.js +1 -1
- package/hooks/scripts/__tests__/scope-from-spec.test.js +12 -12
- package/hooks/scripts/__tests__/step-counter.test.js +1 -1
- package/hooks/scripts/code-check.js +16 -203
- package/hooks/scripts/context-save.js +0 -11
- package/hooks/scripts/lib/scope-from-spec.js +9 -6
- package/hooks/scripts/llm-orchestrate.js +49 -0
- package/hooks/scripts/post-edit-dispatcher.js +1 -1
- package/hooks/scripts/prompt-dispatcher.js +7 -18
- package/hooks/scripts/session-start.js +25 -35
- package/package.json +4 -4
- package/skills/agents-md/SKILL.md +62 -15
- package/skills/arch-guard/SKILL.md +1 -1
- package/skills/brand-assets/SKILL.md +2 -2
- package/skills/capability-loop/SKILL.md +1 -1
- package/skills/chub-usage/SKILL.md +1 -1
- package/skills/commerce-patterns/SKILL.md +2 -2
- package/skills/commit-push-pr/SKILL.md +0 -1
- package/skills/context7-usage/SKILL.md +1 -1
- package/skills/create-prd/agents/edge-case-finder.md +4 -4
- package/skills/create-prd/agents/prioritizer.md +4 -4
- package/skills/create-prd/agents/requirements-writer.md +3 -3
- package/skills/create-prd/agents/researcher.md +3 -3
- package/skills/create-prd/agents/reviewer.md +3 -3
- package/skills/create-prd/orchestrator.md +2 -0
- package/skills/design-refine/SKILL.md +140 -0
- package/skills/{design-polish → design-refine}/templates/polish-report.md +1 -1
- package/skills/{design-normalize → design-refine}/templates/token-audit.md +3 -3
- package/skills/design-review/SKILL.md +143 -0
- package/skills/{design-audit → design-review}/agents/a11y-auditor.md +1 -1
- package/skills/{design-audit → design-review}/agents/performance-auditor.md +1 -1
- package/skills/{design-audit → design-review}/agents/responsive-auditor.md +1 -1
- package/skills/{design-audit → design-review}/agents/slop-detector.md +1 -1
- package/skills/{design-audit → design-review}/frameworks/core-web-vitals.md +1 -1
- package/skills/{design-audit → design-review}/frameworks/wcag-checklist.md +1 -1
- package/skills/{design-audit → design-review}/orchestrator.md +5 -3
- package/skills/{design-critique → design-review}/templates/critique-report.md +3 -3
- package/skills/{design-audit → design-review}/templates/report.md +3 -3
- package/skills/design-teach/SKILL.md +11 -11
- package/skills/docs/SKILL.md +14 -16
- package/skills/e2e-commerce/SKILL.md +1 -1
- package/skills/event-comms/SKILL.md +1 -1
- package/skills/event-ops/SKILL.md +2 -2
- package/skills/event-planning/SKILL.md +1 -1
- package/skills/exec-plan/SKILL.md +2 -2
- package/skills/exec-plan/orchestrator.md +2 -0
- package/skills/figma/SKILL.md +240 -148
- package/skills/figma/rubrics/css-mapping.md +125 -0
- package/skills/git-worktree/SKILL.md +1 -1
- package/skills/handoff/SKILL.md +1 -1
- package/skills/parallel-research/SKILL.md +14 -28
- package/skills/parallel-research/orchestrator.md +2 -0
- package/skills/priority-todos/SKILL.md +1 -1
- package/skills/regress/SKILL.md +11 -0
- package/skills/restraint/SKILL.md +72 -0
- package/skills/seo-checklist/SKILL.md +2 -2
- package/skills/spec/SKILL.md +65 -836
- package/skills/test/SKILL.md +3 -3
- package/skills/tool-fallback/SKILL.md +2 -2
- package/skills/vercel-react-best-practices/SKILL.md +1 -1
- package/skills/vibe/SKILL.md +20 -35
- package/skills/vibe.analyze/SKILL.md +7 -9
- package/skills/vibe.docs/SKILL.md +1 -1
- package/skills/vibe.event/SKILL.md +27 -27
- package/skills/vibe.figma/SKILL.md +14 -18
- package/skills/vibe.harness/SKILL.md +5 -5
- package/skills/vibe.llm/SKILL.md +50 -0
- package/skills/vibe.reason/SKILL.md +0 -2
- package/skills/vibe.review/SKILL.md +45 -49
- package/skills/vibe.run/SKILL.md +2 -5
- package/skills/vibe.run/references/parallel-agents.md +33 -98
- package/skills/vibe.spec/SKILL.md +38 -535
- package/skills/vibe.utils/SKILL.md +3 -3
- package/skills/vibe.verify/SKILL.md +70 -542
- package/skills/video-production/SKILL.md +1 -1
- package/vibe/rules/orchestrator-contract.md +57 -0
- package/vibe/rules/quality/performance.md +1 -1
- package/vibe/templates/claudemd-template.md +1 -1
- package/vibe/templates/spec-template.md +35 -185
- package/agents/architect-low.md +0 -41
- package/agents/architect-medium.md +0 -59
- package/agents/compounder.md +0 -261
- package/agents/docs/api-documenter.md +0 -99
- package/agents/docs/changelog-writer.md +0 -93
- package/agents/event/event-comms.md +0 -78
- package/agents/event/event-content.md +0 -68
- package/agents/event/event-image.md +0 -95
- package/agents/event/event-scheduler.md +0 -69
- package/agents/event/event-speaker.md +0 -86
- package/agents/explorer-low.md +0 -42
- package/agents/explorer-medium.md +0 -59
- package/agents/explorer.md +0 -48
- package/agents/figma/figma-analyst.md +0 -52
- package/agents/figma/figma-architect.md +0 -112
- package/agents/figma/figma-auditor.md +0 -82
- package/agents/figma/figma-builder.md +0 -100
- package/agents/implementer-low.md +0 -43
- package/agents/implementer-medium.md +0 -52
- package/agents/junior-mentor.md +0 -141
- package/agents/planning/requirements-analyst.md +0 -84
- package/agents/planning/ux-advisor.md +0 -83
- package/agents/qa/acceptance-tester.md +0 -86
- package/agents/qa/edge-case-finder.md +0 -93
- package/agents/qa/qa-coordinator.md +0 -131
- package/agents/refactor-cleaner.md +0 -143
- package/agents/research/best-practices.md +0 -199
- package/agents/research/codebase-patterns.md +0 -157
- package/agents/research/framework-docs.md +0 -188
- package/agents/research/security-advisory.md +0 -213
- package/agents/review/architecture-reviewer.md +0 -107
- package/agents/review/complexity-reviewer.md +0 -116
- package/agents/review/data-integrity-reviewer.md +0 -88
- package/agents/review/git-history-reviewer.md +0 -103
- package/agents/review/performance-reviewer.md +0 -86
- package/agents/review/python-reviewer.md +0 -150
- package/agents/review/rails-reviewer.md +0 -139
- package/agents/review/react-reviewer.md +0 -144
- package/agents/review/security-reviewer.md +0 -80
- package/agents/review/simplicity-reviewer.md +0 -140
- package/agents/review/test-coverage-reviewer.md +0 -116
- package/agents/review/typescript-reviewer.md +0 -127
- package/agents/searcher.md +0 -54
- package/agents/simplifier.md +0 -120
- package/agents/teams/debug-team.md +0 -70
- package/agents/teams/dev-team.md +0 -88
- package/agents/teams/docs-team.md +0 -80
- package/agents/teams/figma-team.md +0 -85
- package/agents/teams/fullstack-team.md +0 -83
- package/agents/teams/lite-team.md +0 -69
- package/agents/teams/migration-team.md +0 -78
- package/agents/teams/refactor-team.md +0 -94
- package/agents/teams/research-team.md +0 -86
- package/agents/teams/review-debate-team.md +0 -125
- package/agents/teams/security-team.md +0 -81
- package/agents/ui/ui-a11y-auditor.md +0 -93
- package/agents/ui/ui-antipattern-detector.md +0 -102
- package/agents/ui/ui-dataviz-advisor.md +0 -69
- package/agents/ui/ui-design-system-gen.md +0 -57
- package/agents/ui/ui-industry-analyzer.md +0 -49
- package/agents/ui/ui-layout-architect.md +0 -65
- package/agents/ui/ui-stack-implementer.md +0 -68
- package/agents/ui/ux-compliance-reviewer.md +0 -81
- package/agents/ui-previewer.md +0 -258
- package/hooks/scripts/__tests__/keyword-detector.test.js +0 -242
- package/hooks/scripts/keyword-detector.js +0 -226
- package/skills/characterization-test/SKILL.md +0 -209
- package/skills/characterization-test/agents/behavior-capturer.md +0 -50
- package/skills/characterization-test/agents/coverage-checker.md +0 -54
- package/skills/characterization-test/agents/reporter.md +0 -50
- package/skills/characterization-test/agents/test-writer.md +0 -49
- package/skills/characterization-test/rubrics/coverage-criteria.md +0 -53
- package/skills/characterization-test/templates/test-template.ts +0 -101
- package/skills/claude-md-guide/SKILL.md +0 -353
- package/skills/claude-md-guide/rubrics/anti-patterns.md +0 -88
- package/skills/design-audit/SKILL.md +0 -154
- package/skills/design-critique/SKILL.md +0 -140
- package/skills/design-distill/SKILL.md +0 -131
- package/skills/design-normalize/SKILL.md +0 -135
- package/skills/design-polish/SKILL.md +0 -132
- package/skills/figma-convert/SKILL.md +0 -236
- package/skills/figma-extract/SKILL.md +0 -242
- package/skills/interview/SKILL.md +0 -358
- package/skills/interview/checklists/api.md +0 -101
- package/skills/interview/checklists/feature.md +0 -88
- package/skills/interview/checklists/library.md +0 -95
- package/skills/interview/checklists/mobile.md +0 -89
- package/skills/interview/checklists/webapp.md +0 -97
- package/skills/interview/checklists/website.md +0 -99
- package/skills/plan/SKILL.md +0 -254
- package/skills/rob-pike/SKILL.md +0 -66
- package/skills/spec/references/askuser-examples.md +0 -57
- package/skills/spec/references/example-session.md +0 -87
- package/skills/spec/references/templates.md +0 -194
- package/skills/spec-review/SKILL.md +0 -725
- package/skills/systematic-debugging/SKILL.md +0 -142
- package/skills/techdebt/SKILL.md +0 -126
- package/skills/techdebt/agents/analyzer.md +0 -50
- package/skills/techdebt/agents/fixer.md +0 -41
- package/skills/techdebt/agents/reviewer.md +0 -47
- package/skills/techdebt/agents/scanner.md +0 -44
- package/skills/techdebt/orchestrator.md +0 -70
- package/skills/techdebt/rubrics/severity.md +0 -51
- package/skills/techdebt/scripts/scan.js +0 -90
- package/skills/techdebt/templates/report.md +0 -86
- package/skills/typescript-advanced-types/SKILL.md +0 -68
- package/skills/typescript-advanced-types/rubrics/type-patterns.md +0 -109
- package/skills/yagni-ladder/SKILL.md +0 -90
- /package/skills/{claude-md-guide → agents-md}/templates/claude-md.md +0 -0
- /package/skills/{design-polish → design-refine}/rubrics/polish-checklist.md +0 -0
- /package/skills/{design-normalize → design-refine}/rubrics/token-naming.md +0 -0
- /package/skills/{design-distill → design-refine}/templates/design-system.md +0 -0
- /package/skills/{design-audit → design-review}/agents/scorer.md +0 -0
- /package/skills/{design-audit → design-review}/rubrics/ai-slop-patterns.md +0 -0
- /package/skills/{design-audit → design-review}/rubrics/scoring.md +0 -0
- /package/skills/{design-critique → design-review}/rubrics/ux-heuristics.md +0 -0
- /package/skills/{figma-convert → figma}/rubrics/conversion-rules.md +0 -0
- /package/skills/{figma-extract → figma}/rubrics/image-rules.md +0 -0
- /package/skills/{figma-convert → figma}/templates/component.md +0 -0
|
@@ -7,608 +7,136 @@ user-invocable: true
|
|
|
7
7
|
|
|
8
8
|
# /vibe.verify
|
|
9
9
|
|
|
10
|
-
**
|
|
11
|
-
|
|
12
|
-
> All scenarios passed = Quality assured
|
|
10
|
+
SPEC-driven verification. Check the implementation against the SPEC's **Done criteria** and Feature scenarios, record the result to the **run ledger** (`recordVerify`), and auto-register regressions on failure. The JUDGE gate is code-enforced by the ledger — a verification never counts as passed by self-report.
|
|
13
11
|
|
|
14
12
|
## Usage
|
|
15
13
|
|
|
16
14
|
```
|
|
17
|
-
/vibe.verify "feature-name"
|
|
18
|
-
/vibe.verify --e2e "feature-name"
|
|
19
|
-
/vibe.verify --e2e --visual # Visual regression test
|
|
20
|
-
/vibe.verify --e2e --record # Video recording
|
|
15
|
+
/vibe.verify "feature-name" # SPEC-based verification
|
|
16
|
+
/vibe.verify --e2e "feature-name" # + E2E browser verification (agents/e2e-tester.md)
|
|
21
17
|
```
|
|
22
18
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
## Codex Plugin Integration
|
|
26
|
-
|
|
27
|
-
> **Codex 플러그인 감지**: 워크플로우 시작 시 아래 명령으로 자동 감지.
|
|
28
|
-
>
|
|
29
|
-
> ```bash
|
|
30
|
-
> CODEX_AVAILABLE=$(node "{{VIBE_PATH}}/hooks/scripts/codex-detect.js" 2>/dev/null || echo "unavailable")
|
|
31
|
-
> ```
|
|
32
|
-
>
|
|
33
|
-
> `available`이면 `/codex:review` (최종 리뷰 게이트) 자동 호출. `unavailable`이면 스킵.
|
|
34
|
-
|
|
35
|
-
## File Reading Policy (Mandatory)
|
|
19
|
+
## Scope
|
|
36
20
|
|
|
37
|
-
- **
|
|
38
|
-
-
|
|
39
|
-
- **Grep 사용 제한**: 파일 위치 탐색(어떤 파일에 있는지 찾기)에만 사용. 파일 내용 파악에는 반드시 Read 사용
|
|
40
|
-
- **시나리오 검증 시**: Given/When/Then 각 단계의 구현 코드를 Read로 전체 읽어 확인할 것. Grep 매칭만으로 "구현됨"이라 판단 금지
|
|
41
|
-
- **부분 읽기 금지**: Grep 결과의 주변 몇 줄만 보고 판단하지 말 것. 전체 맥락을 파악해야 정확한 검증 가능
|
|
42
|
-
|
|
43
|
-
## Core Principles
|
|
44
|
-
|
|
45
|
-
```
|
|
46
|
-
┌─────────────────────────────────────────────────────────────────┐
|
|
47
|
-
│ What non-developers need to know │
|
|
48
|
-
│ │
|
|
49
|
-
│ ✅ Scenarios: 4/4 passed │
|
|
50
|
-
│ 📈 Quality Score: 94/100 │
|
|
51
|
-
│ │
|
|
52
|
-
│ Just look at this. The system handles the rest. │
|
|
53
|
-
└─────────────────────────────────────────────────────────────────┘
|
|
54
|
-
```
|
|
21
|
+
- **Changed files only** — never full-project scan.
|
|
22
|
+
- Verification target = the SPEC's Done criteria + Given/When/Then scenarios. Read whatever is needed to judge each criterion accurately; choose your own reading strategy, but never mark a criterion passed without concrete evidence (test exit code, build result, or a verified code location).
|
|
55
23
|
|
|
56
24
|
## Process
|
|
57
25
|
|
|
58
|
-
### 1. Load Feature
|
|
59
|
-
|
|
60
|
-
**Search order (check BOTH file AND folder):**
|
|
61
|
-
|
|
62
|
-
```
|
|
63
|
-
Step 1: Check if SPLIT structure exists (folder)
|
|
64
|
-
📁 .vibe/features/{feature-name}/ → Folder with _index.feature + phase files
|
|
65
|
-
📁 .vibe/specs/{feature-name}/ → Folder with _index.md + phase files
|
|
66
|
-
|
|
67
|
-
Step 2: If no folder, check single file
|
|
68
|
-
📄 .vibe/features/{feature-name}.feature → Single Feature file
|
|
69
|
-
📄 .vibe/specs/{feature-name}.md → Single SPEC file
|
|
70
|
-
|
|
71
|
-
Step 3: If neither exists → Error
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
**Split structure (folder) detected:**
|
|
75
|
-
```
|
|
76
|
-
📁 .vibe/features/{feature-name}/
|
|
77
|
-
├── _index.feature → Master Feature (read first for scenario overview)
|
|
78
|
-
├── phase-1-{name}.feature → Phase 1 scenarios
|
|
79
|
-
├── phase-2-{name}.feature → Phase 2 scenarios
|
|
80
|
-
└── ...
|
|
81
|
-
|
|
82
|
-
📁 .vibe/specs/{feature-name}/
|
|
83
|
-
├── _index.md → Master SPEC (read first for overview)
|
|
84
|
-
├── phase-1-{name}.md → Phase 1 SPEC
|
|
85
|
-
└── ...
|
|
86
|
-
|
|
87
|
-
→ Load _index files first, then verify phase by phase
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
**Single file detected:**
|
|
91
|
-
```
|
|
92
|
-
📄 .vibe/features/{feature-name}.feature → Scenario list
|
|
93
|
-
📄 .vibe/specs/{feature-name}.md → Verification criteria (reference)
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
**Error if NEITHER file NOR folder found:**
|
|
97
|
-
```
|
|
98
|
-
❌ Feature file not found. Searched:
|
|
99
|
-
- .vibe/features/{feature-name}/ (folder)
|
|
100
|
-
- .vibe/features/{feature-name}.feature (file)
|
|
101
|
-
|
|
102
|
-
Run /vibe.spec "{feature-name}" first.
|
|
103
|
-
```
|
|
26
|
+
### 1. Load SPEC / Feature
|
|
104
27
|
|
|
105
|
-
|
|
28
|
+
Search order (folder first, then single file):
|
|
106
29
|
|
|
107
|
-
|
|
30
|
+
1. `.vibe/features/{feature}/` (split structure: `_index.feature` + `phase-N-*.feature`) or `.vibe/specs/{feature}/` (`_index.md` + phase files) — read `_index` first, then verify phase by phase
|
|
31
|
+
2. `.vibe/features/{feature}.feature` or `.vibe/specs/{feature}.md`
|
|
32
|
+
3. Neither exists → error:
|
|
108
33
|
|
|
109
34
|
```
|
|
110
|
-
|
|
111
|
-
🔍 Scenario 1/4: Valid login success
|
|
112
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
113
|
-
|
|
114
|
-
Given: User is registered
|
|
115
|
-
→ Verify: User creation API exists? ✅
|
|
116
|
-
→ Verify: Test user data available? ✅
|
|
117
|
-
|
|
118
|
-
When: Login with valid email and password
|
|
119
|
-
→ Verify: POST /login endpoint exists? ✅
|
|
120
|
-
→ Verify: Request handling logic exists? ✅
|
|
121
|
-
|
|
122
|
-
Then: Login success + JWT token returned
|
|
123
|
-
→ Verify: Success response code 200? ✅
|
|
124
|
-
→ Verify: JWT token included? ✅
|
|
125
|
-
|
|
126
|
-
✅ Scenario 1 passed!
|
|
127
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
35
|
+
❌ Feature file not found. Run /vibe.spec "{feature}" first.
|
|
128
36
|
```
|
|
129
37
|
|
|
130
|
-
|
|
38
|
+
Extract the Done criteria / scenarios — this list is the verification checklist.
|
|
131
39
|
|
|
132
|
-
|
|
133
|
-
> Each method returns pass/fail summary (~200 tokens) instead of bloating main context.
|
|
40
|
+
### 2. Verify each Done criterion (parallel, deterministic)
|
|
134
41
|
|
|
135
|
-
|
|
136
|
-
|--------|-------|-----------|
|
|
137
|
-
| **Test Execution** | `Task(Bash, "npm test")` | When test files exist |
|
|
138
|
-
| **Build Verification** | `Task(Bash, "npm run build")` | When build script exists |
|
|
139
|
-
| **Type Check** | `Task(subagent_type="typescript-reviewer")` | TypeScript projects |
|
|
140
|
-
| **Code Analysis** | `Task(subagent_type="explorer-low")` | Always (verify logic against SPEC) |
|
|
141
|
-
| **E2E Closed Loop** | `Task(subagent_type="e2e-tester")` | `--e2e` flag or UI scenarios |
|
|
42
|
+
Run all applicable methods as parallel sub-agents in ONE message; each returns a short pass/fail summary instead of bloating main context:
|
|
142
43
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
44
|
+
| Method | How | Condition |
|
|
45
|
+
|---|---|---|
|
|
46
|
+
| Test execution | `npm test` (judge by exit code) | test files exist |
|
|
47
|
+
| Build | `npm run build` | build script exists |
|
|
48
|
+
| Type check | `tsc --noEmit` / code-reviewer agent (focus: idioms) | TypeScript project |
|
|
49
|
+
| Code analysis | verify Given/When/Then logic against changed files | always |
|
|
50
|
+
| E2E closed loop | e2e-tester agent drives browser scenarios | `--e2e` flag or UI scenarios |
|
|
149
51
|
|
|
150
|
-
|
|
52
|
+
**E2E closed loop** (`--e2e`): per scenario — navigate → interact → assert. On fail: collect evidence (screenshot, console errors) → root-cause → fix → re-run **only the failed scenario**. Prefer accessibility-tree tools over raw DOM dumps to keep the loop cheap.
|
|
151
53
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
```
|
|
155
|
-
구현 → E2E 검증 → 실패 → 수정 → 재검증 → ... → 통과
|
|
156
|
-
↑_____________________________________↓
|
|
157
|
-
Closed Loop: 사람 개입 없이 AI가 완주
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
**Browser Tool Priority (토큰 효율 순):**
|
|
161
|
-
|
|
162
|
-
| Priority | Tool | 토큰/액션 | 사용 조건 |
|
|
163
|
-
|----------|------|----------|----------|
|
|
164
|
-
| 1st | Agent Browser (접근성 트리) | ~6-20 chars | MCP 사용 가능 시 |
|
|
165
|
-
| 2nd | Playwright Test Runner | pass/fail만 | 테스트 코드 실행 |
|
|
166
|
-
| 3rd | Playwright MCP (DOM) | ~12,000+ chars | 최후 수단 |
|
|
167
|
-
|
|
168
|
-
**Closed Loop 실행 흐름:**
|
|
169
|
-
|
|
170
|
-
```
|
|
171
|
-
For each UI scenario in Feature file:
|
|
172
|
-
1. [Browser] Navigate → Find elements → Interact → Assert
|
|
173
|
-
2. PASS → Next scenario
|
|
174
|
-
3. FAIL → Collect evidence (screenshot, console errors)
|
|
175
|
-
→ Root cause analysis
|
|
176
|
-
→ Fix code (Read full file first, then edit)
|
|
177
|
-
→ Re-run ONLY failed scenario (loop until pass or stuck)
|
|
178
|
-
4. STUCK (same failure as previous iteration) → Ask user
|
|
179
|
-
(ultrawork 모드: 프롬프트 없이 TODO 기록 후 다음 scenario)
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
**핵심 원칙: 검증이 가벼워야 루프가 충분히 돈다.**
|
|
183
|
-
- 접근성 트리 기반: `button "Sign In"` = 15 chars
|
|
184
|
-
- DOM 기반: `div class="nav-wrapper mx-4 flex..."` = 200+ chars
|
|
185
|
-
- 전자를 사용해야 시나리오 50개도 한 세션에서 검증 가능
|
|
186
|
-
|
|
187
|
-
### 3.2 Visual Drift Detection (--from-design-md)
|
|
188
|
-
|
|
189
|
-
**활성 조건**: 프로젝트 루트에 `DESIGN.md` 존재 + UI 스택. 또는 `--from-design-md` 플래그 명시.
|
|
190
|
-
|
|
191
|
-
**동작**:
|
|
54
|
+
### 3. Visual drift (auto, only if `DESIGN.md` exists + UI stack)
|
|
192
55
|
|
|
193
56
|
```
|
|
194
57
|
Load skill `vibe.design` with: verify --files=<changed-ui-files>
|
|
195
58
|
```
|
|
196
59
|
|
|
197
|
-
|
|
198
|
-
변경 파일에서 토큰 밖 hex 하드코딩을 검출(`findHardcodedColors`) 한다.
|
|
199
|
-
|
|
200
|
-
**판정**:
|
|
201
|
-
- P1 drift (토큰 밖 hex) → `/vibe.verify` 실패
|
|
202
|
-
- DESIGN.md 부재 → 안내 후 silent skip (블록하지 않음)
|
|
203
|
-
- v1 범위: hex only. spacing / font 드리프트는 Phase 2+
|
|
204
|
-
|
|
205
|
-
**성능 목표**: <1s / 100 파일 (변경 파일만 스캔 — `/vibe.verify` 기존 정책 일치).
|
|
206
|
-
|
|
207
|
-
### 3.5 Step Count (MANDATORY before Quality Report)
|
|
208
|
-
|
|
209
|
-
Read `.vibe/metrics/current-run.json` to obtain the tool-call count from the preceding `/vibe.run` (and any follow-up work in this session). Then append a record to `.vibe/metrics/history.jsonl` and include the count in the Quality Report below.
|
|
210
|
-
|
|
211
|
-
```bash
|
|
212
|
-
# Read step count (ok if file missing — treat as 0)
|
|
213
|
-
STEPS=$(node -e "try{const d=JSON.parse(require('fs').readFileSync('.vibe/metrics/current-run.json','utf-8'));console.log(d.steps||0)}catch{console.log(0)}")
|
|
214
|
-
|
|
215
|
-
# Append history record
|
|
216
|
-
node -e "
|
|
217
|
-
const fs=require('fs'),path=require('path');
|
|
218
|
-
const dir='.vibe/metrics';
|
|
219
|
-
try{
|
|
220
|
-
const cur=JSON.parse(fs.readFileSync(path.join(dir,'current-run.json'),'utf-8'));
|
|
221
|
-
const rec={verifiedAt:new Date().toISOString(),feature:cur.feature,startedAt:cur.startedAt,steps:cur.steps||0};
|
|
222
|
-
fs.appendFileSync(path.join(dir,'history.jsonl'),JSON.stringify(rec)+'\n');
|
|
223
|
-
}catch{}"
|
|
224
|
-
|
|
225
|
-
# Phase 3 — Recipe extraction (post-task curation, best-effort silent)
|
|
226
|
-
# 휴리스틱 게이트 (total≥8 AND fails≥3) 통과 시만 LLM 호출.
|
|
227
|
-
# .vibe/recipes/<slug>.md 자동 생성 → 다음 세션의 session-start 가 prepend.
|
|
228
|
-
HOOKS_DIR="${VIBE_PATH:-$(npm root -g 2>/dev/null)/@su-record/vibe}/hooks/scripts"
|
|
229
|
-
[ -f "$HOOKS_DIR/recipe-extractor.js" ] && node "$HOOKS_DIR/recipe-extractor.js" 2>/dev/null || true
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
Record the value as `{step_count}` and include it in the report below.
|
|
233
|
-
|
|
234
|
-
### 4. Quality Report (Auto-generated)
|
|
235
|
-
|
|
236
|
-
```
|
|
237
|
-
┌─────────────────────────────────────────────────────────────────┐
|
|
238
|
-
│ 📊 VERIFICATION REPORT: login │
|
|
239
|
-
├─────────────────────────────────────────────────────────────────┤
|
|
240
|
-
│ │
|
|
241
|
-
│ ✅ Scenarios: 4/4 passed (100%) │
|
|
242
|
-
│ │
|
|
243
|
-
│ ┌───────────────────────────────────────────────────────────┐ │
|
|
244
|
-
│ │ # │ Scenario │ Given │ When │ Then │ Status │ │
|
|
245
|
-
│ │───│───────────────────────│───────│──────│──────│────────│ │
|
|
246
|
-
│ │ 1 │ Valid login success │ ✅ │ ✅ │ ✅ │ ✅ │ │
|
|
247
|
-
│ │ 2 │ Invalid password error│ ✅ │ ✅ │ ✅ │ ✅ │ │
|
|
248
|
-
│ │ 3 │ Email format validation│ ✅ │ ✅ │ ✅ │ ✅ │ │
|
|
249
|
-
│ │ 4 │ Forgot password link │ ✅ │ ✅ │ ✅ │ ✅ │ │
|
|
250
|
-
│ └───────────────────────────────────────────────────────────┘ │
|
|
251
|
-
│ │
|
|
252
|
-
│ 📈 Quality Score: 94/100 │
|
|
253
|
-
│ │
|
|
254
|
-
│ ┌─────────────────────────────────────────────────────────┐ │
|
|
255
|
-
│ │ Item │ Result│ Details │ │
|
|
256
|
-
│ │───────────────────│───────│─────────────────────────────│ │
|
|
257
|
-
│ │ Build │ ✅ │ Success │ │
|
|
258
|
-
│ │ Tests │ ✅ │ 12/12 passed │ │
|
|
259
|
-
│ │ Type Check │ ✅ │ 0 errors │ │
|
|
260
|
-
│ │ Complexity │ ✅ │ All functions ≤50 lines │ │
|
|
261
|
-
│ │ Code Coverage │ ⚠️ │ 78% (target: 80%) │ │
|
|
262
|
-
│ └─────────────────────────────────────────────────────────┘ │
|
|
263
|
-
│ │
|
|
264
|
-
│ 📋 Recommendations: │
|
|
265
|
-
│ - Need 2% more code coverage (auth.service.ts line 45-52) │
|
|
266
|
-
│ │
|
|
267
|
-
│ ⏱️ Started: {start_time} │
|
|
268
|
-
│ ⏱️ Completed: {getCurrentTime 결과} │
|
|
269
|
-
│ 🧮 Tool calls: {step_count} │
|
|
270
|
-
│ │
|
|
271
|
-
└─────────────────────────────────────────────────────────────────┘
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
### Failure Auto-Register (MANDATORY on any scenario failure)
|
|
275
|
-
|
|
276
|
-
Before printing the failure report, **auto-register each failed scenario as a regression bug** so the same failure cannot silently slip through next time:
|
|
277
|
-
|
|
278
|
-
```
|
|
279
|
-
For each failed scenario:
|
|
280
|
-
Load skill `regress` with:
|
|
281
|
-
subcommand: register --from-verify
|
|
282
|
-
feature: {feature-name}
|
|
283
|
-
scenario: {scenario-name}
|
|
284
|
-
error: {error-summary}
|
|
285
|
-
location: {file:line}
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
- `--from-verify` mode skips user confirmation (the user is already attentive in a verify-failure context; minimize friction)
|
|
289
|
-
- The registered bug's slug appears as a link in the Failure Report's "Fix" section
|
|
290
|
-
- Follow up with `/vibe.regress generate <slug>` to produce a preventive test
|
|
291
|
-
|
|
292
|
-
### Failure Report
|
|
293
|
-
|
|
294
|
-
```
|
|
295
|
-
┌─────────────────────────────────────────────────────────────────┐
|
|
296
|
-
│ 📊 VERIFICATION REPORT: login │
|
|
297
|
-
├─────────────────────────────────────────────────────────────────┤
|
|
298
|
-
│ │
|
|
299
|
-
│ ❌ Scenarios: 3/4 passed (75%) │
|
|
300
|
-
│ │
|
|
301
|
-
│ ┌───────────────────────────────────────────────────────────┐ │
|
|
302
|
-
│ │ # │ Scenario │ Given │ When │ Then │ Status │ │
|
|
303
|
-
│ │───│───────────────────────│───────│──────│──────│────────│ │
|
|
304
|
-
│ │ 1 │ Valid login success │ ✅ │ ✅ │ ✅ │ ✅ │ │
|
|
305
|
-
│ │ 2 │ Invalid password error│ ✅ │ ✅ │ ✅ │ ✅ │ │
|
|
306
|
-
│ │ 3 │ Email format validation│ ✅ │ ✅ │ ✅ │ ✅ │ │
|
|
307
|
-
│ │ 4 │ Forgot password link │ ✅ │ ❌ │ - │ ❌ │ │
|
|
308
|
-
│ └───────────────────────────────────────────────────────────┘ │
|
|
309
|
-
│ │
|
|
310
|
-
│ ❌ Failure Details: │
|
|
311
|
-
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
|
|
312
|
-
│ Scenario 4: Forgot password link │
|
|
313
|
-
│ │
|
|
314
|
-
│ When: Click "Forgot password" │
|
|
315
|
-
│ ❌ Issue: Link not implemented │
|
|
316
|
-
│ 📍 Location: LoginForm.tsx line 42 │
|
|
317
|
-
│ 💡 Fix: Need to add "Forgot password" link │
|
|
318
|
-
│ │
|
|
319
|
-
│ 🔧 Auto-fix command: /vibe.run "login" --fix │
|
|
320
|
-
│ │
|
|
321
|
-
└─────────────────────────────────────────────────────────────────┘
|
|
322
|
-
```
|
|
323
|
-
|
|
324
|
-
## Input
|
|
325
|
-
|
|
326
|
-
- `.vibe/features/{feature-name}.feature` or `.vibe/features/{feature-name}/` - BDD scenarios
|
|
327
|
-
- `.vibe/specs/{feature-name}.md` or `.vibe/specs/{feature-name}/` - SPEC document (reference)
|
|
328
|
-
- Implemented source code
|
|
329
|
-
|
|
330
|
-
## Output
|
|
331
|
-
|
|
332
|
-
- Verification result report (terminal output)
|
|
333
|
-
- Passed/failed scenario list
|
|
334
|
-
- Items needing fixes
|
|
335
|
-
|
|
336
|
-
## Example
|
|
337
|
-
|
|
338
|
-
```
|
|
339
|
-
User: /vibe.verify "login"
|
|
340
|
-
|
|
341
|
-
Claude:
|
|
342
|
-
📄 Loading Feature: .vibe/features/login.feature
|
|
343
|
-
🔍 Starting verification...
|
|
344
|
-
|
|
345
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
346
|
-
🔍 Scenario 1/4: Valid login success
|
|
347
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
348
|
-
✅ Given: User registered - OK
|
|
349
|
-
✅ When: Login attempt - OK
|
|
350
|
-
✅ Then: JWT token returned - OK
|
|
351
|
-
✅ Passed!
|
|
352
|
-
|
|
353
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
354
|
-
🔍 Scenario 2/4: Invalid password error
|
|
355
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
356
|
-
✅ Given: OK
|
|
357
|
-
✅ When: OK
|
|
358
|
-
✅ Then: OK
|
|
359
|
-
✅ Passed!
|
|
360
|
-
|
|
361
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
362
|
-
🔍 Scenario 3/4: Email format validation
|
|
363
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
364
|
-
✅ Given: OK
|
|
365
|
-
✅ When: OK
|
|
366
|
-
✅ Then: OK
|
|
367
|
-
✅ Passed!
|
|
368
|
-
|
|
369
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
370
|
-
🔍 Scenario 4/4: Forgot password link
|
|
371
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
372
|
-
✅ Given: OK
|
|
373
|
-
❌ When: "Forgot password" link - missing
|
|
374
|
-
- Then: (skipped)
|
|
375
|
-
❌ Failed!
|
|
376
|
-
|
|
377
|
-
┌─────────────────────────────────────────────────────────────────┐
|
|
378
|
-
│ 📊 VERIFICATION REPORT: login │
|
|
379
|
-
├─────────────────────────────────────────────────────────────────┤
|
|
380
|
-
│ │
|
|
381
|
-
│ ❌ Scenarios: 3/4 passed (75%) │
|
|
382
|
-
│ │
|
|
383
|
-
│ | # | Scenario | Status | │
|
|
384
|
-
│ |---|───────────────────────|────────| │
|
|
385
|
-
│ | 1 | Valid login success | ✅ | │
|
|
386
|
-
│ | 2 | Invalid password error| ✅ | │
|
|
387
|
-
│ | 3 | Email format validation| ✅ | │
|
|
388
|
-
│ | 4 | Forgot password link | ❌ | │
|
|
389
|
-
│ │
|
|
390
|
-
│ 📈 Quality Score: 75/100 │
|
|
391
|
-
│ │
|
|
392
|
-
│ ❌ Fixes needed: │
|
|
393
|
-
│ - Scenario 4: Add "Forgot password" link in LoginForm.tsx │
|
|
394
|
-
│ │
|
|
395
|
-
│ 🔧 Auto-fix: /vibe.run "login" --fix │
|
|
396
|
-
│ │
|
|
397
|
-
└─────────────────────────────────────────────────────────────────┘
|
|
398
|
-
```
|
|
399
|
-
|
|
400
|
-
## Core Tools (Code Analysis & Quality)
|
|
401
|
-
|
|
402
|
-
### Tool Invocation
|
|
403
|
-
|
|
404
|
-
All tools are called via:
|
|
60
|
+
P1 drift (hex hardcoded outside the DESIGN.md token set) → verify fails. DESIGN.md absent → notify and silently skip (never block).
|
|
405
61
|
|
|
406
|
-
|
|
407
|
-
node -e "import('{{VIBE_PATH_URL}}/node_modules/@su-record/vibe/dist/tools/index.js').then(t => t.TOOL_NAME({...args}).then(r => console.log(r.content[0].text)))"
|
|
408
|
-
```
|
|
409
|
-
|
|
410
|
-
### Recommended Tools for Verification
|
|
411
|
-
|
|
412
|
-
| Tool | Purpose | When to Use |
|
|
413
|
-
|------|---------|-------------|
|
|
414
|
-
| `validateCodeQuality` | Code quality validation | Check complexity, style violations |
|
|
415
|
-
| `analyzeComplexity` | Complexity analysis | Verify function length, nesting depth |
|
|
416
|
-
| `findSymbol` | Find implementations | Verify feature implementation exists |
|
|
417
|
-
| `findReferences` | Find usages | Check if all references are correct |
|
|
62
|
+
### 4. Result summary (short markdown — no box art)
|
|
418
63
|
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
**1. Validate code quality:**
|
|
422
|
-
|
|
423
|
-
```bash
|
|
424
|
-
node -e "import('{{VIBE_PATH_URL}}/node_modules/@su-record/vibe/dist/tools/index.js').then(t => t.validateCodeQuality({targetPath: 'src/auth/', projectPath: process.cwd()}).then(r => console.log(r.content[0].text)))"
|
|
425
|
-
```
|
|
64
|
+
```markdown
|
|
65
|
+
## Verify: {feature} — PASS | FAIL (n/m criteria)
|
|
426
66
|
|
|
427
|
-
|
|
67
|
+
| Done criterion | Result | Evidence |
|
|
68
|
+
|---|---|---|
|
|
69
|
+
| Valid login returns JWT | PASS | auth.test.ts 12/12; src/auth/login.ts:42 |
|
|
70
|
+
| Forgot-password link | FAIL | LoginForm.tsx:42 — link not implemented |
|
|
428
71
|
|
|
429
|
-
|
|
430
|
-
|
|
72
|
+
Build: OK · Tests: 12/12 · Types: 0 errors
|
|
73
|
+
Next: /vibe.run "{feature}" --fix ← only when FAIL
|
|
431
74
|
```
|
|
432
75
|
|
|
433
|
-
|
|
76
|
+
One row per Done criterion: pass/fail + an evidence pointer (file:line, test name, or command result). Failure rows state expected vs actual and the exact location.
|
|
434
77
|
|
|
435
|
-
|
|
436
|
-
node -e "import('{{VIBE_PATH_URL}}/node_modules/@su-record/vibe/dist/tools/index.js').then(t => t.findSymbol({symbolName: 'handleLogin', searchPath: 'src/'}).then(r => console.log(r.content[0].text)))"
|
|
437
|
-
```
|
|
78
|
+
**Pass condition**: ALL Done criteria pass AND build/tests/type check pass. Anything else = FAIL.
|
|
438
79
|
|
|
439
|
-
###
|
|
80
|
+
### 5. Failure auto-register (MANDATORY on any failed criterion)
|
|
440
81
|
|
|
441
|
-
|
|
82
|
+
Before printing the failure summary, register each failed scenario as a regression bug so the same failure cannot silently slip through again:
|
|
442
83
|
|
|
443
84
|
```
|
|
444
|
-
|
|
85
|
+
Load skill `regress` with:
|
|
86
|
+
subcommand: register --from-verify
|
|
87
|
+
feature: {feature} scenario: {scenario}
|
|
88
|
+
error: {error-summary} location: {file:line}
|
|
445
89
|
```
|
|
446
90
|
|
|
447
|
-
|
|
448
|
-
1. 즉시 수정
|
|
449
|
-
2. 해당 시나리오 재검증
|
|
450
|
-
3. 재검증 통과 시 최종 완료
|
|
451
|
-
|
|
452
|
-
**Codex P2 발견 시:**
|
|
453
|
-
- TODO 파일에 기록 후 완료 처리
|
|
91
|
+
`--from-verify` skips user confirmation. The bug slug appears in the summary's Fix line. Follow up with `/vibe.regress generate <slug>` for a preventive test.
|
|
454
92
|
|
|
455
|
-
|
|
93
|
+
### 6. Post-verify contract check (auto, only when a contract file exists)
|
|
456
94
|
|
|
457
|
-
After all
|
|
95
|
+
After all criteria pass, if `.vibe/contracts/{feature}.md` exists:
|
|
458
96
|
|
|
459
97
|
```
|
|
460
|
-
Load skill `contract` with: check "{feature
|
|
98
|
+
Load skill `contract` with: check "{feature}"
|
|
461
99
|
```
|
|
462
100
|
|
|
463
|
-
- Skip if `.vibe/contracts/{feature-name}.md` does not exist
|
|
464
101
|
- No drift → verify still passes
|
|
465
|
-
- **P1 drift** → demote verify to
|
|
466
|
-
- P2
|
|
102
|
+
- **P1 drift** → demote verify to FAIL; auto-call `/vibe.regress register --from-contract`
|
|
103
|
+
- P2/P3 drift → warning only
|
|
467
104
|
|
|
468
|
-
|
|
105
|
+
### 7. Metrics + Ledger update (MANDATORY final step)
|
|
469
106
|
|
|
470
|
-
|
|
107
|
+
Record run metrics, then write the verify result to the run ledger. This is the machine-readable JUDGE record consumed by the Stop-hook verify gate, auto-commit verify gate, and loop-contract gates.
|
|
471
108
|
|
|
472
109
|
```bash
|
|
473
|
-
#
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
fi
|
|
479
|
-
```
|
|
480
|
-
|
|
481
|
-
Replace `pass` with `fail` when any scenario fails. This step enables the Stop-hook verify-skip gate and auto-commit verify gate.
|
|
482
|
-
|
|
483
|
-
## Next Step
|
|
484
|
-
|
|
485
|
-
On verification pass:
|
|
486
|
-
|
|
487
|
-
```
|
|
488
|
-
Complete! Proceed to next feature.
|
|
489
|
-
```
|
|
490
|
-
|
|
491
|
-
On verification fail:
|
|
492
|
-
|
|
493
|
-
```
|
|
494
|
-
/vibe.run "feature-name" --fix # Fix failed scenarios
|
|
495
|
-
```
|
|
496
|
-
|
|
497
|
-
---
|
|
498
|
-
|
|
499
|
-
## Quality Gate (Mandatory)
|
|
500
|
-
|
|
501
|
-
### Verification Quality Checklist
|
|
502
|
-
|
|
503
|
-
Before marking verification complete, ALL items must pass:
|
|
504
|
-
|
|
505
|
-
| Category | Check Item | Weight |
|
|
506
|
-
|----------|------------|--------|
|
|
507
|
-
| **Scenario Coverage** | All scenarios from feature file tested | 25% |
|
|
508
|
-
| **Given Verification** | All preconditions validated | 15% |
|
|
509
|
-
| **When Verification** | All actions executable | 15% |
|
|
510
|
-
| **Then Verification** | All expected outcomes confirmed | 20% |
|
|
511
|
-
| **Build Status** | Project builds without errors | 10% |
|
|
512
|
-
| **Test Status** | All existing tests pass | 10% |
|
|
513
|
-
| **Type Check** | No TypeScript/type errors | 5% |
|
|
514
|
-
|
|
515
|
-
### Verification Score Calculation
|
|
110
|
+
# Append step-count history (ok if current-run.json missing)
|
|
111
|
+
node -e "
|
|
112
|
+
const fs=require('fs'),p='.vibe/metrics';
|
|
113
|
+
try{const c=JSON.parse(fs.readFileSync(p+'/current-run.json','utf-8'));
|
|
114
|
+
fs.appendFileSync(p+'/history.jsonl',JSON.stringify({verifiedAt:new Date().toISOString(),feature:c.feature,startedAt:c.startedAt,steps:c.steps||0})+'\n');}catch{}"
|
|
516
115
|
|
|
517
|
-
|
|
518
|
-
|
|
116
|
+
# Record verify result — pass | fail (calls recordVerify on the run ledger)
|
|
117
|
+
HOOKS_DIR="${VIBE_PATH:-$(npm root -g 2>/dev/null)/@su-record/vibe}/hooks/scripts"
|
|
118
|
+
[ -f "$HOOKS_DIR/verify-ledger.js" ] && node "$HOOKS_DIR/verify-ledger.js" pass # or: fail
|
|
519
119
|
|
|
520
|
-
|
|
521
|
-
-
|
|
522
|
-
- 90-99%: ⚠️ ALMOST - Minor gaps, review needed
|
|
523
|
-
- 70-89%: ❌ INCOMPLETE - Significant gaps
|
|
524
|
-
- 0-69%: ❌ FAILED - Major implementation missing
|
|
120
|
+
# Recipe extraction (best-effort, silent)
|
|
121
|
+
[ -f "$HOOKS_DIR/recipe-extractor.js" ] && node "$HOOKS_DIR/recipe-extractor.js" 2>/dev/null || true
|
|
525
122
|
```
|
|
526
123
|
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
| Metric | Pass Threshold | Action on Fail |
|
|
530
|
-
|--------|----------------|----------------|
|
|
531
|
-
| Scenario pass rate | 100% | Run `/vibe.run --fix` |
|
|
532
|
-
| Build status | Success | Fix build errors first |
|
|
533
|
-
| Test pass rate | 100% | Fix failing tests |
|
|
534
|
-
| Type check | 0 errors | Fix type errors |
|
|
535
|
-
|
|
536
|
-
### Verification Methods Matrix
|
|
537
|
-
|
|
538
|
-
| Method | Trigger Condition | What It Checks |
|
|
539
|
-
|--------|-------------------|----------------|
|
|
540
|
-
| **Code Analysis** | Always | Implementation exists |
|
|
541
|
-
| **Test Execution** | Test files exist | Logic correctness |
|
|
542
|
-
| **Build Verification** | Build script exists | Compilation success |
|
|
543
|
-
| **Type Check** | tsconfig.json exists | Type safety |
|
|
544
|
-
| **Lint Check** | ESLint config exists | Code style |
|
|
545
|
-
|
|
546
|
-
### Scenario Verification Depth
|
|
547
|
-
|
|
548
|
-
For each scenario, verify at THREE levels:
|
|
124
|
+
Use `pass` only when the summary in step 4 is PASS; otherwise `fail`. Skipping this step leaves `verifyPassed` unset and downstream gates will treat the run as unverified.
|
|
549
125
|
|
|
550
|
-
|
|
551
|
-
|-------|--------------|---------|
|
|
552
|
-
| **L1: Existence** | Code/function exists | `login()` function defined |
|
|
553
|
-
| **L2: Logic** | Implementation is correct | Validates email format |
|
|
554
|
-
| **L3: Integration** | Works with other components | Returns valid JWT |
|
|
555
|
-
|
|
556
|
-
### Auto-Fix Triggers
|
|
557
|
-
|
|
558
|
-
| Verification Failure | Auto-Fix Action |
|
|
559
|
-
|----------------------|-----------------|
|
|
560
|
-
| Missing implementation | Generate skeleton from scenario |
|
|
561
|
-
| Test failure | Analyze and suggest fix |
|
|
562
|
-
| Build error | Show error location |
|
|
563
|
-
| Type error | Suggest type annotations |
|
|
564
|
-
|
|
565
|
-
### Failure Escalation (convergence-based, no retry cap)
|
|
126
|
+
## Failure escalation (convergence-based, no retry cap)
|
|
566
127
|
|
|
567
128
|
```
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
...
|
|
574
|
-
Stuck detected (same error as previous attempt):
|
|
575
|
-
→ Interactive mode: Ask user
|
|
576
|
-
1. Provide a fix hint (e.g., "check LoginForm.tsx line 42")
|
|
577
|
-
→ Apply → Re-verify → Continue loop
|
|
578
|
-
2. Type "proceed" → Record failure in
|
|
579
|
-
.vibe/todos/verify-failure-{scenario}.md,
|
|
580
|
-
continue to next scenario
|
|
581
|
-
3. Type "abort" → Stop entire verification
|
|
582
|
-
→ ultrawork mode: auto-record TODO + continue to next scenario
|
|
583
|
-
|
|
584
|
-
No retry cap — loop continues as long as the auto-fixer makes progress.
|
|
585
|
-
Only "same error twice" (stuck) triggers escalation.
|
|
129
|
+
fix → re-verify → still failing?
|
|
130
|
+
different error → progress, continue looping
|
|
131
|
+
same error as previous attempt → STUCK:
|
|
132
|
+
interactive: ask user (fix hint / "proceed" → record .vibe/todos/verify-failure-{scenario}.md / "abort")
|
|
133
|
+
autonomous (automationLevel: autonomous): record TODO, continue to next scenario
|
|
586
134
|
```
|
|
587
135
|
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
Every verification MUST produce:
|
|
591
|
-
|
|
592
|
-
1. **Scenario Summary Table**
|
|
593
|
-
- Scenario name
|
|
594
|
-
- Given/When/Then status (✅/❌)
|
|
595
|
-
- Overall status
|
|
596
|
-
|
|
597
|
-
2. **Quality Metrics**
|
|
598
|
-
- Build status
|
|
599
|
-
- Test pass count
|
|
600
|
-
- Type error count
|
|
601
|
-
- Code coverage percentage
|
|
602
|
-
|
|
603
|
-
3. **Failure Details** (if any)
|
|
604
|
-
- Exact failure point (Given/When/Then)
|
|
605
|
-
- Expected vs actual
|
|
606
|
-
- File path and line number
|
|
607
|
-
- Suggested fix command
|
|
136
|
+
## Next step
|
|
608
137
|
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
- Auto-fix command if available
|
|
138
|
+
- PASS → proceed to the next feature
|
|
139
|
+
- FAIL → `/vibe.run "{feature}" --fix`
|
|
612
140
|
|
|
613
141
|
---
|
|
614
142
|
|