specweave 0.1.9 → 0.3.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 (293) hide show
  1. package/CLAUDE.md +600 -0
  2. package/README.md +245 -81
  3. package/bin/install-all.sh +1 -1
  4. package/bin/install-commands.sh +3 -3
  5. package/bin/specweave.js +39 -9
  6. package/dist/adapters/adapter-base.d.ts +1 -1
  7. package/dist/adapters/adapter-base.d.ts.map +1 -1
  8. package/dist/adapters/adapter-base.js +6 -41
  9. package/dist/adapters/adapter-base.js.map +1 -1
  10. package/dist/adapters/adapter-interface.js +1 -2
  11. package/dist/adapters/adapter-interface.js.map +1 -1
  12. package/dist/adapters/adapter-loader.d.ts +86 -0
  13. package/dist/adapters/adapter-loader.d.ts.map +1 -0
  14. package/dist/adapters/adapter-loader.js +216 -0
  15. package/dist/adapters/adapter-loader.js.map +1 -0
  16. package/dist/adapters/agents-md-generator.d.ts +48 -0
  17. package/dist/adapters/agents-md-generator.d.ts.map +1 -0
  18. package/dist/adapters/agents-md-generator.js +132 -0
  19. package/dist/adapters/agents-md-generator.js.map +1 -0
  20. package/dist/adapters/claude/adapter.d.ts +2 -2
  21. package/dist/adapters/claude/adapter.d.ts.map +1 -1
  22. package/dist/adapters/claude/adapter.js +5 -42
  23. package/dist/adapters/claude/adapter.js.map +1 -1
  24. package/dist/adapters/claude-md-generator.d.ts +78 -0
  25. package/dist/adapters/claude-md-generator.d.ts.map +1 -0
  26. package/dist/adapters/claude-md-generator.js +246 -0
  27. package/dist/adapters/claude-md-generator.js.map +1 -0
  28. package/dist/adapters/codex/adapter.d.ts +50 -0
  29. package/dist/adapters/codex/adapter.d.ts.map +1 -0
  30. package/dist/adapters/codex/adapter.js +316 -0
  31. package/dist/adapters/codex/adapter.js.map +1 -0
  32. package/dist/adapters/copilot/adapter.d.ts +10 -9
  33. package/dist/adapters/copilot/adapter.d.ts.map +1 -1
  34. package/dist/adapters/copilot/adapter.js +35 -100
  35. package/dist/adapters/copilot/adapter.js.map +1 -1
  36. package/dist/adapters/cursor/adapter.d.ts +8 -6
  37. package/dist/adapters/cursor/adapter.d.ts.map +1 -1
  38. package/dist/adapters/cursor/adapter.js +47 -130
  39. package/dist/adapters/cursor/adapter.js.map +1 -1
  40. package/dist/adapters/doc-generator.d.ts +69 -0
  41. package/dist/adapters/doc-generator.d.ts.map +1 -0
  42. package/dist/adapters/doc-generator.js +247 -0
  43. package/dist/adapters/doc-generator.js.map +1 -0
  44. package/dist/adapters/gemini/adapter.d.ts +50 -0
  45. package/dist/adapters/gemini/adapter.d.ts.map +1 -0
  46. package/dist/adapters/gemini/adapter.js +281 -0
  47. package/dist/adapters/gemini/adapter.js.map +1 -0
  48. package/dist/adapters/generic/adapter.d.ts +7 -4
  49. package/dist/adapters/generic/adapter.d.ts.map +1 -1
  50. package/dist/adapters/generic/adapter.js +60 -59
  51. package/dist/adapters/generic/adapter.js.map +1 -1
  52. package/dist/cli/commands/init.d.ts +3 -1
  53. package/dist/cli/commands/init.d.ts.map +1 -1
  54. package/dist/cli/commands/init.js +272 -170
  55. package/dist/cli/commands/init.js.map +1 -1
  56. package/dist/cli/commands/install.d.ts.map +1 -1
  57. package/dist/cli/commands/install.js +22 -58
  58. package/dist/cli/commands/install.js.map +1 -1
  59. package/dist/cli/commands/list.d.ts.map +1 -1
  60. package/dist/cli/commands/list.js +27 -64
  61. package/dist/cli/commands/list.js.map +1 -1
  62. package/dist/core/credentials-manager.d.ts +90 -0
  63. package/dist/core/credentials-manager.d.ts.map +1 -0
  64. package/dist/core/credentials-manager.js +271 -0
  65. package/dist/core/credentials-manager.js.map +1 -0
  66. package/dist/core/project-structure-detector.d.ts +92 -0
  67. package/dist/core/project-structure-detector.d.ts.map +1 -0
  68. package/dist/core/project-structure-detector.js +289 -0
  69. package/dist/core/project-structure-detector.js.map +1 -0
  70. package/dist/core/rfc-generator-v2.d.ts +149 -0
  71. package/dist/core/rfc-generator-v2.d.ts.map +1 -0
  72. package/dist/core/rfc-generator-v2.js +399 -0
  73. package/dist/core/rfc-generator-v2.js.map +1 -0
  74. package/dist/core/rfc-generator.d.ts +147 -0
  75. package/dist/core/rfc-generator.d.ts.map +1 -0
  76. package/dist/core/rfc-generator.js +434 -0
  77. package/dist/core/rfc-generator.js.map +1 -0
  78. package/dist/integrations/ado/ado-client.d.ts +123 -0
  79. package/dist/integrations/ado/ado-client.d.ts.map +1 -0
  80. package/dist/integrations/ado/ado-client.js +398 -0
  81. package/dist/integrations/ado/ado-client.js.map +1 -0
  82. package/dist/integrations/jira/jira-client.d.ts +139 -0
  83. package/dist/integrations/jira/jira-client.d.ts.map +1 -0
  84. package/dist/integrations/jira/jira-client.js +386 -0
  85. package/dist/integrations/jira/jira-client.js.map +1 -0
  86. package/dist/integrations/jira/jira-incremental-mapper.d.ts +75 -0
  87. package/dist/integrations/jira/jira-incremental-mapper.d.ts.map +1 -0
  88. package/dist/integrations/jira/jira-incremental-mapper.js +474 -0
  89. package/dist/integrations/jira/jira-incremental-mapper.js.map +1 -0
  90. package/dist/integrations/jira/jira-mapper.d.ts +105 -0
  91. package/dist/integrations/jira/jira-mapper.d.ts.map +1 -0
  92. package/dist/integrations/jira/jira-mapper.js +494 -0
  93. package/dist/integrations/jira/jira-mapper.js.map +1 -0
  94. package/dist/testing/test-generator.d.ts +117 -0
  95. package/dist/testing/test-generator.d.ts.map +1 -0
  96. package/dist/testing/test-generator.js +370 -0
  97. package/dist/testing/test-generator.js.map +1 -0
  98. package/dist/utils/auto-install.d.ts +3 -0
  99. package/dist/utils/auto-install.d.ts.map +1 -1
  100. package/dist/utils/auto-install.js +16 -82
  101. package/dist/utils/auto-install.js.map +1 -1
  102. package/dist/utils/esm-helpers.d.ts +50 -0
  103. package/dist/utils/esm-helpers.d.ts.map +1 -0
  104. package/dist/utils/esm-helpers.js +57 -0
  105. package/dist/utils/esm-helpers.js.map +1 -0
  106. package/package.json +16 -7
  107. package/src/adapters/README.md +1 -2
  108. package/src/adapters/adapter-base.ts +6 -3
  109. package/src/adapters/adapter-loader.ts +261 -0
  110. package/src/adapters/agents-md-generator.ts +162 -0
  111. package/src/adapters/claude/README.md +6 -14
  112. package/src/adapters/claude/adapter.ts +4 -4
  113. package/src/adapters/claude-md-generator.ts +311 -0
  114. package/src/adapters/codex/README.md +105 -0
  115. package/src/adapters/codex/adapter.ts +333 -0
  116. package/src/adapters/copilot/adapter.ts +36 -65
  117. package/src/adapters/cursor/README.md +0 -2
  118. package/src/adapters/cursor/adapter.ts +46 -92
  119. package/src/adapters/doc-generator.ts +331 -0
  120. package/src/adapters/gemini/README.md +97 -0
  121. package/src/adapters/gemini/adapter.ts +298 -0
  122. package/src/adapters/generic/adapter.ts +61 -57
  123. package/src/adapters/registry.yaml +86 -25
  124. package/src/agents/devops/AGENT.md +16 -18
  125. package/src/agents/docs-writer/AGENT.md +2 -2
  126. package/src/agents/pm/AGENT.md +1 -50
  127. package/src/commands/README.md +134 -111
  128. package/src/commands/{build.md → specweave.do.md} +141 -69
  129. package/src/commands/{done.md → specweave.done.md} +3 -3
  130. package/src/commands/{inc.md → specweave.inc.md} +4 -4
  131. package/src/commands/{increment.md → specweave.increment.md} +143 -76
  132. package/src/commands/specweave.md +430 -0
  133. package/src/commands/specweave.next.md +495 -0
  134. package/src/commands/{progress.md → specweave.progress.md} +12 -12
  135. package/src/commands/specweave.sync-docs.md +665 -0
  136. package/src/commands/specweave.sync-github.md +269 -0
  137. package/src/commands/specweave.sync-jira.md +197 -0
  138. package/src/commands/{validate.md → specweave.validate.md} +4 -4
  139. package/src/hooks/README.md +19 -29
  140. package/src/hooks/post-task-completion.sh +25 -30
  141. package/src/skills/ado-sync/README.md +1 -36
  142. package/src/skills/bmad-method-expert/SKILL.md +1 -3
  143. package/src/skills/brownfield-analyzer/SKILL.md +429 -23
  144. package/src/skills/brownfield-onboarder/SKILL.md +221 -8
  145. package/src/skills/context-loader/SKILL.md +239 -617
  146. package/src/skills/context-optimizer/SKILL.md +0 -30
  147. package/src/skills/github-sync/SKILL.md +1 -19
  148. package/src/skills/increment-planner/SKILL.md +64 -18
  149. package/src/skills/increment-quality-judge/SKILL.md +1 -36
  150. package/src/skills/jira-sync/README.md +1 -38
  151. package/src/skills/role-orchestrator/README.md +1 -22
  152. package/src/skills/role-orchestrator/SKILL.md +1 -59
  153. package/src/skills/skill-router/SKILL.md +0 -18
  154. package/src/skills/spec-kit-expert/SKILL.md +1 -3
  155. package/src/skills/specweave-detector/SKILL.md +225 -275
  156. package/src/skills/task-builder/README.md +1 -7
  157. package/src/templates/AGENTS.md.template +334 -0
  158. package/src/templates/CLAUDE.md.template +131 -298
  159. package/src/templates/README.md.template +115 -23
  160. package/src/templates/environments/minimal/README.md +0 -1
  161. package/INSTALL.md +0 -848
  162. package/SPECWEAVE.md +0 -743
  163. package/src/adapters/copilot/.github/copilot/instructions.md +0 -376
  164. package/src/adapters/cursor/.cursorrules +0 -325
  165. package/src/adapters/generic/SPECWEAVE-MANUAL.md +0 -676
  166. package/src/commands/create-project.md +0 -528
  167. package/src/commands/generate-docs.md +0 -623
  168. package/src/commands/review-docs.md +0 -331
  169. package/src/commands/sync-github.md +0 -115
  170. package/src/skills/ado-sync/test-cases/test-1.yaml +0 -9
  171. package/src/skills/ado-sync/test-cases/test-2.yaml +0 -8
  172. package/src/skills/ado-sync/test-cases/test-3.yaml +0 -9
  173. package/src/skills/bmad-method-expert/test-cases/test-1-placeholder.yaml +0 -12
  174. package/src/skills/bmad-method-expert/test-cases/test-2-placeholder.yaml +0 -12
  175. package/src/skills/bmad-method-expert/test-cases/test-3-placeholder.yaml +0 -12
  176. package/src/skills/brownfield-analyzer/test-cases/test-1-basic-analysis.yaml +0 -48
  177. package/src/skills/brownfield-analyzer/test-cases/test-2-placeholder.yaml +0 -12
  178. package/src/skills/brownfield-analyzer/test-cases/test-3-placeholder.yaml +0 -12
  179. package/src/skills/brownfield-onboarder/test-cases/test-1-placeholder.yaml +0 -12
  180. package/src/skills/brownfield-onboarder/test-cases/test-2-placeholder.yaml +0 -12
  181. package/src/skills/brownfield-onboarder/test-cases/test-3-placeholder.yaml +0 -12
  182. package/src/skills/calendar-system/test-cases/test-1-placeholder.yaml +0 -12
  183. package/src/skills/calendar-system/test-cases/test-2-placeholder.yaml +0 -12
  184. package/src/skills/calendar-system/test-cases/test-3-placeholder.yaml +0 -12
  185. package/src/skills/context-loader/test-cases/test-1-basic-loading.yaml +0 -39
  186. package/src/skills/context-loader/test-cases/test-2-token-budget-exceeded.yaml +0 -44
  187. package/src/skills/context-loader/test-cases/test-3-section-anchors.yaml +0 -45
  188. package/src/skills/context-optimizer/test-cases/test-1-bug-fix-narrow.yaml +0 -97
  189. package/src/skills/context-optimizer/test-cases/test-2-feature-focused.yaml +0 -109
  190. package/src/skills/context-optimizer/test-cases/test-3-architecture-broad.yaml +0 -98
  191. package/src/skills/cost-optimizer/test-cases/test-1-basic-comparison.yaml +0 -75
  192. package/src/skills/cost-optimizer/test-cases/test-2-budget-constraint.yaml +0 -52
  193. package/src/skills/cost-optimizer/test-cases/test-3-scale-requirement.yaml +0 -63
  194. package/src/skills/cost-optimizer/test-results/README.md +0 -46
  195. package/src/skills/design-system-architect/test-cases/test-1-token-structure.yaml +0 -23
  196. package/src/skills/design-system-architect/test-cases/test-2-component-hierarchy.yaml +0 -24
  197. package/src/skills/design-system-architect/test-cases/test-3-accessibility-checklist.yaml +0 -23
  198. package/src/skills/diagrams-architect/test-cases/test-1-c4-context.yaml +0 -13
  199. package/src/skills/diagrams-architect/test-cases/test-2-sequence-diagram.yaml +0 -13
  200. package/src/skills/diagrams-architect/test-cases/test-3-er-diagram.yaml +0 -13
  201. package/src/skills/diagrams-generator/test-cases/test-1.yaml +0 -9
  202. package/src/skills/diagrams-generator/test-cases/test-2.yaml +0 -9
  203. package/src/skills/diagrams-generator/test-cases/test-3.yaml +0 -8
  204. package/src/skills/docs-updater/test-cases/test-1-placeholder.yaml +0 -12
  205. package/src/skills/docs-updater/test-cases/test-2-placeholder.yaml +0 -12
  206. package/src/skills/docs-updater/test-cases/test-3-placeholder.yaml +0 -12
  207. package/src/skills/dotnet-backend/test-cases/test-1-rest-api.yaml +0 -14
  208. package/src/skills/dotnet-backend/test-cases/test-2-authentication.yaml +0 -13
  209. package/src/skills/dotnet-backend/test-cases/test-3-minimal-api.yaml +0 -13
  210. package/src/skills/e2e-playwright/test-cases/TC-001-basic-navigation.yaml +0 -54
  211. package/src/skills/e2e-playwright/test-cases/TC-002-form-interaction.yaml +0 -64
  212. package/src/skills/e2e-playwright/test-cases/TC-003-specweave-integration.yaml +0 -74
  213. package/src/skills/e2e-playwright/test-cases/TC-004-accessibility-check.yaml +0 -98
  214. package/src/skills/figma-designer/test-cases/test-1-design-system.yaml +0 -13
  215. package/src/skills/figma-designer/test-cases/test-2-component-library.yaml +0 -13
  216. package/src/skills/figma-designer/test-cases/test-3-responsive-layout.yaml +0 -13
  217. package/src/skills/figma-implementer/test-cases/test-1-design-to-react.yaml +0 -13
  218. package/src/skills/figma-implementer/test-cases/test-2-storybook.yaml +0 -13
  219. package/src/skills/figma-implementer/test-cases/test-3-design-tokens.yaml +0 -13
  220. package/src/skills/figma-mcp-connector/test-cases/test-1-read-file-desktop.yaml +0 -22
  221. package/src/skills/figma-mcp-connector/test-cases/test-2-read-file-framelink.yaml +0 -21
  222. package/src/skills/figma-mcp-connector/test-cases/test-3-error-handling.yaml +0 -18
  223. package/src/skills/figma-to-code/test-cases/test-1-token-generation.yaml +0 -29
  224. package/src/skills/figma-to-code/test-cases/test-2-component-generation.yaml +0 -27
  225. package/src/skills/figma-to-code/test-cases/test-3-typescript-generation.yaml +0 -28
  226. package/src/skills/frontend/test-cases/test-1-react-component.yaml +0 -13
  227. package/src/skills/frontend/test-cases/test-2-form-validation.yaml +0 -13
  228. package/src/skills/frontend/test-cases/test-3-state-management.yaml +0 -13
  229. package/src/skills/github-sync/test-cases/test-1-placeholder.yaml +0 -12
  230. package/src/skills/github-sync/test-cases/test-2-placeholder.yaml +0 -12
  231. package/src/skills/github-sync/test-cases/test-3-placeholder.yaml +0 -12
  232. package/src/skills/hetzner-provisioner/test-cases/test-1-basic-provision.yaml +0 -71
  233. package/src/skills/hetzner-provisioner/test-cases/test-2-postgres-provision.yaml +0 -85
  234. package/src/skills/hetzner-provisioner/test-cases/test-3-ssl-config.yaml +0 -126
  235. package/src/skills/hetzner-provisioner/test-results/README.md +0 -259
  236. package/src/skills/increment-planner/test-cases/test-1-basic-feature.yaml +0 -27
  237. package/src/skills/increment-planner/test-cases/test-2-complex-feature.yaml +0 -30
  238. package/src/skills/increment-planner/test-cases/test-3-auto-numbering.yaml +0 -24
  239. package/src/skills/increment-quality-judge/test-cases/test-1-good-spec.yaml +0 -95
  240. package/src/skills/increment-quality-judge/test-cases/test-2-poor-spec.yaml +0 -108
  241. package/src/skills/increment-quality-judge/test-cases/test-3-export-suggestions.yaml +0 -87
  242. package/src/skills/jira-sync/test-cases/test-1.yaml +0 -9
  243. package/src/skills/jira-sync/test-cases/test-2.yaml +0 -9
  244. package/src/skills/jira-sync/test-cases/test-3.yaml +0 -10
  245. package/src/skills/nextjs/test-cases/test-1-app-router.yaml +0 -13
  246. package/src/skills/nextjs/test-cases/test-2-server-actions.yaml +0 -13
  247. package/src/skills/nextjs/test-cases/test-3-api-routes.yaml +0 -13
  248. package/src/skills/nodejs-backend/test-cases/test-1-express-api.yaml +0 -13
  249. package/src/skills/nodejs-backend/test-cases/test-2-prisma-orm.yaml +0 -13
  250. package/src/skills/nodejs-backend/test-cases/test-3-authentication.yaml +0 -13
  251. package/src/skills/notification-system/test-cases/test-1-placeholder.yaml +0 -12
  252. package/src/skills/notification-system/test-cases/test-2-placeholder.yaml +0 -12
  253. package/src/skills/notification-system/test-cases/test-3-placeholder.yaml +0 -12
  254. package/src/skills/python-backend/test-cases/test-1-fastapi-crud.yaml +0 -13
  255. package/src/skills/python-backend/test-cases/test-2-sqlalchemy.yaml +0 -13
  256. package/src/skills/python-backend/test-cases/test-3-authentication.yaml +0 -13
  257. package/src/skills/role-orchestrator/test-cases/test-1-simple-product.yaml +0 -98
  258. package/src/skills/role-orchestrator/test-cases/test-2-quality-gate-failure.yaml +0 -73
  259. package/src/skills/role-orchestrator/test-cases/test-3-security-workflow.yaml +0 -121
  260. package/src/skills/role-orchestrator/test-cases/test-4-parallel-execution.yaml +0 -145
  261. package/src/skills/role-orchestrator/test-cases/test-5-feedback-loops.yaml +0 -149
  262. package/src/skills/skill-creator/test-cases/test-1-placeholder.yaml +0 -12
  263. package/src/skills/skill-creator/test-cases/test-2-placeholder.yaml +0 -12
  264. package/src/skills/skill-creator/test-cases/test-3-placeholder.yaml +0 -12
  265. package/src/skills/skill-router/test-cases/test-1-basic-routing.yaml +0 -33
  266. package/src/skills/skill-router/test-cases/test-2-ambiguous-request.yaml +0 -42
  267. package/src/skills/skill-router/test-cases/test-3-nested-orchestration.yaml +0 -50
  268. package/src/skills/spec-driven-brainstorming/test-cases/TC-001-simple-idea-to-design.yaml +0 -148
  269. package/src/skills/spec-driven-brainstorming/test-cases/TC-002-complex-ultrathink-design.yaml +0 -190
  270. package/src/skills/spec-driven-brainstorming/test-cases/TC-003-unclear-requirements-socratic.yaml +0 -233
  271. package/src/skills/spec-driven-debugging/test-cases/TC-001-simple-auth-bug.yaml +0 -212
  272. package/src/skills/spec-driven-debugging/test-cases/TC-002-race-condition-ultrathink.yaml +0 -461
  273. package/src/skills/spec-driven-debugging/test-cases/TC-003-brownfield-missing-spec.yaml +0 -366
  274. package/src/skills/spec-kit-expert/test-cases/test-1-placeholder.yaml +0 -12
  275. package/src/skills/spec-kit-expert/test-cases/test-2-placeholder.yaml +0 -12
  276. package/src/skills/spec-kit-expert/test-cases/test-3-placeholder.yaml +0 -12
  277. package/src/skills/specweave-ado-mapper/test-cases/test-1-export-to-ado.yaml +0 -13
  278. package/src/skills/specweave-ado-mapper/test-cases/test-2-import-from-ado.yaml +0 -13
  279. package/src/skills/specweave-ado-mapper/test-cases/test-3-bidirectional-sync.yaml +0 -13
  280. package/src/skills/specweave-detector/test-cases/test-1-basic-detection.yaml +0 -37
  281. package/src/skills/specweave-detector/test-cases/test-2-missing-config.yaml +0 -37
  282. package/src/skills/specweave-detector/test-cases/test-3-non-specweave-project.yaml +0 -34
  283. package/src/skills/specweave-jira-mapper/test-cases/test-1-export-to-jira.yaml +0 -13
  284. package/src/skills/specweave-jira-mapper/test-cases/test-2-import-from-jira.yaml +0 -13
  285. package/src/skills/specweave-jira-mapper/test-cases/test-3-sync-status.yaml +0 -13
  286. package/src/skills/stripe-integrator/test-cases/test-1-placeholder.yaml +0 -12
  287. package/src/skills/stripe-integrator/test-cases/test-2-placeholder.yaml +0 -12
  288. package/src/skills/stripe-integrator/test-cases/test-3-placeholder.yaml +0 -12
  289. package/src/skills/task-builder/test-cases/test-1-placeholder.yaml +0 -12
  290. package/src/skills/task-builder/test-cases/test-2-placeholder.yaml +0 -12
  291. package/src/skills/task-builder/test-cases/test-3-placeholder.yaml +0 -12
  292. package/src/templates/config.yaml +0 -351
  293. /package/src/commands/{list-increments.md → specweave.list-increments.md} +0 -0
