gsd-pi 2.43.0-next.8 → 2.44.0-dev.0b97ffd

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 (399) hide show
  1. package/README.md +30 -12
  2. package/dist/cli.js +13 -1
  3. package/dist/help-text.js +24 -0
  4. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +21 -8
  5. package/dist/resources/extensions/gsd/auto-prompts.js +130 -51
  6. package/dist/resources/extensions/gsd/auto-start.js +10 -0
  7. package/dist/resources/extensions/gsd/auto-worktree.js +16 -2
  8. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
  9. package/dist/resources/extensions/gsd/dispatch-guard.js +34 -10
  10. package/dist/resources/extensions/gsd/markdown-renderer.js +7 -5
  11. package/dist/resources/extensions/gsd/reactive-graph.js +13 -2
  12. package/dist/resources/extensions/gsd/skill-health.js +3 -1
  13. package/dist/resources/extensions/gsd/tools/plan-milestone.js +2 -11
  14. package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -10
  15. package/dist/resources/extensions/gsd/visualizer-data.js +45 -13
  16. package/dist/resources/extensions/gsd/workspace-index.js +46 -15
  17. package/dist/web/standalone/.next/BUILD_ID +1 -1
  18. package/dist/web/standalone/.next/app-path-routes-manifest.json +18 -18
  19. package/dist/web/standalone/.next/build-manifest.json +3 -3
  20. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  21. package/dist/web/standalone/.next/required-server-files.json +4 -4
  22. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  23. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  24. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  25. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  26. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  27. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  28. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  29. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  30. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  31. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  32. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  33. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  34. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  35. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  36. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  37. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  38. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  39. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  40. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  41. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  42. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  43. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  44. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  45. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  46. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  47. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  48. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  49. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  50. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  51. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  52. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  53. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  54. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  55. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  56. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  57. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  58. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  59. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  60. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  61. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  62. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  63. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  64. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  65. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  66. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  67. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  68. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  69. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  70. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  71. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  72. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  73. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  74. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  75. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  76. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  77. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  78. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  79. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  80. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  82. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  83. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  84. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  85. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  86. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  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.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  90. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  92. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  93. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  94. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  96. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  98. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  109. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  111. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  113. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/index.html +1 -1
  123. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  124. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  125. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  126. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  128. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/page.js +2 -2
  130. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app-paths-manifest.json +18 -18
  132. package/dist/web/standalone/.next/server/chunks/229.js +1 -1
  133. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  134. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/middleware.js +2 -2
  136. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  138. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  139. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  140. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  141. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-f2a7482d42a5614b.js +1 -0
  142. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +1 -0
  143. package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +1 -0
  144. package/dist/web/standalone/.next/static/chunks/{main-app-2f2ee7b85712c2bd.js → main-app-fdab67f7802d7832.js} +1 -1
  145. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  146. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  147. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  148. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  149. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  150. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  151. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  152. package/dist/web/standalone/server.js +1 -1
  153. package/package.json +4 -4
  154. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +3 -3
  155. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  156. package/packages/pi-coding-agent/dist/core/agent-session.js +11 -34
  157. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  158. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
  159. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  160. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts +2 -2
  161. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  162. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
  163. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +2 -2
  164. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  165. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  166. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +4 -4
  167. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  168. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  169. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  170. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  171. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  172. package/packages/pi-coding-agent/dist/core/extensions/loader.js +18 -0
  173. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  174. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
  175. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  176. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +37 -0
  177. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  178. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  179. package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts.map +1 -1
  180. package/packages/pi-coding-agent/dist/core/fallback-resolver.js +2 -3
  181. package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -1
  182. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +12 -2
  183. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -1
  184. package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
  185. package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
  186. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +38 -0
  187. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -0
  188. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +192 -0
  189. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -0
  190. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts +2 -0
  191. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts.map +1 -0
  192. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +255 -0
  193. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -0
  194. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +15 -0
  195. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  196. package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
  197. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  198. package/packages/pi-coding-agent/dist/core/package-commands.d.ts +25 -0
  199. package/packages/pi-coding-agent/dist/core/package-commands.d.ts.map +1 -0
  200. package/packages/pi-coding-agent/dist/core/package-commands.js +253 -0
  201. package/packages/pi-coding-agent/dist/core/package-commands.js.map +1 -0
  202. package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts +2 -0
  203. package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts.map +1 -0
  204. package/packages/pi-coding-agent/dist/core/package-commands.test.js +225 -0
  205. package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -0
  206. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
  207. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  208. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  209. package/packages/pi-coding-agent/dist/core/sdk.js +4 -0
  210. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  211. package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
  212. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  213. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
  214. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
  215. package/packages/pi-coding-agent/dist/index.d.ts +3 -1
  216. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  217. package/packages/pi-coding-agent/dist/index.js +1 -0
  218. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  219. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  220. package/packages/pi-coding-agent/dist/main.js +11 -199
  221. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  222. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
  223. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
  224. package/packages/pi-coding-agent/package.json +1 -1
  225. package/packages/pi-coding-agent/src/core/agent-session.ts +13 -37
  226. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
  227. package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +2 -2
  228. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +3 -3
  229. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +4 -4
  230. package/packages/pi-coding-agent/src/core/extensions/index.ts +5 -0
  231. package/packages/pi-coding-agent/src/core/extensions/loader.ts +23 -0
  232. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
  233. package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -0
  234. package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +15 -2
  235. package/packages/pi-coding-agent/src/core/fallback-resolver.ts +2 -3
  236. package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
  237. package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +274 -0
  238. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +288 -0
  239. package/packages/pi-coding-agent/src/core/model-registry.ts +39 -3
  240. package/packages/pi-coding-agent/src/core/package-commands.test.ts +240 -0
  241. package/packages/pi-coding-agent/src/core/package-commands.ts +310 -0
  242. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
  243. package/packages/pi-coding-agent/src/core/sdk.ts +4 -0
  244. package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
  245. package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
  246. package/packages/pi-coding-agent/src/index.ts +7 -0
  247. package/packages/pi-coding-agent/src/main.ts +11 -232
  248. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
  249. package/pkg/package.json +1 -1
  250. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +22 -7
  251. package/src/resources/extensions/gsd/auto-prompts.ts +109 -42
  252. package/src/resources/extensions/gsd/auto-start.ts +14 -0
  253. package/src/resources/extensions/gsd/auto-worktree.ts +16 -3
  254. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
  255. package/src/resources/extensions/gsd/dispatch-guard.ts +28 -10
  256. package/src/resources/extensions/gsd/markdown-renderer.ts +7 -5
  257. package/src/resources/extensions/gsd/reactive-graph.ts +12 -2
  258. package/src/resources/extensions/gsd/skill-health.ts +2 -1
  259. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
  260. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +14 -16
  261. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
  262. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
  263. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +465 -523
  264. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
  265. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
  266. package/src/resources/extensions/gsd/tests/auto-stash-merge.test.ts +3 -3
  267. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +533 -656
  268. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
  269. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
  270. package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
  271. package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
  272. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
  273. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
  274. package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
  275. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +38 -59
  276. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +228 -263
  277. package/src/resources/extensions/gsd/tests/complete-task.test.ts +250 -302
  278. package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
  279. package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
  280. package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
  281. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +27 -35
  282. package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
  283. package/src/resources/extensions/gsd/tests/db-writer.test.ts +390 -420
  284. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
  285. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +68 -83
  286. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +152 -183
  287. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
  288. package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
  289. package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
  290. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
  291. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +164 -180
  292. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
  293. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
  294. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +27 -29
  295. package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
  296. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +54 -75
  297. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +21 -32
  298. package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
  299. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -44
  300. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
  301. package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
  302. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +54 -60
  303. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
  304. package/src/resources/extensions/gsd/tests/doctor.test.ts +104 -134
  305. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
  306. package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
  307. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
  308. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
  309. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +30 -42
  310. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +198 -206
  311. package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
  312. package/src/resources/extensions/gsd/tests/git-service.test.ts +285 -388
  313. package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
  314. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
  315. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
  316. package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
  317. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +81 -103
  318. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
  319. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
  320. package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
  321. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +81 -102
  322. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
  323. package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
  324. package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
  325. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
  326. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +18 -18
  327. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +150 -194
  328. package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
  329. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
  330. package/src/resources/extensions/gsd/tests/memory-store.test.ts +80 -93
  331. package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
  332. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +83 -93
  333. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
  334. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
  335. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
  336. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +87 -96
  337. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +125 -164
  338. package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
  339. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +35 -36
  340. package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
  341. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +40 -47
  342. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
  343. package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
  344. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
  345. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
  346. package/src/resources/extensions/gsd/tests/parsers.test.ts +546 -611
  347. package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
  348. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
  349. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
  350. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
  351. package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
  352. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
  353. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
  354. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
  355. package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
  356. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
  357. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
  358. package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
  359. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
  360. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
  361. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
  362. package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
  363. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
  364. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -44
  365. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +19 -26
  366. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
  367. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
  368. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
  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 +9 -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-symlink-removal.test.ts +15 -22
  388. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
  389. package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
  390. package/src/resources/extensions/gsd/tools/plan-milestone.ts +1 -18
  391. package/src/resources/extensions/gsd/tools/plan-slice.ts +1 -15
  392. package/src/resources/extensions/gsd/visualizer-data.ts +46 -14
  393. package/src/resources/extensions/gsd/workspace-index.ts +49 -18
  394. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +0 -1
  395. package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +0 -1
  396. package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +0 -1
  397. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +0 -1
  398. /package/dist/web/standalone/.next/static/{drUWS0zys9uepCfCwecJv → alS4hoANx0TK4UVZY27da}/_buildManifest.js +0 -0
  399. /package/dist/web/standalone/.next/static/{drUWS0zys9uepCfCwecJv → alS4hoANx0TK4UVZY27da}/_ssgManifest.js +0 -0
