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
@@ -0,0 +1,530 @@
1
+ ---
2
+ name: coding-standards
3
+ description: Universal coding standards, best practices, and patterns for TypeScript, JavaScript, React, and Node.js development.
4
+ origin: ECC
5
+ ---
6
+
7
+ # Coding Standards & Best Practices
8
+
9
+ Universal coding standards applicable across all projects.
10
+
11
+ ## When to Activate
12
+
13
+ - Starting a new project or module
14
+ - Reviewing code for quality and maintainability
15
+ - Refactoring existing code to follow conventions
16
+ - Enforcing naming, formatting, or structural consistency
17
+ - Setting up linting, formatting, or type-checking rules
18
+ - Onboarding new contributors to coding conventions
19
+
20
+ ## Code Quality Principles
21
+
22
+ ### 1. Readability First
23
+ - Code is read more than written
24
+ - Clear variable and function names
25
+ - Self-documenting code preferred over comments
26
+ - Consistent formatting
27
+
28
+ ### 2. KISS (Keep It Simple, Stupid)
29
+ - Simplest solution that works
30
+ - Avoid over-engineering
31
+ - No premature optimization
32
+ - Easy to understand > clever code
33
+
34
+ ### 3. DRY (Don't Repeat Yourself)
35
+ - Extract common logic into functions
36
+ - Create reusable components
37
+ - Share utilities across modules
38
+ - Avoid copy-paste programming
39
+
40
+ ### 4. YAGNI (You Aren't Gonna Need It)
41
+ - Don't build features before they're needed
42
+ - Avoid speculative generality
43
+ - Add complexity only when required
44
+ - Start simple, refactor when needed
45
+
46
+ ## TypeScript/JavaScript Standards
47
+
48
+ ### Variable Naming
49
+
50
+ ```typescript
51
+ // ✅ GOOD: Descriptive names
52
+ const marketSearchQuery = 'election'
53
+ const isUserAuthenticated = true
54
+ const totalRevenue = 1000
55
+
56
+ // ❌ BAD: Unclear names
57
+ const q = 'election'
58
+ const flag = true
59
+ const x = 1000
60
+ ```
61
+
62
+ ### Function Naming
63
+
64
+ ```typescript
65
+ // ✅ GOOD: Verb-noun pattern
66
+ async function fetchMarketData(marketId: string) { }
67
+ function calculateSimilarity(a: number[], b: number[]) { }
68
+ function isValidEmail(email: string): boolean { }
69
+
70
+ // ❌ BAD: Unclear or noun-only
71
+ async function market(id: string) { }
72
+ function similarity(a, b) { }
73
+ function email(e) { }
74
+ ```
75
+
76
+ ### Immutability Pattern (CRITICAL)
77
+
78
+ ```typescript
79
+ // ✅ ALWAYS use spread operator
80
+ const updatedUser = {
81
+ ...user,
82
+ name: 'New Name'
83
+ }
84
+
85
+ const updatedArray = [...items, newItem]
86
+
87
+ // ❌ NEVER mutate directly
88
+ user.name = 'New Name' // BAD
89
+ items.push(newItem) // BAD
90
+ ```
91
+
92
+ ### Error Handling
93
+
94
+ ```typescript
95
+ // ✅ GOOD: Comprehensive error handling
96
+ async function fetchData(url: string) {
97
+ try {
98
+ const response = await fetch(url)
99
+
100
+ if (!response.ok) {
101
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`)
102
+ }
103
+
104
+ return await response.json()
105
+ } catch (error) {
106
+ console.error('Fetch failed:', error)
107
+ throw new Error('Failed to fetch data')
108
+ }
109
+ }
110
+
111
+ // ❌ BAD: No error handling
112
+ async function fetchData(url) {
113
+ const response = await fetch(url)
114
+ return response.json()
115
+ }
116
+ ```
117
+
118
+ ### Async/Await Best Practices
119
+
120
+ ```typescript
121
+ // ✅ GOOD: Parallel execution when possible
122
+ const [users, markets, stats] = await Promise.all([
123
+ fetchUsers(),
124
+ fetchMarkets(),
125
+ fetchStats()
126
+ ])
127
+
128
+ // ❌ BAD: Sequential when unnecessary
129
+ const users = await fetchUsers()
130
+ const markets = await fetchMarkets()
131
+ const stats = await fetchStats()
132
+ ```
133
+
134
+ ### Type Safety
135
+
136
+ ```typescript
137
+ // ✅ GOOD: Proper types
138
+ interface Market {
139
+ id: string
140
+ name: string
141
+ status: 'active' | 'resolved' | 'closed'
142
+ created_at: Date
143
+ }
144
+
145
+ function getMarket(id: string): Promise<Market> {
146
+ // Implementation
147
+ }
148
+
149
+ // ❌ BAD: Using 'any'
150
+ function getMarket(id: any): Promise<any> {
151
+ // Implementation
152
+ }
153
+ ```
154
+
155
+ ## React Best Practices
156
+
157
+ ### Component Structure
158
+
159
+ ```typescript
160
+ // ✅ GOOD: Functional component with types
161
+ interface ButtonProps {
162
+ children: React.ReactNode
163
+ onClick: () => void
164
+ disabled?: boolean
165
+ variant?: 'primary' | 'secondary'
166
+ }
167
+
168
+ export function Button({
169
+ children,
170
+ onClick,
171
+ disabled = false,
172
+ variant = 'primary'
173
+ }: ButtonProps) {
174
+ return (
175
+ <button
176
+ onClick={onClick}
177
+ disabled={disabled}
178
+ className={`btn btn-${variant}`}
179
+ >
180
+ {children}
181
+ </button>
182
+ )
183
+ }
184
+
185
+ // ❌ BAD: No types, unclear structure
186
+ export function Button(props) {
187
+ return <button onClick={props.onClick}>{props.children}</button>
188
+ }
189
+ ```
190
+
191
+ ### Custom Hooks
192
+
193
+ ```typescript
194
+ // ✅ GOOD: Reusable custom hook
195
+ export function useDebounce<T>(value: T, delay: number): T {
196
+ const [debouncedValue, setDebouncedValue] = useState<T>(value)
197
+
198
+ useEffect(() => {
199
+ const handler = setTimeout(() => {
200
+ setDebouncedValue(value)
201
+ }, delay)
202
+
203
+ return () => clearTimeout(handler)
204
+ }, [value, delay])
205
+
206
+ return debouncedValue
207
+ }
208
+
209
+ // Usage
210
+ const debouncedQuery = useDebounce(searchQuery, 500)
211
+ ```
212
+
213
+ ### State Management
214
+
215
+ ```typescript
216
+ // ✅ GOOD: Proper state updates
217
+ const [count, setCount] = useState(0)
218
+
219
+ // Functional update for state based on previous state
220
+ setCount(prev => prev + 1)
221
+
222
+ // ❌ BAD: Direct state reference
223
+ setCount(count + 1) // Can be stale in async scenarios
224
+ ```
225
+
226
+ ### Conditional Rendering
227
+
228
+ ```typescript
229
+ // ✅ GOOD: Clear conditional rendering
230
+ {isLoading && <Spinner />}
231
+ {error && <ErrorMessage error={error} />}
232
+ {data && <DataDisplay data={data} />}
233
+
234
+ // ❌ BAD: Ternary hell
235
+ {isLoading ? <Spinner /> : error ? <ErrorMessage error={error} /> : data ? <DataDisplay data={data} /> : null}
236
+ ```
237
+
238
+ ## API Design Standards
239
+
240
+ ### REST API Conventions
241
+
242
+ ```
243
+ GET /api/markets # List all markets
244
+ GET /api/markets/:id # Get specific market
245
+ POST /api/markets # Create new market
246
+ PUT /api/markets/:id # Update market (full)
247
+ PATCH /api/markets/:id # Update market (partial)
248
+ DELETE /api/markets/:id # Delete market
249
+
250
+ # Query parameters for filtering
251
+ GET /api/markets?status=active&limit=10&offset=0
252
+ ```
253
+
254
+ ### Response Format
255
+
256
+ ```typescript
257
+ // ✅ GOOD: Consistent response structure
258
+ interface ApiResponse<T> {
259
+ success: boolean
260
+ data?: T
261
+ error?: string
262
+ meta?: {
263
+ total: number
264
+ page: number
265
+ limit: number
266
+ }
267
+ }
268
+
269
+ // Success response
270
+ return NextResponse.json({
271
+ success: true,
272
+ data: markets,
273
+ meta: { total: 100, page: 1, limit: 10 }
274
+ })
275
+
276
+ // Error response
277
+ return NextResponse.json({
278
+ success: false,
279
+ error: 'Invalid request'
280
+ }, { status: 400 })
281
+ ```
282
+
283
+ ### Input Validation
284
+
285
+ ```typescript
286
+ import { z } from 'zod'
287
+
288
+ // ✅ GOOD: Schema validation
289
+ const CreateMarketSchema = z.object({
290
+ name: z.string().min(1).max(200),
291
+ description: z.string().min(1).max(2000),
292
+ endDate: z.string().datetime(),
293
+ categories: z.array(z.string()).min(1)
294
+ })
295
+
296
+ export async function POST(request: Request) {
297
+ const body = await request.json()
298
+
299
+ try {
300
+ const validated = CreateMarketSchema.parse(body)
301
+ // Proceed with validated data
302
+ } catch (error) {
303
+ if (error instanceof z.ZodError) {
304
+ return NextResponse.json({
305
+ success: false,
306
+ error: 'Validation failed',
307
+ details: error.errors
308
+ }, { status: 400 })
309
+ }
310
+ }
311
+ }
312
+ ```
313
+
314
+ ## File Organization
315
+
316
+ ### Project Structure
317
+
318
+ ```
319
+ src/
320
+ ├── app/ # Next.js App Router
321
+ │ ├── api/ # API routes
322
+ │ ├── markets/ # Market pages
323
+ │ └── (auth)/ # Auth pages (route groups)
324
+ ├── components/ # React components
325
+ │ ├── ui/ # Generic UI components
326
+ │ ├── forms/ # Form components
327
+ │ └── layouts/ # Layout components
328
+ ├── hooks/ # Custom React hooks
329
+ ├── lib/ # Utilities and configs
330
+ │ ├── api/ # API clients
331
+ │ ├── utils/ # Helper functions
332
+ │ └── constants/ # Constants
333
+ ├── types/ # TypeScript types
334
+ └── styles/ # Global styles
335
+ ```
336
+
337
+ ### File Naming
338
+
339
+ ```
340
+ components/Button.tsx # PascalCase for components
341
+ hooks/useAuth.ts # camelCase with 'use' prefix
342
+ lib/formatDate.ts # camelCase for utilities
343
+ types/market.types.ts # camelCase with .types suffix
344
+ ```
345
+
346
+ ## Comments & Documentation
347
+
348
+ ### When to Comment
349
+
350
+ ```typescript
351
+ // ✅ GOOD: Explain WHY, not WHAT
352
+ // Use exponential backoff to avoid overwhelming the API during outages
353
+ const delay = Math.min(1000 * Math.pow(2, retryCount), 30000)
354
+
355
+ // Deliberately using mutation here for performance with large arrays
356
+ items.push(newItem)
357
+
358
+ // ❌ BAD: Stating the obvious
359
+ // Increment counter by 1
360
+ count++
361
+
362
+ // Set name to user's name
363
+ name = user.name
364
+ ```
365
+
366
+ ### JSDoc for Public APIs
367
+
368
+ ```typescript
369
+ /**
370
+ * Searches markets using semantic similarity.
371
+ *
372
+ * @param query - Natural language search query
373
+ * @param limit - Maximum number of results (default: 10)
374
+ * @returns Array of markets sorted by similarity score
375
+ * @throws {Error} If OpenAI API fails or Redis unavailable
376
+ *
377
+ * @example
378
+ * ```typescript
379
+ * const results = await searchMarkets('election', 5)
380
+ * console.log(results[0].name) // "Trump vs Biden"
381
+ * ```
382
+ */
383
+ export async function searchMarkets(
384
+ query: string,
385
+ limit: number = 10
386
+ ): Promise<Market[]> {
387
+ // Implementation
388
+ }
389
+ ```
390
+
391
+ ## Performance Best Practices
392
+
393
+ ### Memoization
394
+
395
+ ```typescript
396
+ import { useMemo, useCallback } from 'react'
397
+
398
+ // ✅ GOOD: Memoize expensive computations
399
+ const sortedMarkets = useMemo(() => {
400
+ return markets.sort((a, b) => b.volume - a.volume)
401
+ }, [markets])
402
+
403
+ // ✅ GOOD: Memoize callbacks
404
+ const handleSearch = useCallback((query: string) => {
405
+ setSearchQuery(query)
406
+ }, [])
407
+ ```
408
+
409
+ ### Lazy Loading
410
+
411
+ ```typescript
412
+ import { lazy, Suspense } from 'react'
413
+
414
+ // ✅ GOOD: Lazy load heavy components
415
+ const HeavyChart = lazy(() => import('./HeavyChart'))
416
+
417
+ export function Dashboard() {
418
+ return (
419
+ <Suspense fallback={<Spinner />}>
420
+ <HeavyChart />
421
+ </Suspense>
422
+ )
423
+ }
424
+ ```
425
+
426
+ ### Database Queries
427
+
428
+ ```typescript
429
+ // ✅ GOOD: Select only needed columns
430
+ const { data } = await supabase
431
+ .from('markets')
432
+ .select('id, name, status')
433
+ .limit(10)
434
+
435
+ // ❌ BAD: Select everything
436
+ const { data } = await supabase
437
+ .from('markets')
438
+ .select('*')
439
+ ```
440
+
441
+ ## Testing Standards
442
+
443
+ ### Test Structure (AAA Pattern)
444
+
445
+ ```typescript
446
+ test('calculates similarity correctly', () => {
447
+ // Arrange
448
+ const vector1 = [1, 0, 0]
449
+ const vector2 = [0, 1, 0]
450
+
451
+ // Act
452
+ const similarity = calculateCosineSimilarity(vector1, vector2)
453
+
454
+ // Assert
455
+ expect(similarity).toBe(0)
456
+ })
457
+ ```
458
+
459
+ ### Test Naming
460
+
461
+ ```typescript
462
+ // ✅ GOOD: Descriptive test names
463
+ test('returns empty array when no markets match query', () => { })
464
+ test('throws error when OpenAI API key is missing', () => { })
465
+ test('falls back to substring search when Redis unavailable', () => { })
466
+
467
+ // ❌ BAD: Vague test names
468
+ test('works', () => { })
469
+ test('test search', () => { })
470
+ ```
471
+
472
+ ## Code Smell Detection
473
+
474
+ Watch for these anti-patterns:
475
+
476
+ ### 1. Long Functions
477
+ ```typescript
478
+ // ❌ BAD: Function > 50 lines
479
+ function processMarketData() {
480
+ // 100 lines of code
481
+ }
482
+
483
+ // ✅ GOOD: Split into smaller functions
484
+ function processMarketData() {
485
+ const validated = validateData()
486
+ const transformed = transformData(validated)
487
+ return saveData(transformed)
488
+ }
489
+ ```
490
+
491
+ ### 2. Deep Nesting
492
+ ```typescript
493
+ // ❌ BAD: 5+ levels of nesting
494
+ if (user) {
495
+ if (user.isAdmin) {
496
+ if (market) {
497
+ if (market.isActive) {
498
+ if (hasPermission) {
499
+ // Do something
500
+ }
501
+ }
502
+ }
503
+ }
504
+ }
505
+
506
+ // ✅ GOOD: Early returns
507
+ if (!user) return
508
+ if (!user.isAdmin) return
509
+ if (!market) return
510
+ if (!market.isActive) return
511
+ if (!hasPermission) return
512
+
513
+ // Do something
514
+ ```
515
+
516
+ ### 3. Magic Numbers
517
+ ```typescript
518
+ // ❌ BAD: Unexplained numbers
519
+ if (retryCount > 3) { }
520
+ setTimeout(callback, 500)
521
+
522
+ // ✅ GOOD: Named constants
523
+ const MAX_RETRIES = 3
524
+ const DEBOUNCE_DELAY_MS = 500
525
+
526
+ if (retryCount > MAX_RETRIES) { }
527
+ setTimeout(callback, DEBOUNCE_DELAY_MS)
528
+ ```
529
+
530
+ **Remember**: Code quality is not negotiable. Clear, maintainable code enables rapid development and confident refactoring.
@@ -0,0 +1,161 @@
1
+ ---
2
+ name: content-hash-cache-pattern
3
+ description: Cache expensive file processing results using SHA-256 content hashes — path-independent, auto-invalidating, with service layer separation.
4
+ origin: ECC
5
+ ---
6
+
7
+ # Content-Hash File Cache Pattern
8
+
9
+ Cache expensive file processing results (PDF parsing, text extraction, image analysis) using SHA-256 content hashes as cache keys. Unlike path-based caching, this approach survives file moves/renames and auto-invalidates when content changes.
10
+
11
+ ## When to Activate
12
+
13
+ - Building file processing pipelines (PDF, images, text extraction)
14
+ - Processing cost is high and same files are processed repeatedly
15
+ - Need a `--cache/--no-cache` CLI option
16
+ - Want to add caching to existing pure functions without modifying them
17
+
18
+ ## Core Pattern
19
+
20
+ ### 1. Content-Hash Based Cache Key
21
+
22
+ Use file content (not path) as the cache key:
23
+
24
+ ```python
25
+ import hashlib
26
+ from pathlib import Path
27
+
28
+ _HASH_CHUNK_SIZE = 65536 # 64KB chunks for large files
29
+
30
+ def compute_file_hash(path: Path) -> str:
31
+ """SHA-256 of file contents (chunked for large files)."""
32
+ if not path.is_file():
33
+ raise FileNotFoundError(f"File not found: {path}")
34
+ sha256 = hashlib.sha256()
35
+ with open(path, "rb") as f:
36
+ while True:
37
+ chunk = f.read(_HASH_CHUNK_SIZE)
38
+ if not chunk:
39
+ break
40
+ sha256.update(chunk)
41
+ return sha256.hexdigest()
42
+ ```
43
+
44
+ **Why content hash?** File rename/move = cache hit. Content change = automatic invalidation. No index file needed.
45
+
46
+ ### 2. Frozen Dataclass for Cache Entry
47
+
48
+ ```python
49
+ from dataclasses import dataclass
50
+
51
+ @dataclass(frozen=True, slots=True)
52
+ class CacheEntry:
53
+ file_hash: str
54
+ source_path: str
55
+ document: ExtractedDocument # The cached result
56
+ ```
57
+
58
+ ### 3. File-Based Cache Storage
59
+
60
+ Each cache entry is stored as `{hash}.json` — O(1) lookup by hash, no index file required.
61
+
62
+ ```python
63
+ import json
64
+ from typing import Any
65
+
66
+ def write_cache(cache_dir: Path, entry: CacheEntry) -> None:
67
+ cache_dir.mkdir(parents=True, exist_ok=True)
68
+ cache_file = cache_dir / f"{entry.file_hash}.json"
69
+ data = serialize_entry(entry)
70
+ cache_file.write_text(json.dumps(data, ensure_ascii=False), encoding="utf-8")
71
+
72
+ def read_cache(cache_dir: Path, file_hash: str) -> CacheEntry | None:
73
+ cache_file = cache_dir / f"{file_hash}.json"
74
+ if not cache_file.is_file():
75
+ return None
76
+ try:
77
+ raw = cache_file.read_text(encoding="utf-8")
78
+ data = json.loads(raw)
79
+ return deserialize_entry(data)
80
+ except (json.JSONDecodeError, ValueError, KeyError):
81
+ return None # Treat corruption as cache miss
82
+ ```
83
+
84
+ ### 4. Service Layer Wrapper (SRP)
85
+
86
+ Keep the processing function pure. Add caching as a separate service layer.
87
+
88
+ ```python
89
+ def extract_with_cache(
90
+ file_path: Path,
91
+ *,
92
+ cache_enabled: bool = True,
93
+ cache_dir: Path = Path(".cache"),
94
+ ) -> ExtractedDocument:
95
+ """Service layer: cache check -> extraction -> cache write."""
96
+ if not cache_enabled:
97
+ return extract_text(file_path) # Pure function, no cache knowledge
98
+
99
+ file_hash = compute_file_hash(file_path)
100
+
101
+ # Check cache
102
+ cached = read_cache(cache_dir, file_hash)
103
+ if cached is not None:
104
+ logger.info("Cache hit: %s (hash=%s)", file_path.name, file_hash[:12])
105
+ return cached.document
106
+
107
+ # Cache miss -> extract -> store
108
+ logger.info("Cache miss: %s (hash=%s)", file_path.name, file_hash[:12])
109
+ doc = extract_text(file_path)
110
+ entry = CacheEntry(file_hash=file_hash, source_path=str(file_path), document=doc)
111
+ write_cache(cache_dir, entry)
112
+ return doc
113
+ ```
114
+
115
+ ## Key Design Decisions
116
+
117
+ | Decision | Rationale |
118
+ |----------|-----------|
119
+ | SHA-256 content hash | Path-independent, auto-invalidates on content change |
120
+ | `{hash}.json` file naming | O(1) lookup, no index file needed |
121
+ | Service layer wrapper | SRP: extraction stays pure, cache is a separate concern |
122
+ | Manual JSON serialization | Full control over frozen dataclass serialization |
123
+ | Corruption returns `None` | Graceful degradation, re-processes on next run |
124
+ | `cache_dir.mkdir(parents=True)` | Lazy directory creation on first write |
125
+
126
+ ## Best Practices
127
+
128
+ - **Hash content, not paths** — paths change, content identity doesn't
129
+ - **Chunk large files** when hashing — avoid loading entire files into memory
130
+ - **Keep processing functions pure** — they should know nothing about caching
131
+ - **Log cache hit/miss** with truncated hashes for debugging
132
+ - **Handle corruption gracefully** — treat invalid cache entries as misses, never crash
133
+
134
+ ## Anti-Patterns to Avoid
135
+
136
+ ```python
137
+ # BAD: Path-based caching (breaks on file move/rename)
138
+ cache = {"/path/to/file.pdf": result}
139
+
140
+ # BAD: Adding cache logic inside the processing function (SRP violation)
141
+ def extract_text(path, *, cache_enabled=False, cache_dir=None):
142
+ if cache_enabled: # Now this function has two responsibilities
143
+ ...
144
+
145
+ # BAD: Using dataclasses.asdict() with nested frozen dataclasses
146
+ # (can cause issues with complex nested types)
147
+ data = dataclasses.asdict(entry) # Use manual serialization instead
148
+ ```
149
+
150
+ ## When to Use
151
+
152
+ - File processing pipelines (PDF parsing, OCR, text extraction, image analysis)
153
+ - CLI tools that benefit from `--cache/--no-cache` options
154
+ - Batch processing where the same files appear across runs
155
+ - Adding caching to existing pure functions without modifying them
156
+
157
+ ## When NOT to Use
158
+
159
+ - Data that must always be fresh (real-time feeds)
160
+ - Cache entries that would be extremely large (consider streaming instead)
161
+ - Results that depend on parameters beyond file content (e.g., different extraction configs)