@arimakouyou/spec-workflow-mcp 2.2.7

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 (472) hide show
  1. package/.claude-plugin/.mcp.json +8 -0
  2. package/.claude-plugin/agents/code-simplifier.md +80 -0
  3. package/.claude-plugin/agents/integ-test-auditor.md +91 -0
  4. package/.claude-plugin/agents/integ-test-worker.md +73 -0
  5. package/.claude-plugin/agents/parallel-worker.md +136 -0
  6. package/.claude-plugin/agents/review-worker.md +279 -0
  7. package/.claude-plugin/agents/unit-test-engineer.md +148 -0
  8. package/.claude-plugin/agents/wave-harness-worker.md +158 -0
  9. package/.claude-plugin/hooks/hooks.json +16 -0
  10. package/.claude-plugin/hooks/tasks-read-guard.sh +17 -0
  11. package/.claude-plugin/marketplace.json +33 -0
  12. package/.claude-plugin/plugin.json +11 -0
  13. package/.claude-plugin/rules/axum.md +154 -0
  14. package/.claude-plugin/rules/cargo-toml.md +63 -0
  15. package/.claude-plugin/rules/context7.md +17 -0
  16. package/.claude-plugin/rules/design-conformance.md +82 -0
  17. package/.claude-plugin/rules/design-principles.md +53 -0
  18. package/.claude-plugin/rules/diesel.md +176 -0
  19. package/.claude-plugin/rules/feedback-loop.md +33 -0
  20. package/.claude-plugin/rules/leptos.md +319 -0
  21. package/.claude-plugin/rules/project-architecture.md +134 -0
  22. package/.claude-plugin/rules/quality-checks.md +265 -0
  23. package/.claude-plugin/rules/rust-style.md +242 -0
  24. package/.claude-plugin/rules/security.md +67 -0
  25. package/.claude-plugin/rules/spec-workflow-enforcement.md +47 -0
  26. package/.claude-plugin/rules/valkey.md +167 -0
  27. package/.claude-plugin/skills/integration-test/SKILL.md +230 -0
  28. package/.claude-plugin/skills/integration-test/references/auditor-prompt.md +78 -0
  29. package/.claude-plugin/skills/integration-test/references/external-api-mock.md +98 -0
  30. package/.claude-plugin/skills/integration-test/references/fixture-catalog.md +155 -0
  31. package/.claude-plugin/skills/integration-test/references/parallel-execution.md +124 -0
  32. package/.claude-plugin/skills/integration-test/references/quality-gate.md +80 -0
  33. package/.claude-plugin/skills/integration-test/references/test-case-design.md +88 -0
  34. package/.claude-plugin/skills/integration-test/references/test-patterns.md +215 -0
  35. package/.claude-plugin/skills/integration-test/references/whiteboard-template.md +81 -0
  36. package/.claude-plugin/skills/integration-test/references/worker-prompt.md +70 -0
  37. package/.claude-plugin/skills/knowhow-capture/SKILL.md +143 -0
  38. package/.claude-plugin/skills/phase-review-team/SKILL.md +380 -0
  39. package/.claude-plugin/skills/spec-design/SKILL.md +282 -0
  40. package/.claude-plugin/skills/spec-e2e-implement/SKILL.md +259 -0
  41. package/.claude-plugin/skills/spec-impl-code/SKILL.md +101 -0
  42. package/.claude-plugin/skills/spec-impl-review/SKILL.md +115 -0
  43. package/.claude-plugin/skills/spec-impl-test-run/SKILL.md +98 -0
  44. package/.claude-plugin/skills/spec-impl-test-write/SKILL.md +121 -0
  45. package/.claude-plugin/skills/spec-implement/SKILL.md +822 -0
  46. package/.claude-plugin/skills/spec-requirements/SKILL.md +130 -0
  47. package/.claude-plugin/skills/spec-review/SKILL.md +274 -0
  48. package/.claude-plugin/skills/spec-tasks/SKILL.md +372 -0
  49. package/.claude-plugin/skills/spec-test-design/SKILL.md +233 -0
  50. package/.claude-plugin/skills/tdd-skills/SKILL.md +95 -0
  51. package/.claude-plugin/skills/tdd-skills/references/advanced-techniques.md +49 -0
  52. package/.claude-plugin/skills/tdd-skills/references/green-strategies.md +70 -0
  53. package/.claude-plugin/skills/tdd-skills/references/tdd-and-design.md +48 -0
  54. package/.claude-plugin/skills/tdd-skills/references/test-design.md +43 -0
  55. package/.claude-plugin/skills/tdd-skills/references/test-doubles.md +53 -0
  56. package/.claude-plugin/skills/tdd-skills/references/test-patterns.md +40 -0
  57. package/.claude-plugin/skills/tdd-skills-rust/SKILL.md +128 -0
  58. package/.claude-plugin/skills/tdd-skills-rust/references/advanced-techniques.md +205 -0
  59. package/.claude-plugin/skills/tdd-skills-rust/references/green-strategies.md +166 -0
  60. package/.claude-plugin/skills/tdd-skills-rust/references/tdd-and-design.md +215 -0
  61. package/.claude-plugin/skills/tdd-skills-rust/references/test-design.md +128 -0
  62. package/.claude-plugin/skills/tdd-skills-rust/references/test-doubles.md +208 -0
  63. package/.claude-plugin/skills/tdd-skills-rust/references/test-patterns.md +223 -0
  64. package/.claude-plugin/with-dashboard/.mcp.json +8 -0
  65. package/.claude-plugin/with-dashboard/plugin.json +10 -0
  66. package/CHANGELOG.md +1007 -0
  67. package/LICENSE +674 -0
  68. package/README.ja.md +380 -0
  69. package/README.md +437 -0
  70. package/dist/__tests__/config.test.d.ts +2 -0
  71. package/dist/__tests__/config.test.d.ts.map +1 -0
  72. package/dist/__tests__/config.test.js +264 -0
  73. package/dist/__tests__/config.test.js.map +1 -0
  74. package/dist/__tests__/index-args.test.d.ts +2 -0
  75. package/dist/__tests__/index-args.test.d.ts.map +1 -0
  76. package/dist/__tests__/index-args.test.js +43 -0
  77. package/dist/__tests__/index-args.test.js.map +1 -0
  78. package/dist/__tests__/index-entrypoint.test.d.ts +2 -0
  79. package/dist/__tests__/index-entrypoint.test.d.ts.map +1 -0
  80. package/dist/__tests__/index-entrypoint.test.js +23 -0
  81. package/dist/__tests__/index-entrypoint.test.js.map +1 -0
  82. package/dist/config.d.ts +26 -0
  83. package/dist/config.d.ts.map +1 -0
  84. package/dist/config.js +188 -0
  85. package/dist/config.js.map +1 -0
  86. package/dist/core/__tests__/git-utils.test.d.ts +2 -0
  87. package/dist/core/__tests__/git-utils.test.d.ts.map +1 -0
  88. package/dist/core/__tests__/git-utils.test.js +179 -0
  89. package/dist/core/__tests__/git-utils.test.js.map +1 -0
  90. package/dist/core/__tests__/mdx-validator.test.d.ts +2 -0
  91. package/dist/core/__tests__/mdx-validator.test.d.ts.map +1 -0
  92. package/dist/core/__tests__/mdx-validator.test.js +42 -0
  93. package/dist/core/__tests__/mdx-validator.test.js.map +1 -0
  94. package/dist/core/__tests__/path-utils.test.d.ts +2 -0
  95. package/dist/core/__tests__/path-utils.test.d.ts.map +1 -0
  96. package/dist/core/__tests__/path-utils.test.js +342 -0
  97. package/dist/core/__tests__/path-utils.test.js.map +1 -0
  98. package/dist/core/__tests__/project-registry.test.d.ts +2 -0
  99. package/dist/core/__tests__/project-registry.test.d.ts.map +1 -0
  100. package/dist/core/__tests__/project-registry.test.js +62 -0
  101. package/dist/core/__tests__/project-registry.test.js.map +1 -0
  102. package/dist/core/__tests__/security-utils.test.d.ts +2 -0
  103. package/dist/core/__tests__/security-utils.test.d.ts.map +1 -0
  104. package/dist/core/__tests__/security-utils.test.js +657 -0
  105. package/dist/core/__tests__/security-utils.test.js.map +1 -0
  106. package/dist/core/__tests__/task-parser.test.d.ts +2 -0
  107. package/dist/core/__tests__/task-parser.test.d.ts.map +1 -0
  108. package/dist/core/__tests__/task-parser.test.js +222 -0
  109. package/dist/core/__tests__/task-parser.test.js.map +1 -0
  110. package/dist/core/__tests__/task-validator.test.d.ts +2 -0
  111. package/dist/core/__tests__/task-validator.test.d.ts.map +1 -0
  112. package/dist/core/__tests__/task-validator.test.js +308 -0
  113. package/dist/core/__tests__/task-validator.test.js.map +1 -0
  114. package/dist/core/archive-service.d.ts +10 -0
  115. package/dist/core/archive-service.d.ts.map +1 -0
  116. package/dist/core/archive-service.js +99 -0
  117. package/dist/core/archive-service.js.map +1 -0
  118. package/dist/core/dashboard-session.d.ts +49 -0
  119. package/dist/core/dashboard-session.d.ts.map +1 -0
  120. package/dist/core/dashboard-session.js +132 -0
  121. package/dist/core/dashboard-session.js.map +1 -0
  122. package/dist/core/git-utils.d.ts +25 -0
  123. package/dist/core/git-utils.d.ts.map +1 -0
  124. package/dist/core/git-utils.js +87 -0
  125. package/dist/core/git-utils.js.map +1 -0
  126. package/dist/core/global-dir.d.ts +44 -0
  127. package/dist/core/global-dir.d.ts.map +1 -0
  128. package/dist/core/global-dir.js +74 -0
  129. package/dist/core/global-dir.js.map +1 -0
  130. package/dist/core/implementation-log-migrator.d.ts +41 -0
  131. package/dist/core/implementation-log-migrator.d.ts.map +1 -0
  132. package/dist/core/implementation-log-migrator.js +258 -0
  133. package/dist/core/implementation-log-migrator.js.map +1 -0
  134. package/dist/core/mdx-validator.d.ts +14 -0
  135. package/dist/core/mdx-validator.d.ts.map +1 -0
  136. package/dist/core/mdx-validator.js +34 -0
  137. package/dist/core/mdx-validator.js.map +1 -0
  138. package/dist/core/parser.d.ts +11 -0
  139. package/dist/core/parser.d.ts.map +1 -0
  140. package/dist/core/parser.js +128 -0
  141. package/dist/core/parser.js.map +1 -0
  142. package/dist/core/path-utils.d.ts +68 -0
  143. package/dist/core/path-utils.d.ts.map +1 -0
  144. package/dist/core/path-utils.js +302 -0
  145. package/dist/core/path-utils.js.map +1 -0
  146. package/dist/core/project-registry.d.ts +94 -0
  147. package/dist/core/project-registry.d.ts.map +1 -0
  148. package/dist/core/project-registry.js +297 -0
  149. package/dist/core/project-registry.js.map +1 -0
  150. package/dist/core/security-utils.d.ts +99 -0
  151. package/dist/core/security-utils.d.ts.map +1 -0
  152. package/dist/core/security-utils.js +275 -0
  153. package/dist/core/security-utils.js.map +1 -0
  154. package/dist/core/task-parser.d.ts +90 -0
  155. package/dist/core/task-parser.d.ts.map +1 -0
  156. package/dist/core/task-parser.js +477 -0
  157. package/dist/core/task-parser.js.map +1 -0
  158. package/dist/core/task-validator.d.ts +37 -0
  159. package/dist/core/task-validator.d.ts.map +1 -0
  160. package/dist/core/task-validator.js +499 -0
  161. package/dist/core/task-validator.js.map +1 -0
  162. package/dist/core/workspace-initializer.d.ts +16 -0
  163. package/dist/core/workspace-initializer.d.ts.map +1 -0
  164. package/dist/core/workspace-initializer.js +168 -0
  165. package/dist/core/workspace-initializer.js.map +1 -0
  166. package/dist/dashboard/__tests__/approval-storage-path-resolution.test.d.ts +2 -0
  167. package/dist/dashboard/__tests__/approval-storage-path-resolution.test.d.ts.map +1 -0
  168. package/dist/dashboard/__tests__/approval-storage-path-resolution.test.js +78 -0
  169. package/dist/dashboard/__tests__/approval-storage-path-resolution.test.js.map +1 -0
  170. package/dist/dashboard/__tests__/multi-server-approvals-content.test.d.ts +2 -0
  171. package/dist/dashboard/__tests__/multi-server-approvals-content.test.d.ts.map +1 -0
  172. package/dist/dashboard/__tests__/multi-server-approvals-content.test.js +115 -0
  173. package/dist/dashboard/__tests__/multi-server-approvals-content.test.js.map +1 -0
  174. package/dist/dashboard/__tests__/watcher-error-handling.test.d.ts +2 -0
  175. package/dist/dashboard/__tests__/watcher-error-handling.test.d.ts.map +1 -0
  176. package/dist/dashboard/__tests__/watcher-error-handling.test.js +118 -0
  177. package/dist/dashboard/__tests__/watcher-error-handling.test.js.map +1 -0
  178. package/dist/dashboard/approval-storage.d.ts +139 -0
  179. package/dist/dashboard/approval-storage.d.ts.map +1 -0
  180. package/dist/dashboard/approval-storage.js +608 -0
  181. package/dist/dashboard/approval-storage.js.map +1 -0
  182. package/dist/dashboard/execution-history-manager.d.ts +52 -0
  183. package/dist/dashboard/execution-history-manager.d.ts.map +1 -0
  184. package/dist/dashboard/execution-history-manager.js +161 -0
  185. package/dist/dashboard/execution-history-manager.js.map +1 -0
  186. package/dist/dashboard/implementation-log-manager.d.ts +97 -0
  187. package/dist/dashboard/implementation-log-manager.d.ts.map +1 -0
  188. package/dist/dashboard/implementation-log-manager.js +617 -0
  189. package/dist/dashboard/implementation-log-manager.js.map +1 -0
  190. package/dist/dashboard/job-scheduler.d.ts +91 -0
  191. package/dist/dashboard/job-scheduler.d.ts.map +1 -0
  192. package/dist/dashboard/job-scheduler.js +321 -0
  193. package/dist/dashboard/job-scheduler.js.map +1 -0
  194. package/dist/dashboard/multi-server.d.ts +42 -0
  195. package/dist/dashboard/multi-server.d.ts.map +1 -0
  196. package/dist/dashboard/multi-server.js +1460 -0
  197. package/dist/dashboard/multi-server.js.map +1 -0
  198. package/dist/dashboard/parser.d.ts +18 -0
  199. package/dist/dashboard/parser.d.ts.map +1 -0
  200. package/dist/dashboard/parser.js +269 -0
  201. package/dist/dashboard/parser.js.map +1 -0
  202. package/dist/dashboard/project-manager.d.ts +82 -0
  203. package/dist/dashboard/project-manager.d.ts.map +1 -0
  204. package/dist/dashboard/project-manager.js +257 -0
  205. package/dist/dashboard/project-manager.js.map +1 -0
  206. package/dist/dashboard/public/assets/Inter-Bold-CD3Pr7BX.woff2 +0 -0
  207. package/dist/dashboard/public/assets/Inter-Medium-B_8v_WHh.woff2 +0 -0
  208. package/dist/dashboard/public/assets/Inter-Regular-DRVdRqcI.woff2 +0 -0
  209. package/dist/dashboard/public/assets/Inter-SemiBold-CtskMddL.woff2 +0 -0
  210. package/dist/dashboard/public/assets/JetBrainsMono-Bold-D4WEaHbo.woff2 +0 -0
  211. package/dist/dashboard/public/assets/JetBrainsMono-Medium-3S3k2nMz.woff2 +0 -0
  212. package/dist/dashboard/public/assets/JetBrainsMono-Regular-BQaDgvhP.woff2 +0 -0
  213. package/dist/dashboard/public/assets/Tableau10-B-NsZVaP.js +1 -0
  214. package/dist/dashboard/public/assets/apl-B4CMkyY2.js +1 -0
  215. package/dist/dashboard/public/assets/arc-a5wW942W.js +1 -0
  216. package/dist/dashboard/public/assets/array-BKyUJesY.js +1 -0
  217. package/dist/dashboard/public/assets/asciiarmor-Df11BRmG.js +1 -0
  218. package/dist/dashboard/public/assets/asn1-EdZsLKOL.js +1 -0
  219. package/dist/dashboard/public/assets/asterisk-B-8jnY81.js +1 -0
  220. package/dist/dashboard/public/assets/blockDiagram-c4efeb88-CvjTuK-w.js +118 -0
  221. package/dist/dashboard/public/assets/brainfuck-C4LP7Hcl.js +1 -0
  222. package/dist/dashboard/public/assets/c4Diagram-c83219d4-NwVQo5kf.js +10 -0
  223. package/dist/dashboard/public/assets/channel-Bi16YZhk.js +1 -0
  224. package/dist/dashboard/public/assets/classDiagram-beda092f-BmSeXDdU.js +2 -0
  225. package/dist/dashboard/public/assets/classDiagram-v2-2358418a-D7GvvuPr.js +2 -0
  226. package/dist/dashboard/public/assets/clike-B9uivgTg.js +1 -0
  227. package/dist/dashboard/public/assets/clojure-BMjYHr_A.js +1 -0
  228. package/dist/dashboard/public/assets/clone-BpKTiq7P.js +1 -0
  229. package/dist/dashboard/public/assets/cmake-BQqOBYOt.js +1 -0
  230. package/dist/dashboard/public/assets/cobol-CWcv1MsR.js +1 -0
  231. package/dist/dashboard/public/assets/coffeescript-S37ZYGWr.js +1 -0
  232. package/dist/dashboard/public/assets/commonlisp-DBKNyK5s.js +1 -0
  233. package/dist/dashboard/public/assets/createText-1719965b-qASbqHUP.js +7 -0
  234. package/dist/dashboard/public/assets/crystal-SjHAIU92.js +1 -0
  235. package/dist/dashboard/public/assets/css-BnMrqG3P.js +1 -0
  236. package/dist/dashboard/public/assets/cypher-C_CwsFkJ.js +1 -0
  237. package/dist/dashboard/public/assets/d-pRatUO7H.js +1 -0
  238. package/dist/dashboard/public/assets/diff-DbItnlRl.js +1 -0
  239. package/dist/dashboard/public/assets/dockerfile-BKs6k2Af.js +1 -0
  240. package/dist/dashboard/public/assets/dtd-DF_7sFjM.js +1 -0
  241. package/dist/dashboard/public/assets/dylan-DwRh75JA.js +1 -0
  242. package/dist/dashboard/public/assets/ebnf-CDyGwa7X.js +1 -0
  243. package/dist/dashboard/public/assets/ecl-Cabwm37j.js +1 -0
  244. package/dist/dashboard/public/assets/edges-96097737-BItTSnH7.js +4 -0
  245. package/dist/dashboard/public/assets/eiffel-CnydiIhH.js +1 -0
  246. package/dist/dashboard/public/assets/elm-vLlmbW-K.js +1 -0
  247. package/dist/dashboard/public/assets/erDiagram-0228fc6a-DT224olg.js +51 -0
  248. package/dist/dashboard/public/assets/erlang-BNw1qcRV.js +1 -0
  249. package/dist/dashboard/public/assets/factor-kuTfRLto.js +1 -0
  250. package/dist/dashboard/public/assets/fcl-Kvtd6kyn.js +1 -0
  251. package/dist/dashboard/public/assets/flowDb-c6c81e3f-D9_ukKtv.js +10 -0
  252. package/dist/dashboard/public/assets/flowDiagram-50d868cf-CylE8siG.js +4 -0
  253. package/dist/dashboard/public/assets/flowDiagram-v2-4f6560a1-B2O3JN7Y.js +1 -0
  254. package/dist/dashboard/public/assets/flowchart-elk-definition-6af322e1-BCaqFKf3.js +139 -0
  255. package/dist/dashboard/public/assets/forth-Ffai-XNe.js +1 -0
  256. package/dist/dashboard/public/assets/fortran-DYz_wnZ1.js +1 -0
  257. package/dist/dashboard/public/assets/ganttDiagram-a2739b55-WQUL1QW_.js +257 -0
  258. package/dist/dashboard/public/assets/gas-Bneqetm1.js +1 -0
  259. package/dist/dashboard/public/assets/gherkin-heZmZLOM.js +1 -0
  260. package/dist/dashboard/public/assets/gitGraphDiagram-82fe8481-CttZrdmr.js +70 -0
  261. package/dist/dashboard/public/assets/graph-Ch-rVueN.js +1 -0
  262. package/dist/dashboard/public/assets/groovy-D9Dt4D0W.js +1 -0
  263. package/dist/dashboard/public/assets/haskell-Cw1EW3IL.js +1 -0
  264. package/dist/dashboard/public/assets/haxe-H-WmDvRZ.js +1 -0
  265. package/dist/dashboard/public/assets/http-DBlCnlav.js +1 -0
  266. package/dist/dashboard/public/assets/idl-BEugSyMb.js +1 -0
  267. package/dist/dashboard/public/assets/index--kbPpDKv.js +1 -0
  268. package/dist/dashboard/public/assets/index-3scDwWm6.js +1 -0
  269. package/dist/dashboard/public/assets/index-5325376f-BL2zVOJU.js +1 -0
  270. package/dist/dashboard/public/assets/index-BZdjbO25.js +1 -0
  271. package/dist/dashboard/public/assets/index-BmA_batZ.js +1 -0
  272. package/dist/dashboard/public/assets/index-Bu0u99kF.js +2 -0
  273. package/dist/dashboard/public/assets/index-Ch-lr7F4.js +1 -0
  274. package/dist/dashboard/public/assets/index-ClgWbdoq.js +1 -0
  275. package/dist/dashboard/public/assets/index-CzLwOMQ_.js +3 -0
  276. package/dist/dashboard/public/assets/index-DAOEjGO7.js +1 -0
  277. package/dist/dashboard/public/assets/index-DXqf0B9c.js +1 -0
  278. package/dist/dashboard/public/assets/index-DegWdR16.js +1 -0
  279. package/dist/dashboard/public/assets/index-DiHyYGim.js +1 -0
  280. package/dist/dashboard/public/assets/index-DlZtG7I5.js +1 -0
  281. package/dist/dashboard/public/assets/index-DmhGE2M8.js +1 -0
  282. package/dist/dashboard/public/assets/index-QEGvld4x.js +1 -0
  283. package/dist/dashboard/public/assets/index-RfZPGAJu.js +1 -0
  284. package/dist/dashboard/public/assets/index-UybBj_7u.js +319 -0
  285. package/dist/dashboard/public/assets/index-bVekzPnl.js +7 -0
  286. package/dist/dashboard/public/assets/index-f5bysQzW.css +1 -0
  287. package/dist/dashboard/public/assets/infoDiagram-8eee0895-DjzkkE3o.js +7 -0
  288. package/dist/dashboard/public/assets/init-Gi6I4Gst.js +1 -0
  289. package/dist/dashboard/public/assets/javascript-iXu5QeM3.js +1 -0
  290. package/dist/dashboard/public/assets/journeyDiagram-c64418c1-CxPZkNdB.js +139 -0
  291. package/dist/dashboard/public/assets/julia-DuME0IfC.js +1 -0
  292. package/dist/dashboard/public/assets/katex-XbL3y5x-.js +261 -0
  293. package/dist/dashboard/public/assets/layout-DX7DNTRm.js +1 -0
  294. package/dist/dashboard/public/assets/line-DfvpmKOn.js +1 -0
  295. package/dist/dashboard/public/assets/linear-gQbBPHO5.js +1 -0
  296. package/dist/dashboard/public/assets/livescript-BwQOo05w.js +1 -0
  297. package/dist/dashboard/public/assets/lua-BgMRiT3U.js +1 -0
  298. package/dist/dashboard/public/assets/mathematica-DTrFuWx2.js +1 -0
  299. package/dist/dashboard/public/assets/mbox-CNhZ1qSd.js +1 -0
  300. package/dist/dashboard/public/assets/mindmap-definition-8da855dc-CNxmpyG6.js +415 -0
  301. package/dist/dashboard/public/assets/mirc-CjQqDB4T.js +1 -0
  302. package/dist/dashboard/public/assets/mllike-CXdrOF99.js +1 -0
  303. package/dist/dashboard/public/assets/modelica-Dc1JOy9r.js +1 -0
  304. package/dist/dashboard/public/assets/mscgen-BA5vi2Kp.js +1 -0
  305. package/dist/dashboard/public/assets/mumps-BT43cFF4.js +1 -0
  306. package/dist/dashboard/public/assets/nginx-DdIZxoE0.js +1 -0
  307. package/dist/dashboard/public/assets/nsis-LdVXkNf5.js +1 -0
  308. package/dist/dashboard/public/assets/ntriples-BfvgReVJ.js +1 -0
  309. package/dist/dashboard/public/assets/octave-Ck1zUtKM.js +1 -0
  310. package/dist/dashboard/public/assets/ordinal-Cboi1Yqb.js +1 -0
  311. package/dist/dashboard/public/assets/oz-BzwKVEFT.js +1 -0
  312. package/dist/dashboard/public/assets/pascal--L3eBynH.js +1 -0
  313. package/dist/dashboard/public/assets/path-CbwjOpE9.js +1 -0
  314. package/dist/dashboard/public/assets/perl-CdXCOZ3F.js +1 -0
  315. package/dist/dashboard/public/assets/pieDiagram-a8764435-D-xy_NSA.js +35 -0
  316. package/dist/dashboard/public/assets/pig-CevX1Tat.js +1 -0
  317. package/dist/dashboard/public/assets/powershell-CFHJl5sT.js +1 -0
  318. package/dist/dashboard/public/assets/properties-C78fOPTZ.js +1 -0
  319. package/dist/dashboard/public/assets/protobuf-ChK-085T.js +1 -0
  320. package/dist/dashboard/public/assets/pug-DeIclll2.js +1 -0
  321. package/dist/dashboard/public/assets/puppet-DMA9R1ak.js +1 -0
  322. package/dist/dashboard/public/assets/python-BuPzkPfP.js +1 -0
  323. package/dist/dashboard/public/assets/q-pXgVlZs6.js +1 -0
  324. package/dist/dashboard/public/assets/quadrantDiagram-1e28029f-BoL2wzz0.js +7 -0
  325. package/dist/dashboard/public/assets/r-B6wPVr8A.js +1 -0
  326. package/dist/dashboard/public/assets/requirementDiagram-08caed73-BujFz0q1.js +52 -0
  327. package/dist/dashboard/public/assets/rpm-CTu-6PCP.js +1 -0
  328. package/dist/dashboard/public/assets/ruby-B2Rjki9n.js +1 -0
  329. package/dist/dashboard/public/assets/sankeyDiagram-a04cb91d-D03_NARm.js +8 -0
  330. package/dist/dashboard/public/assets/sas-B4kiWyti.js +1 -0
  331. package/dist/dashboard/public/assets/scheme-C41bIUwD.js +1 -0
  332. package/dist/dashboard/public/assets/sequenceDiagram-c5b8d532-B65eFcaT.js +122 -0
  333. package/dist/dashboard/public/assets/shell-CjFT_Tl9.js +1 -0
  334. package/dist/dashboard/public/assets/sieve-C3Gn_uJK.js +1 -0
  335. package/dist/dashboard/public/assets/simple-mode-GW_nhZxv.js +1 -0
  336. package/dist/dashboard/public/assets/smalltalk-CnHTOXQT.js +1 -0
  337. package/dist/dashboard/public/assets/solr-DehyRSwq.js +1 -0
  338. package/dist/dashboard/public/assets/sparql-DkYu6x3z.js +1 -0
  339. package/dist/dashboard/public/assets/spreadsheet-BCZA_wO0.js +1 -0
  340. package/dist/dashboard/public/assets/sql-D0XecflT.js +1 -0
  341. package/dist/dashboard/public/assets/stateDiagram-1ecb1508-BDbqu0Vl.js +1 -0
  342. package/dist/dashboard/public/assets/stateDiagram-v2-c2b004d7-CBHvk4b8.js +1 -0
  343. package/dist/dashboard/public/assets/stex-C3f8Ysf7.js +1 -0
  344. package/dist/dashboard/public/assets/styles-b4e223ce-CELsPqaO.js +160 -0
  345. package/dist/dashboard/public/assets/styles-ca3715f6-BRqMqT6F.js +207 -0
  346. package/dist/dashboard/public/assets/styles-d45a18b0-e8N-oLPy.js +116 -0
  347. package/dist/dashboard/public/assets/stylus-B533Al4x.js +1 -0
  348. package/dist/dashboard/public/assets/svgDrawCommon-b86b1483-vNDtmQc-.js +1 -0
  349. package/dist/dashboard/public/assets/swift-BzpIVaGY.js +1 -0
  350. package/dist/dashboard/public/assets/tcl-DVfN8rqt.js +1 -0
  351. package/dist/dashboard/public/assets/textile-CnDTJFAw.js +1 -0
  352. package/dist/dashboard/public/assets/tiddlywiki-DO-Gjzrf.js +1 -0
  353. package/dist/dashboard/public/assets/tiki-DGYXhP31.js +1 -0
  354. package/dist/dashboard/public/assets/timeline-definition-faaaa080-Dh2_A5VU.js +61 -0
  355. package/dist/dashboard/public/assets/toml-Bm5Em-hy.js +1 -0
  356. package/dist/dashboard/public/assets/troff-wAsdV37c.js +1 -0
  357. package/dist/dashboard/public/assets/ttcn-CfJYG6tj.js +1 -0
  358. package/dist/dashboard/public/assets/ttcn-cfg-B9xdYoR4.js +1 -0
  359. package/dist/dashboard/public/assets/turtle-B1tBg_DP.js +1 -0
  360. package/dist/dashboard/public/assets/vb-CmGdzxic.js +1 -0
  361. package/dist/dashboard/public/assets/vbscript-BuJXcnF6.js +1 -0
  362. package/dist/dashboard/public/assets/velocity-D8B20fx6.js +1 -0
  363. package/dist/dashboard/public/assets/verilog-C6RDOZhf.js +1 -0
  364. package/dist/dashboard/public/assets/vhdl-lSbBsy5d.js +1 -0
  365. package/dist/dashboard/public/assets/webidl-ZXfAyPTL.js +1 -0
  366. package/dist/dashboard/public/assets/xquery-DzFWVndE.js +1 -0
  367. package/dist/dashboard/public/assets/xychartDiagram-f5964ef8-B76v1AVF.js +7 -0
  368. package/dist/dashboard/public/assets/yacas-BJ4BC0dw.js +1 -0
  369. package/dist/dashboard/public/assets/z80-Hz9HOZM7.js +1 -0
  370. package/dist/dashboard/public/claude-icon-dark.svg +1 -0
  371. package/dist/dashboard/public/claude-icon.svg +1 -0
  372. package/dist/dashboard/public/index.html +16 -0
  373. package/dist/dashboard/settings-manager.d.ts +47 -0
  374. package/dist/dashboard/settings-manager.d.ts.map +1 -0
  375. package/dist/dashboard/settings-manager.js +180 -0
  376. package/dist/dashboard/settings-manager.js.map +1 -0
  377. package/dist/dashboard/utils.d.ts +31 -0
  378. package/dist/dashboard/utils.d.ts.map +1 -0
  379. package/dist/dashboard/utils.js +102 -0
  380. package/dist/dashboard/utils.js.map +1 -0
  381. package/dist/dashboard/watcher.d.ts +32 -0
  382. package/dist/dashboard/watcher.d.ts.map +1 -0
  383. package/dist/dashboard/watcher.js +173 -0
  384. package/dist/dashboard/watcher.js.map +1 -0
  385. package/dist/index.d.ts +13 -0
  386. package/dist/index.d.ts.map +1 -0
  387. package/dist/index.js +380 -0
  388. package/dist/index.js.map +1 -0
  389. package/dist/markdown/templates/design-template.md +126 -0
  390. package/dist/markdown/templates/product-template.md +51 -0
  391. package/dist/markdown/templates/requirements-template.md +50 -0
  392. package/dist/markdown/templates/structure-template.md +145 -0
  393. package/dist/markdown/templates/tasks-template.md +100 -0
  394. package/dist/markdown/templates/tech-template.md +99 -0
  395. package/dist/markdown/templates/test-design-template.md +221 -0
  396. package/dist/prompts/create-spec.d.ts +3 -0
  397. package/dist/prompts/create-spec.d.ts.map +1 -0
  398. package/dist/prompts/create-spec.js +97 -0
  399. package/dist/prompts/create-spec.js.map +1 -0
  400. package/dist/prompts/create-steering-doc.d.ts +3 -0
  401. package/dist/prompts/create-steering-doc.d.ts.map +1 -0
  402. package/dist/prompts/create-steering-doc.js +75 -0
  403. package/dist/prompts/create-steering-doc.js.map +1 -0
  404. package/dist/prompts/implement-task.d.ts +3 -0
  405. package/dist/prompts/implement-task.d.ts.map +1 -0
  406. package/dist/prompts/implement-task.js +174 -0
  407. package/dist/prompts/implement-task.js.map +1 -0
  408. package/dist/prompts/index.d.ts +20 -0
  409. package/dist/prompts/index.d.ts.map +1 -0
  410. package/dist/prompts/index.js +103 -0
  411. package/dist/prompts/index.js.map +1 -0
  412. package/dist/prompts/inject-spec-workflow-guide.d.ts +3 -0
  413. package/dist/prompts/inject-spec-workflow-guide.d.ts.map +1 -0
  414. package/dist/prompts/inject-spec-workflow-guide.js +60 -0
  415. package/dist/prompts/inject-spec-workflow-guide.js.map +1 -0
  416. package/dist/prompts/inject-steering-guide.d.ts +3 -0
  417. package/dist/prompts/inject-steering-guide.d.ts.map +1 -0
  418. package/dist/prompts/inject-steering-guide.js +64 -0
  419. package/dist/prompts/inject-steering-guide.js.map +1 -0
  420. package/dist/prompts/refresh-tasks.d.ts +3 -0
  421. package/dist/prompts/refresh-tasks.d.ts.map +1 -0
  422. package/dist/prompts/refresh-tasks.js +237 -0
  423. package/dist/prompts/refresh-tasks.js.map +1 -0
  424. package/dist/prompts/spec-status.d.ts +3 -0
  425. package/dist/prompts/spec-status.d.ts.map +1 -0
  426. package/dist/prompts/spec-status.js +77 -0
  427. package/dist/prompts/spec-status.js.map +1 -0
  428. package/dist/prompts/types.d.ts +13 -0
  429. package/dist/prompts/types.d.ts.map +1 -0
  430. package/dist/prompts/types.js +2 -0
  431. package/dist/prompts/types.js.map +1 -0
  432. package/dist/server.d.ts +17 -0
  433. package/dist/server.d.ts.map +1 -0
  434. package/dist/server.js +175 -0
  435. package/dist/server.js.map +1 -0
  436. package/dist/tools/__tests__/log-implementation-review-process.test.d.ts +2 -0
  437. package/dist/tools/__tests__/log-implementation-review-process.test.d.ts.map +1 -0
  438. package/dist/tools/__tests__/log-implementation-review-process.test.js +190 -0
  439. package/dist/tools/__tests__/log-implementation-review-process.test.js.map +1 -0
  440. package/dist/tools/__tests__/projectPath.test.d.ts +2 -0
  441. package/dist/tools/__tests__/projectPath.test.d.ts.map +1 -0
  442. package/dist/tools/__tests__/projectPath.test.js +187 -0
  443. package/dist/tools/__tests__/projectPath.test.js.map +1 -0
  444. package/dist/tools/approvals.d.ts +14 -0
  445. package/dist/tools/approvals.d.ts.map +1 -0
  446. package/dist/tools/approvals.js +505 -0
  447. package/dist/tools/approvals.js.map +1 -0
  448. package/dist/tools/index.d.ts +5 -0
  449. package/dist/tools/index.d.ts.map +1 -0
  450. package/dist/tools/index.js +52 -0
  451. package/dist/tools/index.js.map +1 -0
  452. package/dist/tools/log-implementation.d.ts +5 -0
  453. package/dist/tools/log-implementation.d.ts.map +1 -0
  454. package/dist/tools/log-implementation.js +498 -0
  455. package/dist/tools/log-implementation.js.map +1 -0
  456. package/dist/tools/spec-status.d.ts +5 -0
  457. package/dist/tools/spec-status.d.ts.map +1 -0
  458. package/dist/tools/spec-status.js +192 -0
  459. package/dist/tools/spec-status.js.map +1 -0
  460. package/dist/tools/spec-workflow-guide.d.ts +5 -0
  461. package/dist/tools/spec-workflow-guide.d.ts.map +1 -0
  462. package/dist/tools/spec-workflow-guide.js +116 -0
  463. package/dist/tools/spec-workflow-guide.js.map +1 -0
  464. package/dist/tools/steering-guide.d.ts +5 -0
  465. package/dist/tools/steering-guide.d.ts.map +1 -0
  466. package/dist/tools/steering-guide.js +192 -0
  467. package/dist/tools/steering-guide.js.map +1 -0
  468. package/dist/types.d.ts +183 -0
  469. package/dist/types.d.ts.map +1 -0
  470. package/dist/types.js +13 -0
  471. package/dist/types.js.map +1 -0
  472. package/package.json +106 -0