@@ -31,9 +31,9 @@ import type {
31
31
  GSDSliceSummaryData,
32
32
  GSDTaskSummaryData,
33
33
  } from '../migrate/types.ts';
34
- import { createTestContext } from './test-helpers.ts';
34
+ import { describe, test, beforeEach, afterEach } from 'node:test';
35
+ import assert from 'node:assert/strict';
35
36
 
36
- const { assertEq, assertTrue, report } = createTestContext();
37
37
  // ─── Test Data Builders ────────────────────────────────────────────────────
38
38
 
39
39
  function makeTask(overrides: Partial<GSDTask> = {}): GSDTask {
@@ -103,11 +103,7 @@ function makeTaskSummary(overrides: Partial<GSDTaskSummaryData> = {}): GSDTaskSu
103
103
  };
104
104
  }
105
105
 
106
- // ═══════════════════════════════════════════════════════════════════════════
107
- // Scenario A: Roadmap round-trip with 2 slices (1 done, 1 not)
108
- // ═══════════════════════════════════════════════════════════════════════════
109
-
110
- {
106
+ test('Scenario A: Roadmap round-trip with 2 slices (1 done, 1 not)', () => {
111
107
  const milestone = makeMilestone({
112
108
  slices: [
113
109
  makeSlice({
@@ -132,35 +128,31 @@ function makeTaskSummary(overrides: Partial<GSDTaskSummaryData> = {}): GSDTaskSu
132
128
  const output = formatRoadmap(milestone);
133
129
  const parsed = parseRoadmap(output);
134
130
 
135
- assertEq(parsed.title, 'M001: Core Platform', 'roadmap: title');
136
- assertEq(parsed.vision, 'Build the core platform', 'roadmap: vision');
137
- assertEq(parsed.successCriteria.length, 2, 'roadmap: successCriteria count');
138
- assertEq(parsed.successCriteria[0], 'All tests pass', 'roadmap: successCriteria[0]');
139
- assertEq(parsed.successCriteria[1], 'Deploy to staging', 'roadmap: successCriteria[1]');
140
- assertEq(parsed.slices.length, 2, 'roadmap: slices count');
141
-
142
- assertEq(parsed.slices[0].id, 'S01', 'roadmap: S01 id');
143
- assertEq(parsed.slices[0].title, 'Auth System', 'roadmap: S01 title');
144
- assertEq(parsed.slices[0].done, true, 'roadmap: S01 done');
145
- assertEq(parsed.slices[0].risk, 'high', 'roadmap: S01 risk');
146
- assertEq(parsed.slices[0].depends.length, 0, 'roadmap: S01 depends empty');
147
- assertEq(parsed.slices[0].demo, 'Login flow works', 'roadmap: S01 demo');
148
-
149
- assertEq(parsed.slices[1].id, 'S02', 'roadmap: S02 id');
150
- assertEq(parsed.slices[1].title, 'Dashboard', 'roadmap: S02 title');
151
- assertEq(parsed.slices[1].done, false, 'roadmap: S02 done');
152
- assertEq(parsed.slices[1].risk, 'low', 'roadmap: S02 risk');
153
- assertEq(parsed.slices[1].depends, ['S01'], 'roadmap: S02 depends');
154
- assertEq(parsed.slices[1].demo, 'Dashboard renders data', 'roadmap: S02 demo');
155
-
156
- assertEq(parsed.boundaryMap.length, 0, 'roadmap: boundaryMap empty');
157
- }
158
-
159
- // ═══════════════════════════════════════════════════════════════════════════
160
- // Scenario B: Plan round-trip with 3 tasks (mixed done)
161
- // ═══════════════════════════════════════════════════════════════════════════
162
-
163
- {
131
+ assert.deepStrictEqual(parsed.title, 'M001: Core Platform', 'roadmap: title');
132
+ assert.deepStrictEqual(parsed.vision, 'Build the core platform', 'roadmap: vision');
133
+ assert.deepStrictEqual(parsed.successCriteria.length, 2, 'roadmap: successCriteria count');
134
+ assert.deepStrictEqual(parsed.successCriteria[0], 'All tests pass', 'roadmap: successCriteria[0]');
135
+ assert.deepStrictEqual(parsed.successCriteria[1], 'Deploy to staging', 'roadmap: successCriteria[1]');
136
+ assert.deepStrictEqual(parsed.slices.length, 2, 'roadmap: slices count');
137
+
138
+ assert.deepStrictEqual(parsed.slices[0].id, 'S01', 'roadmap: S01 id');
139
+ assert.deepStrictEqual(parsed.slices[0].title, 'Auth System', 'roadmap: S01 title');
140
+ assert.deepStrictEqual(parsed.slices[0].done, true, 'roadmap: S01 done');
141
+ assert.deepStrictEqual(parsed.slices[0].risk, 'high', 'roadmap: S01 risk');
142
+ assert.deepStrictEqual(parsed.slices[0].depends.length, 0, 'roadmap: S01 depends empty');
143
+ assert.deepStrictEqual(parsed.slices[0].demo, 'Login flow works', 'roadmap: S01 demo');
144
+
145
+ assert.deepStrictEqual(parsed.slices[1].id, 'S02', 'roadmap: S02 id');
146
+ assert.deepStrictEqual(parsed.slices[1].title, 'Dashboard', 'roadmap: S02 title');
147
+ assert.deepStrictEqual(parsed.slices[1].done, false, 'roadmap: S02 done');
148
+ assert.deepStrictEqual(parsed.slices[1].risk, 'low', 'roadmap: S02 risk');
149
+ assert.deepStrictEqual(parsed.slices[1].depends, ['S01'], 'roadmap: S02 depends');
150
+ assert.deepStrictEqual(parsed.slices[1].demo, 'Dashboard renders data', 'roadmap: S02 demo');
151
+
152
+ assert.deepStrictEqual(parsed.boundaryMap.length, 0, 'roadmap: boundaryMap empty');
153
+ });
154
+
155
+ test('Scenario B: Plan round-trip with 3 tasks (mixed done)', () => {
164
156
  const slice = makeSlice({
165
157
  id: 'S01',
166
158
  title: 'Auth System',
@@ -176,31 +168,27 @@ function makeTaskSummary(overrides: Partial<GSDTaskSummaryData> = {}): GSDTaskSu
176
168
  const output = formatPlan(slice);
177
169
  const parsed = parsePlan(output);
178
170
 
179
- assertEq(parsed.id, 'S01', 'plan: id');
180
- assertEq(parsed.title, 'Auth System', 'plan: title');
181
- assertEq(parsed.goal, 'Working authentication system', 'plan: goal');
182
- assertEq(parsed.demo, 'Login works with valid credentials', 'plan: demo');
183
- assertEq(parsed.tasks.length, 3, 'plan: tasks count');
171
+ assert.deepStrictEqual(parsed.id, 'S01', 'plan: id');
172
+ assert.deepStrictEqual(parsed.title, 'Auth System', 'plan: title');
173
+ assert.deepStrictEqual(parsed.goal, 'Working authentication system', 'plan: goal');
174
+ assert.deepStrictEqual(parsed.demo, 'Login works with valid credentials', 'plan: demo');
175
+ assert.deepStrictEqual(parsed.tasks.length, 3, 'plan: tasks count');
184
176
 
185
- assertEq(parsed.tasks[0].id, 'T01', 'plan: T01 id');
186
- assertEq(parsed.tasks[0].title, 'Setup Models', 'plan: T01 title');
187
- assertEq(parsed.tasks[0].done, true, 'plan: T01 done');
188
- assertEq(parsed.tasks[0].estimate, '15m', 'plan: T01 estimate');
177
+ assert.deepStrictEqual(parsed.tasks[0].id, 'T01', 'plan: T01 id');
178
+ assert.deepStrictEqual(parsed.tasks[0].title, 'Setup Models', 'plan: T01 title');
179
+ assert.deepStrictEqual(parsed.tasks[0].done, true, 'plan: T01 done');
180
+ assert.deepStrictEqual(parsed.tasks[0].estimate, '15m', 'plan: T01 estimate');
189
181
 
190
- assertEq(parsed.tasks[1].id, 'T02', 'plan: T02 id');
191
- assertEq(parsed.tasks[1].done, false, 'plan: T02 done');
192
- assertEq(parsed.tasks[1].estimate, '30m', 'plan: T02 estimate');
193
-
194
- assertEq(parsed.tasks[2].id, 'T03', 'plan: T03 id');
195
- assertEq(parsed.tasks[2].done, true, 'plan: T03 done');
196
- assertEq(parsed.tasks[2].estimate, '20m', 'plan: T03 estimate');
197
- }
182
+ assert.deepStrictEqual(parsed.tasks[1].id, 'T02', 'plan: T02 id');
183
+ assert.deepStrictEqual(parsed.tasks[1].done, false, 'plan: T02 done');
184
+ assert.deepStrictEqual(parsed.tasks[1].estimate, '30m', 'plan: T02 estimate');
198
185
 
199
- // ═══════════════════════════════════════════════════════════════════════════
200
- // Scenario C: Slice summary round-trip with full data
201
- // ═══════════════════════════════════════════════════════════════════════════
186
+ assert.deepStrictEqual(parsed.tasks[2].id, 'T03', 'plan: T03 id');
187
+ assert.deepStrictEqual(parsed.tasks[2].done, true, 'plan: T03 done');
188
+ assert.deepStrictEqual(parsed.tasks[2].estimate, '20m', 'plan: T03 estimate');
189
+ });
202
190
 
203
- {
191
+ test('Scenario C: Slice summary round-trip with full data', () => {
204
192
  const slice = makeSlice({
205
193
  id: 'S01',
206
194
  title: 'Auth System',
@@ -211,28 +199,24 @@ function makeTaskSummary(overrides: Partial<GSDTaskSummaryData> = {}): GSDTaskSu
211
199
  const output = formatSliceSummary(slice, 'M001');
212
200
  const parsed = parseSummary(output);
213
201
 
214
- assertEq(parsed.frontmatter.id, 'S01', 'sliceSummary: id');
215
- assertEq(parsed.frontmatter.parent, 'M001', 'sliceSummary: parent');
216
- assertEq(parsed.frontmatter.milestone, 'M001', 'sliceSummary: milestone');
217
- assertEq(parsed.frontmatter.provides, ['auth-flow', 'jwt-tokens'], 'sliceSummary: provides');
218
- assertEq(parsed.frontmatter.requires.length, 0, 'sliceSummary: requires empty');
219
- assertEq(parsed.frontmatter.affects.length, 0, 'sliceSummary: affects empty');
220
- assertEq(parsed.frontmatter.key_files, ['src/auth.ts', 'src/middleware.ts'], 'sliceSummary: key_files');
221
- assertEq(parsed.frontmatter.key_decisions, ['Use JWT over sessions'], 'sliceSummary: key_decisions');
222
- assertEq(parsed.frontmatter.patterns_established, ['Middleware pattern'], 'sliceSummary: patterns_established');
223
- assertEq(parsed.frontmatter.duration, '2h', 'sliceSummary: duration');
224
- assertEq(parsed.frontmatter.completed_at, '2026-03-10', 'sliceSummary: completed_at');
225
- assertEq(parsed.frontmatter.verification_result, 'passed', 'sliceSummary: verification_result');
226
- assertEq(parsed.frontmatter.blocker_discovered, false, 'sliceSummary: blocker_discovered');
227
- assertTrue(parsed.whatHappened.includes('Implemented full auth system'), 'sliceSummary: whatHappened content');
228
- assertEq(parsed.title, 'S01: Auth System', 'sliceSummary: title');
229
- }
230
-
231
- // ═══════════════════════════════════════════════════════════════════════════
232
- // Scenario D: Task summary round-trip
233
- // ═══════════════════════════════════════════════════════════════════════════
234
-
235
- {
202
+ assert.deepStrictEqual(parsed.frontmatter.id, 'S01', 'sliceSummary: id');
203
+ assert.deepStrictEqual(parsed.frontmatter.parent, 'M001', 'sliceSummary: parent');
204
+ assert.deepStrictEqual(parsed.frontmatter.milestone, 'M001', 'sliceSummary: milestone');
205
+ assert.deepStrictEqual(parsed.frontmatter.provides, ['auth-flow', 'jwt-tokens'], 'sliceSummary: provides');
206
+ assert.deepStrictEqual(parsed.frontmatter.requires.length, 0, 'sliceSummary: requires empty');
207
+ assert.deepStrictEqual(parsed.frontmatter.affects.length, 0, 'sliceSummary: affects empty');
208
+ assert.deepStrictEqual(parsed.frontmatter.key_files, ['src/auth.ts', 'src/middleware.ts'], 'sliceSummary: key_files');
209
+ assert.deepStrictEqual(parsed.frontmatter.key_decisions, ['Use JWT over sessions'], 'sliceSummary: key_decisions');
210
+ assert.deepStrictEqual(parsed.frontmatter.patterns_established, ['Middleware pattern'], 'sliceSummary: patterns_established');
211
+ assert.deepStrictEqual(parsed.frontmatter.duration, '2h', 'sliceSummary: duration');
212
+ assert.deepStrictEqual(parsed.frontmatter.completed_at, '2026-03-10', 'sliceSummary: completed_at');
213
+ assert.deepStrictEqual(parsed.frontmatter.verification_result, 'passed', 'sliceSummary: verification_result');
214
+ assert.deepStrictEqual(parsed.frontmatter.blocker_discovered, false, 'sliceSummary: blocker_discovered');
215
+ assert.ok(parsed.whatHappened.includes('Implemented full auth system'), 'sliceSummary: whatHappened content');
216
+ assert.deepStrictEqual(parsed.title, 'S01: Auth System', 'sliceSummary: title');
217
+ });
218
+
219
+ test('Scenario D: Task summary round-trip', () => {
236
220
  const task = makeTask({
237
221
  id: 'T01',
238
222
  title: 'Setup Auth',
@@ -243,22 +227,18 @@ function makeTaskSummary(overrides: Partial<GSDTaskSummaryData> = {}): GSDTaskSu
243
227
  const output = formatTaskSummary(task, 'S01', 'M001');
244
228
  const parsed = parseSummary(output);
245
229
 
246
- assertEq(parsed.frontmatter.id, 'T01', 'taskSummary: id');
247
- assertEq(parsed.frontmatter.parent, 'S01', 'taskSummary: parent');
248
- assertEq(parsed.frontmatter.milestone, 'M001', 'taskSummary: milestone');
249
- assertEq(parsed.frontmatter.provides, ['auth-endpoint'], 'taskSummary: provides');
250
- assertEq(parsed.frontmatter.key_files, ['src/auth.ts'], 'taskSummary: key_files');
251
- assertEq(parsed.frontmatter.duration, '45m', 'taskSummary: duration');
252
- assertEq(parsed.frontmatter.completed_at, '2026-03-09', 'taskSummary: completed_at');
253
- assertTrue(parsed.whatHappened.includes('Built the auth endpoint'), 'taskSummary: whatHappened content');
254
- assertEq(parsed.title, 'T01: Setup Auth', 'taskSummary: title');
255
- }
256
-
257
- // ═══════════════════════════════════════════════════════════════════════════
258
- // Scenario E: Requirements round-trip with mixed statuses
259
- // ═══════════════════════════════════════════════════════════════════════════
260
-
261
- {
230
+ assert.deepStrictEqual(parsed.frontmatter.id, 'T01', 'taskSummary: id');
231
+ assert.deepStrictEqual(parsed.frontmatter.parent, 'S01', 'taskSummary: parent');
232
+ assert.deepStrictEqual(parsed.frontmatter.milestone, 'M001', 'taskSummary: milestone');
233
+ assert.deepStrictEqual(parsed.frontmatter.provides, ['auth-endpoint'], 'taskSummary: provides');
234
+ assert.deepStrictEqual(parsed.frontmatter.key_files, ['src/auth.ts'], 'taskSummary: key_files');
235
+ assert.deepStrictEqual(parsed.frontmatter.duration, '45m', 'taskSummary: duration');
236
+ assert.deepStrictEqual(parsed.frontmatter.completed_at, '2026-03-09', 'taskSummary: completed_at');
237
+ assert.ok(parsed.whatHappened.includes('Built the auth endpoint'), 'taskSummary: whatHappened content');
238
+ assert.deepStrictEqual(parsed.title, 'T01: Setup Auth', 'taskSummary: title');
239
+ });
240
+
241
+ test('Scenario E: Requirements round-trip with mixed statuses', () => {
262
242
  const requirements: GSDRequirement[] = [
263
243
  { id: 'R001', title: 'Auth Required', class: 'core-capability', status: 'active', description: 'Must have auth', source: 'spec', primarySlice: 'S01' },
264
244
  { id: 'R002', title: 'Logging', class: 'observability', status: 'active', description: 'Must log', source: 'spec', primarySlice: 'S02' },
@@ -270,110 +250,93 @@ function makeTaskSummary(overrides: Partial<GSDTaskSummaryData> = {}): GSDTaskSu
270
250
  const output = formatRequirements(requirements);
271
251
  const counts = parseRequirementCounts(output);
272
252
 
273
- assertEq(counts.active, 2, 'requirements: active count');
274
- assertEq(counts.validated, 1, 'requirements: validated count');
275
- assertEq(counts.deferred, 1, 'requirements: deferred count');
276
- assertEq(counts.outOfScope, 1, 'requirements: outOfScope count');
277
- assertEq(counts.total, 5, 'requirements: total count');
278
- }
279
-
280
- // ═══════════════════════════════════════════════════════════════════════════
281
- // Scenario F: Edge cases
282
- // ═══════════════════════════════════════════════════════════════════════════
253
+ assert.deepStrictEqual(counts.active, 2, 'requirements: active count');
254
+ assert.deepStrictEqual(counts.validated, 1, 'requirements: validated count');
255
+ assert.deepStrictEqual(counts.deferred, 1, 'requirements: deferred count');
256
+ assert.deepStrictEqual(counts.outOfScope, 1, 'requirements: outOfScope count');
257
+ assert.deepStrictEqual(counts.total, 5, 'requirements: total count');
258
+ });
283
259
 
284
- // F1: Empty vision → fallback text
285
- {
260
+ test('F1: Empty vision → fallback text', () => {
286
261
  const milestone = makeMilestone({ vision: '' });
287
262
  const output = formatRoadmap(milestone);
288
263
  const parsed = parseRoadmap(output);
289
- assertEq(parsed.vision, '(migrated project)', 'edge: empty vision fallback');
290
- }
264
+ assert.deepStrictEqual(parsed.vision, '(migrated project)', 'edge: empty vision fallback');
265
+ });
291
266
 
292
- // F2: Empty successCriteria → empty array
293
- {
267
+ test('F2: Empty successCriteria → empty array', () => {
294
268
  const milestone = makeMilestone({ successCriteria: [] });
295
269
  const output = formatRoadmap(milestone);
296
270
  const parsed = parseRoadmap(output);
297
- assertEq(parsed.successCriteria.length, 0, 'edge: empty successCriteria');
298
- }
271
+ assert.deepStrictEqual(parsed.successCriteria.length, 0, 'edge: empty successCriteria');
272
+ });
299
273
 
300
- // F3: Empty tasks → empty array in parsed plan
301
- {
274
+ test('F3: Empty tasks → empty array in parsed plan', () => {
302
275
  const slice = makeSlice({ tasks: [] });
303
276
  const output = formatPlan(slice);
304
277
  const parsed = parsePlan(output);
305
- assertEq(parsed.tasks.length, 0, 'edge: empty tasks');
306
- }
278
+ assert.deepStrictEqual(parsed.tasks.length, 0, 'edge: empty tasks');
279
+ });
307
280
 
308
- // F4: Null summary → empty string from formatSliceSummary
309
- {
281
+ test('F4: Null summary → empty string from formatSliceSummary', () => {
310
282
  const slice = makeSlice({ summary: null });
311
283
  const output = formatSliceSummary(slice, 'M001');
312
- assertEq(output, '', 'edge: null summary returns empty string');
313
- }
284
+ assert.deepStrictEqual(output, '', 'edge: null summary returns empty string');
285
+ });
314
286
 
315
- // F5: Done=true checkbox in roadmap
316
- {
287
+ test('F5: Done=true checkbox in roadmap', () => {
317
288
  const milestone = makeMilestone({
318
289
  slices: [makeSlice({ id: 'S01', done: true })],
319
290
  });
320
291
  const output = formatRoadmap(milestone);
321
292
  const parsed = parseRoadmap(output);
322
- assertEq(parsed.slices[0].done, true, 'edge: done checkbox true');
323
- }
293
+ assert.deepStrictEqual(parsed.slices[0].done, true, 'edge: done checkbox true');
294
+ });
324
295
 
325
- // F6: Done=false checkbox in roadmap
326
- {
296
+ test('F6: Done=false checkbox in roadmap', () => {
327
297
  const milestone = makeMilestone({
328
298
  slices: [makeSlice({ id: 'S01', done: false })],
329
299
  });
330
300
  const output = formatRoadmap(milestone);
331
301
  const parsed = parseRoadmap(output);
332
- assertEq(parsed.slices[0].done, false, 'edge: done checkbox false');
333
- }
302
+ assert.deepStrictEqual(parsed.slices[0].done, false, 'edge: done checkbox false');
303
+ });
334
304
 
335
- // F7: Null task summary → empty string from formatTaskSummary
336
- {
305
+ test('F7: Null task summary → empty string from formatTaskSummary', () => {
337
306
  const task = makeTask({ summary: null });
338
307
  const output = formatTaskSummary(task, 'S01', 'M001');
339
- assertEq(output, '', 'edge: null task summary returns empty string');
340
- }
308
+ assert.deepStrictEqual(output, '', 'edge: null task summary returns empty string');
309
+ });
341
310
 
342
- // F8: Empty requirements → all zeros
343
- {
311
+ test('F8: Empty requirements → all zeros', () => {
344
312
  const output = formatRequirements([]);
345
313
  const counts = parseRequirementCounts(output);
346
- assertEq(counts.total, 0, 'edge: empty requirements total 0');
347
- }
314
+ assert.deepStrictEqual(counts.total, 0, 'edge: empty requirements total 0');
315
+ });
348
316
 
349
- // F9: formatProject with empty content → produces valid stub
350
- {
317
+ test('F9: formatProject with empty content → produces valid stub', () => {
351
318
  const output = formatProject('');
352
- assertTrue(output.includes('# Project'), 'edge: empty project has heading');
353
- assertTrue(output.length > 10, 'edge: empty project not blank');
354
- }
319
+ assert.ok(output.includes('# Project'), 'edge: empty project has heading');
320
+ assert.ok(output.length > 10, 'edge: empty project not blank');
321
+ });
355
322
 
356
- // F10: formatProject with existing content → passes through
357
- {
323
+ test('F10: formatProject with existing content → passes through', () => {
358
324
  const content = '# My Project\n\nDescription here.\n';
359
325
  const output = formatProject(content);
360
- assertEq(output, content, 'edge: project passthrough');
361
- }
326
+ assert.deepStrictEqual(output, content, 'edge: project passthrough');
327
+ });
362
328
 
363
- // F11: formatDecisions with empty content → produces valid stub
364
- {
329
+ test('F11: formatDecisions with empty content → produces valid stub', () => {
365
330
  const output = formatDecisions('');
366
- assertTrue(output.includes('# Decisions'), 'edge: empty decisions has heading');
367
- }
331
+ assert.ok(output.includes('# Decisions'), 'edge: empty decisions has heading');
332
+ });
368
333
 
369
- // F12: formatContext produces valid content
370
- {
334
+ test('F12: formatContext produces valid content', () => {
371
335
  const output = formatContext('M001');
372
- assertTrue(output.includes('M001'), 'edge: context mentions milestone');
373
- }
336
+ assert.ok(output.includes('M001'), 'edge: context mentions milestone');
337
+ });
374
338
 
375
- // F13: formatState produces valid content
376
- {
339
+ test('F13: formatState produces valid content', () => {
377
340
  const milestones = [makeMilestone({
378
341
  slices: [
379
342
  makeSlice({ done: true }),
@@ -381,20 +344,18 @@ function makeTaskSummary(overrides: Partial<GSDTaskSummaryData> = {}): GSDTaskSu
381
344
  ],
382
345
  })];
383
346
  const output = formatState(milestones);
384
- assertTrue(output.includes('1/2'), 'edge: state shows slice progress');
385
- }
347
+ assert.ok(output.includes('1/2'), 'edge: state shows slice progress');
348
+ });
386
349
 
387
- // F14: Task with no estimate → no est backtick in plan
388
- {
350
+ test('F14: Task with no estimate → no est backtick in plan', () => {
389
351
  const slice = makeSlice({
390
352
  tasks: [makeTask({ id: 'T01', title: 'Quick Fix', estimate: '' })],
391
353
  });
392
354
  const output = formatPlan(slice);
393
355
  const parsed = parsePlan(output);
394
- assertEq(parsed.tasks[0].id, 'T01', 'edge: task no estimate id');
395
- assertEq(parsed.tasks[0].estimate, '', 'edge: task no estimate empty');
396
- }
356
+ assert.deepStrictEqual(parsed.tasks[0].id, 'T01', 'edge: task no estimate id');
357
+ assert.deepStrictEqual(parsed.tasks[0].estimate, '', 'edge: task no estimate empty');
358
+ });
397
359
 
398
360
  // ═══════════════════════════════════════════════════════════════════════════
399
361
 
400
- report();