cc-devflow 4.3.0 → 4.5.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 (579) hide show
  1. package/.claude/skills/cc-act/CHANGELOG.md +70 -0
  2. package/.claude/skills/cc-act/PLAYBOOK.md +212 -0
  3. package/.claude/skills/cc-act/SKILL.md +330 -0
  4. package/.claude/skills/cc-act/assets/PR_BRIEF_TEMPLATE.md +68 -0
  5. package/.claude/skills/cc-act/assets/RELEASE_NOTE_TEMPLATE.md +29 -0
  6. package/.claude/skills/cc-act/references/closure-contract.md +49 -0
  7. package/.claude/skills/cc-act/references/git-commit-guidelines.md +83 -0
  8. package/.claude/skills/cc-act/scripts/archive-requirement.sh +49 -0
  9. package/.claude/skills/cc-act/scripts/cc-act-common.sh +245 -0
  10. package/.claude/skills/cc-act/scripts/detect-ship-target.sh +82 -0
  11. package/.claude/skills/cc-act/scripts/generate-status-report.sh +83 -0
  12. package/.claude/skills/cc-act/scripts/render-pr-brief.sh +200 -0
  13. package/.claude/skills/cc-act/scripts/sync-act-docs.sh +328 -0
  14. package/.claude/skills/cc-act/scripts/verify-act-gate.sh +63 -0
  15. package/.claude/skills/cc-check/CHANGELOG.md +78 -0
  16. package/.claude/skills/cc-check/PLAYBOOK.md +153 -0
  17. package/.claude/skills/cc-check/SKILL.md +353 -0
  18. package/.claude/skills/cc-check/assets/REPORT_CARD_TEMPLATE.json +53 -0
  19. package/.claude/skills/cc-check/references/gate-contract.md +29 -0
  20. package/.claude/skills/cc-check/references/review-contract.md +45 -0
  21. package/.claude/skills/cc-check/scripts/render-report-card.js +229 -0
  22. package/.claude/skills/cc-check/scripts/run-quality-gates.sh +86 -0
  23. package/.claude/skills/cc-check/scripts/verify-gate.sh +57 -0
  24. package/.claude/skills/cc-do/CHANGELOG.md +54 -0
  25. package/.claude/skills/cc-do/PLAYBOOK.md +119 -0
  26. package/.claude/skills/cc-do/SKILL.md +224 -0
  27. package/.claude/skills/cc-do/references/execution-recovery.md +86 -0
  28. package/.claude/skills/cc-do/references/parallel-dispatch.md +80 -0
  29. package/.claude/skills/cc-do/scripts/build-task-context.sh +184 -0
  30. package/.claude/skills/cc-do/scripts/cc-do-common.sh +79 -0
  31. package/.claude/skills/cc-do/scripts/check-task-status.sh +92 -0
  32. package/.claude/skills/cc-do/scripts/detect-file-conflicts.sh +87 -0
  33. package/.claude/skills/cc-do/scripts/mark-task-complete.sh +119 -0
  34. package/.claude/skills/cc-do/scripts/record-review-decision.sh +89 -0
  35. package/.claude/skills/cc-do/scripts/recover-workflow.sh +84 -0
  36. package/.claude/skills/cc-do/scripts/run-problem-analysis.sh +70 -0
  37. package/.claude/skills/cc-do/scripts/select-ready-tasks.sh +135 -0
  38. package/.claude/skills/cc-do/scripts/verify-task-gates.sh +94 -0
  39. package/.claude/skills/cc-do/scripts/write-task-checkpoint.sh +102 -0
  40. package/.claude/skills/cc-investigate/CHANGELOG.md +31 -0
  41. package/.claude/skills/cc-investigate/PLAYBOOK.md +49 -0
  42. package/.claude/skills/cc-investigate/SKILL.md +229 -0
  43. package/.claude/skills/cc-investigate/assets/ANALYSIS_TEMPLATE.md +56 -0
  44. package/.claude/skills/cc-investigate/assets/TASKS_TEMPLATE.md +53 -0
  45. package/.claude/skills/cc-investigate/assets/TASK_MANIFEST_TEMPLATE.json +106 -0
  46. package/.claude/skills/cc-investigate/references/investigation-contract.md +28 -0
  47. package/.claude/skills/cc-investigate/scripts/bootstrap-analysis.sh +38 -0
  48. package/.claude/skills/cc-plan/CHANGELOG.md +104 -0
  49. package/.claude/skills/cc-plan/PLAYBOOK.md +106 -0
  50. package/.claude/skills/cc-plan/SKILL.md +333 -0
  51. package/.claude/skills/cc-plan/assets/DESIGN_TEMPLATE.md +156 -0
  52. package/.claude/skills/cc-plan/assets/TASKS_TEMPLATE.md +99 -0
  53. package/.claude/skills/cc-plan/assets/TASK_MANIFEST_TEMPLATE.json +111 -0
  54. package/.claude/skills/cc-plan/assets/TINY_DESIGN_TEMPLATE.md +80 -0
  55. package/.claude/skills/cc-plan/references/planning-contract.md +82 -0
  56. package/.claude/skills/cc-plan/scripts/bump-skill-version.sh +103 -0
  57. package/.claude/skills/cc-plan/scripts/parse-task-dependencies.js +75 -0
  58. package/.claude/skills/cc-plan/scripts/validate-scope.sh +78 -0
  59. package/.claude/skills/cc-roadmap/CHANGELOG.md +119 -0
  60. package/.claude/skills/cc-roadmap/PLAYBOOK.md +136 -0
  61. package/.claude/skills/cc-roadmap/SKILL.md +267 -0
  62. package/.claude/skills/cc-roadmap/assets/BACKLOG_TEMPLATE.md +46 -0
  63. package/.claude/skills/cc-roadmap/assets/ROADMAP_TEMPLATE.md +154 -0
  64. package/.claude/skills/cc-roadmap/assets/TRACKING_TEMPLATE.json +51 -0
  65. package/.claude/skills/cc-roadmap/references/roadmap-dialogue.md +37 -0
  66. package/.claude/skills/cc-roadmap/scripts/bump-skill-version.sh +103 -0
  67. package/.claude/skills/cc-roadmap/scripts/lib/roadmap-tracking/markdown.js +604 -0
  68. package/.claude/skills/cc-roadmap/scripts/lib/roadmap-tracking/query.js +63 -0
  69. package/.claude/skills/cc-roadmap/scripts/lib/roadmap-tracking/schema.js +245 -0
  70. package/.claude/skills/cc-roadmap/scripts/lib/roadmap-tracking/store.js +139 -0
  71. package/.claude/skills/cc-roadmap/scripts/locate-roadmap-item.sh +109 -0
  72. package/.claude/skills/cc-roadmap/scripts/roadmap-tracking.js +153 -0
  73. package/.claude/skills/cc-roadmap/scripts/sync-roadmap-progress.sh +100 -0
  74. package/.claude/skills/cc-simplify/CHANGELOG.md +10 -0
  75. package/.claude/skills/cc-simplify/SKILL.md +55 -0
  76. package/.claude/skills/cc-spec-init/CHANGELOG.md +12 -0
  77. package/.claude/skills/cc-spec-init/PLAYBOOK.md +55 -0
  78. package/.claude/skills/cc-spec-init/SKILL.md +135 -0
  79. package/.claude/skills/cc-spec-init/assets/CAPABILITY_TEMPLATE.md +64 -0
  80. package/.claude/skills/cc-spec-init/assets/CHANGE_META_TEMPLATE.json +28 -0
  81. package/.claude/skills/cc-spec-init/assets/INDEX_TEMPLATE.md +35 -0
  82. package/.claude/skills/cc-spec-init/references/spec-contract.md +22 -0
  83. package/.claude/skills/cc-spec-init/scripts/bootstrap-specs.sh +31 -0
  84. package/.claude/skills/cc-spec-init/scripts/validate-spec-links.sh +45 -0
  85. package/CHANGELOG.md +80 -4
  86. package/README.md +148 -741
  87. package/README.zh-CN.md +146 -740
  88. package/bin/adapt.js +2 -6
  89. package/bin/cc-devflow-cli.js +287 -166
  90. package/config/distributable-skills.json +24 -0
  91. package/config/schema/cc-devflow-config.schema.json +45 -0
  92. package/config/user-config.template.yml +16 -0
  93. package/docs/CLAUDE.md +10 -6
  94. package/docs/commands/README.md +19 -46
  95. package/docs/commands/README.zh-CN.md +25 -48
  96. package/docs/examples/BY-ARTIFACT.md +7 -0
  97. package/docs/examples/README.md +38 -0
  98. package/docs/examples/START-HERE.md +149 -0
  99. package/docs/examples/example-bindings.json +38 -0
  100. package/docs/examples/full-design-blocked/BACKLOG.md +45 -0
  101. package/docs/examples/full-design-blocked/README.md +55 -0
  102. package/docs/examples/full-design-blocked/ROADMAP.md +53 -0
  103. package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/design.md +154 -0
  104. package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json +146 -0
  105. package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md +78 -0
  106. package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/review/report-card.json +52 -0
  107. package/docs/examples/full-design-blocked/roadmap-tracking.json +50 -0
  108. package/docs/examples/local-handoff/BACKLOG.md +45 -0
  109. package/docs/examples/local-handoff/README.md +56 -0
  110. package/docs/examples/local-handoff/ROADMAP.md +45 -0
  111. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/handoff/resume-index.md +39 -0
  112. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/handoff/status.md +29 -0
  113. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/design.md +71 -0
  114. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/task-manifest.json +98 -0
  115. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/tasks.md +59 -0
  116. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/review/report-card.json +44 -0
  117. package/docs/examples/local-handoff/roadmap-tracking.json +48 -0
  118. package/docs/examples/pdca-loop/BACKLOG.md +46 -0
  119. package/docs/examples/pdca-loop/README.md +58 -0
  120. package/docs/examples/pdca-loop/ROADMAP.md +133 -0
  121. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/handoff/pr-brief.md +72 -0
  122. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/handoff/status.md +29 -0
  123. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/design.md +72 -0
  124. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/task-manifest.json +201 -0
  125. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/tasks.md +73 -0
  126. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/review/report-card.json +44 -0
  127. package/docs/examples/pdca-loop/roadmap-tracking.json +114 -0
  128. package/docs/examples/scripts/check-example-bindings.sh +116 -0
  129. package/docs/guides/getting-started.md +94 -129
  130. package/docs/guides/getting-started.zh-CN.md +103 -84
  131. package/docs/skill-runtime-migration.md +46 -0
  132. package/docs/v4.3.0-migration-guide.md +60 -225
  133. package/lib/compiler/CLAUDE.md +55 -84
  134. package/lib/compiler/__tests__/drift.test.js +1 -1
  135. package/lib/compiler/__tests__/errors.test.js +0 -1
  136. package/lib/compiler/__tests__/integration.test.js +49 -3
  137. package/lib/compiler/__tests__/manifest.test.js +0 -156
  138. package/lib/compiler/__tests__/parser.test.js +33 -104
  139. package/lib/compiler/__tests__/schemas.test.js +30 -34
  140. package/lib/compiler/__tests__/skills-registry.test.js +114 -0
  141. package/lib/compiler/__tests__/transformer.test.js +5 -9
  142. package/lib/compiler/emitters/antigravity-emitter.js +5 -213
  143. package/lib/compiler/emitters/base-emitter.js +3 -298
  144. package/lib/compiler/emitters/codex-emitter.js +4 -202
  145. package/lib/compiler/emitters/cursor-emitter.js +3 -287
  146. package/lib/compiler/emitters/qwen-emitter.js +4 -176
  147. package/lib/compiler/index.js +65 -345
  148. package/lib/compiler/manifest.js +6 -68
  149. package/lib/compiler/parser.js +31 -63
  150. package/lib/compiler/platforms.js +32 -277
  151. package/lib/compiler/resource-copier.js +176 -6
  152. package/lib/compiler/rules-emitters/__tests__/antigravity-rules-emitter.test.js +3 -3
  153. package/lib/compiler/rules-emitters/__tests__/cursor-rules-emitter.test.js +14 -4
  154. package/lib/compiler/rules-emitters/__tests__/qwen-rules-emitter.test.js +16 -7
  155. package/lib/compiler/rules-emitters/antigravity-rules-emitter.js +10 -15
  156. package/lib/compiler/rules-emitters/base-rules-emitter.js +5 -5
  157. package/lib/compiler/rules-emitters/cursor-rules-emitter.js +7 -12
  158. package/lib/compiler/rules-emitters/index.js +6 -3
  159. package/lib/compiler/rules-emitters/qwen-rules-emitter.js +7 -7
  160. package/lib/compiler/schemas.js +8 -4
  161. package/lib/compiler/skills-registry.js +213 -15
  162. package/lib/compiler/transformer.js +1 -1
  163. package/lib/skill-runtime/CLAUDE.md +19 -0
  164. package/lib/skill-runtime/__tests__/autopilot.test.js +210 -0
  165. package/lib/skill-runtime/__tests__/cli-bootstrap.integration.test.js +291 -0
  166. package/lib/skill-runtime/__tests__/config.test.js +161 -0
  167. package/lib/skill-runtime/__tests__/delegation.test.js +97 -0
  168. package/lib/skill-runtime/__tests__/dispatch.test.js +267 -0
  169. package/lib/skill-runtime/__tests__/intent.test.js +219 -0
  170. package/lib/skill-runtime/__tests__/lifecycle.test.js +169 -0
  171. package/lib/skill-runtime/__tests__/paths.test.js +42 -0
  172. package/lib/skill-runtime/__tests__/planner.tdd.test.js +250 -0
  173. package/lib/skill-runtime/__tests__/prepare-pr.test.js +139 -0
  174. package/lib/skill-runtime/__tests__/query.test.js +284 -0
  175. package/lib/skill-runtime/__tests__/runtime.integration.test.js +281 -0
  176. package/lib/skill-runtime/__tests__/schemas.test.js +207 -0
  177. package/lib/skill-runtime/__tests__/team-state.test.js +51 -0
  178. package/lib/skill-runtime/__tests__/worker-run.test.js +253 -0
  179. package/lib/skill-runtime/__tests__/worker.test.js +56 -0
  180. package/lib/skill-runtime/artifacts.js +93 -0
  181. package/lib/skill-runtime/config.js +379 -0
  182. package/lib/skill-runtime/delegation.js +533 -0
  183. package/lib/skill-runtime/index.js +36 -0
  184. package/lib/skill-runtime/intent.js +333 -0
  185. package/lib/skill-runtime/lifecycle.js +294 -0
  186. package/lib/skill-runtime/operations/CLAUDE.md +19 -0
  187. package/lib/skill-runtime/operations/approve.js +66 -0
  188. package/lib/skill-runtime/operations/autopilot-core.js +337 -0
  189. package/lib/skill-runtime/operations/autopilot-execution.js +307 -0
  190. package/lib/skill-runtime/operations/autopilot-shared.js +48 -0
  191. package/lib/skill-runtime/operations/autopilot.js +163 -0
  192. package/lib/skill-runtime/operations/dispatch.js +454 -0
  193. package/lib/skill-runtime/operations/init.js +64 -0
  194. package/lib/{harness → skill-runtime}/operations/janitor.js +9 -6
  195. package/lib/skill-runtime/operations/plan.js +59 -0
  196. package/lib/skill-runtime/operations/prepare-pr.js +25 -0
  197. package/lib/skill-runtime/operations/release.js +96 -0
  198. package/lib/skill-runtime/operations/resume.js +143 -0
  199. package/lib/skill-runtime/operations/snapshot.js +45 -0
  200. package/lib/skill-runtime/operations/verify.js +170 -0
  201. package/lib/skill-runtime/operations/worker-run.js +529 -0
  202. package/lib/skill-runtime/operations/worker.js +33 -0
  203. package/lib/skill-runtime/paths.js +213 -0
  204. package/lib/skill-runtime/planner.js +519 -0
  205. package/lib/skill-runtime/query.js +157 -0
  206. package/lib/skill-runtime/review.js +557 -0
  207. package/lib/skill-runtime/schemas.js +400 -0
  208. package/lib/{harness → skill-runtime}/store.js +45 -30
  209. package/lib/skill-runtime/team-state.js +122 -0
  210. package/package.json +13 -11
  211. package/.claude/CLAUDE.md +0 -125
  212. package/.claude/agents/architecture-designer.md +0 -443
  213. package/.claude/agents/bug-analyzer.md +0 -381
  214. package/.claude/agents/checklist-agent.md +0 -175
  215. package/.claude/agents/clarify-analyst.md +0 -50
  216. package/.claude/agents/code-quality-reviewer.md +0 -205
  217. package/.claude/agents/code-reviewer.md +0 -71
  218. package/.claude/agents/codex-analyzer.md +0 -39
  219. package/.claude/agents/compatibility-checker.md +0 -579
  220. package/.claude/agents/consistency-checker.md +0 -532
  221. package/.claude/agents/dev-implementer.md +0 -195
  222. package/.claude/agents/flow-researcher.md +0 -132
  223. package/.claude/agents/impact-analyzer.md +0 -440
  224. package/.claude/agents/planner.md +0 -230
  225. package/.claude/agents/prd-writer.md +0 -320
  226. package/.claude/agents/project-guidelines-generator.md +0 -1329
  227. package/.claude/agents/qa-tester.md +0 -313
  228. package/.claude/agents/release-manager.md +0 -295
  229. package/.claude/agents/security-reviewer.md +0 -314
  230. package/.claude/agents/spec-reviewer.md +0 -221
  231. package/.claude/agents/style-guide-generator.md +0 -458
  232. package/.claude/agents/tech-architect.md +0 -516
  233. package/.claude/agents/ui-designer.md +0 -485
  234. package/.claude/commands/core/architecture.md +0 -459
  235. package/.claude/commands/core/guidelines.md +0 -511
  236. package/.claude/commands/core/roadmap.md +0 -468
  237. package/.claude/commands/core/style.md +0 -83
  238. package/.claude/commands/flow/CLAUDE.md +0 -24
  239. package/.claude/commands/flow/archive.md +0 -280
  240. package/.claude/commands/flow/constitution.md +0 -82
  241. package/.claude/commands/flow/context.md +0 -150
  242. package/.claude/commands/flow/delta.md +0 -245
  243. package/.claude/commands/flow/dev.md +0 -40
  244. package/.claude/commands/flow/fix.md +0 -217
  245. package/.claude/commands/flow/ideate.md +0 -214
  246. package/.claude/commands/flow/init.md +0 -38
  247. package/.claude/commands/flow/release.md +0 -36
  248. package/.claude/commands/flow/restart.md +0 -97
  249. package/.claude/commands/flow/spec.md +0 -36
  250. package/.claude/commands/flow/status.md +0 -64
  251. package/.claude/commands/flow/update.md +0 -111
  252. package/.claude/commands/flow/upgrade.md +0 -115
  253. package/.claude/commands/flow/verify.md +0 -37
  254. package/.claude/commands/flow/workspace.md +0 -155
  255. package/.claude/commands/util/cancel-ralph.md +0 -60
  256. package/.claude/commands/util/code-review.md +0 -58
  257. package/.claude/commands/util/git-commit.md +0 -422
  258. package/.claude/commands/util/problem-analyzer.md +0 -60
  259. package/.claude/config/quality-gates.yml +0 -305
  260. package/.claude/config/quality-rules.yml +0 -161
  261. package/.claude/docs/SPEC_KIT_CONSTITUTION_ANALYSIS.md +0 -426
  262. package/.claude/docs/design/consistency-conflict-detection-algorithms.md +0 -658
  263. package/.claude/docs/design/intent-driven-input-design.md +0 -380
  264. package/.claude/docs/design/prd-version-management-design.md +0 -437
  265. package/.claude/docs/examples/design-inspiration-pool.md +0 -59
  266. package/.claude/docs/examples/ui-prototype-constitution-checklist.md +0 -75
  267. package/.claude/docs/guides/INIT_TROUBLESHOOTING.md +0 -117
  268. package/.claude/docs/guides/NEW_TROUBLESHOOTING.md +0 -99
  269. package/.claude/docs/guides/ROADMAP_TROUBLESHOOTING.md +0 -188
  270. package/.claude/docs/guides/TASK_COMPLETION_MARKING.md +0 -338
  271. package/.claude/docs/guides/TEAM_MODE_GUIDE.md +0 -312
  272. package/.claude/docs/implementation-summary-v7.md +0 -449
  273. package/.claude/docs/spec-format-guide.md +0 -349
  274. package/.claude/docs/state-consolidation-design.md +0 -323
  275. package/.claude/docs/templates/ARCHITECTURE_TEMPLATE.md +0 -332
  276. package/.claude/docs/templates/ATTEMPT_TEMPLATE.md +0 -156
  277. package/.claude/docs/templates/BACKLOG_TEMPLATE.md +0 -261
  278. package/.claude/docs/templates/BRAINSTORM_TEMPLATE.md +0 -148
  279. package/.claude/docs/templates/CHECKLIST_TEMPLATE.md +0 -52
  280. package/.claude/docs/templates/CLARIFICATION_REPORT_TEMPLATE.md +0 -206
  281. package/.claude/docs/templates/CODE_REVIEW_TEMPLATE.md +0 -71
  282. package/.claude/docs/templates/DELTA_SPEC_TEMPLATE.md +0 -91
  283. package/.claude/docs/templates/DESIGN_DECISIONS_TEMPLATE.md +0 -151
  284. package/.claude/docs/templates/DESIGN_TEMPLATE.md +0 -157
  285. package/.claude/docs/templates/ERROR_LOG_TEMPLATE.md +0 -80
  286. package/.claude/docs/templates/INIT_FLOW_TEMPLATE.md +0 -198
  287. package/.claude/docs/templates/INTENT_CLARIFICATION_TEMPLATE.md +0 -57
  288. package/.claude/docs/templates/JOURNAL_TEMPLATE.md +0 -75
  289. package/.claude/docs/templates/NEW_ORCHESTRATION_TEMPLATE.md +0 -76
  290. package/.claude/docs/templates/PROPOSAL_TEMPLATE.md +0 -91
  291. package/.claude/docs/templates/RESEARCH_TEMPLATE.md +0 -276
  292. package/.claude/docs/templates/REVIEW-HIGH.md +0 -57
  293. package/.claude/docs/templates/ROADMAP_DIALOGUE_TEMPLATE.md +0 -198
  294. package/.claude/docs/templates/ROADMAP_TEMPLATE.md +0 -310
  295. package/.claude/docs/templates/SPEC_TEMPLATE_DELTA.md +0 -139
  296. package/.claude/docs/templates/SPEC_TEMPLATE_PROJECT.md +0 -93
  297. package/.claude/docs/templates/STYLE_TEMPLATE.md +0 -479
  298. package/.claude/docs/templates/UI_PROTOTYPE_TEMPLATE.md +0 -373
  299. package/.claude/docs/templates/_shared/CLAUDE.md +0 -36
  300. package/.claude/docs/templates/_shared/CONSTITUTION_CHECK.md +0 -125
  301. package/.claude/docs/templates/_shared/VALIDATION_CHECKLIST.md +0 -187
  302. package/.claude/docs/templates/_shared/YAML_FRONTMATTER.md +0 -164
  303. package/.claude/docs/templates/context/dev.jsonl.template +0 -6
  304. package/.claude/docs/templates/context/epic.jsonl.template +0 -5
  305. package/.claude/docs/templates/context/prd.jsonl.template +0 -4
  306. package/.claude/docs/templates/context/research.jsonl.template +0 -4
  307. package/.claude/docs/templates/context/review.jsonl.template +0 -5
  308. package/.claude/docs/templates/context/tech.jsonl.template +0 -5
  309. package/.claude/guides/agent-guides/agent-coordination-guide.md +0 -459
  310. package/.claude/guides/project-guidelines-system.md +0 -463
  311. package/.claude/guides/technical-guides/datetime-handling-guide.md +0 -563
  312. package/.claude/guides/technical-guides/git-github-guide.md +0 -642
  313. package/.claude/guides/technical-guides/test-execution-guide.md +0 -618
  314. package/.claude/guides/workflow-guides/bug-fix-orchestrator.md +0 -217
  315. package/.claude/guides/workflow-guides/flow-orchestrator.md +0 -48
  316. package/.claude/hooks/CLAUDE.md +0 -342
  317. package/.claude/hooks/checklist-gate.js +0 -397
  318. package/.claude/hooks/error-handling-reminder.sh +0 -12
  319. package/.claude/hooks/error-handling-reminder.ts +0 -459
  320. package/.claude/hooks/hooks.json +0 -15
  321. package/.claude/hooks/inject-agent-context.ts +0 -480
  322. package/.claude/hooks/inject-skill-context.ts +0 -359
  323. package/.claude/hooks/post-tool-use-tracker.sh +0 -280
  324. package/.claude/hooks/pre-tool-use-guardrail.sh +0 -36
  325. package/.claude/hooks/pre-tool-use-guardrail.ts +0 -342
  326. package/.claude/hooks/ralph-loop.ts +0 -931
  327. package/.claude/hooks/ralph-stop-hook.sh +0 -190
  328. package/.claude/hooks/skill-activation-prompt.sh +0 -36
  329. package/.claude/hooks/skill-activation-prompt.ts +0 -214
  330. package/.claude/hooks/state/skills-used-test-guard.json +0 -3
  331. package/.claude/hooks/task-completed-hook.ts +0 -593
  332. package/.claude/hooks/teammate-idle-hook.ts +0 -690
  333. package/.claude/hooks/types/team-types.d.ts +0 -238
  334. package/.claude/rules/devflow-conventions.md +0 -286
  335. package/.claude/rules/project-constitution.md +0 -1002
  336. package/.claude/rules/rationalization-library.md +0 -282
  337. package/.claude/schemas/constitution.schema.json +0 -43
  338. package/.claude/scripts/.claude/commands/flow/export-openspec.md +0 -221
  339. package/.claude/scripts/.claude/commands/flow/import-openspec.md +0 -171
  340. package/.claude/scripts/CLAUDE.md +0 -76
  341. package/.claude/scripts/__tests__/openspec.test.js +0 -212
  342. package/.claude/scripts/analyze-upgrade-impact.sh +0 -200
  343. package/.claude/scripts/archive-requirement.sh +0 -394
  344. package/.claude/scripts/calculate-checklist-completion.sh +0 -243
  345. package/.claude/scripts/calculate-quarter.sh +0 -206
  346. package/.claude/scripts/check-dependencies.sh +0 -409
  347. package/.claude/scripts/check-prerequisites.sh +0 -232
  348. package/.claude/scripts/check-task-status.sh +0 -288
  349. package/.claude/scripts/checklist-errors.sh +0 -131
  350. package/.claude/scripts/common.sh +0 -1102
  351. package/.claude/scripts/consolidate-research.sh +0 -182
  352. package/.claude/scripts/create-requirement.sh +0 -451
  353. package/.claude/scripts/delta-parser.ts +0 -637
  354. package/.claude/scripts/detect-file-conflicts.sh +0 -151
  355. package/.claude/scripts/export-contracts.sh +0 -117
  356. package/.claude/scripts/export-openspec.js +0 -222
  357. package/.claude/scripts/extract-data-model.sh +0 -78
  358. package/.claude/scripts/flow-context-add.sh +0 -134
  359. package/.claude/scripts/flow-context-init.sh +0 -133
  360. package/.claude/scripts/flow-context-validate.sh +0 -144
  361. package/.claude/scripts/flow-delta-apply.sh +0 -297
  362. package/.claude/scripts/flow-delta-archive.sh +0 -71
  363. package/.claude/scripts/flow-delta-create.sh +0 -202
  364. package/.claude/scripts/flow-delta-list.sh +0 -142
  365. package/.claude/scripts/flow-delta-status.sh +0 -235
  366. package/.claude/scripts/flow-quality-full.sh +0 -215
  367. package/.claude/scripts/flow-quality-quick.sh +0 -119
  368. package/.claude/scripts/flow-workspace-init.sh +0 -117
  369. package/.claude/scripts/flow-workspace-record.sh +0 -164
  370. package/.claude/scripts/generate-clarification-questions.sh +0 -377
  371. package/.claude/scripts/generate-clarification-report.sh +0 -463
  372. package/.claude/scripts/generate-quickstart.sh +0 -146
  373. package/.claude/scripts/generate-research-tasks.sh +0 -157
  374. package/.claude/scripts/generate-status-report.sh +0 -523
  375. package/.claude/scripts/generate-tech-analysis.sh +0 -46
  376. package/.claude/scripts/get-workflow-status.sh +0 -415
  377. package/.claude/scripts/import-openspec.js +0 -272
  378. package/.claude/scripts/locate-requirement-in-roadmap.sh +0 -233
  379. package/.claude/scripts/manage-constitution.sh +0 -602
  380. package/.claude/scripts/mark-task-complete.sh +0 -198
  381. package/.claude/scripts/parse-task-dependencies.js +0 -334
  382. package/.claude/scripts/populate-research-tasks.sh +0 -284
  383. package/.claude/scripts/record-quality-error.sh +0 -165
  384. package/.claude/scripts/recover-workflow.sh +0 -463
  385. package/.claude/scripts/run-clarify-scan.sh +0 -601
  386. package/.claude/scripts/run-high-review.sh +0 -62
  387. package/.claude/scripts/run-problem-analysis.sh +0 -68
  388. package/.claude/scripts/run-quality-gates.sh +0 -242
  389. package/.claude/scripts/setup-epic.sh +0 -173
  390. package/.claude/scripts/setup-ralph-loop.sh +0 -155
  391. package/.claude/scripts/sync-roadmap-progress.sh +0 -300
  392. package/.claude/scripts/sync-task-marks.sh +0 -199
  393. package/.claude/scripts/team-dev-init.sh +0 -319
  394. package/.claude/scripts/team-state-recovery.sh +0 -229
  395. package/.claude/scripts/test-clarify-scan.sh +0 -515
  396. package/.claude/scripts/update-agent-context.sh +0 -806
  397. package/.claude/scripts/validate-constitution.sh +0 -567
  398. package/.claude/scripts/validate-hooks.sh +0 -487
  399. package/.claude/scripts/validate-research.sh +0 -332
  400. package/.claude/scripts/validate-scope-boundary.sh +0 -493
  401. package/.claude/scripts/validate-scope.sh +0 -200
  402. package/.claude/scripts/verify-gate.sh +0 -269
  403. package/.claude/scripts/verify-setup.sh +0 -37
  404. package/.claude/scripts/workflow-status.ts +0 -433
  405. package/.claude/settings.json +0 -95
  406. package/.claude/skills/_reference-implementations/README.md +0 -96
  407. package/.claude/skills/_reference-implementations/backend-express-prisma/SKILL.md +0 -302
  408. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/architecture-overview.md +0 -451
  409. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/async-and-errors.md +0 -307
  410. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/complete-examples.md +0 -638
  411. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/configuration.md +0 -275
  412. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/database-patterns.md +0 -224
  413. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/middleware-guide.md +0 -213
  414. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/routing-and-controllers.md +0 -756
  415. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/sentry-and-monitoring.md +0 -336
  416. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/services-and-repositories.md +0 -789
  417. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/testing-guide.md +0 -235
  418. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/validation-patterns.md +0 -754
  419. package/.claude/skills/_reference-implementations/frontend-react-mui/SKILL.md +0 -399
  420. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/common-patterns.md +0 -331
  421. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/complete-examples.md +0 -872
  422. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/component-patterns.md +0 -502
  423. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/data-fetching.md +0 -767
  424. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/file-organization.md +0 -502
  425. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/loading-and-error-states.md +0 -501
  426. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/performance.md +0 -406
  427. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/routing-guide.md +0 -364
  428. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/styling-guide.md +0 -428
  429. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/typescript-standards.md +0 -418
  430. package/.claude/skills/attention-refresh/SKILL.md +0 -170
  431. package/.claude/skills/brainstorming/SKILL.md +0 -161
  432. package/.claude/skills/cc-devflow-orchestrator/SKILL.md +0 -169
  433. package/.claude/skills/constitution-guardian/SKILL.md +0 -306
  434. package/.claude/skills/constitution-quick-ref/SKILL.md +0 -374
  435. package/.claude/skills/debugging/SKILL.md +0 -221
  436. package/.claude/skills/file-standards/SKILL.md +0 -353
  437. package/.claude/skills/finishing-branch/SKILL.md +0 -189
  438. package/.claude/skills/flow-dev/CLAUDE.md +0 -16
  439. package/.claude/skills/flow-dev/SKILL.md +0 -94
  440. package/.claude/skills/flow-dev/assets/IMPLEMENTATION_PLAN_TEMPLATE.md +0 -71
  441. package/.claude/skills/flow-dev/context.jsonl +0 -4
  442. package/.claude/skills/flow-dev/dev-implementer.jsonl +0 -8
  443. package/.claude/skills/flow-dev/scripts/entry-gate.sh +0 -116
  444. package/.claude/skills/flow-dev/scripts/exit-gate.sh +0 -101
  445. package/.claude/skills/flow-dev/scripts/task-orchestrator.sh +0 -106
  446. package/.claude/skills/flow-fix/SKILL.md +0 -105
  447. package/.claude/skills/flow-fix/context.jsonl +0 -6
  448. package/.claude/skills/flow-fix/references/bug-analyzer.md +0 -381
  449. package/.claude/skills/flow-init/SKILL.md +0 -105
  450. package/.claude/skills/flow-init/assets/BRAINSTORM_TEMPLATE.md +0 -148
  451. package/.claude/skills/flow-init/assets/INIT_FLOW_TEMPLATE.md +0 -198
  452. package/.claude/skills/flow-init/assets/RESEARCH_TEMPLATE.md +0 -276
  453. package/.claude/skills/flow-init/context.jsonl +0 -5
  454. package/.claude/skills/flow-init/references/flow-researcher.md +0 -132
  455. package/.claude/skills/flow-init/scripts/check-prerequisites.sh +0 -240
  456. package/.claude/skills/flow-init/scripts/consolidate-research.sh +0 -182
  457. package/.claude/skills/flow-init/scripts/create-requirement.sh +0 -404
  458. package/.claude/skills/flow-init/scripts/generate-research-tasks.sh +0 -157
  459. package/.claude/skills/flow-init/scripts/populate-research-tasks.sh +0 -284
  460. package/.claude/skills/flow-init/scripts/validate-research.sh +0 -340
  461. package/.claude/skills/flow-quality/SKILL.md +0 -98
  462. package/.claude/skills/flow-quality/context.jsonl +0 -6
  463. package/.claude/skills/flow-quality/references/code-quality-reviewer.md +0 -205
  464. package/.claude/skills/flow-quality/references/qa-tester.md +0 -313
  465. package/.claude/skills/flow-quality/references/security-reviewer.md +0 -314
  466. package/.claude/skills/flow-quality/references/spec-reviewer.md +0 -221
  467. package/.claude/skills/flow-release/SKILL.md +0 -60
  468. package/.claude/skills/flow-release/context.jsonl +0 -5
  469. package/.claude/skills/flow-release/references/release-manager.md +0 -295
  470. package/.claude/skills/flow-spec/CLAUDE.md +0 -17
  471. package/.claude/skills/flow-spec/SKILL.md +0 -102
  472. package/.claude/skills/flow-spec/context.jsonl +0 -5
  473. package/.claude/skills/flow-spec/scripts/entry-gate.sh +0 -194
  474. package/.claude/skills/flow-spec/scripts/exit-gate.sh +0 -244
  475. package/.claude/skills/flow-spec/scripts/parallel-orchestrator.sh +0 -205
  476. package/.claude/skills/flow-spec/scripts/team-communication.sh +0 -353
  477. package/.claude/skills/flow-spec/scripts/team-init.sh +0 -195
  478. package/.claude/skills/flow-spec/scripts/test-team-mode.sh +0 -496
  479. package/.claude/skills/flow-spec/team-config.json +0 -165
  480. package/.claude/skills/flow-verify/CLAUDE.md +0 -10
  481. package/.claude/skills/flow-verify/SKILL.md +0 -53
  482. package/.claude/skills/flow-verify/context.jsonl +0 -5
  483. package/.claude/skills/fractal-docs/SKILL.md +0 -45
  484. package/.claude/skills/journey-checker/SKILL.md +0 -199
  485. package/.claude/skills/journey-checker/pressure-scenarios.md +0 -164
  486. package/.claude/skills/receiving-review/SKILL.md +0 -153
  487. package/.claude/skills/skill-creator/LICENSE.txt +0 -202
  488. package/.claude/skills/skill-creator/SKILL.md +0 -356
  489. package/.claude/skills/skill-creator/references/output-patterns.md +0 -82
  490. package/.claude/skills/skill-creator/references/workflows.md +0 -28
  491. package/.claude/skills/skill-creator/scripts/init_skill.py +0 -303
  492. package/.claude/skills/skill-creator/scripts/package_skill.py +0 -110
  493. package/.claude/skills/skill-creator/scripts/quick_validate.py +0 -95
  494. package/.claude/skills/skill-rules.json +0 -359
  495. package/.claude/skills/tdd/SKILL.md +0 -218
  496. package/.claude/skills/tdd-enforcer/SKILL.md +0 -192
  497. package/.claude/skills/utility/npm-release/CLAUDE.md +0 -55
  498. package/.claude/skills/utility/npm-release/SKILL.md +0 -379
  499. package/.claude/skills/utility/npm-release/references/version-decision-guide.md +0 -134
  500. package/.claude/skills/utility/npm-release/scripts/atomic-version-bump.sh +0 -95
  501. package/.claude/skills/utility/npm-release/scripts/validate-version-sync.sh +0 -82
  502. package/.claude/skills/utility/npm-release/scripts/version-decision-tree.sh +0 -44
  503. package/.claude/skills/verification/SKILL.md +0 -158
  504. package/.claude/skills/workflow.yaml +0 -219
  505. package/.claude/tests/README.md +0 -300
  506. package/.claude/tests/TODO.md +0 -69
  507. package/.claude/tests/__pycache__/test_analyze_upgrade_impact.cpython-311-pytest-7.2.2.pyc +0 -0
  508. package/.claude/tests/__pycache__/test_consolidate_research.cpython-311-pytest-7.2.2.pyc +0 -0
  509. package/.claude/tests/__pycache__/test_export_contracts.cpython-311-pytest-7.2.2.pyc +0 -0
  510. package/.claude/tests/__pycache__/test_extract_data_model.cpython-311-pytest-7.2.2.pyc +0 -0
  511. package/.claude/tests/__pycache__/test_generate_quickstart.cpython-311-pytest-7.2.2.pyc +0 -0
  512. package/.claude/tests/__pycache__/test_generate_research_tasks.cpython-311-pytest-7.2.2.pyc +0 -0
  513. package/.claude/tests/constitution/run_all_constitution_tests.sh +0 -111
  514. package/.claude/tests/constitution/test_agent_assignment.sh +0 -207
  515. package/.claude/tests/constitution/test_article_coverage.sh +0 -201
  516. package/.claude/tests/constitution/test_template_completeness.sh +0 -150
  517. package/.claude/tests/constitution/test_version_consistency.sh +0 -120
  518. package/.claude/tests/fixtures/spec_delta_full.md +0 -16
  519. package/.claude/tests/fixtures/tasks_progress_sample.md +0 -5
  520. package/.claude/tests/run-all-tests.sh +0 -229
  521. package/.claude/tests/scripts/run.sh +0 -30
  522. package/.claude/tests/scripts/test-framework.sh +0 -128
  523. package/.claude/tests/scripts/test_check_prerequisites.sh +0 -511
  524. package/.claude/tests/scripts/test_check_prerequisites.sh.bak +0 -504
  525. package/.claude/tests/scripts/test_check_prerequisites.sh.bak2 +0 -505
  526. package/.claude/tests/scripts/test_check_prerequisites.sh.bak3 +0 -506
  527. package/.claude/tests/scripts/test_check_prerequisites.sh.bak4 +0 -507
  528. package/.claude/tests/scripts/test_check_prerequisites.sh.bak5 +0 -508
  529. package/.claude/tests/scripts/test_check_task_status.sh +0 -499
  530. package/.claude/tests/scripts/test_common.sh +0 -244
  531. package/.claude/tests/scripts/test_generate_status_report.sh +0 -71
  532. package/.claude/tests/scripts/test_mark_task_complete.sh +0 -441
  533. package/.claude/tests/scripts/test_mark_task_complete.sh.backup +0 -410
  534. package/.claude/tests/scripts/test_recover_workflow.sh +0 -304
  535. package/.claude/tests/scripts/test_setup_epic.sh +0 -437
  536. package/.claude/tests/scripts/test_sync_task_marks.sh +0 -196
  537. package/.claude/tests/scripts/test_validate_constitution.sh +0 -74
  538. package/.claude/tests/scripts/test_validate_research.sh +0 -462
  539. package/.claude/tests/slugify.bats +0 -82
  540. package/.claude/tests/test-framework.sh +0 -732
  541. package/.claude/tests/test_analyze_upgrade_impact.py +0 -34
  542. package/.claude/tests/test_consolidate_research.py +0 -48
  543. package/.claude/tests/test_export_contracts.py +0 -43
  544. package/.claude/tests/test_extract_data_model.py +0 -33
  545. package/.claude/tests/test_generate_quickstart.py +0 -50
  546. package/.claude/tests/test_generate_research_tasks.py +0 -52
  547. package/.claude/tsc-cache/70d2fc6d-2936-429b-b529-429f1aae8c88/affected-repos.txt +0 -1
  548. package/.claude/tsc-cache/70d2fc6d-2936-429b-b529-429f1aae8c88/edited-files.log +0 -2
  549. package/bin/harness.js +0 -22
  550. package/docs/commands/core-roadmap.md +0 -106
  551. package/docs/commands/core-roadmap.zh-CN.md +0 -102
  552. package/docs/commands/core-style.md +0 -53
  553. package/docs/commands/core-style.zh-CN.md +0 -53
  554. package/docs/commands/flow-init.md +0 -140
  555. package/docs/commands/flow-init.zh-CN.md +0 -169
  556. package/docs/commands/flow-new.md +0 -39
  557. package/docs/commands/flow-new.zh-CN.md +0 -39
  558. package/lib/compiler/__tests__/compile-regression.test.js +0 -103
  559. package/lib/compiler/__tests__/multi-module-emitters.test.js +0 -534
  560. package/lib/compiler/__tests__/resource-copier.test.js +0 -26
  561. package/lib/compiler/__tests__/skill-discovery.test.js +0 -72
  562. package/lib/compiler/context-expander.js +0 -179
  563. package/lib/compiler/rules-emitters/__tests__/codex-rules-emitter.test.js +0 -109
  564. package/lib/compiler/rules-emitters/codex-rules-emitter.js +0 -116
  565. package/lib/compiler/skill-discovery.js +0 -68
  566. package/lib/harness/CLAUDE.md +0 -22
  567. package/lib/harness/__tests__/planner.tdd.test.js +0 -125
  568. package/lib/harness/cli.js +0 -208
  569. package/lib/harness/index.js +0 -18
  570. package/lib/harness/operations/dispatch.js +0 -298
  571. package/lib/harness/operations/init.js +0 -48
  572. package/lib/harness/operations/pack.js +0 -100
  573. package/lib/harness/operations/plan.js +0 -83
  574. package/lib/harness/operations/release.js +0 -170
  575. package/lib/harness/operations/resume.js +0 -44
  576. package/lib/harness/operations/verify.js +0 -177
  577. package/lib/harness/planner.js +0 -272
  578. package/lib/harness/query.js +0 -126
  579. package/lib/harness/schemas.js +0 -129
