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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* Executes a hook script only when enabled by
|
|
3
|
+
* Executes a hook script only when enabled by CCP hook profile flags.
|
|
4
4
|
*
|
|
5
5
|
* Usage:
|
|
6
6
|
* node run-with-flags.js <hookId> <scriptRelativePath> [profilesCsv]
|
|
@@ -18,28 +18,76 @@ const MAX_STDIN = 1024 * 1024;
|
|
|
18
18
|
function readStdinRaw() {
|
|
19
19
|
return new Promise(resolve => {
|
|
20
20
|
let raw = '';
|
|
21
|
+
let truncated = false;
|
|
21
22
|
process.stdin.setEncoding('utf8');
|
|
22
23
|
process.stdin.on('data', chunk => {
|
|
23
24
|
if (raw.length < MAX_STDIN) {
|
|
24
25
|
const remaining = MAX_STDIN - raw.length;
|
|
25
26
|
raw += chunk.substring(0, remaining);
|
|
27
|
+
if (chunk.length > remaining) {
|
|
28
|
+
truncated = true;
|
|
29
|
+
}
|
|
30
|
+
} else {
|
|
31
|
+
truncated = true;
|
|
26
32
|
}
|
|
27
33
|
});
|
|
28
|
-
process.stdin.on('end', () => resolve(raw));
|
|
29
|
-
process.stdin.on('error', () => resolve(raw));
|
|
34
|
+
process.stdin.on('end', () => resolve({ raw, truncated }));
|
|
35
|
+
process.stdin.on('error', () => resolve({ raw, truncated }));
|
|
30
36
|
});
|
|
31
37
|
}
|
|
32
38
|
|
|
39
|
+
function writeStderr(stderr) {
|
|
40
|
+
if (typeof stderr !== 'string' || stderr.length === 0) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
process.stderr.write(stderr.endsWith('\n') ? stderr : `${stderr}\n`);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function emitHookResult(raw, output) {
|
|
48
|
+
if (typeof output === 'string' || Buffer.isBuffer(output)) {
|
|
49
|
+
process.stdout.write(String(output));
|
|
50
|
+
return 0;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (output && typeof output === 'object') {
|
|
54
|
+
writeStderr(output.stderr);
|
|
55
|
+
|
|
56
|
+
if (Object.prototype.hasOwnProperty.call(output, 'stdout')) {
|
|
57
|
+
process.stdout.write(String(output.stdout ?? ''));
|
|
58
|
+
} else if (!Number.isInteger(output.exitCode) || output.exitCode === 0) {
|
|
59
|
+
process.stdout.write(raw);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return Number.isInteger(output.exitCode) ? output.exitCode : 0;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
process.stdout.write(raw);
|
|
66
|
+
return 0;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function writeLegacySpawnOutput(raw, result) {
|
|
70
|
+
const stdout = typeof result.stdout === 'string' ? result.stdout : '';
|
|
71
|
+
if (stdout) {
|
|
72
|
+
process.stdout.write(stdout);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (Number.isInteger(result.status) && result.status === 0) {
|
|
77
|
+
process.stdout.write(raw);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
33
81
|
function getPluginRoot() {
|
|
34
|
-
if (process.env.
|
|
35
|
-
return process.env.
|
|
82
|
+
if (process.env.CCP_CLAUDE_DIR && process.env.CCP_CLAUDE_DIR.trim()) {
|
|
83
|
+
return process.env.CCP_CLAUDE_DIR;
|
|
36
84
|
}
|
|
37
85
|
return path.resolve(__dirname, '..', '..');
|
|
38
86
|
}
|
|
39
87
|
|
|
40
88
|
async function main() {
|
|
41
89
|
const [, , hookId, relScriptPath, profilesCsv] = process.argv;
|
|
42
|
-
const raw = await readStdinRaw();
|
|
90
|
+
const { raw, truncated } = await readStdinRaw();
|
|
43
91
|
|
|
44
92
|
if (!hookId || !relScriptPath) {
|
|
45
93
|
process.stdout.write(raw);
|
|
@@ -89,8 +137,8 @@ async function main() {
|
|
|
89
137
|
|
|
90
138
|
if (hookModule && typeof hookModule.run === 'function') {
|
|
91
139
|
try {
|
|
92
|
-
const output = hookModule.run(raw);
|
|
93
|
-
|
|
140
|
+
const output = hookModule.run(raw, { truncated, maxStdin: MAX_STDIN });
|
|
141
|
+
process.exit(emitHookResult(raw, output));
|
|
94
142
|
} catch (runErr) {
|
|
95
143
|
process.stderr.write(`[Hook] run() error for ${hookId}: ${runErr.message}\n`);
|
|
96
144
|
process.stdout.write(raw);
|
|
@@ -99,19 +147,32 @@ async function main() {
|
|
|
99
147
|
}
|
|
100
148
|
|
|
101
149
|
// Legacy path: spawn a child Node process for hooks without run() export
|
|
102
|
-
const result = spawnSync(
|
|
150
|
+
const result = spawnSync(process.execPath, [scriptPath], {
|
|
103
151
|
input: raw,
|
|
104
152
|
encoding: 'utf8',
|
|
105
|
-
env:
|
|
153
|
+
env: {
|
|
154
|
+
...process.env,
|
|
155
|
+
CCP_HOOK_INPUT_TRUNCATED: truncated ? '1' : '0',
|
|
156
|
+
CCP_HOOK_INPUT_MAX_BYTES: String(MAX_STDIN)
|
|
157
|
+
},
|
|
106
158
|
cwd: process.cwd(),
|
|
107
159
|
timeout: 30000
|
|
108
160
|
});
|
|
109
161
|
|
|
110
|
-
|
|
162
|
+
writeLegacySpawnOutput(raw, result);
|
|
111
163
|
if (result.stderr) process.stderr.write(result.stderr);
|
|
112
164
|
|
|
113
|
-
|
|
114
|
-
|
|
165
|
+
if (result.error || result.signal || result.status === null) {
|
|
166
|
+
const failureDetail = result.error
|
|
167
|
+
? result.error.message
|
|
168
|
+
: result.signal
|
|
169
|
+
? `terminated by signal ${result.signal}`
|
|
170
|
+
: 'missing exit status';
|
|
171
|
+
writeStderr(`[Hook] legacy hook execution failed for ${hookId}: ${failureDetail}`);
|
|
172
|
+
process.exit(1);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
process.exit(Number.isInteger(result.status) ? result.status : 0);
|
|
115
176
|
}
|
|
116
177
|
|
|
117
178
|
main().catch(err => {
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Session end marker hook - outputs stdin to stdout unchanged.
|
|
6
|
+
* Exports run() for in-process execution (avoids spawnSync issues on Windows).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
function run(rawInput) {
|
|
10
|
+
return rawInput || '';
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// Legacy CLI execution (when run directly)
|
|
14
|
+
if (require.main === module) {
|
|
15
|
+
const MAX_STDIN = 1024 * 1024;
|
|
16
|
+
let raw = '';
|
|
17
|
+
process.stdin.setEncoding('utf8');
|
|
18
|
+
process.stdin.on('data', chunk => {
|
|
19
|
+
if (raw.length < MAX_STDIN) {
|
|
20
|
+
const remaining = MAX_STDIN - raw.length;
|
|
21
|
+
raw += chunk.substring(0, remaining);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
process.stdin.on('end', () => {
|
|
25
|
+
process.stdout.write(raw);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
module.exports = { run };
|
|
@@ -16,15 +16,18 @@ const {
|
|
|
16
16
|
getDateString,
|
|
17
17
|
getTimeString,
|
|
18
18
|
getSessionIdShort,
|
|
19
|
+
getProjectName,
|
|
19
20
|
ensureDir,
|
|
20
21
|
readFile,
|
|
21
22
|
writeFile,
|
|
22
|
-
|
|
23
|
+
runCommand,
|
|
24
|
+
stripAnsi,
|
|
23
25
|
log
|
|
24
26
|
} = require('../lib/utils');
|
|
25
27
|
|
|
26
28
|
const SUMMARY_START_MARKER = '<!-- ECC:SUMMARY:START -->';
|
|
27
29
|
const SUMMARY_END_MARKER = '<!-- ECC:SUMMARY:END -->';
|
|
30
|
+
const SESSION_SEPARATOR = '\n---\n';
|
|
28
31
|
|
|
29
32
|
/**
|
|
30
33
|
* Extract a meaningful summary from the session transcript.
|
|
@@ -56,8 +59,9 @@ function extractSessionSummary(transcriptPath) {
|
|
|
56
59
|
: Array.isArray(rawContent)
|
|
57
60
|
? rawContent.map(c => (c && c.text) || '').join(' ')
|
|
58
61
|
: '';
|
|
59
|
-
|
|
60
|
-
|
|
62
|
+
const cleaned = stripAnsi(text).trim();
|
|
63
|
+
if (cleaned) {
|
|
64
|
+
userMessages.push(cleaned.slice(0, 200));
|
|
61
65
|
}
|
|
62
66
|
}
|
|
63
67
|
|
|
@@ -128,6 +132,51 @@ function runMain() {
|
|
|
128
132
|
});
|
|
129
133
|
}
|
|
130
134
|
|
|
135
|
+
function getSessionMetadata() {
|
|
136
|
+
const branchResult = runCommand('git rev-parse --abbrev-ref HEAD');
|
|
137
|
+
|
|
138
|
+
return {
|
|
139
|
+
project: getProjectName() || 'unknown',
|
|
140
|
+
branch: branchResult.success ? branchResult.output : 'unknown',
|
|
141
|
+
worktree: process.cwd()
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function extractHeaderField(header, label) {
|
|
146
|
+
const match = header.match(new RegExp(`\\*\\*${escapeRegExp(label)}:\\*\\*\\s*(.+)$`, 'm'));
|
|
147
|
+
return match ? match[1].trim() : null;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function buildSessionHeader(today, currentTime, metadata, existingContent = '') {
|
|
151
|
+
const headingMatch = existingContent.match(/^#\s+.+$/m);
|
|
152
|
+
const heading = headingMatch ? headingMatch[0] : `# Session: ${today}`;
|
|
153
|
+
const date = extractHeaderField(existingContent, 'Date') || today;
|
|
154
|
+
const started = extractHeaderField(existingContent, 'Started') || currentTime;
|
|
155
|
+
|
|
156
|
+
return [
|
|
157
|
+
heading,
|
|
158
|
+
`**Date:** ${date}`,
|
|
159
|
+
`**Started:** ${started}`,
|
|
160
|
+
`**Last Updated:** ${currentTime}`,
|
|
161
|
+
`**Project:** ${metadata.project}`,
|
|
162
|
+
`**Branch:** ${metadata.branch}`,
|
|
163
|
+
`**Worktree:** ${metadata.worktree}`,
|
|
164
|
+
''
|
|
165
|
+
].join('\n');
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function mergeSessionHeader(content, today, currentTime, metadata) {
|
|
169
|
+
const separatorIndex = content.indexOf(SESSION_SEPARATOR);
|
|
170
|
+
if (separatorIndex === -1) {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const existingHeader = content.slice(0, separatorIndex);
|
|
175
|
+
const body = content.slice(separatorIndex + SESSION_SEPARATOR.length);
|
|
176
|
+
const nextHeader = buildSessionHeader(today, currentTime, metadata, existingHeader);
|
|
177
|
+
return `${nextHeader}${SESSION_SEPARATOR}${body}`;
|
|
178
|
+
}
|
|
179
|
+
|
|
131
180
|
async function main() {
|
|
132
181
|
// Parse stdin JSON to get transcript_path
|
|
133
182
|
let transcriptPath = null;
|
|
@@ -143,6 +192,7 @@ async function main() {
|
|
|
143
192
|
const today = getDateString();
|
|
144
193
|
const shortId = getSessionIdShort();
|
|
145
194
|
const sessionFile = path.join(sessionsDir, `${today}-${shortId}-session.tmp`);
|
|
195
|
+
const sessionMetadata = getSessionMetadata();
|
|
146
196
|
|
|
147
197
|
ensureDir(sessionsDir);
|
|
148
198
|
|
|
@@ -160,42 +210,42 @@ async function main() {
|
|
|
160
210
|
}
|
|
161
211
|
|
|
162
212
|
if (fs.existsSync(sessionFile)) {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
213
|
+
const existing = readFile(sessionFile);
|
|
214
|
+
let updatedContent = existing;
|
|
215
|
+
|
|
216
|
+
if (existing) {
|
|
217
|
+
const merged = mergeSessionHeader(existing, today, currentTime, sessionMetadata);
|
|
218
|
+
if (merged) {
|
|
219
|
+
updatedContent = merged;
|
|
220
|
+
} else {
|
|
221
|
+
log(`[SessionEnd] Failed to normalize header in ${sessionFile}`);
|
|
222
|
+
}
|
|
171
223
|
}
|
|
172
224
|
|
|
173
225
|
// If we have a new summary, update only the generated summary block.
|
|
174
226
|
// This keeps repeated Stop invocations idempotent and preserves
|
|
175
227
|
// user-authored sections in the same session file.
|
|
176
|
-
if (summary) {
|
|
177
|
-
const
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
/## (?:Session Summary|Current State)[\s\S]*?$/,
|
|
191
|
-
`${summaryBlock}\n\n### Notes for Next Session\n-\n\n### Context to Load\n\`\`\`\n[relevant files]\n\`\`\`\n`
|
|
192
|
-
);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
writeFile(sessionFile, updatedContent);
|
|
228
|
+
if (summary && updatedContent) {
|
|
229
|
+
const summaryBlock = buildSummaryBlock(summary);
|
|
230
|
+
|
|
231
|
+
if (updatedContent.includes(SUMMARY_START_MARKER) && updatedContent.includes(SUMMARY_END_MARKER)) {
|
|
232
|
+
updatedContent = updatedContent.replace(
|
|
233
|
+
new RegExp(`${escapeRegExp(SUMMARY_START_MARKER)}[\\s\\S]*?${escapeRegExp(SUMMARY_END_MARKER)}`),
|
|
234
|
+
summaryBlock
|
|
235
|
+
);
|
|
236
|
+
} else {
|
|
237
|
+
// Migration path for files created before summary markers existed.
|
|
238
|
+
updatedContent = updatedContent.replace(
|
|
239
|
+
/## (?:Session Summary|Current State)[\s\S]*?$/,
|
|
240
|
+
`${summaryBlock}\n\n### Notes for Next Session\n-\n\n### Context to Load\n\`\`\`\n[relevant files]\n\`\`\`\n`
|
|
241
|
+
);
|
|
196
242
|
}
|
|
197
243
|
}
|
|
198
244
|
|
|
245
|
+
if (updatedContent) {
|
|
246
|
+
writeFile(sessionFile, updatedContent);
|
|
247
|
+
}
|
|
248
|
+
|
|
199
249
|
log(`[SessionEnd] Updated session file: ${sessionFile}`);
|
|
200
250
|
} else {
|
|
201
251
|
// Create new session file
|
|
@@ -203,14 +253,7 @@ async function main() {
|
|
|
203
253
|
? `${buildSummaryBlock(summary)}\n\n### Notes for Next Session\n-\n\n### Context to Load\n\`\`\`\n[relevant files]\n\`\`\``
|
|
204
254
|
: `## Current State\n\n[Session context goes here]\n\n### Completed\n- [ ]\n\n### In Progress\n- [ ]\n\n### Notes for Next Session\n-\n\n### Context to Load\n\`\`\`\n[relevant files]\n\`\`\``;
|
|
205
255
|
|
|
206
|
-
const template =
|
|
207
|
-
**Date:** ${today}
|
|
208
|
-
**Started:** ${currentTime}
|
|
209
|
-
**Last Updated:** ${currentTime}
|
|
210
|
-
|
|
211
|
-
---
|
|
212
|
-
|
|
213
|
-
${summarySection}
|
|
256
|
+
const template = `${buildSessionHeader(today, currentTime, sessionMetadata)}${SESSION_SEPARATOR}${summarySection}
|
|
214
257
|
`;
|
|
215
258
|
|
|
216
259
|
writeFile(sessionFile, template);
|
|
@@ -223,7 +266,7 @@ ${summarySection}
|
|
|
223
266
|
function buildSummarySection(summary) {
|
|
224
267
|
let section = '## Session Summary\n\n';
|
|
225
268
|
|
|
226
|
-
// Tasks (from user messages
|
|
269
|
+
// Tasks (from user messages -- collapse newlines and escape backticks to prevent markdown breaks)
|
|
227
270
|
section += '### Tasks\n';
|
|
228
271
|
for (const msg of summary.userMessages) {
|
|
229
272
|
section += `- ${msg.replace(/\n/g, ' ').replace(/`/g, '\\`')}\n`;
|
|
@@ -11,27 +11,59 @@
|
|
|
11
11
|
|
|
12
12
|
const {
|
|
13
13
|
getSessionsDir,
|
|
14
|
+
getSessionSearchDirs,
|
|
14
15
|
getLearnedSkillsDir,
|
|
15
16
|
findFiles,
|
|
16
17
|
ensureDir,
|
|
17
18
|
readFile,
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
stripAnsi,
|
|
20
|
+
log
|
|
20
21
|
} = require('../lib/utils');
|
|
21
22
|
const { getPackageManager, getSelectionPrompt } = require('../lib/package-manager');
|
|
22
23
|
const { listAliases } = require('../lib/session-aliases');
|
|
23
24
|
const { detectProjectType } = require('../lib/project-detect');
|
|
25
|
+
const path = require('path');
|
|
26
|
+
|
|
27
|
+
function dedupeRecentSessions(searchDirs) {
|
|
28
|
+
const recentSessionsByName = new Map();
|
|
29
|
+
|
|
30
|
+
for (const [dirIndex, dir] of searchDirs.entries()) {
|
|
31
|
+
const matches = findFiles(dir, '*-session.tmp', { maxAge: 7 });
|
|
32
|
+
|
|
33
|
+
for (const match of matches) {
|
|
34
|
+
const basename = path.basename(match.path);
|
|
35
|
+
const current = {
|
|
36
|
+
...match,
|
|
37
|
+
basename,
|
|
38
|
+
dirIndex,
|
|
39
|
+
};
|
|
40
|
+
const existing = recentSessionsByName.get(basename);
|
|
41
|
+
|
|
42
|
+
if (
|
|
43
|
+
!existing
|
|
44
|
+
|| current.mtime > existing.mtime
|
|
45
|
+
|| (current.mtime === existing.mtime && current.dirIndex < existing.dirIndex)
|
|
46
|
+
) {
|
|
47
|
+
recentSessionsByName.set(basename, current);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return Array.from(recentSessionsByName.values())
|
|
53
|
+
.sort((left, right) => right.mtime - left.mtime || left.dirIndex - right.dirIndex);
|
|
54
|
+
}
|
|
24
55
|
|
|
25
56
|
async function main() {
|
|
26
57
|
const sessionsDir = getSessionsDir();
|
|
27
58
|
const learnedDir = getLearnedSkillsDir();
|
|
59
|
+
const additionalContextParts = [];
|
|
28
60
|
|
|
29
61
|
// Ensure directories exist
|
|
30
62
|
ensureDir(sessionsDir);
|
|
31
63
|
ensureDir(learnedDir);
|
|
32
64
|
|
|
33
65
|
// Check for recent session files (last 7 days)
|
|
34
|
-
const recentSessions =
|
|
66
|
+
const recentSessions = dedupeRecentSessions(getSessionSearchDirs());
|
|
35
67
|
|
|
36
68
|
if (recentSessions.length > 0) {
|
|
37
69
|
const latest = recentSessions[0];
|
|
@@ -39,10 +71,10 @@ async function main() {
|
|
|
39
71
|
log(`[SessionStart] Latest: ${latest.path}`);
|
|
40
72
|
|
|
41
73
|
// Read and inject the latest session content into Claude's context
|
|
42
|
-
const content = readFile(latest.path);
|
|
74
|
+
const content = stripAnsi(readFile(latest.path));
|
|
43
75
|
if (content && !content.includes('[Session context goes here]')) {
|
|
44
76
|
// Only inject if the session has actual content (not the blank template)
|
|
45
|
-
|
|
77
|
+
additionalContextParts.push(`Previous session summary:\n${content}`);
|
|
46
78
|
}
|
|
47
79
|
}
|
|
48
80
|
|
|
@@ -82,16 +114,50 @@ async function main() {
|
|
|
82
114
|
if (projectInfo.frameworks.length > 0) {
|
|
83
115
|
parts.push(`frameworks: ${projectInfo.frameworks.join(', ')}`);
|
|
84
116
|
}
|
|
85
|
-
log(`[SessionStart] Project detected
|
|
86
|
-
|
|
117
|
+
log(`[SessionStart] Project detected -- ${parts.join('; ')}`);
|
|
118
|
+
additionalContextParts.push(`Project type: ${JSON.stringify(projectInfo)}`);
|
|
87
119
|
} else {
|
|
88
120
|
log('[SessionStart] No specific project type detected');
|
|
89
121
|
}
|
|
90
122
|
|
|
91
|
-
|
|
123
|
+
await writeSessionStartPayload(additionalContextParts.join('\n\n'));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function writeSessionStartPayload(additionalContext) {
|
|
127
|
+
return new Promise((resolve, reject) => {
|
|
128
|
+
let settled = false;
|
|
129
|
+
const payload = JSON.stringify({
|
|
130
|
+
hookSpecificOutput: {
|
|
131
|
+
hookEventName: 'SessionStart',
|
|
132
|
+
additionalContext
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
const handleError = (err) => {
|
|
137
|
+
if (settled) return;
|
|
138
|
+
settled = true;
|
|
139
|
+
if (err) {
|
|
140
|
+
log(`[SessionStart] stdout write error: ${err.message}`);
|
|
141
|
+
}
|
|
142
|
+
reject(err || new Error('stdout stream error'));
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
process.stdout.once('error', handleError);
|
|
146
|
+
process.stdout.write(payload, (err) => {
|
|
147
|
+
process.stdout.removeListener('error', handleError);
|
|
148
|
+
if (settled) return;
|
|
149
|
+
settled = true;
|
|
150
|
+
if (err) {
|
|
151
|
+
log(`[SessionStart] stdout write error: ${err.message}`);
|
|
152
|
+
reject(err);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
resolve();
|
|
156
|
+
});
|
|
157
|
+
});
|
|
92
158
|
}
|
|
93
159
|
|
|
94
160
|
main().catch(err => {
|
|
95
161
|
console.error('[SessionStart] Error:', err.message);
|
|
96
|
-
process.
|
|
162
|
+
process.exitCode = 0; // Don't block on errors
|
|
97
163
|
});
|
|
@@ -3,8 +3,12 @@
|
|
|
3
3
|
* Shared hook enable/disable controls.
|
|
4
4
|
*
|
|
5
5
|
* Controls:
|
|
6
|
-
* -
|
|
7
|
-
* -
|
|
6
|
+
* - CCP_HOOK_PROFILE=minimal|standard|strict (default: standard)
|
|
7
|
+
* - CCP_DISABLED_HOOKS=comma,separated,hook,ids
|
|
8
|
+
*
|
|
9
|
+
* Deprecated (backward-compatible fallback):
|
|
10
|
+
* - ECC_HOOK_PROFILE — read if CCP_HOOK_PROFILE is not set
|
|
11
|
+
* - ECC_DISABLED_HOOKS — read if CCP_DISABLED_HOOKS is not set
|
|
8
12
|
*/
|
|
9
13
|
|
|
10
14
|
'use strict';
|
|
@@ -16,12 +20,12 @@ function normalizeId(value) {
|
|
|
16
20
|
}
|
|
17
21
|
|
|
18
22
|
function getHookProfile() {
|
|
19
|
-
const raw = String(process.env.ECC_HOOK_PROFILE || 'standard').trim().toLowerCase();
|
|
23
|
+
const raw = String(process.env.CCP_HOOK_PROFILE || process.env.ECC_HOOK_PROFILE || 'standard').trim().toLowerCase();
|
|
20
24
|
return VALID_PROFILES.has(raw) ? raw : 'standard';
|
|
21
25
|
}
|
|
22
26
|
|
|
23
27
|
function getDisabledHookIds() {
|
|
24
|
-
const raw = String(process.env.ECC_DISABLED_HOOKS || '');
|
|
28
|
+
const raw = String(process.env.CCP_DISABLED_HOOKS || process.env.ECC_DISABLED_HOOKS || '');
|
|
25
29
|
if (!raw.trim()) return new Set();
|
|
26
30
|
|
|
27
31
|
return new Set(
|
|
@@ -98,6 +98,7 @@ const FRAMEWORK_RULES = [
|
|
|
98
98
|
{ framework: 'remix', language: 'typescript', markers: [], packageKeys: ['@remix-run/node', '@remix-run/react'] },
|
|
99
99
|
{ framework: 'astro', language: 'typescript', markers: ['astro.config.mjs', 'astro.config.ts'], packageKeys: ['astro'] },
|
|
100
100
|
{ framework: 'nuxt', language: 'typescript', markers: ['nuxt.config.js', 'nuxt.config.ts'], packageKeys: ['nuxt'] },
|
|
101
|
+
{ framework: 'tailwindcss', language: 'typescript', markers: ['tailwind.config.js', 'tailwind.config.ts', 'tailwind.config.mjs'], packageKeys: ['tailwindcss'] },
|
|
101
102
|
{ framework: 'electron', language: 'typescript', markers: [], packageKeys: ['electron'] },
|
|
102
103
|
|
|
103
104
|
// Ruby frameworks
|
|
@@ -397,7 +398,7 @@ function detectProjectType(projectDir) {
|
|
|
397
398
|
}
|
|
398
399
|
|
|
399
400
|
// Determine if fullstack (both frontend and backend languages)
|
|
400
|
-
const frontendSignals = ['react', 'vue', 'angular', 'svelte', 'nextjs', 'nuxt', 'astro', 'remix'];
|
|
401
|
+
const frontendSignals = ['react', 'vue', 'angular', 'svelte', 'nextjs', 'nuxt', 'astro', 'remix', 'tailwindcss'];
|
|
401
402
|
const backendSignals = ['django', 'fastapi', 'flask', 'express', 'nestjs', 'rails', 'spring', 'laravel', 'phoenix', 'gin', 'echo', 'actix', 'axum'];
|
|
402
403
|
const hasFrontend = frameworks.some(f => frontendSignals.includes(f));
|
|
403
404
|
const hasBackend = frameworks.some(f => backendSignals.includes(f));
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Session Manager Library for Claude Code.
|
|
3
|
-
* Provides CRUD operations for session files stored as markdown in ~/.claude/
|
|
3
|
+
* Provides CRUD operations for session files stored as markdown in ~/.claude/session-data/
|
|
4
|
+
* with legacy read compatibility for ~/.claude/sessions/.
|
|
4
5
|
*/
|
|
5
6
|
|
|
6
7
|
/** Parsed metadata from a session filename */
|
|
@@ -21,6 +22,9 @@ export interface SessionMetadata {
|
|
|
21
22
|
date: string | null;
|
|
22
23
|
started: string | null;
|
|
23
24
|
lastUpdated: string | null;
|
|
25
|
+
project: string | null;
|
|
26
|
+
branch: string | null;
|
|
27
|
+
worktree: string | null;
|
|
24
28
|
completed: string[];
|
|
25
29
|
inProgress: string[];
|
|
26
30
|
notes: string;
|