@lbruton/specflow 3.0.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 (414) hide show
  1. package/CHANGELOG.md +955 -0
  2. package/LICENSE +674 -0
  3. package/README.ar.md +314 -0
  4. package/README.de.md +314 -0
  5. package/README.es.md +314 -0
  6. package/README.fr.md +314 -0
  7. package/README.it.md +314 -0
  8. package/README.ja.md +316 -0
  9. package/README.ko.md +314 -0
  10. package/README.md +239 -0
  11. package/README.pt.md +314 -0
  12. package/README.ru.md +314 -0
  13. package/README.zh.md +314 -0
  14. package/dist/__tests__/config.test.d.ts +2 -0
  15. package/dist/__tests__/config.test.d.ts.map +1 -0
  16. package/dist/__tests__/config.test.js +264 -0
  17. package/dist/__tests__/config.test.js.map +1 -0
  18. package/dist/__tests__/index-args.test.d.ts +2 -0
  19. package/dist/__tests__/index-args.test.d.ts.map +1 -0
  20. package/dist/__tests__/index-args.test.js +43 -0
  21. package/dist/__tests__/index-args.test.js.map +1 -0
  22. package/dist/__tests__/index-entrypoint.test.d.ts +2 -0
  23. package/dist/__tests__/index-entrypoint.test.d.ts.map +1 -0
  24. package/dist/__tests__/index-entrypoint.test.js +23 -0
  25. package/dist/__tests__/index-entrypoint.test.js.map +1 -0
  26. package/dist/config.d.ts +26 -0
  27. package/dist/config.d.ts.map +1 -0
  28. package/dist/config.js +188 -0
  29. package/dist/config.js.map +1 -0
  30. package/dist/core/__tests__/git-utils.test.d.ts +2 -0
  31. package/dist/core/__tests__/git-utils.test.d.ts.map +1 -0
  32. package/dist/core/__tests__/git-utils.test.js +179 -0
  33. package/dist/core/__tests__/git-utils.test.js.map +1 -0
  34. package/dist/core/__tests__/mdx-validator.test.d.ts +2 -0
  35. package/dist/core/__tests__/mdx-validator.test.d.ts.map +1 -0
  36. package/dist/core/__tests__/mdx-validator.test.js +42 -0
  37. package/dist/core/__tests__/mdx-validator.test.js.map +1 -0
  38. package/dist/core/__tests__/path-utils.test.d.ts +2 -0
  39. package/dist/core/__tests__/path-utils.test.d.ts.map +1 -0
  40. package/dist/core/__tests__/path-utils.test.js +344 -0
  41. package/dist/core/__tests__/path-utils.test.js.map +1 -0
  42. package/dist/core/__tests__/project-registry.test.d.ts +2 -0
  43. package/dist/core/__tests__/project-registry.test.d.ts.map +1 -0
  44. package/dist/core/__tests__/project-registry.test.js +62 -0
  45. package/dist/core/__tests__/project-registry.test.js.map +1 -0
  46. package/dist/core/__tests__/security-utils.test.d.ts +2 -0
  47. package/dist/core/__tests__/security-utils.test.d.ts.map +1 -0
  48. package/dist/core/__tests__/security-utils.test.js +643 -0
  49. package/dist/core/__tests__/security-utils.test.js.map +1 -0
  50. package/dist/core/__tests__/task-validator.test.d.ts +2 -0
  51. package/dist/core/__tests__/task-validator.test.d.ts.map +1 -0
  52. package/dist/core/__tests__/task-validator.test.js +237 -0
  53. package/dist/core/__tests__/task-validator.test.js.map +1 -0
  54. package/dist/core/archive-service.d.ts +10 -0
  55. package/dist/core/archive-service.d.ts.map +1 -0
  56. package/dist/core/archive-service.js +99 -0
  57. package/dist/core/archive-service.js.map +1 -0
  58. package/dist/core/dashboard-session.d.ts +49 -0
  59. package/dist/core/dashboard-session.d.ts.map +1 -0
  60. package/dist/core/dashboard-session.js +132 -0
  61. package/dist/core/dashboard-session.js.map +1 -0
  62. package/dist/core/git-utils.d.ts +25 -0
  63. package/dist/core/git-utils.d.ts.map +1 -0
  64. package/dist/core/git-utils.js +87 -0
  65. package/dist/core/git-utils.js.map +1 -0
  66. package/dist/core/global-dir.d.ts +44 -0
  67. package/dist/core/global-dir.d.ts.map +1 -0
  68. package/dist/core/global-dir.js +74 -0
  69. package/dist/core/global-dir.js.map +1 -0
  70. package/dist/core/implementation-log-migrator.d.ts +41 -0
  71. package/dist/core/implementation-log-migrator.d.ts.map +1 -0
  72. package/dist/core/implementation-log-migrator.js +258 -0
  73. package/dist/core/implementation-log-migrator.js.map +1 -0
  74. package/dist/core/mdx-validator.d.ts +14 -0
  75. package/dist/core/mdx-validator.d.ts.map +1 -0
  76. package/dist/core/mdx-validator.js +34 -0
  77. package/dist/core/mdx-validator.js.map +1 -0
  78. package/dist/core/parser.d.ts +12 -0
  79. package/dist/core/parser.d.ts.map +1 -0
  80. package/dist/core/parser.js +144 -0
  81. package/dist/core/parser.js.map +1 -0
  82. package/dist/core/path-utils.d.ts +63 -0
  83. package/dist/core/path-utils.d.ts.map +1 -0
  84. package/dist/core/path-utils.js +288 -0
  85. package/dist/core/path-utils.js.map +1 -0
  86. package/dist/core/project-registry.d.ts +94 -0
  87. package/dist/core/project-registry.d.ts.map +1 -0
  88. package/dist/core/project-registry.js +293 -0
  89. package/dist/core/project-registry.js.map +1 -0
  90. package/dist/core/security-utils.d.ts +97 -0
  91. package/dist/core/security-utils.d.ts.map +1 -0
  92. package/dist/core/security-utils.js +264 -0
  93. package/dist/core/security-utils.js.map +1 -0
  94. package/dist/core/task-parser.d.ts +63 -0
  95. package/dist/core/task-parser.d.ts.map +1 -0
  96. package/dist/core/task-parser.js +332 -0
  97. package/dist/core/task-parser.js.map +1 -0
  98. package/dist/core/task-validator.d.ts +35 -0
  99. package/dist/core/task-validator.d.ts.map +1 -0
  100. package/dist/core/task-validator.js +236 -0
  101. package/dist/core/task-validator.js.map +1 -0
  102. package/dist/core/workspace-initializer.d.ts +16 -0
  103. package/dist/core/workspace-initializer.d.ts.map +1 -0
  104. package/dist/core/workspace-initializer.js +168 -0
  105. package/dist/core/workspace-initializer.js.map +1 -0
  106. package/dist/dashboard/__tests__/approval-storage-path-resolution.test.d.ts +2 -0
  107. package/dist/dashboard/__tests__/approval-storage-path-resolution.test.d.ts.map +1 -0
  108. package/dist/dashboard/__tests__/approval-storage-path-resolution.test.js +69 -0
  109. package/dist/dashboard/__tests__/approval-storage-path-resolution.test.js.map +1 -0
  110. package/dist/dashboard/__tests__/multi-server-approvals-content.test.d.ts +2 -0
  111. package/dist/dashboard/__tests__/multi-server-approvals-content.test.d.ts.map +1 -0
  112. package/dist/dashboard/__tests__/multi-server-approvals-content.test.js +116 -0
  113. package/dist/dashboard/__tests__/multi-server-approvals-content.test.js.map +1 -0
  114. package/dist/dashboard/__tests__/watcher-error-handling.test.d.ts +2 -0
  115. package/dist/dashboard/__tests__/watcher-error-handling.test.d.ts.map +1 -0
  116. package/dist/dashboard/__tests__/watcher-error-handling.test.js +118 -0
  117. package/dist/dashboard/__tests__/watcher-error-handling.test.js.map +1 -0
  118. package/dist/dashboard/approval-storage.d.ts +139 -0
  119. package/dist/dashboard/approval-storage.d.ts.map +1 -0
  120. package/dist/dashboard/approval-storage.js +586 -0
  121. package/dist/dashboard/approval-storage.js.map +1 -0
  122. package/dist/dashboard/execution-history-manager.d.ts +52 -0
  123. package/dist/dashboard/execution-history-manager.d.ts.map +1 -0
  124. package/dist/dashboard/execution-history-manager.js +161 -0
  125. package/dist/dashboard/execution-history-manager.js.map +1 -0
  126. package/dist/dashboard/implementation-log-manager.d.ts +97 -0
  127. package/dist/dashboard/implementation-log-manager.d.ts.map +1 -0
  128. package/dist/dashboard/implementation-log-manager.js +625 -0
  129. package/dist/dashboard/implementation-log-manager.js.map +1 -0
  130. package/dist/dashboard/job-scheduler.d.ts +91 -0
  131. package/dist/dashboard/job-scheduler.d.ts.map +1 -0
  132. package/dist/dashboard/job-scheduler.js +321 -0
  133. package/dist/dashboard/job-scheduler.js.map +1 -0
  134. package/dist/dashboard/multi-server.d.ts +42 -0
  135. package/dist/dashboard/multi-server.d.ts.map +1 -0
  136. package/dist/dashboard/multi-server.js +1304 -0
  137. package/dist/dashboard/multi-server.js.map +1 -0
  138. package/dist/dashboard/parser.d.ts +19 -0
  139. package/dist/dashboard/parser.d.ts.map +1 -0
  140. package/dist/dashboard/parser.js +290 -0
  141. package/dist/dashboard/parser.js.map +1 -0
  142. package/dist/dashboard/project-manager.d.ts +82 -0
  143. package/dist/dashboard/project-manager.d.ts.map +1 -0
  144. package/dist/dashboard/project-manager.js +257 -0
  145. package/dist/dashboard/project-manager.js.map +1 -0
  146. package/dist/dashboard/public/assets/Inter-Bold-CD3Pr7BX.woff2 +0 -0
  147. package/dist/dashboard/public/assets/Inter-Medium-B_8v_WHh.woff2 +0 -0
  148. package/dist/dashboard/public/assets/Inter-Regular-DRVdRqcI.woff2 +0 -0
  149. package/dist/dashboard/public/assets/Inter-SemiBold-CtskMddL.woff2 +0 -0
  150. package/dist/dashboard/public/assets/JetBrainsMono-Bold-D4WEaHbo.woff2 +0 -0
  151. package/dist/dashboard/public/assets/JetBrainsMono-Medium-3S3k2nMz.woff2 +0 -0
  152. package/dist/dashboard/public/assets/JetBrainsMono-Regular-BQaDgvhP.woff2 +0 -0
  153. package/dist/dashboard/public/assets/Tableau10-B-NsZVaP.js +1 -0
  154. package/dist/dashboard/public/assets/apl-B4CMkyY2.js +1 -0
  155. package/dist/dashboard/public/assets/arc-CtYZ6WTd.js +1 -0
  156. package/dist/dashboard/public/assets/array-BKyUJesY.js +1 -0
  157. package/dist/dashboard/public/assets/asciiarmor-Df11BRmG.js +1 -0
  158. package/dist/dashboard/public/assets/asn1-EdZsLKOL.js +1 -0
  159. package/dist/dashboard/public/assets/asterisk-B-8jnY81.js +1 -0
  160. package/dist/dashboard/public/assets/blockDiagram-c4efeb88-CzEvDZI5.js +118 -0
  161. package/dist/dashboard/public/assets/brainfuck-C4LP7Hcl.js +1 -0
  162. package/dist/dashboard/public/assets/c4Diagram-c83219d4-CuPd1dkK.js +10 -0
  163. package/dist/dashboard/public/assets/channel-kGGkJUti.js +1 -0
  164. package/dist/dashboard/public/assets/classDiagram-beda092f-CDTLUu9K.js +2 -0
  165. package/dist/dashboard/public/assets/classDiagram-v2-2358418a-BlHqrcgN.js +2 -0
  166. package/dist/dashboard/public/assets/clike-B9uivgTg.js +1 -0
  167. package/dist/dashboard/public/assets/clojure-BMjYHr_A.js +1 -0
  168. package/dist/dashboard/public/assets/clone-CHdfA33T.js +1 -0
  169. package/dist/dashboard/public/assets/cmake-BQqOBYOt.js +1 -0
  170. package/dist/dashboard/public/assets/cobol-CWcv1MsR.js +1 -0
  171. package/dist/dashboard/public/assets/coffeescript-S37ZYGWr.js +1 -0
  172. package/dist/dashboard/public/assets/commonlisp-DBKNyK5s.js +1 -0
  173. package/dist/dashboard/public/assets/createText-1719965b-B3cTooQ1.js +7 -0
  174. package/dist/dashboard/public/assets/crystal-SjHAIU92.js +1 -0
  175. package/dist/dashboard/public/assets/css-BnMrqG3P.js +1 -0
  176. package/dist/dashboard/public/assets/cypher-C_CwsFkJ.js +1 -0
  177. package/dist/dashboard/public/assets/d-pRatUO7H.js +1 -0
  178. package/dist/dashboard/public/assets/diff-DbItnlRl.js +1 -0
  179. package/dist/dashboard/public/assets/dockerfile-BKs6k2Af.js +1 -0
  180. package/dist/dashboard/public/assets/dtd-DF_7sFjM.js +1 -0
  181. package/dist/dashboard/public/assets/dylan-DwRh75JA.js +1 -0
  182. package/dist/dashboard/public/assets/ebnf-CDyGwa7X.js +1 -0
  183. package/dist/dashboard/public/assets/ecl-Cabwm37j.js +1 -0
  184. package/dist/dashboard/public/assets/edges-96097737-CbHatH6o.js +4 -0
  185. package/dist/dashboard/public/assets/eiffel-CnydiIhH.js +1 -0
  186. package/dist/dashboard/public/assets/elm-vLlmbW-K.js +1 -0
  187. package/dist/dashboard/public/assets/erDiagram-0228fc6a-MYCicRH6.js +51 -0
  188. package/dist/dashboard/public/assets/erlang-BNw1qcRV.js +1 -0
  189. package/dist/dashboard/public/assets/factor-kuTfRLto.js +1 -0
  190. package/dist/dashboard/public/assets/fcl-Kvtd6kyn.js +1 -0
  191. package/dist/dashboard/public/assets/flowDb-c6c81e3f-DDm9aBGx.js +10 -0
  192. package/dist/dashboard/public/assets/flowDiagram-50d868cf-zb-JtJG0.js +4 -0
  193. package/dist/dashboard/public/assets/flowDiagram-v2-4f6560a1-DRD7GAtr.js +1 -0
  194. package/dist/dashboard/public/assets/flowchart-elk-definition-6af322e1-D5TGPnG-.js +139 -0
  195. package/dist/dashboard/public/assets/forth-Ffai-XNe.js +1 -0
  196. package/dist/dashboard/public/assets/fortran-DYz_wnZ1.js +1 -0
  197. package/dist/dashboard/public/assets/ganttDiagram-a2739b55-Cqst4HhR.js +257 -0
  198. package/dist/dashboard/public/assets/gas-Bneqetm1.js +1 -0
  199. package/dist/dashboard/public/assets/gherkin-heZmZLOM.js +1 -0
  200. package/dist/dashboard/public/assets/gitGraphDiagram-82fe8481-C8JWqtTx.js +70 -0
  201. package/dist/dashboard/public/assets/graph-Lpyd8dqZ.js +1 -0
  202. package/dist/dashboard/public/assets/groovy-D9Dt4D0W.js +1 -0
  203. package/dist/dashboard/public/assets/haskell-Cw1EW3IL.js +1 -0
  204. package/dist/dashboard/public/assets/haxe-H-WmDvRZ.js +1 -0
  205. package/dist/dashboard/public/assets/http-DBlCnlav.js +1 -0
  206. package/dist/dashboard/public/assets/idl-BEugSyMb.js +1 -0
  207. package/dist/dashboard/public/assets/index--_-9KDkB.js +1 -0
  208. package/dist/dashboard/public/assets/index-5325376f-Ngqm3jj1.js +1 -0
  209. package/dist/dashboard/public/assets/index-7POr4IQt.js +1 -0
  210. package/dist/dashboard/public/assets/index-B2wloU4M.js +7 -0
  211. package/dist/dashboard/public/assets/index-BB9i8dPx.js +329 -0
  212. package/dist/dashboard/public/assets/index-BHCmvfMN.js +1 -0
  213. package/dist/dashboard/public/assets/index-BWvyG2sq.js +1 -0
  214. package/dist/dashboard/public/assets/index-BhwV70vC.js +2 -0
  215. package/dist/dashboard/public/assets/index-Bqk8CAAy.js +1 -0
  216. package/dist/dashboard/public/assets/index-CUP35nar.js +1 -0
  217. package/dist/dashboard/public/assets/index-CYy3mVaI.js +1 -0
  218. package/dist/dashboard/public/assets/index-Cqbzr5qD.js +3 -0
  219. package/dist/dashboard/public/assets/index-Cv_FT1Rp.css +1 -0
  220. package/dist/dashboard/public/assets/index-D4J257wx.js +1 -0
  221. package/dist/dashboard/public/assets/index-D9fDAa7f.js +1 -0
  222. package/dist/dashboard/public/assets/index-DFN4bEYo.js +1 -0
  223. package/dist/dashboard/public/assets/index-DQ2Aap_e.js +1 -0
  224. package/dist/dashboard/public/assets/index-Djo38KZb.js +1 -0
  225. package/dist/dashboard/public/assets/index-RZXsuDxo.js +1 -0
  226. package/dist/dashboard/public/assets/index-m5SRqxVX.js +1 -0
  227. package/dist/dashboard/public/assets/infoDiagram-8eee0895-DYMb32US.js +7 -0
  228. package/dist/dashboard/public/assets/init-Gi6I4Gst.js +1 -0
  229. package/dist/dashboard/public/assets/javascript-iXu5QeM3.js +1 -0
  230. package/dist/dashboard/public/assets/journeyDiagram-c64418c1-BgL0JuAb.js +139 -0
  231. package/dist/dashboard/public/assets/julia-DuME0IfC.js +1 -0
  232. package/dist/dashboard/public/assets/katex-XbL3y5x-.js +261 -0
  233. package/dist/dashboard/public/assets/layout-DP9fJAz2.js +1 -0
  234. package/dist/dashboard/public/assets/line-N_NGiB5u.js +1 -0
  235. package/dist/dashboard/public/assets/linear-B1Bl-FQE.js +1 -0
  236. package/dist/dashboard/public/assets/livescript-BwQOo05w.js +1 -0
  237. package/dist/dashboard/public/assets/lua-BgMRiT3U.js +1 -0
  238. package/dist/dashboard/public/assets/mathematica-DTrFuWx2.js +1 -0
  239. package/dist/dashboard/public/assets/mbox-CNhZ1qSd.js +1 -0
  240. package/dist/dashboard/public/assets/mindmap-definition-8da855dc-DuejFf1j.js +415 -0
  241. package/dist/dashboard/public/assets/mirc-CjQqDB4T.js +1 -0
  242. package/dist/dashboard/public/assets/mllike-CXdrOF99.js +1 -0
  243. package/dist/dashboard/public/assets/modelica-Dc1JOy9r.js +1 -0
  244. package/dist/dashboard/public/assets/mscgen-BA5vi2Kp.js +1 -0
  245. package/dist/dashboard/public/assets/mumps-BT43cFF4.js +1 -0
  246. package/dist/dashboard/public/assets/nginx-DdIZxoE0.js +1 -0
  247. package/dist/dashboard/public/assets/nsis-LdVXkNf5.js +1 -0
  248. package/dist/dashboard/public/assets/ntriples-BfvgReVJ.js +1 -0
  249. package/dist/dashboard/public/assets/octave-Ck1zUtKM.js +1 -0
  250. package/dist/dashboard/public/assets/ordinal-Cboi1Yqb.js +1 -0
  251. package/dist/dashboard/public/assets/oz-BzwKVEFT.js +1 -0
  252. package/dist/dashboard/public/assets/pascal--L3eBynH.js +1 -0
  253. package/dist/dashboard/public/assets/path-CbwjOpE9.js +1 -0
  254. package/dist/dashboard/public/assets/perl-CdXCOZ3F.js +1 -0
  255. package/dist/dashboard/public/assets/pieDiagram-a8764435-fJ2uKW1i.js +35 -0
  256. package/dist/dashboard/public/assets/pig-CevX1Tat.js +1 -0
  257. package/dist/dashboard/public/assets/powershell-CFHJl5sT.js +1 -0
  258. package/dist/dashboard/public/assets/properties-C78fOPTZ.js +1 -0
  259. package/dist/dashboard/public/assets/protobuf-ChK-085T.js +1 -0
  260. package/dist/dashboard/public/assets/pug-DeIclll2.js +1 -0
  261. package/dist/dashboard/public/assets/puppet-DMA9R1ak.js +1 -0
  262. package/dist/dashboard/public/assets/python-BuPzkPfP.js +1 -0
  263. package/dist/dashboard/public/assets/q-pXgVlZs6.js +1 -0
  264. package/dist/dashboard/public/assets/quadrantDiagram-1e28029f-Dowa1iq5.js +7 -0
  265. package/dist/dashboard/public/assets/r-B6wPVr8A.js +1 -0
  266. package/dist/dashboard/public/assets/requirementDiagram-08caed73-1PKeJnUu.js +52 -0
  267. package/dist/dashboard/public/assets/rpm-CTu-6PCP.js +1 -0
  268. package/dist/dashboard/public/assets/ruby-B2Rjki9n.js +1 -0
  269. package/dist/dashboard/public/assets/sankeyDiagram-a04cb91d-C3Nu91E8.js +8 -0
  270. package/dist/dashboard/public/assets/sas-B4kiWyti.js +1 -0
  271. package/dist/dashboard/public/assets/scheme-C41bIUwD.js +1 -0
  272. package/dist/dashboard/public/assets/sequenceDiagram-c5b8d532-BbyYeaFb.js +122 -0
  273. package/dist/dashboard/public/assets/shell-CjFT_Tl9.js +1 -0
  274. package/dist/dashboard/public/assets/sieve-C3Gn_uJK.js +1 -0
  275. package/dist/dashboard/public/assets/simple-mode-GW_nhZxv.js +1 -0
  276. package/dist/dashboard/public/assets/smalltalk-CnHTOXQT.js +1 -0
  277. package/dist/dashboard/public/assets/solr-DehyRSwq.js +1 -0
  278. package/dist/dashboard/public/assets/sparql-DkYu6x3z.js +1 -0
  279. package/dist/dashboard/public/assets/spreadsheet-BCZA_wO0.js +1 -0
  280. package/dist/dashboard/public/assets/sql-D0XecflT.js +1 -0
  281. package/dist/dashboard/public/assets/stateDiagram-1ecb1508-BVkb4gIE.js +1 -0
  282. package/dist/dashboard/public/assets/stateDiagram-v2-c2b004d7-Bm7qug6Q.js +1 -0
  283. package/dist/dashboard/public/assets/stex-C3f8Ysf7.js +1 -0
  284. package/dist/dashboard/public/assets/styles-b4e223ce-BuqydlKk.js +160 -0
  285. package/dist/dashboard/public/assets/styles-ca3715f6-C8L7peEM.js +207 -0
  286. package/dist/dashboard/public/assets/styles-d45a18b0-BbrCCPkQ.js +116 -0
  287. package/dist/dashboard/public/assets/stylus-B533Al4x.js +1 -0
  288. package/dist/dashboard/public/assets/svgDrawCommon-b86b1483-DQZAHvSt.js +1 -0
  289. package/dist/dashboard/public/assets/swift-BzpIVaGY.js +1 -0
  290. package/dist/dashboard/public/assets/tcl-DVfN8rqt.js +1 -0
  291. package/dist/dashboard/public/assets/textile-CnDTJFAw.js +1 -0
  292. package/dist/dashboard/public/assets/tiddlywiki-DO-Gjzrf.js +1 -0
  293. package/dist/dashboard/public/assets/tiki-DGYXhP31.js +1 -0
  294. package/dist/dashboard/public/assets/timeline-definition-faaaa080-YPoIuE--.js +61 -0
  295. package/dist/dashboard/public/assets/toml-Bm5Em-hy.js +1 -0
  296. package/dist/dashboard/public/assets/troff-wAsdV37c.js +1 -0
  297. package/dist/dashboard/public/assets/ttcn-CfJYG6tj.js +1 -0
  298. package/dist/dashboard/public/assets/ttcn-cfg-B9xdYoR4.js +1 -0
  299. package/dist/dashboard/public/assets/turtle-B1tBg_DP.js +1 -0
  300. package/dist/dashboard/public/assets/vb-CmGdzxic.js +1 -0
  301. package/dist/dashboard/public/assets/vbscript-BuJXcnF6.js +1 -0
  302. package/dist/dashboard/public/assets/velocity-D8B20fx6.js +1 -0
  303. package/dist/dashboard/public/assets/verilog-C6RDOZhf.js +1 -0
  304. package/dist/dashboard/public/assets/vhdl-lSbBsy5d.js +1 -0
  305. package/dist/dashboard/public/assets/webidl-ZXfAyPTL.js +1 -0
  306. package/dist/dashboard/public/assets/xquery-DzFWVndE.js +1 -0
  307. package/dist/dashboard/public/assets/xychartDiagram-f5964ef8-BnI4pVWV.js +7 -0
  308. package/dist/dashboard/public/assets/yacas-BJ4BC0dw.js +1 -0
  309. package/dist/dashboard/public/assets/z80-Hz9HOZM7.js +1 -0
  310. package/dist/dashboard/public/claude-icon-dark.svg +1 -0
  311. package/dist/dashboard/public/claude-icon.svg +1 -0
  312. package/dist/dashboard/public/index.html +16 -0
  313. package/dist/dashboard/settings-manager.d.ts +47 -0
  314. package/dist/dashboard/settings-manager.d.ts.map +1 -0
  315. package/dist/dashboard/settings-manager.js +180 -0
  316. package/dist/dashboard/settings-manager.js.map +1 -0
  317. package/dist/dashboard/utils.d.ts +31 -0
  318. package/dist/dashboard/utils.d.ts.map +1 -0
  319. package/dist/dashboard/utils.js +102 -0
  320. package/dist/dashboard/utils.js.map +1 -0
  321. package/dist/dashboard/watcher.d.ts +32 -0
  322. package/dist/dashboard/watcher.d.ts.map +1 -0
  323. package/dist/dashboard/watcher.js +173 -0
  324. package/dist/dashboard/watcher.js.map +1 -0
  325. package/dist/index.d.ts +13 -0
  326. package/dist/index.d.ts.map +1 -0
  327. package/dist/index.js +380 -0
  328. package/dist/index.js.map +1 -0
  329. package/dist/markdown/templates/code-quality-reviewer-template.md +76 -0
  330. package/dist/markdown/templates/design-template.md +141 -0
  331. package/dist/markdown/templates/implementer-prompt-template.md +122 -0
  332. package/dist/markdown/templates/product-template.md +51 -0
  333. package/dist/markdown/templates/requirements-template.md +73 -0
  334. package/dist/markdown/templates/spec-reviewer-template.md +58 -0
  335. package/dist/markdown/templates/structure-template.md +145 -0
  336. package/dist/markdown/templates/tasks-template.md +182 -0
  337. package/dist/markdown/templates/tech-template.md +99 -0
  338. package/dist/prompts/create-spec.d.ts +3 -0
  339. package/dist/prompts/create-spec.d.ts.map +1 -0
  340. package/dist/prompts/create-spec.js +93 -0
  341. package/dist/prompts/create-spec.js.map +1 -0
  342. package/dist/prompts/create-steering-doc.d.ts +3 -0
  343. package/dist/prompts/create-steering-doc.d.ts.map +1 -0
  344. package/dist/prompts/create-steering-doc.js +73 -0
  345. package/dist/prompts/create-steering-doc.js.map +1 -0
  346. package/dist/prompts/implement-task.d.ts +3 -0
  347. package/dist/prompts/implement-task.d.ts.map +1 -0
  348. package/dist/prompts/implement-task.js +189 -0
  349. package/dist/prompts/implement-task.js.map +1 -0
  350. package/dist/prompts/index.d.ts +15 -0
  351. package/dist/prompts/index.d.ts.map +1 -0
  352. package/dist/prompts/index.js +49 -0
  353. package/dist/prompts/index.js.map +1 -0
  354. package/dist/prompts/inject-spec-workflow-guide.d.ts +3 -0
  355. package/dist/prompts/inject-spec-workflow-guide.d.ts.map +1 -0
  356. package/dist/prompts/inject-spec-workflow-guide.js +47 -0
  357. package/dist/prompts/inject-spec-workflow-guide.js.map +1 -0
  358. package/dist/prompts/inject-steering-guide.d.ts +3 -0
  359. package/dist/prompts/inject-steering-guide.d.ts.map +1 -0
  360. package/dist/prompts/inject-steering-guide.js +51 -0
  361. package/dist/prompts/inject-steering-guide.js.map +1 -0
  362. package/dist/prompts/refresh-tasks.d.ts +3 -0
  363. package/dist/prompts/refresh-tasks.d.ts.map +1 -0
  364. package/dist/prompts/refresh-tasks.js +224 -0
  365. package/dist/prompts/refresh-tasks.js.map +1 -0
  366. package/dist/prompts/spec-status.d.ts +3 -0
  367. package/dist/prompts/spec-status.d.ts.map +1 -0
  368. package/dist/prompts/spec-status.js +75 -0
  369. package/dist/prompts/spec-status.js.map +1 -0
  370. package/dist/prompts/types.d.ts +13 -0
  371. package/dist/prompts/types.d.ts.map +1 -0
  372. package/dist/prompts/types.js +2 -0
  373. package/dist/prompts/types.js.map +1 -0
  374. package/dist/server.d.ts +17 -0
  375. package/dist/server.d.ts.map +1 -0
  376. package/dist/server.js +175 -0
  377. package/dist/server.js.map +1 -0
  378. package/dist/tools/__tests__/projectPath.test.d.ts +2 -0
  379. package/dist/tools/__tests__/projectPath.test.d.ts.map +1 -0
  380. package/dist/tools/__tests__/projectPath.test.js +187 -0
  381. package/dist/tools/__tests__/projectPath.test.js.map +1 -0
  382. package/dist/tools/approvals.d.ts +14 -0
  383. package/dist/tools/approvals.d.ts.map +1 -0
  384. package/dist/tools/approvals.js +501 -0
  385. package/dist/tools/approvals.js.map +1 -0
  386. package/dist/tools/index.d.ts +5 -0
  387. package/dist/tools/index.d.ts.map +1 -0
  388. package/dist/tools/index.js +57 -0
  389. package/dist/tools/index.js.map +1 -0
  390. package/dist/tools/log-implementation.d.ts +5 -0
  391. package/dist/tools/log-implementation.d.ts.map +1 -0
  392. package/dist/tools/log-implementation.js +446 -0
  393. package/dist/tools/log-implementation.js.map +1 -0
  394. package/dist/tools/spec-list.d.ts +5 -0
  395. package/dist/tools/spec-list.d.ts.map +1 -0
  396. package/dist/tools/spec-list.js +144 -0
  397. package/dist/tools/spec-list.js.map +1 -0
  398. package/dist/tools/spec-status.d.ts +5 -0
  399. package/dist/tools/spec-status.d.ts.map +1 -0
  400. package/dist/tools/spec-status.js +238 -0
  401. package/dist/tools/spec-status.js.map +1 -0
  402. package/dist/tools/spec-workflow-guide.d.ts +5 -0
  403. package/dist/tools/spec-workflow-guide.d.ts.map +1 -0
  404. package/dist/tools/spec-workflow-guide.js +580 -0
  405. package/dist/tools/spec-workflow-guide.js.map +1 -0
  406. package/dist/tools/steering-guide.d.ts +5 -0
  407. package/dist/tools/steering-guide.d.ts.map +1 -0
  408. package/dist/tools/steering-guide.js +192 -0
  409. package/dist/tools/steering-guide.js.map +1 -0
  410. package/dist/types.d.ts +186 -0
  411. package/dist/types.d.ts.map +1 -0
  412. package/dist/types.js +13 -0
  413. package/dist/types.js.map +1 -0
  414. package/package.json +105 -0
