plan-assistant 1.0.0-alpha.1

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 (267) hide show
  1. package/bin/cli.js +3 -0
  2. package/build/client/_app/immutable/assets/0.C3PqqAhL.css +1 -0
  3. package/build/client/_app/immutable/assets/0.C3PqqAhL.css.br +0 -0
  4. package/build/client/_app/immutable/assets/0.C3PqqAhL.css.gz +0 -0
  5. package/build/client/_app/immutable/assets/3.CeEJ2rrR.css +1 -0
  6. package/build/client/_app/immutable/assets/3.CeEJ2rrR.css.br +0 -0
  7. package/build/client/_app/immutable/assets/3.CeEJ2rrR.css.gz +0 -0
  8. package/build/client/_app/immutable/chunks/8d4Xe_BE.js +1 -0
  9. package/build/client/_app/immutable/chunks/8d4Xe_BE.js.br +2 -0
  10. package/build/client/_app/immutable/chunks/8d4Xe_BE.js.gz +0 -0
  11. package/build/client/_app/immutable/chunks/9WCvTzvP.js +1 -0
  12. package/build/client/_app/immutable/chunks/9WCvTzvP.js.br +0 -0
  13. package/build/client/_app/immutable/chunks/9WCvTzvP.js.gz +0 -0
  14. package/build/client/_app/immutable/chunks/B1jEhT6Y.js +7 -0
  15. package/build/client/_app/immutable/chunks/B1jEhT6Y.js.br +0 -0
  16. package/build/client/_app/immutable/chunks/B1jEhT6Y.js.gz +0 -0
  17. package/build/client/_app/immutable/chunks/B7EE0k5h.js +2 -0
  18. package/build/client/_app/immutable/chunks/B7EE0k5h.js.br +4 -0
  19. package/build/client/_app/immutable/chunks/B7EE0k5h.js.gz +0 -0
  20. package/build/client/_app/immutable/chunks/BKZ1WW5F.js +145 -0
  21. package/build/client/_app/immutable/chunks/BKZ1WW5F.js.br +0 -0
  22. package/build/client/_app/immutable/chunks/BKZ1WW5F.js.gz +0 -0
  23. package/build/client/_app/immutable/chunks/BN-dANbA.js +24 -0
  24. package/build/client/_app/immutable/chunks/BN-dANbA.js.br +0 -0
  25. package/build/client/_app/immutable/chunks/BN-dANbA.js.gz +0 -0
  26. package/build/client/_app/immutable/chunks/BNk8MoDp.js +1 -0
  27. package/build/client/_app/immutable/chunks/BNk8MoDp.js.br +0 -0
  28. package/build/client/_app/immutable/chunks/BNk8MoDp.js.gz +0 -0
  29. package/build/client/_app/immutable/chunks/BQaXIfA_.js +331 -0
  30. package/build/client/_app/immutable/chunks/BQaXIfA_.js.br +0 -0
  31. package/build/client/_app/immutable/chunks/BQaXIfA_.js.gz +0 -0
  32. package/build/client/_app/immutable/chunks/BUD_gazk.js +162 -0
  33. package/build/client/_app/immutable/chunks/BUD_gazk.js.br +0 -0
  34. package/build/client/_app/immutable/chunks/BUD_gazk.js.gz +0 -0
  35. package/build/client/_app/immutable/chunks/BWR4y0Zt.js +1 -0
  36. package/build/client/_app/immutable/chunks/BWR4y0Zt.js.br +0 -0
  37. package/build/client/_app/immutable/chunks/BWR4y0Zt.js.gz +0 -0
  38. package/build/client/_app/immutable/chunks/BbQSm0Zl.js +139 -0
  39. package/build/client/_app/immutable/chunks/BbQSm0Zl.js.br +0 -0
  40. package/build/client/_app/immutable/chunks/BbQSm0Zl.js.gz +0 -0
  41. package/build/client/_app/immutable/chunks/BdH5KtWM.js +4 -0
  42. package/build/client/_app/immutable/chunks/BdH5KtWM.js.br +0 -0
  43. package/build/client/_app/immutable/chunks/BdH5KtWM.js.gz +0 -0
  44. package/build/client/_app/immutable/chunks/BjW-a7Pq.js +220 -0
  45. package/build/client/_app/immutable/chunks/BjW-a7Pq.js.br +0 -0
  46. package/build/client/_app/immutable/chunks/BjW-a7Pq.js.gz +0 -0
  47. package/build/client/_app/immutable/chunks/BqnH-2nD.js +1 -0
  48. package/build/client/_app/immutable/chunks/BqnH-2nD.js.br +0 -0
  49. package/build/client/_app/immutable/chunks/BqnH-2nD.js.gz +0 -0
  50. package/build/client/_app/immutable/chunks/C0zVmx2X.js +160 -0
  51. package/build/client/_app/immutable/chunks/C0zVmx2X.js.br +0 -0
  52. package/build/client/_app/immutable/chunks/C0zVmx2X.js.gz +0 -0
  53. package/build/client/_app/immutable/chunks/C3o2aqQ1.js +1 -0
  54. package/build/client/_app/immutable/chunks/C3o2aqQ1.js.br +0 -0
  55. package/build/client/_app/immutable/chunks/C3o2aqQ1.js.gz +0 -0
  56. package/build/client/_app/immutable/chunks/C64iTk26.js +165 -0
  57. package/build/client/_app/immutable/chunks/C64iTk26.js.br +0 -0
  58. package/build/client/_app/immutable/chunks/C64iTk26.js.gz +0 -0
  59. package/build/client/_app/immutable/chunks/C6vzr1mx.js +10 -0
  60. package/build/client/_app/immutable/chunks/C6vzr1mx.js.br +0 -0
  61. package/build/client/_app/immutable/chunks/C6vzr1mx.js.gz +0 -0
  62. package/build/client/_app/immutable/chunks/C8Hc9oGK.js +64 -0
  63. package/build/client/_app/immutable/chunks/C8Hc9oGK.js.br +0 -0
  64. package/build/client/_app/immutable/chunks/C8Hc9oGK.js.gz +0 -0
  65. package/build/client/_app/immutable/chunks/CBHsRRno.js +61 -0
  66. package/build/client/_app/immutable/chunks/CBHsRRno.js.br +0 -0
  67. package/build/client/_app/immutable/chunks/CBHsRRno.js.gz +0 -0
  68. package/build/client/_app/immutable/chunks/CBSAILhF.js +261 -0
  69. package/build/client/_app/immutable/chunks/CBSAILhF.js.br +0 -0
  70. package/build/client/_app/immutable/chunks/CBSAILhF.js.gz +0 -0
  71. package/build/client/_app/immutable/chunks/CBW7agkG.js +256 -0
  72. package/build/client/_app/immutable/chunks/CBW7agkG.js.br +0 -0
  73. package/build/client/_app/immutable/chunks/CBW7agkG.js.gz +0 -0
  74. package/build/client/_app/immutable/chunks/CC-X9pS2.js +74 -0
  75. package/build/client/_app/immutable/chunks/CC-X9pS2.js.br +0 -0
  76. package/build/client/_app/immutable/chunks/CC-X9pS2.js.gz +0 -0
  77. package/build/client/_app/immutable/chunks/CEvYmTSL.js +89 -0
  78. package/build/client/_app/immutable/chunks/CEvYmTSL.js.br +0 -0
  79. package/build/client/_app/immutable/chunks/CEvYmTSL.js.gz +0 -0
  80. package/build/client/_app/immutable/chunks/CGRgCg7L.js +1 -0
  81. package/build/client/_app/immutable/chunks/CGRgCg7L.js.br +0 -0
  82. package/build/client/_app/immutable/chunks/CGRgCg7L.js.gz +0 -0
  83. package/build/client/_app/immutable/chunks/CHH2Hy6S.js +15 -0
  84. package/build/client/_app/immutable/chunks/CHH2Hy6S.js.br +0 -0
  85. package/build/client/_app/immutable/chunks/CHH2Hy6S.js.gz +0 -0
  86. package/build/client/_app/immutable/chunks/CIhVjBiN.js +24 -0
  87. package/build/client/_app/immutable/chunks/CIhVjBiN.js.br +0 -0
  88. package/build/client/_app/immutable/chunks/CIhVjBiN.js.gz +0 -0
  89. package/build/client/_app/immutable/chunks/CKNA4rS6.js +267 -0
  90. package/build/client/_app/immutable/chunks/CKNA4rS6.js.br +0 -0
  91. package/build/client/_app/immutable/chunks/CKNA4rS6.js.gz +0 -0
  92. package/build/client/_app/immutable/chunks/CL5zNpIk.js +68 -0
  93. package/build/client/_app/immutable/chunks/CL5zNpIk.js.br +0 -0
  94. package/build/client/_app/immutable/chunks/CL5zNpIk.js.gz +0 -0
  95. package/build/client/_app/immutable/chunks/CW0iy9tI.js +30 -0
  96. package/build/client/_app/immutable/chunks/CW0iy9tI.js.br +0 -0
  97. package/build/client/_app/immutable/chunks/CW0iy9tI.js.gz +0 -0
  98. package/build/client/_app/immutable/chunks/CcjchtPD.js +1 -0
  99. package/build/client/_app/immutable/chunks/CcjchtPD.js.br +0 -0
  100. package/build/client/_app/immutable/chunks/CcjchtPD.js.gz +0 -0
  101. package/build/client/_app/immutable/chunks/Cll_sCfU.js +1 -0
  102. package/build/client/_app/immutable/chunks/Cll_sCfU.js.br +0 -0
  103. package/build/client/_app/immutable/chunks/Cll_sCfU.js.gz +0 -0
  104. package/build/client/_app/immutable/chunks/CmKTTxBW.js +1 -0
  105. package/build/client/_app/immutable/chunks/CmKTTxBW.js.br +0 -0
  106. package/build/client/_app/immutable/chunks/CmKTTxBW.js.gz +0 -0
  107. package/build/client/_app/immutable/chunks/CrMrqXop.js +1 -0
  108. package/build/client/_app/immutable/chunks/CrMrqXop.js.br +0 -0
  109. package/build/client/_app/immutable/chunks/CrMrqXop.js.gz +0 -0
  110. package/build/client/_app/immutable/chunks/D-sluzJn.js +36 -0
  111. package/build/client/_app/immutable/chunks/D-sluzJn.js.br +0 -0
  112. package/build/client/_app/immutable/chunks/D-sluzJn.js.gz +0 -0
  113. package/build/client/_app/immutable/chunks/D6JFlLal.js +1 -0
  114. package/build/client/_app/immutable/chunks/D6JFlLal.js.br +0 -0
  115. package/build/client/_app/immutable/chunks/D6JFlLal.js.gz +0 -0
  116. package/build/client/_app/immutable/chunks/D9DlXbtP.js +1 -0
  117. package/build/client/_app/immutable/chunks/D9DlXbtP.js.br +0 -0
  118. package/build/client/_app/immutable/chunks/D9DlXbtP.js.gz +0 -0
  119. package/build/client/_app/immutable/chunks/DAR7HuC9.js +1 -0
  120. package/build/client/_app/immutable/chunks/DAR7HuC9.js.br +0 -0
  121. package/build/client/_app/immutable/chunks/DAR7HuC9.js.gz +0 -0
  122. package/build/client/_app/immutable/chunks/DDcQfCr1.js +1 -0
  123. package/build/client/_app/immutable/chunks/DDcQfCr1.js.br +0 -0
  124. package/build/client/_app/immutable/chunks/DDcQfCr1.js.gz +0 -0
  125. package/build/client/_app/immutable/chunks/DEKji6wA.js +1 -0
  126. package/build/client/_app/immutable/chunks/DEKji6wA.js.br +0 -0
  127. package/build/client/_app/immutable/chunks/DEKji6wA.js.gz +0 -0
  128. package/build/client/_app/immutable/chunks/DJxCrHhv.js +1 -0
  129. package/build/client/_app/immutable/chunks/DJxCrHhv.js.br +0 -0
  130. package/build/client/_app/immutable/chunks/DJxCrHhv.js.gz +0 -0
  131. package/build/client/_app/immutable/chunks/DQY6FbTx.js +10 -0
  132. package/build/client/_app/immutable/chunks/DQY6FbTx.js.br +0 -0
  133. package/build/client/_app/immutable/chunks/DQY6FbTx.js.gz +0 -0
  134. package/build/client/_app/immutable/chunks/DX6XiGOO.js +1 -0
  135. package/build/client/_app/immutable/chunks/DX6XiGOO.js.br +0 -0
  136. package/build/client/_app/immutable/chunks/DX6XiGOO.js.gz +0 -0
  137. package/build/client/_app/immutable/chunks/DbxUCpDB.js +1 -0
  138. package/build/client/_app/immutable/chunks/DbxUCpDB.js.br +0 -0
  139. package/build/client/_app/immutable/chunks/DbxUCpDB.js.gz +0 -0
  140. package/build/client/_app/immutable/chunks/Df2trAOx.js +1 -0
  141. package/build/client/_app/immutable/chunks/Df2trAOx.js.br +0 -0
  142. package/build/client/_app/immutable/chunks/Df2trAOx.js.gz +0 -0
  143. package/build/client/_app/immutable/chunks/DhXvBouI.js +60 -0
  144. package/build/client/_app/immutable/chunks/DhXvBouI.js.br +0 -0
  145. package/build/client/_app/immutable/chunks/DhXvBouI.js.gz +0 -0
  146. package/build/client/_app/immutable/chunks/DiQnLIBs.js +43 -0
  147. package/build/client/_app/immutable/chunks/DiQnLIBs.js.br +0 -0
  148. package/build/client/_app/immutable/chunks/DiQnLIBs.js.gz +0 -0
  149. package/build/client/_app/immutable/chunks/DjFganl6.js +1 -0
  150. package/build/client/_app/immutable/chunks/DjFganl6.js.br +0 -0
  151. package/build/client/_app/immutable/chunks/DjFganl6.js.gz +0 -0
  152. package/build/client/_app/immutable/chunks/Dw8vPuxF.js +1 -0
  153. package/build/client/_app/immutable/chunks/Dw8vPuxF.js.br +0 -0
  154. package/build/client/_app/immutable/chunks/Dw8vPuxF.js.gz +0 -0
  155. package/build/client/_app/immutable/chunks/DxAe9_g6.js +2 -0
  156. package/build/client/_app/immutable/chunks/DxAe9_g6.js.br +0 -0
  157. package/build/client/_app/immutable/chunks/DxAe9_g6.js.gz +0 -0
  158. package/build/client/_app/immutable/chunks/DzBCqAw8.js +1 -0
  159. package/build/client/_app/immutable/chunks/DzBCqAw8.js.br +2 -0
  160. package/build/client/_app/immutable/chunks/DzBCqAw8.js.gz +0 -0
  161. package/build/client/_app/immutable/chunks/DzpZEw0h.js +2 -0
  162. package/build/client/_app/immutable/chunks/DzpZEw0h.js.br +0 -0
  163. package/build/client/_app/immutable/chunks/DzpZEw0h.js.gz +0 -0
  164. package/build/client/_app/immutable/chunks/E1kKiM5I.js +122 -0
  165. package/build/client/_app/immutable/chunks/E1kKiM5I.js.br +0 -0
  166. package/build/client/_app/immutable/chunks/E1kKiM5I.js.gz +0 -0
  167. package/build/client/_app/immutable/chunks/Gi6I4Gst.js +1 -0
  168. package/build/client/_app/immutable/chunks/Gi6I4Gst.js.br +0 -0
  169. package/build/client/_app/immutable/chunks/Gi6I4Gst.js.gz +0 -0
  170. package/build/client/_app/immutable/chunks/I9hXWnMX.js +1 -0
  171. package/build/client/_app/immutable/chunks/I9hXWnMX.js.br +0 -0
  172. package/build/client/_app/immutable/chunks/I9hXWnMX.js.gz +0 -0
  173. package/build/client/_app/immutable/chunks/RPcZpviV.js +1 -0
  174. package/build/client/_app/immutable/chunks/RPcZpviV.js.br +0 -0
  175. package/build/client/_app/immutable/chunks/RPcZpviV.js.gz +0 -0
  176. package/build/client/_app/immutable/chunks/TjEjrU2A.js +3 -0
  177. package/build/client/_app/immutable/chunks/TjEjrU2A.js.br +0 -0
  178. package/build/client/_app/immutable/chunks/TjEjrU2A.js.gz +0 -0
  179. package/build/client/_app/immutable/chunks/j27NcumQ.js +7 -0
  180. package/build/client/_app/immutable/chunks/j27NcumQ.js.br +0 -0
  181. package/build/client/_app/immutable/chunks/j27NcumQ.js.gz +0 -0
  182. package/build/client/_app/immutable/chunks/thT0GKfC.js +65 -0
  183. package/build/client/_app/immutable/chunks/thT0GKfC.js.br +0 -0
  184. package/build/client/_app/immutable/chunks/thT0GKfC.js.gz +0 -0
  185. package/build/client/_app/immutable/chunks/xC_GeI4S.js +1 -0
  186. package/build/client/_app/immutable/chunks/xC_GeI4S.js.br +0 -0
  187. package/build/client/_app/immutable/chunks/xC_GeI4S.js.gz +0 -0
  188. package/build/client/_app/immutable/entry/app.CK6lX0ja.js +2 -0
  189. package/build/client/_app/immutable/entry/app.CK6lX0ja.js.br +0 -0
  190. package/build/client/_app/immutable/entry/app.CK6lX0ja.js.gz +0 -0
  191. package/build/client/_app/immutable/entry/start.xK59vv5D.js +1 -0
  192. package/build/client/_app/immutable/entry/start.xK59vv5D.js.br +0 -0
  193. package/build/client/_app/immutable/entry/start.xK59vv5D.js.gz +0 -0
  194. package/build/client/_app/immutable/nodes/0.BJ3nXnhk.js +1 -0
  195. package/build/client/_app/immutable/nodes/0.BJ3nXnhk.js.br +0 -0
  196. package/build/client/_app/immutable/nodes/0.BJ3nXnhk.js.gz +0 -0
  197. package/build/client/_app/immutable/nodes/1.C1o_0A1A.js +1 -0
  198. package/build/client/_app/immutable/nodes/1.C1o_0A1A.js.br +0 -0
  199. package/build/client/_app/immutable/nodes/1.C1o_0A1A.js.gz +0 -0
  200. package/build/client/_app/immutable/nodes/2.BFZlqDci.js +1 -0
  201. package/build/client/_app/immutable/nodes/2.BFZlqDci.js.br +0 -0
  202. package/build/client/_app/immutable/nodes/2.BFZlqDci.js.gz +0 -0
  203. package/build/client/_app/immutable/nodes/3.C07rQAMW.js +1 -0
  204. package/build/client/_app/immutable/nodes/3.C07rQAMW.js.br +2 -0
  205. package/build/client/_app/immutable/nodes/3.C07rQAMW.js.gz +0 -0
  206. package/build/client/_app/version.json +1 -0
  207. package/build/client/_app/version.json.br +0 -0
  208. package/build/client/_app/version.json.gz +0 -0
  209. package/build/client/favicon.png +0 -0
  210. package/build/env.js +94 -0
  211. package/build/handler.js +1494 -0
  212. package/build/index.js +345 -0
  213. package/build/server/chunks/0-CepC_ipP.js +9 -0
  214. package/build/server/chunks/0-CepC_ipP.js.map +1 -0
  215. package/build/server/chunks/1-4oF8SEse.js +9 -0
  216. package/build/server/chunks/1-4oF8SEse.js.map +1 -0
  217. package/build/server/chunks/2-BLUM7meD.js +26 -0
  218. package/build/server/chunks/2-BLUM7meD.js.map +1 -0
  219. package/build/server/chunks/3-BoYm2WFw.js +36 -0
  220. package/build/server/chunks/3-BoYm2WFw.js.map +1 -0
  221. package/build/server/chunks/_layout.svelte-D_wzPsk8.js +8 -0
  222. package/build/server/chunks/_layout.svelte-D_wzPsk8.js.map +1 -0
  223. package/build/server/chunks/_page.svelte-BHvU_89P.js +680 -0
  224. package/build/server/chunks/_page.svelte-BHvU_89P.js.map +1 -0
  225. package/build/server/chunks/_page.svelte-_ayKsTal.js +47 -0
  226. package/build/server/chunks/_page.svelte-_ayKsTal.js.map +1 -0
  227. package/build/server/chunks/_server.ts-B-w81Hz0.js +18 -0
  228. package/build/server/chunks/_server.ts-B-w81Hz0.js.map +1 -0
  229. package/build/server/chunks/_server.ts-BHdd9cj4.js +14 -0
  230. package/build/server/chunks/_server.ts-BHdd9cj4.js.map +1 -0
  231. package/build/server/chunks/_server.ts-CK88gmKp.js +29 -0
  232. package/build/server/chunks/_server.ts-CK88gmKp.js.map +1 -0
  233. package/build/server/chunks/_server.ts-Cfbl_bId.js +36 -0
  234. package/build/server/chunks/_server.ts-Cfbl_bId.js.map +1 -0
  235. package/build/server/chunks/_server.ts-Cu69G-Uv.js +15 -0
  236. package/build/server/chunks/_server.ts-Cu69G-Uv.js.map +1 -0
  237. package/build/server/chunks/_server.ts-DAVgIfvo.js +11 -0
  238. package/build/server/chunks/_server.ts-DAVgIfvo.js.map +1 -0
  239. package/build/server/chunks/_server.ts-DO9LltlC.js +23 -0
  240. package/build/server/chunks/_server.ts-DO9LltlC.js.map +1 -0
  241. package/build/server/chunks/_server.ts-DpdXzg2s.js +28 -0
  242. package/build/server/chunks/_server.ts-DpdXzg2s.js.map +1 -0
  243. package/build/server/chunks/error.svelte-BqRMCf-x.js +45 -0
  244. package/build/server/chunks/error.svelte-BqRMCf-x.js.map +1 -0
  245. package/build/server/chunks/exports-B-mwFVw0.js +2967 -0
  246. package/build/server/chunks/exports-B-mwFVw0.js.map +1 -0
  247. package/build/server/chunks/hooks.server-DGwCGEDl.js +43 -0
  248. package/build/server/chunks/hooks.server-DGwCGEDl.js.map +1 -0
  249. package/build/server/chunks/index-CoD1IJuy.js +190 -0
  250. package/build/server/chunks/index-CoD1IJuy.js.map +1 -0
  251. package/build/server/chunks/index-DHQltRSd.js +1627 -0
  252. package/build/server/chunks/index-DHQltRSd.js.map +1 -0
  253. package/build/server/chunks/session-manager-uzbpiZOt.js +99 -0
  254. package/build/server/chunks/session-manager-uzbpiZOt.js.map +1 -0
  255. package/build/server/chunks/sse-manager-CJXA3H0i.js +38 -0
  256. package/build/server/chunks/sse-manager-CJXA3H0i.js.map +1 -0
  257. package/build/server/index.js +5221 -0
  258. package/build/server/index.js.map +1 -0
  259. package/build/server/manifest.js +110 -0
  260. package/build/server/manifest.js.map +1 -0
  261. package/build/shims.js +32 -0
  262. package/dist/index.js +235 -0
  263. package/dist/markdown-to-plan.js +345 -0
  264. package/dist/mermaid-gen.js +17 -0
  265. package/dist/types.js +1 -0
  266. package/package.json +52 -0
  267. package/svelte.config.js +11 -0
