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
package/bin/install.js CHANGED
@@ -8,7 +8,6 @@ const { execSync } = require('child_process');
8
8
  const cyan = '\x1b[36m', green = '\x1b[32m', yellow = '\x1b[33m', dim = '\x1b[2m', reset = '\x1b[0m';
9
9
 
10
10
  const pkg = require('../package.json');
11
- const manifest = require('../manifest.json');
12
11
 
13
12
  const args = process.argv.slice(2);
14
13
  const hasGlobal = args.includes('--global') || args.includes('-g');
@@ -18,12 +17,10 @@ const hasUninstall = args.includes('--uninstall');
18
17
  const hasHelp = args.includes('--help') || args.includes('-h');
19
18
 
20
19
  const banner = '\n' +
21
- cyan + ' ╔═╗┬┬ ┌─┐┌┬┐\n' +
22
- ' ╠═╝││ \n' +
23
- ' ┴┴─┘└─┘ ' + reset + '\n\n' +
24
- ' Claude Code Pilot ' + dim + 'v' + pkg.version + reset + '\n' +
25
- ' GSD ' + dim + 'v' + manifest.bundled.gsd.version + reset +
26
- ' + ECC ' + dim + 'v' + manifest.bundled.ecc.version + reset + '\n';
20
+ cyan + ' \u2554\u2550\u2557\u252C\u252C \u250C\u2500\u2510\u250C\u252C\u2510\n' +
21
+ ' \u2560\u2550\u2563\u2502\u2502 \u2502 \u2502 \u2502 \n' +
22
+ ' \u2569 \u2534\u2534\u2500\u2518\u2514\u2500\u2518 \u2534 ' + reset + '\n\n' +
23
+ ' Claude Code Pilot ' + dim + 'v' + pkg.version + reset + '\n';
27
24
 
28
25
  console.log(banner);
29
26
 
@@ -48,6 +45,64 @@ const locationLabel = isGlobal ? targetDir.replace(os.homedir(), '~') : '.claude
48
45
  const pathPrefix = isGlobal ? `${targetDir.replace(/\\/g, '/')}/` : './.claude/';
49
46
  const projectRoot = isGlobal ? os.homedir() : process.cwd();
50
47
 
48
+ // --- Templates ---
49
+ const BOOTSTRAP_MARKER = "Run `/ccp:setup` to auto-configure";
50
+
51
+ const BOOTSTRAP_TEMPLATE = `# Project Agent Guide
52
+
53
+ > **First time?** Run \`/ccp:setup\` to auto-configure this project.
54
+ > **Update?** Run \`/ccp:update\` to get the latest version.
55
+
56
+ This file will be generated by \`/ccp:setup\` with project-specific details.
57
+
58
+ ## Claude Code Pilot
59
+
60
+ Spec-driven development with fresh 200k contexts per task:
61
+
62
+ - \`/ccp:setup\` -- Auto-configure this project
63
+ - \`/ccp:new-project\` -- Initialize with roadmap and milestones
64
+ - \`/ccp:quick "task"\` -- Lightweight mode for small tasks
65
+ - \`/ccp:discuss-phase N\` -- Capture requirements
66
+ - \`/ccp:plan-phase N\` -- Create atomic plans
67
+ - \`/ccp:execute-phase N\` -- Build with fresh contexts
68
+ - \`/ccp:help\` -- All available commands
69
+
70
+ ## Utilities
71
+
72
+ - \`/ccp:verify\` -- Multi-phase verification (build, types, lint, tests, security)
73
+ - \`/ccp:checkpoint create "name"\` -- Git-backed snapshots
74
+ - \`/ccp:save-session\` -- Persist session state
75
+ - \`/ccp:learn\` -- Extract reusable patterns
76
+
77
+ ## Before ANY Work
78
+
79
+ \`\`\`bash
80
+ npx skills find <keywords> # Discover ecosystem skills
81
+ \`\`\`
82
+
83
+ ## Reference Docs & MCP
84
+
85
+ - \`.claude/contexts/\` -- dev.md, research.md, review.md (mode switching)
86
+ - MCP: **context7** (library docs), **codebase-memory-mcp** (code intelligence)
87
+ `;
88
+
89
+ const MCP_TEMPLATE = {
90
+ "_comment": "MCP servers. Find more: github.com/mcp | mcp.so",
91
+ "mcpServers": {
92
+ "context7": {
93
+ "_comment": "Up-to-date library docs. Prevents hallucinated APIs.",
94
+ "command": "npx",
95
+ "args": ["-y", "@upstash/context7-mcp@latest"]
96
+ },
97
+ "codebase-memory-mcp": {
98
+ "_comment": "Code intelligence. Index: 'Index this project'. Query: search_graph, get_architecture.",
99
+ "command": "codebase-memory-mcp",
100
+ "args": [],
101
+ "_install": "curl -fsSL https://raw.githubusercontent.com/DeusData/codebase-memory-mcp/main/install.sh | bash"
102
+ }
103
+ }
104
+ };
105
+
51
106
  // --- Utilities ---
