gsd-pi 2.44.0 → 2.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/README.md +30 -12
  2. package/dist/resources/extensions/gsd/activity-log.js +7 -0
  3. package/dist/resources/extensions/gsd/auto/infra-errors.js +3 -0
  4. package/dist/resources/extensions/gsd/auto/phases.js +37 -36
  5. package/dist/resources/extensions/gsd/auto-prompts.js +24 -1
  6. package/dist/resources/extensions/gsd/auto-start.js +31 -2
  7. package/dist/resources/extensions/gsd/auto-timers.js +57 -3
  8. package/dist/resources/extensions/gsd/auto-worktree-sync.js +4 -0
  9. package/dist/resources/extensions/gsd/auto-worktree.js +9 -6
  10. package/dist/resources/extensions/gsd/auto.js +30 -3
  11. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +156 -0
  12. package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -12
  13. package/dist/resources/extensions/gsd/commands/catalog.js +7 -1
  14. package/dist/resources/extensions/gsd/commands/handlers/core.js +2 -0
  15. package/dist/resources/extensions/gsd/commands/handlers/ops.js +10 -0
  16. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
  17. package/dist/resources/extensions/gsd/commands-mcp-status.js +187 -0
  18. package/dist/resources/extensions/gsd/db-writer.js +34 -16
  19. package/dist/resources/extensions/gsd/doctor.js +8 -0
  20. package/dist/resources/extensions/gsd/git-service.js +8 -3
  21. package/dist/resources/extensions/gsd/gsd-db.js +12 -1
  22. package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
  23. package/dist/resources/extensions/gsd/preferences.js +9 -1
  24. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +2 -4
  25. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  26. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
  27. package/dist/resources/extensions/gsd/prompts/replan-slice.md +3 -14
  28. package/dist/resources/extensions/gsd/prompts/rethink.md +78 -0
  29. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
  30. package/dist/resources/extensions/gsd/provider-error-pause.js +7 -0
  31. package/dist/resources/extensions/gsd/repo-identity.js +45 -7
  32. package/dist/resources/extensions/gsd/rethink.js +115 -0
  33. package/dist/resources/extensions/gsd/state.js +41 -3
  34. package/dist/resources/extensions/gsd/tools/plan-slice.js +1 -0
  35. package/dist/resources/extensions/gsd/tools/plan-task.js +1 -0
  36. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -0
  37. package/dist/resources/extensions/gsd/tools/validate-milestone.js +88 -0
  38. package/dist/resources/extensions/gsd/worktree-manager.js +32 -2
  39. package/dist/resources/extensions/gsd/worktree-resolver.js +6 -0
  40. package/dist/resources/extensions/mcp-client/index.js +14 -0
  41. package/dist/web/standalone/.next/BUILD_ID +1 -1
  42. package/dist/web/standalone/.next/app-path-routes-manifest.json +7 -7
  43. package/dist/web/standalone/.next/build-manifest.json +3 -3
  44. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  45. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  46. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  47. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  48. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  49. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  50. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  51. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  52. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  53. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  54. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  55. package/dist/web/standalone/.next/server/app/_not-found/page.js +1 -1
  56. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  57. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  58. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  59. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  60. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  61. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  62. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  63. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  64. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  65. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  66. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  67. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  68. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  69. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  70. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  71. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  72. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  73. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  74. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  75. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  76. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  77. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  78. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  79. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  80. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  82. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  83. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  84. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  85. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  86. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  87. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  88. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  90. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  92. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  93. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  94. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  96. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  98. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  105. package/dist/web/standalone/.next/server/app/index.html +1 -1
  106. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  107. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  108. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  109. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  111. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  112. package/dist/web/standalone/.next/server/app/page.js +1 -1
  113. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/app-paths-manifest.json +7 -7
  115. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  116. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  118. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  119. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  120. package/dist/web/standalone/.next/static/chunks/4024.11ca5c01938e5948.js +9 -0
  121. package/dist/web/standalone/.next/static/chunks/{3721.bf31263de6d5fa46.js → 485.243af25f0cdf50d6.js} +2 -2
  122. package/dist/web/standalone/.next/static/chunks/app/{page-7e9530a7122506c5.js → page-12dd5ece0df4badc.js} +1 -1
  123. package/dist/web/standalone/.next/static/chunks/webpack-0a4cd455ec4197d2.js +1 -0
  124. package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +1 -0
  125. package/package.json +1 -1
  126. package/packages/native/dist/stream-process/index.js +2 -2
  127. package/packages/native/src/__tests__/stream-process.test.mjs +34 -0
  128. package/packages/native/src/stream-process/index.ts +2 -2
  129. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +3 -1
  130. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  131. package/packages/pi-coding-agent/dist/core/auth-storage.js +15 -1
  132. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  133. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
  134. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  135. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
  136. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  137. package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
  138. package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
  139. package/packages/pi-coding-agent/dist/core/local-model-check.d.ts +15 -0
  140. package/packages/pi-coding-agent/dist/core/local-model-check.d.ts.map +1 -0
  141. package/packages/pi-coding-agent/dist/core/local-model-check.js +41 -0
  142. package/packages/pi-coding-agent/dist/core/local-model-check.js.map +1 -0
  143. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +11 -0
  144. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  145. package/packages/pi-coding-agent/dist/core/model-registry.js +20 -1
  146. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  147. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
  148. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  149. package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
  150. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  151. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  152. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  153. package/packages/pi-coding-agent/dist/core/settings-manager.js +6 -0
  154. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  155. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
  156. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
  157. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  158. package/packages/pi-coding-agent/dist/main.js +17 -0
  159. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  160. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts +2 -0
  161. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts.map +1 -0
  162. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js +32 -0
  163. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js.map +1 -0
  164. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +3 -1
  165. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  166. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +8 -1
  167. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  168. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  169. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  170. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +12 -0
  171. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  172. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts +15 -0
  173. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts.map +1 -0
  174. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js +40 -0
  175. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js.map +1 -0
  176. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  177. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +4 -1
  178. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  179. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +5 -2
  180. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  181. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +13 -2
  182. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  183. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  184. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +17 -8
  185. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  186. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  187. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +7 -3
  188. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  189. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
  190. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
  191. package/packages/pi-coding-agent/package.json +1 -1
  192. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
  193. package/packages/pi-coding-agent/src/core/auth-storage.ts +15 -1
  194. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
  195. package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
  196. package/packages/pi-coding-agent/src/core/local-model-check.ts +45 -0
  197. package/packages/pi-coding-agent/src/core/model-registry.ts +21 -1
  198. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
  199. package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
  200. package/packages/pi-coding-agent/src/core/settings-manager.ts +9 -0
  201. package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
  202. package/packages/pi-coding-agent/src/main.ts +19 -0
  203. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +38 -0
  204. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +10 -0
  205. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
  206. package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +48 -0
  207. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +3 -1
  208. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +18 -3
  209. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +16 -7
  210. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +8 -1
  211. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
  212. package/pkg/package.json +1 -1
  213. package/src/resources/extensions/gsd/activity-log.ts +1 -0
  214. package/src/resources/extensions/gsd/auto/infra-errors.ts +3 -0
  215. package/src/resources/extensions/gsd/auto/phases.ts +46 -48
  216. package/src/resources/extensions/gsd/auto-prompts.ts +24 -1
  217. package/src/resources/extensions/gsd/auto-start.ts +39 -2
  218. package/src/resources/extensions/gsd/auto-timers.ts +64 -3
  219. package/src/resources/extensions/gsd/auto-worktree-sync.ts +5 -0
  220. package/src/resources/extensions/gsd/auto-worktree.ts +9 -6
  221. package/src/resources/extensions/gsd/auto.ts +37 -3
  222. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +148 -0
  223. package/src/resources/extensions/gsd/bootstrap/system-context.ts +48 -11
  224. package/src/resources/extensions/gsd/commands/catalog.ts +7 -1
  225. package/src/resources/extensions/gsd/commands/handlers/core.ts +2 -0
  226. package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -0
  227. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
  228. package/src/resources/extensions/gsd/commands-mcp-status.ts +247 -0
  229. package/src/resources/extensions/gsd/db-writer.ts +39 -17
  230. package/src/resources/extensions/gsd/doctor.ts +7 -1
  231. package/src/resources/extensions/gsd/git-service.ts +6 -2
  232. package/src/resources/extensions/gsd/gsd-db.ts +16 -1
  233. package/src/resources/extensions/gsd/markdown-renderer.ts +1 -1
  234. package/src/resources/extensions/gsd/preferences.ts +11 -1
  235. package/src/resources/extensions/gsd/prompts/complete-milestone.md +2 -4
  236. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  237. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
  238. package/src/resources/extensions/gsd/prompts/replan-slice.md +3 -14
  239. package/src/resources/extensions/gsd/prompts/rethink.md +78 -0
  240. package/src/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
  241. package/src/resources/extensions/gsd/provider-error-pause.ts +9 -0
  242. package/src/resources/extensions/gsd/repo-identity.ts +46 -7
  243. package/src/resources/extensions/gsd/rethink.ts +154 -0
  244. package/src/resources/extensions/gsd/state.ts +41 -1
  245. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
  246. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +14 -16
  247. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
  248. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +88 -0
  249. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
  250. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +465 -523
  251. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
  252. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
  253. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +533 -656
  254. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
  255. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
  256. package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
  257. package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
  258. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
  259. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
  260. package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
  261. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +38 -59
  262. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +228 -263
  263. package/src/resources/extensions/gsd/tests/complete-task.test.ts +250 -302
  264. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +114 -0
  265. package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
  266. package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
  267. package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
  268. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +27 -35
  269. package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
  270. package/src/resources/extensions/gsd/tests/db-writer.test.ts +465 -416
  271. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
  272. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +68 -83
  273. package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +121 -0
  274. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +210 -181
  275. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
  276. package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
  277. package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
  278. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
  279. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +164 -180
  280. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
  281. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
  282. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +27 -29
  283. package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
  284. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +54 -75
  285. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +21 -32
  286. package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
  287. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -44
  288. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
  289. package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
  290. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +54 -60
  291. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
  292. package/src/resources/extensions/gsd/tests/doctor.test.ts +104 -134
  293. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
  294. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +120 -0
  295. package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
  296. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
  297. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
  298. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +30 -42
  299. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +198 -206
  300. package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
  301. package/src/resources/extensions/gsd/tests/git-service.test.ts +285 -388
  302. package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
  303. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
  304. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
  305. package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
  306. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +81 -103
  307. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
  308. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
  309. package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
  310. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +81 -102
  311. package/src/resources/extensions/gsd/tests/infra-error.test.ts +20 -2
  312. package/src/resources/extensions/gsd/tests/inherited-repo-home-dir.test.ts +121 -0
  313. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
  314. package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
  315. package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
  316. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
  317. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +18 -18
  318. package/src/resources/extensions/gsd/tests/knowledge.test.ts +89 -0
  319. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +150 -194
  320. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +103 -0
  321. package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
  322. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
  323. package/src/resources/extensions/gsd/tests/memory-store.test.ts +80 -93
  324. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +66 -0
  325. package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
  326. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +83 -93
  327. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
  328. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
  329. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
  330. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +87 -96
  331. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +125 -164
  332. package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
  333. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +35 -36
  334. package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
  335. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +40 -47
  336. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
  337. package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
  338. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
  339. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
  340. package/src/resources/extensions/gsd/tests/parsers.test.ts +546 -611
  341. package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
  342. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
  343. package/src/resources/extensions/gsd/tests/preferences.test.ts +27 -0
  344. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +11 -7
  345. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
  346. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
  347. package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
  348. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
  349. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
  350. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
  351. package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
  352. package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +176 -0
  353. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
  354. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
  355. package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
  356. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
  357. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
  358. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
  359. package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
  360. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
  361. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -44
  362. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +19 -26
  363. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
  364. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
  365. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +67 -0
  366. package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +108 -0
  367. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
  368. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +49 -0
  369. package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
  370. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
  371. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +10 -11
  372. package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
  373. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
  374. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
  375. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
  376. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
  377. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
  378. package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
  379. package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
  380. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
  381. package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
  382. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
  383. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
  384. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
  385. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
  386. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
  387. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +65 -0
  388. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
  389. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
  390. package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
  391. package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -0
  392. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -0
  393. package/src/resources/extensions/gsd/tools/replan-slice.ts +3 -0
  394. package/src/resources/extensions/gsd/tools/validate-milestone.ts +127 -0
  395. package/src/resources/extensions/gsd/worktree-manager.ts +43 -2
  396. package/src/resources/extensions/gsd/worktree-resolver.ts +7 -0
  397. package/src/resources/extensions/mcp-client/index.ts +20 -0
  398. package/dist/web/standalone/.next/static/chunks/4024.0de81b543b28b9fe.js +0 -9
  399. package/dist/web/standalone/.next/static/chunks/webpack-9014b5adb127a98a.js +0 -1
  400. package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +0 -1
  401. /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → wUzEX1U3CmFcMry2SUDJn}/_buildManifest.js +0 -0
  402. /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → wUzEX1U3CmFcMry2SUDJn}/_ssgManifest.js +0 -0
