claude-code-pilot 2.0.0 → 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/bin/install.js +267 -250
- package/manifest.json +5 -18
- package/package.json +5 -7
- package/src/agents/build-error-resolver.md +114 -0
- package/src/agents/ccp-advisor-researcher.md +104 -0
- package/src/agents/ccp-assumptions-analyzer.md +105 -0
- package/{gsd/agents/gsd-codebase-mapper.md → src/agents/ccp-codebase-mapper.md} +7 -7
- package/{gsd/agents/gsd-debugger.md → src/agents/ccp-debugger.md} +125 -8
- package/{gsd/agents/gsd-executor.md → src/agents/ccp-executor.md} +31 -20
- package/{gsd/agents/gsd-integration-checker.md → src/agents/ccp-integration-checker.md} +2 -2
- package/{gsd/agents/gsd-nyquist-auditor.md → src/agents/ccp-nyquist-auditor.md} +3 -3
- package/{gsd/agents/gsd-phase-researcher.md → src/agents/ccp-phase-researcher.md} +127 -13
- package/{gsd/agents/gsd-plan-checker.md → src/agents/ccp-plan-checker.md} +57 -21
- package/{gsd/agents/gsd-planner.md → src/agents/ccp-planner.md} +61 -23
- package/{gsd/agents/gsd-project-researcher.md → src/agents/ccp-project-researcher.md} +33 -6
- package/{gsd/agents/gsd-research-synthesizer.md → src/agents/ccp-research-synthesizer.md} +11 -11
- package/{gsd/agents/gsd-roadmapper.md → src/agents/ccp-roadmapper.md} +39 -10
- package/src/agents/ccp-ui-auditor.md +439 -0
- package/src/agents/ccp-ui-checker.md +300 -0
- package/src/agents/ccp-ui-researcher.md +357 -0
- package/{gsd/agents/gsd-verifier.md → src/agents/ccp-verifier.md} +81 -15
- package/src/agents/cpp-build-resolver.md +90 -0
- package/src/agents/cpp-reviewer.md +72 -0
- package/src/agents/database-reviewer.md +91 -0
- package/src/agents/docs-lookup.md +68 -0
- package/src/agents/flutter-reviewer.md +243 -0
- package/src/agents/go-build-resolver.md +94 -0
- package/src/agents/go-reviewer.md +76 -0
- package/src/agents/java-build-resolver.md +153 -0
- package/src/agents/java-reviewer.md +92 -0
- package/src/agents/kotlin-build-resolver.md +118 -0
- package/src/agents/kotlin-reviewer.md +159 -0
- package/src/agents/planner.md +212 -0
- package/src/agents/python-reviewer.md +98 -0
- package/src/agents/pytorch-build-resolver.md +120 -0
- package/src/agents/refactor-cleaner.md +85 -0
- package/src/agents/rust-build-resolver.md +148 -0
- package/src/agents/rust-reviewer.md +94 -0
- package/src/agents/typescript-reviewer.md +112 -0
- package/src/available-rules/README.md +80 -0
- package/src/available-rules/cpp/coding-style.md +44 -0
- package/src/available-rules/cpp/hooks.md +39 -0
- package/src/available-rules/cpp/patterns.md +51 -0
- package/src/available-rules/cpp/security.md +51 -0
- package/src/available-rules/cpp/testing.md +44 -0
- package/src/available-rules/csharp/coding-style.md +72 -0
- package/src/available-rules/csharp/hooks.md +25 -0
- package/src/available-rules/csharp/patterns.md +50 -0
- package/src/available-rules/csharp/security.md +58 -0
- package/src/available-rules/csharp/testing.md +46 -0
- package/src/available-rules/java/coding-style.md +114 -0
- package/src/available-rules/java/hooks.md +18 -0
- package/src/available-rules/java/patterns.md +146 -0
- package/src/available-rules/java/security.md +100 -0
- package/src/available-rules/java/testing.md +131 -0
- package/src/available-rules/kotlin/hooks.md +17 -0
- package/src/available-rules/rust/coding-style.md +151 -0
- package/src/available-rules/rust/hooks.md +16 -0
- package/src/available-rules/rust/patterns.md +168 -0
- package/src/available-rules/rust/security.md +141 -0
- package/src/available-rules/rust/testing.md +154 -0
- package/src/commands/aside.md +164 -0
- package/src/commands/build-fix.md +62 -0
- package/src/commands/ccp/add-backlog.md +76 -0
- package/{gsd/commands-gsd → src/commands/ccp}/add-phase.md +3 -3
- package/{gsd/commands-gsd → src/commands/ccp}/add-tests.md +5 -5
- package/{gsd/commands-gsd → src/commands/ccp}/add-todo.md +4 -4
- package/{gsd/commands-gsd → src/commands/ccp}/audit-milestone.md +3 -3
- package/src/commands/ccp/audit-uat.md +24 -0
- package/src/commands/ccp/autonomous.md +41 -0
- package/{gsd/commands-gsd → src/commands/ccp}/check-todos.md +3 -3
- package/{gsd/commands-gsd → src/commands/ccp}/cleanup.md +3 -3
- package/{gsd/commands-gsd → src/commands/ccp}/complete-milestone.md +9 -9
- package/{gsd/commands-gsd → src/commands/ccp}/debug.md +14 -9
- package/src/commands/ccp/discuss-phase.md +64 -0
- package/src/commands/ccp/do.md +30 -0
- package/src/commands/ccp/execute-phase.md +59 -0
- package/src/commands/ccp/fast.md +30 -0
- package/src/commands/ccp/forensics.md +56 -0
- package/{gsd/commands-gsd → src/commands/ccp}/health.md +3 -3
- package/{gsd/commands-gsd → src/commands/ccp}/help.md +5 -5
- package/{gsd/commands-gsd → src/commands/ccp}/insert-phase.md +3 -3
- package/{gsd/commands-gsd → src/commands/ccp}/list-phase-assumptions.md +2 -2
- package/src/commands/ccp/manager.md +39 -0
- package/{gsd/commands-gsd → src/commands/ccp}/map-codebase.md +7 -7
- package/src/commands/ccp/milestone-summary.md +51 -0
- package/{gsd/commands-gsd → src/commands/ccp}/new-milestone.md +8 -8
- package/{gsd/commands-gsd → src/commands/ccp}/new-project.md +8 -8
- package/src/commands/ccp/next.md +24 -0
- package/src/commands/ccp/note.md +34 -0
- package/{gsd/commands-gsd → src/commands/ccp}/pause-work.md +3 -3
- package/{gsd/commands-gsd → src/commands/ccp}/plan-milestone-gaps.md +5 -5
- package/{gsd/commands-gsd → src/commands/ccp}/plan-phase.md +9 -7
- package/src/commands/ccp/plant-seed.md +28 -0
- package/src/commands/ccp/pr-branch.md +25 -0
- package/{gsd/commands-gsd → src/commands/ccp}/progress.md +3 -3
- package/{gsd/commands-gsd → src/commands/ccp}/quick.md +10 -8
- package/{gsd/commands-gsd → src/commands/ccp}/remove-phase.md +3 -3
- package/{gsd/commands-gsd → src/commands/ccp}/research-phase.md +17 -12
- package/{gsd/commands-gsd → src/commands/ccp}/resume-work.md +3 -3
- package/src/commands/ccp/review-backlog.md +61 -0
- package/src/commands/ccp/session-report.md +19 -0
- package/src/commands/ccp/set-profile.md +12 -0
- package/{gsd/commands-gsd → src/commands/ccp}/settings.md +5 -5
- package/src/commands/ccp/ship.md +23 -0
- package/src/commands/ccp/stats.md +18 -0
- package/src/commands/ccp/thread.md +127 -0
- package/src/commands/ccp/ui-phase.md +34 -0
- package/src/commands/ccp/ui-review.md +32 -0
- package/{gsd/commands-gsd → src/commands/ccp}/update.md +5 -5
- package/{gsd/commands-gsd → src/commands/ccp}/validate-phase.md +3 -3
- package/{gsd/commands-gsd → src/commands/ccp}/verify-work.md +5 -5
- package/src/commands/code-review.md +40 -0
- package/src/commands/context-budget.md +29 -0
- package/src/commands/cpp-build.md +173 -0
- package/src/commands/cpp-review.md +132 -0
- package/src/commands/cpp-test.md +251 -0
- package/src/commands/docs.md +31 -0
- package/src/commands/e2e.md +364 -0
- package/src/commands/eval.md +120 -0
- package/{ecc → src}/commands/evolve.md +2 -2
- package/src/commands/go-build.md +183 -0
- package/src/commands/go-review.md +148 -0
- package/src/commands/go-test.md +268 -0
- package/src/commands/gradle-build.md +70 -0
- package/src/commands/harness-audit.md +71 -0
- package/src/commands/kotlin-build.md +174 -0
- package/src/commands/kotlin-review.md +140 -0
- package/src/commands/kotlin-test.md +312 -0
- package/src/commands/orchestrate.md +231 -0
- package/src/commands/plan.md +114 -0
- package/src/commands/prompt-optimize.md +38 -0
- package/src/commands/prune.md +25 -0
- package/src/commands/python-review.md +297 -0
- package/{ecc → src}/commands/quality-gate.md +1 -1
- package/src/commands/refactor-clean.md +80 -0
- package/src/commands/rules-distill.md +11 -0
- package/src/commands/rust-build.md +187 -0
- package/src/commands/rust-review.md +142 -0
- package/src/commands/rust-test.md +308 -0
- package/{ecc → src}/commands/sessions.md +10 -10
- package/src/commands/setup-pm.md +80 -0
- package/{kit → src}/commands/setup.md +45 -19
- package/src/commands/skill-create.md +172 -0
- package/src/commands/skill-health.md +51 -0
- package/src/commands/tdd.md +328 -0
- package/src/commands/test-coverage.md +69 -0
- package/src/commands/update-codemaps.md +72 -0
- package/src/commands/update-docs.md +84 -0
- package/{gsd/hooks/gsd-context-monitor.js → src/hooks/ccp-context-monitor.js} +3 -3
- package/src/hooks/ccp-prompt-guard.js +96 -0
- package/{gsd/hooks/gsd-statusline.js → src/hooks/ccp-statusline.js} +7 -7
- package/src/hooks/ccp-workflow-guard.js +94 -0
- package/src/hooks/config-protection.js +141 -0
- package/{kit → src}/hooks/kit-check-update.js +7 -4
- package/src/hooks/mcp-health-check.js +620 -0
- package/{ecc/scripts → src}/hooks/run-with-flags-shell.sh +1 -1
- package/{ecc/scripts → src}/hooks/run-with-flags.js +74 -13
- package/src/hooks/session-end-marker.js +29 -0
- package/{ecc/scripts → src}/hooks/session-end.js +83 -40
- package/{ecc/scripts → src}/hooks/session-start.js +75 -9
- package/{ecc/scripts → src}/lib/hook-flags.js +8 -4
- package/{ecc/scripts → src}/lib/project-detect.js +2 -1
- package/{ecc/scripts → src}/lib/session-manager.d.ts +5 -1
- package/{ecc/scripts → src}/lib/session-manager.js +202 -92
- package/{ecc/scripts → src}/lib/utils.d.ts +23 -1
- package/{ecc/scripts → src}/lib/utils.js +91 -3
- package/{gsd/get-shit-done/bin/gsd-tools.cjs → src/pilot/bin/ccp-tools.cjs} +257 -86
- package/{gsd/get-shit-done → src/pilot}/bin/lib/commands.cjs +1 -1
- package/src/pilot/bin/lib/config.cjs +444 -0
- package/src/pilot/bin/lib/core.cjs +1190 -0
- package/src/pilot/bin/lib/init.cjs +1281 -0
- package/src/pilot/bin/lib/model-profiles.cjs +67 -0
- package/{gsd/get-shit-done → src/pilot}/bin/lib/phase.cjs +2 -2
- package/src/pilot/bin/lib/security.cjs +382 -0
- package/{gsd/get-shit-done → src/pilot}/bin/lib/state.cjs +1 -1
- package/src/pilot/bin/lib/uat.cjs +282 -0
- package/{gsd/get-shit-done → src/pilot}/bin/lib/verify.cjs +10 -10
- package/{gsd/get-shit-done → src/pilot}/references/continuation-format.md +16 -16
- package/{gsd/get-shit-done → src/pilot}/references/decimal-phase-calculation.md +5 -5
- package/{gsd/get-shit-done → src/pilot}/references/git-integration.md +5 -5
- package/{gsd/get-shit-done → src/pilot}/references/git-planning-commit.md +4 -4
- package/src/pilot/references/mcp-servers.json +153 -0
- package/{gsd/get-shit-done → src/pilot}/references/model-profile-resolution.md +2 -2
- package/{gsd/get-shit-done → src/pilot}/references/model-profiles.md +20 -20
- package/{gsd/get-shit-done → src/pilot}/references/phase-argument-parsing.md +4 -4
- package/{gsd/get-shit-done → src/pilot}/references/planning-config.md +15 -15
- package/{gsd/get-shit-done → src/pilot}/references/ui-brand.md +5 -5
- package/{gsd/get-shit-done → src/pilot}/references/verification-patterns.md +1 -1
- package/{gsd/get-shit-done → src/pilot}/templates/DEBUG.md +1 -1
- package/{gsd/get-shit-done → src/pilot}/templates/UAT.md +3 -3
- package/src/pilot/templates/UI-SPEC.md +100 -0
- package/{gsd/get-shit-done → src/pilot}/templates/VALIDATION.md +1 -1
- package/src/pilot/templates/claude-md.md +122 -0
- package/{gsd/get-shit-done → src/pilot}/templates/codebase/architecture.md +2 -2
- package/{gsd/get-shit-done → src/pilot}/templates/codebase/structure.md +13 -13
- package/{gsd/get-shit-done → src/pilot}/templates/context.md +4 -4
- package/src/pilot/templates/copilot-instructions.md +7 -0
- package/{gsd/get-shit-done → src/pilot}/templates/debug-subagent-prompt.md +4 -4
- package/src/pilot/templates/dev-preferences.md +21 -0
- package/{gsd/get-shit-done → src/pilot}/templates/discovery.md +2 -2
- package/src/pilot/templates/discussion-log.md +63 -0
- package/{gsd/get-shit-done → src/pilot}/templates/phase-prompt.md +12 -12
- package/{gsd/get-shit-done → src/pilot}/templates/planner-subagent-prompt.md +7 -7
- package/{gsd/get-shit-done → src/pilot}/templates/project.md +1 -1
- package/{gsd/get-shit-done → src/pilot}/templates/research.md +2 -2
- package/{gsd/get-shit-done → src/pilot}/templates/state.md +2 -2
- package/{gsd/get-shit-done → src/pilot}/templates/summary-complex.md +1 -1
- package/{gsd/get-shit-done → src/pilot}/workflows/add-phase.md +11 -11
- package/{gsd/get-shit-done → src/pilot}/workflows/add-tests.md +15 -15
- package/{gsd/get-shit-done → src/pilot}/workflows/add-todo.md +7 -7
- package/{gsd/get-shit-done → src/pilot}/workflows/audit-milestone.md +24 -16
- package/src/pilot/workflows/audit-uat.md +109 -0
- package/src/pilot/workflows/autonomous.md +891 -0
- package/{gsd/get-shit-done → src/pilot}/workflows/check-todos.md +10 -10
- package/{gsd/get-shit-done → src/pilot}/workflows/cleanup.md +3 -3
- package/{gsd/get-shit-done → src/pilot}/workflows/complete-milestone.md +19 -16
- package/{gsd/get-shit-done → src/pilot}/workflows/diagnose-issues.md +9 -4
- package/{gsd/get-shit-done → src/pilot}/workflows/discovery-phase.md +8 -8
- package/src/pilot/workflows/discuss-phase-assumptions.md +653 -0
- package/{gsd/get-shit-done → src/pilot}/workflows/discuss-phase.md +407 -49
- package/src/pilot/workflows/do.md +104 -0
- package/src/pilot/workflows/execute-phase.md +821 -0
- package/{gsd/get-shit-done → src/pilot}/workflows/execute-plan.md +79 -28
- package/src/pilot/workflows/fast.md +105 -0
- package/src/pilot/workflows/forensics.md +265 -0
- package/{gsd/get-shit-done → src/pilot}/workflows/health.md +34 -11
- package/src/pilot/workflows/help.md +775 -0
- package/{gsd/get-shit-done → src/pilot}/workflows/insert-phase.md +10 -10
- package/{gsd/get-shit-done → src/pilot}/workflows/list-phase-assumptions.md +4 -4
- package/src/pilot/workflows/manager.md +362 -0
- package/{gsd/get-shit-done → src/pilot}/workflows/map-codebase.md +27 -17
- package/src/pilot/workflows/milestone-summary.md +223 -0
- package/{gsd/get-shit-done → src/pilot}/workflows/new-milestone.md +135 -33
- package/{gsd/get-shit-done → src/pilot}/workflows/new-project.md +152 -79
- package/src/pilot/workflows/next.md +97 -0
- package/src/pilot/workflows/node-repair.md +92 -0
- package/src/pilot/workflows/note.md +156 -0
- package/src/pilot/workflows/pause-work.md +177 -0
- package/{gsd/get-shit-done → src/pilot}/workflows/plan-milestone-gaps.md +10 -11
- package/src/pilot/workflows/plan-phase.md +859 -0
- package/src/pilot/workflows/plant-seed.md +169 -0
- package/src/pilot/workflows/pr-branch.md +129 -0
- package/{gsd/get-shit-done → src/pilot}/workflows/progress.md +95 -34
- package/{gsd/get-shit-done → src/pilot}/workflows/quick.md +33 -21
- package/{gsd/get-shit-done → src/pilot}/workflows/remove-phase.md +14 -14
- package/{gsd/get-shit-done → src/pilot}/workflows/research-phase.md +18 -10
- package/{gsd/get-shit-done → src/pilot}/workflows/resume-project.md +37 -18
- package/src/pilot/workflows/session-report.md +146 -0
- package/{gsd/get-shit-done → src/pilot}/workflows/set-profile.md +7 -7
- package/{gsd/get-shit-done → src/pilot}/workflows/settings.md +75 -22
- package/src/pilot/workflows/ship.md +228 -0
- package/src/pilot/workflows/stats.md +60 -0
- package/{gsd/get-shit-done → src/pilot}/workflows/transition.md +57 -17
- package/src/pilot/workflows/ui-phase.md +302 -0
- package/src/pilot/workflows/ui-review.md +165 -0
- package/{gsd/get-shit-done → src/pilot}/workflows/update.md +88 -58
- package/{gsd/get-shit-done → src/pilot}/workflows/validate-phase.md +24 -17
- package/{gsd/get-shit-done → src/pilot}/workflows/verify-phase.md +26 -15
- package/{gsd/get-shit-done → src/pilot}/workflows/verify-work.md +89 -37
- package/{ecc → src}/rules/common/agents.md +1 -0
- package/{ecc → src}/rules/common/coding-style.md +21 -0
- package/src/skills/agentic-engineering/SKILL.md +63 -0
- package/src/skills/ai-first-engineering/SKILL.md +51 -0
- package/src/skills/ai-regression-testing/SKILL.md +385 -0
- package/src/skills/api-design/SKILL.md +523 -0
- package/src/skills/architecture-decision-records/SKILL.md +179 -0
- package/src/skills/backend-patterns/SKILL.md +598 -0
- package/src/skills/benchmark/SKILL.md +87 -0
- package/src/skills/blueprint/SKILL.md +90 -0
- package/src/skills/browser-qa/SKILL.md +81 -0
- package/src/skills/claude-api/SKILL.md +337 -0
- package/src/skills/codebase-onboarding/SKILL.md +233 -0
- package/src/skills/coding-standards/SKILL.md +530 -0
- package/src/skills/context-budget/SKILL.md +135 -0
- package/{ecc → src}/skills/continuous-learning-v2/SKILL.md +2 -2
- package/{ecc → src}/skills/continuous-learning-v2/agents/observer-loop.sh +1 -1
- package/src/skills/cpp-coding-standards/SKILL.md +723 -0
- package/src/skills/cpp-testing/SKILL.md +324 -0
- package/src/skills/database-migrations/SKILL.md +429 -0
- package/src/skills/deep-research/SKILL.md +155 -0
- package/src/skills/deployment-patterns/SKILL.md +427 -0
- package/src/skills/django-patterns/SKILL.md +734 -0
- package/src/skills/django-security/SKILL.md +593 -0
- package/src/skills/django-tdd/SKILL.md +729 -0
- package/src/skills/django-verification/SKILL.md +469 -0
- package/src/skills/docker-patterns/SKILL.md +364 -0
- package/src/skills/documentation-lookup/SKILL.md +90 -0
- package/src/skills/e2e-testing/SKILL.md +326 -0
- package/src/skills/exa-search/SKILL.md +103 -0
- package/src/skills/frontend-patterns/SKILL.md +642 -0
- package/src/skills/golang-patterns/SKILL.md +674 -0
- package/src/skills/golang-testing/SKILL.md +720 -0
- package/src/skills/java-coding-standards/SKILL.md +147 -0
- package/src/skills/jpa-patterns/SKILL.md +151 -0
- package/src/skills/kotlin-coroutines-flows/SKILL.md +284 -0
- package/src/skills/kotlin-exposed-patterns/SKILL.md +719 -0
- package/src/skills/kotlin-ktor-patterns/SKILL.md +689 -0
- package/src/skills/kotlin-patterns/SKILL.md +711 -0
- package/src/skills/kotlin-testing/SKILL.md +824 -0
- package/src/skills/laravel-patterns/SKILL.md +415 -0
- package/src/skills/laravel-security/SKILL.md +285 -0
- package/src/skills/laravel-tdd/SKILL.md +283 -0
- package/src/skills/laravel-verification/SKILL.md +179 -0
- package/src/skills/mcp-server-patterns/SKILL.md +67 -0
- package/src/skills/perl-patterns/SKILL.md +504 -0
- package/src/skills/perl-testing/SKILL.md +475 -0
- package/src/skills/postgres-patterns/SKILL.md +147 -0
- package/src/skills/prompt-optimizer/SKILL.md +397 -0
- package/src/skills/python-patterns/SKILL.md +750 -0
- package/src/skills/python-testing/SKILL.md +816 -0
- package/src/skills/rust-patterns/SKILL.md +499 -0
- package/src/skills/rust-testing/SKILL.md +500 -0
- package/src/skills/safety-guard/SKILL.md +69 -0
- package/src/skills/search-first/SKILL.md +161 -0
- package/src/skills/security-review/SKILL.md +495 -0
- package/src/skills/security-review/cloud-infrastructure-security.md +361 -0
- package/src/skills/security-scan/SKILL.md +165 -0
- package/src/skills/springboot-patterns/SKILL.md +314 -0
- package/src/skills/springboot-security/SKILL.md +272 -0
- package/src/skills/springboot-tdd/SKILL.md +158 -0
- package/src/skills/springboot-verification/SKILL.md +231 -0
- package/src/skills/tdd-workflow/SKILL.md +410 -0
- package/ecc/scripts/hooks/session-end-marker.js +0 -15
- package/gsd/LICENSE +0 -21
- package/gsd/commands-gsd/discuss-phase.md +0 -90
- package/gsd/commands-gsd/execute-phase.md +0 -41
- package/gsd/commands-gsd/join-discord.md +0 -18
- package/gsd/commands-gsd/reapply-patches.md +0 -123
- package/gsd/commands-gsd/set-profile.md +0 -34
- package/gsd/get-shit-done/bin/lib/config.cjs +0 -169
- package/gsd/get-shit-done/bin/lib/core.cjs +0 -492
- package/gsd/get-shit-done/bin/lib/init.cjs +0 -710
- package/gsd/get-shit-done/workflows/execute-phase.md +0 -459
- package/gsd/get-shit-done/workflows/help.md +0 -489
- package/gsd/get-shit-done/workflows/pause-work.md +0 -122
- package/gsd/get-shit-done/workflows/plan-phase.md +0 -560
- package/gsd/hooks/gsd-check-update.js +0 -81
- package/kit/CLAUDE.md +0 -43
- package/kit/commands/kit/update.md +0 -46
- package/kit/mcp.json +0 -10
- package/kit/rules/code-style.md +0 -24
- /package/{ecc → src}/agents/architect.md +0 -0
- /package/{ecc → src}/agents/code-reviewer.md +0 -0
- /package/{ecc → src}/agents/doc-updater.md +0 -0
- /package/{ecc → src}/agents/e2e-runner.md +0 -0
- /package/{ecc → src}/agents/security-reviewer.md +0 -0
- /package/{ecc → src}/agents/tdd-guide.md +0 -0
- /package/{ecc/rules → src/available-rules}/golang/coding-style.md +0 -0
- /package/{ecc/rules → src/available-rules}/golang/hooks.md +0 -0
- /package/{ecc/rules → src/available-rules}/golang/patterns.md +0 -0
- /package/{ecc/rules → src/available-rules}/golang/security.md +0 -0
- /package/{ecc/rules → src/available-rules}/golang/testing.md +0 -0
- /package/{ecc/rules → src/available-rules}/kotlin/coding-style.md +0 -0
- /package/{ecc/rules → src/available-rules}/kotlin/patterns.md +0 -0
- /package/{ecc/rules → src/available-rules}/kotlin/security.md +0 -0
- /package/{ecc/rules → src/available-rules}/kotlin/testing.md +0 -0
- /package/{ecc/rules → src/available-rules}/perl/coding-style.md +0 -0
- /package/{ecc/rules → src/available-rules}/perl/hooks.md +0 -0
- /package/{ecc/rules → src/available-rules}/perl/patterns.md +0 -0
- /package/{ecc/rules → src/available-rules}/perl/security.md +0 -0
- /package/{ecc/rules → src/available-rules}/perl/testing.md +0 -0
- /package/{ecc/rules → src/available-rules}/php/coding-style.md +0 -0
- /package/{ecc/rules → src/available-rules}/php/hooks.md +0 -0
- /package/{ecc/rules → src/available-rules}/php/patterns.md +0 -0
- /package/{ecc/rules → src/available-rules}/php/security.md +0 -0
- /package/{ecc/rules → src/available-rules}/php/testing.md +0 -0
- /package/{ecc/rules → src/available-rules}/python/coding-style.md +0 -0
- /package/{ecc/rules → src/available-rules}/python/hooks.md +0 -0
- /package/{ecc/rules → src/available-rules}/python/patterns.md +0 -0
- /package/{ecc/rules → src/available-rules}/python/security.md +0 -0
- /package/{ecc/rules → src/available-rules}/python/testing.md +0 -0
- /package/{ecc/rules → src/available-rules}/swift/coding-style.md +0 -0
- /package/{ecc/rules → src/available-rules}/swift/hooks.md +0 -0
- /package/{ecc/rules → src/available-rules}/swift/patterns.md +0 -0
- /package/{ecc/rules → src/available-rules}/swift/security.md +0 -0
- /package/{ecc/rules → src/available-rules}/swift/testing.md +0 -0
- /package/{ecc/rules → src/available-rules}/typescript/coding-style.md +0 -0
- /package/{ecc/rules → src/available-rules}/typescript/hooks.md +0 -0
- /package/{ecc/rules → src/available-rules}/typescript/patterns.md +0 -0
- /package/{ecc/rules → src/available-rules}/typescript/security.md +0 -0
- /package/{ecc/rules → src/available-rules}/typescript/testing.md +0 -0
- /package/{ecc → src}/commands/checkpoint.md +0 -0
- /package/{ecc → src}/commands/learn.md +0 -0
- /package/{ecc → src}/commands/model-route.md +0 -0
- /package/{ecc → src}/commands/resume-session.md +0 -0
- /package/{ecc → src}/commands/save-session.md +0 -0
- /package/{kit → src}/commands/setup-refresh.md +0 -0
- /package/{kit → src}/commands/tool-guide.md +0 -0
- /package/{ecc → src}/commands/verify.md +0 -0
- /package/{ecc → src}/contexts/dev.md +0 -0
- /package/{ecc → src}/contexts/research.md +0 -0
- /package/{ecc → src}/contexts/review.md +0 -0
- /package/{ecc → src}/examples/CLAUDE.md +0 -0
- /package/{ecc → src}/examples/django-api-CLAUDE.md +0 -0
- /package/{ecc → src}/examples/go-microservice-CLAUDE.md +0 -0
- /package/{ecc → src}/examples/rust-api-CLAUDE.md +0 -0
- /package/{ecc → src}/examples/saas-nextjs-CLAUDE.md +0 -0
- /package/{ecc → src}/examples/user-CLAUDE.md +0 -0
- /package/{ecc/scripts → src}/hooks/check-hook-enabled.js +0 -0
- /package/{ecc/scripts → src}/hooks/evaluate-session.js +0 -0
- /package/{ecc/scripts → src}/hooks/pre-compact.js +0 -0
- /package/{ecc/scripts → src}/hooks/suggest-compact.js +0 -0
- /package/{ecc/scripts → src}/lib/package-manager.d.ts +0 -0
- /package/{ecc/scripts → src}/lib/package-manager.js +0 -0
- /package/{ecc/scripts → src}/lib/resolve-formatter.js +0 -0
- /package/{ecc/scripts → src}/lib/session-aliases.d.ts +0 -0
- /package/{ecc/scripts → src}/lib/session-aliases.js +0 -0
- /package/{ecc/scripts → src}/lib/shell-split.js +0 -0
- /package/{gsd/get-shit-done → src/pilot}/bin/lib/frontmatter.cjs +0 -0
- /package/{gsd/get-shit-done → src/pilot}/bin/lib/milestone.cjs +0 -0
- /package/{gsd/get-shit-done → src/pilot}/bin/lib/roadmap.cjs +0 -0
- /package/{gsd/get-shit-done → src/pilot}/bin/lib/template.cjs +0 -0
- /package/{gsd/get-shit-done → src/pilot}/references/checkpoints.md +0 -0
- /package/{gsd/get-shit-done → src/pilot}/references/questioning.md +0 -0
- /package/{gsd/get-shit-done → src/pilot}/references/tdd.md +0 -0
- /package/{gsd/get-shit-done → src/pilot}/templates/codebase/concerns.md +0 -0
- /package/{gsd/get-shit-done → src/pilot}/templates/codebase/conventions.md +0 -0
- /package/{gsd/get-shit-done → src/pilot}/templates/codebase/integrations.md +0 -0
- /package/{gsd/get-shit-done → src/pilot}/templates/codebase/stack.md +0 -0
- /package/{gsd/get-shit-done → src/pilot}/templates/codebase/testing.md +0 -0
- /package/{gsd/get-shit-done → src/pilot}/templates/config.json +0 -0
- /package/{gsd/get-shit-done → src/pilot}/templates/continue-here.md +0 -0
- /package/{gsd/get-shit-done → src/pilot}/templates/milestone-archive.md +0 -0
- /package/{gsd/get-shit-done → src/pilot}/templates/milestone.md +0 -0
- /package/{gsd/get-shit-done → src/pilot}/templates/requirements.md +0 -0
- /package/{gsd/get-shit-done → src/pilot}/templates/research-project/ARCHITECTURE.md +0 -0
- /package/{gsd/get-shit-done → src/pilot}/templates/research-project/FEATURES.md +0 -0
- /package/{gsd/get-shit-done → src/pilot}/templates/research-project/PITFALLS.md +0 -0
- /package/{gsd/get-shit-done → src/pilot}/templates/research-project/STACK.md +0 -0
- /package/{gsd/get-shit-done → src/pilot}/templates/research-project/SUMMARY.md +0 -0
- /package/{gsd/get-shit-done → src/pilot}/templates/retrospective.md +0 -0
- /package/{gsd/get-shit-done → src/pilot}/templates/roadmap.md +0 -0
- /package/{gsd/get-shit-done → src/pilot}/templates/summary-minimal.md +0 -0
- /package/{gsd/get-shit-done → src/pilot}/templates/summary-standard.md +0 -0
- /package/{gsd/get-shit-done → src/pilot}/templates/summary.md +0 -0
- /package/{gsd/get-shit-done → src/pilot}/templates/user-setup.md +0 -0
- /package/{gsd/get-shit-done → src/pilot}/templates/verification-report.md +0 -0
- /package/{ecc → src}/rules/common/development-workflow.md +0 -0
- /package/{ecc → src}/rules/common/git-workflow.md +0 -0
- /package/{ecc → src}/rules/common/hooks.md +0 -0
- /package/{ecc → src}/rules/common/patterns.md +0 -0
- /package/{ecc → src}/rules/common/performance.md +0 -0
- /package/{ecc → src}/rules/common/security.md +0 -0
- /package/{ecc → src}/rules/common/testing.md +0 -0
- /package/{ecc → src}/skills/continuous-learning-v2/agents/observer.md +0 -0
- /package/{ecc → src}/skills/continuous-learning-v2/agents/start-observer.sh +0 -0
- /package/{ecc → src}/skills/continuous-learning-v2/config.json +0 -0
- /package/{ecc → src}/skills/continuous-learning-v2/hooks/observe.sh +0 -0
- /package/{ecc → src}/skills/continuous-learning-v2/scripts/detect-project.sh +0 -0
- /package/{ecc → src}/skills/continuous-learning-v2/scripts/instinct-cli.py +0 -0
- /package/{ecc → src}/skills/continuous-learning-v2/scripts/test_parse_instinct.py +0 -0
- /package/{ecc → src}/skills/strategic-compact/SKILL.md +0 -0
- /package/{ecc → src}/skills/strategic-compact/suggest-compact.sh +0 -0
- /package/{ecc/skills/verification-loop-SKILL.md → src/skills/verification-loop/SKILL.md} +0 -0
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UAT Audit — Cross-phase UAT/VERIFICATION scanner
|
|
3
|
+
*
|
|
4
|
+
* Reads all *-UAT.md and *-VERIFICATION.md files across all phases.
|
|
5
|
+
* Extracts non-passing items. Returns structured JSON for workflow consumption.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
const { output, error, getMilestonePhaseFilter, planningDir, toPosixPath } = require('./core.cjs');
|
|
11
|
+
const { extractFrontmatter } = require('./frontmatter.cjs');
|
|
12
|
+
const { requireSafePath, sanitizeForDisplay } = require('./security.cjs');
|
|
13
|
+
|
|
14
|
+
function cmdAuditUat(cwd, raw) {
|
|
15
|
+
const phasesDir = path.join(planningDir(cwd), 'phases');
|
|
16
|
+
if (!fs.existsSync(phasesDir)) {
|
|
17
|
+
error('No phases directory found in planning directory');
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const isDirInMilestone = getMilestonePhaseFilter(cwd);
|
|
21
|
+
const results = [];
|
|
22
|
+
|
|
23
|
+
// Scan all phase directories
|
|
24
|
+
const dirs = fs.readdirSync(phasesDir, { withFileTypes: true })
|
|
25
|
+
.filter(e => e.isDirectory())
|
|
26
|
+
.map(e => e.name)
|
|
27
|
+
.filter(isDirInMilestone)
|
|
28
|
+
.sort();
|
|
29
|
+
|
|
30
|
+
for (const dir of dirs) {
|
|
31
|
+
const phaseMatch = dir.match(/^(\d+[A-Z]?(?:\.\d+)*)/i);
|
|
32
|
+
const phaseNum = phaseMatch ? phaseMatch[1] : dir;
|
|
33
|
+
const phaseDir = path.join(phasesDir, dir);
|
|
34
|
+
const files = fs.readdirSync(phaseDir);
|
|
35
|
+
|
|
36
|
+
// Process UAT files
|
|
37
|
+
for (const file of files.filter(f => f.includes('-UAT') && f.endsWith('.md'))) {
|
|
38
|
+
const content = fs.readFileSync(path.join(phaseDir, file), 'utf-8');
|
|
39
|
+
const items = parseUatItems(content);
|
|
40
|
+
if (items.length > 0) {
|
|
41
|
+
results.push({
|
|
42
|
+
phase: phaseNum,
|
|
43
|
+
phase_dir: dir,
|
|
44
|
+
file,
|
|
45
|
+
file_path: toPosixPath(path.relative(cwd, path.join(phaseDir, file))),
|
|
46
|
+
type: 'uat',
|
|
47
|
+
status: (extractFrontmatter(content).status || 'unknown'),
|
|
48
|
+
items,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Process VERIFICATION files
|
|
54
|
+
for (const file of files.filter(f => f.includes('-VERIFICATION') && f.endsWith('.md'))) {
|
|
55
|
+
const content = fs.readFileSync(path.join(phaseDir, file), 'utf-8');
|
|
56
|
+
const status = extractFrontmatter(content).status || 'unknown';
|
|
57
|
+
if (status === 'human_needed' || status === 'gaps_found') {
|
|
58
|
+
const items = parseVerificationItems(content, status);
|
|
59
|
+
if (items.length > 0) {
|
|
60
|
+
results.push({
|
|
61
|
+
phase: phaseNum,
|
|
62
|
+
phase_dir: dir,
|
|
63
|
+
file,
|
|
64
|
+
file_path: toPosixPath(path.relative(cwd, path.join(phaseDir, file))),
|
|
65
|
+
type: 'verification',
|
|
66
|
+
status,
|
|
67
|
+
items,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Compute summary
|
|
75
|
+
const summary = {
|
|
76
|
+
total_files: results.length,
|
|
77
|
+
total_items: results.reduce((sum, r) => sum + r.items.length, 0),
|
|
78
|
+
by_category: {},
|
|
79
|
+
by_phase: {},
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
for (const r of results) {
|
|
83
|
+
if (!summary.by_phase[r.phase]) summary.by_phase[r.phase] = 0;
|
|
84
|
+
for (const item of r.items) {
|
|
85
|
+
summary.by_phase[r.phase]++;
|
|
86
|
+
const cat = item.category || 'unknown';
|
|
87
|
+
summary.by_category[cat] = (summary.by_category[cat] || 0) + 1;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
output({ results, summary }, raw);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function cmdRenderCheckpoint(cwd, options = {}, raw) {
|
|
95
|
+
const filePath = options.file;
|
|
96
|
+
if (!filePath) {
|
|
97
|
+
error('UAT file required: use uat render-checkpoint --file <path>');
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const resolvedPath = requireSafePath(filePath, cwd, 'UAT file', { allowAbsolute: true });
|
|
101
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
102
|
+
error(`UAT file not found: ${filePath}`);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const content = fs.readFileSync(resolvedPath, 'utf-8');
|
|
106
|
+
const currentTest = parseCurrentTest(content);
|
|
107
|
+
|
|
108
|
+
if (currentTest.complete) {
|
|
109
|
+
error('UAT session is already complete; no pending checkpoint to render');
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const checkpoint = buildCheckpoint(currentTest);
|
|
113
|
+
output({
|
|
114
|
+
file_path: toPosixPath(path.relative(cwd, resolvedPath)),
|
|
115
|
+
test_number: currentTest.number,
|
|
116
|
+
test_name: currentTest.name,
|
|
117
|
+
checkpoint,
|
|
118
|
+
}, raw, checkpoint);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// ─── Internal helpers (not exported) ─────────────────────────────────────────
|
|
122
|
+
|
|
123
|
+
function parseCurrentTest(content) {
|
|
124
|
+
const currentTestMatch = content.match(/##\s*Current Test\s*(?:\n<!--[\s\S]*?-->)?\n([\s\S]*?)(?=\n##\s|$)/i);
|
|
125
|
+
if (!currentTestMatch) {
|
|
126
|
+
error('UAT file is missing a Current Test section');
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const section = currentTestMatch[1].trimEnd();
|
|
130
|
+
if (!section.trim()) {
|
|
131
|
+
error('Current Test section is empty');
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (/\[testing complete\]/i.test(section)) {
|
|
135
|
+
return { complete: true };
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const numberMatch = section.match(/^number:\s*(\d+)\s*$/m);
|
|
139
|
+
const nameMatch = section.match(/^name:\s*(.+)\s*$/m);
|
|
140
|
+
const expectedBlockMatch = section.match(/^expected:\s*\|\n([\s\S]*?)(?=^\w[\w-]*:\s)/m)
|
|
141
|
+
|| section.match(/^expected:\s*\|\n([\s\S]+)/m);
|
|
142
|
+
const expectedInlineMatch = section.match(/^expected:\s*(.+)\s*$/m);
|
|
143
|
+
|
|
144
|
+
if (!numberMatch || !nameMatch || (!expectedBlockMatch && !expectedInlineMatch)) {
|
|
145
|
+
error('Current Test section is malformed');
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
let expected;
|
|
149
|
+
if (expectedBlockMatch) {
|
|
150
|
+
expected = expectedBlockMatch[1]
|
|
151
|
+
.split('\n')
|
|
152
|
+
.map(line => line.replace(/^ {2}/, ''))
|
|
153
|
+
.join('\n')
|
|
154
|
+
.trim();
|
|
155
|
+
} else {
|
|
156
|
+
expected = expectedInlineMatch[1].trim();
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return {
|
|
160
|
+
complete: false,
|
|
161
|
+
number: parseInt(numberMatch[1], 10),
|
|
162
|
+
name: sanitizeForDisplay(nameMatch[1].trim()),
|
|
163
|
+
expected: sanitizeForDisplay(expected),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function buildCheckpoint(currentTest) {
|
|
168
|
+
return [
|
|
169
|
+
'\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557',
|
|
170
|
+
'\u2551 CHECKPOINT: Verification Required \u2551',
|
|
171
|
+
'\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d',
|
|
172
|
+
'',
|
|
173
|
+
`**Test ${currentTest.number}: ${currentTest.name}**`,
|
|
174
|
+
'',
|
|
175
|
+
currentTest.expected,
|
|
176
|
+
'',
|
|
177
|
+
'\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500',
|
|
178
|
+
'Type `pass` or describe what\'s wrong.',
|
|
179
|
+
'\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500',
|
|
180
|
+
].join('\n');
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function parseUatItems(content) {
|
|
184
|
+
const items = [];
|
|
185
|
+
// Match test blocks: ### N. Name\nexpected: ...\nresult: ...\n
|
|
186
|
+
const testPattern = /###\s*(\d+)\.\s*([^\n]+)\nexpected:\s*([^\n]+)\nresult:\s*(\w+)(?:\n(?:reported|reason|blocked_by):\s*[^\n]*)?/g;
|
|
187
|
+
let match;
|
|
188
|
+
while ((match = testPattern.exec(content)) !== null) {
|
|
189
|
+
const [, num, name, expected, result] = match;
|
|
190
|
+
if (result === 'pending' || result === 'skipped' || result === 'blocked') {
|
|
191
|
+
// Extract optional fields — limit to current test block (up to next ### or EOF)
|
|
192
|
+
const afterMatch = content.slice(match.index);
|
|
193
|
+
const nextHeading = afterMatch.indexOf('\n###', 1);
|
|
194
|
+
const blockText = nextHeading > 0 ? afterMatch.slice(0, nextHeading) : afterMatch;
|
|
195
|
+
const reasonMatch = blockText.match(/reason:\s*(.+)/);
|
|
196
|
+
const blockedByMatch = blockText.match(/blocked_by:\s*(.+)/);
|
|
197
|
+
|
|
198
|
+
const item = {
|
|
199
|
+
test: parseInt(num, 10),
|
|
200
|
+
name: name.trim(),
|
|
201
|
+
expected: expected.trim(),
|
|
202
|
+
result,
|
|
203
|
+
category: categorizeItem(result, reasonMatch?.[1], blockedByMatch?.[1]),
|
|
204
|
+
};
|
|
205
|
+
if (reasonMatch) item.reason = reasonMatch[1].trim();
|
|
206
|
+
if (blockedByMatch) item.blocked_by = blockedByMatch[1].trim();
|
|
207
|
+
items.push(item);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return items;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function parseVerificationItems(content, status) {
|
|
214
|
+
const items = [];
|
|
215
|
+
if (status === 'human_needed') {
|
|
216
|
+
// Extract from human_verification section — look for numbered items or table rows
|
|
217
|
+
const hvSection = content.match(/##\s*Human Verification.*?\n([\s\S]*?)(?=\n##\s|\n---\s|$)/i);
|
|
218
|
+
if (hvSection) {
|
|
219
|
+
const lines = hvSection[1].split('\n');
|
|
220
|
+
for (const line of lines) {
|
|
221
|
+
// Match table rows: | N | description | ... |
|
|
222
|
+
const tableMatch = line.match(/\|\s*(\d+)\s*\|\s*([^|]+)/);
|
|
223
|
+
// Match bullet items: - description
|
|
224
|
+
const bulletMatch = line.match(/^[-*]\s+(.+)/);
|
|
225
|
+
// Match numbered items: 1. description
|
|
226
|
+
const numberedMatch = line.match(/^(\d+)\.\s+(.+)/);
|
|
227
|
+
|
|
228
|
+
if (tableMatch) {
|
|
229
|
+
items.push({
|
|
230
|
+
test: parseInt(tableMatch[1], 10),
|
|
231
|
+
name: tableMatch[2].trim(),
|
|
232
|
+
result: 'human_needed',
|
|
233
|
+
category: 'human_uat',
|
|
234
|
+
});
|
|
235
|
+
} else if (numberedMatch) {
|
|
236
|
+
items.push({
|
|
237
|
+
test: parseInt(numberedMatch[1], 10),
|
|
238
|
+
name: numberedMatch[2].trim(),
|
|
239
|
+
result: 'human_needed',
|
|
240
|
+
category: 'human_uat',
|
|
241
|
+
});
|
|
242
|
+
} else if (bulletMatch && bulletMatch[1].length > 10) {
|
|
243
|
+
items.push({
|
|
244
|
+
name: bulletMatch[1].trim(),
|
|
245
|
+
result: 'human_needed',
|
|
246
|
+
category: 'human_uat',
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// gaps_found items are already handled by plan-phase --gaps pipeline
|
|
253
|
+
return items;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function categorizeItem(result, reason, blockedBy) {
|
|
257
|
+
if (result === 'blocked' || blockedBy) {
|
|
258
|
+
if (blockedBy) {
|
|
259
|
+
if (/server/i.test(blockedBy)) return 'server_blocked';
|
|
260
|
+
if (/device|physical/i.test(blockedBy)) return 'device_needed';
|
|
261
|
+
if (/build|release|preview/i.test(blockedBy)) return 'build_needed';
|
|
262
|
+
if (/third.party|twilio|stripe/i.test(blockedBy)) return 'third_party';
|
|
263
|
+
}
|
|
264
|
+
return 'blocked';
|
|
265
|
+
}
|
|
266
|
+
if (result === 'skipped') {
|
|
267
|
+
if (reason) {
|
|
268
|
+
if (/server|not running|not available/i.test(reason)) return 'server_blocked';
|
|
269
|
+
if (/simulator|physical|device/i.test(reason)) return 'device_needed';
|
|
270
|
+
if (/build|release|preview/i.test(reason)) return 'build_needed';
|
|
271
|
+
}
|
|
272
|
+
return 'skipped_unresolved';
|
|
273
|
+
}
|
|
274
|
+
if (result === 'pending') return 'pending';
|
|
275
|
+
if (result === 'human_needed') return 'human_uat';
|
|
276
|
+
return 'unknown';
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
module.exports = {
|
|
280
|
+
cmdAuditUat,
|
|
281
|
+
cmdRenderCheckpoint,
|
|
282
|
+
};
|
|
@@ -537,7 +537,7 @@ function cmdValidateHealth(cwd, options, raw) {
|
|
|
537
537
|
|
|
538
538
|
// ─── Check 1: .planning/ exists ───────────────────────────────────────────
|
|
539
539
|
if (!fs.existsSync(planningDir)) {
|
|
540
|
-
addIssue('error', 'E001', '.planning/ directory not found', 'Run /
|
|
540
|
+
addIssue('error', 'E001', '.planning/ directory not found', 'Run /ccp:new-project to initialize');
|
|
541
541
|
output({
|
|
542
542
|
status: 'broken',
|
|
543
543
|
errors,
|
|
@@ -550,7 +550,7 @@ function cmdValidateHealth(cwd, options, raw) {
|
|
|
550
550
|
|
|
551
551
|
// ─── Check 2: PROJECT.md exists and has required sections ─────────────────
|
|
552
552
|
if (!fs.existsSync(projectPath)) {
|
|
553
|
-
addIssue('error', 'E002', 'PROJECT.md not found', 'Run /
|
|
553
|
+
addIssue('error', 'E002', 'PROJECT.md not found', 'Run /ccp:new-project to create');
|
|
554
554
|
} else {
|
|
555
555
|
const content = fs.readFileSync(projectPath, 'utf-8');
|
|
556
556
|
const requiredSections = ['## What This Is', '## Core Value', '## Requirements'];
|
|
@@ -563,12 +563,12 @@ function cmdValidateHealth(cwd, options, raw) {
|
|
|
563
563
|
|
|
564
564
|
// ─── Check 3: ROADMAP.md exists ───────────────────────────────────────────
|
|
565
565
|
if (!fs.existsSync(roadmapPath)) {
|
|
566
|
-
addIssue('error', 'E003', 'ROADMAP.md not found', 'Run /
|
|
566
|
+
addIssue('error', 'E003', 'ROADMAP.md not found', 'Run /ccp:new-milestone to create roadmap');
|
|
567
567
|
}
|
|
568
568
|
|
|
569
569
|
// ─── Check 4: STATE.md exists and references valid phases ─────────────────
|
|
570
570
|
if (!fs.existsSync(statePath)) {
|
|
571
|
-
addIssue('error', 'E004', 'STATE.md not found', 'Run /
|
|
571
|
+
addIssue('error', 'E004', 'STATE.md not found', 'Run /ccp:health --repair to regenerate', true);
|
|
572
572
|
repairs.push('regenerateState');
|
|
573
573
|
} else {
|
|
574
574
|
const stateContent = fs.readFileSync(statePath, 'utf-8');
|
|
@@ -591,7 +591,7 @@ function cmdValidateHealth(cwd, options, raw) {
|
|
|
591
591
|
if (!diskPhases.has(ref) && !diskPhases.has(normalizedRef) && !diskPhases.has(String(parseInt(ref, 10)))) {
|
|
592
592
|
// Only warn if phases dir has any content (not just an empty project)
|
|
593
593
|
if (diskPhases.size > 0) {
|
|
594
|
-
addIssue('warning', 'W002', `STATE.md references phase ${ref}, but only phases ${[...diskPhases].sort().join(', ')} exist`, 'Run /
|
|
594
|
+
addIssue('warning', 'W002', `STATE.md references phase ${ref}, but only phases ${[...diskPhases].sort().join(', ')} exist`, 'Run /ccp:health --repair to regenerate STATE.md', true);
|
|
595
595
|
if (!repairs.includes('regenerateState')) repairs.push('regenerateState');
|
|
596
596
|
}
|
|
597
597
|
}
|
|
@@ -600,7 +600,7 @@ function cmdValidateHealth(cwd, options, raw) {
|
|
|
600
600
|
|
|
601
601
|
// ─── Check 5: config.json valid JSON + valid schema ───────────────────────
|
|
602
602
|
if (!fs.existsSync(configPath)) {
|
|
603
|
-
addIssue('warning', 'W003', 'config.json not found', 'Run /
|
|
603
|
+
addIssue('warning', 'W003', 'config.json not found', 'Run /ccp:health --repair to create with defaults', true);
|
|
604
604
|
repairs.push('createConfig');
|
|
605
605
|
} else {
|
|
606
606
|
try {
|
|
@@ -612,7 +612,7 @@ function cmdValidateHealth(cwd, options, raw) {
|
|
|
612
612
|
addIssue('warning', 'W004', `config.json: invalid model_profile "${parsed.model_profile}"`, `Valid values: ${validProfiles.join(', ')}`);
|
|
613
613
|
}
|
|
614
614
|
} catch (err) {
|
|
615
|
-
addIssue('error', 'E005', `config.json: JSON parse error - ${err.message}`, 'Run /
|
|
615
|
+
addIssue('error', 'E005', `config.json: JSON parse error - ${err.message}`, 'Run /ccp:health --repair to reset to defaults', true);
|
|
616
616
|
repairs.push('resetConfig');
|
|
617
617
|
}
|
|
618
618
|
}
|
|
@@ -623,7 +623,7 @@ function cmdValidateHealth(cwd, options, raw) {
|
|
|
623
623
|
const configRaw = fs.readFileSync(configPath, 'utf-8');
|
|
624
624
|
const configParsed = JSON.parse(configRaw);
|
|
625
625
|
if (configParsed.workflow && configParsed.workflow.nyquist_validation === undefined) {
|
|
626
|
-
addIssue('warning', 'W008', 'config.json: workflow.nyquist_validation absent (defaults to enabled but agents may skip)', 'Run /
|
|
626
|
+
addIssue('warning', 'W008', 'config.json: workflow.nyquist_validation absent (defaults to enabled but agents may skip)', 'Run /ccp:health --repair to add key', true);
|
|
627
627
|
if (!repairs.includes('addNyquistKey')) repairs.push('addNyquistKey');
|
|
628
628
|
}
|
|
629
629
|
} catch {}
|
|
@@ -670,7 +670,7 @@ function cmdValidateHealth(cwd, options, raw) {
|
|
|
670
670
|
const researchFile = phaseFiles.find(f => f.endsWith('-RESEARCH.md'));
|
|
671
671
|
const researchContent = fs.readFileSync(path.join(phasesDir, e.name, researchFile), 'utf-8');
|
|
672
672
|
if (researchContent.includes('## Validation Architecture')) {
|
|
673
|
-
addIssue('warning', 'W009', `Phase ${e.name}: has Validation Architecture in RESEARCH.md but no VALIDATION.md`, 'Re-run /
|
|
673
|
+
addIssue('warning', 'W009', `Phase ${e.name}: has Validation Architecture in RESEARCH.md but no VALIDATION.md`, 'Re-run /ccp:plan-phase with --research to regenerate');
|
|
674
674
|
}
|
|
675
675
|
}
|
|
676
676
|
}
|
|
@@ -755,7 +755,7 @@ function cmdValidateHealth(cwd, options, raw) {
|
|
|
755
755
|
stateContent += `**Current phase:** (determining...)\n`;
|
|
756
756
|
stateContent += `**Status:** Resuming\n\n`;
|
|
757
757
|
stateContent += `## Session Log\n\n`;
|
|
758
|
-
stateContent += `- ${new Date().toISOString().split('T')[0]}: STATE.md regenerated by /
|
|
758
|
+
stateContent += `- ${new Date().toISOString().split('T')[0]}: STATE.md regenerated by /ccp:health --repair\n`;
|
|
759
759
|
writeStateMd(statePath, stateContent, cwd);
|
|
760
760
|
repairActions.push({ action: repair, success: true, path: 'STATE.md' });
|
|
761
761
|
break;
|
|
@@ -44,7 +44,7 @@ Standard format for presenting next steps after completing a command or workflow
|
|
|
44
44
|
|
|
45
45
|
**02-03: Refresh Token Rotation** — Add /api/auth/refresh with sliding expiry
|
|
46
46
|
|
|
47
|
-
`/
|
|
47
|
+
`/ccp:execute-phase 2`
|
|
48
48
|
|
|
49
49
|
<sub>`/clear` first → fresh context window</sub>
|
|
50
50
|
|
|
@@ -52,7 +52,7 @@ Standard format for presenting next steps after completing a command or workflow
|
|
|
52
52
|
|
|
53
53
|
**Also available:**
|
|
54
54
|
- Review plan before executing
|
|
55
|
-
- `/
|
|
55
|
+
- `/ccp:list-phase-assumptions 2` — check assumptions
|
|
56
56
|
|
|
57
57
|
---
|
|
58
58
|
```
|
|
@@ -69,7 +69,7 @@ Add note that this is the last plan and what comes after:
|
|
|
69
69
|
**02-03: Refresh Token Rotation** — Add /api/auth/refresh with sliding expiry
|
|
70
70
|
<sub>Final plan in Phase 2</sub>
|
|
71
71
|
|
|
72
|
-
`/
|
|
72
|
+
`/ccp:execute-phase 2`
|
|
73
73
|
|
|
74
74
|
<sub>`/clear` first → fresh context window</sub>
|
|
75
75
|
|
|
@@ -91,15 +91,15 @@ Add note that this is the last plan and what comes after:
|
|
|
91
91
|
|
|
92
92
|
**Phase 2: Authentication** — JWT login flow with refresh tokens
|
|
93
93
|
|
|
94
|
-
`/
|
|
94
|
+
`/ccp:plan-phase 2`
|
|
95
95
|
|
|
96
96
|
<sub>`/clear` first → fresh context window</sub>
|
|
97
97
|
|
|
98
98
|
---
|
|
99
99
|
|
|
100
100
|
**Also available:**
|
|
101
|
-
- `/
|
|
102
|
-
- `/
|
|
101
|
+
- `/ccp:discuss-phase 2` — gather context first
|
|
102
|
+
- `/ccp:research-phase 2` — investigate unknowns
|
|
103
103
|
- Review roadmap
|
|
104
104
|
|
|
105
105
|
---
|
|
@@ -120,15 +120,15 @@ Show completion status before next action:
|
|
|
120
120
|
|
|
121
121
|
**Phase 3: Core Features** — User dashboard, settings, and data export
|
|
122
122
|
|
|
123
|
-
`/
|
|
123
|
+
`/ccp:plan-phase 3`
|
|
124
124
|
|
|
125
125
|
<sub>`/clear` first → fresh context window</sub>
|
|
126
126
|
|
|
127
127
|
---
|
|
128
128
|
|
|
129
129
|
**Also available:**
|
|
130
|
-
- `/
|
|
131
|
-
- `/
|
|
130
|
+
- `/ccp:discuss-phase 3` — gather context first
|
|
131
|
+
- `/ccp:research-phase 3` — investigate unknowns
|
|
132
132
|
- Review what Phase 2 built
|
|
133
133
|
|
|
134
134
|
---
|
|
@@ -145,11 +145,11 @@ When there's no clear primary action:
|
|
|
145
145
|
|
|
146
146
|
**Phase 3: Core Features** — User dashboard, settings, and data export
|
|
147
147
|
|
|
148
|
-
**To plan directly:** `/
|
|
148
|
+
**To plan directly:** `/ccp:plan-phase 3`
|
|
149
149
|
|
|
150
|
-
**To discuss context first:** `/
|
|
150
|
+
**To discuss context first:** `/ccp:discuss-phase 3`
|
|
151
151
|
|
|
152
|
-
**To research unknowns:** `/
|
|
152
|
+
**To research unknowns:** `/ccp:research-phase 3`
|
|
153
153
|
|
|
154
154
|
<sub>`/clear` first → fresh context window</sub>
|
|
155
155
|
|
|
@@ -169,7 +169,7 @@ All 4 phases shipped
|
|
|
169
169
|
|
|
170
170
|
**Start v1.1** — questioning → research → requirements → roadmap
|
|
171
171
|
|
|
172
|
-
`/
|
|
172
|
+
`/ccp:new-milestone`
|
|
173
173
|
|
|
174
174
|
<sub>`/clear` first → fresh context window</sub>
|
|
175
175
|
|
|
@@ -214,7 +214,7 @@ Extract: `**02-03: Refresh Token Rotation** — Add /api/auth/refresh with slidi
|
|
|
214
214
|
## To Continue
|
|
215
215
|
|
|
216
216
|
Run `/clear`, then paste:
|
|
217
|
-
/
|
|
217
|
+
/ccp:execute-phase 2
|
|
218
218
|
```
|
|
219
219
|
|
|
220
220
|
User has no idea what 02-03 is about.
|
|
@@ -222,7 +222,7 @@ User has no idea what 02-03 is about.
|
|
|
222
222
|
### Don't: Missing /clear explanation
|
|
223
223
|
|
|
224
224
|
```
|
|
225
|
-
`/
|
|
225
|
+
`/ccp:plan-phase 3`
|
|
226
226
|
|
|
227
227
|
Run /clear first.
|
|
228
228
|
```
|
|
@@ -242,7 +242,7 @@ Sounds like an afterthought. Use "Also available:" instead.
|
|
|
242
242
|
|
|
243
243
|
```
|
|
244
244
|
```
|
|
245
|
-
/
|
|
245
|
+
/ccp:plan-phase 3
|
|
246
246
|
```
|
|
247
247
|
```
|
|
248
248
|
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
Calculate the next decimal phase number for urgent insertions.
|
|
4
4
|
|
|
5
|
-
## Using
|
|
5
|
+
## Using ccp-tools
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
8
|
# Get next decimal phase after phase 6
|
|
9
|
-
node "$HOME/.claude/
|
|
9
|
+
node "$HOME/.claude/pilot/bin/ccp-tools.cjs" phase next-decimal 6
|
|
10
10
|
```
|
|
11
11
|
|
|
12
12
|
Output:
|
|
@@ -32,14 +32,14 @@ With existing decimals:
|
|
|
32
32
|
## Extract Values
|
|
33
33
|
|
|
34
34
|
```bash
|
|
35
|
-
DECIMAL_INFO=$(node "$HOME/.claude/
|
|
35
|
+
DECIMAL_INFO=$(node "$HOME/.claude/pilot/bin/ccp-tools.cjs" phase next-decimal "${AFTER_PHASE}")
|
|
36
36
|
DECIMAL_PHASE=$(printf '%s\n' "$DECIMAL_INFO" | jq -r '.next')
|
|
37
37
|
BASE_PHASE=$(printf '%s\n' "$DECIMAL_INFO" | jq -r '.base_phase')
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
Or with --raw flag:
|
|
41
41
|
```bash
|
|
42
|
-
DECIMAL_PHASE=$(node "$HOME/.claude/
|
|
42
|
+
DECIMAL_PHASE=$(node "$HOME/.claude/pilot/bin/ccp-tools.cjs" phase next-decimal "${AFTER_PHASE}" --raw)
|
|
43
43
|
# Returns just: 06.1
|
|
44
44
|
```
|
|
45
45
|
|
|
@@ -57,7 +57,7 @@ DECIMAL_PHASE=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" phase next-
|
|
|
57
57
|
Decimal phase directories use the full decimal number:
|
|
58
58
|
|
|
59
59
|
```bash
|
|
60
|
-
SLUG=$(node "$HOME/.claude/
|
|
60
|
+
SLUG=$(node "$HOME/.claude/pilot/bin/ccp-tools.cjs" generate-slug "$DESCRIPTION" --raw)
|
|
61
61
|
PHASE_DIR=".planning/phases/${DECIMAL_PHASE}-${SLUG}"
|
|
62
62
|
mkdir -p "$PHASE_DIR"
|
|
63
63
|
```
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<overview>
|
|
2
|
-
Git integration for
|
|
2
|
+
Git integration for CCP framework.
|
|
3
3
|
</overview>
|
|
4
4
|
|
|
5
5
|
<core_principle>
|
|
@@ -29,7 +29,7 @@ The git log should read like a changelog of what shipped, not a diary of plannin
|
|
|
29
29
|
[ -d .git ] && echo "GIT_EXISTS" || echo "NO_GIT"
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
If NO_GIT: Run `git init` silently.
|
|
32
|
+
If NO_GIT: Run `git init` silently. CCP projects always get their own repo.
|
|
33
33
|
</git_check>
|
|
34
34
|
|
|
35
35
|
<commit_formats>
|
|
@@ -51,7 +51,7 @@ Phases:
|
|
|
51
51
|
What to commit:
|
|
52
52
|
|
|
53
53
|
```bash
|
|
54
|
-
node "$HOME/.claude/
|
|
54
|
+
node "$HOME/.claude/pilot/bin/ccp-tools.cjs" commit "docs: initialize [project-name] ([N] phases)" --files .planning/
|
|
55
55
|
```
|
|
56
56
|
|
|
57
57
|
</format>
|
|
@@ -129,7 +129,7 @@ SUMMARY: .planning/phases/XX-name/{phase}-{plan}-SUMMARY.md
|
|
|
129
129
|
What to commit:
|
|
130
130
|
|
|
131
131
|
```bash
|
|
132
|
-
node "$HOME/.claude/
|
|
132
|
+
node "$HOME/.claude/pilot/bin/ccp-tools.cjs" commit "docs({phase}-{plan}): complete [plan-name] plan" --files .planning/phases/XX-name/{phase}-{plan}-PLAN.md .planning/phases/XX-name/{phase}-{plan}-SUMMARY.md .planning/STATE.md .planning/ROADMAP.md
|
|
133
133
|
```
|
|
134
134
|
|
|
135
135
|
**Note:** Code files NOT included - already committed per-task.
|
|
@@ -149,7 +149,7 @@ Current: [task name]
|
|
|
149
149
|
What to commit:
|
|
150
150
|
|
|
151
151
|
```bash
|
|
152
|
-
node "$HOME/.claude/
|
|
152
|
+
node "$HOME/.claude/pilot/bin/ccp-tools.cjs" commit "wip: [phase-name] paused at task [X]/[Y]" --files .planning/
|
|
153
153
|
```
|
|
154
154
|
|
|
155
155
|
</format>
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# Git Planning Commit
|
|
2
2
|
|
|
3
|
-
Commit planning artifacts using the
|
|
3
|
+
Commit planning artifacts using the ccp-tools CLI, which automatically checks `commit_docs` config and gitignore status.
|
|
4
4
|
|
|
5
5
|
## Commit via CLI
|
|
6
6
|
|
|
7
|
-
Always use `
|
|
7
|
+
Always use `ccp-tools.cjs commit` for `.planning/` files — it handles `commit_docs` and gitignore checks automatically:
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
node "$HOME/.claude/
|
|
10
|
+
node "$HOME/.claude/pilot/bin/ccp-tools.cjs" commit "docs({scope}): {description}" --files .planning/STATE.md .planning/ROADMAP.md
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
The CLI will return `skipped` (with reason) if `commit_docs` is `false` or `.planning/` is gitignored. No manual conditional checks needed.
|
|
@@ -17,7 +17,7 @@ The CLI will return `skipped` (with reason) if `commit_docs` is `false` or `.pla
|
|
|
17
17
|
To fold `.planning/` file changes into the previous commit:
|
|
18
18
|
|
|
19
19
|
```bash
|
|
20
|
-
node "$HOME/.claude/
|
|
20
|
+
node "$HOME/.claude/pilot/bin/ccp-tools.cjs" commit "" --files .planning/codebase/*.md --amend
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
## Commit Message Patterns
|