@lbruton/spec-workflow-mcp 2.2.4

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 (407) 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 +373 -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 +11 -0
  79. package/dist/core/parser.d.ts.map +1 -0
  80. package/dist/core/parser.js +126 -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 +297 -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 +165 -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 +586 -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 +1313 -0
  137. package/dist/dashboard/multi-server.js.map +1 -0
  138. package/dist/dashboard/parser.d.ts +18 -0
  139. package/dist/dashboard/parser.d.ts.map +1 -0
  140. package/dist/dashboard/parser.js +243 -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-C8LPXB-J.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-RidjsOEy.js +118 -0
  161. package/dist/dashboard/public/assets/brainfuck-C4LP7Hcl.js +1 -0
  162. package/dist/dashboard/public/assets/c4Diagram-c83219d4-CAH3hSpm.js +10 -0
  163. package/dist/dashboard/public/assets/channel-CmDIZRCD.js +1 -0
  164. package/dist/dashboard/public/assets/classDiagram-beda092f-Bo46Efmw.js +2 -0
  165. package/dist/dashboard/public/assets/classDiagram-v2-2358418a-Be57sb3z.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-BiekPeZp.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-YurEYFNx.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--BjsAXwD.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-BLGuJz36.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-C8vD2iEO.js +10 -0
  192. package/dist/dashboard/public/assets/flowDiagram-50d868cf-BhxgVmOU.js +4 -0
  193. package/dist/dashboard/public/assets/flowDiagram-v2-4f6560a1-DvKCh0ha.js +1 -0
  194. package/dist/dashboard/public/assets/flowchart-elk-definition-6af322e1-CxOZDcEC.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-vP9JOLba.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-Cw0sm0i1.js +70 -0
  201. package/dist/dashboard/public/assets/graph-DKTWMcEG.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-1zJPiVa8.js +3 -0
  208. package/dist/dashboard/public/assets/index-5325376f-DWs4kCT4.js +1 -0
  209. package/dist/dashboard/public/assets/index-BITJ9OoM.js +1 -0
  210. package/dist/dashboard/public/assets/index-C38JlXWp.js +1 -0
  211. package/dist/dashboard/public/assets/index-CCjPelL2.js +2 -0
  212. package/dist/dashboard/public/assets/index-CD9WQNmE.js +1 -0
  213. package/dist/dashboard/public/assets/index-CU7K5Zcb.js +1 -0
  214. package/dist/dashboard/public/assets/index-CXQVOhJV.js +1 -0
  215. package/dist/dashboard/public/assets/index-CXcaRrZ2.js +1 -0
  216. package/dist/dashboard/public/assets/index-ChLAL6g5.css +1 -0
  217. package/dist/dashboard/public/assets/index-D0o1vVOe.js +7 -0
  218. package/dist/dashboard/public/assets/index-DCsxqRvu.js +1 -0
  219. package/dist/dashboard/public/assets/index-DL3iiiRz.js +1 -0
  220. package/dist/dashboard/public/assets/index-DMv2_K2V.js +1 -0
  221. package/dist/dashboard/public/assets/index-DX7EEJ21.js +1 -0
  222. package/dist/dashboard/public/assets/index-Dey_HIH7.js +1 -0
  223. package/dist/dashboard/public/assets/index-DzDTRLhf.js +1 -0
  224. package/dist/dashboard/public/assets/index-OePkEWBg.js +1 -0
  225. package/dist/dashboard/public/assets/index-_d82jdTP.js +1 -0
  226. package/dist/dashboard/public/assets/index-yCKz4OXA.js +319 -0
  227. package/dist/dashboard/public/assets/infoDiagram-8eee0895-BRq08fZf.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-Cf8D2OC8.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-CVdidYA-.js +1 -0
  234. package/dist/dashboard/public/assets/line-BdckgA27.js +1 -0
  235. package/dist/dashboard/public/assets/linear-C9Nh3JLa.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-CK-y1AmO.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-T8V0JN2R.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-CmtVsb5L.js +7 -0
  265. package/dist/dashboard/public/assets/r-B6wPVr8A.js +1 -0
  266. package/dist/dashboard/public/assets/requirementDiagram-08caed73-BUcTnzDl.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-FswuxQ9M.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-BJQ15rhX.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-BfyE0DYv.js +1 -0
  282. package/dist/dashboard/public/assets/stateDiagram-v2-c2b004d7-pcGOYyiW.js +1 -0
  283. package/dist/dashboard/public/assets/stex-C3f8Ysf7.js +1 -0
  284. package/dist/dashboard/public/assets/styles-b4e223ce--lUviH7V.js +160 -0
  285. package/dist/dashboard/public/assets/styles-ca3715f6-BXbrD1Av.js +207 -0
  286. package/dist/dashboard/public/assets/styles-d45a18b0-GyiMrLKu.js +116 -0
  287. package/dist/dashboard/public/assets/stylus-B533Al4x.js +1 -0
  288. package/dist/dashboard/public/assets/svgDrawCommon-b86b1483-DI4Z1GTS.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-B1IgohU4.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-B5oRDe_I.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/design-template.md +96 -0
  330. package/dist/markdown/templates/product-template.md +51 -0
  331. package/dist/markdown/templates/requirements-template.md +50 -0
  332. package/dist/markdown/templates/structure-template.md +145 -0
  333. package/dist/markdown/templates/tasks-template.md +139 -0
  334. package/dist/markdown/templates/tech-template.md +99 -0
  335. package/dist/prompts/create-spec.d.ts +3 -0
  336. package/dist/prompts/create-spec.d.ts.map +1 -0
  337. package/dist/prompts/create-spec.js +93 -0
  338. package/dist/prompts/create-spec.js.map +1 -0
  339. package/dist/prompts/create-steering-doc.d.ts +3 -0
  340. package/dist/prompts/create-steering-doc.d.ts.map +1 -0
  341. package/dist/prompts/create-steering-doc.js +73 -0
  342. package/dist/prompts/create-steering-doc.js.map +1 -0
  343. package/dist/prompts/implement-task.d.ts +3 -0
  344. package/dist/prompts/implement-task.d.ts.map +1 -0
  345. package/dist/prompts/implement-task.js +173 -0
  346. package/dist/prompts/implement-task.js.map +1 -0
  347. package/dist/prompts/index.d.ts +15 -0
  348. package/dist/prompts/index.d.ts.map +1 -0
  349. package/dist/prompts/index.js +49 -0
  350. package/dist/prompts/index.js.map +1 -0
  351. package/dist/prompts/inject-spec-workflow-guide.d.ts +3 -0
  352. package/dist/prompts/inject-spec-workflow-guide.d.ts.map +1 -0
  353. package/dist/prompts/inject-spec-workflow-guide.js +47 -0
  354. package/dist/prompts/inject-spec-workflow-guide.js.map +1 -0
  355. package/dist/prompts/inject-steering-guide.d.ts +3 -0
  356. package/dist/prompts/inject-steering-guide.d.ts.map +1 -0
  357. package/dist/prompts/inject-steering-guide.js +51 -0
  358. package/dist/prompts/inject-steering-guide.js.map +1 -0
  359. package/dist/prompts/refresh-tasks.d.ts +3 -0
  360. package/dist/prompts/refresh-tasks.d.ts.map +1 -0
  361. package/dist/prompts/refresh-tasks.js +224 -0
  362. package/dist/prompts/refresh-tasks.js.map +1 -0
  363. package/dist/prompts/spec-status.d.ts +3 -0
  364. package/dist/prompts/spec-status.d.ts.map +1 -0
  365. package/dist/prompts/spec-status.js +75 -0
  366. package/dist/prompts/spec-status.js.map +1 -0
  367. package/dist/prompts/types.d.ts +13 -0
  368. package/dist/prompts/types.d.ts.map +1 -0
  369. package/dist/prompts/types.js +2 -0
  370. package/dist/prompts/types.js.map +1 -0
  371. package/dist/server.d.ts +17 -0
  372. package/dist/server.d.ts.map +1 -0
  373. package/dist/server.js +175 -0
  374. package/dist/server.js.map +1 -0
  375. package/dist/tools/__tests__/projectPath.test.d.ts +2 -0
  376. package/dist/tools/__tests__/projectPath.test.d.ts.map +1 -0
  377. package/dist/tools/__tests__/projectPath.test.js +187 -0
  378. package/dist/tools/__tests__/projectPath.test.js.map +1 -0
  379. package/dist/tools/approvals.d.ts +14 -0
  380. package/dist/tools/approvals.d.ts.map +1 -0
  381. package/dist/tools/approvals.js +490 -0
  382. package/dist/tools/approvals.js.map +1 -0
  383. package/dist/tools/index.d.ts +5 -0
  384. package/dist/tools/index.d.ts.map +1 -0
  385. package/dist/tools/index.js +52 -0
  386. package/dist/tools/index.js.map +1 -0
  387. package/dist/tools/log-implementation.d.ts +5 -0
  388. package/dist/tools/log-implementation.d.ts.map +1 -0
  389. package/dist/tools/log-implementation.js +397 -0
  390. package/dist/tools/log-implementation.js.map +1 -0
  391. package/dist/tools/spec-status.d.ts +5 -0
  392. package/dist/tools/spec-status.d.ts.map +1 -0
  393. package/dist/tools/spec-status.js +178 -0
  394. package/dist/tools/spec-status.js.map +1 -0
  395. package/dist/tools/spec-workflow-guide.d.ts +5 -0
  396. package/dist/tools/spec-workflow-guide.d.ts.map +1 -0
  397. package/dist/tools/spec-workflow-guide.js +291 -0
  398. package/dist/tools/spec-workflow-guide.js.map +1 -0
  399. package/dist/tools/steering-guide.d.ts +5 -0
  400. package/dist/tools/steering-guide.d.ts.map +1 -0
  401. package/dist/tools/steering-guide.js +192 -0
  402. package/dist/tools/steering-guide.js.map +1 -0
  403. package/dist/types.d.ts +172 -0
  404. package/dist/types.d.ts.map +1 -0
  405. package/dist/types.js +13 -0
  406. package/dist/types.js.map +1 -0
  407. package/package.json +105 -0