@@ -0,0 +1,345 @@
1
+ import { Lexer } from "marked";
2
+ import { createHash } from "node:crypto";
3
+ import { basename } from "node:path";
4
+ import { generatePhaseFlowDiagram } from "./mermaid-gen.js";
5
+ function splitIntoSections(tokens) {
6
+ const sections = [];
7
+ let current = null;
8
+ for (const token of tokens) {
9
+ if (token.type === "heading") {
10
+ const h = token;
11
+ current = { heading: h.text, level: h.depth, tokens: [] };
12
+ sections.push(current);
13
+ }
14
+ else if (current) {
15
+ current.tokens.push(token);
16
+ }
17
+ }
18
+ return sections;
19
+ }
20
+ function tokensToMarkdown(tokens) {
21
+ return tokens
22
+ .map((t) => t.raw)
23
+ .join("")
24
+ .trim();
25
+ }
26
+ function findSection(sections, pattern, level) {
27
+ return sections.find((s) => pattern.test(s.heading) && (level === undefined || s.level === level));
28
+ }
29
+ function collectSectionsUntilLevel(sections, startIdx, level) {
30
+ const result = [];
31
+ for (let i = startIdx + 1; i < sections.length; i++) {
32
+ if (sections[i].level <= level)
33
+ break;
34
+ result.push(sections[i]);
35
+ }
36
+ return result;
37
+ }
38
+ function parseKeyDiscoveries(tokens) {
39
+ const results = [];
40
+ for (const token of tokens) {
41
+ if (token.type === "list") {
42
+ const list = token;
43
+ for (const item of list.items) {
44
+ const text = item.text.trim();
45
+ const codeRefMatch = text.match(/\(?\`([^`]+:\d+[^`]*)\`\)?$/);
46
+ results.push({
47
+ text: codeRefMatch ? text.replace(codeRefMatch[0], "").trim() : text,
48
+ codeRef: codeRefMatch ? codeRefMatch[1] : undefined,
49
+ });
50
+ }
51
+ }
52
+ }
53
+ return results;
54
+ }
55
+ function parseScopeExclusions(tokens) {
56
+ const results = [];
57
+ for (const token of tokens) {
58
+ if (token.type === "list") {
59
+ const list = token;
60
+ for (const item of list.items) {
61
+ const text = item.text.trim();
62
+ const parts = text.split(/\s*--\s*|\s*[—–]\s*/);
63
+ if (parts.length >= 2) {
64
+ results.push({
65
+ title: parts[0].trim(),
66
+ reason: parts.slice(1).join(" -- ").trim(),
67
+ });
68
+ }
69
+ else {
70
+ results.push({ title: text, reason: "" });
71
+ }
72
+ }
73
+ }
74
+ }
75
+ return results;
76
+ }
77
+ function parseChanges(sections) {
78
+ const changes = [];
79
+ for (const section of sections) {
80
+ if (section.level !== 4)
81
+ continue;
82
+ const nameMatch = section.heading.match(/^\d+\.\s*(.+)/);
83
+ if (!nameMatch)
84
+ continue;
85
+ const componentName = nameMatch[1]
86
+ .replace(/^(?:New\s+component:\s*|Update\s+)?/i, "")
87
+ .trim();
88
+ let filePath = "";
89
+ let description = "";
90
+ let codeSnippet;
91
+ let codeLanguage;
92
+ const lines = [];
93
+ for (const token of section.tokens) {
94
+ if (token.type === "paragraph") {
95
+ const para = token;
96
+ const fileMatch = para.raw.match(/\*\*File\*\*:\s*`([^`]+)`/);
97
+ if (fileMatch) {
98
+ filePath = fileMatch[1];
99
+ const rest = para.raw
100
+ .replace(/\*\*File\*\*:\s*`[^`]+`\s*(\(new\))?\s*/i, "")
101
+ .trim();
102
+ if (rest)
103
+ lines.push(rest);
104
+ }
105
+ else {
106
+ const changesMatch = para.raw.match(/\*\*Changes?\*\*:\s*(.*)/s);
107
+ if (changesMatch) {
108
+ lines.push(changesMatch[1].trim());
109
+ }
110
+ else {
111
+ lines.push(para.raw.trim());
112
+ }
113
+ }
114
+ }
115
+ else if (token.type === "code") {
116
+ const codeToken = token;
117
+ codeSnippet = codeToken.text;
118
+ codeLanguage = codeToken.lang || undefined;
119
+ }
120
+ else if (token.type === "list") {
121
+ lines.push(tokensToMarkdown([token]));
122
+ }
123
+ }
124
+ description = lines.filter(Boolean).join("\n\n");
125
+ changes.push({
126
+ componentName,
127
+ filePath,
128
+ description,
129
+ codeSnippet,
130
+ codeLanguage,
131
+ });
132
+ }
133
+ return changes;
134
+ }
135
+ function parseCriteria(tokens, type) {
136
+ const criteria = [];
137
+ for (const token of tokens) {
138
+ if (token.type === "list") {
139
+ const list = token;
140
+ for (const item of list.items) {
141
+ const text = item.text.trim();
142
+ const commandMatch = text.match(/:\s*`([^`]+)`\s*$/);
143
+ const id = `${type}-${criteria.length + 1}`;
144
+ criteria.push({
145
+ id,
146
+ text: commandMatch
147
+ ? text.replace(commandMatch[0], "").trim() + ":"
148
+ : text,
149
+ command: commandMatch ? commandMatch[1] : undefined,
150
+ });
151
+ }
152
+ }
153
+ }
154
+ return criteria;
155
+ }
156
+ function parsePhases(allSections) {
157
+ const phases = [];
158
+ for (let i = 0; i < allSections.length; i++) {
159
+ const section = allSections[i];
160
+ const phaseMatch = section.heading.match(/^Phase\s+(\d+):\s*(.+)/i);
161
+ if (!phaseMatch || section.level !== 2)
162
+ continue;
163
+ const number = parseInt(phaseMatch[1], 10);
164
+ const name = phaseMatch[2].trim();
165
+ const id = `phase-${number}`;
166
+ const subSections = collectSectionsUntilLevel(allSections, i, 2);
167
+ const overviewSection = subSections.find((s) => /^Overview$/i.test(s.heading));
168
+ const overview = overviewSection
169
+ ? tokensToMarkdown(overviewSection.tokens)
170
+ : "";
171
+ const changesSection = subSections.find((s) => /^Changes\s+Required/i.test(s.heading));
172
+ const changesIdx = changesSection
173
+ ? allSections.indexOf(changesSection)
174
+ : -1;
175
+ let changes = [];
176
+ if (changesIdx >= 0) {
177
+ const changeSubs = collectSectionsUntilLevel(allSections, changesIdx, 3);
178
+ changes = parseChanges(changeSubs);
179
+ }
180
+ const automatedSection = subSections.find((s) => /Automated\s+Verification/i.test(s.heading));
181
+ const manualSection = subSections.find((s) => /Manual\s+Verification/i.test(s.heading));
182
+ const automated = automatedSection
183
+ ? parseCriteria(automatedSection.tokens, "automated")
184
+ : [];
185
+ const manual = manualSection
186
+ ? parseCriteria(manualSection.tokens, "manual")
187
+ : [];
188
+ phases.push({
189
+ id,
190
+ number,
191
+ name,
192
+ overview,
193
+ changes,
194
+ successCriteria: { automated, manual },
195
+ });
196
+ }
197
+ return phases;
198
+ }
199
+ function parseTestingStrategy(section, subSections) {
200
+ const result = {
201
+ unit: [],
202
+ integration: [],
203
+ manual: [],
204
+ };
205
+ const unitSection = subSections.find((s) => /Unit\s+Tests?/i.test(s.heading));
206
+ const intSection = subSections.find((s) => /Integration\s+Tests?/i.test(s.heading) ||
207
+ /E2E\s+Tests?/i.test(s.heading));
208
+ const manualSection = subSections.find((s) => /Manual\s+Test/i.test(s.heading));
209
+ function extractList(sec) {
210
+ if (!sec)
211
+ return [];
212
+ const items = [];
213
+ for (const token of sec.tokens) {
214
+ if (token.type === "list") {
215
+ for (const item of token.items) {
216
+ items.push(item.text.trim());
217
+ }
218
+ }
219
+ }
220
+ return items;
221
+ }
222
+ result.unit = extractList(unitSection);
223
+ result.integration = extractList(intSection);
224
+ result.manual = extractList(manualSection);
225
+ return result;
226
+ }
227
+ function parseReferences(tokens) {
228
+ const refs = [];
229
+ for (const token of tokens) {
230
+ if (token.type === "list") {
231
+ for (const item of token.items) {
232
+ refs.push(item.text.trim());
233
+ }
234
+ }
235
+ else if (token.type === "paragraph") {
236
+ const lines = token.text.split("\n");
237
+ for (const line of lines) {
238
+ const trimmed = line.replace(/^[-*]\s*/, "").trim();
239
+ if (trimmed)
240
+ refs.push(trimmed);
241
+ }
242
+ }
243
+ }
244
+ return refs;
245
+ }
246
+ export function sessionIdFromPath(absolutePath) {
247
+ return createHash("sha256").update(absolutePath).digest("hex").slice(0, 8);
248
+ }
249
+ export function parseMarkdownToPlan(markdown, markdownPath, projectDir, version = 1) {
250
+ const tokens = Lexer.lex(markdown);
251
+ const sections = splitIntoSections(tokens);
252
+ // Title from first H1
253
+ const titleSection = sections.find((s) => s.level === 1);
254
+ const title = titleSection?.heading ?? basename(markdownPath, ".md");
255
+ // Date from filename or today
256
+ const dateMatch = basename(markdownPath).match(/^(\d{4}-\d{2}-\d{2})/);
257
+ const date = dateMatch ? dateMatch[1] : new Date().toISOString().slice(0, 10);
258
+ // Ticket ref from filename
259
+ const ticketMatch = basename(markdownPath).match(/(?:ENG|TASK)-(\d+)/i);
260
+ const ticketRef = ticketMatch ? ticketMatch[0].toUpperCase() : undefined;
261
+ // Overview
262
+ const overviewSection = findSection(sections, /^Overview$/i, 2);
263
+ const overview = overviewSection
264
+ ? tokensToMarkdown(overviewSection.tokens)
265
+ : "";
266
+ // Current State
267
+ const currentStateSection = findSection(sections, /^Current\s+State/i, 2);
268
+ const currentStateIdx = currentStateSection
269
+ ? sections.indexOf(currentStateSection)
270
+ : -1;
271
+ let currentState = "";
272
+ let keyDiscoveries = [];
273
+ if (currentStateSection) {
274
+ // Get tokens that are in the current state section but NOT in the key discoveries sub-section
275
+ const subSections = collectSectionsUntilLevel(sections, currentStateIdx, 2);
276
+ const kdSection = subSections.find((s) => /Key\s+Discover/i.test(s.heading));
277
+ if (kdSection) {
278
+ keyDiscoveries = parseKeyDiscoveries(kdSection.tokens);
279
+ // currentState is everything in the current state section before key discoveries
280
+ const kdIdx = sections.indexOf(kdSection);
281
+ const beforeKd = [];
282
+ for (let i = currentStateIdx + 1; i < kdIdx; i++) {
283
+ // include sub-section headings+tokens as raw markdown
284
+ beforeKd.push(...sections[i].tokens);
285
+ }
286
+ currentState = tokensToMarkdown([
287
+ ...currentStateSection.tokens,
288
+ ...beforeKd,
289
+ ]);
290
+ }
291
+ else {
292
+ currentState = tokensToMarkdown(currentStateSection.tokens);
293
+ }
294
+ }
295
+ // Scope exclusions
296
+ const scopeSection = findSection(sections, /What\s+We.*NOT\s+Doing/i, 2);
297
+ const scopeExclusions = scopeSection
298
+ ? parseScopeExclusions(scopeSection.tokens)
299
+ : [];
300
+ // Implementation approach
301
+ const approachSection = findSection(sections, /Implementation\s+Approach/i, 2);
302
+ const implementationApproach = approachSection
303
+ ? tokensToMarkdown(approachSection.tokens)
304
+ : "";
305
+ // Phases
306
+ const phases = parsePhases(sections);
307
+ // Diagrams
308
+ const diagrams = [];
309
+ if (phases.length > 0) {
310
+ diagrams.push(generatePhaseFlowDiagram(phases));
311
+ }
312
+ // Testing strategy
313
+ const testingSection = findSection(sections, /Testing\s+Strategy/i, 2);
314
+ const testingIdx = testingSection ? sections.indexOf(testingSection) : -1;
315
+ const testingSubs = testingIdx >= 0 ? collectSectionsUntilLevel(sections, testingIdx, 2) : [];
316
+ const testingStrategy = testingSection
317
+ ? parseTestingStrategy(testingSection, testingSubs)
318
+ : { unit: [], integration: [], manual: [] };
319
+ // References
320
+ const refsSection = findSection(sections, /^References$/i, 2);
321
+ const references = refsSection ? parseReferences(refsSection.tokens) : [];
322
+ const now = new Date().toISOString();
323
+ return {
324
+ schemaVersion: 1,
325
+ meta: {
326
+ title,
327
+ date,
328
+ ticketRef,
329
+ markdownPath,
330
+ projectDir,
331
+ version,
332
+ createdAt: now,
333
+ updatedAt: now,
334
+ },
335
+ overview,
336
+ currentState,
337
+ keyDiscoveries,
338
+ scopeExclusions,
339
+ implementationApproach,
340
+ phases,
341
+ diagrams,
342
+ testingStrategy,
343
+ references,
344
+ };
345
+ }
@@ -0,0 +1,17 @@
1
+ export function generatePhaseFlowDiagram(phases) {
2
+ const lines = ["graph LR"];
3
+ for (const phase of phases) {
4
+ const nodeId = `P${phase.number}`;
5
+ const label = `Phase ${phase.number}: ${phase.name}`;
6
+ lines.push(` ${nodeId}["${label}"]`);
7
+ }
8
+ for (let i = 0; i < phases.length - 1; i++) {
9
+ lines.push(` P${phases[i].number} --> P${phases[i + 1].number}`);
10
+ }
11
+ return {
12
+ id: "phase-flow",
13
+ title: "Implementation Flow",
14
+ type: "flowchart",
15
+ mermaidCode: lines.join("\n"),
16
+ };
17
+ }
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "plan-assistant",
3
+ "version": "1.0.0-alpha.1",
4
+ "description": "Review implementation plans in the browser with live reload",
5
+ "homepage": "https://github.com/sanderdatema/plan_assistant#readme",
6
+ "bugs": {
7
+ "url": "https://github.com/sanderdatema/plan_assistant/issues"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/sanderdatema/plan_assistant.git"
12
+ },
13
+ "license": "MIT",
14
+ "author": "Sander Datema",
15
+ "type": "module",
16
+ "main": "svelte.config.js",
17
+ "bin": {
18
+ "plan-assistant": "bin/cli.js"
19
+ },
20
+ "files": [
21
+ "bin/",
22
+ "dist/",
23
+ "build/"
24
+ ],
25
+ "scripts": {
26
+ "dev": "vite dev --port 5199",
27
+ "build": "npm run build:cli && npm run build:server",
28
+ "build:cli": "tsc -p tsconfig.cli.json",
29
+ "build:server": "vite build",
30
+ "preview": "vite preview --port 5199",
31
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
32
+ "prepublishOnly": "npm run build"
33
+ },
34
+ "dependencies": {
35
+ "chokidar": "^4.0.3",
36
+ "marked": "^15.0.7"
37
+ },
38
+ "devDependencies": {
39
+ "@sveltejs/adapter-node": "^5.2.12",
40
+ "@sveltejs/kit": "^2.16.0",
41
+ "@sveltejs/vite-plugin-svelte": "^5.0.3",
42
+ "@tailwindcss/vite": "^4.1.4",
43
+ "@types/node": "^25.3.0",
44
+ "highlight.js": "^11.11.0",
45
+ "mermaid": "^11.6.0",
46
+ "svelte": "^5.20.0",
47
+ "svelte-check": "^4.1.0",
48
+ "tailwindcss": "^4.1.4",
49
+ "typescript": "^5.7.0",
50
+ "vite": "^6.2.0"
51
+ }
52
+ }
@@ -0,0 +1,11 @@
1
+ import adapter from '@sveltejs/adapter-node';
2
+ import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
3
+
4
+ const config = {
5
+ preprocess: vitePreprocess(),
6
+ kit: {
7
+ adapter: adapter()
8
+ }
9
+ };
10
+
11
+ export default config;