package/dist/index.js ADDED
@@ -0,0 +1,380 @@
1
+ #!/usr/bin/env node
2
+ import { SpecWorkflowMCPServer } from './server.js';
3
+ import { MultiProjectDashboardServer } from './dashboard/multi-server.js';
4
+ import { DashboardSessionManager } from './core/dashboard-session.js';
5
+ import { homedir } from 'os';
6
+ import { resolveGitRoot, resolveGitWorkspaceRoot } from './core/git-utils.js';
7
+ import { resolve } from 'path';
8
+ import { fileURLToPath } from 'url';
9
+ import { realpathSync } from 'fs';
10
+ // Default dashboard port
11
+ const DEFAULT_DASHBOARD_PORT = 5000;
12
+ function showHelp() {
13
+ console.error(`
14
+ SpecFlow — Spec-driven development with persistent project memory
15
+
16
+ USAGE:
17
+ specflow [path] [options]
18
+
19
+ ARGUMENTS:
20
+ path Project path (defaults to current directory)
21
+ Supports ~ for home directory
22
+
23
+ OPTIONS:
24
+ --help Show this help message
25
+ --dashboard Run dashboard-only mode (no MCP server)
26
+ --port <number> Specify dashboard port (1024-65535)
27
+ Default: 5000
28
+ Only use if port 5000 is unavailable
29
+ --no-open Don't automatically open browser when starting dashboard
30
+ Useful in restricted environments where browser launch is blocked
31
+ --no-shared-worktree-specs
32
+ Disable shared .spec-workflow in git worktrees
33
+ Use workspace-local .spec-workflow instead of main repo
34
+
35
+ IMPORTANT:
36
+ Only ONE dashboard instance runs at a time. All MCP servers connect to the
37
+ same dashboard. The dashboard runs on port 5000 by default.
38
+
39
+ MODES OF OPERATION:
40
+
41
+ 1. MCP Server Only (default):
42
+ specflow
43
+ specflow ~/my-project
44
+
45
+ Starts MCP server without dashboard. Dashboard can be started separately.
46
+
47
+ 2. Dashboard Only Mode:
48
+ specflow --dashboard
49
+ specflow --dashboard --port 8080
50
+ specflow --dashboard --no-open
51
+
52
+ Runs only the web dashboard without MCP server (default port: 5000).
53
+ Projects will automatically appear in the dashboard as MCP servers register.
54
+ Only one dashboard instance is needed for all your projects.
55
+ Use --no-open to prevent automatic browser launch (useful in restricted environments).
56
+
57
+ EXAMPLES:
58
+ # Start MCP server in current directory (no dashboard)
59
+ specflow
60
+
61
+ # Start MCP server in a specific project directory
62
+ specflow ~/projects/my-app
63
+
64
+ # Run dashboard (default port 5000) - START THIS FIRST
65
+ specflow --dashboard
66
+
67
+ # Run dashboard on custom port (if 5000 is unavailable)
68
+ specflow --dashboard --port 8080
69
+
70
+ TYPICAL WORKFLOW:
71
+ 1. Start the dashboard once:
72
+ specflow --dashboard
73
+
74
+ 2. Start MCP servers for your projects (in separate terminals):
75
+ specflow ~/project1
76
+ specflow ~/project2
77
+ specflow ~/project3
78
+
79
+ All projects will appear in the same dashboard at http://localhost:5000
80
+
81
+ PARAMETER FORMATS:
82
+ --port 3456 Space-separated format
83
+ --port=3456 Equals format
84
+
85
+ For more information, visit: https://github.com/lbruton/specflow
86
+ `);
87
+ }
88
+ function expandTildePath(path) {
89
+ if (path.startsWith('~/') || path === '~') {
90
+ return path.replace('~', homedir());
91
+ }
92
+ return path;
93
+ }
94
+ export function parseArguments(args) {
95
+ const isDashboardMode = args.includes('--dashboard');
96
+ const noOpen = args.includes('--no-open');
97
+ const noSharedWorktreeSpecs = args.includes('--no-shared-worktree-specs');
98
+ let customPort;
99
+ // Check for invalid flags
100
+ const validFlags = ['--dashboard', '--port', '--help', '-h', '--no-open', '--no-shared-worktree-specs'];
101
+ for (const arg of args) {
102
+ if (arg.startsWith('--') && !arg.includes('=')) {
103
+ if (!validFlags.includes(arg)) {
104
+ throw new Error(`Unknown option: ${arg}\nUse --help to see available options.`);
105
+ }
106
+ }
107
+ else if (arg.startsWith('--') && arg.includes('=')) {
108
+ const flagName = arg.split('=')[0];
109
+ if (!validFlags.includes(flagName)) {
110
+ throw new Error(`Unknown option: ${flagName}\nUse --help to see available options.`);
111
+ }
112
+ }
113
+ }
114
+ // Parse --port parameter (supports --port 3000 and --port=3000 formats)
115
+ for (let i = 0; i < args.length; i++) {
116
+ const arg = args[i];
117
+ if (arg.startsWith('--port=')) {
118
+ // Handle --port=3000 format
119
+ const portStr = arg.split('=')[1];
120
+ if (portStr) {
121
+ const parsed = parseInt(portStr, 10);
122
+ if (isNaN(parsed)) {
123
+ throw new Error(`Invalid port number: ${portStr}. Port must be a number.`);
124
+ }
125
+ if (parsed < 1024 || parsed > 65535) {
126
+ throw new Error(`Port ${parsed} is out of range. Port must be between 1024 and 65535.`);
127
+ }
128
+ customPort = parsed;
129
+ }
130
+ else {
131
+ throw new Error('--port parameter requires a value (e.g., --port=3000)');
132
+ }
133
+ }
134
+ else if (arg === '--port' && i + 1 < args.length) {
135
+ // Handle --port 3000 format
136
+ const portStr = args[i + 1];
137
+ const parsed = parseInt(portStr, 10);
138
+ if (isNaN(parsed)) {
139
+ throw new Error(`Invalid port number: ${portStr}. Port must be a number.`);
140
+ }
141
+ if (parsed < 1024 || parsed > 65535) {
142
+ throw new Error(`Port ${parsed} is out of range. Port must be between 1024 and 65535.`);
143
+ }
144
+ customPort = parsed;
145
+ i++; // Skip the next argument as it's the port value
146
+ }
147
+ else if (arg === '--port') {
148
+ throw new Error('--port parameter requires a value (e.g., --port 3000)');
149
+ }
150
+ }
151
+ // Get project path (filter out flags and their values)
152
+ const filteredArgs = args.filter((arg, index) => {
153
+ if (arg === '--dashboard')
154
+ return false;
155
+ if (arg.startsWith('--port='))
156
+ return false;
157
+ if (arg === '--port')
158
+ return false;
159
+ if (arg === '--no-open')
160
+ return false;
161
+ if (arg === '--no-shared-worktree-specs')
162
+ return false;
163
+ // Check if this arg is a value following --port
164
+ if (index > 0 && args[index - 1] === '--port')
165
+ return false;
166
+ return true;
167
+ });
168
+ // For dashboard-only mode, use cwd as default (dashboard doesn't need it)
169
+ const rawProjectPath = filteredArgs[0] || process.cwd();
170
+ const expandedPath = expandTildePath(rawProjectPath);
171
+ const workspacePath = resolveGitWorkspaceRoot(expandedPath);
172
+ const workflowRootPath = noSharedWorktreeSpecs ? workspacePath : resolveGitRoot(workspacePath);
173
+ // Warn if no explicit path was provided and we're using cwd (but only for MCP server mode)
174
+ if (!filteredArgs[0] && !isDashboardMode) {
175
+ console.warn(`Warning: No project path specified, using current directory: ${workspacePath}`);
176
+ console.warn('Consider specifying an explicit path for better clarity.');
177
+ }
178
+ return {
179
+ workspacePath,
180
+ workflowRootPath,
181
+ expandedPath,
182
+ isDashboardMode,
183
+ noSharedWorktreeSpecs,
184
+ port: customPort,
185
+ lang: undefined,
186
+ noOpen
187
+ };
188
+ }
189
+ async function main() {
190
+ try {
191
+ const args = process.argv.slice(2);
192
+ // Check for help flag
193
+ if (args.includes('--help') || args.includes('-h')) {
194
+ showHelp();
195
+ process.exit(0);
196
+ }
197
+ // Parse command-line arguments
198
+ const cliArgs = parseArguments(args);
199
+ const workspacePath = cliArgs.workspacePath;
200
+ const workflowRootPath = cliArgs.workflowRootPath;
201
+ const noSharedWorktreeSpecs = cliArgs.noSharedWorktreeSpecs;
202
+ // Log worktree details when workspace and shared workflow roots differ
203
+ if (workspacePath !== workflowRootPath) {
204
+ console.error('Git worktree detected.');
205
+ console.error(`workspacePath=${workspacePath}`);
206
+ console.error(`workflowRootPath=${workflowRootPath}`);
207
+ }
208
+ else if (noSharedWorktreeSpecs) {
209
+ console.error('Shared worktree specs disabled. Using workspace-local .spec-workflow.');
210
+ console.error(`workspacePath=${workspacePath}`);
211
+ }
212
+ // Apply configuration from CLI args
213
+ const isDashboardMode = cliArgs.isDashboardMode || false;
214
+ const port = cliArgs.port;
215
+ const lang = cliArgs.lang;
216
+ const noOpen = cliArgs.noOpen || false;
217
+ if (isDashboardMode) {
218
+ // Check if a dashboard is already running (always check, regardless of port)
219
+ const sessionManager = new DashboardSessionManager();
220
+ const existingSession = await sessionManager.getDashboardSession();
221
+ if (existingSession) {
222
+ console.error(`Dashboard is already running at: ${existingSession.url}`);
223
+ console.error('');
224
+ console.error('You can:');
225
+ console.error(` 1. Use the existing dashboard at: ${existingSession.url}`);
226
+ console.error(` 2. Stop it first (Ctrl+C or kill ${existingSession.pid}), then start a new one`);
227
+ console.error('');
228
+ console.error('Note: Only one dashboard instance is needed for all your projects.');
229
+ process.exit(1);
230
+ }
231
+ // Use specified port or default
232
+ const dashboardPort = port || DEFAULT_DASHBOARD_PORT;
233
+ // Dashboard only mode - use new multi-project dashboard
234
+ console.error(`Starting Unified Multi-Project Dashboard`);
235
+ if (port) {
236
+ console.error(`Using custom port: ${port}`);
237
+ }
238
+ else {
239
+ console.error(`Using default port: ${DEFAULT_DASHBOARD_PORT}`);
240
+ }
241
+ if (noOpen) {
242
+ console.error(`Browser auto-open disabled (--no-open)`);
243
+ }
244
+ // Load configuration from environment variables
245
+ let bindAddress;
246
+ let allowExternalAccess;
247
+ const securityConfig = {};
248
+ // Network binding configuration
249
+ if (process.env.SPEC_WORKFLOW_BIND_ADDRESS) {
250
+ bindAddress = process.env.SPEC_WORKFLOW_BIND_ADDRESS;
251
+ }
252
+ // External access opt-in (only override if explicitly set to true or false)
253
+ if (process.env.SPEC_WORKFLOW_ALLOW_EXTERNAL_ACCESS !== undefined) {
254
+ const allowExternal = process.env.SPEC_WORKFLOW_ALLOW_EXTERNAL_ACCESS.toLowerCase();
255
+ if (allowExternal === 'true') {
256
+ allowExternalAccess = true;
257
+ }
258
+ else if (allowExternal === 'false') {
259
+ allowExternalAccess = false;
260
+ }
261
+ // If invalid value, ignore and use default
262
+ }
263
+ // Security features configuration
264
+ // Rate limiting toggle (only override if explicitly set to true or false)
265
+ if (process.env.SPEC_WORKFLOW_RATE_LIMIT_ENABLED !== undefined) {
266
+ const rateLimitEnabled = process.env.SPEC_WORKFLOW_RATE_LIMIT_ENABLED.toLowerCase();
267
+ if (rateLimitEnabled === 'true') {
268
+ securityConfig.rateLimitEnabled = true;
269
+ }
270
+ else if (rateLimitEnabled === 'false') {
271
+ securityConfig.rateLimitEnabled = false;
272
+ }
273
+ // If invalid value, ignore and use default
274
+ }
275
+ // CORS toggle (only override if explicitly set to true or false)
276
+ if (process.env.SPEC_WORKFLOW_CORS_ENABLED !== undefined) {
277
+ const corsEnabled = process.env.SPEC_WORKFLOW_CORS_ENABLED.toLowerCase();
278
+ if (corsEnabled === 'true') {
279
+ securityConfig.corsEnabled = true;
280
+ }
281
+ else if (corsEnabled === 'false') {
282
+ securityConfig.corsEnabled = false;
283
+ }
284
+ // If invalid value, ignore and use default
285
+ }
286
+ // Create dashboard server (network binding validation happens in constructor)
287
+ let dashboardServer;
288
+ try {
289
+ dashboardServer = new MultiProjectDashboardServer({
290
+ autoOpen: !noOpen,
291
+ port: dashboardPort,
292
+ bindAddress,
293
+ allowExternalAccess,
294
+ security: securityConfig
295
+ });
296
+ }
297
+ catch (error) {
298
+ // Provide user-friendly error message with environment variable names
299
+ if (error.message.includes('SECURITY ERROR') || error.message.includes('non-localhost')) {
300
+ console.error('');
301
+ console.error('❌ Security Configuration Error:');
302
+ console.error(error.message);
303
+ console.error('');
304
+ console.error('To fix this, either:');
305
+ console.error(' 1. Use localhost binding (secure):');
306
+ console.error(' export SPEC_WORKFLOW_BIND_ADDRESS=127.0.0.1');
307
+ console.error('');
308
+ console.error(' 2. Explicitly allow external access (insecure):');
309
+ console.error(' export SPEC_WORKFLOW_ALLOW_EXTERNAL_ACCESS=true');
310
+ console.error('');
311
+ process.exit(1);
312
+ }
313
+ throw error; // Re-throw other errors
314
+ }
315
+ try {
316
+ const dashboardUrl = await dashboardServer.start();
317
+ console.error(`Dashboard started at: ${dashboardUrl}`);
318
+ console.error('Projects will automatically appear as MCP servers register.');
319
+ console.error('Press Ctrl+C to stop the dashboard');
320
+ }
321
+ catch (error) {
322
+ console.error(`Failed to start dashboard: ${error.message}`);
323
+ process.exit(1);
324
+ }
325
+ // Handle graceful shutdown
326
+ const shutdown = async () => {
327
+ console.error('\nShutting down dashboard...');
328
+ await dashboardServer.stop();
329
+ process.exit(0);
330
+ };
331
+ process.on('SIGINT', shutdown);
332
+ process.on('SIGTERM', shutdown);
333
+ }
334
+ else {
335
+ // MCP server mode
336
+ console.error(`Starting Spec Workflow MCP Server for project: ${workflowRootPath}`);
337
+ console.error(`Workspace path: ${workspacePath}`);
338
+ console.error(`Working directory: ${process.cwd()}`);
339
+ const server = new SpecWorkflowMCPServer();
340
+ await server.initialize(workflowRootPath, workspacePath, lang);
341
+ // Handle graceful shutdown
342
+ process.on('SIGINT', async () => {
343
+ await server.stop();
344
+ process.exit(0);
345
+ });
346
+ process.on('SIGTERM', async () => {
347
+ await server.stop();
348
+ process.exit(0);
349
+ });
350
+ }
351
+ }
352
+ catch (error) {
353
+ console.error('Error:', error.message);
354
+ // Provide additional context for common path-related issues
355
+ if (error.message.includes('ENOENT') || error.message.includes('path') || error.message.includes('directory')) {
356
+ console.error('\nProject path troubleshooting:');
357
+ console.error('- Verify the project path exists and is accessible');
358
+ console.error('- For Claude CLI users, ensure you used: claude mcp add spec-workflow npx -y @pimzino/spec-workflow-mcp@latest -- /path/to/your/project');
359
+ console.error('- Check that the path doesn\'t contain special characters that need escaping');
360
+ console.error(`- Current working directory: ${process.cwd()}`);
361
+ }
362
+ process.exit(1);
363
+ }
364
+ }
365
+ export function resolveEntrypoint(pathValue) {
366
+ if (!pathValue)
367
+ return undefined;
368
+ try {
369
+ return realpathSync(pathValue);
370
+ }
371
+ catch {
372
+ return resolve(pathValue);
373
+ }
374
+ }
375
+ const entrypoint = resolveEntrypoint(process.argv[1]);
376
+ const currentFile = resolveEntrypoint(fileURLToPath(import.meta.url));
377
+ if (entrypoint && currentFile && currentFile === entrypoint) {
378
+ main().catch(() => process.exit(1));
379
+ }
380
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ # Code Quality Reviewer
2
+
3
+ You are reviewing code changes for production readiness. Only dispatch this review AFTER spec compliance has passed.
4
+
5
+ ## What Was Implemented
6
+
7
+ {DESCRIPTION}
8
+
9
+ ## Git Range to Review
10
+
11
+ ```bash
12
+ git diff --stat {BASE_SHA}..{HEAD_SHA}
13
+ git diff {BASE_SHA}..{HEAD_SHA}
14
+ ```
15
+
16
+ ## Review Checklist
17
+
18
+ **Code Quality:**
19
+ - Clean separation of concerns?
20
+ - Proper error handling?
21
+ - Type safety (if applicable)?
22
+ - DRY principle followed?
23
+ - Edge cases handled?
24
+
25
+ **Architecture:**
26
+ - Sound design decisions?
27
+ - Scalability considerations?
28
+ - Performance implications?
29
+ - Security concerns?
30
+
31
+ **Testing:**
32
+ - Tests actually test logic (not just mocks)?
33
+ - Edge cases covered?
34
+ - Integration tests where needed?
35
+ - All tests passing?
36
+ - Test execution results logged in implementation artifacts? (name, status, pass/fail counts)
37
+ - Tests linked to user stories from spec requirements?
38
+
39
+ **Requirements:**
40
+ - All plan requirements met?
41
+ - Implementation matches spec?
42
+ - No scope creep?
43
+ - Breaking changes documented?
44
+
45
+ **Production Readiness:**
46
+ - Backward compatibility considered?
47
+ - Documentation complete?
48
+ - No obvious bugs?
49
+
50
+ ## Output Format
51
+
52
+ ### Strengths
53
+ [What's well done? Be specific with file:line references.]
54
+
55
+ ### Issues
56
+
57
+ #### Critical (Must Fix)
58
+ [Bugs, security issues, data loss risks, broken functionality]
59
+
60
+ #### Important (Should Fix)
61
+ [Architecture problems, missing features, poor error handling, test gaps]
62
+
63
+ #### Minor (Nice to Have)
64
+ [Code style, optimization opportunities, documentation improvements]
65
+
66
+ **For each issue:**
67
+ - File:line reference
68
+ - What's wrong
69
+ - Why it matters
70
+ - How to fix (if not obvious)
71
+
72
+ ### Assessment
73
+
74
+ **Ready to proceed?** [Yes / No / With fixes]
75
+
76
+ **Reasoning:** [1-2 sentence technical assessment]
@@ -0,0 +1,141 @@
1
+ # Design Document
2
+
3
+ ## References
4
+
5
+ - **Issue:** PROJ-XXX
6
+ - **GitHub PR:** [#NNN](https://github.com/owner/repo/pull/NNN)
7
+ - **Spec Path:** `.spec-workflow/specs/{spec-name}/`
8
+
9
+ ## Overview
10
+
11
+ [High-level description of the feature and its place in the overall system]
12
+
13
+ ## Steering Document Alignment
14
+
15
+ ### Technical Standards (tech.md)
16
+ [How the design follows documented technical patterns and standards]
17
+
18
+ ### Project Structure (structure.md)
19
+ [How the implementation will follow project organization conventions]
20
+
21
+ ## Code Reuse Analysis
22
+ [What existing code will be leveraged, extended, or integrated with this feature]
23
+
24
+ ### Existing Components to Leverage
25
+ - **[Component/Utility Name]**: [How it will be used]
26
+ - **[Service/Helper Name]**: [How it will be extended]
27
+
28
+ ### Integration Points
29
+ - **[Existing System/API]**: [How the new feature will integrate]
30
+ - **[Database/Storage]**: [How data will connect to existing schemas]
31
+
32
+ ## Architecture
33
+
34
+ [Describe the overall architecture and design patterns used]
35
+
36
+ ### Modular Design Principles
37
+ - **Single File Responsibility**: Each file should handle one specific concern or domain
38
+ - **Component Isolation**: Create small, focused components rather than large monolithic files
39
+ - **Service Layer Separation**: Separate data access, business logic, and presentation layers
40
+ - **Utility Modularity**: Break utilities into focused, single-purpose modules
41
+
42
+ ```mermaid
43
+ graph TD
44
+ A[Component A] --> B[Component B]
45
+ B --> C[Component C]
46
+ ```
47
+
48
+ ## Components and Interfaces
49
+
50
+ ### Component 1
51
+ - **Purpose:** [What this component does]
52
+ - **Interfaces:** [Public methods/APIs]
53
+ - **Dependencies:** [What it depends on]
54
+ - **Reuses:** [Existing components/utilities it builds upon]
55
+
56
+ ### Component 2
57
+ - **Purpose:** [What this component does]
58
+ - **Interfaces:** [Public methods/APIs]
59
+ - **Dependencies:** [What it depends on]
60
+ - **Reuses:** [Existing components/utilities it builds upon]
61
+
62
+ ## Data Models
63
+
64
+ ### Model 1
65
+ ```
66
+ [Define the structure of Model1 in your language]
67
+ - id: [unique identifier type]
68
+ - name: [string/text type]
69
+ - [Additional properties as needed]
70
+ ```
71
+
72
+ ### Model 2
73
+ ```
74
+ [Define the structure of Model2 in your language]
75
+ - id: [unique identifier type]
76
+ - [Additional properties as needed]
77
+ ```
78
+
79
+ ## UI Impact Assessment
80
+
81
+ ### Has UI Changes: [Yes / No]
82
+
83
+ _If **No**, skip this section entirely. If **Yes**, complete all fields below — this gates Phase 4._
84
+
85
+ ### Visual Scope
86
+ - **Impact Level:** [New screen / New modal or panel / Redesign existing component / Minor element additions]
87
+ - **Components Affected:** [List every UI component this spec creates or modifies]
88
+ - **Prototype Required:** [Yes — if 3+ data elements, new layout, or uncertain visual hierarchy / No — single-element additions with clear analogues]
89
+
90
+ ### Prototype Artifacts
91
+ - **Stitch Screen IDs:** [To be filled during prototype phase — leave blank in design doc]
92
+ - **Playground File:** [To be filled during prototype phase — leave blank in design doc]
93
+ - **Reference HTML/Mockup:** [Path to any existing prototype, mockup, or reference HTML provided with the spec]
94
+
95
+ ### Design Constraints
96
+ - **Theme Compatibility:** [Must work in: light / dark / sepia / all]
97
+ - **Existing Patterns to Match:** [Name specific existing components whose visual style this should follow]
98
+ - **Responsive Behavior:** [How this renders on mobile / tablet / desktop]
99
+
100
+ ### Visual Approval Gate
101
+ > **BLOCKING:** If `Prototype Required` is **Yes**, no UI implementation task may begin until:
102
+ > 1. A Stitch mockup or equivalent visual is created and reviewed
103
+ > 2. A Playground prototype (or reference HTML) is interactively approved by the user
104
+ > 3. Both artifact paths are filled in above
105
+ >
106
+ > This gate is enforced in Phase 4 — the orchestrator MUST check this section before dispatching any task tagged with `ui:true`.
107
+
108
+ ## Open Questions
109
+
110
+ > **GATE:** All blocking questions must be resolved before this document can be approved.
111
+ > Questions carried from Requirements should be resolved here.
112
+
113
+ ### Blocking (must resolve before approval)
114
+
115
+ - [ ] [Question — why it matters]
116
+
117
+ ### Resolved
118
+
119
+ - [x] ~~[Question]~~ — [Answer, source]
120
+
121
+ ## Error Handling
122
+
123
+ ### Error Scenarios
124
+ 1. **Scenario 1:** [Description]
125
+ - **Handling:** [How to handle]
126
+ - **User Impact:** [What user sees]
127
+
128
+ 2. **Scenario 2:** [Description]
129
+ - **Handling:** [How to handle]
130
+ - **User Impact:** [What user sees]
131
+
132
+ ## Testing Strategy
133
+
134
+ ### Runbook E2E Tests (Primary)
135
+ - Identify affected `tests/runbook/` section(s): [01-page-load, 02-crud, 03-backup-restore, 04-import-export, 05-market, 06-ui-ux, 07-activity-log, 08-spot-prices]
136
+ - New test blocks to write (TDD — before implementation): [describe tests]
137
+ - Run via `/bb-test sections=NN` against PR preview URL
138
+
139
+ ### Manual Verification
140
+ - [Any flows that require manual testing, e.g., OAuth/Dropbox cloud sync at beta.staktrakr.com]
141
+ - [Flows requiring API keys from Infisical]