@@ -0,0 +1,586 @@
1
+ import { EventEmitter } from 'events';
2
+ import { promises as fs } from 'fs';
3
+ import { join, isAbsolute, resolve, basename } from 'path';
4
+ import chokidar from 'chokidar';
5
+ import { diffLines } from 'diff';
6
+ import { PathUtils } from '../core/path-utils.js';
7
+ export class ApprovalStorage extends EventEmitter {
8
+ projectPath; // Workflow root path (.spec-workflow location)
9
+ originalProjectPath; // Original workflow root path for display/registry
10
+ fileResolutionPath; // Base path for resolving approval filePath artifacts
11
+ approvalsDir;
12
+ watcher;
13
+ pendingEmit = null;
14
+ DEBOUNCE_MS = 500;
15
+ constructor(translatedPath, options = {}) {
16
+ super();
17
+ // Validate project path
18
+ if (!translatedPath || translatedPath.trim() === '') {
19
+ throw new Error('Project path cannot be empty');
20
+ }
21
+ // Resolve to absolute path (already translated by caller)
22
+ const resolvedPath = resolve(translatedPath);
23
+ // Prevent root directory usage which causes permission errors
24
+ if (resolvedPath === '/' || resolvedPath === '\\' || resolvedPath.match(/^[A-Z]:\\?$/)) {
25
+ throw new Error(`Invalid project path: ${resolvedPath}. Cannot use root directory for spec workflow.`);
26
+ }
27
+ this.projectPath = resolvedPath;
28
+ // Store original path for display/registry (fall back to translated if not provided)
29
+ this.originalProjectPath = resolve(options.originalPath ?? translatedPath);
30
+ // Relative approval file paths are resolved against workspace path by default.
31
+ // Falls back to workflow root path when files only exist in shared .spec-workflow root.
32
+ this.fileResolutionPath = resolve(options.fileResolutionPath ?? translatedPath);
33
+ this.approvalsDir = PathUtils.getApprovalsPath(resolvedPath);
34
+ }
35
+ async start() {
36
+ // Create the approvals directory (empty) so watcher can establish properly
37
+ await fs.mkdir(this.approvalsDir, { recursive: true });
38
+ // Set up file watcher for approval directory and all subdirectories
39
+ // This will catch new directories and files created dynamically
40
+ this.watcher = chokidar.watch(`${this.approvalsDir}/**/*.json`, {
41
+ ignoreInitial: false,
42
+ persistent: true,
43
+ ignorePermissionErrors: true
44
+ });
45
+ this.watcher.on('add', () => this.scheduleApprovalChangeEmit());
46
+ this.watcher.on('change', () => this.scheduleApprovalChangeEmit());
47
+ this.watcher.on('unlink', () => this.scheduleApprovalChangeEmit());
48
+ // Add error handler to prevent watcher crashes
49
+ this.watcher.on('error', (error) => {
50
+ console.error('Approval watcher error:', error);
51
+ // Don't propagate error to prevent system crash
52
+ });
53
+ }
54
+ /**
55
+ * Schedule a debounced approval-change event emission
56
+ * Coalesces rapid changes to prevent event flooding
57
+ */
58
+ scheduleApprovalChangeEmit() {
59
+ if (this.pendingEmit) {
60
+ clearTimeout(this.pendingEmit);
61
+ }
62
+ this.pendingEmit = setTimeout(() => {
63
+ this.pendingEmit = null;
64
+ this.emit('approval-change');
65
+ }, this.DEBOUNCE_MS);
66
+ }
67
+ async stop() {
68
+ // Clear pending debounced emit
69
+ if (this.pendingEmit) {
70
+ clearTimeout(this.pendingEmit);
71
+ this.pendingEmit = null;
72
+ }
73
+ if (this.watcher) {
74
+ // Remove all listeners before closing to prevent memory leaks
75
+ this.watcher.removeAllListeners();
76
+ await this.watcher.close();
77
+ this.watcher = undefined;
78
+ }
79
+ // Clean up EventEmitter listeners
80
+ this.removeAllListeners();
81
+ }
82
+ /**
83
+ * Candidate resolution order for relative approval file paths:
84
+ * 1) Workspace/worktree base (fileResolutionPath)
85
+ * 2) Shared workflow root (projectPath)
86
+ */
87
+ getFilePathCandidates(filePath) {
88
+ if (isAbsolute(filePath)) {
89
+ return [filePath];
90
+ }
91
+ const candidates = [
92
+ join(this.fileResolutionPath, filePath),
93
+ join(this.projectPath, filePath)
94
+ ];
95
+ return Array.from(new Set(candidates));
96
+ }
97
+ async resolveExistingFilePath(filePath) {
98
+ const candidates = this.getFilePathCandidates(filePath);
99
+ for (const candidate of candidates) {
100
+ try {
101
+ await fs.access(candidate);
102
+ return candidate;
103
+ }
104
+ catch {
105
+ // Try next candidate
106
+ }
107
+ }
108
+ return null;
109
+ }
110
+ async resolveFilePathForWrite(filePath) {
111
+ if (isAbsolute(filePath)) {
112
+ return filePath;
113
+ }
114
+ const existingPath = await this.resolveExistingFilePath(filePath);
115
+ if (existingPath) {
116
+ return existingPath;
117
+ }
118
+ return join(this.fileResolutionPath, filePath);
119
+ }
120
+ async createApproval(title, filePath, category, categoryName, type = 'document', metadata) {
121
+ const id = this.generateId();
122
+ const approval = {
123
+ id,
124
+ title,
125
+ filePath,
126
+ type,
127
+ status: 'pending',
128
+ createdAt: new Date().toISOString(),
129
+ metadata,
130
+ category,
131
+ categoryName
132
+ };
133
+ // Create category directory if it doesn't exist
134
+ const categoryDir = join(this.approvalsDir, categoryName);
135
+ await fs.mkdir(categoryDir, { recursive: true });
136
+ const approvalFilePath = join(categoryDir, `${id}.json`);
137
+ await fs.writeFile(approvalFilePath, JSON.stringify(approval, null, 2), 'utf-8');
138
+ // Capture initial snapshot
139
+ try {
140
+ await this.captureSnapshot(id, 'initial');
141
+ }
142
+ catch (error) {
143
+ // Log error but don't fail the approval creation
144
+ console.warn(`Failed to capture initial snapshot for approval ${id}:`, error);
145
+ }
146
+ return id;
147
+ }
148
+ async getApproval(id) {
149
+ // Search across all categories and names
150
+ try {
151
+ const approvalPath = await this.findApprovalPath(id);
152
+ if (!approvalPath)
153
+ return null;
154
+ const content = await fs.readFile(approvalPath, 'utf-8');
155
+ return JSON.parse(content);
156
+ }
157
+ catch {
158
+ return null;
159
+ }
160
+ }
161
+ async findApprovalPath(id) {
162
+ // Search in approvals directory directly (no 'specs' subfolder)
163
+ try {
164
+ const categoryNames = await fs.readdir(this.approvalsDir, { withFileTypes: true });
165
+ for (const categoryName of categoryNames) {
166
+ if (categoryName.isDirectory()) {
167
+ const approvalPath = join(this.approvalsDir, categoryName.name, `${id}.json`);
168
+ try {
169
+ await fs.access(approvalPath);
170
+ return approvalPath;
171
+ }
172
+ catch {
173
+ // File doesn't exist in this location, continue searching
174
+ }
175
+ }
176
+ }
177
+ }
178
+ catch {
179
+ // Approvals directory doesn't exist
180
+ }
181
+ return null;
182
+ }
183
+ async updateApproval(id, status, response, annotations, comments) {
184
+ const approval = await this.getApproval(id);
185
+ if (!approval) {
186
+ throw new Error(`Approval ${id} not found`);
187
+ }
188
+ // Capture snapshot before status change for certain transitions
189
+ if (status === 'needs-revision') {
190
+ try {
191
+ await this.captureSnapshot(id, 'revision_requested');
192
+ }
193
+ catch (error) {
194
+ console.warn(`Failed to capture revision snapshot for approval ${id}:`, error);
195
+ }
196
+ }
197
+ else if (status === 'approved') {
198
+ try {
199
+ await this.captureSnapshot(id, 'approved');
200
+ }
201
+ catch (error) {
202
+ console.warn(`Failed to capture approval snapshot for approval ${id}:`, error);
203
+ }
204
+ }
205
+ approval.status = status;
206
+ approval.response = response;
207
+ approval.annotations = annotations;
208
+ approval.respondedAt = new Date().toISOString();
209
+ if (comments) {
210
+ approval.comments = comments;
211
+ }
212
+ const filePath = await this.findApprovalPath(id);
213
+ if (!filePath) {
214
+ throw new Error(`Approval ${id} file not found`);
215
+ }
216
+ await fs.writeFile(filePath, JSON.stringify(approval, null, 2), 'utf-8');
217
+ }
218
+ /**
219
+ * Revert an approval back to pending status, clearing response and timestamp
220
+ * Used for undo operations after batch approvals/rejections
221
+ */
222
+ async revertToPending(id) {
223
+ const approval = await this.getApproval(id);
224
+ if (!approval) {
225
+ throw new Error(`Approval ${id} not found`);
226
+ }
227
+ // Revert to pending state
228
+ approval.status = 'pending';
229
+ // Clear response fields
230
+ delete approval.response;
231
+ delete approval.respondedAt;
232
+ delete approval.annotations;
233
+ delete approval.comments;
234
+ const filePath = await this.findApprovalPath(id);
235
+ if (!filePath) {
236
+ throw new Error(`Approval ${id} file not found`);
237
+ }
238
+ await fs.writeFile(filePath, JSON.stringify(approval, null, 2), 'utf-8');
239
+ }
240
+ async createRevision(originalId, newContent, reason) {
241
+ const originalApproval = await this.getApproval(originalId);
242
+ if (!originalApproval) {
243
+ throw new Error(`Original approval ${originalId} not found`);
244
+ }
245
+ if (!originalApproval.filePath) {
246
+ throw new Error(`Approval ${originalId} has no file path for revision`);
247
+ }
248
+ // Resolve target file path (workspace first, workflow root fallback)
249
+ const existingFilePath = await this.resolveExistingFilePath(originalApproval.filePath);
250
+ const filePath = existingFilePath || await this.resolveFilePathForWrite(originalApproval.filePath);
251
+ let currentContent = '';
252
+ try {
253
+ currentContent = await fs.readFile(filePath, 'utf-8');
254
+ }
255
+ catch (error) {
256
+ // Could not read file for revision history
257
+ }
258
+ // Add to revision history
259
+ if (!originalApproval.revisionHistory) {
260
+ originalApproval.revisionHistory = [];
261
+ }
262
+ const version = (originalApproval.revisionHistory.length || 0) + 1;
263
+ originalApproval.revisionHistory.push({
264
+ version: version - 1,
265
+ content: currentContent,
266
+ timestamp: originalApproval.respondedAt || originalApproval.createdAt,
267
+ reason: reason
268
+ });
269
+ // Write the new content to the file
270
+ await fs.writeFile(filePath, newContent, 'utf-8');
271
+ // Reset approval status for re-review
272
+ originalApproval.status = 'pending';
273
+ originalApproval.response = undefined;
274
+ originalApproval.annotations = undefined;
275
+ originalApproval.comments = undefined;
276
+ originalApproval.respondedAt = undefined;
277
+ const approvalFilePath = await this.findApprovalPath(originalId);
278
+ if (!approvalFilePath) {
279
+ throw new Error(`Approval ${originalId} file not found`);
280
+ }
281
+ await fs.writeFile(approvalFilePath, JSON.stringify(originalApproval, null, 2), 'utf-8');
282
+ return originalId;
283
+ }
284
+ async getAllPendingApprovals() {
285
+ const allApprovals = await this.getAllApprovals();
286
+ return allApprovals.filter(approval => approval.status === 'pending');
287
+ }
288
+ async getAllApprovals() {
289
+ try {
290
+ const approvals = [];
291
+ try {
292
+ const categoryNames = await fs.readdir(this.approvalsDir, { withFileTypes: true });
293
+ for (const categoryName of categoryNames) {
294
+ if (categoryName.isDirectory()) {
295
+ const categoryPath = join(this.approvalsDir, categoryName.name);
296
+ try {
297
+ const approvalFiles = await fs.readdir(categoryPath);
298
+ for (const file of approvalFiles) {
299
+ if (file.endsWith('.json')) {
300
+ try {
301
+ const content = await fs.readFile(join(categoryPath, file), 'utf-8');
302
+ const approval = JSON.parse(content);
303
+ approvals.push(approval);
304
+ }
305
+ catch (error) {
306
+ // Error reading approval file
307
+ }
308
+ }
309
+ }
310
+ }
311
+ catch (error) {
312
+ // Error reading category directory
313
+ }
314
+ }
315
+ }
316
+ }
317
+ catch {
318
+ // Approvals directory doesn't exist
319
+ }
320
+ // Sort by creation date (newest first)
321
+ return approvals.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
322
+ }
323
+ catch {
324
+ return [];
325
+ }
326
+ }
327
+ async deleteApproval(id) {
328
+ try {
329
+ const approvalPath = await this.findApprovalPath(id);
330
+ if (!approvalPath)
331
+ return false;
332
+ // Delete the approval file
333
+ await fs.unlink(approvalPath);
334
+ // NOTE: We DO NOT delete snapshots since they are now shared across approvals for the same file
335
+ // Snapshots are stored in .snapshots/{filename}/ and should persist across approval cycles
336
+ return true;
337
+ }
338
+ catch {
339
+ return false;
340
+ }
341
+ }
342
+ async cleanupOldApprovals(maxAgeDays = 7) {
343
+ const cutoffDate = new Date();
344
+ cutoffDate.setDate(cutoffDate.getDate() - maxAgeDays);
345
+ try {
346
+ const files = await fs.readdir(this.approvalsDir);
347
+ for (const file of files) {
348
+ if (file.endsWith('.json')) {
349
+ try {
350
+ const content = await fs.readFile(join(this.approvalsDir, file), 'utf-8');
351
+ const approval = JSON.parse(content);
352
+ const createdAt = new Date(approval.createdAt);
353
+ if (createdAt < cutoffDate && approval.status !== 'pending') {
354
+ await fs.unlink(join(this.approvalsDir, file));
355
+ }
356
+ }
357
+ catch (error) {
358
+ // Error processing approval file
359
+ }
360
+ }
361
+ }
362
+ }
363
+ catch (error) {
364
+ // Error cleaning up old approvals
365
+ }
366
+ }
367
+ // Snapshot Management Methods
368
+ async captureSnapshot(approvalId, trigger) {
369
+ const approval = await this.getApproval(approvalId);
370
+ if (!approval || !approval.filePath) {
371
+ throw new Error(`Approval ${approvalId} not found or has no file path`);
372
+ }
373
+ // Read current file content (workspace first, workflow root fallback)
374
+ const filePath = await this.resolveExistingFilePath(approval.filePath);
375
+ if (!filePath) {
376
+ throw new Error(`Failed to read file for snapshot: file does not exist for ${approval.filePath}`);
377
+ }
378
+ let content;
379
+ let stats;
380
+ try {
381
+ content = await fs.readFile(filePath, 'utf-8');
382
+ stats = await fs.stat(filePath);
383
+ }
384
+ catch (error) {
385
+ throw new Error(`Failed to read file for snapshot: ${error instanceof Error ? error.message : String(error)}`);
386
+ }
387
+ // Create file-based snapshots directory
388
+ const categoryDir = join(this.approvalsDir, approval.categoryName || 'default');
389
+ const snapshotsDir = join(categoryDir, '.snapshots', basename(approval.filePath));
390
+ await fs.mkdir(snapshotsDir, { recursive: true });
391
+ // Load or create metadata
392
+ const metadataPath = join(snapshotsDir, 'metadata.json');
393
+ let metadata;
394
+ try {
395
+ const metadataContent = await fs.readFile(metadataPath, 'utf-8');
396
+ metadata = JSON.parse(metadataContent);
397
+ }
398
+ catch {
399
+ metadata = {
400
+ filePath: approval.filePath,
401
+ currentVersion: 0,
402
+ snapshots: []
403
+ };
404
+ }
405
+ // Check for duplicate initial snapshots
406
+ if (trigger === 'initial') {
407
+ const existingInitial = metadata.snapshots.find(s => s.trigger === 'initial');
408
+ if (existingInitial) {
409
+ console.error(`Initial snapshot already exists for ${approval.filePath}, skipping creation`);
410
+ return;
411
+ }
412
+ }
413
+ // Create new snapshot
414
+ const version = metadata.currentVersion + 1;
415
+ const snapshotId = `snapshot-${version.toString().padStart(3, '0')}`;
416
+ const timestamp = new Date().toISOString();
417
+ const snapshot = {
418
+ id: this.generateSnapshotId(),
419
+ approvalId,
420
+ approvalTitle: approval.title,
421
+ version,
422
+ timestamp,
423
+ trigger,
424
+ status: approval.status,
425
+ content,
426
+ fileStats: {
427
+ size: stats.size,
428
+ lines: content.split('\n').length,
429
+ lastModified: stats.mtime.toISOString()
430
+ },
431
+ comments: approval.comments || [],
432
+ annotations: approval.annotations || undefined
433
+ };
434
+ // Write snapshot to disk
435
+ const snapshotPath = join(snapshotsDir, `${snapshotId}.json`);
436
+ await fs.writeFile(snapshotPath, JSON.stringify(snapshot, null, 2), 'utf-8');
437
+ // Update metadata
438
+ metadata.currentVersion = version;
439
+ metadata.snapshots.push({
440
+ version,
441
+ filename: `${snapshotId}.json`,
442
+ timestamp,
443
+ trigger,
444
+ approvalId,
445
+ approvalTitle: approval.title
446
+ });
447
+ await fs.writeFile(metadataPath, JSON.stringify(metadata, null, 2), 'utf-8');
448
+ }
449
+ async getSnapshots(approvalId) {
450
+ const approval = await this.getApproval(approvalId);
451
+ if (!approval || !approval.filePath)
452
+ return [];
453
+ // Get snapshots based on file path, not approval ID
454
+ const categoryDir = join(this.approvalsDir, approval.categoryName || 'default');
455
+ const snapshotsDir = join(categoryDir, '.snapshots', basename(approval.filePath));
456
+ const metadataPath = join(snapshotsDir, 'metadata.json');
457
+ try {
458
+ const metadataContent = await fs.readFile(metadataPath, 'utf-8');
459
+ const metadata = JSON.parse(metadataContent);
460
+ const snapshots = [];
461
+ for (const snapMeta of metadata.snapshots) {
462
+ const snapPath = join(snapshotsDir, snapMeta.filename);
463
+ const snapshotContent = await fs.readFile(snapPath, 'utf-8');
464
+ const snapshot = JSON.parse(snapshotContent);
465
+ snapshots.push(snapshot);
466
+ }
467
+ return snapshots.sort((a, b) => a.version - b.version);
468
+ }
469
+ catch {
470
+ return [];
471
+ }
472
+ }
473
+ async getSnapshot(approvalId, version) {
474
+ const snapshots = await this.getSnapshots(approvalId);
475
+ return snapshots.find(s => s.version === version) || null;
476
+ }
477
+ async getCurrentFileContent(approvalId) {
478
+ const approval = await this.getApproval(approvalId);
479
+ if (!approval || !approval.filePath)
480
+ return null;
481
+ const filePath = await this.resolveExistingFilePath(approval.filePath);
482
+ if (!filePath) {
483
+ return null;
484
+ }
485
+ try {
486
+ return await fs.readFile(filePath, 'utf-8');
487
+ }
488
+ catch {
489
+ return null;
490
+ }
491
+ }
492
+ async compareSnapshots(approvalId, fromVersion, toVersion) {
493
+ let fromContent;
494
+ let toContent;
495
+ if (fromVersion === 0) {
496
+ fromContent = '';
497
+ }
498
+ else {
499
+ const fromSnapshot = await this.getSnapshot(approvalId, fromVersion);
500
+ if (!fromSnapshot) {
501
+ throw new Error(`Snapshot version ${fromVersion} not found`);
502
+ }
503
+ fromContent = fromSnapshot.content;
504
+ }
505
+ if (toVersion === 'current') {
506
+ const currentContent = await this.getCurrentFileContent(approvalId);
507
+ if (currentContent === null) {
508
+ throw new Error(`Could not read current file content for approval ${approvalId}`);
509
+ }
510
+ toContent = currentContent;
511
+ }
512
+ else {
513
+ const toSnapshot = await this.getSnapshot(approvalId, toVersion);
514
+ if (!toSnapshot) {
515
+ throw new Error(`Snapshot version ${toVersion} not found`);
516
+ }
517
+ toContent = toSnapshot.content;
518
+ }
519
+ const changes = diffLines(fromContent, toContent);
520
+ const resultLines = [];
521
+ let additions = 0;
522
+ let deletions = 0;
523
+ let oldLineNum = 1;
524
+ let newLineNum = 1;
525
+ for (const change of changes) {
526
+ // Split the change value into lines, handling the trailing newline properly
527
+ const lines = change.value.split('\n');
528
+ // Remove the last empty element if the value ended with a newline
529
+ if (lines.length > 0 && lines[lines.length - 1] === '') {
530
+ lines.pop();
531
+ }
532
+ for (const line of lines) {
533
+ if (change.added) {
534
+ additions++;
535
+ resultLines.push({
536
+ type: 'add',
537
+ newLineNumber: newLineNum++,
538
+ content: line
539
+ });
540
+ }
541
+ else if (change.removed) {
542
+ deletions++;
543
+ resultLines.push({
544
+ type: 'delete',
545
+ oldLineNumber: oldLineNum++,
546
+ content: line
547
+ });
548
+ }
549
+ else {
550
+ // Unchanged line
551
+ resultLines.push({
552
+ type: 'normal',
553
+ oldLineNumber: oldLineNum++,
554
+ newLineNumber: newLineNum++,
555
+ content: line
556
+ });
557
+ }
558
+ }
559
+ }
560
+ // Count actual lines processed (matching the diff loop's handling of trailing newlines)
561
+ // We use the line number counters which were incremented for each actual line processed
562
+ const fromLineCount = oldLineNum - 1;
563
+ const toLineCount = newLineNum - 1;
564
+ return {
565
+ additions,
566
+ deletions,
567
+ // changes represents in-place modifications; diffLines only produces additions/deletions
568
+ // so changes is always 0 (the frontend calculates totalChanges = additions + deletions + changes)
569
+ changes: 0,
570
+ chunks: [{
571
+ oldStart: 1,
572
+ oldLines: fromLineCount,
573
+ newStart: 1,
574
+ newLines: toLineCount,
575
+ lines: resultLines
576
+ }]
577
+ };
578
+ }
579
+ generateSnapshotId() {
580
+ return `snapshot_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
581
+ }
582
+ generateId() {
583
+ return `approval_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
584
+ }
585
+ }
586
+ //# sourceMappingURL=approval-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-storage.js","sourceRoot":"","sources":["../../src/dashboard/approval-storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { JobExecutionHistory, JobExecutionLog } from '../types.js';
2
+ export declare class ExecutionHistoryManager {
3
+ private historyPath;
4
+ private historyDir;
5
+ private maxHistoryEntries;
6
+ constructor();
7
+ /**
8
+ * Ensure the history directory exists
9
+ */
10
+ private ensureHistoryDir;
11
+ /**
12
+ * Load execution history from file
13
+ */
14
+ loadHistory(): Promise<JobExecutionLog>;
15
+ /**
16
+ * Save execution history to file atomically
17
+ */
18
+ private saveHistory;
19
+ /**
20
+ * Record a job execution
21
+ */
22
+ recordExecution(execution: JobExecutionHistory): Promise<void>;
23
+ /**
24
+ * Get execution history for a specific job
25
+ */
26
+ getJobHistory(jobId: string, limit?: number): Promise<JobExecutionHistory[]>;
27
+ /**
28
+ * Get recent executions across all jobs
29
+ */
30
+ getRecentExecutions(limit?: number): Promise<JobExecutionHistory[]>;
31
+ /**
32
+ * Get execution statistics for a job
33
+ */
34
+ getJobStats(jobId: string): Promise<{
35
+ totalExecutions: number;
36
+ successfulExecutions: number;
37
+ failedExecutions: number;
38
+ successRate: number;
39
+ totalItemsDeleted: number;
40
+ avgDuration: number;
41
+ lastExecution: JobExecutionHistory;
42
+ }>;
43
+ /**
44
+ * Clear old history (keep last N days)
45
+ */
46
+ clearOldHistory(daysToKeep?: number): Promise<void>;
47
+ /**
48
+ * Get the history file path
49
+ */
50
+ getHistoryPath(): string;
51
+ }
52
+ //# sourceMappingURL=execution-history-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-history-manager.d.ts","sourceRoot":"","sources":["../../src/dashboard/execution-history-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnE,qBAAa,uBAAuB;IAClC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,iBAAiB,CAAQ;;IAOjC;;OAEG;YACW,gBAAgB;IAkB9B;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC;IAoD7C;;OAEG;YACW,WAAW;IAazB;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAcpE;;OAEG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAKtF;;OAEG;IACG,mBAAmB,CAAC,KAAK,GAAE,MAAY,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAK9E;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM;;;;;;;;;IAiB/B;;OAEG;IACG,eAAe,CAAC,UAAU,GAAE,MAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAU7D;;OAEG;IACH,cAAc,IAAI,MAAM;CAGzB"}