@@ -1,366 +0,0 @@
1
- ---
2
- name: "Brownfield Bug with Missing Spec"
3
- description: "Debug legacy code with no documentation, requiring retroactive spec creation before fixing"
4
- skill: spec-driven-debugging
5
- priority: P2
6
- estimated_time: "30-40 minutes"
7
-
8
- input:
9
- prompt: "Payment webhook is randomly failing with 'Invalid signature' error for some Stripe events"
10
- context:
11
- project_type: "Node.js + Express (brownfield, 2 years old)"
12
- increment: null # No increment exists for this code
13
- documentation: null # No spec.md or plan.md
14
- files_exist:
15
- - "src/webhooks/stripe.ts" # legacy code, no comments
16
- - "src/services/payment-processor.ts"
17
- error_pattern: "Intermittent - fails for ~20% of webhook events"
18
- reproduction: "Inconsistent - seems related to event type"
19
- legacy_context: "Original developer left, no documentation"
20
-
21
- expected_output:
22
- phase_0_context_loading:
23
- announcement: "This is brownfield code with no SpecWeave increment. I'll need to create retroactive documentation before debugging."
24
-
25
- increment_search:
26
- search_result: "No increment found for src/webhooks/stripe.ts"
27
- strategy_docs: "No strategy docs for payment/webhooks"
28
- architecture_docs: "No ADRs for webhook processing"
29
-
30
- bug_classification: "Missing spec - undocumented legacy code"
31
-
32
- retroactive_spec_needed: true
33
- reason: "Cannot debug without understanding intended behavior"
34
-
35
- approach: |
36
- 1. Analyze code to understand CURRENT behavior (as-is)
37
- 2. Create retroactive spec documenting intended behavior
38
- 3. THEN debug the discrepancy between spec and actual behavior
39
-
40
- phase_1_root_cause:
41
- step_1_understand_current_code:
42
- file_analyzed: "src/webhooks/stripe.ts"
43
- code_structure:
44
- - "POST /webhooks/stripe endpoint"
45
- - "Validates Stripe signature using stripe.webhooks.constructEvent()"
46
- - "Routes different event types to handlers"
47
- - "Event types: payment_intent.succeeded, charge.failed, customer.subscription.updated"
48
-
49
- observations:
50
- - "No comments or documentation"
51
- - "Signature validation uses Stripe SDK method"
52
- - "Different event types handled differently"
53
- - "Some events logged, others not"
54
- - "No tests found in codebase"
55
-
56
- step_2_gather_business_context:
57
- questions_to_ask_user:
58
- - "What SHOULD happen when a payment webhook is received?"
59
- - "Which event types are critical vs informational?"
60
- - "What's the acceptable failure rate?"
61
-
62
- user_answers:
63
- - "All webhook events should be processed successfully"
64
- - "payment_intent.succeeded is critical (confirms payment)"
65
- - "charge.failed is critical (notifies user of failure)"
66
- - "customer.subscription.updated is informational only"
67
- - "Failure rate should be 0% (currently 20% failing)"
68
-
69
- step_3_create_retroactive_spec:
70
- action: "Create .specweave/increments/0012-webhook-processing/ with retroactive spec"
71
- file: ".specweave/increments/0012-webhook-processing/spec.md"
72
- content: |
73
- # Webhook Processing (Retroactive Spec)
74
-
75
- ## Purpose
76
- Process Stripe webhook events to confirm payments and update order status.
77
-
78
- ## Functional Requirements
79
-
80
- ### FR-001: Signature Validation
81
- All webhook events MUST validate Stripe signature to prevent spoofing.
82
- - Use Stripe SDK: stripe.webhooks.constructEvent()
83
- - Signature header: stripe-signature
84
- - Webhook secret: STRIPE_WEBHOOK_SECRET env var
85
-
86
- ### FR-002: Event Type Handling
87
- System MUST handle these event types:
88
- - payment_intent.succeeded → Mark order as paid
89
- - charge.failed → Notify customer of payment failure
90
- - customer.subscription.updated → Update subscription status
91
-
92
- ### FR-003: Idempotency
93
- Webhooks MAY be delivered multiple times (Stripe guarantee: at-least-once).
94
- System MUST handle duplicate events gracefully (idempotency).
95
-
96
- ## Non-Functional Requirements
97
-
98
- ### NFR-001: Reliability
99
- Success rate MUST be >99.9% (currently failing: need to fix)
100
-
101
- ### NFR-002: Response Time
102
- Webhook endpoint MUST respond within 5 seconds (Stripe timeout)
103
-
104
- ## Acceptance Criteria
105
- - TC-001: Valid webhook with correct signature → 200 OK
106
- - TC-002: Invalid signature → 400 Bad Request
107
- - TC-003: Duplicate event → Processed once, returns 200 OK
108
- - TC-004: All critical event types processed correctly
109
-
110
- retroactive_spec_created: true
111
-
112
- step_4_now_debug_with_spec:
113
- error_analysis:
114
- message: "Invalid signature"
115
- frequency: "20% of events"
116
- pattern_observed: "Fails for customer.subscription.updated events mostly"
117
-
118
- reproduction:
119
- approach: "Examine Stripe webhook logs for failed events"
120
- findings:
121
- - "Failed events all have event type: customer.subscription.*"
122
- - "Successful events are payment_intent.* and charge.*"
123
- - "Signature validation fails BEFORE event type check"
124
-
125
- spec_comparison:
126
- spec_says: "FR-001: All events must validate signature using stripe.webhooks.constructEvent()"
127
- actual_behavior: "customer.subscription.* events fail signature validation"
128
- discrepancy: "Signature validation works for some events, not others"
129
-
130
- data_flow_trace:
131
- step_1: "Stripe sends POST to /webhooks/stripe"
132
- step_2: "Express receives raw body"
133
- step_3: "Code calls stripe.webhooks.constructEvent(body, signature, secret)"
134
- step_4_success: "payment_intent.* events → signature valid ✓"
135
- step_4_failure: "customer.subscription.* events → signature invalid ✗"
136
-
137
- hypothesis_forming: "Something different about how subscription events are sent or received"
138
-
139
- phase_2_pattern_analysis:
140
- working_examples:
141
- event_type: "payment_intent.succeeded"
142
- body_format: "Raw JSON string"
143
- content_type: "application/json"
144
- signature_valid: true
145
-
146
- broken_examples:
147
- event_type: "customer.subscription.updated"
148
- body_format: "Parsed JSON object (not raw string!)"
149
- content_type: "application/json"
150
- signature_valid: false
151
-
152
- difference_identified:
153
- issue: "Body parsing middleware is parsing SOME events but not others"
154
- root_cause: "Express body parser middleware conditionally parsing based on Content-Type or event size"
155
-
156
- code_inspection:
157
- file: "src/server.ts"
158
- middleware_config: |
159
- app.use(express.json()); // Parses all JSON bodies
160
- app.post('/webhooks/stripe', stripeWebhookHandler);
161
-
162
- problem: |
163
- Stripe signature validation requires RAW body (Buffer), not parsed JSON.
164
- Express middleware is parsing body BEFORE webhook handler,
165
- making signature validation impossible.
166
-
167
- But why does it work for payment_intent.* events?
168
- Hypothesis: Those events are smaller, parsed differently by Express?
169
-
170
- investigation_deeper:
171
- finding: |
172
- Express json() middleware has a "verify" option that can be used
173
- to access raw body before parsing. Current code doesn't use this.
174
-
175
- Stripe documentation says: "You must pass the raw request body"
176
- Current code passes parsed body → signature always fails
177
- BUT: Why do some events succeed?
178
-
179
- aha_moment: |
180
- Checked Express middleware order:
181
- 1. app.use(express.json()) - parses ALL bodies
182
- 2. app.use('/api', apiRoutes) - other routes
183
- 3. app.post('/webhooks/stripe', stripeWebhookHandler) - webhook
184
-
185
- Wait... there's ANOTHER middleware defined ABOVE:
186
- app.use(express.raw({ type: 'application/json', limit: '5mb' }))
187
-
188
- This raw middleware runs FIRST, but only for bodies <5mb.
189
- Subscription events are >5mb (include full customer object),
190
- so they get parsed by json() middleware instead!
191
-
192
- phase_3_hypothesis:
193
- hypothesis: "Express middleware parsing bodies >5mb as JSON instead of keeping raw Buffer, breaking Stripe signature validation"
194
-
195
- classification: "Code bug + Config bug - middleware misconfiguration"
196
-
197
- minimal_test:
198
- approach: "Send test webhook with >5mb payload"
199
- result: "Signature validation fails for large events, succeeds for small events"
200
- confirmed: true
201
-
202
- phase_4_implementation:
203
- fix_level: "Code-level fix (middleware configuration)"
204
-
205
- retroactive_spec_update:
206
- file: ".specweave/increments/0012-webhook-processing/spec.md"
207
- addition: |
208
- ### FR-004: Raw Body Requirement
209
- Webhook endpoint MUST receive raw request body (Buffer) for signature validation.
210
- Middleware MUST NOT parse body before signature validation.
211
-
212
- test_creation:
213
- level: "Level 3: Code Tests (Integration)"
214
- file: "tests/integration/webhooks.test.ts"
215
- test_case: |
216
- describe('Stripe Webhooks', () => {
217
- it('should validate signature for small events (<5mb)', async () => {
218
- const event = createTestEvent('payment_intent.succeeded', { size: '1kb' });
219
- const signature = generateStripeSignature(event);
220
-
221
- const response = await request(app)
222
- .post('/webhooks/stripe')
223
- .set('stripe-signature', signature)
224
- .send(event);
225
-
226
- expect(response.status).toBe(200);
227
- });
228
-
229
- it('should validate signature for large events (>5mb)', async () => {
230
- const event = createTestEvent('customer.subscription.updated', { size: '6mb' });
231
- const signature = generateStripeSignature(event);
232
-
233
- const response = await request(app)
234
- .post('/webhooks/stripe')
235
- .set('stripe-signature', signature)
236
- .send(event);
237
-
238
- expect(response.status).toBe(200); // Currently fails
239
- });
240
- });
241
-
242
- test_fails_before_fix: true
243
-
244
- code_fix:
245
- file: "src/server.ts"
246
- before: |
247
- app.use(express.raw({ type: 'application/json', limit: '5mb' })); // Only for small bodies
248
- app.use(express.json()); // Parses large bodies as JSON
249
- app.post('/webhooks/stripe', stripeWebhookHandler);
250
-
251
- after: |
252
- // Webhook route FIRST (before body parsing middleware)
253
- app.post('/webhooks/stripe',
254
- express.raw({ type: 'application/json', limit: '10mb' }), // Raw body for webhooks
255
- stripeWebhookHandler
256
- );
257
-
258
- // Body parsing for other routes
259
- app.use(express.json());
260
-
261
- verification:
262
- test_passes: true
263
- production_test: "Sent test webhook with 6mb payload → signature valid ✓"
264
- spec_aligned: true
265
- failure_rate: "0% (was 20%)"
266
-
267
- attempts_count: 1 # fixed after understanding the retroactive spec
268
- ultrathink_needed: false # straightforward once spec was created
269
-
270
- phase_5_documentation:
271
- increment_updates:
272
- - file: ".specweave/increments/0012-webhook-processing/spec.md"
273
- change: "Created retroactive spec + added FR-004 for raw body requirement"
274
-
275
- - file: ".specweave/increments/0012-webhook-processing/plan.md"
276
- change: "Documented middleware configuration approach"
277
-
278
- - file: ".specweave/increments/0012-webhook-processing/tests.md"
279
- change: "Added TC-005 and TC-006 for signature validation with different payload sizes"
280
-
281
- architecture_updates:
282
- - file: ".specweave/docs/internal/architecture/adr/0013-webhook-middleware-order.md"
283
- content: |
284
- # ADR-0013: Webhook Endpoints Must Bypass Body Parsing
285
-
286
- ## Context
287
- Express body parsing middleware (json()) parses request bodies,
288
- but Stripe signature validation requires raw Buffer.
289
-
290
- ## Decision
291
- Webhook routes defined BEFORE global body parsing middleware,
292
- with route-specific express.raw() middleware.
293
-
294
- ## Consequences
295
- - Webhooks receive raw body for signature validation
296
- - Other routes still get parsed JSON bodies
297
- - Must remember this pattern for future webhook integrations
298
-
299
- strategy_updates:
300
- - file: ".specweave/docs/internal/strategy/payments/webhooks.md"
301
- change: "Created strategy doc for payment webhook processing (retroactive)"
302
-
303
- new_increment_needed: false # retroactive spec created, no new increment
304
-
305
- commit_message: |
306
- fix(webhooks): support large Stripe webhook events (>5mb)
307
-
308
- Root cause: Express middleware parsing large webhook bodies as JSON
309
- instead of keeping raw Buffer, breaking Stripe signature validation.
310
-
311
- Context: This is brownfield code with no documentation. Created
312
- retroactive spec (.specweave/increments/0012-webhook-processing/)
313
- to document intended behavior before debugging.
314
-
315
- Retroactive spec revealed:
316
- - FR-001: All events must validate signature
317
- - FR-004: Raw body required for signature validation
318
- - Current implementation violated both for events >5mb
319
-
320
- Solution: Moved webhook route BEFORE global body parsing middleware.
321
- Webhook now uses route-specific express.raw() middleware with 10mb limit.
322
-
323
- Spec alignment: Now implements FR-001 and FR-004 correctly.
324
-
325
- Test coverage:
326
- - Added: TC-005 (small events <5mb)
327
- - Added: TC-006 (large events >5mb)
328
- - Verified: Signature validation works for all event sizes
329
-
330
- Documentation created (brownfield):
331
- - spec.md: Retroactive spec for webhook processing
332
- - plan.md: Middleware configuration documented
333
- - tests.md: Test cases for regression prevention
334
- - ADR-0013: Webhook middleware pattern documented
335
- - webhooks.md: Strategy doc for payment webhooks
336
-
337
- Production impact: Failure rate reduced from 20% to 0%
338
-
339
- Fixes: #156
340
-
341
- 🤖 Generated with Claude Code
342
- Co-Authored-By: Claude <noreply@anthropic.com>
343
-
344
- validation:
345
- - "Phase 0: Identified missing spec (brownfield code)"
346
- - "Phase 0: Created retroactive spec before debugging"
347
- - "Phase 1: Analyzed legacy code to understand current behavior"
348
- - "Phase 1: Gathered business context from user"
349
- - "Phase 1: Compared actual behavior vs retroactive spec"
350
- - "Phase 2: Identified middleware configuration issue"
351
- - "Phase 3: Formed hypothesis about large event handling"
352
- - "Phase 4: Updated retroactive spec with FR-004"
353
- - "Phase 4: Fixed with middleware reordering"
354
- - "Phase 5: Created comprehensive documentation (spec, plan, tests, ADR, strategy)"
355
- - "Brownfield approach: Document first, debug second"
356
-
357
- expected_errors: []
358
-
359
- success_criteria:
360
- - "Retroactive spec created before debugging"
361
- - "Root cause identified (middleware order)"
362
- - "Fix verified (0% failure rate)"
363
- - "Comprehensive documentation for legacy code"
364
- - "ADR created for pattern reuse"
365
- - "Living documentation bootstrapped for brownfield"
366
- ---
@@ -1,12 +0,0 @@
1
- ---
2
- name: "Placeholder Test"
3
- description: "TODO: Add actual test case for this skill"
4
- input:
5
- prompt: "Test prompt"
6
- expected_output:
7
- type: "validation"
8
- validation:
9
- - "Placeholder validation"
10
- success_criteria:
11
- - "Test passes"
12
- ---
@@ -1,12 +0,0 @@
1
- ---
2
- name: "Placeholder Test"
3
- description: "TODO: Add actual test case for this skill"
4
- input:
5
- prompt: "Test prompt"
6
- expected_output:
7
- type: "validation"
8
- validation:
9
- - "Placeholder validation"
10
- success_criteria:
11
- - "Test passes"
12
- ---
@@ -1,12 +0,0 @@
1
- ---
2
- name: "Placeholder Test"
3
- description: "TODO: Add actual test case for this skill"
4
- input:
5
- prompt: "Test prompt"
6
- expected_output:
7
- type: "validation"
8
- validation:
9
- - "Placeholder validation"
10
- success_criteria:
11
- - "Test passes"
12
- ---
@@ -1,13 +0,0 @@
1
- name: "Export SpecWeave Increment to Azure DevOps"
2
- description: "Test exporting a SpecWeave increment to ADO Epic/Features/Stories"
3
- user_input: "Export increment 0001-user-auth to Azure DevOps"
4
- expected_behavior:
5
- - Creates Epic from increment spec
6
- - Creates Features from main sections
7
- - Creates User Stories from tasks
8
- - Maps test cases to Test Cases in ADO
9
- validation:
10
- - Epic title matches increment name
11
- - Features map to spec sections
12
- - User Stories have acceptance criteria
13
- - Work item IDs stored in SpecWeave
@@ -1,13 +0,0 @@
1
- name: "Import Azure DevOps Epic to SpecWeave"
2
- description: "Test importing ADO Epic as a SpecWeave increment"
3
- user_input: "Import ADO Epic #12345 into SpecWeave"
4
- expected_behavior:
5
- - Creates increment folder with ADO Epic name
6
- - Generates spec.md from Epic description
7
- - Converts Features to sections in spec
8
- - Creates tasks.md from User Stories
9
- validation:
10
- - Increment follows SpecWeave structure
11
- - spec.md has proper sections
12
- - tasks.md includes all stories
13
- - ADO references preserved
@@ -1,13 +0,0 @@
1
- name: "Bidirectional Sync with Conflict Resolution"
2
- description: "Test syncing changes between SpecWeave and ADO"
3
- user_input: "Sync increment 0002-payment with ADO, handle conflicts"
4
- expected_behavior:
5
- - Detects changes in both systems
6
- - Shows conflicts for manual resolution
7
- - Syncs approved changes bidirectionally
8
- - Maintains traceability
9
- validation:
10
- - Conflict detection works
11
- - User can choose resolution strategy
12
- - Sync maintains data integrity
13
- - Audit log of sync operations
@@ -1,37 +0,0 @@
1
- ---
2
- name: "Basic SpecWeave Project Detection"
3
- description: "Tests if specweave-detector can identify a SpecWeave project by presence of .specweave/ directory"
4
- input:
5
- prompt: "User opens Claude Code in a SpecWeave project directory"
6
- files:
7
- - ".specweave/config.yaml"
8
- context:
9
- cwd: "/path/to/specweave-project"
10
- files_present:
11
- - ".specweave/"
12
- - ".specweave/config.yaml"
13
- - "features/"
14
- - "specifications/"
15
- expected_output:
16
- type: "skill_activation"
17
- activates: true
18
- reason: "Detected .specweave/config.yaml"
19
- actions:
20
- - "Load project configuration"
21
- - "Enable SpecWeave-specific commands"
22
- - "Activate SpecWeave workflow"
23
- contains:
24
- - "SpecWeave project detected"
25
- - "Loading configuration"
26
- validation:
27
- - "Skill activates proactively (without user request)"
28
- - "Detects .specweave/ directory"
29
- - "Reads config.yaml successfully"
30
- - "Enables SpecWeave commands"
31
- - "Does not activate in non-SpecWeave projects"
32
- success_criteria:
33
- - "Proactive activation works (proactive: true in SKILL.md)"
34
- - "Configuration loaded correctly"
35
- - "SpecWeave workflows enabled"
36
- - "No false positives (activates only in SpecWeave projects)"
37
- ---
@@ -1,37 +0,0 @@
1
- ---
2
- name: "Detection with Missing Configuration"
3
- description: "Tests edge case where .specweave/ exists but config.yaml is missing or invalid"
4
- input:
5
- prompt: "User opens Claude Code in directory with incomplete SpecWeave setup"
6
- files:
7
- - ".specweave/" # directory exists but empty
8
- context:
9
- cwd: "/path/to/incomplete-project"
10
- files_present:
11
- - ".specweave/"
12
- files_missing:
13
- - ".specweave/config.yaml"
14
- expected_output:
15
- type: "error_handling"
16
- activates: true
17
- reason: "Detected .specweave/ but missing config"
18
- actions:
19
- - "Warn user about missing config.yaml"
20
- - "Offer to initialize SpecWeave project"
21
- - "Provide sample config.yaml"
22
- contains:
23
- - "SpecWeave directory detected"
24
- - "Missing config.yaml"
25
- - "Initialize project?"
26
- validation:
27
- - "Detects incomplete setup"
28
- - "Provides helpful error message"
29
- - "Offers initialization option"
30
- - "Does not crash or fail silently"
31
- - "Suggests next steps"
32
- success_criteria:
33
- - "Graceful error handling"
34
- - "User-friendly error message"
35
- - "Actionable recommendations"
36
- - "No silent failures"
37
- ---
@@ -1,34 +0,0 @@
1
- ---
2
- name: "No Activation in Non-SpecWeave Projects"
3
- description: "Tests that specweave-detector does NOT activate in regular projects without .specweave/"
4
- input:
5
- prompt: "User opens Claude Code in a regular Node.js project"
6
- files:
7
- - "package.json"
8
- - "src/"
9
- - "README.md"
10
- context:
11
- cwd: "/path/to/regular-project"
12
- files_present:
13
- - "package.json"
14
- - "src/"
15
- files_missing:
16
- - ".specweave/"
17
- - ".specweave/config.yaml"
18
- expected_output:
19
- type: "no_activation"
20
- activates: false
21
- reason: "No .specweave/ directory found"
22
- actions: []
23
- contains: []
24
- validation:
25
- - "Does NOT activate in non-SpecWeave projects"
26
- - "No false positives"
27
- - "No unnecessary warnings"
28
- - "Does not interfere with normal Claude Code operation"
29
- success_criteria:
30
- - "Zero false positives"
31
- - "Only activates when .specweave/ present"
32
- - "Silent when not applicable"
33
- - "No performance impact on non-SpecWeave projects"
34
- ---
@@ -1,13 +0,0 @@
1
- name: "Export SpecWeave Increment to JIRA"
2
- description: "Test exporting a SpecWeave increment to JIRA Epic/Stories/Subtasks"
3
- user_input: "Export increment 0003-dashboard to JIRA"
4
- expected_behavior:
5
- - Creates JIRA Epic from increment spec
6
- - Creates Stories from main sections
7
- - Creates Subtasks from tasks
8
- - Maps test cases to JIRA Test issues
9
- validation:
10
- - Epic summary matches increment name
11
- - Stories have proper descriptions
12
- - Subtasks linked to Stories
13
- - JIRA keys stored in SpecWeave
@@ -1,13 +0,0 @@
1
- name: "Import JIRA Epic to SpecWeave"
2
- description: "Test importing JIRA Epic as a SpecWeave increment"
3
- user_input: "Import JIRA Epic PROJ-123 into SpecWeave"
4
- expected_behavior:
5
- - Creates increment folder from Epic key
6
- - Generates spec.md from Epic description
7
- - Converts Stories to spec sections
8
- - Creates tasks.md from Subtasks
9
- validation:
10
- - Increment follows naming convention
11
- - spec.md includes Epic details
12
- - tasks.md has all subtasks
13
- - JIRA links preserved
@@ -1,13 +0,0 @@
1
- name: "Sync Status Updates Between Systems"
2
- description: "Test syncing task status between SpecWeave and JIRA"
3
- user_input: "Sync status updates for increment 0004-notifications"
4
- expected_behavior:
5
- - Detects status changes in SpecWeave (tasks.md)
6
- - Updates JIRA issue status accordingly
7
- - Syncs JIRA status back to SpecWeave
8
- - Handles workflow state mapping
9
- validation:
10
- - Status mapping works correctly
11
- - Bidirectional sync maintains consistency
12
- - Workflow transitions respected
13
- - Sync logs available
@@ -1,12 +0,0 @@
1
- ---
2
- name: "Placeholder Test"
3
- description: "TODO: Add actual test case for this skill"
4
- input:
5
- prompt: "Test prompt"
6
- expected_output:
7
- type: "validation"
8
- validation:
9
- - "Placeholder validation"
10
- success_criteria:
11
- - "Test passes"
12
- ---
@@ -1,12 +0,0 @@
1
- ---
2
- name: "Placeholder Test"
3
- description: "TODO: Add actual test case for this skill"
4
- input:
5
- prompt: "Test prompt"
6
- expected_output:
7
- type: "validation"
8
- validation:
9
- - "Placeholder validation"
10
- success_criteria:
11
- - "Test passes"
12
- ---
@@ -1,12 +0,0 @@
1
- ---
2
- name: "Placeholder Test"
3
- description: "TODO: Add actual test case for this skill"
4
- input:
5
- prompt: "Test prompt"
6
- expected_output:
7
- type: "validation"
8
- validation:
9
- - "Placeholder validation"
10
- success_criteria:
11
- - "Test passes"
12
- ---
@@ -1,12 +0,0 @@
1
- ---
2
- name: "Placeholder Test"
3
- description: "TODO: Add actual test case for this skill"
4
- input:
5
- prompt: "Test prompt"
6
- expected_output:
7
- type: "validation"
8
- validation:
9
- - "Placeholder validation"
10
- success_criteria:
11
- - "Test passes"
12
- ---
@@ -1,12 +0,0 @@
1
- ---
2
- name: "Placeholder Test"
3
- description: "TODO: Add actual test case for this skill"
4
- input:
5
- prompt: "Test prompt"
6
- expected_output:
7
- type: "validation"
8
- validation:
9
- - "Placeholder validation"
10
- success_criteria:
11
- - "Test passes"
12
- ---