@@ -15,9 +15,9 @@ import {
15
15
  parseOldState,
16
16
  parseOldConfig,
17
17
  } from '../migrate/parsers.ts';
18
- import { createTestContext } from './test-helpers.ts';
18
+ import { describe, test, beforeEach, afterEach } from 'node:test';
19
+ import assert from 'node:assert/strict';
19
20
 
20
- const { assertEq, assertTrue, report } = createTestContext();
21
21
  function createFixtureBase(): string {
22
22
  return mkdtempSync(join(tmpdir(), 'gsd-migrate-t02-'));
23
23
  }
@@ -173,55 +173,49 @@ const SAMPLE_STATE = `# State
173
173
  **Status:** in-progress
174
174
  `;
175
175
 
176
- async function main(): Promise<void> {
177
-
178
176
  // ═══════════════════════════════════════════════════════════════════════
179
177
  // Validator Tests
180
178
  // ═══════════════════════════════════════════════════════════════════════
181
179
 
182
- console.log('\n=== Validator: missing directory → fatal ===');
183
- {
180
+ test('Validator: missing directory → fatal', async () => {
184
181
  const base = createFixtureBase();
185
182
  try {
186
183
  const result = await validatePlanningDirectory(join(base, 'nonexistent'));
187
- assertEq(result.valid, false, 'missing dir: validation fails');
188
- assertTrue(result.issues.length > 0, 'missing dir: has issues');
189
- assertTrue(result.issues.some(i => i.severity === 'fatal'), 'missing dir: has fatal issue');
184
+ assert.deepStrictEqual(result.valid, false, 'missing dir: validation fails');
185
+ assert.ok(result.issues.length > 0, 'missing dir: has issues');
186
+ assert.ok(result.issues.some(i => i.severity === 'fatal'), 'missing dir: has fatal issue');
190
187
  } finally {
191
188
  cleanup(base);
192
189
  }
193
- }
190
+ });
194
191
 
195
- console.log('\n=== Validator: missing ROADMAP.md → warning (not fatal) ===');
196
- {
192
+ test('Validator: missing ROADMAP.md → warning (not fatal)', async () => {
197
193
  const base = createFixtureBase();
198
194
  try {
199
195
  const planning = createPlanningDir(base);
200
196
  writeFileSync(join(planning, 'PROJECT.md'), SAMPLE_PROJECT);
201
197
  const result = await validatePlanningDirectory(planning);
202
- assertEq(result.valid, true, 'no roadmap: validation still passes');
203
- assertTrue(result.issues.some(i => i.severity === 'warning' && i.file.includes('ROADMAP')), 'no roadmap: warning issue mentions ROADMAP');
198
+ assert.deepStrictEqual(result.valid, true, 'no roadmap: validation still passes');
199
+ assert.ok(result.issues.some(i => i.severity === 'warning' && i.file.includes('ROADMAP')), 'no roadmap: warning issue mentions ROADMAP');
204
200
  } finally {
205
201
  cleanup(base);
206
202
  }
207
- }
203
+ });
208
204
 
209
- console.log('\n=== Validator: missing PROJECT.md → warning ===');
210
- {
205
+ test('Validator: missing PROJECT.md → warning', async () => {
211
206
  const base = createFixtureBase();
212
207
  try {
213
208
  const planning = createPlanningDir(base);
214
209
  writeFileSync(join(planning, 'ROADMAP.md'), SAMPLE_ROADMAP);
215
210
  const result = await validatePlanningDirectory(planning);
216
- assertEq(result.valid, true, 'no project: validation passes (warning only)');
217
- assertTrue(result.issues.some(i => i.severity === 'warning' && i.file.includes('PROJECT')), 'no project: warning issue mentions PROJECT');
211
+ assert.deepStrictEqual(result.valid, true, 'no project: validation passes (warning only)');
212
+ assert.ok(result.issues.some(i => i.severity === 'warning' && i.file.includes('PROJECT')), 'no project: warning issue mentions PROJECT');
218
213
  } finally {
219
214
  cleanup(base);
220
215
  }
221
- }
216
+ });
222
217
 
223
- console.log('\n=== Validator: complete directory → valid with no issues ===');
224
- {
218
+ test('Validator: complete directory → valid with no issues', async () => {
225
219
  const base = createFixtureBase();
226
220
  try {
227
221
  const planning = createPlanningDir(base);
@@ -231,78 +225,74 @@ async function main(): Promise<void> {
231
225
  writeFileSync(join(planning, 'STATE.md'), SAMPLE_STATE);
232
226
  mkdirSync(join(planning, 'phases'), { recursive: true });
233
227
  const result = await validatePlanningDirectory(planning);
234
- assertEq(result.valid, true, 'complete dir: validation passes');
235
- assertEq(result.issues.length, 0, 'complete dir: no issues');
228
+ assert.deepStrictEqual(result.valid, true, 'complete dir: validation passes');
229
+ assert.deepStrictEqual(result.issues.length, 0, 'complete dir: no issues');
236
230
  } finally {
237
231
  cleanup(base);
238
232
  }
239
- }
233
+ });
240
234
 
241
235
  // ═══════════════════════════════════════════════════════════════════════
242
236
  // Roadmap Parser Tests
243
237
  // ═══════════════════════════════════════════════════════════════════════
244
238
 
245
- console.log('\n=== parseOldRoadmap: flat format ===');
246
- {
239
+ test('parseOldRoadmap: flat format', () => {
247
240
  const roadmap = parseOldRoadmap(SAMPLE_ROADMAP);
248
- assertEq(roadmap.milestones.length, 0, 'flat roadmap: no milestone sections');
249
- assertEq(roadmap.phases.length, 3, 'flat roadmap: 3 phases');
250
- assertEq(roadmap.phases[0].number, 29, 'flat roadmap: first phase number');
251
- assertEq(roadmap.phases[0].title, 'Auth System', 'flat roadmap: first phase title');
252
- assertEq(roadmap.phases[0].done, true, 'flat roadmap: first phase done');
253
- assertEq(roadmap.phases[1].done, false, 'flat roadmap: second phase not done');
254
- }
255
-
256
- console.log('\n=== parseOldRoadmap: milestone-sectioned with <details> ===');
257
- {
241
+ assert.deepStrictEqual(roadmap.milestones.length, 0, 'flat roadmap: no milestone sections');
242
+ assert.deepStrictEqual(roadmap.phases.length, 3, 'flat roadmap: 3 phases');
243
+ assert.deepStrictEqual(roadmap.phases[0].number, 29, 'flat roadmap: first phase number');
244
+ assert.deepStrictEqual(roadmap.phases[0].title, 'Auth System', 'flat roadmap: first phase title');
245
+ assert.deepStrictEqual(roadmap.phases[0].done, true, 'flat roadmap: first phase done');
246
+ assert.deepStrictEqual(roadmap.phases[1].done, false, 'flat roadmap: second phase not done');
247
+ });
248
+
249
+ test('parseOldRoadmap: milestone-sectioned with <details>', () => {
258
250
  const roadmap = parseOldRoadmap(SAMPLE_MILESTONE_SECTIONED_ROADMAP);
259
- assertTrue(roadmap.milestones.length >= 2, 'ms roadmap: has milestone sections');
251
+ assert.ok(roadmap.milestones.length >= 2, 'ms roadmap: has milestone sections');
260
252
 
261
253
  const v20 = roadmap.milestones.find(m => m.id.includes('2.0'));
262
- assertTrue(v20 !== undefined, 'ms roadmap: v2.0 found');
263
- assertEq(v20?.collapsed, true, 'ms roadmap: v2.0 collapsed');
264
- assertTrue((v20?.phases.length ?? 0) >= 2, 'ms roadmap: v2.0 has phases');
265
- assertTrue(v20?.phases.every(p => p.done) ?? false, 'ms roadmap: v2.0 all done');
254
+ assert.ok(v20 !== undefined, 'ms roadmap: v2.0 found');
255
+ assert.deepStrictEqual(v20?.collapsed, true, 'ms roadmap: v2.0 collapsed');
256
+ assert.ok((v20?.phases.length ?? 0) >= 2, 'ms roadmap: v2.0 has phases');
257
+ assert.ok(v20?.phases.every(p => p.done) ?? false, 'ms roadmap: v2.0 all done');
266
258
 
267
259
  const v25 = roadmap.milestones.find(m => m.id.includes('2.5'));
268
- assertTrue(v25 !== undefined, 'ms roadmap: v2.5 found');
269
- assertEq(v25?.collapsed, false, 'ms roadmap: v2.5 not collapsed');
270
- assertTrue((v25?.phases.length ?? 0) >= 3, 'ms roadmap: v2.5 has 3 phases');
260
+ assert.ok(v25 !== undefined, 'ms roadmap: v2.5 found');
261
+ assert.deepStrictEqual(v25?.collapsed, false, 'ms roadmap: v2.5 not collapsed');
262
+ assert.ok((v25?.phases.length ?? 0) >= 3, 'ms roadmap: v2.5 has 3 phases');
271
263
 
272
264
  const p29 = v25?.phases.find(p => p.number === 29);
273
- assertEq(p29?.done, true, 'ms roadmap: phase 29 done');
265
+ assert.deepStrictEqual(p29?.done, true, 'ms roadmap: phase 29 done');
274
266
  const p30 = v25?.phases.find(p => p.number === 30);
275
- assertEq(p30?.done, false, 'ms roadmap: phase 30 not done');
276
- }
267
+ assert.deepStrictEqual(p30?.done, false, 'ms roadmap: phase 30 not done');
268
+ });
277
269
 
278
270
  // ═══════════════════════════════════════════════════════════════════════
279
271
  // Plan Parser Tests
280
272
  // ═══════════════════════════════════════════════════════════════════════
281
273
 
282
- console.log('\n=== parseOldPlan: XML-in-markdown ===');
283
- {
274
+ test('parseOldPlan: XML-in-markdown', () => {
284
275
  const plan = parseOldPlan(SAMPLE_PLAN_XML, '29-01-PLAN.md', '01');
285
- assertTrue(plan.objective.includes('authentication'), 'plan: objective extracted');
286
- assertEq(plan.tasks.length, 3, 'plan: 3 tasks');
287
- assertTrue(plan.tasks[0].includes('auth middleware'), 'plan: first task content');
288
- assertTrue(plan.context.includes('JWT'), 'plan: context extracted');
289
- assertTrue(plan.verification.includes('Login returns'), 'plan: verification extracted');
290
- assertTrue(plan.successCriteria.includes('endpoints respond'), 'plan: success criteria extracted');
276
+ assert.ok(plan.objective.includes('authentication'), 'plan: objective extracted');
277
+ assert.deepStrictEqual(plan.tasks.length, 3, 'plan: 3 tasks');
278
+ assert.ok(plan.tasks[0].includes('auth middleware'), 'plan: first task content');
279
+ assert.ok(plan.context.includes('JWT'), 'plan: context extracted');
280
+ assert.ok(plan.verification.includes('Login returns'), 'plan: verification extracted');
281
+ assert.ok(plan.successCriteria.includes('endpoints respond'), 'plan: success criteria extracted');
291
282
 
292
283
  // Frontmatter
293
- assertEq(plan.frontmatter.phase, '29-auth-system', 'plan fm: phase');
294
- assertEq(plan.frontmatter.plan, '01', 'plan fm: plan');
295
- assertEq(plan.frontmatter.type, 'implementation', 'plan fm: type');
296
- assertEq(plan.frontmatter.wave, 1, 'plan fm: wave');
297
- assertEq(plan.frontmatter.autonomous, true, 'plan fm: autonomous');
298
- assertTrue(plan.frontmatter.files_modified.length >= 2, 'plan fm: files_modified');
299
- assertTrue(plan.frontmatter.must_haves !== null, 'plan fm: must_haves parsed');
300
- assertTrue((plan.frontmatter.must_haves?.truths.length ?? 0) >= 1, 'plan fm: must_haves truths');
301
- assertTrue((plan.frontmatter.must_haves?.artifacts.length ?? 0) >= 1, 'plan fm: must_haves artifacts');
302
- }
303
-
304
- console.log('\n=== parseOldPlan: plain markdown (no XML tags) ===');
305
- {
284
+ assert.deepStrictEqual(plan.frontmatter.phase, '29-auth-system', 'plan fm: phase');
285
+ assert.deepStrictEqual(plan.frontmatter.plan, '01', 'plan fm: plan');
286
+ assert.deepStrictEqual(plan.frontmatter.type, 'implementation', 'plan fm: type');
287
+ assert.deepStrictEqual(plan.frontmatter.wave, 1, 'plan fm: wave');
288
+ assert.deepStrictEqual(plan.frontmatter.autonomous, true, 'plan fm: autonomous');
289
+ assert.ok(plan.frontmatter.files_modified.length >= 2, 'plan fm: files_modified');
290
+ assert.ok(plan.frontmatter.must_haves !== null, 'plan fm: must_haves parsed');
291
+ assert.ok((plan.frontmatter.must_haves?.truths.length ?? 0) >= 1, 'plan fm: must_haves truths');
292
+ assert.ok((plan.frontmatter.must_haves?.artifacts.length ?? 0) >= 1, 'plan fm: must_haves artifacts');
293
+ });
294
+
295
+ test('parseOldPlan: plain markdown (no XML tags)', () => {
306
296
  const plainPlan = `# 001: Fix Login Bug
307
297
 
308
298
  ## Description
@@ -315,100 +305,86 @@ Fix the login button not responding on mobile.
315
305
  2. Fix event propagation
316
306
  `;
317
307
  const plan = parseOldPlan(plainPlan, '001-PLAN.md', '001');
318
- assertEq(plan.objective, '', 'plain plan: no objective (no XML)');
319
- assertEq(plan.tasks.length, 0, 'plain plan: no tasks (no XML)');
320
- assertEq(plan.frontmatter.phase, '', 'plain plan: no frontmatter phase');
321
- }
308
+ assert.deepStrictEqual(plan.objective, '', 'plain plan: no objective (no XML)');
309
+ assert.deepStrictEqual(plan.tasks.length, 0, 'plain plan: no tasks (no XML)');
310
+ assert.deepStrictEqual(plan.frontmatter.phase, '', 'plain plan: no frontmatter phase');
311
+ });
322
312
 
323
313
  // ═══════════════════════════════════════════════════════════════════════
324
314
  // Summary Parser Tests
325
315
  // ═══════════════════════════════════════════════════════════════════════
326
316
 
327
- console.log('\n=== parseOldSummary: YAML frontmatter ===');
328
- {
317
+ test('parseOldSummary: YAML frontmatter', () => {
329
318
  const summary = parseOldSummary(SAMPLE_SUMMARY, '29-01-SUMMARY.md', '01');
330
- assertEq(summary.frontmatter.phase, '29-auth-system', 'summary fm: phase');
331
- assertEq(summary.frontmatter.plan, '01', 'summary fm: plan');
332
- assertEq(summary.frontmatter.subsystem, 'auth', 'summary fm: subsystem');
333
- assertEq(summary.frontmatter.tags, ['authentication', 'security'], 'summary fm: tags');
334
- assertEq(summary.frontmatter.provides, ['auth-middleware', 'jwt-validation'], 'summary fm: provides');
335
- assertEq(summary.frontmatter.affects, ['api-routes'], 'summary fm: affects');
336
- assertEq(summary.frontmatter['tech-stack'], ['jsonwebtoken', 'express'], 'summary fm: tech-stack');
337
- assertEq(summary.frontmatter['key-files'], ['src/auth.ts', 'src/middleware/auth.ts'], 'summary fm: key-files');
338
- assertEq(summary.frontmatter['key-decisions'], ['Use RS256 for JWT signing', 'Store refresh tokens in DB'], 'summary fm: key-decisions');
339
- assertEq(summary.frontmatter['patterns-established'], ['Middleware-based auth'], 'summary fm: patterns-established');
340
- assertEq(summary.frontmatter.duration, '2h', 'summary fm: duration');
341
- assertEq(summary.frontmatter.completed, '2026-01-15', 'summary fm: completed');
342
- assertTrue(summary.body.includes('Auth Implementation Summary'), 'summary: body content present');
343
- }
319
+ assert.deepStrictEqual(summary.frontmatter.phase, '29-auth-system', 'summary fm: phase');
320
+ assert.deepStrictEqual(summary.frontmatter.plan, '01', 'summary fm: plan');
321
+ assert.deepStrictEqual(summary.frontmatter.subsystem, 'auth', 'summary fm: subsystem');
322
+ assert.deepStrictEqual(summary.frontmatter.tags, ['authentication', 'security'], 'summary fm: tags');
323
+ assert.deepStrictEqual(summary.frontmatter.provides, ['auth-middleware', 'jwt-validation'], 'summary fm: provides');
324
+ assert.deepStrictEqual(summary.frontmatter.affects, ['api-routes'], 'summary fm: affects');
325
+ assert.deepStrictEqual(summary.frontmatter['tech-stack'], ['jsonwebtoken', 'express'], 'summary fm: tech-stack');
326
+ assert.deepStrictEqual(summary.frontmatter['key-files'], ['src/auth.ts', 'src/middleware/auth.ts'], 'summary fm: key-files');
327
+ assert.deepStrictEqual(summary.frontmatter['key-decisions'], ['Use RS256 for JWT signing', 'Store refresh tokens in DB'], 'summary fm: key-decisions');
328
+ assert.deepStrictEqual(summary.frontmatter['patterns-established'], ['Middleware-based auth'], 'summary fm: patterns-established');
329
+ assert.deepStrictEqual(summary.frontmatter.duration, '2h', 'summary fm: duration');
330
+ assert.deepStrictEqual(summary.frontmatter.completed, '2026-01-15', 'summary fm: completed');
331
+ assert.ok(summary.body.includes('Auth Implementation Summary'), 'summary: body content present');
332
+ });
344
333
 
345
334
  // ═══════════════════════════════════════════════════════════════════════
346
335
  // Requirements Parser Tests
347
336
  // ═══════════════════════════════════════════════════════════════════════
348
337
 
349
- console.log('\n=== parseOldRequirements ===');
350
- {
338
+ test('parseOldRequirements', () => {
351
339
  const reqs = parseOldRequirements(SAMPLE_REQUIREMENTS);
352
- assertEq(reqs.length, 4, 'requirements: 4 entries');
353
- assertEq(reqs[0].id, 'R001', 'req 0: id');
354
- assertEq(reqs[0].title, 'User Authentication', 'req 0: title');
355
- assertEq(reqs[0].status, 'active', 'req 0: status');
356
- assertTrue(reqs[0].description.includes('log in'), 'req 0: description');
357
- assertEq(reqs[2].id, 'R003', 'req 2: id');
358
- assertEq(reqs[2].status, 'validated', 'req 2: status');
359
- assertEq(reqs[3].id, 'R004', 'req 3: id');
360
- assertEq(reqs[3].status, 'deferred', 'req 3: status');
361
- }
340
+ assert.deepStrictEqual(reqs.length, 4, 'requirements: 4 entries');
341
+ assert.deepStrictEqual(reqs[0].id, 'R001', 'req 0: id');
342
+ assert.deepStrictEqual(reqs[0].title, 'User Authentication', 'req 0: title');
343
+ assert.deepStrictEqual(reqs[0].status, 'active', 'req 0: status');
344
+ assert.ok(reqs[0].description.includes('log in'), 'req 0: description');
345
+ assert.deepStrictEqual(reqs[2].id, 'R003', 'req 2: id');
346
+ assert.deepStrictEqual(reqs[2].status, 'validated', 'req 2: status');
347
+ assert.deepStrictEqual(reqs[3].id, 'R004', 'req 3: id');
348
+ assert.deepStrictEqual(reqs[3].status, 'deferred', 'req 3: status');
349
+ });
362
350
 
363
351
  // ═══════════════════════════════════════════════════════════════════════
364
352
  // State Parser Tests
365
353
  // ═══════════════════════════════════════════════════════════════════════
366
354
 
367
- console.log('\n=== parseOldState ===');
368
- {
355
+ test('parseOldState', () => {
369
356
  const state = parseOldState(SAMPLE_STATE);
370
- assertTrue(state.currentPhase?.includes('30') ?? false, 'state: current phase includes 30');
371
- assertEq(state.status, 'in-progress', 'state: status');
372
- assertTrue(state.raw === SAMPLE_STATE, 'state: raw preserved');
373
- }
357
+ assert.ok(state.currentPhase?.includes('30') ?? false, 'state: current phase includes 30');
358
+ assert.deepStrictEqual(state.status, 'in-progress', 'state: status');
359
+ assert.ok(state.raw === SAMPLE_STATE, 'state: raw preserved');
360
+ });
374
361
 
375
362
  // ═══════════════════════════════════════════════════════════════════════
376
363
  // Config Parser Tests
377
364
  // ═══════════════════════════════════════════════════════════════════════
378
365
 
379
- console.log('\n=== parseOldConfig: valid JSON ===');
380
- {
366
+ test('parseOldConfig: valid JSON', () => {
381
367
  const config = parseOldConfig('{"projectName":"test","version":"1.0"}');
382
- assertTrue(config !== null, 'config: parsed');
383
- assertEq(config?.projectName, 'test', 'config: projectName');
384
- }
368
+ assert.ok(config !== null, 'config: parsed');
369
+ assert.deepStrictEqual(config?.projectName, 'test', 'config: projectName');
370
+ });
385
371
 
386
- console.log('\n=== parseOldConfig: invalid JSON → null ===');
387
- {
372
+ test('parseOldConfig: invalid JSON → null', () => {
388
373
  const config = parseOldConfig('not json at all {{{');
389
- assertEq(config, null, 'config: invalid JSON returns null');
390
- }
374
+ assert.deepStrictEqual(config, null, 'config: invalid JSON returns null');
375
+ });
391
376
 
392
- console.log('\n=== parseOldConfig: non-object JSON → null ===');
393
- {
377
+ test('parseOldConfig: non-object JSON → null', () => {
394
378
  const config = parseOldConfig('"just a string"');
395
- assertEq(config, null, 'config: non-object returns null');
396
- }
379
+ assert.deepStrictEqual(config, null, 'config: non-object returns null');
380
+ });
397
381
 
398
382
  // ═══════════════════════════════════════════════════════════════════════
399
383
  // Project Parser Tests
400
384
  // ═══════════════════════════════════════════════════════════════════════
401
385
 
402
- console.log('\n=== parseOldProject ===');
403
- {
386
+ test('parseOldProject', () => {
404
387
  const project = parseOldProject(SAMPLE_PROJECT);
405
- assertEq(project, SAMPLE_PROJECT, 'project: returns raw content');
406
- }
407
-
408
- report();
409
- }
410
-
411
- main().catch((error) => {
412
- console.error(error);
413
- process.exit(1);
388
+ assert.deepStrictEqual(project, SAMPLE_PROJECT, 'project: returns raw content');
414
389
  });
390
+