@@ -1,756 +0,0 @@
1
- # Routing and Controllers - Best Practices
2
-
3
- Complete guide to clean route definitions and controller patterns.
4
-
5
- ## Table of Contents
6
-
7
- - [Routes: Routing Only](#routes-routing-only)
8
- - [BaseController Pattern](#basecontroller-pattern)
9
- - [Good Examples](#good-examples)
10
- - [Anti-Patterns](#anti-patterns)
11
- - [Refactoring Guide](#refactoring-guide)
12
- - [Error Handling](#error-handling)
13
- - [HTTP Status Codes](#http-status-codes)
14
-
15
- ---
16
-
17
- ## Routes: Routing Only
18
-
19
- ### The Golden Rule
20
-
21
- **Routes should ONLY:**
22
- - ✅ Define route paths
23
- - ✅ Register middleware
24
- - ✅ Delegate to controllers
25
-
26
- **Routes should NEVER:**
27
- - ❌ Contain business logic
28
- - ❌ Access database directly
29
- - ❌ Implement validation logic (use Zod + controller)
30
- - ❌ Format complex responses
31
- - ❌ Handle complex error scenarios
32
-
33
- ### Clean Route Pattern
34
-
35
- ```typescript
36
- // routes/userRoutes.ts
37
- import { Router } from 'express';
38
- import { UserController } from '../controllers/UserController';
39
- import { SSOMiddlewareClient } from '../middleware/SSOMiddleware';
40
- import { auditMiddleware } from '../middleware/auditMiddleware';
41
-
42
- const router = Router();
43
- const controller = new UserController();
44
-
45
- // ✅ CLEAN: Route definition only
46
- router.get('/:id',
47
- SSOMiddlewareClient.verifyLoginStatus,
48
- auditMiddleware,
49
- async (req, res) => controller.getUser(req, res)
50
- );
51
-
52
- router.post('/',
53
- SSOMiddlewareClient.verifyLoginStatus,
54
- auditMiddleware,
55
- async (req, res) => controller.createUser(req, res)
56
- );
57
-
58
- router.put('/:id',
59
- SSOMiddlewareClient.verifyLoginStatus,
60
- auditMiddleware,
61
- async (req, res) => controller.updateUser(req, res)
62
- );
63
-
64
- export default router;
65
- ```
66
-
67
- **Key Points:**
68
- - Each route: method, path, middleware chain, controller delegation
69
- - No try-catch needed (controller handles errors)
70
- - Clean, readable, maintainable
71
- - Easy to see all endpoints at a glance
72
-
73
- ---
74
-
75
- ## BaseController Pattern
76
-
77
- ### Why BaseController?
78
-
79
- **Benefits:**
80
- - Consistent error handling across all controllers
81
- - Automatic Sentry integration
82
- - Standardized response formats
83
- - Reusable helper methods
84
- - Performance tracking utilities
85
- - Logging and breadcrumb helpers
86
-
87
- ### BaseController Pattern (Template)
88
-
89
- **File:** `/email/src/controllers/BaseController.ts`
90
-
91
- ```typescript
92
- import * as Sentry from '@sentry/node';
93
- import { Response } from 'express';
94
-
95
- export abstract class BaseController {
96
- /**
97
- * Handle errors with Sentry integration
98
- */
99
- protected handleError(
100
- error: unknown,
101
- res: Response,
102
- context: string,
103
- statusCode = 500
104
- ): void {
105
- Sentry.withScope((scope) => {
106
- scope.setTag('controller', this.constructor.name);
107
- scope.setTag('operation', context);
108
- scope.setUser({ id: res.locals?.claims?.userId });
109
-
110
- if (error instanceof Error) {
111
- scope.setContext('error_details', {
112
- message: error.message,
113
- stack: error.stack,
114
- });
115
- }
116
-
117
- Sentry.captureException(error);
118
- });
119
-
120
- res.status(statusCode).json({
121
- success: false,
122
- error: {
123
- message: error instanceof Error ? error.message : 'An error occurred',
124
- code: statusCode,
125
- },
126
- });
127
- }
128
-
129
- /**
130
- * Handle success responses
131
- */
132
- protected handleSuccess<T>(
133
- res: Response,
134
- data: T,
135
- message?: string,
136
- statusCode = 200
137
- ): void {
138
- res.status(statusCode).json({
139
- success: true,
140
- message,
141
- data,
142
- });
143
- }
144
-
145
- /**
146
- * Performance tracking wrapper
147
- */
148
- protected async withTransaction<T>(
149
- name: string,
150
- operation: string,
151
- callback: () => Promise<T>
152
- ): Promise<T> {
153
- return await Sentry.startSpan(
154
- { name, op: operation },
155
- callback
156
- );
157
- }
158
-
159
- /**
160
- * Validate required fields
161
- */
162
- protected validateRequest(
163
- required: string[],
164
- actual: Record<string, any>,
165
- res: Response
166
- ): boolean {
167
- const missing = required.filter((field) => !actual[field]);
168
-
169
- if (missing.length > 0) {
170
- Sentry.captureMessage(
171
- `Missing required fields: ${missing.join(', ')}`,
172
- 'warning'
173
- );
174
-
175
- res.status(400).json({
176
- success: false,
177
- error: {
178
- message: 'Missing required fields',
179
- code: 'VALIDATION_ERROR',
180
- details: { missing },
181
- },
182
- });
183
- return false;
184
- }
185
- return true;
186
- }
187
-
188
- /**
189
- * Logging helpers
190
- */
191
- protected logInfo(message: string, context?: Record<string, any>): void {
192
- Sentry.addBreadcrumb({
193
- category: this.constructor.name,
194
- message,
195
- level: 'info',
196
- data: context,
197
- });
198
- }
199
-
200
- protected logWarning(message: string, context?: Record<string, any>): void {
201
- Sentry.captureMessage(message, {
202
- level: 'warning',
203
- tags: { controller: this.constructor.name },
204
- extra: context,
205
- });
206
- }
207
-
208
- /**
209
- * Add Sentry breadcrumb
210
- */
211
- protected addBreadcrumb(
212
- message: string,
213
- category: string,
214
- data?: Record<string, any>
215
- ): void {
216
- Sentry.addBreadcrumb({ message, category, level: 'info', data });
217
- }
218
-
219
- /**
220
- * Capture custom metric
221
- */
222
- protected captureMetric(name: string, value: number, unit: string): void {
223
- Sentry.metrics.gauge(name, value, { unit });
224
- }
225
- }
226
- ```
227
-
228
- ### Using BaseController
229
-
230
- ```typescript
231
- // controllers/UserController.ts
232
- import { Request, Response } from 'express';
233
- import { BaseController } from './BaseController';
234
- import { UserService } from '../services/userService';
235
- import { createUserSchema } from '../validators/userSchemas';
236
-
237
- export class UserController extends BaseController {
238
- private userService: UserService;
239
-
240
- constructor() {
241
- super();
242
- this.userService = new UserService();
243
- }
244
-
245
- async getUser(req: Request, res: Response): Promise<void> {
246
- try {
247
- this.addBreadcrumb('Fetching user', 'user_controller', { userId: req.params.id });
248
-
249
- const user = await this.userService.findById(req.params.id);
250
-
251
- if (!user) {
252
- return this.handleError(
253
- new Error('User not found'),
254
- res,
255
- 'getUser',
256
- 404
257
- );
258
- }
259
-
260
- this.handleSuccess(res, user);
261
- } catch (error) {
262
- this.handleError(error, res, 'getUser');
263
- }
264
- }
265
-
266
- async createUser(req: Request, res: Response): Promise<void> {
267
- try {
268
- // Validate input
269
- const validated = createUserSchema.parse(req.body);
270
-
271
- // Track performance
272
- const user = await this.withTransaction(
273
- 'user.create',
274
- 'db.query',
275
- () => this.userService.create(validated)
276
- );
277
-
278
- this.handleSuccess(res, user, 'User created successfully', 201);
279
- } catch (error) {
280
- this.handleError(error, res, 'createUser');
281
- }
282
- }
283
-
284
- async updateUser(req: Request, res: Response): Promise<void> {
285
- try {
286
- const validated = updateUserSchema.parse(req.body);
287
- const user = await this.userService.update(req.params.id, validated);
288
- this.handleSuccess(res, user, 'User updated');
289
- } catch (error) {
290
- this.handleError(error, res, 'updateUser');
291
- }
292
- }
293
- }
294
- ```
295
-
296
- **Benefits:**
297
- - Consistent error handling
298
- - Automatic Sentry integration
299
- - Performance tracking
300
- - Clean, readable code
301
- - Easy to test
302
-
303
- ---
304
-
305
- ## Good Examples
306
-
307
- ### Example 1: Email Notification Routes (Excellent ✅)
308
-
309
- **File:** `/email/src/routes/notificationRoutes.ts`
310
-
311
- ```typescript
312
- import { Router } from 'express';
313
- import { NotificationController } from '../controllers/NotificationController';
314
- import { SSOMiddlewareClient } from '../middleware/SSOMiddleware';
315
-
316
- const router = Router();
317
- const controller = new NotificationController();
318
-
319
- // ✅ EXCELLENT: Clean delegation
320
- router.get('/',
321
- SSOMiddlewareClient.verifyLoginStatus,
322
- async (req, res) => controller.getNotifications(req, res)
323
- );
324
-
325
- router.post('/',
326
- SSOMiddlewareClient.verifyLoginStatus,
327
- async (req, res) => controller.createNotification(req, res)
328
- );
329
-
330
- router.put('/:id/read',
331
- SSOMiddlewareClient.verifyLoginStatus,
332
- async (req, res) => controller.markAsRead(req, res)
333
- );
334
-
335
- export default router;
336
- ```
337
-
338
- **What Makes This Excellent:**
339
- - Zero business logic in routes
340
- - Clear middleware chain
341
- - Consistent pattern
342
- - Easy to understand
343
-
344
- ### Example 2: Proxy Routes with Validation (Good ✅)
345
-
346
- **File:** `/form/src/routes/proxyRoutes.ts`
347
-
348
- ```typescript
349
- import { z } from 'zod';
350
-
351
- const createProxySchema = z.object({
352
- originalUserID: z.string().min(1),
353
- proxyUserID: z.string().min(1),
354
- startsAt: z.string().datetime(),
355
- expiresAt: z.string().datetime(),
356
- });
357
-
358
- router.post('/',
359
- SSOMiddlewareClient.verifyLoginStatus,
360
- async (req, res) => {
361
- try {
362
- const validated = createProxySchema.parse(req.body);
363
- const proxy = await proxyService.createProxyRelationship(validated);
364
- res.status(201).json({ success: true, data: proxy });
365
- } catch (error) {
366
- handler.handleException(res, error);
367
- }
368
- }
369
- );
370
- ```
371
-
372
- **What Makes This Good:**
373
- - Zod validation
374
- - Delegates to service
375
- - Proper HTTP status codes
376
- - Error handling
377
-
378
- **Could Be Better:**
379
- - Move validation to controller
380
- - Use BaseController
381
-
382
- ---
383
-
384
- ## Anti-Patterns
385
-
386
- ### Anti-Pattern 1: Business Logic in Routes (Bad ❌)
387
-
388
- **File:** `/form/src/routes/responseRoutes.ts` (actual production code)
389
-
390
- ```typescript
391
- // ❌ ANTI-PATTERN: 200+ lines of business logic in route
392
- router.post('/:formID/submit', async (req: Request, res: Response) => {
393
- try {
394
- const username = res.locals.claims.preferred_username;
395
- const responses = req.body.responses;
396
- const stepInstanceId = req.body.stepInstanceId;
397
-
398
- // ❌ Permission checking in route
399
- const userId = await userProfileService.getProfileByEmail(username).then(p => p.id);
400
- const canComplete = await permissionService.canCompleteStep(userId, stepInstanceId);
401
- if (!canComplete) {
402
- return res.status(403).json({ error: 'No permission' });
403
- }
404
-
405
- // ❌ Workflow logic in route
406
- const { createWorkflowEngine, CompleteStepCommand } = require('../workflow/core/WorkflowEngineV3');
407
- const engine = await createWorkflowEngine();
408
- const command = new CompleteStepCommand(
409
- stepInstanceId,
410
- userId,
411
- responses,
412
- additionalContext
413
- );
414
- const events = await engine.executeCommand(command);
415
-
416
- // ❌ Impersonation handling in route
417
- if (res.locals.isImpersonating) {
418
- impersonationContextStore.storeContext(stepInstanceId, {
419
- originalUserId: res.locals.originalUserId,
420
- effectiveUserId: userId,
421
- });
422
- }
423
-
424
- // ❌ Response processing in route
425
- const post = await PrismaService.main.post.findUnique({
426
- where: { id: postData.id },
427
- include: { comments: true },
428
- });
429
-
430
- // ❌ Permission check in route
431
- await checkPostPermissions(post, userId);
432
-
433
- // ... 100+ more lines of business logic
434
-
435
- res.json({ success: true, data: result });
436
- } catch (e) {
437
- handler.handleException(res, e);
438
- }
439
- });
440
- ```
441
-
442
- **Why This Is Terrible:**
443
- - 200+ lines of business logic
444
- - Hard to test (requires HTTP mocking)
445
- - Hard to reuse (tied to route)
446
- - Mixed responsibilities
447
- - Difficult to debug
448
- - Performance tracking difficult
449
-
450
- ### How to Refactor (Step-by-Step)
451
-
452
- **Step 1: Create Controller**
453
-
454
- ```typescript
455
- // controllers/PostController.ts
456
- export class PostController extends BaseController {
457
- private postService: PostService;
458
-
459
- constructor() {
460
- super();
461
- this.postService = new PostService();
462
- }
463
-
464
- async createPost(req: Request, res: Response): Promise<void> {
465
- try {
466
- const validated = createPostSchema.parse({
467
- ...req.body,
468
- });
469
-
470
- const result = await this.postService.createPost(
471
- validated,
472
- res.locals.userId
473
- );
474
-
475
- this.handleSuccess(res, result, 'Post created successfully');
476
- } catch (error) {
477
- this.handleError(error, res, 'createPost');
478
- }
479
- }
480
- }
481
- ```
482
-
483
- **Step 2: Create Service**
484
-
485
- ```typescript
486
- // services/postService.ts
487
- export class PostService {
488
- async createPost(
489
- data: CreatePostDTO,
490
- userId: string
491
- ): Promise<PostResult> {
492
- // Permission check
493
- const canCreate = await permissionService.canCreatePost(userId);
494
- if (!canCreate) {
495
- throw new ForbiddenError('No permission to create post');
496
- }
497
-
498
- // Execute workflow
499
- const engine = await createWorkflowEngine();
500
- const command = new CompleteStepCommand(/* ... */);
501
- const events = await engine.executeCommand(command);
502
-
503
- // Handle impersonation if needed
504
- if (context.isImpersonating) {
505
- await this.handleImpersonation(data.stepInstanceId, context);
506
- }
507
-
508
- // Synchronize roles
509
- await this.synchronizeRoles(events, userId);
510
-
511
- return { events, success: true };
512
- }
513
-
514
- private async handleImpersonation(stepInstanceId: number, context: any) {
515
- impersonationContextStore.storeContext(stepInstanceId, {
516
- originalUserId: context.originalUserId,
517
- effectiveUserId: context.effectiveUserId,
518
- });
519
- }
520
-
521
- private async synchronizeRoles(events: WorkflowEvent[], userId: string) {
522
- // Role synchronization logic
523
- }
524
- }
525
- ```
526
-
527
- **Step 3: Update Route**
528
-
529
- ```typescript
530
- // routes/postRoutes.ts
531
- import { PostController } from '../controllers/PostController';
532
-
533
- const router = Router();
534
- const controller = new PostController();
535
-
536
- // ✅ CLEAN: Just routing
537
- router.post('/',
538
- SSOMiddlewareClient.verifyLoginStatus,
539
- auditMiddleware,
540
- async (req, res) => controller.createPost(req, res)
541
- );
542
- ```
543
-
544
- **Result:**
545
- - Route: 8 lines (was 200+)
546
- - Controller: 25 lines (request handling)
547
- - Service: 50 lines (business logic)
548
- - Testable, reusable, maintainable!
549
-
550
- ---
551
-
552
- ## Error Handling
553
-
554
- ### Controller Error Handling
555
-
556
- ```typescript
557
- async createUser(req: Request, res: Response): Promise<void> {
558
- try {
559
- const result = await this.userService.create(req.body);
560
- this.handleSuccess(res, result, 'User created', 201);
561
- } catch (error) {
562
- // BaseController.handleError automatically:
563
- // - Captures to Sentry with context
564
- // - Sets appropriate status code
565
- // - Returns formatted error response
566
- this.handleError(error, res, 'createUser');
567
- }
568
- }
569
- ```
570
-
571
- ### Custom Error Status Codes
572
-
573
- ```typescript
574
- async getUser(req: Request, res: Response): Promise<void> {
575
- try {
576
- const user = await this.userService.findById(req.params.id);
577
-
578
- if (!user) {
579
- // Custom 404 status
580
- return this.handleError(
581
- new Error('User not found'),
582
- res,
583
- 'getUser',
584
- 404 // Custom status code
585
- );
586
- }
587
-
588
- this.handleSuccess(res, user);
589
- } catch (error) {
590
- this.handleError(error, res, 'getUser');
591
- }
592
- }
593
- ```
594
-
595
- ### Validation Errors
596
-
597
- ```typescript
598
- async createUser(req: Request, res: Response): Promise<void> {
599
- try {
600
- const validated = createUserSchema.parse(req.body);
601
- const user = await this.userService.create(validated);
602
- this.handleSuccess(res, user, 'User created', 201);
603
- } catch (error) {
604
- // Zod errors get 400 status
605
- if (error instanceof z.ZodError) {
606
- return this.handleError(error, res, 'createUser', 400);
607
- }
608
- this.handleError(error, res, 'createUser');
609
- }
610
- }
611
- ```
612
-
613
- ---
614
-
615
- ## HTTP Status Codes
616
-
617
- ### Standard Codes
618
-
619
- | Code | Use Case | Example |
620
- |------|----------|---------|
621
- | 200 | Success (GET, PUT) | User retrieved, Updated |
622
- | 201 | Created (POST) | User created |
623
- | 204 | No Content (DELETE) | User deleted |
624
- | 400 | Bad Request | Invalid input data |
625
- | 401 | Unauthorized | Not authenticated |
626
- | 403 | Forbidden | No permission |
627
- | 404 | Not Found | Resource doesn't exist |
628
- | 409 | Conflict | Duplicate resource |
629
- | 422 | Unprocessable Entity | Validation failed |
630
- | 500 | Internal Server Error | Unexpected error |
631
-
632
- ### Usage Examples
633
-
634
- ```typescript
635
- // 200 - Success (default)
636
- this.handleSuccess(res, user);
637
-
638
- // 201 - Created
639
- this.handleSuccess(res, user, 'Created', 201);
640
-
641
- // 400 - Bad Request
642
- this.handleError(error, res, 'operation', 400);
643
-
644
- // 404 - Not Found
645
- this.handleError(new Error('Not found'), res, 'operation', 404);
646
-
647
- // 403 - Forbidden
648
- this.handleError(new ForbiddenError('No permission'), res, 'operation', 403);
649
- ```
650
-
651
- ---
652
-
653
- ## Refactoring Guide
654
-
655
- ### Identify Routes Needing Refactoring
656
-
657
- **Red Flags:**
658
- - Route file > 100 lines
659
- - Multiple try-catch blocks in one route
660
- - Direct database access (Prisma calls)
661
- - Complex business logic (if statements, loops)
662
- - Permission checks in routes
663
-
664
- **Check your routes:**
665
- ```bash
666
- # Find large route files
667
- wc -l form/src/routes/*.ts | sort -n
668
-
669
- # Find routes with Prisma usage
670
- grep -r "PrismaService" form/src/routes/
671
- ```
672
-
673
- ### Refactoring Process
674
-
675
- **1. Extract to Controller:**
676
- ```typescript
677
- // Before: Route with logic
678
- router.post('/action', async (req, res) => {
679
- try {
680
- // 50 lines of logic
681
- } catch (e) {
682
- handler.handleException(res, e);
683
- }
684
- });
685
-
686
- // After: Clean route
687
- router.post('/action', (req, res) => controller.performAction(req, res));
688
-
689
- // New controller method
690
- async performAction(req: Request, res: Response): Promise<void> {
691
- try {
692
- const result = await this.service.performAction(req.body);
693
- this.handleSuccess(res, result);
694
- } catch (error) {
695
- this.handleError(error, res, 'performAction');
696
- }
697
- }
698
- ```
699
-
700
- **2. Extract to Service:**
701
- ```typescript
702
- // Controller stays thin
703
- async performAction(req: Request, res: Response): Promise<void> {
704
- try {
705
- const validated = actionSchema.parse(req.body);
706
- const result = await this.actionService.execute(validated);
707
- this.handleSuccess(res, result);
708
- } catch (error) {
709
- this.handleError(error, res, 'performAction');
710
- }
711
- }
712
-
713
- // Service contains business logic
714
- export class ActionService {
715
- async execute(data: ActionDTO): Promise<Result> {
716
- // All business logic here
717
- // Permission checks
718
- // Database operations
719
- // Complex transformations
720
- return result;
721
- }
722
- }
723
- ```
724
-
725
- **3. Add Repository (if needed):**
726
- ```typescript
727
- // Service calls repository
728
- export class ActionService {
729
- constructor(private actionRepository: ActionRepository) {}
730
-
731
- async execute(data: ActionDTO): Promise<Result> {
732
- // Business logic
733
- const entity = await this.actionRepository.findById(data.id);
734
- // More logic
735
- return await this.actionRepository.update(data.id, changes);
736
- }
737
- }
738
-
739
- // Repository handles data access
740
- export class ActionRepository {
741
- async findById(id: number): Promise<Entity | null> {
742
- return PrismaService.main.entity.findUnique({ where: { id } });
743
- }
744
-
745
- async update(id: number, data: Partial<Entity>): Promise<Entity> {
746
- return PrismaService.main.entity.update({ where: { id }, data });
747
- }
748
- }
749
- ```
750
-
751
- ---
752
-
753
- **Related Files:**
754
- - [SKILL.md](SKILL.md) - Main guide
755
- - [services-and-repositories.md](services-and-repositories.md) - Service layer details
756
- - [complete-examples.md](complete-examples.md) - Full refactoring examples