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
@@ -7,17 +7,16 @@
7
7
  * Relates to #1269, #1293.
8
8
  */
9
9
 
10
+ import { describe, test } from 'node:test';
11
+ import assert from 'node:assert/strict';
10
12
  import { mkdtempSync, mkdirSync, rmSync, writeFileSync, existsSync, readFileSync } from "node:fs";
11
13
  import { join } from "node:path";
12
14
  import { tmpdir } from "node:os";
13
15
  import { execSync } from "node:child_process";
14
16
 
15
- import { createTestContext } from './test-helpers.ts';
16
17
  import { captureIntegrationBranch, getCurrentBranch } from "../worktree.ts";
17
18
  import { readIntegrationBranch, QUICK_BRANCH_RE } from "../git-service.ts";
18
19
 
19
- const { assertEq, assertTrue, report } = createTestContext();
20
-
21
20
  function run(command: string, cwd: string): string {
22
21
  return execSync(command, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
23
22
  }
@@ -35,68 +34,59 @@ function createTestRepo(): string {
35
34
  return repo;
36
35
  }
37
36
 
38
- async function main(): Promise<void> {
39
-
40
37
  // ═══════════════════════════════════════════════════════════════════════
41
38
  // QUICK_BRANCH_RE
42
39
  // ═══════════════════════════════════════════════════════════════════════
43
40
 
44
- console.log("\n=== QUICK_BRANCH_RE: matches quick-task branches ===");
45
41
 
46
- assertTrue(QUICK_BRANCH_RE.test("gsd/quick/1-fix-typo"), "matches standard quick branch");
47
- assertTrue(QUICK_BRANCH_RE.test("gsd/quick/42-some-long-slug-name"), "matches multi-digit quick branch");
48
- assertTrue(!QUICK_BRANCH_RE.test("main"), "rejects main");
49
- assertTrue(!QUICK_BRANCH_RE.test("gsd/M001/S01"), "rejects slice branch");
50
- assertTrue(!QUICK_BRANCH_RE.test("gsd/quickly-something"), "rejects non-quick prefix");
51
- assertTrue(!QUICK_BRANCH_RE.test("feature/gsd/quick/1"), "rejects nested prefix");
42
+ describe('quick-branch-lifecycle', () => {
43
+ test('QUICK_BRANCH_RE: matches quick-task branches', () => {
44
+ assert.ok(QUICK_BRANCH_RE.test("gsd/quick/1-fix-typo"), "matches standard quick branch");
45
+ });
52
46
 
47
+ assert.ok(QUICK_BRANCH_RE.test("gsd/quick/42-some-long-slug-name"), "matches multi-digit quick branch");
48
+ assert.ok(!QUICK_BRANCH_RE.test("main"), "rejects main");
49
+ assert.ok(!QUICK_BRANCH_RE.test("gsd/M001/S01"), "rejects slice branch");
50
+ assert.ok(!QUICK_BRANCH_RE.test("gsd/quickly-something"), "rejects non-quick prefix");
51
+ assert.ok(!QUICK_BRANCH_RE.test("feature/gsd/quick/1"), "rejects nested prefix");
53
52
  // ═══════════════════════════════════════════════════════════════════════
54
53
  // captureIntegrationBranch: guard against quick-task branches
55
54
  // ═══════════════════════════════════════════════════════════════════════
56
-
57
- console.log("\n=== captureIntegrationBranch: skips quick-task branches ===");
58
-
59
- {
55
+ test('captureIntegrationBranch: skips quick-task branches', () => {
60
56
  const repo = createTestRepo();
61
57
 
62
58
  // Create and checkout a quick-task branch
63
59
  run("git checkout -b gsd/quick/1-fix-typo", repo);
64
- assertEq(getCurrentBranch(repo), "gsd/quick/1-fix-typo", "on quick branch");
60
+ assert.deepStrictEqual(getCurrentBranch(repo), "gsd/quick/1-fix-typo", "on quick branch");
65
61
 
66
62
  captureIntegrationBranch(repo, "M001");
67
63
 
68
- assertEq(readIntegrationBranch(repo, "M001"), null,
64
+ assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), null,
69
65
  "captureIntegrationBranch is a no-op on quick-task branches");
70
66
 
71
67
  rmSync(repo, { recursive: true, force: true });
72
- }
68
+ });
73
69
 
74
70
  // ─── Verify main is still recorded correctly ─────────────────────────
75
-
76
- console.log("\n=== captureIntegrationBranch: records main correctly ===");
77
-
78
- {
71
+ test('captureIntegrationBranch: records main correctly', () => {
79
72
  const repo = createTestRepo();
80
73
 
81
74
  // Capture from main — should work normally
82
75
  captureIntegrationBranch(repo, "M001");
83
- assertEq(readIntegrationBranch(repo, "M001"), "main",
76
+ assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), "main",
84
77
  "main is recorded as integration branch");
85
78
 
86
79
  // Switch to quick branch — capture should be no-op (doesn't overwrite main)
87
80
  run("git checkout -b gsd/quick/1-fix-typo", repo);
88
81
  captureIntegrationBranch(repo, "M001");
89
- assertEq(readIntegrationBranch(repo, "M001"), "main",
82
+ assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), "main",
90
83
  "quick branch does not overwrite existing integration branch");
91
84
 
92
85
  rmSync(repo, { recursive: true, force: true });
93
- }
86
+ });
94
87
 
95
88
  // ─── Sequence: main → quick → back to main → capture ────────────────
96
-
97
- console.log("\n=== captureIntegrationBranch: correct after quick branch round-trip ===");
98
-
99
- {
89
+ test('captureIntegrationBranch: correct after quick branch round-trip', () => {
100
90
  const repo = createTestRepo();
101
91
 
102
92
  // Simulate quick-task lifecycle: branch off, do work, return to main
@@ -111,19 +101,16 @@ async function main(): Promise<void> {
111
101
 
112
102
  // Now capture — should get main, not the deleted quick branch
113
103
  captureIntegrationBranch(repo, "M002");
114
- assertEq(readIntegrationBranch(repo, "M002"), "main",
104
+ assert.deepStrictEqual(readIntegrationBranch(repo, "M002"), "main",
115
105
  "after quick round-trip, main is captured correctly");
116
106
 
117
107
  rmSync(repo, { recursive: true, force: true });
118
- }
108
+ });
119
109
 
120
110
  // ═══════════════════════════════════════════════════════════════════════
121
111
  // cleanupQuickBranch: in-memory path (same session)
122
112
  // ═══════════════════════════════════════════════════════════════════════
123
-
124
- console.log("\n=== cleanupQuickBranch: merges back and cleans up (same session) ===");
125
-
126
- {
113
+ test('cleanupQuickBranch: merges back and cleans up (same session)', async () => {
127
114
  const repo = createTestRepo();
128
115
  const origCwd = process.cwd();
129
116
 
@@ -155,30 +142,27 @@ async function main(): Promise<void> {
155
142
  const { cleanupQuickBranch } = await import("../quick.ts");
156
143
  const result = cleanupQuickBranch();
157
144
 
158
- assertTrue(result, "cleanupQuickBranch returns true");
159
- assertEq(getCurrentBranch(repo), "main", "back on main after cleanup");
145
+ assert.ok(result, "cleanupQuickBranch returns true");
146
+ assert.deepStrictEqual(getCurrentBranch(repo), "main", "back on main after cleanup");
160
147
 
161
148
  // Verify merge happened — fix.txt should exist on main
162
- assertTrue(existsSync(join(repo, "fix.txt")), "fix.txt merged to main");
149
+ assert.ok(existsSync(join(repo, "fix.txt")), "fix.txt merged to main");
163
150
 
164
151
  // Verify quick branch deleted
165
152
  const branches = run("git branch", repo);
166
- assertTrue(!branches.includes("gsd/quick/1-fix-typo"), "quick branch deleted");
153
+ assert.ok(!branches.includes("gsd/quick/1-fix-typo"), "quick branch deleted");
167
154
 
168
155
  // Verify disk state cleaned up
169
- assertTrue(!existsSync(join(runtimeDir, "quick-return.json")), "quick-return.json removed");
156
+ assert.ok(!existsSync(join(runtimeDir, "quick-return.json")), "quick-return.json removed");
170
157
 
171
158
  process.chdir(origCwd);
172
159
  rmSync(repo, { recursive: true, force: true });
173
- }
160
+ });
174
161
 
175
162
  // ═══════════════════════════════════════════════════════════════════════
176
163
  // cleanupQuickBranch: cross-session recovery from disk
177
164
  // ═══════════════════════════════════════════════════════════════════════
178
-
179
- console.log("\n=== cleanupQuickBranch: recovers from disk state (cross-session) ===");
180
-
181
- {
165
+ test('cleanupQuickBranch: recovers from disk state (cross-session)', async () => {
182
166
  const repo = createTestRepo();
183
167
  const origCwd = process.cwd();
184
168
 
@@ -206,22 +190,19 @@ async function main(): Promise<void> {
206
190
  const { cleanupQuickBranch } = await import("../quick.ts");
207
191
  const result = cleanupQuickBranch();
208
192
 
209
- assertTrue(result, "cross-session recovery returns true");
210
- assertEq(getCurrentBranch(repo), "main", "back on main after cross-session recovery");
211
- assertTrue(existsSync(join(repo, "docs.md")), "docs.md merged to main");
212
- assertTrue(!existsSync(join(runtimeDir, "quick-return.json")), "disk state cleaned up");
193
+ assert.ok(result, "cross-session recovery returns true");
194
+ assert.deepStrictEqual(getCurrentBranch(repo), "main", "back on main after cross-session recovery");
195
+ assert.ok(existsSync(join(repo, "docs.md")), "docs.md merged to main");
196
+ assert.ok(!existsSync(join(runtimeDir, "quick-return.json")), "disk state cleaned up");
213
197
 
214
198
  process.chdir(origCwd);
215
199
  rmSync(repo, { recursive: true, force: true });
216
- }
200
+ });
217
201
 
218
202
  // ═══════════════════════════════════════════════════════════════════════
219
203
  // cleanupQuickBranch: no-op when no pending state
220
204
  // ═══════════════════════════════════════════════════════════════════════
221
-
222
- console.log("\n=== cleanupQuickBranch: no-op without pending state ===");
223
-
224
- {
205
+ test('cleanupQuickBranch: no-op without pending state', async () => {
225
206
  const repo = createTestRepo();
226
207
  const origCwd = process.cwd();
227
208
  process.chdir(repo);
@@ -229,32 +210,29 @@ async function main(): Promise<void> {
229
210
  const { cleanupQuickBranch } = await import("../quick.ts");
230
211
  const result = cleanupQuickBranch();
231
212
 
232
- assertTrue(!result, "returns false when no pending state");
233
- assertEq(getCurrentBranch(repo), "main", "stays on main");
213
+ assert.ok(!result, "returns false when no pending state");
214
+ assert.deepStrictEqual(getCurrentBranch(repo), "main", "stays on main");
234
215
 
235
216
  process.chdir(origCwd);
236
217
  rmSync(repo, { recursive: true, force: true });
237
- }
218
+ });
238
219
 
239
220
  // ═══════════════════════════════════════════════════════════════════════
240
221
  // End-to-end: quick branch does NOT contaminate integration branch
241
222
  // ═══════════════════════════════════════════════════════════════════════
242
-
243
- console.log("\n=== E2E: quick branch does not contaminate integration branch ===");
244
-
245
- {
223
+ test('E2E: quick branch does not contaminate integration branch', () => {
246
224
  const repo = createTestRepo();
247
225
 
248
226
  // 1. Record main as integration branch for M001
249
227
  captureIntegrationBranch(repo, "M001");
250
- assertEq(readIntegrationBranch(repo, "M001"), "main", "M001 integration = main");
228
+ assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), "main", "M001 integration = main");
251
229
 
252
230
  // 2. Start a quick task (branch off)
253
231
  run("git checkout -b gsd/quick/1-fix-typo", repo);
254
232
 
255
233
  // 3. Try to capture integration branch for M002 while on quick branch
256
234
  captureIntegrationBranch(repo, "M002");
257
- assertEq(readIntegrationBranch(repo, "M002"), null,
235
+ assert.deepStrictEqual(readIntegrationBranch(repo, "M002"), null,
258
236
  "M002 integration NOT recorded from quick branch");
259
237
 
260
238
  // 4. Return to main (simulate cleanupQuickBranch)
@@ -262,20 +240,14 @@ async function main(): Promise<void> {
262
240
 
263
241
  // 5. Now capture M002 from main — should work
264
242
  captureIntegrationBranch(repo, "M002");
265
- assertEq(readIntegrationBranch(repo, "M002"), "main",
243
+ assert.deepStrictEqual(readIntegrationBranch(repo, "M002"), "main",
266
244
  "M002 integration = main after returning from quick branch");
267
245
 
268
246
  // 6. Verify M001 still intact
269
- assertEq(readIntegrationBranch(repo, "M001"), "main",
247
+ assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), "main",
270
248
  "M001 integration unchanged");
271
249
 
272
250
  rmSync(repo, { recursive: true, force: true });
273
- }
274
-
275
- report();
276
- }
251
+ });
277
252
 
278
- main().catch((error) => {
279
- console.error(error);
280
- process.exit(1);
281
253
  });
@@ -1,15 +1,14 @@
1
+ import { describe, test } from 'node:test';
2
+ import assert from 'node:assert/strict';
1
3
  import { readFileSync } from "node:fs";
2
4
  import { join, dirname } from "node:path";
3
5
  import { fileURLToPath } from "node:url";
4
- import { createTestContext } from './test-helpers.ts';
5
-
6
6
  // loadPrompt reads from ~/.gsd/agent/extensions/gsd/prompts/ (main checkout).
7
7
  // In a worktree the file may not exist there yet, so we resolve prompts
8
8
  // relative to this test file's location (the worktree copy).
9
9
  const __dirname = dirname(fileURLToPath(import.meta.url));
10
10
  const worktreePromptsDir = join(__dirname, "..", "prompts");
11
11
 
12
- const { assertTrue, report } = createTestContext();
13
12
  /**
14
13
  * Load a prompt template from the worktree prompts directory
15
14
  * and apply variable substitution (mirrors loadPrompt logic).
@@ -27,11 +26,10 @@ function loadPromptFromWorktree(name: string, vars: Record<string, string> = {})
27
26
  // Tests
28
27
  // ═══════════════════════════════════════════════════════════════════════════
29
28
 
30
- async function main(): Promise<void> {
31
-
32
29
  // ─── reassess-roadmap prompt loads and substitutes ─────────────────────
33
- console.log("\n=== reassess-roadmap prompt loads and substitutes ===");
34
- {
30
+
31
+ describe('reassess-prompt', () => {
32
+ test('reassess-roadmap prompt loads and substitutes', () => {
35
33
  const testVars = {
36
34
  workingDirectory: "/tmp/test-project",
37
35
  milestoneId: "M099",
@@ -51,27 +49,26 @@ async function main(): Promise<void> {
51
49
  console.error(` ERROR: loadPrompt threw: ${err}`);
52
50
  }
53
51
 
54
- assertTrue(!threw, "loadPrompt does not throw for reassess-roadmap");
55
- assertTrue(typeof result === "string" && result.length > 0, "loadPrompt returns a non-empty string");
52
+ assert.ok(!threw, "loadPrompt does not throw for reassess-roadmap");
53
+ assert.ok(typeof result === "string" && result.length > 0, "loadPrompt returns a non-empty string");
56
54
 
57
55
  // Verify all test variables were substituted into the output
58
- assertTrue(result.includes("M099"), "prompt contains milestoneId 'M099'");
59
- assertTrue(result.includes("S03"), "prompt contains completedSliceId 'S03'");
60
- assertTrue(result.includes(".gsd/milestones/M099/slices/S03/S03-ASSESSMENT.md"), "prompt contains assessmentPath");
61
- assertTrue(result.includes(".gsd/milestones/M099/M099-ROADMAP.md"), "prompt contains roadmapPath");
62
- assertTrue(result.includes("--- test inlined context block ---"), "prompt contains inlinedContext");
56
+ assert.ok(result.includes("M099"), "prompt contains milestoneId 'M099'");
57
+ assert.ok(result.includes("S03"), "prompt contains completedSliceId 'S03'");
58
+ assert.ok(result.includes(".gsd/milestones/M099/slices/S03/S03-ASSESSMENT.md"), "prompt contains assessmentPath");
59
+ assert.ok(result.includes(".gsd/milestones/M099/M099-ROADMAP.md"), "prompt contains roadmapPath");
60
+ assert.ok(result.includes("--- test inlined context block ---"), "prompt contains inlinedContext");
63
61
 
64
62
  // Verify no un-substituted variables remain
65
- assertTrue(!result.includes("{{milestoneId}}"), "no un-substituted {{milestoneId}}");
66
- assertTrue(!result.includes("{{completedSliceId}}"), "no un-substituted {{completedSliceId}}");
67
- assertTrue(!result.includes("{{assessmentPath}}"), "no un-substituted {{assessmentPath}}");
68
- assertTrue(!result.includes("{{roadmapPath}}"), "no un-substituted {{roadmapPath}}");
69
- assertTrue(!result.includes("{{inlinedContext}}"), "no un-substituted {{inlinedContext}}");
70
- }
63
+ assert.ok(!result.includes("{{milestoneId}}"), "no un-substituted {{milestoneId}}");
64
+ assert.ok(!result.includes("{{completedSliceId}}"), "no un-substituted {{completedSliceId}}");
65
+ assert.ok(!result.includes("{{assessmentPath}}"), "no un-substituted {{assessmentPath}}");
66
+ assert.ok(!result.includes("{{roadmapPath}}"), "no un-substituted {{roadmapPath}}");
67
+ assert.ok(!result.includes("{{inlinedContext}}"), "no un-substituted {{inlinedContext}}");
68
+ });
71
69
 
72
70
  // ─── reassess-roadmap contains coverage-check instruction ─────────────
73
- console.log("\n=== reassess-roadmap contains coverage-check instruction ===");
74
- {
71
+ test('reassess-roadmap contains coverage-check instruction', () => {
75
72
  const prompt = loadPromptFromWorktree("reassess-roadmap", {
76
73
  workingDirectory: "/tmp/test-project",
77
74
  milestoneId: "M001",
@@ -85,33 +82,32 @@ async function main(): Promise<void> {
85
82
  const lower = prompt.toLowerCase();
86
83
 
87
84
  // The prompt must mention "each success criterion" or "every success criterion"
88
- assertTrue(
85
+ assert.ok(
89
86
  lower.includes("each success criterion") || lower.includes("every success criterion"),
90
87
  "prompt contains 'each success criterion' or 'every success criterion'"
91
88
  );
92
89
 
93
90
  // The prompt must mention "owning slice" or "remaining slice"
94
- assertTrue(
91
+ assert.ok(
95
92
  lower.includes("owning slice") || lower.includes("remaining slice"),
96
93
  "prompt contains 'owning slice' or 'remaining slice'"
97
94
  );
98
95
 
99
96
  // The prompt must mention "no remaining owner" or "no owner" or "no slice"
100
- assertTrue(
97
+ assert.ok(
101
98
  lower.includes("no remaining owner") || lower.includes("no owner") || lower.includes("no slice"),
102
99
  "prompt contains 'no remaining owner', 'no owner', or 'no slice'"
103
100
  );
104
101
 
105
102
  // The prompt must mention "blocking issue" or "blocking"
106
- assertTrue(
103
+ assert.ok(
107
104
  lower.includes("blocking issue") || lower.includes("blocking"),
108
105
  "prompt contains 'blocking issue' or 'blocking'"
109
106
  );
110
- }
107
+ });
111
108
 
112
109
  // ─── coverage-check requires at-least-one semantics ───────────────────
113
- console.log("\n=== coverage-check requires at-least-one semantics ===");
114
- {
110
+ test('coverage-check requires at-least-one semantics', () => {
115
111
  const prompt = loadPromptFromWorktree("reassess-roadmap", {
116
112
  workingDirectory: "/tmp/test-project",
117
113
  milestoneId: "M001",
@@ -124,22 +120,16 @@ async function main(): Promise<void> {
124
120
  const lower = prompt.toLowerCase();
125
121
 
126
122
  // The instruction must use "at least one" or equivalent inclusive language
127
- assertTrue(
123
+ assert.ok(
128
124
  lower.includes("at least one") || lower.includes("at-least-one") || lower.includes("one or more"),
129
125
  "prompt uses 'at least one' or equivalent inclusive language for slice ownership"
130
126
  );
131
127
 
132
128
  // The instruction must NOT require "exactly one" — that would be too rigid
133
- assertTrue(
129
+ assert.ok(
134
130
  !lower.includes("exactly one owner") && !lower.includes("exactly one slice"),
135
131
  "prompt does NOT use 'exactly one' for slice ownership (would be too rigid)"
136
132
  );
137
- }
138
-
139
- report();
140
- }
133
+ });
141
134
 
142
- main().catch((error) => {
143
- console.error(error);
144
- process.exit(1);
145
135
  });