@@ -0,0 +1,180 @@
1
+ import { join } from 'path';
2
+ import { promises as fs } from 'fs';
3
+ import { getGlobalDir, getPermissionErrorHelp } from '../core/global-dir.js';
4
+ export class SettingsManager {
5
+ settingsPath;
6
+ settingsDir;
7
+ constructor() {
8
+ this.settingsDir = getGlobalDir();
9
+ this.settingsPath = join(this.settingsDir, 'settings.json');
10
+ }
11
+ /**
12
+ * Ensure the settings directory exists
13
+ */
14
+ async ensureSettingsDir() {
15
+ try {
16
+ await fs.mkdir(this.settingsDir, { recursive: true });
17
+ }
18
+ catch (error) {
19
+ // Directory might already exist, ignore EEXIST errors
20
+ if (error.code === 'EEXIST') {
21
+ return;
22
+ }
23
+ // For permission errors, provide helpful guidance
24
+ if (error.code === 'EACCES' || error.code === 'EPERM') {
25
+ console.error(getPermissionErrorHelp('create directory', this.settingsDir));
26
+ throw error;
27
+ }
28
+ // Re-throw other errors
29
+ throw error;
30
+ }
31
+ }
32
+ /**
33
+ * Load global settings from file
34
+ */
35
+ async loadSettings() {
36
+ await this.ensureSettingsDir();
37
+ try {
38
+ const content = await fs.readFile(this.settingsPath, 'utf-8');
39
+ // Handle empty or whitespace-only files
40
+ const trimmedContent = content.trim();
41
+ if (!trimmedContent) {
42
+ console.error(`[SettingsManager] Warning: ${this.settingsPath} is empty, using default settings`);
43
+ const defaultSettings = {
44
+ automationJobs: [],
45
+ createdAt: new Date().toISOString(),
46
+ lastModified: new Date().toISOString()
47
+ };
48
+ // Write default settings to file
49
+ await this.saveSettings(defaultSettings);
50
+ return defaultSettings;
51
+ }
52
+ const parsed = JSON.parse(trimmedContent);
53
+ // Ensure backward compatibility: add default automationJobs array if missing (older format)
54
+ if (!Array.isArray(parsed.automationJobs)) {
55
+ parsed.automationJobs = [];
56
+ }
57
+ return parsed;
58
+ }
59
+ catch (error) {
60
+ if (error.code === 'ENOENT') {
61
+ // File doesn't exist yet, create it with default settings
62
+ const defaultSettings = {
63
+ automationJobs: [],
64
+ createdAt: new Date().toISOString(),
65
+ lastModified: new Date().toISOString()
66
+ };
67
+ await this.saveSettings(defaultSettings);
68
+ return defaultSettings;
69
+ }
70
+ if (error instanceof SyntaxError) {
71
+ // JSON parsing error - file is corrupted or invalid
72
+ console.error(`[SettingsManager] Error: Failed to parse ${this.settingsPath}: ${error.message}`);
73
+ console.error(`[SettingsManager] The file may be corrupted. Using default settings.`);
74
+ // Back up the corrupted file
75
+ try {
76
+ const backupPath = `${this.settingsPath}.corrupted.${Date.now()}`;
77
+ await fs.copyFile(this.settingsPath, backupPath);
78
+ console.error(`[SettingsManager] Corrupted file backed up to: ${backupPath}`);
79
+ }
80
+ catch (backupError) {
81
+ // Ignore backup errors
82
+ }
83
+ const defaultSettings = {
84
+ automationJobs: [],
85
+ createdAt: new Date().toISOString(),
86
+ lastModified: new Date().toISOString()
87
+ };
88
+ // Write default settings to file
89
+ await this.saveSettings(defaultSettings);
90
+ return defaultSettings;
91
+ }
92
+ throw error;
93
+ }
94
+ }
95
+ /**
96
+ * Save global settings to file atomically
97
+ */
98
+ async saveSettings(settings) {
99
+ await this.ensureSettingsDir();
100
+ // Update modification timestamp
101
+ settings.lastModified = new Date().toISOString();
102
+ if (!settings.createdAt) {
103
+ settings.createdAt = new Date().toISOString();
104
+ }
105
+ const content = JSON.stringify(settings, null, 2);
106
+ // Write to temporary file first, then rename for atomic operation
107
+ const tempPath = `${this.settingsPath}.tmp`;
108
+ await fs.writeFile(tempPath, content, 'utf-8');
109
+ await fs.rename(tempPath, this.settingsPath);
110
+ }
111
+ /**
112
+ * Get a specific automation job by ID
113
+ */
114
+ async getJob(jobId) {
115
+ const settings = await this.loadSettings();
116
+ return settings.automationJobs.find(job => job.id === jobId) || null;
117
+ }
118
+ /**
119
+ * Get all automation jobs
120
+ */
121
+ async getAllJobs() {
122
+ const settings = await this.loadSettings();
123
+ return settings.automationJobs;
124
+ }
125
+ /**
126
+ * Add a new automation job
127
+ */
128
+ async addJob(job) {
129
+ const settings = await this.loadSettings();
130
+ // Check for duplicate ID
131
+ if (settings.automationJobs.some(j => j.id === job.id)) {
132
+ throw new Error(`Job with ID ${job.id} already exists`);
133
+ }
134
+ settings.automationJobs.push(job);
135
+ await this.saveSettings(settings);
136
+ }
137
+ /**
138
+ * Update an existing automation job
139
+ */
140
+ async updateJob(jobId, updates) {
141
+ const settings = await this.loadSettings();
142
+ const jobIndex = settings.automationJobs.findIndex(j => j.id === jobId);
143
+ if (jobIndex === -1) {
144
+ throw new Error(`Job with ID ${jobId} not found`);
145
+ }
146
+ // Merge updates, but don't allow changing ID or type
147
+ settings.automationJobs[jobIndex] = {
148
+ ...settings.automationJobs[jobIndex],
149
+ ...updates,
150
+ id: settings.automationJobs[jobIndex].id,
151
+ type: settings.automationJobs[jobIndex].type
152
+ };
153
+ await this.saveSettings(settings);
154
+ }
155
+ /**
156
+ * Delete an automation job
157
+ */
158
+ async deleteJob(jobId) {
159
+ const settings = await this.loadSettings();
160
+ const originalLength = settings.automationJobs.length;
161
+ settings.automationJobs = settings.automationJobs.filter(j => j.id !== jobId);
162
+ if (settings.automationJobs.length === originalLength) {
163
+ throw new Error(`Job with ID ${jobId} not found`);
164
+ }
165
+ await this.saveSettings(settings);
166
+ }
167
+ /**
168
+ * Get the settings file path
169
+ */
170
+ getSettingsPath() {
171
+ return this.settingsPath;
172
+ }
173
+ /**
174
+ * Get the settings directory path
175
+ */
176
+ getSettingsDir() {
177
+ return this.settingsDir;
178
+ }
179
+ }
180
+ //# sourceMappingURL=settings-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-manager.js","sourceRoot":"","sources":["../../src/dashboard/settings-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export declare const DASHBOARD_TEST_MESSAGE = "MCP Workflow Dashboard Online!";
2
+ /**
3
+ * Find an available ephemeral port in the range 49152-65535 on the specified host
4
+ * NOTE: This function is not used in the current implementation.
5
+ * @param host The host/IP address to check (e.g., '127.0.0.1', '0.0.0.0')
6
+ * @returns Promise<number> the available port
7
+ */
8
+ export declare function findAvailablePort(host: string): Promise<number>;
9
+ /**
10
+ * Check if a specific port is available for use on the specified host
11
+ * @param port The port number to check
12
+ * @param host The host/IP address to check (e.g., '127.0.0.1', '0.0.0.0')
13
+ * @returns Promise<boolean> true if port is available, false otherwise
14
+ */
15
+ export declare function isSpecificPortAvailable(port: number, host: string): Promise<boolean>;
16
+ /**
17
+ * Check if an existing dashboard is running on the specified port and host
18
+ * @param port The port number to check
19
+ * @param host The host/IP address to check (e.g., '127.0.0.1', '0.0.0.0')
20
+ * @returns Promise<boolean> true if a dashboard is running on the specified port and host, false otherwise
21
+ */
22
+ export declare function checkExistingDashboard(port: number, host: string): Promise<boolean>;
23
+ /**
24
+ * Validate a port number and check if it's available on the specified host
25
+ * @param port The port number to validate and check
26
+ * @param host The host/IP address to check (e.g., '127.0.0.1', '0.0.0.0')
27
+ * @param skipDashboardCheck Optional flag to skip checking for existing dashboard
28
+ * @returns Promise<void> throws error if invalid or unavailable
29
+ */
30
+ export declare function validateAndCheckPort(port: number, host: string, skipDashboardCheck?: boolean): Promise<void>;
31
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/dashboard/utils.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,sBAAsB,mCAAmC,CAAC;AAmBvE;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBrE;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE1F;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBzF;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBzH"}
@@ -0,0 +1,102 @@
1
+ import { createServer } from 'net';
2
+ // Dashboard constants
3
+ export const DASHBOARD_TEST_MESSAGE = 'MCP Workflow Dashboard Online!';
4
+ async function isPortAvailable(port, host) {
5
+ return new Promise((resolve) => {
6
+ const server = createServer();
7
+ server.listen(port, host, () => {
8
+ server.once('close', () => {
9
+ resolve(true);
10
+ });
11
+ server.close();
12
+ });
13
+ server.on('error', () => {
14
+ resolve(false);
15
+ });
16
+ });
17
+ }
18
+ /**
19
+ * Find an available ephemeral port in the range 49152-65535 on the specified host
20
+ * NOTE: This function is not used in the current implementation.
21
+ * @param host The host/IP address to check (e.g., '127.0.0.1', '0.0.0.0')
22
+ * @returns Promise<number> the available port
23
+ */
24
+ export async function findAvailablePort(host) {
25
+ // Use industry standard ephemeral port range (49152-65535)
26
+ const ephemeralStart = 49152;
27
+ const ephemeralEnd = 65535;
28
+ // Generate a random starting point to avoid always using the same ports
29
+ const randomStart = ephemeralStart + Math.floor(Math.random() * 1000);
30
+ for (let port = randomStart; port <= ephemeralEnd; port++) {
31
+ if (await isPortAvailable(port, host)) {
32
+ return port;
33
+ }
34
+ }
35
+ // If we didn't find one from random start to end, try from beginning to random start
36
+ for (let port = ephemeralStart; port < randomStart; port++) {
37
+ if (await isPortAvailable(port, host)) {
38
+ return port;
39
+ }
40
+ }
41
+ throw new Error(`No available ephemeral port found in range ${ephemeralStart}-${ephemeralEnd} on ${host}`);
42
+ }
43
+ /**
44
+ * Check if a specific port is available for use on the specified host
45
+ * @param port The port number to check
46
+ * @param host The host/IP address to check (e.g., '127.0.0.1', '0.0.0.0')
47
+ * @returns Promise<boolean> true if port is available, false otherwise
48
+ */
49
+ export async function isSpecificPortAvailable(port, host) {
50
+ return isPortAvailable(port, host);
51
+ }
52
+ /**
53
+ * Check if an existing dashboard is running on the specified port and host
54
+ * @param port The port number to check
55
+ * @param host The host/IP address to check (e.g., '127.0.0.1', '0.0.0.0')
56
+ * @returns Promise<boolean> true if a dashboard is running on the specified port and host, false otherwise
57
+ */
58
+ export async function checkExistingDashboard(port, host) {
59
+ try {
60
+ const response = await fetch(`http://${host}:${port}/api/test`, {
61
+ method: 'GET',
62
+ signal: AbortSignal.timeout(1000) // 1 second timeout
63
+ });
64
+ if (response.ok) {
65
+ const data = await response.json();
66
+ // Check if it's actually our dashboard
67
+ return data.message === DASHBOARD_TEST_MESSAGE;
68
+ }
69
+ return false;
70
+ }
71
+ catch {
72
+ // Connection failed or timeout - no dashboard running
73
+ return false;
74
+ }
75
+ }
76
+ /**
77
+ * Validate a port number and check if it's available on the specified host
78
+ * @param port The port number to validate and check
79
+ * @param host The host/IP address to check (e.g., '127.0.0.1', '0.0.0.0')
80
+ * @param skipDashboardCheck Optional flag to skip checking for existing dashboard
81
+ * @returns Promise<void> throws error if invalid or unavailable
82
+ */
83
+ export async function validateAndCheckPort(port, host, skipDashboardCheck = false) {
84
+ // Validate port range first
85
+ if (port < 1024 || port > 65535) {
86
+ throw new Error(`Port ${port} is out of range. Port must be between 1024 and 65535.`);
87
+ }
88
+ // Check if it's our dashboard first (more efficient when dashboard exists)
89
+ if (!skipDashboardCheck) {
90
+ const isDashboard = await checkExistingDashboard(port, host);
91
+ if (isDashboard) {
92
+ // Let caller handle existing dashboard scenario
93
+ throw new Error(`Port ${port} is already in use on ${host} by an existing dashboard instance.`);
94
+ }
95
+ }
96
+ // Only check general port availability if it's not our dashboard
97
+ const available = await isSpecificPortAvailable(port, host);
98
+ if (!available) {
99
+ throw new Error(`Port ${port} is already in use on ${host}. Please choose a different port or omit --port to use an ephemeral port.`);
100
+ }
101
+ }
102
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/dashboard/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { EventEmitter } from 'events';
2
+ import { SpecParser, ParsedSpec } from './parser.js';
3
+ export interface SpecChangeEvent {
4
+ type: 'spec' | 'steering';
5
+ action: 'created' | 'updated' | 'deleted';
6
+ name: string;
7
+ data?: ParsedSpec | any;
8
+ }
9
+ export declare class SpecWatcher extends EventEmitter {
10
+ private projectPath;
11
+ private parser;
12
+ private watcher?;
13
+ private pendingChanges;
14
+ private readonly DEBOUNCE_MS;
15
+ constructor(projectPath: string, parser: SpecParser);
16
+ start(): Promise<void>;
17
+ stop(): Promise<void>;
18
+ /**
19
+ * Schedule a debounced file change event
20
+ * Coalesces rapid changes to the same file
21
+ */
22
+ private scheduleFileChange;
23
+ /**
24
+ * Wait for file size to stabilize before processing
25
+ * Returns true if file is stable, false if file doesn't exist or timeout reached
26
+ */
27
+ private waitForFileStability;
28
+ private handleFileChange;
29
+ private handleSpecChange;
30
+ private handleSteeringChange;
31
+ }
32
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/dashboard/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAC1B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,UAAU,GAAG,GAAG,CAAC;CACzB;AAED,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,OAAO,CAAC,CAAqB;IACrC,OAAO,CAAC,cAAc,CAAgG;IACtH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAO;gBAEvB,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU;IAO7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB3B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;;OAGG;YACW,oBAAoB;YA6BpB,gBAAgB;YA0BhB,gBAAgB;YAmChB,oBAAoB;CAiBnC"}
@@ -0,0 +1,173 @@
1
+ import { EventEmitter } from 'events';
2
+ import chokidar from 'chokidar';
3
+ import { stat } from 'fs/promises';
4
+ import { PathUtils } from '../core/path-utils.js';
5
+ export class SpecWatcher extends EventEmitter {
6
+ projectPath;
7
+ parser;
8
+ watcher;
9
+ pendingChanges = new Map();
10
+ DEBOUNCE_MS = 500;
11
+ constructor(projectPath, parser) {
12
+ super();
13
+ // Path should already be translated by caller (ProjectManager)
14
+ this.projectPath = projectPath;
15
+ this.parser = parser;
16
+ }
17
+ async start() {
18
+ const workflowRoot = PathUtils.getWorkflowRoot(this.projectPath);
19
+ const specsPath = PathUtils.getSpecPath(this.projectPath, '');
20
+ const steeringPath = PathUtils.getSteeringPath(this.projectPath);
21
+ // Watch for changes in specs and steering directories
22
+ this.watcher = chokidar.watch([
23
+ `${specsPath}/**/*.md`,
24
+ `${steeringPath}/*.md`
25
+ ], {
26
+ ignoreInitial: true,
27
+ persistent: true,
28
+ ignorePermissionErrors: true
29
+ });
30
+ this.watcher.on('add', (filePath) => this.scheduleFileChange('created', filePath));
31
+ this.watcher.on('change', (filePath) => this.scheduleFileChange('updated', filePath));
32
+ this.watcher.on('unlink', (filePath) => this.scheduleFileChange('deleted', filePath));
33
+ // Add error handler to prevent watcher crashes
34
+ this.watcher.on('error', (error) => {
35
+ console.error('File watcher error:', error);
36
+ // Don't propagate error to prevent system crash
37
+ });
38
+ // File watcher started for workflow directories
39
+ }
40
+ async stop() {
41
+ // Clear all pending debounced changes
42
+ for (const { timer } of this.pendingChanges.values()) {
43
+ clearTimeout(timer);
44
+ }
45
+ this.pendingChanges.clear();
46
+ if (this.watcher) {
47
+ // Remove all listeners before closing to prevent memory leaks
48
+ this.watcher.removeAllListeners();
49
+ await this.watcher.close();
50
+ this.watcher = undefined;
51
+ // File watcher stopped
52
+ }
53
+ // Clean up EventEmitter listeners
54
+ this.removeAllListeners();
55
+ }
56
+ /**
57
+ * Schedule a debounced file change event
58
+ * Coalesces rapid changes to the same file
59
+ */
60
+ scheduleFileChange(action, filePath) {
61
+ const existing = this.pendingChanges.get(filePath);
62
+ if (existing) {
63
+ clearTimeout(existing.timer);
64
+ }
65
+ // Use latest action, but preserve 'created' if that was the first action
66
+ const finalAction = action === 'deleted' ? 'deleted' : (existing?.action === 'created' ? 'created' : action);
67
+ const timer = setTimeout(() => {
68
+ this.pendingChanges.delete(filePath);
69
+ this.handleFileChange(finalAction, filePath);
70
+ }, this.DEBOUNCE_MS);
71
+ this.pendingChanges.set(filePath, { action: finalAction, timer });
72
+ }
73
+ /**
74
+ * Wait for file size to stabilize before processing
75
+ * Returns true if file is stable, false if file doesn't exist or timeout reached
76
+ */
77
+ async waitForFileStability(filePath, maxWaitMs = 2000) {
78
+ const checkInterval = 100;
79
+ let lastSize = -1;
80
+ let stableCount = 0;
81
+ const requiredStableChecks = 3; // File must be stable for 300ms
82
+ for (let waited = 0; waited < maxWaitMs; waited += checkInterval) {
83
+ try {
84
+ const stats = await stat(filePath);
85
+ if (stats.size === lastSize) {
86
+ stableCount++;
87
+ if (stableCount >= requiredStableChecks) {
88
+ return true;
89
+ }
90
+ }
91
+ else {
92
+ stableCount = 0;
93
+ lastSize = stats.size;
94
+ }
95
+ }
96
+ catch {
97
+ // File might be deleted or in transition
98
+ return false;
99
+ }
100
+ await new Promise(resolve => setTimeout(resolve, checkInterval));
101
+ }
102
+ // Return true if we had at least one stable check (file exists and has content)
103
+ return stableCount >= 1;
104
+ }
105
+ async handleFileChange(action, filePath) {
106
+ try {
107
+ const normalizedPath = filePath.replace(/\\/g, '/');
108
+ // Wait for file stability for creation/updates to ensure file is fully written
109
+ if (action === 'created' || action === 'updated') {
110
+ const isStable = await this.waitForFileStability(filePath);
111
+ if (!isStable) {
112
+ // File may have been deleted or is still being written, skip this update
113
+ console.error(`File not stable, skipping: ${filePath}`);
114
+ return;
115
+ }
116
+ }
117
+ // Determine if this is a spec or steering change
118
+ if (normalizedPath.includes('/specs/')) {
119
+ await this.handleSpecChange(action, normalizedPath);
120
+ }
121
+ else if (normalizedPath.includes('/steering/')) {
122
+ await this.handleSteeringChange(action, normalizedPath);
123
+ }
124
+ }
125
+ catch (error) {
126
+ console.error(`Error handling file change for ${filePath}:`, error);
127
+ // Don't propagate error to prevent watcher crash
128
+ }
129
+ }
130
+ async handleSpecChange(action, filePath) {
131
+ // Extract spec name from path like: /path/to/.spec-workflow/specs/user-auth/requirements.md
132
+ const pathParts = filePath.split('/');
133
+ const specsIndex = pathParts.findIndex(part => part === 'specs');
134
+ if (specsIndex === -1 || specsIndex + 1 >= pathParts.length)
135
+ return;
136
+ const specName = pathParts[specsIndex + 1];
137
+ const document = pathParts[specsIndex + 2]?.replace('.md', '');
138
+ let specData = null;
139
+ if (action !== 'deleted') {
140
+ specData = await this.parser.getSpec(specName);
141
+ }
142
+ const event = {
143
+ type: 'spec',
144
+ action,
145
+ name: specName,
146
+ data: specData
147
+ };
148
+ // Spec change detected
149
+ this.emit('change', event);
150
+ // Emit specific task update event if this was a tasks.md file
151
+ if (document === 'tasks') {
152
+ this.emit('task-update', {
153
+ specName,
154
+ action
155
+ });
156
+ }
157
+ }
158
+ async handleSteeringChange(action, filePath) {
159
+ // Extract document name from path like: /path/to/.spec-workflow/steering/tech.md
160
+ const pathParts = filePath.split('/');
161
+ const document = pathParts[pathParts.length - 1]?.replace('.md', '');
162
+ const steeringStatus = await this.parser.getProjectSteeringStatus();
163
+ const event = {
164
+ type: 'steering',
165
+ action,
166
+ name: document,
167
+ steeringStatus
168
+ };
169
+ // Steering change detected
170
+ this.emit('steering-change', event);
171
+ }
172
+ }
173
+ //# sourceMappingURL=watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/dashboard/watcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ export declare function parseArguments(args: string[]): {
3
+ workspacePath: string;
4
+ workflowRootPath: string;
5
+ expandedPath: string;
6
+ isDashboardMode: boolean;
7
+ noSharedWorktreeSpecs: boolean;
8
+ port?: number;
9
+ lang?: string;
10
+ noOpen?: boolean;
11
+ };
12
+ export declare function resolveEntrypoint(pathValue: string | undefined): string | undefined;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAkGA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;IACzB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CA2FA;AAoMD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAQnF"}