claude-code-pilot 2.0.0 → 3.1.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.
Files changed (514) hide show
  1. package/README.md +76 -97
  2. package/bin/install.js +267 -250
  3. package/manifest.json +5 -18
  4. package/package.json +5 -7
  5. package/src/agents/build-error-resolver.md +114 -0
  6. package/src/agents/ccp-advisor-researcher.md +104 -0
  7. package/src/agents/ccp-assumptions-analyzer.md +105 -0
  8. package/{gsd/agents/gsd-codebase-mapper.md → src/agents/ccp-codebase-mapper.md} +7 -7
  9. package/{gsd/agents/gsd-debugger.md → src/agents/ccp-debugger.md} +125 -8
  10. package/{gsd/agents/gsd-executor.md → src/agents/ccp-executor.md} +31 -20
  11. package/{gsd/agents/gsd-integration-checker.md → src/agents/ccp-integration-checker.md} +2 -2
  12. package/{gsd/agents/gsd-nyquist-auditor.md → src/agents/ccp-nyquist-auditor.md} +3 -3
  13. package/{gsd/agents/gsd-phase-researcher.md → src/agents/ccp-phase-researcher.md} +127 -13
  14. package/{gsd/agents/gsd-plan-checker.md → src/agents/ccp-plan-checker.md} +57 -21
  15. package/{gsd/agents/gsd-planner.md → src/agents/ccp-planner.md} +61 -23
  16. package/{gsd/agents/gsd-project-researcher.md → src/agents/ccp-project-researcher.md} +33 -6
  17. package/{gsd/agents/gsd-research-synthesizer.md → src/agents/ccp-research-synthesizer.md} +11 -11
  18. package/{gsd/agents/gsd-roadmapper.md → src/agents/ccp-roadmapper.md} +39 -10
  19. package/src/agents/ccp-ui-auditor.md +439 -0
  20. package/src/agents/ccp-ui-checker.md +300 -0
  21. package/src/agents/ccp-ui-researcher.md +357 -0
  22. package/{gsd/agents/gsd-verifier.md → src/agents/ccp-verifier.md} +81 -15
  23. package/src/agents/cpp-build-resolver.md +90 -0
  24. package/src/agents/cpp-reviewer.md +72 -0
  25. package/src/agents/database-reviewer.md +91 -0
  26. package/{ecc → src}/agents/doc-updater.md +1 -1
  27. package/src/agents/docs-lookup.md +68 -0
  28. package/src/agents/flutter-reviewer.md +243 -0
  29. package/src/agents/gan-evaluator.md +209 -0
  30. package/src/agents/gan-generator.md +131 -0
  31. package/src/agents/gan-planner.md +99 -0
  32. package/src/agents/go-build-resolver.md +94 -0
  33. package/src/agents/go-reviewer.md +76 -0
  34. package/src/agents/harness-optimizer.md +35 -0
  35. package/src/agents/java-build-resolver.md +153 -0
  36. package/src/agents/java-reviewer.md +92 -0
  37. package/src/agents/kotlin-build-resolver.md +118 -0
  38. package/src/agents/kotlin-reviewer.md +159 -0
  39. package/src/agents/loop-operator.md +36 -0
  40. package/src/agents/opensource-forker.md +198 -0
  41. package/src/agents/opensource-packager.md +249 -0
  42. package/src/agents/opensource-sanitizer.md +188 -0
  43. package/src/agents/performance-optimizer.md +446 -0
  44. package/src/agents/planner.md +212 -0
  45. package/src/agents/python-reviewer.md +98 -0
  46. package/src/agents/pytorch-build-resolver.md +120 -0
  47. package/src/agents/refactor-cleaner.md +85 -0
  48. package/src/agents/rust-build-resolver.md +148 -0
  49. package/src/agents/rust-reviewer.md +94 -0
  50. package/src/agents/typescript-reviewer.md +112 -0
  51. package/src/available-rules/README.md +80 -0
  52. package/src/available-rules/cpp/coding-style.md +44 -0
  53. package/src/available-rules/cpp/hooks.md +39 -0
  54. package/src/available-rules/cpp/patterns.md +51 -0
  55. package/src/available-rules/cpp/security.md +51 -0
  56. package/src/available-rules/cpp/testing.md +44 -0
  57. package/src/available-rules/csharp/coding-style.md +72 -0
  58. package/src/available-rules/csharp/hooks.md +25 -0
  59. package/src/available-rules/csharp/patterns.md +50 -0
  60. package/src/available-rules/csharp/security.md +58 -0
  61. package/src/available-rules/csharp/testing.md +46 -0
  62. package/src/available-rules/java/coding-style.md +114 -0
  63. package/src/available-rules/java/hooks.md +18 -0
  64. package/src/available-rules/java/patterns.md +146 -0
  65. package/src/available-rules/java/security.md +100 -0
  66. package/src/available-rules/java/testing.md +131 -0
  67. package/src/available-rules/kotlin/hooks.md +17 -0
  68. package/src/available-rules/rust/coding-style.md +151 -0
  69. package/src/available-rules/rust/hooks.md +16 -0
  70. package/src/available-rules/rust/patterns.md +168 -0
  71. package/src/available-rules/rust/security.md +141 -0
  72. package/src/available-rules/rust/testing.md +154 -0
  73. package/src/commands/ccp/add-backlog.md +76 -0
  74. package/{gsd/commands-gsd → src/commands/ccp}/add-phase.md +3 -3
  75. package/{gsd/commands-gsd → src/commands/ccp}/add-tests.md +5 -5
  76. package/{gsd/commands-gsd → src/commands/ccp}/add-todo.md +4 -4
  77. package/src/commands/ccp/aside.md +165 -0
  78. package/{gsd/commands-gsd → src/commands/ccp}/audit-milestone.md +3 -3
  79. package/src/commands/ccp/audit-uat.md +24 -0
  80. package/src/commands/ccp/autonomous.md +41 -0
  81. package/src/commands/ccp/build-fix.md +67 -0
  82. package/{gsd/commands-gsd → src/commands/ccp}/check-todos.md +3 -3
  83. package/{ecc/commands → src/commands/ccp}/checkpoint.md +12 -7
  84. package/{gsd/commands-gsd → src/commands/ccp}/cleanup.md +3 -3
  85. package/src/commands/ccp/code-review.md +45 -0
  86. package/{gsd/commands-gsd → src/commands/ccp}/complete-milestone.md +9 -9
  87. package/src/commands/ccp/context-budget.md +30 -0
  88. package/src/commands/ccp/cpp-build.md +174 -0
  89. package/src/commands/ccp/cpp-review.md +133 -0
  90. package/src/commands/ccp/cpp-test.md +252 -0
  91. package/{gsd/commands-gsd → src/commands/ccp}/debug.md +14 -9
  92. package/src/commands/ccp/discuss-phase.md +64 -0
  93. package/src/commands/ccp/do.md +30 -0
  94. package/src/commands/ccp/docs-update.md +48 -0
  95. package/src/commands/ccp/docs.md +32 -0
  96. package/src/commands/ccp/e2e.md +365 -0
  97. package/src/commands/ccp/eval.md +125 -0
  98. package/{ecc/commands → src/commands/ccp}/evolve.md +5 -5
  99. package/src/commands/ccp/execute-phase.md +59 -0
  100. package/src/commands/ccp/fast.md +30 -0
  101. package/src/commands/ccp/forensics.md +56 -0
  102. package/src/commands/ccp/go-build.md +184 -0
  103. package/src/commands/ccp/go-review.md +149 -0
  104. package/src/commands/ccp/go-test.md +269 -0
  105. package/src/commands/ccp/gradle-build.md +71 -0
  106. package/src/commands/ccp/harness-audit.md +76 -0
  107. package/{gsd/commands-gsd → src/commands/ccp}/health.md +3 -3
  108. package/{gsd/commands-gsd → src/commands/ccp}/help.md +5 -5
  109. package/{gsd/commands-gsd → src/commands/ccp}/insert-phase.md +3 -3
  110. package/src/commands/ccp/kotlin-build.md +175 -0
  111. package/src/commands/ccp/kotlin-review.md +141 -0
  112. package/src/commands/ccp/kotlin-test.md +313 -0
  113. package/{ecc/commands → src/commands/ccp}/learn.md +7 -2
  114. package/{gsd/commands-gsd → src/commands/ccp}/list-phase-assumptions.md +2 -2
  115. package/src/commands/ccp/manager.md +39 -0
  116. package/{gsd/commands-gsd → src/commands/ccp}/map-codebase.md +7 -7
  117. package/src/commands/ccp/milestone-summary.md +51 -0
  118. package/{ecc/commands → src/commands/ccp}/model-route.md +6 -1
  119. package/{gsd/commands-gsd → src/commands/ccp}/new-milestone.md +8 -8
  120. package/{gsd/commands-gsd → src/commands/ccp}/new-project.md +8 -8
  121. package/src/commands/ccp/next.md +24 -0
  122. package/src/commands/ccp/note.md +34 -0
  123. package/src/commands/ccp/orchestrate.md +232 -0
  124. package/{gsd/commands-gsd → src/commands/ccp}/pause-work.md +3 -3
  125. package/{gsd/commands-gsd → src/commands/ccp}/plan-milestone-gaps.md +5 -5
  126. package/{gsd/commands-gsd → src/commands/ccp}/plan-phase.md +9 -7
  127. package/src/commands/ccp/plan.md +115 -0
  128. package/src/commands/ccp/plant-seed.md +28 -0
  129. package/src/commands/ccp/pr-branch.md +25 -0
  130. package/src/commands/ccp/profile-user.md +46 -0
  131. package/{gsd/commands-gsd → src/commands/ccp}/progress.md +3 -3
  132. package/src/commands/ccp/prompt-optimize.md +39 -0
  133. package/src/commands/ccp/prune.md +25 -0
  134. package/src/commands/ccp/python-review.md +298 -0
  135. package/{ecc/commands → src/commands/ccp}/quality-gate.md +7 -2
  136. package/{gsd/commands-gsd → src/commands/ccp}/quick.md +10 -8
  137. package/src/commands/ccp/refactor-clean.md +85 -0
  138. package/{gsd/commands-gsd → src/commands/ccp}/remove-phase.md +3 -3
  139. package/{gsd/commands-gsd → src/commands/ccp}/research-phase.md +17 -12
  140. package/{ecc/commands → src/commands/ccp}/resume-session.md +9 -8
  141. package/{gsd/commands-gsd → src/commands/ccp}/resume-work.md +3 -3
  142. package/src/commands/ccp/review-backlog.md +61 -0
  143. package/src/commands/ccp/review.md +37 -0
  144. package/src/commands/ccp/rules-distill.md +12 -0
  145. package/src/commands/ccp/rust-build.md +188 -0
  146. package/src/commands/ccp/rust-review.md +143 -0
  147. package/src/commands/ccp/rust-test.md +309 -0
  148. package/{ecc/commands → src/commands/ccp}/save-session.md +2 -1
  149. package/src/commands/ccp/secure-phase.md +35 -0
  150. package/src/commands/ccp/session-report.md +19 -0
  151. package/{ecc/commands → src/commands/ccp}/sessions.md +39 -34
  152. package/src/commands/ccp/set-profile.md +12 -0
  153. package/{gsd/commands-gsd → src/commands/ccp}/settings.md +5 -5
  154. package/src/commands/ccp/setup-pm.md +81 -0
  155. package/{kit/commands → src/commands/ccp}/setup-refresh.md +4 -3
  156. package/{kit/commands → src/commands/ccp}/setup.md +67 -40
  157. package/src/commands/ccp/ship.md +23 -0
  158. package/src/commands/ccp/skill-create.md +172 -0
  159. package/src/commands/ccp/skill-health.md +51 -0
  160. package/src/commands/ccp/stats.md +18 -0
  161. package/src/commands/ccp/tdd.md +329 -0
  162. package/src/commands/ccp/test-coverage.md +74 -0
  163. package/src/commands/ccp/thread.md +127 -0
  164. package/{kit/commands → src/commands/ccp}/tool-guide.md +2 -1
  165. package/src/commands/ccp/ui-phase.md +34 -0
  166. package/src/commands/ccp/ui-review.md +32 -0
  167. package/src/commands/ccp/update-codemaps.md +77 -0
  168. package/src/commands/ccp/update-docs.md +89 -0
  169. package/{gsd/commands-gsd → src/commands/ccp}/update.md +5 -5
  170. package/{gsd/commands-gsd → src/commands/ccp}/validate-phase.md +3 -3
  171. package/{gsd/commands-gsd → src/commands/ccp}/verify-work.md +5 -5
  172. package/{ecc/commands → src/commands/ccp}/verify.md +5 -0
  173. package/src/commands/ccp/workstreams.md +68 -0
  174. package/{ecc → src}/examples/CLAUDE.md +4 -4
  175. package/{ecc → src}/examples/django-api-CLAUDE.md +5 -5
  176. package/{ecc → src}/examples/go-microservice-CLAUDE.md +6 -6
  177. package/{ecc → src}/examples/rust-api-CLAUDE.md +4 -4
  178. package/{ecc → src}/examples/saas-nextjs-CLAUDE.md +8 -8
  179. package/{gsd/hooks/gsd-context-monitor.js → src/hooks/ccp-context-monitor.js} +3 -3
  180. package/src/hooks/ccp-prompt-guard.js +96 -0
  181. package/{gsd/hooks/gsd-statusline.js → src/hooks/ccp-statusline.js} +7 -7
  182. package/src/hooks/ccp-workflow-guard.js +94 -0
  183. package/src/hooks/config-protection.js +141 -0
  184. package/{kit → src}/hooks/kit-check-update.js +7 -4
  185. package/src/hooks/mcp-health-check.js +620 -0
  186. package/{ecc/scripts → src}/hooks/run-with-flags-shell.sh +1 -1
  187. package/{ecc/scripts → src}/hooks/run-with-flags.js +74 -13
  188. package/src/hooks/session-end-marker.js +29 -0
  189. package/{ecc/scripts → src}/hooks/session-end.js +83 -40
  190. package/{ecc/scripts → src}/hooks/session-start.js +76 -10
  191. package/{ecc/scripts → src}/lib/hook-flags.js +8 -4
  192. package/{ecc/scripts → src}/lib/project-detect.js +2 -1
  193. package/{ecc/scripts → src}/lib/session-manager.d.ts +5 -1
  194. package/{ecc/scripts → src}/lib/session-manager.js +202 -92
  195. package/{ecc/scripts → src}/lib/utils.d.ts +23 -1
  196. package/{ecc/scripts → src}/lib/utils.js +91 -3
  197. package/{gsd/get-shit-done/bin/gsd-tools.cjs → src/pilot/bin/ccp-tools.cjs} +257 -86
  198. package/{gsd/get-shit-done → src/pilot}/bin/lib/commands.cjs +1 -1
  199. package/src/pilot/bin/lib/config.cjs +444 -0
  200. package/src/pilot/bin/lib/core.cjs +1190 -0
  201. package/src/pilot/bin/lib/init.cjs +1281 -0
  202. package/src/pilot/bin/lib/model-profiles.cjs +67 -0
  203. package/{gsd/get-shit-done → src/pilot}/bin/lib/phase.cjs +2 -2
  204. package/src/pilot/bin/lib/security.cjs +382 -0
  205. package/{gsd/get-shit-done → src/pilot}/bin/lib/state.cjs +1 -1
  206. package/src/pilot/bin/lib/uat.cjs +282 -0
  207. package/{gsd/get-shit-done → src/pilot}/bin/lib/verify.cjs +10 -10
  208. package/{gsd/get-shit-done → src/pilot}/references/continuation-format.md +16 -16
  209. package/{gsd/get-shit-done → src/pilot}/references/decimal-phase-calculation.md +5 -5
  210. package/{gsd/get-shit-done → src/pilot}/references/git-integration.md +5 -5
  211. package/{gsd/get-shit-done → src/pilot}/references/git-planning-commit.md +4 -4
  212. package/src/pilot/references/mcp-servers.json +153 -0
  213. package/{gsd/get-shit-done → src/pilot}/references/model-profile-resolution.md +2 -2
  214. package/{gsd/get-shit-done → src/pilot}/references/model-profiles.md +20 -20
  215. package/{gsd/get-shit-done → src/pilot}/references/phase-argument-parsing.md +4 -4
  216. package/{gsd/get-shit-done → src/pilot}/references/planning-config.md +15 -15
  217. package/{gsd/get-shit-done → src/pilot}/references/ui-brand.md +5 -5
  218. package/{gsd/get-shit-done → src/pilot}/references/verification-patterns.md +1 -1
  219. package/{gsd/get-shit-done → src/pilot}/templates/DEBUG.md +1 -1
  220. package/{gsd/get-shit-done → src/pilot}/templates/UAT.md +3 -3
  221. package/src/pilot/templates/UI-SPEC.md +100 -0
  222. package/{gsd/get-shit-done → src/pilot}/templates/VALIDATION.md +1 -1
  223. package/src/pilot/templates/claude-md.md +122 -0
  224. package/{gsd/get-shit-done → src/pilot}/templates/codebase/architecture.md +2 -2
  225. package/{gsd/get-shit-done → src/pilot}/templates/codebase/structure.md +13 -13
  226. package/{gsd/get-shit-done → src/pilot}/templates/context.md +4 -4
  227. package/src/pilot/templates/copilot-instructions.md +7 -0
  228. package/{gsd/get-shit-done → src/pilot}/templates/debug-subagent-prompt.md +4 -4
  229. package/src/pilot/templates/dev-preferences.md +21 -0
  230. package/{gsd/get-shit-done → src/pilot}/templates/discovery.md +2 -2
  231. package/src/pilot/templates/discussion-log.md +63 -0
  232. package/{gsd/get-shit-done → src/pilot}/templates/phase-prompt.md +12 -12
  233. package/{gsd/get-shit-done → src/pilot}/templates/planner-subagent-prompt.md +7 -7
  234. package/{gsd/get-shit-done → src/pilot}/templates/project.md +1 -1
  235. package/{gsd/get-shit-done → src/pilot}/templates/research.md +2 -2
  236. package/{gsd/get-shit-done → src/pilot}/templates/state.md +2 -2
  237. package/{gsd/get-shit-done → src/pilot}/templates/summary-complex.md +1 -1
  238. package/{gsd/get-shit-done → src/pilot}/workflows/add-phase.md +11 -11
  239. package/{gsd/get-shit-done → src/pilot}/workflows/add-tests.md +15 -15
  240. package/{gsd/get-shit-done → src/pilot}/workflows/add-todo.md +7 -7
  241. package/{gsd/get-shit-done → src/pilot}/workflows/audit-milestone.md +24 -16
  242. package/src/pilot/workflows/audit-uat.md +109 -0
  243. package/src/pilot/workflows/autonomous.md +891 -0
  244. package/{gsd/get-shit-done → src/pilot}/workflows/check-todos.md +10 -10
  245. package/{gsd/get-shit-done → src/pilot}/workflows/cleanup.md +3 -3
  246. package/{gsd/get-shit-done → src/pilot}/workflows/complete-milestone.md +19 -16
  247. package/{gsd/get-shit-done → src/pilot}/workflows/diagnose-issues.md +9 -4
  248. package/{gsd/get-shit-done → src/pilot}/workflows/discovery-phase.md +8 -8
  249. package/src/pilot/workflows/discuss-phase-assumptions.md +653 -0
  250. package/{gsd/get-shit-done → src/pilot}/workflows/discuss-phase.md +407 -49
  251. package/src/pilot/workflows/do.md +104 -0
  252. package/src/pilot/workflows/docs-update.md +1165 -0
  253. package/src/pilot/workflows/execute-phase.md +821 -0
  254. package/{gsd/get-shit-done → src/pilot}/workflows/execute-plan.md +79 -28
  255. package/src/pilot/workflows/fast.md +105 -0
  256. package/src/pilot/workflows/forensics.md +265 -0
  257. package/{gsd/get-shit-done → src/pilot}/workflows/health.md +34 -11
  258. package/src/pilot/workflows/help.md +767 -0
  259. package/{gsd/get-shit-done → src/pilot}/workflows/insert-phase.md +10 -10
  260. package/{gsd/get-shit-done → src/pilot}/workflows/list-phase-assumptions.md +4 -4
  261. package/src/pilot/workflows/manager.md +362 -0
  262. package/{gsd/get-shit-done → src/pilot}/workflows/map-codebase.md +27 -17
  263. package/src/pilot/workflows/milestone-summary.md +223 -0
  264. package/{gsd/get-shit-done → src/pilot}/workflows/new-milestone.md +135 -33
  265. package/{gsd/get-shit-done → src/pilot}/workflows/new-project.md +152 -79
  266. package/src/pilot/workflows/next.md +97 -0
  267. package/src/pilot/workflows/node-repair.md +92 -0
  268. package/src/pilot/workflows/note.md +156 -0
  269. package/src/pilot/workflows/pause-work.md +177 -0
  270. package/{gsd/get-shit-done → src/pilot}/workflows/plan-milestone-gaps.md +10 -11
  271. package/src/pilot/workflows/plan-phase.md +859 -0
  272. package/src/pilot/workflows/plant-seed.md +169 -0
  273. package/src/pilot/workflows/pr-branch.md +129 -0
  274. package/src/pilot/workflows/profile-user.md +452 -0
  275. package/{gsd/get-shit-done → src/pilot}/workflows/progress.md +95 -34
  276. package/{gsd/get-shit-done → src/pilot}/workflows/quick.md +33 -21
  277. package/{gsd/get-shit-done → src/pilot}/workflows/remove-phase.md +14 -14
  278. package/{gsd/get-shit-done → src/pilot}/workflows/research-phase.md +18 -10
  279. package/{gsd/get-shit-done → src/pilot}/workflows/resume-project.md +37 -18
  280. package/src/pilot/workflows/review.md +244 -0
  281. package/src/pilot/workflows/secure-phase.md +164 -0
  282. package/src/pilot/workflows/session-report.md +146 -0
  283. package/{gsd/get-shit-done → src/pilot}/workflows/set-profile.md +7 -7
  284. package/{gsd/get-shit-done → src/pilot}/workflows/settings.md +75 -22
  285. package/src/pilot/workflows/ship.md +228 -0
  286. package/src/pilot/workflows/stats.md +60 -0
  287. package/{gsd/get-shit-done → src/pilot}/workflows/transition.md +57 -17
  288. package/src/pilot/workflows/ui-phase.md +302 -0
  289. package/src/pilot/workflows/ui-review.md +165 -0
  290. package/{gsd/get-shit-done → src/pilot}/workflows/update.md +88 -58
  291. package/{gsd/get-shit-done → src/pilot}/workflows/validate-phase.md +24 -17
  292. package/{gsd/get-shit-done → src/pilot}/workflows/verify-phase.md +26 -15
  293. package/{gsd/get-shit-done → src/pilot}/workflows/verify-work.md +89 -37
  294. package/{ecc → src}/rules/common/agents.md +1 -0
  295. package/src/rules/common/code-review.md +124 -0
  296. package/{ecc → src}/rules/common/coding-style.md +21 -0
  297. package/src/rules/zh/README.md +108 -0
  298. package/src/rules/zh/agents.md +50 -0
  299. package/src/rules/zh/code-review.md +124 -0
  300. package/src/rules/zh/coding-style.md +48 -0
  301. package/src/rules/zh/development-workflow.md +44 -0
  302. package/src/rules/zh/git-workflow.md +24 -0
  303. package/src/rules/zh/hooks.md +30 -0
  304. package/src/rules/zh/patterns.md +31 -0
  305. package/src/rules/zh/performance.md +55 -0
  306. package/src/rules/zh/security.md +29 -0
  307. package/src/rules/zh/testing.md +29 -0
  308. package/src/skills/agentic-engineering/SKILL.md +63 -0
  309. package/src/skills/ai-first-engineering/SKILL.md +51 -0
  310. package/src/skills/ai-regression-testing/SKILL.md +385 -0
  311. package/src/skills/api-design/SKILL.md +523 -0
  312. package/src/skills/architecture-decision-records/SKILL.md +179 -0
  313. package/src/skills/autonomous-agent-harness/SKILL.md +267 -0
  314. package/src/skills/autonomous-loops/SKILL.md +610 -0
  315. package/src/skills/backend-patterns/SKILL.md +598 -0
  316. package/src/skills/benchmark/SKILL.md +87 -0
  317. package/src/skills/blueprint/SKILL.md +90 -0
  318. package/src/skills/browser-qa/SKILL.md +81 -0
  319. package/src/skills/bun-runtime/SKILL.md +84 -0
  320. package/src/skills/claude-api/SKILL.md +337 -0
  321. package/src/skills/codebase-onboarding/SKILL.md +233 -0
  322. package/src/skills/coding-standards/SKILL.md +530 -0
  323. package/src/skills/content-hash-cache-pattern/SKILL.md +161 -0
  324. package/src/skills/context-budget/SKILL.md +135 -0
  325. package/{ecc → src}/skills/continuous-learning-v2/SKILL.md +6 -6
  326. package/{ecc → src}/skills/continuous-learning-v2/agents/observer-loop.sh +1 -1
  327. package/{ecc → src}/skills/continuous-learning-v2/agents/observer.md +1 -1
  328. package/src/skills/cost-aware-llm-pipeline/SKILL.md +183 -0
  329. package/src/skills/cpp-coding-standards/SKILL.md +723 -0
  330. package/src/skills/cpp-testing/SKILL.md +324 -0
  331. package/src/skills/database-migrations/SKILL.md +429 -0
  332. package/src/skills/deep-research/SKILL.md +155 -0
  333. package/src/skills/deployment-patterns/SKILL.md +427 -0
  334. package/src/skills/design-system/SKILL.md +82 -0
  335. package/src/skills/django-patterns/SKILL.md +734 -0
  336. package/src/skills/django-security/SKILL.md +593 -0
  337. package/src/skills/django-tdd/SKILL.md +729 -0
  338. package/src/skills/django-verification/SKILL.md +469 -0
  339. package/src/skills/docker-patterns/SKILL.md +364 -0
  340. package/src/skills/documentation-lookup/SKILL.md +90 -0
  341. package/src/skills/e2e-testing/SKILL.md +326 -0
  342. package/src/skills/eval-harness/SKILL.md +270 -0
  343. package/src/skills/exa-search/SKILL.md +103 -0
  344. package/src/skills/flutter-dart-code-review/SKILL.md +435 -0
  345. package/src/skills/frontend-patterns/SKILL.md +642 -0
  346. package/src/skills/gan-style-harness/SKILL.md +278 -0
  347. package/src/skills/git-workflow/SKILL.md +715 -0
  348. package/src/skills/golang-patterns/SKILL.md +674 -0
  349. package/src/skills/golang-testing/SKILL.md +720 -0
  350. package/src/skills/hexagonal-architecture/SKILL.md +276 -0
  351. package/src/skills/iterative-retrieval/SKILL.md +211 -0
  352. package/src/skills/java-coding-standards/SKILL.md +147 -0
  353. package/src/skills/jpa-patterns/SKILL.md +151 -0
  354. package/src/skills/kotlin-coroutines-flows/SKILL.md +284 -0
  355. package/src/skills/kotlin-exposed-patterns/SKILL.md +719 -0
  356. package/src/skills/kotlin-ktor-patterns/SKILL.md +689 -0
  357. package/src/skills/kotlin-patterns/SKILL.md +711 -0
  358. package/src/skills/kotlin-testing/SKILL.md +824 -0
  359. package/src/skills/laravel-patterns/SKILL.md +415 -0
  360. package/src/skills/laravel-plugin-discovery/SKILL.md +229 -0
  361. package/src/skills/laravel-security/SKILL.md +285 -0
  362. package/src/skills/laravel-tdd/SKILL.md +283 -0
  363. package/src/skills/laravel-verification/SKILL.md +179 -0
  364. package/src/skills/mcp-server-patterns/SKILL.md +67 -0
  365. package/src/skills/nextjs-turbopack/SKILL.md +44 -0
  366. package/src/skills/nuxt4-patterns/SKILL.md +100 -0
  367. package/src/skills/opensource-pipeline/SKILL.md +255 -0
  368. package/src/skills/perl-patterns/SKILL.md +504 -0
  369. package/src/skills/perl-security/SKILL.md +503 -0
  370. package/src/skills/perl-testing/SKILL.md +475 -0
  371. package/src/skills/postgres-patterns/SKILL.md +147 -0
  372. package/src/skills/project-flow-ops/SKILL.md +111 -0
  373. package/src/skills/project-guidelines-example/SKILL.md +349 -0
  374. package/src/skills/prompt-optimizer/SKILL.md +397 -0
  375. package/src/skills/python-patterns/SKILL.md +750 -0
  376. package/src/skills/python-testing/SKILL.md +816 -0
  377. package/src/skills/pytorch-patterns/SKILL.md +396 -0
  378. package/src/skills/regex-vs-llm-structured-text/SKILL.md +220 -0
  379. package/src/skills/repo-scan/SKILL.md +78 -0
  380. package/src/skills/rules-distill/SKILL.md +264 -0
  381. package/src/skills/rules-distill/scripts/scan-rules.sh +58 -0
  382. package/src/skills/rules-distill/scripts/scan-skills.sh +129 -0
  383. package/src/skills/rust-patterns/SKILL.md +499 -0
  384. package/src/skills/rust-testing/SKILL.md +500 -0
  385. package/src/skills/safety-guard/SKILL.md +69 -0
  386. package/src/skills/search-first/SKILL.md +161 -0
  387. package/src/skills/security-review/SKILL.md +495 -0
  388. package/src/skills/security-review/cloud-infrastructure-security.md +361 -0
  389. package/src/skills/security-scan/SKILL.md +165 -0
  390. package/src/skills/springboot-patterns/SKILL.md +314 -0
  391. package/src/skills/springboot-security/SKILL.md +272 -0
  392. package/src/skills/springboot-tdd/SKILL.md +158 -0
  393. package/src/skills/springboot-verification/SKILL.md +231 -0
  394. package/src/skills/swift-concurrency-6-2/SKILL.md +216 -0
  395. package/src/skills/tdd-workflow/SKILL.md +410 -0
  396. package/src/skills/token-budget-advisor/SKILL.md +133 -0
  397. package/{ecc/skills/verification-loop-SKILL.md → src/skills/verification-loop/SKILL.md} +1 -1
  398. package/src/skills/workspace-surface-audit/SKILL.md +125 -0
  399. package/ecc/scripts/hooks/session-end-marker.js +0 -15
  400. package/gsd/LICENSE +0 -21
  401. package/gsd/commands-gsd/discuss-phase.md +0 -90
  402. package/gsd/commands-gsd/execute-phase.md +0 -41
  403. package/gsd/commands-gsd/join-discord.md +0 -18
  404. package/gsd/commands-gsd/reapply-patches.md +0 -123
  405. package/gsd/commands-gsd/set-profile.md +0 -34
  406. package/gsd/get-shit-done/bin/lib/config.cjs +0 -169
  407. package/gsd/get-shit-done/bin/lib/core.cjs +0 -492
  408. package/gsd/get-shit-done/bin/lib/init.cjs +0 -710
  409. package/gsd/get-shit-done/workflows/execute-phase.md +0 -459
  410. package/gsd/get-shit-done/workflows/help.md +0 -489
  411. package/gsd/get-shit-done/workflows/pause-work.md +0 -122
  412. package/gsd/get-shit-done/workflows/plan-phase.md +0 -560
  413. package/gsd/hooks/gsd-check-update.js +0 -81
  414. package/kit/CLAUDE.md +0 -43
  415. package/kit/commands/kit/update.md +0 -46
  416. package/kit/mcp.json +0 -10
  417. package/kit/rules/code-style.md +0 -24
  418. /package/{ecc → src}/agents/architect.md +0 -0
  419. /package/{ecc → src}/agents/code-reviewer.md +0 -0
  420. /package/{ecc → src}/agents/e2e-runner.md +0 -0
  421. /package/{ecc → src}/agents/security-reviewer.md +0 -0
  422. /package/{ecc → src}/agents/tdd-guide.md +0 -0
  423. /package/{ecc/rules → src/available-rules}/golang/coding-style.md +0 -0
  424. /package/{ecc/rules → src/available-rules}/golang/hooks.md +0 -0
  425. /package/{ecc/rules → src/available-rules}/golang/patterns.md +0 -0
  426. /package/{ecc/rules → src/available-rules}/golang/security.md +0 -0
  427. /package/{ecc/rules → src/available-rules}/golang/testing.md +0 -0
  428. /package/{ecc/rules → src/available-rules}/kotlin/coding-style.md +0 -0
  429. /package/{ecc/rules → src/available-rules}/kotlin/patterns.md +0 -0
  430. /package/{ecc/rules → src/available-rules}/kotlin/security.md +0 -0
  431. /package/{ecc/rules → src/available-rules}/kotlin/testing.md +0 -0
  432. /package/{ecc/rules → src/available-rules}/perl/coding-style.md +0 -0
  433. /package/{ecc/rules → src/available-rules}/perl/hooks.md +0 -0
  434. /package/{ecc/rules → src/available-rules}/perl/patterns.md +0 -0
  435. /package/{ecc/rules → src/available-rules}/perl/security.md +0 -0
  436. /package/{ecc/rules → src/available-rules}/perl/testing.md +0 -0
  437. /package/{ecc/rules → src/available-rules}/php/coding-style.md +0 -0
  438. /package/{ecc/rules → src/available-rules}/php/hooks.md +0 -0
  439. /package/{ecc/rules → src/available-rules}/php/patterns.md +0 -0
  440. /package/{ecc/rules → src/available-rules}/php/security.md +0 -0
  441. /package/{ecc/rules → src/available-rules}/php/testing.md +0 -0
  442. /package/{ecc/rules → src/available-rules}/python/coding-style.md +0 -0
  443. /package/{ecc/rules → src/available-rules}/python/hooks.md +0 -0
  444. /package/{ecc/rules → src/available-rules}/python/patterns.md +0 -0
  445. /package/{ecc/rules → src/available-rules}/python/security.md +0 -0
  446. /package/{ecc/rules → src/available-rules}/python/testing.md +0 -0
  447. /package/{ecc/rules → src/available-rules}/swift/coding-style.md +0 -0
  448. /package/{ecc/rules → src/available-rules}/swift/hooks.md +0 -0
  449. /package/{ecc/rules → src/available-rules}/swift/patterns.md +0 -0
  450. /package/{ecc/rules → src/available-rules}/swift/security.md +0 -0
  451. /package/{ecc/rules → src/available-rules}/swift/testing.md +0 -0
  452. /package/{ecc/rules → src/available-rules}/typescript/coding-style.md +0 -0
  453. /package/{ecc/rules → src/available-rules}/typescript/hooks.md +0 -0
  454. /package/{ecc/rules → src/available-rules}/typescript/patterns.md +0 -0
  455. /package/{ecc/rules → src/available-rules}/typescript/security.md +0 -0
  456. /package/{ecc/rules → src/available-rules}/typescript/testing.md +0 -0
  457. /package/{ecc → src}/contexts/dev.md +0 -0
  458. /package/{ecc → src}/contexts/research.md +0 -0
  459. /package/{ecc → src}/contexts/review.md +0 -0
  460. /package/{ecc → src}/examples/user-CLAUDE.md +0 -0
  461. /package/{ecc/scripts → src}/hooks/check-hook-enabled.js +0 -0
  462. /package/{ecc/scripts → src}/hooks/evaluate-session.js +0 -0
  463. /package/{ecc/scripts → src}/hooks/pre-compact.js +0 -0
  464. /package/{ecc/scripts → src}/hooks/suggest-compact.js +0 -0
  465. /package/{ecc/scripts → src}/lib/package-manager.d.ts +0 -0
  466. /package/{ecc/scripts → src}/lib/package-manager.js +0 -0
  467. /package/{ecc/scripts → src}/lib/resolve-formatter.js +0 -0
  468. /package/{ecc/scripts → src}/lib/session-aliases.d.ts +0 -0
  469. /package/{ecc/scripts → src}/lib/session-aliases.js +0 -0
  470. /package/{ecc/scripts → src}/lib/shell-split.js +0 -0
  471. /package/{gsd/get-shit-done → src/pilot}/bin/lib/frontmatter.cjs +0 -0
  472. /package/{gsd/get-shit-done → src/pilot}/bin/lib/milestone.cjs +0 -0
  473. /package/{gsd/get-shit-done → src/pilot}/bin/lib/roadmap.cjs +0 -0
  474. /package/{gsd/get-shit-done → src/pilot}/bin/lib/template.cjs +0 -0
  475. /package/{gsd/get-shit-done → src/pilot}/references/checkpoints.md +0 -0
  476. /package/{gsd/get-shit-done → src/pilot}/references/questioning.md +0 -0
  477. /package/{gsd/get-shit-done → src/pilot}/references/tdd.md +0 -0
  478. /package/{gsd/get-shit-done → src/pilot}/templates/codebase/concerns.md +0 -0
  479. /package/{gsd/get-shit-done → src/pilot}/templates/codebase/conventions.md +0 -0
  480. /package/{gsd/get-shit-done → src/pilot}/templates/codebase/integrations.md +0 -0
  481. /package/{gsd/get-shit-done → src/pilot}/templates/codebase/stack.md +0 -0
  482. /package/{gsd/get-shit-done → src/pilot}/templates/codebase/testing.md +0 -0
  483. /package/{gsd/get-shit-done → src/pilot}/templates/config.json +0 -0
  484. /package/{gsd/get-shit-done → src/pilot}/templates/continue-here.md +0 -0
  485. /package/{gsd/get-shit-done → src/pilot}/templates/milestone-archive.md +0 -0
  486. /package/{gsd/get-shit-done → src/pilot}/templates/milestone.md +0 -0
  487. /package/{gsd/get-shit-done → src/pilot}/templates/requirements.md +0 -0
  488. /package/{gsd/get-shit-done → src/pilot}/templates/research-project/ARCHITECTURE.md +0 -0
  489. /package/{gsd/get-shit-done → src/pilot}/templates/research-project/FEATURES.md +0 -0
  490. /package/{gsd/get-shit-done → src/pilot}/templates/research-project/PITFALLS.md +0 -0
  491. /package/{gsd/get-shit-done → src/pilot}/templates/research-project/STACK.md +0 -0
  492. /package/{gsd/get-shit-done → src/pilot}/templates/research-project/SUMMARY.md +0 -0
  493. /package/{gsd/get-shit-done → src/pilot}/templates/retrospective.md +0 -0
  494. /package/{gsd/get-shit-done → src/pilot}/templates/roadmap.md +0 -0
  495. /package/{gsd/get-shit-done → src/pilot}/templates/summary-minimal.md +0 -0
  496. /package/{gsd/get-shit-done → src/pilot}/templates/summary-standard.md +0 -0
  497. /package/{gsd/get-shit-done → src/pilot}/templates/summary.md +0 -0
  498. /package/{gsd/get-shit-done → src/pilot}/templates/user-setup.md +0 -0
  499. /package/{gsd/get-shit-done → src/pilot}/templates/verification-report.md +0 -0
  500. /package/{ecc → src}/rules/common/development-workflow.md +0 -0
  501. /package/{ecc → src}/rules/common/git-workflow.md +0 -0
  502. /package/{ecc → src}/rules/common/hooks.md +0 -0
  503. /package/{ecc → src}/rules/common/patterns.md +0 -0
  504. /package/{ecc → src}/rules/common/performance.md +0 -0
  505. /package/{ecc → src}/rules/common/security.md +0 -0
  506. /package/{ecc → src}/rules/common/testing.md +0 -0
  507. /package/{ecc → src}/skills/continuous-learning-v2/agents/start-observer.sh +0 -0
  508. /package/{ecc → src}/skills/continuous-learning-v2/config.json +0 -0
  509. /package/{ecc → src}/skills/continuous-learning-v2/hooks/observe.sh +0 -0
  510. /package/{ecc → src}/skills/continuous-learning-v2/scripts/detect-project.sh +0 -0
  511. /package/{ecc → src}/skills/continuous-learning-v2/scripts/instinct-cli.py +0 -0
  512. /package/{ecc → src}/skills/continuous-learning-v2/scripts/test_parse_instinct.py +0 -0
  513. /package/{ecc → src}/skills/strategic-compact/SKILL.md +0 -0
  514. /package/{ecc → src}/skills/strategic-compact/suggest-compact.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * Executes a hook script only when enabled by ECC hook profile flags.
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.CLAUDE_PLUGIN_ROOT && process.env.CLAUDE_PLUGIN_ROOT.trim()) {
35
- return process.env.CLAUDE_PLUGIN_ROOT;
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
- if (output !== null && output !== undefined) process.stdout.write(output);
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('node', [scriptPath], {
150
+ const result = spawnSync(process.execPath, [scriptPath], {
103
151
  input: raw,
104
152
  encoding: 'utf8',
105
- env: process.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
- if (result.stdout) process.stdout.write(result.stdout);
162
+ writeLegacySpawnOutput(raw, result);
111
163
  if (result.stderr) process.stderr.write(result.stderr);
112
164
 
113
- const code = Number.isInteger(result.status) ? result.status : 0;
114
- process.exit(code);
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
- replaceInFile,
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
- if (text.trim()) {
60
- userMessages.push(text.trim().slice(0, 200));
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
- // Update existing session file
164
- const updated = replaceInFile(
165
- sessionFile,
166
- /\*\*Last Updated:\*\*.*/,
167
- `**Last Updated:** ${currentTime}`
168
- );
169
- if (!updated) {
170
- log(`[SessionEnd] Failed to update timestamp in ${sessionFile}`);
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 existing = readFile(sessionFile);
178
- if (existing) {
179
- const summaryBlock = buildSummaryBlock(summary);
180
- let updatedContent = existing;
181
-
182
- if (existing.includes(SUMMARY_START_MARKER) && existing.includes(SUMMARY_END_MARKER)) {
183
- updatedContent = existing.replace(
184
- new RegExp(`${escapeRegExp(SUMMARY_START_MARKER)}[\\s\\S]*?${escapeRegExp(SUMMARY_END_MARKER)}`),
185
- summaryBlock
186
- );
187
- } else {
188
- // Migration path for files created before summary markers existed.
189
- updatedContent = existing.replace(
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 = `# Session: ${today}
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 collapse newlines and escape backticks to prevent markdown breaks)
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
- log,
19
- output
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 = findFiles(sessionsDir, '*-session.tmp', { maxAge: 7 });
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
- output(`Previous session summary:\n${content}`);
77
+ additionalContextParts.push(`Previous session summary:\n${content}`);
46
78
  }
47
79
  }
48
80
 
@@ -59,7 +91,7 @@ async function main() {
59
91
  if (aliases.length > 0) {
60
92
  const aliasNames = aliases.map(a => a.name).join(', ');
61
93
  log(`[SessionStart] ${aliases.length} session alias(es) available: ${aliasNames}`);
62
- log(`[SessionStart] Use /sessions load <alias> to continue a previous session`);
94
+ log(`[SessionStart] Use /ccp:sessions load <alias> to continue a previous session`);
63
95
  }
64
96
 
65
97
  // Detect and report package manager
@@ -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 ${parts.join('; ')}`);
86
- output(`Project type: ${JSON.stringify(projectInfo)}`);
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
- process.exit(0);
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.exit(0); // Don't block on errors
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
- * - ECC_HOOK_PROFILE=minimal|standard|strict (default: standard)
7
- * - ECC_DISABLED_HOOKS=comma,separated,hook,ids
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/sessions/.
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;