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,233 +0,0 @@
1
- ---
2
- name: "Unclear Requirements with Socratic Questioning"
3
- description: "Handle vague user input through Socratic questioning to clarify requirements before design"
4
- skill: spec-driven-brainstorming
5
- priority: P1
6
- estimated_time: "15-20 minutes"
7
-
8
- input:
9
- prompt: "I want to build something with crypto prices"
10
- context:
11
- existing_project: true
12
- tech_stack: "Unknown (needs detection)"
13
- requirements_clarity: "Very Low"
14
- user_goal_clarity: "Unclear"
15
-
16
- expected_output:
17
- phase_1_understanding:
18
- announcement: "I'm using spec-driven brainstorming to refine your idea. Let me understand what you're trying to achieve."
19
-
20
- socratic_questioning_sequence:
21
- question_1:
22
- question: "What's your primary goal with crypto prices?"
23
- tool_used: "AskUserQuestion"
24
- options:
25
- - "Real-time price tracking dashboard"
26
- - "Price alerts and notifications"
27
- - "Historical data analysis"
28
- - "Automated trading bot"
29
- user_answer: "Real-time price tracking dashboard"
30
-
31
- question_2:
32
- question: "Who will use this dashboard?"
33
- tool_used: "Open-ended" # allowing freeform answer
34
- user_answer: "Just me and maybe a few friends"
35
-
36
- question_3:
37
- question: "How many cryptocurrencies do you want to track?"
38
- tool_used: "AskUserQuestion"
39
- options:
40
- - "Top 10 only (BTC, ETH, etc.)"
41
- - "Top 100 cryptocurrencies"
42
- - "Custom watchlist (user-selected)"
43
- - "All available (1000+)"
44
- user_answer: "Custom watchlist"
45
-
46
- question_4:
47
- question: "What's your update frequency requirement?"
48
- tool_used: "AskUserQuestion"
49
- options:
50
- - "Real-time (every second, WebSocket)" # expensive
51
- - "Near real-time (every 10-30 seconds, polling)" # balanced
52
- - "Periodic (every few minutes, cron job)" # cheap
53
- user_answer: "Near real-time (every 10-30 seconds)"
54
-
55
- question_5:
56
- question: "Any budget or hosting constraints?"
57
- tool_used: "Open-ended"
58
- user_answer: "Want to keep it cheap, maybe under $20/month"
59
-
60
- question_6:
61
- question: "Do you need historical price charts or just current prices?"
62
- tool_used: "AskUserQuestion"
63
- options:
64
- - "Current prices only (simpler)"
65
- - "Basic charts (1 day, 1 week, 1 month)" # medium complexity
66
- - "Advanced charts with indicators (candlesticks, RSI, MACD)" # high complexity
67
- user_answer: "Basic charts"
68
-
69
- gathered_requirements:
70
- purpose: "Personal crypto price dashboard with basic charts"
71
- users: "Personal use (1-5 users)"
72
- functional_requirements:
73
- - "Track custom watchlist of cryptocurrencies"
74
- - "Display current prices with 10-30 second updates"
75
- - "Show basic charts (1 day, 1 week, 1 month)"
76
- constraints:
77
- - "Budget: $20/month or less"
78
- - "Simple deployment (not enterprise-scale)"
79
- success_criteria:
80
- - "Dashboard loads in <2 seconds"
81
- - "Prices update every 10-30 seconds"
82
- - "Charts display historical data"
83
- - "Add/remove cryptos from watchlist"
84
-
85
- revisit_count: 1 # user revealed new constraint (budget) → re-clarified
86
- flexibility_demonstrated: true # went back to refine budget impact
87
-
88
- phase_2_tech_stack:
89
- detection_attempt:
90
- files_searched:
91
- - "package.json"
92
- - "requirements.txt"
93
- - "*.csproj"
94
- found: "package.json"
95
-
96
- detected_stack:
97
- framework: "Next.js 14"
98
- language: "TypeScript"
99
- database: null # needs to ask
100
-
101
- database_question:
102
- question: "Do you have a database set up, or should we use a lightweight option?"
103
- tool_used: "AskUserQuestion"
104
- options:
105
- - "No database (store watchlist in localStorage)" # simplest, no backend needed
106
- - "SQLite (lightweight, no hosting cost)" # simple, local file
107
- - "PostgreSQL (more robust, requires hosting)" # production-ready, $5-10/month
108
- user_answer: "SQLite"
109
-
110
- skills_activated:
111
- - "nextjs"
112
- - "nodejs-backend"
113
- - "frontend" # for React components
114
-
115
- phase_3_exploration:
116
- approaches_proposed: 3
117
-
118
- approach_1:
119
- name: "Server-Side Rendering (SSR) with API Polling"
120
- architecture: "Next.js SSR fetches prices on each request"
121
- trade_offs:
122
- pros:
123
- - "Simple implementation"
124
- - "No WebSocket complexity"
125
- - "Works on any hosting (Vercel free tier)"
126
- cons:
127
- - "Not truly real-time (page refresh needed)"
128
- - "Higher API call volume (one per user request)"
129
- cost: "$0 (Vercel free tier)"
130
- complexity: "Low"
131
-
132
- approach_2:
133
- name: "Client-Side Polling with SWR"
134
- architecture: "Next.js static + client polls API every 10 seconds"
135
- trade_offs:
136
- pros:
137
- - "Near real-time without WebSockets"
138
- - "SWR caching reduces API calls"
139
- - "Static export possible"
140
- cons:
141
- - "More client-side logic"
142
- - "Battery drain on mobile"
143
- cost: "$0 (Vercel free tier or static hosting)"
144
- complexity: "Low"
145
-
146
- approach_3:
147
- name: "Server-Sent Events (SSE) with Price Streaming"
148
- architecture: "Backend streams price updates via SSE to clients"
149
- trade_offs:
150
- pros:
151
- - "True push updates (no polling)"
152
- - "Lower client battery usage"
153
- - "More efficient than polling"
154
- cons:
155
- - "Requires long-lived server connections"
156
- - "More complex backend"
157
- - "Not supported on all hosting (Vercel has limits)"
158
- cost: "$5-10/month (Railway or DigitalOcean)"
159
- complexity: "Medium"
160
-
161
- budget_impact_highlighted: true
162
- user_selection: "Approach 2" # Client-side polling with SWR (fits budget)
163
-
164
- phase_4_design_validation:
165
- sections_presented:
166
- - title: "Architecture Overview"
167
- content: "Next.js 14 with App Router, client-side polling using SWR for price updates, SQLite for watchlist storage, CoinGecko API (free tier)"
168
- validated: true
169
-
170
- - title: "Components"
171
- content: "Dashboard page (price grid), chart component (recharts), watchlist manager (add/remove), price API route (/api/prices)"
172
- validated: true
173
-
174
- - title: "Data Flow"
175
- content: "User opens dashboard → SWR fetches /api/prices → Backend calls CoinGecko API → Cache for 10s → Return to client → Recharts renders → SWR auto-refetches every 10s"
176
- validated: true
177
-
178
- - title: "Error Handling"
179
- content: "API rate limit → show cached data + warning, network failure → retry 3x with exponential backoff, invalid crypto symbol → show error state"
180
- validated: true
181
-
182
- - title: "Testing Strategy"
183
- content: "Unit tests (price formatting), integration tests (API routes), E2E tests (Playwright: add crypto, view chart, polling works)"
184
- validated: true
185
-
186
- - title: "Performance & Cost"
187
- content: "CoinGecko free tier: 50 calls/min (sufficient), Vercel free tier: unlimited deployments, estimated cost: $0/month"
188
- validated: true
189
-
190
- design_complete: true
191
- budget_constraint_met: true
192
-
193
- phase_5_specweave_handoff:
194
- handoff_type: "Quick Increment (Fast Start)" # personal project, not enterprise
195
-
196
- reason: "Personal project with clear, simple requirements - full documentation can be added incrementally"
197
-
198
- expected_increment:
199
- directory: ".specweave/increments/0001-crypto-dashboard/"
200
- files:
201
- - "spec.md" # WHAT & WHY (custom watchlist, near real-time, budget-conscious)
202
- - "plan.md" # HOW (Next.js, SWR polling, SQLite, CoinGecko API)
203
- - "tasks.md" # implementation checklist
204
- - "tests.md" # E2E with Playwright (dashboard loads, prices update, chart renders)
205
- - "context-manifest.yaml" # minimal context (nextjs, frontend skills)
206
-
207
- agents_invoked:
208
- - "pm" # minimal (personal project)
209
- - "qa-lead" # E2E test strategy
210
-
211
- validation:
212
- - "Phase 1: Socratic questioning sequence (at least 5 questions)"
213
- - "Phase 1: Requirements gathered incrementally through dialogue"
214
- - "Phase 1: Demonstrated flexibility (revisited earlier question when new constraint revealed)"
215
- - "Phase 2: Tech stack detected from existing files"
216
- - "Phase 2: Database option asked separately"
217
- - "Phase 3: Budget impact explicitly highlighted in approaches"
218
- - "Phase 3: Cost estimates provided for each approach"
219
- - "Phase 4: Budget constraint validated in performance section"
220
- - "Phase 5: Quick increment chosen (appropriate for personal project)"
221
- - "AskUserQuestion used for structured choices"
222
- - "Open-ended questions used for context gathering"
223
- - "ONE question at a time in Phase 1"
224
-
225
- expected_errors: []
226
-
227
- success_criteria:
228
- - "Vague input clarified through questioning"
229
- - "Requirements extracted from dialogue"
230
- - "Budget constraint met ($0/month vs $20/month budget)"
231
- - "Appropriate handoff type chosen (quick vs full)"
232
- - "Design ready for implementation"
233
- ---
@@ -1,212 +0,0 @@
1
- ---
2
- name: "Simple Authentication Bug with Spec Alignment"
3
- description: "Debug a login failure where code doesn't match spec.md requirements"
4
- skill: spec-driven-debugging
5
- priority: P1
6
- estimated_time: "15-20 minutes"
7
-
8
- input:
9
- prompt: "Login is failing with '401 Unauthorized' even with correct credentials"
10
- context:
11
- project_type: "Next.js 14 + TypeScript"
12
- increment: ".specweave/increments/0001-user-authentication/"
13
- files_exist:
14
- - "spec.md"
15
- - "plan.md"
16
- - "tests.md"
17
- - "src/app/api/auth/[...nextauth]/route.ts"
18
- - "src/middleware.ts"
19
- error_message: "401 Unauthorized - Invalid credentials"
20
- reproduction: "Consistent - happens every login attempt"
21
-
22
- expected_output:
23
- phase_0_context_loading:
24
- announcement: "Let me load the SpecWeave context before investigating."
25
-
26
- files_loaded:
27
- - path: ".specweave/increments/0001-user-authentication/spec.md"
28
- key_findings:
29
- - "FR-001: Users must be able to login with email and password"
30
- - "FR-002: Passwords must be hashed with bcrypt (minimum 10 salt rounds)"
31
- - "FR-003: JWT tokens expire after 7 days"
32
- - "Acceptance: TC-001: Valid credentials → successful login"
33
-
34
- - path: ".specweave/increments/0001-user-authentication/plan.md"
35
- key_findings:
36
- - "NextAuth.js v5 with Credentials provider"
37
- - "PostgreSQL adapter for session storage"
38
- - "bcrypt for password hashing"
39
-
40
- - path: ".specweave/increments/0001-user-authentication/tests.md"
41
- key_findings:
42
- - "TC-005: Login with valid credentials should return 200"
43
- - "TC-006: Login with invalid credentials should return 401"
44
-
45
- bug_classification: "Likely code bug - implementation doesn't match spec"
46
-
47
- phase_1_root_cause:
48
- error_analysis:
49
- message: "401 Unauthorized - Invalid credentials"
50
- stack_trace_relevant: false # not a crash, just wrong response
51
- line_numbers: "src/app/api/auth/[...nextauth]/route.ts:45"
52
-
53
- reproduction:
54
- consistent: true
55
- steps:
56
- - "Navigate to /login"
57
- - "Enter email: test@example.com, password: Test123!"
58
- - "Click submit"
59
- - "Observe: 401 error"
60
-
61
- recent_changes:
62
- git_diff_findings:
63
- - "Recently updated password hashing from md5 to bcrypt"
64
- - "Changed salt rounds from 8 to 12"
65
-
66
- spec_comparison:
67
- spec_says: "Passwords must be hashed with bcrypt (minimum 10 salt rounds)"
68
- actual_behavior: "Login always fails with valid credentials"
69
- discrepancy: "Code may not be comparing hashed passwords correctly"
70
-
71
- multi_component_check:
72
- frontend: "✓ Sends correct email/password"
73
- api_route: "⚠️ Receives correct data but returns 401"
74
- database: "✓ User exists in DB with bcrypt hash"
75
-
76
- data_flow_trace:
77
- - step: "Frontend sends {email, password} to /api/auth/signin"
78
- status: "✓ Correct"
79
- - step: "API route calls authorize() function"
80
- status: "⚠️ Here's where it fails"
81
- - step: "authorize() queries user from DB"
82
- status: "✓ User found"
83
- - step: "authorize() compares passwords"
84
- status: "❌ Always returns false"
85
-
86
- root_cause_hypothesis: "Password comparison logic is incorrect after bcrypt migration"
87
-
88
- phase_2_pattern_analysis:
89
- working_examples_found:
90
- - file: "src/app/api/users/[id]/route.ts"
91
- pattern: "Uses bcrypt.compare(plaintext, hash) correctly"
92
- code: |
93
- const isValid = await bcrypt.compare(password, user.password);
94
-
95
- broken_code:
96
- file: "src/app/api/auth/[...nextauth]/route.ts:45"
97
- code: |
98
- const isValid = await bcrypt.compare(user.password, password); // WRONG ORDER!
99
-
100
- difference_identified:
101
- issue: "Arguments to bcrypt.compare() are reversed"
102
- working: "bcrypt.compare(plaintext, hash)"
103
- broken: "bcrypt.compare(hash, plaintext)"
104
- impact: "Always returns false because it's trying to hash the hash"
105
-
106
- phase_3_hypothesis:
107
- hypothesis: "bcrypt.compare() arguments are in wrong order (hash first instead of plaintext first)"
108
-
109
- classification: "Code bug - implementation error, spec is correct"
110
-
111
- minimal_test:
112
- approach: "Swap arguments in bcrypt.compare() call"
113
- change_size: "Single line change"
114
- one_variable: true
115
-
116
- phase_4_implementation:
117
- fix_level: "Code-level fix"
118
- reason: "Spec is clear and correct, code has logic error"
119
-
120
- test_creation:
121
- level: "Level 3: Code Tests (Integration test)"
122
- file: "tests/integration/auth.test.ts"
123
- test_case: |
124
- describe('Authentication', () => {
125
- it('should login successfully with valid credentials', async () => {
126
- const response = await fetch('/api/auth/signin', {
127
- method: 'POST',
128
- body: JSON.stringify({
129
- email: 'test@example.com',
130
- password: 'Test123!'
131
- })
132
- });
133
- expect(response.status).toBe(200);
134
- expect(response.body.user).toBeDefined();
135
- });
136
- });
137
-
138
- test_fails_before_fix: true
139
-
140
- spec_update_needed: false # spec was correct
141
-
142
- code_fix:
143
- file: "src/app/api/auth/[...nextauth]/route.ts"
144
- before: |
145
- const isValid = await bcrypt.compare(user.password, password);
146
- after: |
147
- const isValid = await bcrypt.compare(password, user.password);
148
-
149
- verification:
150
- test_passes: true
151
- other_tests_broken: false
152
- issue_resolved: true
153
- spec_aligned: true
154
-
155
- attempts_count: 1 # fixed on first try
156
- ultrathink_needed: false
157
-
158
- phase_5_documentation:
159
- increment_updates:
160
- - file: ".specweave/increments/0001-user-authentication/tests.md"
161
- change: "Added TC-007: Regression test for bcrypt argument order"
162
-
163
- architecture_updates: [] # no architectural change
164
-
165
- strategy_updates: [] # requirements unchanged
166
-
167
- new_increment_needed: false # small fix, no new increment
168
-
169
- commit_message: |
170
- fix(auth): correct bcrypt.compare argument order
171
-
172
- Root cause: Arguments to bcrypt.compare() were reversed after
173
- bcrypt migration. Function signature is compare(plaintext, hash)
174
- but code was calling compare(hash, plaintext).
175
-
176
- Solution: Swapped arguments to match bcrypt API correctly.
177
- Spec alignment: Code now implements FR-002 correctly.
178
-
179
- Test coverage:
180
- - Added: TC-007 regression test for password comparison
181
- - Verified: All existing auth tests pass
182
-
183
- Documentation updated:
184
- - tests.md: Added TC-007 for regression prevention
185
-
186
- Fixes: #42
187
-
188
- 🤖 Generated with Claude Code
189
- Co-Authored-By: Claude <noreply@anthropic.com>
190
-
191
- validation:
192
- - "Phase 0: Loaded spec.md, plan.md, tests.md"
193
- - "Phase 0: Classified as code bug (not spec bug)"
194
- - "Phase 1: Traced data flow to identify failing component"
195
- - "Phase 1: Compared behavior vs spec (spec was correct)"
196
- - "Phase 2: Found working example in codebase"
197
- - "Phase 2: Identified argument order difference"
198
- - "Phase 3: Formed single, specific hypothesis"
199
- - "Phase 4: Created failing test before fix"
200
- - "Phase 4: Fixed on first attempt (no ultrathink needed)"
201
- - "Phase 5: Updated tests.md with new test case"
202
- - "Phase 5: Committed with proper documentation"
203
-
204
- expected_errors: []
205
-
206
- success_criteria:
207
- - "Root cause identified (argument order)"
208
- - "Fix verified with test"
209
- - "Spec alignment confirmed"
210
- - "Living documentation updated"
211
- - "Single attempt (efficient debugging)"
212
- ---