@howlil/ez-agents 3.5.0 → 4.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/README.md +735 -537
- package/agents/ez-architect-agent.md +267 -0
- package/agents/ez-backend-agent.md +303 -0
- package/agents/ez-chief-strategist.md +271 -0
- package/agents/ez-codebase-mapper.md +770 -770
- package/agents/ez-context-manager.md +319 -0
- package/agents/ez-debugger.md +1255 -1255
- package/agents/ez-design-expert.md +347 -0
- package/agents/ez-devops-agent.md +331 -0
- package/agents/ez-executor.md +487 -487
- package/agents/ez-frontend-agent.md +322 -0
- package/agents/ez-phase-researcher.md +553 -553
- package/agents/ez-planner.md +1307 -1307
- package/agents/ez-product-engineer.md +435 -0
- package/agents/ez-project-researcher.md +629 -629
- package/agents/ez-qa-agent.md +320 -0
- package/agents/ez-release-agent.md +333 -333
- package/agents/ez-requirements-agent.md +377 -377
- package/agents/ez-roadmapper.md +650 -650
- package/agents/ez-technical-writer.md +551 -0
- package/agents/ez-ux-expert.md +393 -0
- package/agents/ez-verifier.md +579 -579
- package/bin/guards/autonomy-guard.cjs +346 -0
- package/bin/guards/context-budget-guard.cjs +278 -0
- package/bin/guards/hallucination-guard.cjs +380 -0
- package/bin/guards/hidden-state-guard.cjs +182 -0
- package/bin/guards/team-overhead-guard.cjs +266 -0
- package/bin/guards/tool-sprawl-guard.cjs +271 -0
- package/bin/lib/analytics/analytics-collector.cjs +86 -0
- package/bin/lib/analytics/analytics-reporter.cjs +130 -0
- package/bin/lib/analytics/cohort-analyzer.cjs +138 -0
- package/bin/lib/analytics/funnel-analyzer.cjs +147 -0
- package/bin/lib/analytics/nps-tracker.cjs +147 -0
- package/bin/lib/archetype-detector.cjs +289 -0
- package/bin/lib/assistant-adapter.cjs +361 -0
- package/bin/lib/audit-exec.cjs +175 -0
- package/bin/lib/auth.cjs +176 -0
- package/bin/lib/backup-service.cjs +422 -0
- package/bin/lib/bdd-validator.cjs +622 -0
- package/bin/lib/business-flow-mapper.cjs +429 -0
- package/bin/lib/circuit-breaker.cjs +276 -0
- package/bin/lib/code-complexity-analyzer.cjs +360 -0
- package/bin/lib/codebase-analyzer.cjs +241 -0
- package/bin/lib/commands.cjs +691 -0
- package/bin/lib/config.cjs +236 -0
- package/bin/lib/constraint-extractor.cjs +526 -0
- package/bin/lib/content-scanner.cjs +238 -0
- package/bin/lib/context-cache.cjs +154 -0
- package/bin/lib/context-compressor.cjs +102 -0
- package/bin/lib/context-deduplicator.cjs +105 -0
- package/bin/lib/context-errors.cjs +78 -0
- package/bin/lib/context-manager.cjs +338 -0
- package/bin/lib/context-metadata-tracker.cjs +140 -0
- package/bin/lib/context-relevance-scorer.cjs +99 -0
- package/bin/lib/core.cjs +507 -0
- package/bin/lib/cost-alerts.cjs +174 -0
- package/bin/lib/cost-tracker.cjs +275 -0
- package/bin/lib/crash-recovery.cjs +220 -0
- package/bin/lib/dependency-graph.cjs +319 -0
- package/bin/lib/deploy/deploy-audit-log.cjs +76 -0
- package/bin/lib/deploy/deploy-detector.cjs +69 -0
- package/bin/lib/deploy/deploy-env-manager.cjs +109 -0
- package/bin/lib/deploy/deploy-health-check.cjs +88 -0
- package/bin/lib/deploy/deploy-pre-flight.cjs +57 -0
- package/bin/lib/deploy/deploy-rollback.cjs +72 -0
- package/bin/lib/deploy/deploy-runner.cjs +97 -0
- package/bin/lib/deploy/deploy-status.cjs +74 -0
- package/bin/lib/discussion-synthesizer.cjs +439 -0
- package/bin/lib/error-cache.cjs +114 -0
- package/bin/lib/error-registry.cjs +177 -0
- package/bin/lib/file-access.cjs +207 -0
- package/bin/lib/file-lock.cjs +236 -0
- package/bin/lib/finops/budget-enforcer.cjs +126 -0
- package/bin/lib/finops/cost-reporter.cjs +132 -0
- package/bin/lib/finops/finops-analyzer.cjs +112 -0
- package/bin/lib/finops/spot-manager.cjs +118 -0
- package/bin/lib/framework-detector.cjs +396 -0
- package/bin/lib/frontmatter.cjs +313 -0
- package/bin/lib/fs-utils.cjs +153 -0
- package/bin/lib/gate-executor.cjs +272 -0
- package/bin/lib/gates/README.md +374 -0
- package/bin/lib/gates/gate-01-requirement.cjs +303 -0
- package/bin/lib/gates/gate-02-architecture.cjs +555 -0
- package/bin/lib/gates/gate-03-code.cjs +635 -0
- package/bin/lib/gates/gate-04-security.cjs +829 -0
- package/bin/lib/git-errors.cjs +83 -0
- package/bin/lib/git-utils.cjs +321 -0
- package/bin/lib/git-workflow-engine.cjs +1157 -0
- package/bin/lib/health-check.cjs +227 -0
- package/bin/lib/index.cjs +279 -0
- package/bin/lib/init.cjs +725 -0
- package/bin/lib/lock-logger.cjs +194 -0
- package/bin/lib/lock-state.cjs +263 -0
- package/bin/lib/lockfile-validator.cjs +227 -0
- package/bin/lib/log-rotation.cjs +71 -0
- package/bin/lib/logger.cjs +125 -0
- package/bin/lib/memory-compression.cjs +256 -0
- package/bin/lib/milestone.cjs +247 -0
- package/bin/lib/model-provider.cjs +241 -0
- package/bin/lib/package-manager-detector.cjs +203 -0
- package/bin/lib/package-manager-executor.cjs +385 -0
- package/bin/lib/package-manager-service.cjs +216 -0
- package/bin/lib/perf/api-monitor.cjs +88 -0
- package/bin/lib/perf/db-optimizer.cjs +78 -0
- package/bin/lib/perf/frontend-performance.cjs +56 -0
- package/bin/lib/perf/perf-analyzer.cjs +77 -0
- package/bin/lib/perf/perf-baseline.cjs +102 -0
- package/bin/lib/perf/perf-reporter.cjs +117 -0
- package/bin/lib/perf/regression-detector.cjs +92 -0
- package/bin/lib/phase.cjs +963 -0
- package/bin/lib/planning-write.cjs +123 -0
- package/bin/lib/project-reporter.cjs +565 -0
- package/bin/lib/quality-gate.cjs +332 -0
- package/bin/lib/quality-metrics.cjs +324 -0
- package/bin/lib/recovery-manager.cjs +98 -0
- package/bin/lib/release-validator.cjs +617 -0
- package/bin/lib/retry.cjs +119 -0
- package/bin/lib/roadmap.cjs +309 -0
- package/bin/lib/safe-exec.cjs +173 -0
- package/bin/lib/safe-path.cjs +130 -0
- package/bin/lib/security-errors.cjs +62 -0
- package/bin/lib/session-chain.cjs +304 -0
- package/bin/lib/session-errors.cjs +81 -0
- package/bin/lib/session-export.cjs +251 -0
- package/bin/lib/session-import.cjs +262 -0
- package/bin/lib/session-manager.cjs +280 -0
- package/bin/lib/skill-context.cjs +148 -0
- package/bin/lib/skill-matcher.cjs +236 -0
- package/bin/lib/skill-registry.cjs +360 -0
- package/bin/lib/skill-resolver.cjs +449 -0
- package/bin/lib/skill-triggers.cjs +90 -0
- package/bin/lib/skill-validator.cjs +270 -0
- package/bin/lib/skill-versioning.cjs +355 -0
- package/bin/lib/stack-detector.cjs +399 -0
- package/bin/lib/state.cjs +736 -0
- package/bin/lib/tech-debt-analyzer.cjs +309 -0
- package/bin/lib/temp-file.cjs +239 -0
- package/bin/lib/template.cjs +223 -0
- package/bin/lib/test-file-lock.cjs +112 -0
- package/bin/lib/test-graceful.cjs +93 -0
- package/bin/lib/test-logger.cjs +60 -0
- package/bin/lib/test-safe-exec.cjs +38 -0
- package/bin/lib/test-safe-path.cjs +33 -0
- package/bin/lib/test-temp-file.cjs +125 -0
- package/bin/lib/tier-manager.cjs +428 -0
- package/bin/lib/timeout-exec.cjs +63 -0
- package/bin/lib/tradeoff-analyzer.cjs +284 -0
- package/bin/lib/url-fetch.cjs +170 -0
- package/bin/lib/verify.cjs +863 -0
- package/bin/update.js +217 -214
- package/commands/deploy.cjs +53 -0
- package/commands/ez/add-tests.md +41 -41
- package/commands/ez/audit-milestone.md +36 -36
- package/commands/ez/complete-milestone.md +136 -136
- package/commands/ez/discuss-phase.md +90 -90
- package/commands/ez/execute-phase.md +52 -52
- package/commands/ez/help.md +22 -22
- package/commands/ez/map-codebase.md +71 -71
- package/commands/ez/new-milestone.md +44 -44
- package/commands/ez/new-project.md +51 -42
- package/commands/ez/plan-phase.md +53 -53
- package/commands/ez/progress.md +36 -36
- package/commands/ez/quick.md +45 -45
- package/commands/ez/resume-work.md +40 -40
- package/commands/ez/run-phase.md +580 -0
- package/commands/ez/settings.md +36 -36
- package/commands/ez/update.md +37 -37
- package/commands/ez/verify-work.md +402 -38
- package/commands/health-check.cjs +44 -0
- package/commands/rollback.cjs +47 -0
- package/ez-agents/bin/ez-tools.cjs +599 -2
- package/ez-agents/bin/guards/autonomy-guard.cjs +346 -0
- package/ez-agents/bin/guards/context-budget-guard.cjs +247 -0
- package/ez-agents/bin/guards/hallucination-guard.cjs +271 -0
- package/ez-agents/bin/guards/hidden-state-guard.cjs +182 -0
- package/ez-agents/bin/guards/team-overhead-guard.cjs +266 -0
- package/ez-agents/bin/guards/tool-sprawl-guard.cjs +271 -0
- package/ez-agents/bin/lib/analytics/analytics-collector.cjs +86 -0
- package/ez-agents/bin/lib/analytics/analytics-reporter.cjs +130 -0
- package/ez-agents/bin/lib/analytics/cohort-analyzer.cjs +138 -0
- package/ez-agents/bin/lib/analytics/funnel-analyzer.cjs +147 -0
- package/ez-agents/bin/lib/analytics/nps-tracker.cjs +147 -0
- package/ez-agents/bin/lib/archetype-detector.cjs +289 -0
- package/ez-agents/bin/lib/audit-exec.cjs +166 -167
- package/ez-agents/bin/lib/auth.cjs +176 -176
- package/ez-agents/bin/lib/backup-service.cjs +422 -0
- package/ez-agents/bin/lib/bdd-validator.cjs +622 -622
- package/ez-agents/bin/lib/business-flow-mapper.cjs +429 -0
- package/ez-agents/bin/lib/code-complexity-analyzer.cjs +360 -0
- package/ez-agents/bin/lib/codebase-analyzer.cjs +241 -0
- package/ez-agents/bin/lib/commands.cjs +685 -685
- package/ez-agents/bin/lib/config.cjs +41 -1
- package/ez-agents/bin/lib/constraint-extractor.cjs +526 -0
- package/ez-agents/bin/lib/content-scanner.cjs +238 -238
- package/ez-agents/bin/lib/context-cache.cjs +154 -154
- package/ez-agents/bin/lib/context-errors.cjs +71 -71
- package/ez-agents/bin/lib/context-manager.cjs +220 -220
- package/ez-agents/bin/lib/core.cjs +507 -512
- package/ez-agents/bin/lib/cost-tracker.cjs +243 -0
- package/ez-agents/bin/lib/crash-recovery.cjs +172 -0
- package/ez-agents/bin/lib/dependency-graph.cjs +319 -0
- package/ez-agents/bin/lib/deploy/deploy-audit-log.cjs +76 -0
- package/ez-agents/bin/lib/deploy/deploy-detector.cjs +69 -0
- package/ez-agents/bin/lib/deploy/deploy-env-manager.cjs +109 -0
- package/ez-agents/bin/lib/deploy/deploy-health-check.cjs +88 -0
- package/ez-agents/bin/lib/deploy/deploy-pre-flight.cjs +57 -0
- package/ez-agents/bin/lib/deploy/deploy-rollback.cjs +72 -0
- package/ez-agents/bin/lib/deploy/deploy-runner.cjs +97 -0
- package/ez-agents/bin/lib/deploy/deploy-status.cjs +74 -0
- package/ez-agents/bin/lib/file-access.cjs +207 -207
- package/ez-agents/bin/lib/finops/budget-enforcer.cjs +126 -0
- package/ez-agents/bin/lib/finops/cost-reporter.cjs +132 -0
- package/ez-agents/bin/lib/finops/finops-analyzer.cjs +112 -0
- package/ez-agents/bin/lib/finops/spot-manager.cjs +118 -0
- package/ez-agents/bin/lib/framework-detector.cjs +396 -0
- package/ez-agents/bin/lib/frontmatter.cjs +3 -1
- package/ez-agents/bin/lib/gates/README.md +374 -0
- package/ez-agents/bin/lib/gates/gate-01-requirement.cjs +303 -0
- package/ez-agents/bin/lib/gates/gate-02-architecture.cjs +555 -0
- package/ez-agents/bin/lib/gates/gate-03-code.cjs +635 -0
- package/ez-agents/bin/lib/gates/gate-04-security.cjs +829 -0
- package/ez-agents/bin/lib/git-errors.cjs +83 -83
- package/ez-agents/bin/lib/git-utils.cjs +321 -321
- package/ez-agents/bin/lib/git-workflow-engine.cjs +1157 -1157
- package/ez-agents/bin/lib/health-check.cjs +162 -162
- package/ez-agents/bin/lib/index.cjs +2 -8
- package/ez-agents/bin/lib/init.cjs +0 -2
- package/ez-agents/bin/lib/lockfile-validator.cjs +227 -227
- package/ez-agents/bin/lib/log-rotation.cjs +71 -0
- package/ez-agents/bin/lib/logger.cjs +22 -47
- package/ez-agents/bin/lib/memory-compression.cjs +256 -256
- package/ez-agents/bin/lib/package-manager-detector.cjs +203 -203
- package/ez-agents/bin/lib/package-manager-executor.cjs +385 -385
- package/ez-agents/bin/lib/package-manager-service.cjs +216 -216
- package/ez-agents/bin/lib/perf/api-monitor.cjs +88 -0
- package/ez-agents/bin/lib/perf/db-optimizer.cjs +78 -0
- package/ez-agents/bin/lib/perf/frontend-performance.cjs +56 -0
- package/ez-agents/bin/lib/perf/perf-analyzer.cjs +77 -0
- package/ez-agents/bin/lib/perf/perf-baseline.cjs +102 -0
- package/ez-agents/bin/lib/perf/perf-reporter.cjs +117 -0
- package/ez-agents/bin/lib/perf/regression-detector.cjs +92 -0
- package/ez-agents/bin/lib/project-reporter.cjs +502 -0
- package/ez-agents/bin/lib/quality-gate.cjs +332 -0
- package/ez-agents/bin/lib/recovery-manager.cjs +98 -0
- package/ez-agents/bin/lib/release-validator.cjs +617 -614
- package/ez-agents/bin/lib/security-errors.cjs +62 -0
- package/ez-agents/bin/lib/session-chain.cjs +304 -304
- package/ez-agents/bin/lib/session-errors.cjs +81 -81
- package/ez-agents/bin/lib/session-export.cjs +251 -251
- package/ez-agents/bin/lib/session-import.cjs +262 -262
- package/ez-agents/bin/lib/session-manager.cjs +280 -280
- package/ez-agents/bin/lib/skill-context.cjs +148 -0
- package/ez-agents/bin/lib/skill-matcher.cjs +236 -0
- package/ez-agents/bin/lib/skill-registry.cjs +341 -0
- package/ez-agents/bin/lib/skill-resolver.cjs +449 -0
- package/ez-agents/bin/lib/skill-triggers.cjs +90 -0
- package/ez-agents/bin/lib/skill-validator.cjs +270 -0
- package/ez-agents/bin/lib/skill-versioning.cjs +355 -0
- package/ez-agents/bin/lib/stack-detector.cjs +399 -0
- package/ez-agents/bin/lib/tech-debt-analyzer.cjs +309 -0
- package/ez-agents/bin/lib/tier-manager.cjs +428 -428
- package/ez-agents/bin/lib/tradeoff-analyzer.cjs +284 -0
- package/ez-agents/bin/lib/url-fetch.cjs +170 -170
- package/ez-agents/bin/lib/verify.cjs +863 -863
- package/ez-agents/references/decimal-phase-calculation.md +65 -65
- package/ez-agents/references/git-integration.md +248 -248
- package/ez-agents/references/git-planning-commit.md +38 -38
- package/ez-agents/references/metrics-schema.md +118 -118
- package/ez-agents/references/model-profile-resolution.md +34 -34
- package/ez-agents/references/model-profiles.md +93 -93
- package/ez-agents/references/phase-argument-parsing.md +61 -61
- package/ez-agents/references/planning-config.md +340 -340
- package/ez-agents/references/tier-strategy.md +103 -103
- package/ez-agents/references/ui-brand.md +160 -160
- package/ez-agents/references/verification-patterns.md +612 -612
- package/ez-agents/templates/DEBUG.md +164 -164
- package/ez-agents/templates/UAT.md +247 -247
- package/ez-agents/templates/agent-output-format.md +404 -0
- package/ez-agents/templates/bdd-feature.md +173 -173
- package/ez-agents/templates/codebase/architecture.md +255 -255
- package/ez-agents/templates/codebase/structure.md +285 -285
- package/ez-agents/templates/copilot-instructions.md +7 -7
- package/ez-agents/templates/debug-subagent-prompt.md +91 -91
- package/ez-agents/templates/discovery.md +146 -146
- package/ez-agents/templates/discussion.md +68 -68
- package/ez-agents/templates/handoff-protocol.md +294 -0
- package/ez-agents/templates/incident-runbook.md +205 -205
- package/ez-agents/templates/mode-workflow-templates.md +301 -0
- package/ez-agents/templates/phase-prompt.md +610 -610
- package/ez-agents/templates/planner-subagent-prompt.md +117 -117
- package/ez-agents/templates/project.md +184 -184
- package/ez-agents/templates/release-checklist.md +136 -133
- package/ez-agents/templates/research.md +552 -552
- package/ez-agents/templates/rollback-plan.md +201 -201
- package/ez-agents/templates/security-user-setup.md +244 -0
- package/ez-agents/templates/skill-validation-rules.md +476 -0
- package/ez-agents/templates/state.md +180 -176
- package/ez-agents/templates/summary-complex.md +59 -59
- package/ez-agents/tests/gates/gate-01-02.test.cjs +812 -0
- package/ez-agents/tests/gates/gate-03-04.test.cjs +762 -0
- package/ez-agents/tests/gates/gate-05-validator.test.cjs +145 -0
- package/ez-agents/tests/gates/gate-06-docs-validator.test.cjs +244 -0
- package/ez-agents/tests/gates/gate-07-release-validator.test.cjs +219 -0
- package/ez-agents/tests/guards/context-budget-guard.test.cjs +145 -0
- package/ez-agents/tests/guards/edge-case-guards.test.cjs +238 -0
- package/ez-agents/tests/guards/hallucination-guard.test.cjs +124 -0
- package/ez-agents/workflows/audit-milestone.md +1 -1
- package/ez-agents/workflows/autonomous.md +844 -844
- package/ez-agents/workflows/complete-milestone.md +1 -1
- package/ez-agents/workflows/discuss-phase.md +1 -1
- package/ez-agents/workflows/execute-phase.md +124 -3
- package/ez-agents/workflows/help.md +42 -181
- package/ez-agents/workflows/hotfix.md +291 -291
- package/ez-agents/workflows/new-milestone.md +713 -713
- package/ez-agents/workflows/new-project.md +1089 -1107
- package/ez-agents/workflows/plan-phase.md +0 -40
- package/ez-agents/workflows/release.md +253 -253
- package/ez-agents/workflows/resume-session.md +215 -215
- package/ez-agents/workflows/run-phase.md +531 -0
- package/ez-agents/workflows/settings.md +2 -35
- package/hooks/dist/ez-check-update.js +81 -81
- package/hooks/dist/ez-context-monitor.js +148 -141
- package/hooks/dist/ez-statusline.js +115 -115
- package/package.json +78 -71
- package/scripts/fix-qwen-installation.js +144 -144
- package/agents/ez-integration-checker.md +0 -443
- package/agents/ez-nyquist-auditor.md +0 -176
- package/agents/ez-observer-agent.md +0 -260
- package/agents/ez-plan-checker.md +0 -706
- package/agents/ez-research-synthesizer.md +0 -247
- package/agents/ez-scrum-master-agent.md +0 -242
- package/agents/ez-tech-lead-agent.md +0 -267
- package/agents/ez-ui-auditor.md +0 -439
- package/agents/ez-ui-checker.md +0 -300
- package/agents/ez-ui-researcher.md +0 -353
- package/commands/ez/add-phase.md +0 -43
- package/commands/ez/add-todo.md +0 -47
- package/commands/ez/arch-review.md +0 -102
- package/commands/ez/auth.md +0 -87
- package/commands/ez/autonomous.md +0 -41
- package/commands/ez/check-todos.md +0 -45
- package/commands/ez/cleanup.md +0 -18
- package/commands/ez/debug.md +0 -168
- package/commands/ez/export-session.md +0 -79
- package/commands/ez/gather-requirements.md +0 -117
- package/commands/ez/git-workflow.md +0 -72
- package/commands/ez/health.md +0 -22
- package/commands/ez/hotfix.md +0 -120
- package/commands/ez/import-session.md +0 -82
- package/commands/ez/insert-phase.md +0 -32
- package/commands/ez/join-discord.md +0 -18
- package/commands/ez/list-phase-assumptions.md +0 -46
- package/commands/ez/list-sessions.md +0 -96
- package/commands/ez/package-manager.md +0 -316
- package/commands/ez/pause-work.md +0 -38
- package/commands/ez/plan-milestone-gaps.md +0 -34
- package/commands/ez/preflight.md +0 -79
- package/commands/ez/reapply-patches.md +0 -124
- package/commands/ez/release.md +0 -153
- package/commands/ez/remove-phase.md +0 -31
- package/commands/ez/research-phase.md +0 -190
- package/commands/ez/resume.md +0 -107
- package/commands/ez/set-profile.md +0 -34
- package/commands/ez/standup.md +0 -85
- package/commands/ez/stats.md +0 -18
- package/commands/ez/ui-phase.md +0 -34
- package/commands/ez/ui-review.md +0 -32
- package/commands/ez/validate-phase.md +0 -35
- package/ez-agents/bin/lib/metrics-tracker.cjs +0 -406
- package/ez-agents/templates/UI-SPEC.md +0 -100
- package/ez-agents/templates/VALIDATION.md +0 -76
- package/ez-agents/templates/context.md +0 -352
- package/ez-agents/templates/verification-report.md +0 -322
- package/ez-agents/workflows/arch-review.md +0 -54
- package/ez-agents/workflows/export-session.md +0 -255
- package/ez-agents/workflows/gather-requirements.md +0 -206
- package/ez-agents/workflows/import-session.md +0 -303
- package/ez-agents/workflows/research-phase.md +0 -74
- package/ez-agents/workflows/standup.md +0 -64
- package/ez-agents/workflows/ui-phase.md +0 -290
- package/ez-agents/workflows/ui-review.md +0 -157
- package/ez-agents/workflows/validate-phase.md +0 -167
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: ez:validate-phase
|
|
3
|
-
description: Retroactively audit and fill Nyquist validation gaps for a completed phase
|
|
4
|
-
argument-hint: "[phase number]"
|
|
5
|
-
allowed-tools:
|
|
6
|
-
- Read
|
|
7
|
-
- Write
|
|
8
|
-
- Edit
|
|
9
|
-
- Bash
|
|
10
|
-
- Glob
|
|
11
|
-
- Grep
|
|
12
|
-
- Task
|
|
13
|
-
- AskUserQuestion
|
|
14
|
-
---
|
|
15
|
-
<objective>
|
|
16
|
-
Audit Nyquist validation coverage for a completed phase. Three states:
|
|
17
|
-
- (A) VALIDATION.md exists — audit and fill gaps
|
|
18
|
-
- (B) No VALIDATION.md, SUMMARY.md exists — reconstruct from artifacts
|
|
19
|
-
- (C) Phase not executed — exit with guidance
|
|
20
|
-
|
|
21
|
-
Output: updated VALIDATION.md + generated test files.
|
|
22
|
-
</objective>
|
|
23
|
-
|
|
24
|
-
<execution_context>
|
|
25
|
-
@~/.claude/ez-agents/workflows/validate-phase.md
|
|
26
|
-
</execution_context>
|
|
27
|
-
|
|
28
|
-
<context>
|
|
29
|
-
Phase: $ARGUMENTS — optional, defaults to last completed phase.
|
|
30
|
-
</context>
|
|
31
|
-
|
|
32
|
-
<process>
|
|
33
|
-
Execute @~/.claude/ez-agents/workflows/validate-phase.md.
|
|
34
|
-
Preserve all workflow gates.
|
|
35
|
-
</process>
|
|
@@ -1,406 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Metrics Tracker — Records and queries EZ Agents success metrics
|
|
5
|
-
*
|
|
6
|
-
* Manages .planning/metrics.json: phase velocity, BDD pass rate,
|
|
7
|
-
* defect density, token cost, and DORA-inspired metrics.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
'use strict';
|
|
11
|
-
|
|
12
|
-
const fs = require('fs');
|
|
13
|
-
const path = require('path');
|
|
14
|
-
const { withLock } = require('./file-lock.cjs');
|
|
15
|
-
|
|
16
|
-
const METRICS_PATH = '.planning/metrics.json';
|
|
17
|
-
|
|
18
|
-
// ─────────────────────────────────────────────
|
|
19
|
-
// Metric Thresholds
|
|
20
|
-
// ─────────────────────────────────────────────
|
|
21
|
-
|
|
22
|
-
const METRIC_THRESHOLDS = {
|
|
23
|
-
deviation_rate: { warn: 0.2, bad: 0.4 }, // DORA: change failure rate
|
|
24
|
-
avg_velocity_min: { warn: 120, bad: 240 }, // warn if avg > 2h, bad if > 4h
|
|
25
|
-
bdd_pass_rate: { warn: 0.8, bad: 0.6 }, // MVP: 60%, Medium: 80%
|
|
26
|
-
test_coverage: { warn: 60, bad: 40 } // warn below 60%
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
function getThresholdStatus(value, thresholds, lowerIsBetter = false) {
|
|
30
|
-
if (lowerIsBetter) {
|
|
31
|
-
if (value >= thresholds.bad) return '🔴';
|
|
32
|
-
if (value >= thresholds.warn) return '🟡';
|
|
33
|
-
return '🟢';
|
|
34
|
-
} else {
|
|
35
|
-
if (value <= thresholds.bad) return '🔴';
|
|
36
|
-
if (value <= thresholds.warn) return '🟡';
|
|
37
|
-
return '🟢';
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// ─────────────────────────────────────────────
|
|
42
|
-
// Schema defaults
|
|
43
|
-
// ─────────────────────────────────────────────
|
|
44
|
-
|
|
45
|
-
function defaultMetrics(project) {
|
|
46
|
-
return {
|
|
47
|
-
schema_version: '1.0',
|
|
48
|
-
project: project || 'unknown',
|
|
49
|
-
updated: new Date().toISOString(),
|
|
50
|
-
phase_metrics: [],
|
|
51
|
-
project_metrics: {
|
|
52
|
-
requirements_coverage_pct: 0,
|
|
53
|
-
test_coverage_pct: 0,
|
|
54
|
-
bdd_scenarios_total: 0,
|
|
55
|
-
bdd_scenarios_passing: 0,
|
|
56
|
-
bdd_scenarios_must: 0,
|
|
57
|
-
bdd_scenarios_must_passing: 0
|
|
58
|
-
},
|
|
59
|
-
agent_metrics: {
|
|
60
|
-
total_token_cost_usd: 0,
|
|
61
|
-
avg_cost_per_plan: 0,
|
|
62
|
-
deviation_rate: 0,
|
|
63
|
-
avg_plans_per_phase: 0,
|
|
64
|
-
avg_velocity_min_per_plan: 0
|
|
65
|
-
},
|
|
66
|
-
business_metrics: {
|
|
67
|
-
time_to_first_ship_days: null,
|
|
68
|
-
hotfixes_deployed: 0,
|
|
69
|
-
milestones_shipped: 0,
|
|
70
|
-
current_tier: 'mvp',
|
|
71
|
-
phases_total: 0,
|
|
72
|
-
phases_completed: 0
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// ─────────────────────────────────────────────
|
|
78
|
-
// Load / Save
|
|
79
|
-
// ─────────────────────────────────────────────
|
|
80
|
-
|
|
81
|
-
function loadMetrics(metricsPath = METRICS_PATH) {
|
|
82
|
-
const fullPath = path.resolve(process.cwd(), metricsPath);
|
|
83
|
-
if (!fs.existsSync(fullPath)) {
|
|
84
|
-
return defaultMetrics();
|
|
85
|
-
}
|
|
86
|
-
try {
|
|
87
|
-
return JSON.parse(fs.readFileSync(fullPath, 'utf8'));
|
|
88
|
-
} catch {
|
|
89
|
-
return defaultMetrics();
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
function saveMetrics(metrics, metricsPath = METRICS_PATH) {
|
|
94
|
-
const fullPath = path.resolve(process.cwd(), metricsPath);
|
|
95
|
-
const dir = path.dirname(fullPath);
|
|
96
|
-
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
|
|
97
|
-
metrics.updated = new Date().toISOString();
|
|
98
|
-
fs.writeFileSync(fullPath, JSON.stringify(metrics, null, 2) + '\n', 'utf8');
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
async function saveMetricsLocked(metrics, metricsPath = METRICS_PATH) {
|
|
102
|
-
const fullPath = path.resolve(process.cwd(), metricsPath);
|
|
103
|
-
return withLock(fullPath, async () => {
|
|
104
|
-
saveMetrics(metrics, metricsPath);
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// ─────────────────────────────────────────────
|
|
109
|
-
// Phase Metrics
|
|
110
|
-
// ─────────────────────────────────────────────
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Record phase execution metrics (called by ez-executor after plan completion)
|
|
114
|
-
* @param {object} data - { phase, phase_name, plans_total, plans_completed, velocity_min, deviation_count, tasks_total, cost_usd }
|
|
115
|
-
*/
|
|
116
|
-
async function recordPlanMetrics(data, metricsPath = METRICS_PATH) {
|
|
117
|
-
const fullPath = path.resolve(process.cwd(), metricsPath);
|
|
118
|
-
return withLock(fullPath, async () => {
|
|
119
|
-
const metrics = loadMetrics(metricsPath); // read INSIDE lock
|
|
120
|
-
|
|
121
|
-
const existing = metrics.phase_metrics.find(m => m.phase === data.phase);
|
|
122
|
-
if (existing) {
|
|
123
|
-
// Update existing phase entry
|
|
124
|
-
Object.assign(existing, {
|
|
125
|
-
plans_completed: data.plans_completed || existing.plans_completed,
|
|
126
|
-
velocity_min: data.velocity_min || existing.velocity_min,
|
|
127
|
-
deviation_count: (existing.deviation_count || 0) + (data.deviation_count || 0),
|
|
128
|
-
defect_density: data.tasks_total > 0
|
|
129
|
-
? ((existing.deviation_count || 0) + (data.deviation_count || 0)) / data.tasks_total
|
|
130
|
-
: existing.defect_density
|
|
131
|
-
});
|
|
132
|
-
} else {
|
|
133
|
-
metrics.phase_metrics.push({
|
|
134
|
-
phase: data.phase,
|
|
135
|
-
phase_name: data.phase_name || `phase-${data.phase}`,
|
|
136
|
-
plans_total: data.plans_total || 0,
|
|
137
|
-
plans_completed: data.plans_completed || 0,
|
|
138
|
-
velocity_min: data.velocity_min || 0,
|
|
139
|
-
defect_density: data.tasks_total > 0 ? (data.deviation_count || 0) / data.tasks_total : 0,
|
|
140
|
-
bdd_pass_rate: null, // filled by verifier
|
|
141
|
-
bdd_must_passing: null,
|
|
142
|
-
bdd_must_total: null,
|
|
143
|
-
deviation_count: data.deviation_count || 0,
|
|
144
|
-
completed_at: new Date().toISOString()
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// Update agent metrics
|
|
149
|
-
if (data.cost_usd) {
|
|
150
|
-
metrics.agent_metrics.total_token_cost_usd =
|
|
151
|
-
(metrics.agent_metrics.total_token_cost_usd || 0) + data.cost_usd;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// Recalculate averages
|
|
155
|
-
_recalcAverages(metrics);
|
|
156
|
-
saveMetrics(metrics, metricsPath); // write INSIDE lock
|
|
157
|
-
return metrics.phase_metrics.find(m => m.phase === data.phase);
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Record BDD verification results (called by ez-verifier)
|
|
163
|
-
* @param {object} data - { phase, bdd_must_passing, bdd_must_total, bdd_pass_rate, test_coverage_pct }
|
|
164
|
-
*/
|
|
165
|
-
async function recordBddMetrics(data, metricsPath = METRICS_PATH) {
|
|
166
|
-
const fullPath = path.resolve(process.cwd(), metricsPath);
|
|
167
|
-
return withLock(fullPath, async () => {
|
|
168
|
-
const metrics = loadMetrics(metricsPath); // read INSIDE lock
|
|
169
|
-
|
|
170
|
-
const phaseEntry = metrics.phase_metrics.find(m => m.phase === data.phase);
|
|
171
|
-
if (phaseEntry) {
|
|
172
|
-
phaseEntry.bdd_pass_rate = data.bdd_pass_rate;
|
|
173
|
-
phaseEntry.bdd_must_passing = data.bdd_must_passing;
|
|
174
|
-
phaseEntry.bdd_must_total = data.bdd_must_total;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
if (data.test_coverage_pct !== undefined) {
|
|
178
|
-
metrics.project_metrics.test_coverage_pct = data.test_coverage_pct;
|
|
179
|
-
}
|
|
180
|
-
if (data.bdd_must_passing !== undefined) {
|
|
181
|
-
metrics.project_metrics.bdd_scenarios_must_passing = data.bdd_must_passing;
|
|
182
|
-
metrics.project_metrics.bdd_scenarios_must = data.bdd_must_total;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
saveMetrics(metrics, metricsPath); // write INSIDE lock
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Record release event (called by ez-release-agent)
|
|
191
|
-
* @param {object} data - { tier, version, is_hotfix }
|
|
192
|
-
*/
|
|
193
|
-
async function recordRelease(data, metricsPath = METRICS_PATH) {
|
|
194
|
-
const fullPath = path.resolve(process.cwd(), metricsPath);
|
|
195
|
-
return withLock(fullPath, async () => {
|
|
196
|
-
const metrics = loadMetrics(metricsPath); // read INSIDE lock
|
|
197
|
-
|
|
198
|
-
if (data.is_hotfix) {
|
|
199
|
-
metrics.business_metrics.hotfixes_deployed =
|
|
200
|
-
(metrics.business_metrics.hotfixes_deployed || 0) + 1;
|
|
201
|
-
} else {
|
|
202
|
-
metrics.business_metrics.milestones_shipped =
|
|
203
|
-
(metrics.business_metrics.milestones_shipped || 0) + 1;
|
|
204
|
-
|
|
205
|
-
if (!metrics.business_metrics.first_ship_date) {
|
|
206
|
-
metrics.business_metrics.first_ship_date = new Date().toISOString();
|
|
207
|
-
// Calculate time to first ship from project init
|
|
208
|
-
const planningStateFile = '.planning/STATE.md';
|
|
209
|
-
if (fs.existsSync(planningStateFile)) {
|
|
210
|
-
const stat = fs.statSync(planningStateFile);
|
|
211
|
-
const initDate = stat.birthtime || stat.mtime;
|
|
212
|
-
const days = Math.ceil((Date.now() - initDate.getTime()) / (1000 * 60 * 60 * 24));
|
|
213
|
-
metrics.business_metrics.time_to_first_ship_days = days;
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
if (data.tier) {
|
|
219
|
-
metrics.business_metrics.current_tier = data.tier;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
saveMetrics(metrics, metricsPath); // write INSIDE lock
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
/**
|
|
227
|
-
* Update project-level metrics
|
|
228
|
-
* @param {object} data - { requirements_coverage_pct, phases_total, phases_completed }
|
|
229
|
-
*/
|
|
230
|
-
async function updateProjectMetrics(data, metricsPath = METRICS_PATH) {
|
|
231
|
-
const fullPath = path.resolve(process.cwd(), metricsPath);
|
|
232
|
-
return withLock(fullPath, async () => {
|
|
233
|
-
const metrics = loadMetrics(metricsPath); // read INSIDE lock
|
|
234
|
-
Object.assign(metrics.project_metrics, data);
|
|
235
|
-
Object.assign(metrics.business_metrics, {
|
|
236
|
-
phases_total: data.phases_total || metrics.business_metrics.phases_total,
|
|
237
|
-
phases_completed: data.phases_completed || metrics.business_metrics.phases_completed
|
|
238
|
-
});
|
|
239
|
-
saveMetrics(metrics, metricsPath); // write INSIDE lock
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
// ─────────────────────────────────────────────
|
|
244
|
-
// Dashboard
|
|
245
|
-
// ─────────────────────────────────────────────
|
|
246
|
-
|
|
247
|
-
/**
|
|
248
|
-
* Generate enhanced /ez:stats dashboard
|
|
249
|
-
* @param {string} metricsPath
|
|
250
|
-
* @returns {string} Formatted dashboard
|
|
251
|
-
*/
|
|
252
|
-
function generateDashboard(metricsPath = METRICS_PATH) {
|
|
253
|
-
const metrics = loadMetrics(metricsPath);
|
|
254
|
-
const pm = metrics.project_metrics;
|
|
255
|
-
const am = metrics.agent_metrics;
|
|
256
|
-
const bm = metrics.business_metrics;
|
|
257
|
-
|
|
258
|
-
// Velocity trend
|
|
259
|
-
const phases = metrics.phase_metrics.slice(-5);
|
|
260
|
-
let velocityTrend = '→ STABLE';
|
|
261
|
-
if (phases.length >= 3) {
|
|
262
|
-
const recent = phases.slice(-2).reduce((sum, p) => sum + (p.velocity_min || 0), 0) / 2;
|
|
263
|
-
const older = phases.slice(0, -2).reduce((sum, p) => sum + (p.velocity_min || 0), 0) / Math.max(1, phases.length - 2);
|
|
264
|
-
if (recent < older * 0.9) velocityTrend = '↑ IMPROVING';
|
|
265
|
-
else if (recent > older * 1.1) velocityTrend = '↓ SLOWING';
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
// BDD status
|
|
269
|
-
const bddRate = pm.bdd_scenarios_must > 0
|
|
270
|
-
? Math.round((pm.bdd_scenarios_must_passing / pm.bdd_scenarios_must) * 100)
|
|
271
|
-
: null;
|
|
272
|
-
|
|
273
|
-
// Cost estimate remaining
|
|
274
|
-
const remainingPhases = (bm.phases_total || 0) - (bm.phases_completed || 0);
|
|
275
|
-
const costEst = am.avg_cost_per_plan > 0 && am.avg_plans_per_phase > 0
|
|
276
|
-
? (remainingPhases * am.avg_plans_per_phase * am.avg_cost_per_plan).toFixed(2)
|
|
277
|
-
: null;
|
|
278
|
-
|
|
279
|
-
const lines = [
|
|
280
|
-
'━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━',
|
|
281
|
-
' EZ ► PROJECT METRICS DASHBOARD',
|
|
282
|
-
'━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━',
|
|
283
|
-
'',
|
|
284
|
-
`PROGRESS: Phase ${bm.phases_completed || '?'}/${bm.phases_total || '?'} (${bm.phases_total ? Math.round((bm.phases_completed / bm.phases_total) * 100) : '?'}%) | Requirements ${pm.requirements_coverage_pct || 0}%${bddRate !== null ? ` | BDD @must ${bddRate}% (est.)` : ''}`,
|
|
285
|
-
`VELOCITY: ${am.avg_velocity_min_per_plan || '?'} min/plan avg | Trend: ${velocityTrend}`,
|
|
286
|
-
];
|
|
287
|
-
|
|
288
|
-
// Fix 12: QUALITY line with threshold indicators
|
|
289
|
-
const coveragePct = pm.test_coverage_pct || 0;
|
|
290
|
-
const deviationRate = am.deviation_rate || 0;
|
|
291
|
-
const coverageIcon = getThresholdStatus(coveragePct, METRIC_THRESHOLDS.test_coverage);
|
|
292
|
-
const deviationIcon = getThresholdStatus(deviationRate, METRIC_THRESHOLDS.deviation_rate, true);
|
|
293
|
-
const deviationPct = Math.round(deviationRate * 100);
|
|
294
|
-
lines.push(`QUALITY: ${coverageIcon} Coverage ${coveragePct}% | ${deviationIcon} Deviation ${deviationPct}%${deviationRate >= METRIC_THRESHOLDS.deviation_rate.warn ? ` (warn: >${Math.round(METRIC_THRESHOLDS.deviation_rate.warn * 100)}%)` : ''} | Defect density ${am.deviation_rate ? am.deviation_rate.toFixed(2) : '?'}`);
|
|
295
|
-
lines.push(`COSTS: $${(am.total_token_cost_usd || 0).toFixed(2)} total | $${(am.avg_cost_per_plan || 0).toFixed(2)}/plan${costEst ? ` | Est. remaining: ~$${costEst}` : ''}`);
|
|
296
|
-
lines.push(`RELEASE: Tier: ${bm.current_tier || 'mvp'} | Hotfixes: ${bm.hotfixes_deployed || 0} | Ships: ${bm.milestones_shipped || 0}`);
|
|
297
|
-
lines.push('');
|
|
298
|
-
|
|
299
|
-
if (metrics.phase_metrics.length > 0) {
|
|
300
|
-
lines.push('Recent Phases:');
|
|
301
|
-
for (const p of metrics.phase_metrics.slice(-5).reverse()) {
|
|
302
|
-
const bdd = p.bdd_pass_rate !== null && p.bdd_pass_rate !== undefined
|
|
303
|
-
? ` | BDD ${Math.round(p.bdd_pass_rate * 100)}%`
|
|
304
|
-
: '';
|
|
305
|
-
lines.push(` Phase ${p.phase} ${p.phase_name}: ${p.velocity_min || '?'}min | dev:${(p.defect_density || 0).toFixed(2)}${bdd}`);
|
|
306
|
-
}
|
|
307
|
-
lines.push('');
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
// Fix 12: Cost projection alert
|
|
311
|
-
if (am.total_token_cost_usd > 5) {
|
|
312
|
-
const projectedTotal = costEst ? parseFloat(costEst) + am.total_token_cost_usd : null;
|
|
313
|
-
if (projectedTotal && projectedTotal > 30) {
|
|
314
|
-
lines.push(`⚠ COST ALERT: Projected total ~$${projectedTotal.toFixed(0)}. Consider disabling scrum_master_standup for budget tiers.`);
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
lines.push('─────────────────────────────────────────────────────');
|
|
319
|
-
lines.push('⚠ BDD rates are ESTIMATED (scenario existence, not test runs).');
|
|
320
|
-
lines.push(' For actual pass rates, configure a BDD runner (Jest/Cucumber/Playwright).');
|
|
321
|
-
lines.push('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
322
|
-
|
|
323
|
-
return lines.join('\n');
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
// ─────────────────────────────────────────────
|
|
327
|
-
// Internal helpers
|
|
328
|
-
// ─────────────────────────────────────────────
|
|
329
|
-
|
|
330
|
-
function _recalcAverages(metrics) {
|
|
331
|
-
const phases = metrics.phase_metrics;
|
|
332
|
-
if (phases.length === 0) return;
|
|
333
|
-
|
|
334
|
-
const withVelocity = phases.filter(p => p.velocity_min > 0);
|
|
335
|
-
if (withVelocity.length > 0) {
|
|
336
|
-
metrics.agent_metrics.avg_velocity_min_per_plan =
|
|
337
|
-
Math.round(withVelocity.reduce((sum, p) => sum + p.velocity_min, 0) / withVelocity.length);
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
const totalDeviations = phases.reduce((sum, p) => sum + (p.deviation_count || 0), 0);
|
|
341
|
-
const totalPlans = phases.reduce((sum, p) => sum + (p.plans_completed || 0), 0);
|
|
342
|
-
if (totalPlans > 0) {
|
|
343
|
-
metrics.agent_metrics.deviation_rate = parseFloat((totalDeviations / totalPlans).toFixed(3));
|
|
344
|
-
metrics.agent_metrics.avg_plans_per_phase = parseFloat((totalPlans / phases.length).toFixed(1));
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
if (metrics.agent_metrics.total_token_cost_usd > 0 && totalPlans > 0) {
|
|
348
|
-
metrics.agent_metrics.avg_cost_per_plan =
|
|
349
|
-
parseFloat((metrics.agent_metrics.total_token_cost_usd / totalPlans).toFixed(3));
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
// ─────────────────────────────────────────────
|
|
354
|
-
// CLI
|
|
355
|
-
// ─────────────────────────────────────────────
|
|
356
|
-
|
|
357
|
-
if (require.main === module) {
|
|
358
|
-
const args = process.argv.slice(2);
|
|
359
|
-
const cmd = args[0];
|
|
360
|
-
|
|
361
|
-
(async () => {
|
|
362
|
-
try {
|
|
363
|
-
if (cmd === 'record-plan') {
|
|
364
|
-
const data = JSON.parse(args[1] || '{}');
|
|
365
|
-
const result = await recordPlanMetrics(data);
|
|
366
|
-
console.log(JSON.stringify({ recorded: true, phase: result }));
|
|
367
|
-
} else if (cmd === 'record-bdd') {
|
|
368
|
-
const data = JSON.parse(args[1] || '{}');
|
|
369
|
-
await recordBddMetrics(data);
|
|
370
|
-
console.log(JSON.stringify({ recorded: true }));
|
|
371
|
-
} else if (cmd === 'record-release') {
|
|
372
|
-
const data = JSON.parse(args[1] || '{}');
|
|
373
|
-
await recordRelease(data);
|
|
374
|
-
console.log(JSON.stringify({ recorded: true }));
|
|
375
|
-
} else if (cmd === 'update-project') {
|
|
376
|
-
const data = JSON.parse(args[1] || '{}');
|
|
377
|
-
await updateProjectMetrics(data);
|
|
378
|
-
console.log(JSON.stringify({ updated: true }));
|
|
379
|
-
} else if (cmd === 'dashboard') {
|
|
380
|
-
console.log(generateDashboard());
|
|
381
|
-
} else if (cmd === 'get') {
|
|
382
|
-
const metrics = loadMetrics();
|
|
383
|
-
console.log(JSON.stringify(metrics, null, 2));
|
|
384
|
-
} else {
|
|
385
|
-
console.error('Commands: record-plan, record-bdd, record-release, update-project, dashboard, get');
|
|
386
|
-
process.exit(1);
|
|
387
|
-
}
|
|
388
|
-
} catch (err) {
|
|
389
|
-
console.error(`Error: ${err.message}`);
|
|
390
|
-
process.exit(1);
|
|
391
|
-
}
|
|
392
|
-
})();
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
module.exports = {
|
|
396
|
-
loadMetrics,
|
|
397
|
-
saveMetrics,
|
|
398
|
-
saveMetricsLocked,
|
|
399
|
-
recordPlanMetrics,
|
|
400
|
-
recordBddMetrics,
|
|
401
|
-
recordRelease,
|
|
402
|
-
updateProjectMetrics,
|
|
403
|
-
generateDashboard,
|
|
404
|
-
METRIC_THRESHOLDS,
|
|
405
|
-
getThresholdStatus
|
|
406
|
-
};
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
phase: {N}
|
|
3
|
-
slug: {phase-slug}
|
|
4
|
-
status: draft
|
|
5
|
-
shadcn_initialized: false
|
|
6
|
-
preset: none
|
|
7
|
-
created: {date}
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Phase {N} — UI Design Contract
|
|
11
|
-
|
|
12
|
-
> Visual and interaction contract for frontend phases. Generated by ez-ui-researcher, verified by ez-ui-checker.
|
|
13
|
-
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
## Design System
|
|
17
|
-
|
|
18
|
-
| Property | Value |
|
|
19
|
-
|----------|-------|
|
|
20
|
-
| Tool | {shadcn / none} |
|
|
21
|
-
| Preset | {preset string or "not applicable"} |
|
|
22
|
-
| Component library | {radix / base-ui / none} |
|
|
23
|
-
| Icon library | {library} |
|
|
24
|
-
| Font | {font} |
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
## Spacing Scale
|
|
29
|
-
|
|
30
|
-
Declared values (must be multiples of 4):
|
|
31
|
-
|
|
32
|
-
| Token | Value | Usage |
|
|
33
|
-
|-------|-------|-------|
|
|
34
|
-
| xs | 4px | Icon gaps, inline padding |
|
|
35
|
-
| sm | 8px | Compact element spacing |
|
|
36
|
-
| md | 16px | Default element spacing |
|
|
37
|
-
| lg | 24px | Section padding |
|
|
38
|
-
| xl | 32px | Layout gaps |
|
|
39
|
-
| 2xl | 48px | Major section breaks |
|
|
40
|
-
| 3xl | 64px | Page-level spacing |
|
|
41
|
-
|
|
42
|
-
Exceptions: {list any, or "none"}
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
## Typography
|
|
47
|
-
|
|
48
|
-
| Role | Size | Weight | Line Height |
|
|
49
|
-
|------|------|--------|-------------|
|
|
50
|
-
| Body | {px} | {weight} | {ratio} |
|
|
51
|
-
| Label | {px} | {weight} | {ratio} |
|
|
52
|
-
| Heading | {px} | {weight} | {ratio} |
|
|
53
|
-
| Display | {px} | {weight} | {ratio} |
|
|
54
|
-
|
|
55
|
-
---
|
|
56
|
-
|
|
57
|
-
## Color
|
|
58
|
-
|
|
59
|
-
| Role | Value | Usage |
|
|
60
|
-
|------|-------|-------|
|
|
61
|
-
| Dominant (60%) | {hex} | Background, surfaces |
|
|
62
|
-
| Secondary (30%) | {hex} | Cards, sidebar, nav |
|
|
63
|
-
| Accent (10%) | {hex} | {list specific elements only} |
|
|
64
|
-
| Destructive | {hex} | Destructive actions only |
|
|
65
|
-
|
|
66
|
-
Accent reserved for: {explicit list — never "all interactive elements"}
|
|
67
|
-
|
|
68
|
-
---
|
|
69
|
-
|
|
70
|
-
## Copywriting Contract
|
|
71
|
-
|
|
72
|
-
| Element | Copy |
|
|
73
|
-
|---------|------|
|
|
74
|
-
| Primary CTA | {specific verb + noun} |
|
|
75
|
-
| Empty state heading | {copy} |
|
|
76
|
-
| Empty state body | {copy + next step} |
|
|
77
|
-
| Error state | {problem + solution path} |
|
|
78
|
-
| Destructive confirmation | {action name}: {confirmation copy} |
|
|
79
|
-
|
|
80
|
-
---
|
|
81
|
-
|
|
82
|
-
## Registry Safety
|
|
83
|
-
|
|
84
|
-
| Registry | Blocks Used | Safety Gate |
|
|
85
|
-
|----------|-------------|-------------|
|
|
86
|
-
| shadcn official | {list} | not required |
|
|
87
|
-
| {third-party name} | {list} | shadcn view + diff required |
|
|
88
|
-
|
|
89
|
-
---
|
|
90
|
-
|
|
91
|
-
## Checker Sign-Off
|
|
92
|
-
|
|
93
|
-
- [ ] Dimension 1 Copywriting: PASS
|
|
94
|
-
- [ ] Dimension 2 Visuals: PASS
|
|
95
|
-
- [ ] Dimension 3 Color: PASS
|
|
96
|
-
- [ ] Dimension 4 Typography: PASS
|
|
97
|
-
- [ ] Dimension 5 Spacing: PASS
|
|
98
|
-
- [ ] Dimension 6 Registry Safety: PASS
|
|
99
|
-
|
|
100
|
-
**Approval:** {pending / approved YYYY-MM-DD}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
phase: {N}
|
|
3
|
-
slug: {phase-slug}
|
|
4
|
-
status: draft
|
|
5
|
-
nyquist_compliant: false
|
|
6
|
-
wave_0_complete: false
|
|
7
|
-
created: {date}
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Phase {N} — Validation Strategy
|
|
11
|
-
|
|
12
|
-
> Per-phase validation contract for feedback sampling during execution.
|
|
13
|
-
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
## Test Infrastructure
|
|
17
|
-
|
|
18
|
-
| Property | Value |
|
|
19
|
-
|----------|-------|
|
|
20
|
-
| **Framework** | {pytest 7.x / jest 29.x / vitest / go test / other} |
|
|
21
|
-
| **Config file** | {path or "none — Wave 0 installs"} |
|
|
22
|
-
| **Quick run command** | `{quick command}` |
|
|
23
|
-
| **Full suite command** | `{full command}` |
|
|
24
|
-
| **Estimated runtime** | ~{N} seconds |
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
## Sampling Rate
|
|
29
|
-
|
|
30
|
-
- **After every task commit:** Run `{quick run command}`
|
|
31
|
-
- **After every plan wave:** Run `{full suite command}`
|
|
32
|
-
- **Before `/ez:verify-work`:** Full suite must be green
|
|
33
|
-
- **Max feedback latency:** {N} seconds
|
|
34
|
-
|
|
35
|
-
---
|
|
36
|
-
|
|
37
|
-
## Per-Task Verification Map
|
|
38
|
-
|
|
39
|
-
| Task ID | Plan | Wave | Requirement | Test Type | Automated Command | File Exists | Status |
|
|
40
|
-
|---------|------|------|-------------|-----------|-------------------|-------------|--------|
|
|
41
|
-
| {N}-01-01 | 01 | 1 | REQ-{XX} | unit | `{command}` | ✅ / ❌ W0 | ⬜ pending |
|
|
42
|
-
|
|
43
|
-
*Status: ⬜ pending · ✅ green · ❌ red · ⚠️ flaky*
|
|
44
|
-
|
|
45
|
-
---
|
|
46
|
-
|
|
47
|
-
## Wave 0 Requirements
|
|
48
|
-
|
|
49
|
-
- [ ] `{tests/test_file.py}` — stubs for REQ-{XX}
|
|
50
|
-
- [ ] `{tests/conftest.py}` — shared fixtures
|
|
51
|
-
- [ ] `{framework install}` — if no framework detected
|
|
52
|
-
|
|
53
|
-
*If none: "Existing infrastructure covers all phase requirements."*
|
|
54
|
-
|
|
55
|
-
---
|
|
56
|
-
|
|
57
|
-
## Manual-Only Verifications
|
|
58
|
-
|
|
59
|
-
| Behavior | Requirement | Why Manual | Test Instructions |
|
|
60
|
-
|----------|-------------|------------|-------------------|
|
|
61
|
-
| {behavior} | REQ-{XX} | {reason} | {steps} |
|
|
62
|
-
|
|
63
|
-
*If none: "All phase behaviors have automated verification."*
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
## Validation Sign-Off
|
|
68
|
-
|
|
69
|
-
- [ ] All tasks have `<automated>` verify or Wave 0 dependencies
|
|
70
|
-
- [ ] Sampling continuity: no 3 consecutive tasks without automated verify
|
|
71
|
-
- [ ] Wave 0 covers all MISSING references
|
|
72
|
-
- [ ] No watch-mode flags
|
|
73
|
-
- [ ] Feedback latency < {N}s
|
|
74
|
-
- [ ] `nyquist_compliant: true` set in frontmatter
|
|
75
|
-
|
|
76
|
-
**Approval:** {pending / approved YYYY-MM-DD}
|