52
107
  function readSettings(p) {
53
108
  if (fs.existsSync(p)) { try { return JSON.parse(fs.readFileSync(p, 'utf8')); } catch { return {}; } }
@@ -87,7 +142,6 @@ function copyFile(s, d, replace = false) {
87
142
  let text = fs.readFileSync(s, 'utf8');
88
143
  text = text.replace(/~\/\.claude\//g, pathPrefix);
89
144
  text = text.replace(/\$HOME\/\.claude\//g, pathPrefix);
90
- // Replace CLAUDE_PLUGIN_ROOT with actual path
91
145
  text = text.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, pathPrefix.replace(/\/$/, ''));
92
146
  fs.writeFileSync(d, text);
93
147
  } else {
@@ -111,155 +165,125 @@ function addHookIfMissing(settings, event, matcher, fingerprint, hookCmd, descri
111
165
  return false;
112
166
  }
113
167
 
114
- // --- Install ---
115
- function install() {
116
- const mode = hasUpdate ? 'Updating' : 'Installing';
117
- console.log(` ${mode} to ${cyan}${locationLabel}${reset}\n`);
118
- fs.mkdirSync(targetDir, { recursive: true });
119
-
120
- // ═══════════════════════════════════════
121
- // Kit Core
122
- // ═══════════════════════════════════════
123
- console.log(` ${dim}Kit core...${reset}`);
124
- const kitSrc = path.join(src, 'kit');
125
- copyDir(path.join(kitSrc, 'commands'), path.join(targetDir, 'commands'), { replacePaths: true });
126
- copyDir(path.join(kitSrc, 'hooks'), path.join(targetDir, 'hooks'));
127
- console.log(` ${green}✓${reset} Kit commands + hooks`);
128
-
129
- // ═══════════════════════════════════════
130
- // GSD
131
- // ═══════════════════════════════════════
132
- console.log(`\n ${dim}GSD v${manifest.bundled.gsd.version}...${reset}`);
133
- const gsdSrc = path.join(src, 'gsd');
134
-
135
- const cmdCount = copyDir(path.join(gsdSrc, 'commands-gsd'), path.join(targetDir, 'commands', 'gsd'), { replacePaths: true, clean: true });
136
- console.log(` ${green}✓${reset} GSD commands (${cmdCount})`);
137
-
138
- copyDir(path.join(gsdSrc, 'get-shit-done'), path.join(targetDir, 'get-shit-done'), { replacePaths: true, clean: true });
139
- console.log(` ${green}✓${reset} GSD core (workflows, references, templates)`);
140
-
141
- copyDir(path.join(gsdSrc, 'agents'), path.join(targetDir, 'agents'), { replacePaths: true });
142
- console.log(` ${green}✓${reset} GSD agents (12)`);
143
-
144
- // GSD hooks
145
- const gsdHooksSrc = path.join(gsdSrc, 'hooks');
146
- if (fs.existsSync(gsdHooksSrc)) {
147
- const hooksDest = path.join(targetDir, 'hooks');
148
- fs.mkdirSync(hooksDest, { recursive: true });
149
- for (const f of fs.readdirSync(gsdHooksSrc).filter(f => f.endsWith('.js'))) {
150
- fs.copyFileSync(path.join(gsdHooksSrc, f), path.join(hooksDest, f));
168
+ // --- Migration ---
169
+ const LEGACY_HOOK_FINGERPRINTS = [
170
+ 'ecc-scripts/hooks/',
171
+ 'gsd-context-monitor',
172
+ 'gsd-check-update',
173
+ 'gsd-statusline',
174
+ 'kit-check-update'
175
+ ];
176
+
177
+ const LEGACY_DIRS = [
178
+ 'gsd', 'ecc', 'kit', 'commands/gsd',
179
+ 'get-shit-done', 'ecc-scripts', 'ecc-examples', 'kit-version'
180
+ ];
181
+
182
+ function removeLegacyHooks(settings) {
183
+ let removed = 0;
184
+ if (settings.hooks) {
185
+ for (const event of Object.keys(settings.hooks)) {
186
+ const before = settings.hooks[event].length;
187
+ settings.hooks[event] = settings.hooks[event].filter(entry => {
188
+ const cmds = (entry.hooks || []).map(h => h.command || '');
189
+ const isLegacy = cmds.some(cmd =>
190
+ LEGACY_HOOK_FINGERPRINTS.some(fp => cmd.includes(fp))
191
+ );
192
+ return !isLegacy;
193
+ });
194
+ removed += before - settings.hooks[event].length;
151
195
  }
152
- console.log(` ${green}✓${reset} GSD hooks (statusline, context monitor, update check)`);
153
196
  }
154
-
155
- // ═══════════════════════════════════════
156
- // ECC
157
- // ═══════════════════════════════════════
158
- console.log(`\n ${dim}ECC v${manifest.bundled.ecc.version}...${reset}`);
159
- const eccSrc = path.join(src, 'ecc');
160
-
161
- // ECC commands (flat — alongside kit commands)
162
- const eccCmdSrc = path.join(eccSrc, 'commands');
163
- if (fs.existsSync(eccCmdSrc)) {
164
- for (const f of fs.readdirSync(eccCmdSrc).filter(f => f.endsWith('.md'))) {
165
- copyFile(path.join(eccCmdSrc, f), path.join(targetDir, 'commands', f), true);
197
+ // Check statusLine
198
+ if (settings.statusLine && typeof settings.statusLine === 'object') {
199
+ const slCmd = settings.statusLine.command || '';
200
+ if (LEGACY_HOOK_FINGERPRINTS.some(fp => slCmd.includes(fp))) {
201
+ delete settings.statusLine;
202
+ removed++;
166
203
  }
167
- const eccCmdCount = fs.readdirSync(eccCmdSrc).filter(f => f.endsWith('.md')).length;
168
- console.log(` ${green}✓${reset} ECC commands (${eccCmdCount}: sessions, verify, learn, checkpoint, ...)`);
169
204
  }
170
-
171
- // ECC skills
172
- const eccSkillsSrc = path.join(eccSrc, 'skills');
173
- if (fs.existsSync(eccSkillsSrc)) {
174
- copyDir(eccSkillsSrc, path.join(targetDir, 'skills'), { replacePaths: true });
175
- console.log(` ${green}✓${reset} ECC skills (continuous-learning, strategic-compact, verification-loop)`);
176
- }
177
-
178
- // ECC contexts
179
- const eccCtxSrc = path.join(eccSrc, 'contexts');
180
- if (fs.existsSync(eccCtxSrc)) {
181
- copyDir(eccCtxSrc, path.join(targetDir, 'contexts'));
182
- console.log(` ${green}✓${reset} ECC context modes (dev, research, review)`);
205
+ if (removed > 0) {
206
+ console.log(` ${green}\u2713${reset} Removed ${removed} legacy hooks`);
183
207
  }
208
+ return removed;
209
+ }
184
210
 
185
- // ECC agents (alongside GSD agents)
186
- const eccAgentsSrc = path.join(eccSrc, 'agents');
187
- if (fs.existsSync(eccAgentsSrc)) {
188
- for (const f of fs.readdirSync(eccAgentsSrc).filter(f => f.endsWith('.md'))) {
189
- copyFile(path.join(eccAgentsSrc, f), path.join(targetDir, 'agents', f), true);
211
+ function removeLegacyDirs(dir) {
212
+ for (const d of LEGACY_DIRS) {
213
+ const p = path.join(dir, d);
214
+ if (fs.existsSync(p)) {
215
+ fs.rmSync(p, { recursive: true, force: true });
216
+ console.log(` ${green}\u2713${reset} Removed legacy ${d}/`);
190
217
  }
191
- const eccAgentCount = fs.readdirSync(eccAgentsSrc).filter(f => f.endsWith('.md')).length;
192
- console.log(` ${green}✓${reset} ECC agents (${eccAgentCount}: architect, code-reviewer, security, tdd, ...)`);
193
218
  }
219
+ }
194
220
 
195
- // ECC scripts (hooks + lib — preserve relative paths)
196
- const eccScriptsSrc = path.join(eccSrc, 'scripts');
197
- if (fs.existsSync(eccScriptsSrc)) {
198
- copyDir(eccScriptsSrc, path.join(targetDir, 'ecc-scripts'));
199
- console.log(` ${green}✓${reset} ECC scripts (session lifecycle, project detection, utils)`);
221
+ function migrateGsdToCcp() {
222
+ const gsdDir = path.join(os.homedir(), '.gsd');
223
+ const ccpDir = path.join(os.homedir(), '.ccp');
224
+ if (fs.existsSync(gsdDir) && !fs.existsSync(ccpDir)) {
225
+ fs.renameSync(gsdDir, ccpDir);
226
+ console.log(` ${green}\u2713${reset} Migrated ~/.gsd/ to ~/.ccp/`);
227
+ } else if (fs.existsSync(gsdDir) && fs.existsSync(ccpDir)) {
228
+ console.log(` ${dim}~/.ccp/ already exists, skipping ~/.gsd/ migration${reset}`);
200
229
  }
230
+ }
201
231
 
202
- // Patch ECC getClaudeDir() for local installs (CWD-relative)
203
- if (!isGlobal) {
204
- const utilsPath = path.join(targetDir, 'ecc-scripts', 'lib', 'utils.js');
205
- if (fs.existsSync(utilsPath)) {
206
- let utilsContent = fs.readFileSync(utilsPath, 'utf8');
207
- utilsContent = utilsContent.replace(
208
- /function getClaudeDir\(\)\s*\{[^}]*\}/,
209
- "function getClaudeDir() {\n return path.join(process.cwd(), '.claude');\n}"
210
- );
211
- fs.writeFileSync(utilsPath, utilsContent);
212
- console.log(` ${green}✓${reset} ECC: patched getClaudeDir() for local install`);
213
- }
214
- }
232
+ // --- Install ---
233
+ function install() {
234
+ const mode = hasUpdate ? 'Updating' : 'Installing';
235
+ console.log(` ${mode} to ${cyan}${locationLabel}${reset}\n`);
236
+ fs.mkdirSync(targetDir, { recursive: true });
215
237
 
216
- // ECC rules (common always, language-specific all copied — /setup activates relevant ones)
217
- const eccRulesSrc = path.join(eccSrc, 'rules');
218
- if (fs.existsSync(eccRulesSrc)) {
219
- copyDir(path.join(eccRulesSrc, 'common'), path.join(targetDir, 'rules', 'common'), { replacePaths: true });
220
- // Copy language rules into available-rules/ (activated by /setup based on detection)
221
- for (const lang of fs.readdirSync(eccRulesSrc).filter(d => d !== 'common')) {
222
- const langSrc = path.join(eccRulesSrc, lang);
223
- if (fs.statSync(langSrc).isDirectory()) {
224
- copyDir(langSrc, path.join(targetDir, 'available-rules', lang), { replacePaths: true });
225
- }
226
- }
227
- console.log(` ${green}✓${reset} ECC rules (common + 7 language sets in available-rules/)`);
228
- }
238
+ // =======================================
239
+ // Migration (legacy cleanup)
240
+ // =======================================
241
+ const settingsPath = path.join(targetDir, 'settings.json');
242
+ const settings = readSettings(settingsPath);
243
+
244
+ // removeLegacyHooks runs on EVERY install to handle stale v2 hooks
245
+ removeLegacyHooks(settings);
229
246
 
230
- // ECC examples
231
- const eccExSrc = path.join(eccSrc, 'examples');
232
- if (fs.existsSync(eccExSrc)) {
233
- copyDir(eccExSrc, path.join(targetDir, 'ecc-examples'), { replacePaths: true });
234
- console.log(` ${green}✓${reset} ECC example CLAUDE.md files (reference)`);
247
+ if (hasUpdate) {
248
+ removeLegacyDirs(targetDir);
249
+ migrateGsdToCcp();
235
250
  }
236
251
 
237
- // ═══════════════════════════════════════
238
- // CommonJS + package.json
239
- // ═══════════════════════════════════════
252
+ // =======================================
253
+ // Single src/ copy
254
+ // =======================================
255
+ const fileCount = copyDir(path.join(src, 'src'), targetDir, { replacePaths: true });
256
+
257
+ // =======================================
258
+ // CommonJS package.json
259
+ // =======================================
240
260
  fs.writeFileSync(path.join(targetDir, 'package.json'), '{"type":"commonjs"}\n');
241
261
 
242
- // ═══════════════════════════════════════
262
+ // =======================================
243
263
  // Root files (only fresh install or bootstrap)
244
- // ═══════════════════════════════════════
245
- console.log(`\n ${dim}Root files...${reset}`);
246
- const claudeMdSrc = path.join(kitSrc, 'CLAUDE.md');
264
+ // =======================================
247
265
  const claudeMdDest = path.join(projectRoot, 'CLAUDE.md');
248
- if (fs.existsSync(claudeMdSrc)) {
249
- if (!fs.existsSync(claudeMdDest) ||
250
- fs.readFileSync(claudeMdDest, 'utf8').includes('Run `/setup` to auto-configure')) {
251
- fs.copyFileSync(claudeMdSrc, claudeMdDest);
252
- console.log(` ${green}✓${reset} CLAUDE.md (bootstrap)`);
253
- } else {
254
- console.log(` ${dim}⏭️ CLAUDE.md (customized — preserved)${reset}`);
255
- }
266
+ const pilotVersionPath = path.join(targetDir, 'pilot', 'VERSION');
267
+ if (!fs.existsSync(claudeMdDest)) {
268
+ // No CLAUDE.md -- fresh install
269
+ fs.writeFileSync(claudeMdDest, BOOTSTRAP_TEMPLATE);
270
+ } else if (fs.readFileSync(claudeMdDest, 'utf8').includes(BOOTSTRAP_MARKER)) {
271
+ // Kit bootstrap -- safe to overwrite with latest
272
+ fs.writeFileSync(claudeMdDest, BOOTSTRAP_TEMPLATE);
273
+ } else if (!fs.existsSync(pilotVersionPath)) {
274
+ // First install but CLAUDE.md exists from scaffolding -- rename and install
275
+ const backupPath = path.join(projectRoot, 'CLAUDE.md.pre-pilot');
276
+ fs.renameSync(claudeMdDest, backupPath);
277
+ fs.writeFileSync(claudeMdDest, BOOTSTRAP_TEMPLATE);
278
+ console.log(` ${green}\u2713${reset} CLAUDE.md (existing renamed to CLAUDE.md.pre-pilot)`);
279
+ } else {
280
+ // Update with customized CLAUDE.md -- preserve
281
+ console.log(` ${dim}CLAUDE.md (customized -- preserved)${reset}`);
256
282
  }
257
283
 
258
- const mcpSrc = path.join(kitSrc, 'mcp.json');
259
284
  const mcpDest = path.join(projectRoot, '.mcp.json');
260
- if (fs.existsSync(mcpSrc) && !fs.existsSync(mcpDest)) {
261
- fs.copyFileSync(mcpSrc, mcpDest);
262
- console.log(` ${green}✓${reset} .mcp.json (Context7)`);
285
+ if (!fs.existsSync(mcpDest)) {
286
+ fs.writeFileSync(mcpDest, JSON.stringify(MCP_TEMPLATE, null, 2) + '\n');
263
287
  }
264
288
 
265
289
  const archSrc = path.join(src, 'docs', 'agent-guides', 'architecture.md');
@@ -267,74 +291,81 @@ function install() {
267
291
  if (fs.existsSync(archSrc) && !fs.existsSync(archDest)) {
268
292
  fs.mkdirSync(path.dirname(archDest), { recursive: true });
269
293
  fs.copyFileSync(archSrc, archDest);
270
- console.log(` ${green}✓${reset} docs/agent-guides/architecture.md`);
271
294
  }
272
295
 
273
- // ═══════════════════════════════════════
274
- // Settings (merge never overwrite)
275
- // ═══════════════════════════════════════
276
- console.log(`\n ${dim}Configuring settings...${reset}`);
277
- const settingsPath = path.join(targetDir, 'settings.json');
278
- const settings = readSettings(settingsPath);
279
-
280
- // --- Safety hooks ---
281
- let added;
282
- added = addHookIfMissing(settings, 'PreToolUse', 'Bash', 'Blocked: forbidden',
283
- `bash -c 'CMD=$(jq -r ".tool_input.command" <<< "$(cat)"); for p in "rm -rf /" "rm -rf ~" "DROP TABLE" "TRUNCATE" "push.*--force"; do if echo "$CMD" | grep -qiE "$p"; then echo "Blocked: forbidden pattern \\"$p\\" detected" >&2; exit 2; fi; done; exit 0'`);
284
- if (added) console.log(` ${green}✓${reset} Safety: dangerous command blocker`);
285
-
286
- added = addHookIfMissing(settings, 'PreToolUse', 'Write|Edit', 'Protected file',
287
- `bash -c 'FILE=$(jq -r ".tool_input.file_path // empty" <<< "$(cat)"); for p in ".env" "package-lock.json" "pnpm-lock.yaml" "yarn.lock" "bun.lock" ".git/"; do if [[ "$FILE" == *"$p"* ]]; then echo "Protected file: $p" >&2; exit 2; fi; done; exit 0'`);
288
- if (added) console.log(` ${green}✓${reset} Safety: file protection`);
289
-
290
- // --- GSD hooks ---
291
- added = addHookIfMissing(settings, 'PostToolUse', null, 'gsd-context-monitor',
292
- `node ${pathPrefix}hooks/gsd-context-monitor.js`, 'GSD context window monitor');
293
- if (added) console.log(` ${green}✓${reset} GSD: context monitor`);
294
-
295
- added = addHookIfMissing(settings, 'SessionStart', null, 'gsd-check-update',
296
- `node ${pathPrefix}hooks/gsd-check-update.js`, 'GSD version check');
297
- if (added) console.log(` ${green}✓${reset} GSD: update check`);
298
-
299
- // --- Kit hooks ---
300
- added = addHookIfMissing(settings, 'SessionStart', null, 'kit-check-update',
301
- `node ${pathPrefix}hooks/kit-check-update.js`, 'Pilot version check');
302
- if (added) console.log(` ${green}✓${reset} Kit: update check`);
303
-
304
- // --- ECC hooks ---
305
- added = addHookIfMissing(settings, 'SessionStart', null, 'ecc-scripts/hooks/session-start',
306
- `node ${pathPrefix}ecc-scripts/hooks/session-start.js`, 'ECC session context loader');
307
- if (added) console.log(` ${green}✓${reset} ECC: session start (loads previous context)`);
308
-
309
- added = addHookIfMissing(settings, 'Stop', null, 'ecc-scripts/hooks/session-end',
310
- `node ${pathPrefix}ecc-scripts/hooks/session-end.js`, 'ECC session persistence');
311
- if (added) console.log(` ${green}✓${reset} ECC: session end (saves session state)`);
312
-
313
- added = addHookIfMissing(settings, 'PreCompact', null, 'ecc-scripts/hooks/pre-compact',
314
- `node ${pathPrefix}ecc-scripts/hooks/pre-compact.js`, 'ECC pre-compact state save');
315
- if (added) console.log(` ${green}✓${reset} ECC: pre-compact (saves state before compaction)`);
316
-
317
- added = addHookIfMissing(settings, 'PreToolUse', 'Edit|Write', 'suggest-compact',
318
- `node ${pathPrefix}ecc-scripts/hooks/suggest-compact.js`, 'ECC strategic compact suggestions');
319
- if (added) console.log(` ${green}✓${reset} ECC: strategic compact suggestions`);
320
-
321
- // --- Notifications ---
322
- added = addHookIfMissing(settings, 'Stop', '', 'Task completed',
323
- `bash -c 'if command -v terminal-notifier &>/dev/null; then terminal-notifier -title "Claude Code" -message "Task completed" -sound default; elif command -v osascript &>/dev/null; then osascript -e "display notification \\"Task completed\\" with title \\"Claude Code\\" sound name \\"Glass\\""; elif command -v notify-send &>/dev/null; then notify-send -u normal "Claude Code" "Task completed"; fi'`);
324
- if (added) console.log(` ${green}✓${reset} Notification: task completed`);
325
-
326
- added = addHookIfMissing(settings, 'Notification', 'idle_prompt', 'Ready for input',
327
- `bash -c 'if command -v terminal-notifier &>/dev/null; then terminal-notifier -title "Claude Code" -message "Ready for input" -sound default; elif command -v osascript &>/dev/null; then osascript -e "display notification \\"Ready for input\\" with title \\"Claude Code\\" sound name \\"Glass\\""; elif command -v notify-send &>/dev/null; then notify-send -u normal "Claude Code" "Ready for input"; fi'`);
328
- if (added) console.log(` ${green}✓${reset} Notification: idle prompt`);
329
-
330
- added = addHookIfMissing(settings, 'Notification', 'permission_prompt', 'Permission needed',
331
- `bash -c 'if command -v terminal-notifier &>/dev/null; then terminal-notifier -title "Claude Code" -message "Permission needed" -sound Submarine; elif command -v osascript &>/dev/null; then osascript -e "display notification \\"Permission needed\\" with title \\"Claude Code\\" sound name \\"Submarine\\""; elif command -v notify-send &>/dev/null; then notify-send -u critical "Claude Code" "Permission needed"; fi'`);
332
- if (added) console.log(` ${green}✓${reset} Notification: permission prompt`);
333
-
334
- // --- Statusline ---
335
- if (!settings.statusLine) {
336
- settings.statusLine = { type: 'command', command: `node ${pathPrefix}hooks/gsd-statusline.js` };
337
- console.log(` ${green}✓${reset} GSD statusline`);
296
+ // =======================================
297
+ // Hook registration (14 event hooks + 1 statusLine)
298
+ // =======================================
299
+
300
+ // Safety hooks
301
+ addHookIfMissing(settings, 'PreToolUse', 'Bash', 'Blocked: forbidden',
302
+ `bash -c 'CMD=$(jq -r ".tool_input.command" <<< "$(cat)"); for p in "rm -rf /" "rm -rf ~" "DROP TABLE" "TRUNCATE" "push.*--force"; do if echo "$CMD" | grep -qiE "$p"; then echo "Blocked: forbidden pattern \\"$p\\" detected" >&2; exit 2; fi; done; exit 0'`,
303
+ 'Safety: dangerous command blocker');
304
+
305
+ addHookIfMissing(settings, 'PreToolUse', 'Write|Edit', 'Protected file',
306
+ `bash -c 'FILE=$(jq -r ".tool_input.file_path // empty" <<< "$(cat)"); for p in ".env" "package-lock.json" "pnpm-lock.yaml" "yarn.lock" "bun.lock" ".git/"; do if [[ "$FILE" == *"$p"* ]]; then echo "Protected file: $p" >&2; exit 2; fi; done; exit 0'`,
307
+ 'Safety: file protection');
308
+
309
+ // Config protection hook
310
+ addHookIfMissing(settings, 'PreToolUse', 'Write|Edit', 'hooks/config-protection',
311
+ `node ${pathPrefix}hooks/config-protection.js`,
312
+ 'Config protection');
313
+
314
+ // MCP health check (PreToolUse)
315
+ addHookIfMissing(settings, 'PreToolUse', 'mcp_', 'hooks/mcp-health-check',
316
+ `node ${pathPrefix}hooks/mcp-health-check.js`,
317
+ 'MCP health check');
318
+
319
+ // Context monitor
320
+ addHookIfMissing(settings, 'PostToolUse', null, 'ccp-context-monitor',
321
+ `node ${pathPrefix}hooks/ccp-context-monitor.js`,
322
+ 'CCP context window monitor');
323
+
324
+ // MCP health check (PostToolUseFailure)
325
+ addHookIfMissing(settings, 'PostToolUseFailure', 'mcp_', 'hooks/mcp-health-check',
326
+ `node ${pathPrefix}hooks/mcp-health-check.js`,
327
+ 'MCP health check (failure recovery)');
328
+
329
+ // Session start hooks
330
+ addHookIfMissing(settings, 'SessionStart', null, 'kit-check-update',
331
+ `node ${pathPrefix}hooks/kit-check-update.js`,
332
+ 'Pilot version check');
333
+
334
+ addHookIfMissing(settings, 'SessionStart', null, 'hooks/session-start',
335
+ `node ${pathPrefix}hooks/session-start.js`,
336
+ 'Session context loader');
337
+
338
+ // Stop hooks
339
+ addHookIfMissing(settings, 'Stop', null, 'hooks/session-end.js',
340
+ `node ${pathPrefix}hooks/session-end.js`,
341
+ 'Session persistence');
342
+
343
+ // Pre-compact
344
+ addHookIfMissing(settings, 'PreCompact', null, 'hooks/pre-compact',
345
+ `node ${pathPrefix}hooks/pre-compact.js`,
346
+ 'Pre-compact state save');
347
+
348
+ // Strategic compact suggestion
349
+ addHookIfMissing(settings, 'PreToolUse', 'Edit|Write', 'suggest-compact',
350
+ `node ${pathPrefix}hooks/suggest-compact.js`,
351
+ 'Strategic compact suggestions');
352
+
353
+ // Notifications
354
+ addHookIfMissing(settings, 'Stop', '', 'Task completed',
355
+ `bash -c 'if command -v terminal-notifier &>/dev/null; then terminal-notifier -title "Claude Code" -message "Task completed" -sound default; elif command -v osascript &>/dev/null; then osascript -e "display notification \\"Task completed\\" with title \\"Claude Code\\" sound name \\"Glass\\""; elif command -v notify-send &>/dev/null; then notify-send -u normal "Claude Code" "Task completed"; fi'`,
356
+ 'Notification: task completed');
357
+
358
+ addHookIfMissing(settings, 'Notification', 'idle_prompt', 'Ready for input',
359
+ `bash -c 'if command -v terminal-notifier &>/dev/null; then terminal-notifier -title "Claude Code" -message "Ready for input" -sound default; elif command -v osascript &>/dev/null; then osascript -e "display notification \\"Ready for input\\" with title \\"Claude Code\\" sound name \\"Glass\\""; elif command -v notify-send &>/dev/null; then notify-send -u normal "Claude Code" "Ready for input"; fi'`,
360
+ 'Notification: idle prompt');
361
+
362
+ addHookIfMissing(settings, 'Notification', 'permission_prompt', 'Permission needed',
363
+ `bash -c 'if command -v terminal-notifier &>/dev/null; then terminal-notifier -title "Claude Code" -message "Permission needed" -sound Submarine; elif command -v osascript &>/dev/null; then osascript -e "display notification \\"Permission needed\\" with title \\"Claude Code\\" sound name \\"Submarine\\""; elif command -v notify-send &>/dev/null; then notify-send -u critical "Claude Code" "Permission needed"; fi'`,
364
+ 'Notification: permission prompt');
365
+
366
+ // StatusLine
367
+ if (!settings.statusLine || (settings.statusLine.command && !settings.statusLine.command.includes('ccp-statusline'))) {
368
+ settings.statusLine = { type: 'command', command: `node ${pathPrefix}hooks/ccp-statusline.js` };
338
369
  }
339
370
 
340
371
  // --- Permissions ---
@@ -345,84 +376,70 @@ function install() {
345
376
  }
346
377
 
347
378
  writeSettings(settingsPath, settings);
348
- console.log(` ${green}✓${reset} Settings written`);
349
-
350
- // ═══════════════════════════════════════
351
- // Version files
352
- // ═══════════════════════════════════════
353
- const gsdVersionDir = path.join(targetDir, 'get-shit-done');
354
- fs.mkdirSync(gsdVersionDir, { recursive: true });
355
- fs.writeFileSync(path.join(gsdVersionDir, 'VERSION'), manifest.bundled.gsd.version);
356
-
357
- const kitVersionDir = path.join(targetDir, 'kit-version');
358
- fs.mkdirSync(kitVersionDir, { recursive: true });
359
- fs.writeFileSync(path.join(kitVersionDir, 'VERSION'), pkg.version);
360
- fs.writeFileSync(path.join(kitVersionDir, 'manifest.json'), JSON.stringify(manifest, null, 2));
361
- console.log(` ${green}✓${reset} Version files (kit v${pkg.version}, GSD v${manifest.bundled.gsd.version}, ECC v${manifest.bundled.ecc.version})`);
362
-
363
- // ═══════════════════════════════════════
379
+
380
+ // =======================================
381
+ // Version file
382
+ // =======================================
383
+ const versionDir = path.join(targetDir, 'pilot');
384
+ fs.mkdirSync(versionDir, { recursive: true });
385
+ fs.writeFileSync(path.join(versionDir, 'VERSION'), pkg.version);
386
+
387
+ // =======================================
364
388
  // External: find-skills
365
- // ═══════════════════════════════════════
366
- console.log(`\n ${dim}External dependencies...${reset}`);
389
+ // =======================================
367
390
  try {
368
391
  execSync('npx skills add https://github.com/vercel-labs/skills --skill find-skills -g -a claude-code -y', { stdio: 'pipe', timeout: 30000 });
369
- console.log(` ${green}✓${reset} find-skills`);
370
392
  } catch {
371
- console.log(` ${yellow}⚠${reset} find-skills failed run: npx skills add https://github.com/vercel-labs/skills --skill find-skills -g -a claude-code -y`);
393
+ console.log(` ${yellow}!${reset} find-skills failed -- run: npx skills add https://github.com/vercel-labs/skills --skill find-skills -g -a claude-code -y`);
372
394
  }
373
395
 
374
- // Notifications check
375
- console.log('');
376
- try { execSync('which terminal-notifier', { stdio: 'pipe' }); console.log(` ${green}✓${reset} Notifications: terminal-notifier`); }
377
- catch { try { execSync('which osascript', { stdio: 'pipe' }); console.log(` ${green}✓${reset} Notifications: osascript`); }
378
- catch { try { execSync('which notify-send', { stdio: 'pipe' }); console.log(` ${green}✓${reset} Notifications: notify-send`); }
379
- catch { console.log(` ${yellow}⚠${reset} No notification tool found`); } } }
380
-
381
- // ═══════════════════════════════════════
396
+ // =======================================
382
397
  // Summary
383
- // ═══════════════════════════════════════
398
+ // =======================================
384
399
  const totalAgents = fs.existsSync(path.join(targetDir, 'agents'))
385
400
  ? fs.readdirSync(path.join(targetDir, 'agents')).filter(f => f.endsWith('.md')).length : 0;
386
401
 
402
+ const hookCount = settings.hooks
403
+ ? Object.values(settings.hooks).flat().length : 0;
404
+
387
405
  const action = hasUpdate ? 'Updated' : 'Installed';
388
406
  console.log(`
389
- ${green}${action}!${reset} Kit v${pkg.version}
390
-
391
- ${cyan}GSD${reset} v${manifest.bundled.gsd.version} — 32 commands, 12 agents, spec-driven development
392
- ${cyan}ECC${reset} v${manifest.bundled.ecc.version} — Sessions, learning, verification, quality gates
393
- ${cyan}Kit${reset} — Safety hooks, notifications, auto-updates, /setup wizard
407
+ ${green}${action}!${reset} v${pkg.version}
394
408
 
395
- ${totalAgents} agents total. Context monitoring. Session persistence.
396
- Language rules ready in available-rules/ (activated by /setup).
409
+ ${fileCount} files, ${hookCount} hooks, ${totalAgents} agents
397
410
 
398
411
  Next:
399
- ${cyan}claude${reset}
400
- ${cyan}/setup${reset} ← auto-configure this project
401
- ${cyan}/kit:update${reset} ← update to latest version
402
-
403
- GSD: ECC:
404
- ${cyan}/gsd:new-project${reset} ${cyan}/save-session${reset}
405
- ${cyan}/gsd:quick "task"${reset} ${cyan}/verify${reset}
406
- ${cyan}/gsd:discuss-phase 1${reset} ${cyan}/checkpoint create "v1"${reset}
407
- ${cyan}/gsd:help${reset} ${cyan}/learn${reset}
412
+ ${cyan}/ccp:setup${reset} -- auto-configure this project
413
+
414
+ Build:
415
+ ${cyan}/ccp:new-project${reset} -- initialize with roadmap
416
+ ${cyan}/ccp:quick "task"${reset} -- lightweight mode
417
+ ${cyan}/ccp:discuss-phase 1${reset} -- capture requirements
418
+ ${cyan}/ccp:help${reset} -- all commands
419
+
420
+ Utilities:
421
+ ${cyan}/ccp:save-session${reset} -- persist session state
422
+ ${cyan}/ccp:verify${reset} -- multi-phase verification
423
+ ${cyan}/ccp:checkpoint create "v1"${reset} -- git-backed snapshot
424
+ ${cyan}/ccp:learn${reset} -- extract reusable patterns
408
425
  `);
409
426
  }
410
427
 
411
428
  // --- Uninstall ---
412
429
  function uninstall() {
413
430
  console.log(` Uninstalling from ${cyan}${locationLabel}${reset}\n`);
414
- const dirs = ['commands', 'get-shit-done', 'agents', 'hooks', 'rules', 'skills',
415
- 'contexts', 'ecc-scripts', 'ecc-examples', 'available-rules', 'kit-version'];
431
+ const dirs = ['agents', 'available-rules', 'commands', 'contexts', 'examples',
432
+ 'hooks', 'lib', 'pilot', 'rules', 'skills'];
416
433
  let removed = 0;
417
434
  for (const d of dirs) {
418
435
  const p = path.join(targetDir, d);
419
436
  if (fs.existsSync(p)) {
420
437
  fs.rmSync(p, { recursive: true });
421
438
  removed++;
422
- console.log(` ${green}✓${reset} Removed ${d}/`);
439
+ console.log(` ${green}\u2713${reset} Removed ${d}/`);
423
440
  }
424
441
  }
425
- console.log(removed ? `\n ${green}Done!${reset} CLAUDE.md and settings.json preserved.\n` : ` ${yellow}⚠${reset} Nothing to remove\n`);
442
+ console.log(removed ? `\n ${green}Done!${reset} CLAUDE.md and settings.json preserved.\n` : ` ${yellow}!${reset} Nothing to remove\n`);
426
443
  }
427
444
 
428
445
  // --- Main ---