gsd-pi 2.44.0 → 2.45.0-dev.1afbdaa

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 (608) hide show
  1. package/README.md +30 -12
  2. package/dist/help-text.js +1 -1
  3. package/dist/loader.js +34 -0
  4. package/dist/resources/extensions/gsd/activity-log.js +7 -0
  5. package/dist/resources/extensions/gsd/auto/infra-errors.js +3 -0
  6. package/dist/resources/extensions/gsd/auto/phases.js +63 -77
  7. package/dist/resources/extensions/gsd/auto/run-unit.js +6 -3
  8. package/dist/resources/extensions/gsd/auto/session.js +0 -11
  9. package/dist/resources/extensions/gsd/auto-artifact-paths.js +112 -0
  10. package/dist/resources/extensions/gsd/auto-post-unit.js +25 -96
  11. package/dist/resources/extensions/gsd/auto-prompts.js +24 -1
  12. package/dist/resources/extensions/gsd/auto-start.js +33 -5
  13. package/dist/resources/extensions/gsd/auto-timers.js +57 -3
  14. package/dist/resources/extensions/gsd/auto-worktree-sync.js +4 -0
  15. package/dist/resources/extensions/gsd/auto-worktree.js +14 -10
  16. package/dist/resources/extensions/gsd/auto.js +42 -60
  17. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +170 -11
  18. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +18 -0
  19. package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -12
  20. package/dist/resources/extensions/gsd/commands/catalog.js +7 -1
  21. package/dist/resources/extensions/gsd/commands/context.js +0 -4
  22. package/dist/resources/extensions/gsd/commands/handlers/core.js +2 -0
  23. package/dist/resources/extensions/gsd/commands/handlers/ops.js +10 -0
  24. package/dist/resources/extensions/gsd/commands/handlers/parallel.js +1 -1
  25. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
  26. package/dist/resources/extensions/gsd/commands-mcp-status.js +187 -0
  27. package/dist/resources/extensions/gsd/crash-recovery.js +2 -4
  28. package/dist/resources/extensions/gsd/dashboard-overlay.js +0 -44
  29. package/dist/resources/extensions/gsd/db-writer.js +40 -22
  30. package/dist/resources/extensions/gsd/doctor-checks.js +167 -2
  31. package/dist/resources/extensions/gsd/doctor.js +13 -3
  32. package/dist/resources/extensions/gsd/git-service.js +8 -3
  33. package/dist/resources/extensions/gsd/gsd-db.js +28 -4
  34. package/dist/resources/extensions/gsd/guided-flow.js +1 -2
  35. package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
  36. package/dist/resources/extensions/gsd/parallel-merge.js +1 -1
  37. package/dist/resources/extensions/gsd/parallel-orchestrator.js +5 -18
  38. package/dist/resources/extensions/gsd/preferences-types.js +2 -2
  39. package/dist/resources/extensions/gsd/preferences.js +17 -5
  40. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +21 -10
  41. package/dist/resources/extensions/gsd/prompts/complete-slice.md +10 -23
  42. package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
  43. package/dist/resources/extensions/gsd/prompts/execute-task.md +5 -15
  44. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  45. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  46. package/dist/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
  47. package/dist/resources/extensions/gsd/prompts/guided-research-slice.md +1 -1
  48. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  49. package/dist/resources/extensions/gsd/prompts/plan-slice.md +5 -3
  50. package/dist/resources/extensions/gsd/prompts/queue.md +2 -2
  51. package/dist/resources/extensions/gsd/prompts/quick-task.md +2 -0
  52. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  53. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
  54. package/dist/resources/extensions/gsd/prompts/replan-slice.md +3 -14
  55. package/dist/resources/extensions/gsd/prompts/research-slice.md +3 -3
  56. package/dist/resources/extensions/gsd/prompts/rethink.md +83 -0
  57. package/dist/resources/extensions/gsd/prompts/system.md +1 -1
  58. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
  59. package/dist/resources/extensions/gsd/provider-error-pause.js +7 -0
  60. package/dist/resources/extensions/gsd/repo-identity.js +45 -7
  61. package/dist/resources/extensions/gsd/rethink.js +115 -0
  62. package/dist/resources/extensions/gsd/session-lock.js +1 -3
  63. package/dist/resources/extensions/gsd/state.js +48 -3
  64. package/dist/resources/extensions/gsd/sync-lock.js +89 -0
  65. package/dist/resources/extensions/gsd/tools/complete-milestone.js +61 -11
  66. package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -11
  67. package/dist/resources/extensions/gsd/tools/complete-task.js +50 -2
  68. package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -1
  69. package/dist/resources/extensions/gsd/tools/plan-slice.js +31 -1
  70. package/dist/resources/extensions/gsd/tools/plan-task.js +28 -1
  71. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +32 -2
  72. package/dist/resources/extensions/gsd/tools/reopen-slice.js +86 -0
  73. package/dist/resources/extensions/gsd/tools/reopen-task.js +90 -0
  74. package/dist/resources/extensions/gsd/tools/replan-slice.js +34 -2
  75. package/dist/resources/extensions/gsd/tools/validate-milestone.js +88 -0
  76. package/dist/resources/extensions/gsd/unit-ownership.js +85 -0
  77. package/dist/resources/extensions/gsd/workflow-events.js +102 -0
  78. package/dist/resources/extensions/gsd/workflow-logger.js +193 -0
  79. package/dist/resources/extensions/gsd/workflow-manifest.js +244 -0
  80. package/dist/resources/extensions/gsd/workflow-migration.js +280 -0
  81. package/dist/resources/extensions/gsd/workflow-projections.js +373 -0
  82. package/dist/resources/extensions/gsd/workflow-reconcile.js +411 -0
  83. package/dist/resources/extensions/gsd/worktree-manager.js +34 -3
  84. package/dist/resources/extensions/gsd/worktree-resolver.js +43 -0
  85. package/dist/resources/extensions/gsd/write-intercept.js +84 -0
  86. package/dist/resources/extensions/mcp-client/index.js +14 -0
  87. package/dist/resources/extensions/voice/index.js +11 -16
  88. package/dist/resources/extensions/voice/linux-ready.js +67 -0
  89. package/dist/web/standalone/.next/BUILD_ID +1 -1
  90. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  91. package/dist/web/standalone/.next/build-manifest.json +4 -4
  92. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  93. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  94. package/dist/web/standalone/.next/required-server-files.json +3 -3
  95. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  96. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  97. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  98. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  100. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  106. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  108. package/dist/web/standalone/.next/server/app/_not-found.rsc +5 -5
  109. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +5 -5
  110. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  112. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  115. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  122. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  160. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  166. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  180. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  182. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  184. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  186. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/index.html +1 -1
  196. package/dist/web/standalone/.next/server/app/index.rsc +6 -6
  197. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  198. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +6 -6
  199. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  200. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  201. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  202. package/dist/web/standalone/.next/server/app/page.js +2 -2
  203. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  205. package/dist/web/standalone/.next/server/chunks/229.js +1 -1
  206. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  207. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/middleware.js +2 -2
  210. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  212. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  213. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  214. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  215. package/dist/web/standalone/.next/static/chunks/4024.11ca5c01938e5948.js +9 -0
  216. package/dist/web/standalone/.next/static/chunks/{3721.bf31263de6d5fa46.js → 485.243af25f0cdf50d6.js} +2 -2
  217. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  218. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  219. package/dist/web/standalone/.next/static/chunks/app/page-6654a8cca61a3d1c.js +1 -0
  220. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  221. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  222. package/dist/web/standalone/.next/static/chunks/webpack-0a4cd455ec4197d2.js +1 -0
  223. package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +1 -0
  224. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  225. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  226. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  227. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  228. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  229. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  230. package/dist/web/standalone/server.js +1 -1
  231. package/package.json +2 -1
  232. package/packages/native/dist/stream-process/index.js +2 -2
  233. package/packages/native/src/__tests__/stream-process.test.mjs +34 -0
  234. package/packages/native/src/stream-process/index.ts +2 -2
  235. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +3 -1
  236. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  237. package/packages/pi-coding-agent/dist/core/auth-storage.js +15 -1
  238. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  239. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
  240. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  241. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
  242. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +2 -0
  243. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  244. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
  245. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  246. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +2 -1
  247. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  248. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  249. package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
  250. package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
  251. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +4 -0
  252. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -1
  253. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +10 -5
  254. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -1
  255. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.d.ts +2 -0
  256. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.d.ts.map +1 -0
  257. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.js +185 -0
  258. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.js.map +1 -0
  259. package/packages/pi-coding-agent/dist/core/local-model-check.d.ts +15 -0
  260. package/packages/pi-coding-agent/dist/core/local-model-check.d.ts.map +1 -0
  261. package/packages/pi-coding-agent/dist/core/local-model-check.js +41 -0
  262. package/packages/pi-coding-agent/dist/core/local-model-check.js.map +1 -0
  263. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +239 -10
  264. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  265. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +13 -1
  266. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
  268. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  269. package/packages/pi-coding-agent/dist/core/package-commands.test.js +206 -195
  270. package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -1
  271. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
  272. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  273. package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
  274. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  275. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  276. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  277. package/packages/pi-coding-agent/dist/core/settings-manager.js +6 -0
  278. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  279. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
  280. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
  281. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  282. package/packages/pi-coding-agent/dist/main.js +17 -0
  283. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  284. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts +2 -0
  285. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts.map +1 -0
  286. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js +32 -0
  287. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js.map +1 -0
  288. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +3 -1
  289. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  290. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +8 -1
  291. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  292. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  293. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  294. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +12 -0
  295. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  296. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts +15 -0
  297. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts.map +1 -0
  298. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js +40 -0
  299. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js.map +1 -0
  300. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  301. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +4 -1
  302. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  303. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +5 -2
  304. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  305. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +13 -2
  306. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  307. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  308. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +17 -8
  309. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  310. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  311. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +7 -3
  312. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  313. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
  314. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
  315. package/packages/pi-coding-agent/package.json +1 -1
  316. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
  317. package/packages/pi-coding-agent/src/core/auth-storage.ts +15 -1
  318. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +2 -0
  319. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
  320. package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -1
  321. package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
  322. package/packages/pi-coding-agent/src/core/lifecycle-hooks.test.ts +227 -0
  323. package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +11 -5
  324. package/packages/pi-coding-agent/src/core/local-model-check.ts +45 -0
  325. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +297 -11
  326. package/packages/pi-coding-agent/src/core/model-registry.ts +51 -4
  327. package/packages/pi-coding-agent/src/core/package-commands.test.ts +227 -205
  328. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
  329. package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
  330. package/packages/pi-coding-agent/src/core/settings-manager.ts +9 -0
  331. package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
  332. package/packages/pi-coding-agent/src/main.ts +19 -0
  333. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +38 -0
  334. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +10 -0
  335. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
  336. package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +48 -0
  337. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +3 -1
  338. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +18 -3
  339. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +16 -7
  340. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +8 -1
  341. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
  342. package/pkg/package.json +1 -1
  343. package/src/resources/extensions/gsd/activity-log.ts +1 -0
  344. package/src/resources/extensions/gsd/auto/infra-errors.ts +3 -0
  345. package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -19
  346. package/src/resources/extensions/gsd/auto/phases.ts +69 -91
  347. package/src/resources/extensions/gsd/auto/run-unit.ts +6 -3
  348. package/src/resources/extensions/gsd/auto/session.ts +0 -18
  349. package/src/resources/extensions/gsd/auto-artifact-paths.ts +131 -0
  350. package/src/resources/extensions/gsd/auto-dashboard.ts +0 -1
  351. package/src/resources/extensions/gsd/auto-post-unit.ts +25 -106
  352. package/src/resources/extensions/gsd/auto-prompts.ts +24 -1
  353. package/src/resources/extensions/gsd/auto-start.ts +40 -5
  354. package/src/resources/extensions/gsd/auto-timers.ts +64 -3
  355. package/src/resources/extensions/gsd/auto-worktree-sync.ts +5 -0
  356. package/src/resources/extensions/gsd/auto-worktree.ts +17 -11
  357. package/src/resources/extensions/gsd/auto.ts +44 -86
  358. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +162 -11
  359. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
  360. package/src/resources/extensions/gsd/bootstrap/system-context.ts +48 -11
  361. package/src/resources/extensions/gsd/commands/catalog.ts +7 -1
  362. package/src/resources/extensions/gsd/commands/context.ts +0 -5
  363. package/src/resources/extensions/gsd/commands/handlers/core.ts +2 -0
  364. package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -0
  365. package/src/resources/extensions/gsd/commands/handlers/parallel.ts +1 -1
  366. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
  367. package/src/resources/extensions/gsd/commands-mcp-status.ts +247 -0
  368. package/src/resources/extensions/gsd/crash-recovery.ts +1 -5
  369. package/src/resources/extensions/gsd/dashboard-overlay.ts +0 -50
  370. package/src/resources/extensions/gsd/db-writer.ts +41 -27
  371. package/src/resources/extensions/gsd/doctor-checks.ts +180 -2
  372. package/src/resources/extensions/gsd/doctor-types.ts +7 -1
  373. package/src/resources/extensions/gsd/doctor.ts +13 -4
  374. package/src/resources/extensions/gsd/git-service.ts +6 -2
  375. package/src/resources/extensions/gsd/gsd-db.ts +32 -4
  376. package/src/resources/extensions/gsd/guided-flow.ts +1 -2
  377. package/src/resources/extensions/gsd/journal.ts +6 -1
  378. package/src/resources/extensions/gsd/markdown-renderer.ts +1 -1
  379. package/src/resources/extensions/gsd/parallel-merge.ts +1 -1
  380. package/src/resources/extensions/gsd/parallel-orchestrator.ts +5 -21
  381. package/src/resources/extensions/gsd/preferences-types.ts +2 -2
  382. package/src/resources/extensions/gsd/preferences.ts +18 -4
  383. package/src/resources/extensions/gsd/prompts/complete-milestone.md +21 -10
  384. package/src/resources/extensions/gsd/prompts/complete-slice.md +10 -23
  385. package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
  386. package/src/resources/extensions/gsd/prompts/execute-task.md +5 -15
  387. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  388. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  389. package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
  390. package/src/resources/extensions/gsd/prompts/guided-research-slice.md +1 -1
  391. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  392. package/src/resources/extensions/gsd/prompts/plan-slice.md +5 -3
  393. package/src/resources/extensions/gsd/prompts/queue.md +2 -2
  394. package/src/resources/extensions/gsd/prompts/quick-task.md +2 -0
  395. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  396. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
  397. package/src/resources/extensions/gsd/prompts/replan-slice.md +3 -14
  398. package/src/resources/extensions/gsd/prompts/research-slice.md +3 -3
  399. package/src/resources/extensions/gsd/prompts/rethink.md +83 -0
  400. package/src/resources/extensions/gsd/prompts/system.md +1 -1
  401. package/src/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
  402. package/src/resources/extensions/gsd/provider-error-pause.ts +9 -0
  403. package/src/resources/extensions/gsd/repo-identity.ts +46 -7
  404. package/src/resources/extensions/gsd/rethink.ts +154 -0
  405. package/src/resources/extensions/gsd/session-lock.ts +0 -4
  406. package/src/resources/extensions/gsd/state.ts +49 -1
  407. package/src/resources/extensions/gsd/sync-lock.ts +94 -0
  408. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
  409. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +19 -29
  410. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +6 -10
  411. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
  412. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +88 -0
  413. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
  414. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +465 -523
  415. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
  416. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
  417. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +533 -656
  418. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
  419. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
  420. package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
  421. package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
  422. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
  423. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
  424. package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
  425. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +134 -59
  426. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +15 -14
  427. package/src/resources/extensions/gsd/tests/complete-task.test.ts +27 -12
  428. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +114 -0
  429. package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
  430. package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
  431. package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
  432. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +26 -40
  433. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -3
  434. package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
  435. package/src/resources/extensions/gsd/tests/db-writer.test.ts +465 -416
  436. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
  437. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +68 -83
  438. package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +121 -0
  439. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +210 -181
  440. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
  441. package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
  442. package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
  443. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
  444. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +164 -180
  445. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
  446. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
  447. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +27 -29
  448. package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
  449. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +54 -75
  450. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +21 -32
  451. package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
  452. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -44
  453. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
  454. package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
  455. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +54 -60
  456. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
  457. package/src/resources/extensions/gsd/tests/doctor.test.ts +104 -134
  458. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
  459. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +120 -0
  460. package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
  461. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
  462. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
  463. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +30 -42
  464. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +198 -206
  465. package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
  466. package/src/resources/extensions/gsd/tests/git-service.test.ts +285 -388
  467. package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
  468. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
  469. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
  470. package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
  471. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +81 -103
  472. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
  473. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
  474. package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
  475. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +82 -103
  476. package/src/resources/extensions/gsd/tests/infra-error.test.ts +20 -2
  477. package/src/resources/extensions/gsd/tests/inherited-repo-home-dir.test.ts +121 -0
  478. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
  479. package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
  480. package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
  481. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
  482. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +33 -42
  483. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
  484. package/src/resources/extensions/gsd/tests/knowledge.test.ts +89 -0
  485. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +150 -194
  486. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +103 -0
  487. package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
  488. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
  489. package/src/resources/extensions/gsd/tests/memory-store.test.ts +81 -94
  490. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +66 -0
  491. package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
  492. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +83 -93
  493. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
  494. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
  495. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
  496. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +87 -96
  497. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +125 -164
  498. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +8 -9
  499. package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
  500. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +75 -37
  501. package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
  502. package/src/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +0 -1
  503. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +39 -53
  504. package/src/resources/extensions/gsd/tests/parallel-merge.test.ts +7 -8
  505. package/src/resources/extensions/gsd/tests/parallel-orchestration.test.ts +20 -24
  506. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +24 -29
  507. package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
  508. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
  509. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
  510. package/src/resources/extensions/gsd/tests/parsers.test.ts +546 -611
  511. package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
  512. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +9 -6
  513. package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +171 -0
  514. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
  515. package/src/resources/extensions/gsd/tests/preferences.test.ts +34 -9
  516. package/src/resources/extensions/gsd/tests/projection-regression.test.ts +174 -0
  517. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +26 -21
  518. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
  519. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
  520. package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
  521. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
  522. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
  523. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
  524. package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
  525. package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +176 -0
  526. package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +155 -0
  527. package/src/resources/extensions/gsd/tests/reopen-task.test.ts +165 -0
  528. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
  529. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
  530. package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
  531. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
  532. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
  533. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
  534. package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
  535. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
  536. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -47
  537. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +19 -26
  538. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
  539. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
  540. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +67 -0
  541. package/src/resources/extensions/gsd/tests/stop-auto-remote.test.ts +2 -3
  542. package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +108 -0
  543. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
  544. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +122 -0
  545. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +49 -0
  546. package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
  547. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
  548. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +10 -11
  549. package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
  550. package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +175 -0
  551. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
  552. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
  553. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
  554. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
  555. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
  556. package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
  557. package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
  558. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +205 -0
  559. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +275 -0
  560. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +186 -0
  561. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +171 -0
  562. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
  563. package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
  564. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
  565. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
  566. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
  567. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
  568. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
  569. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +220 -0
  570. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +65 -0
  571. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
  572. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
  573. package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
  574. package/src/resources/extensions/gsd/tests/write-intercept.test.ts +76 -0
  575. package/src/resources/extensions/gsd/tools/complete-milestone.ts +74 -11
  576. package/src/resources/extensions/gsd/tools/complete-slice.ts +68 -11
  577. package/src/resources/extensions/gsd/tools/complete-task.ts +63 -1
  578. package/src/resources/extensions/gsd/tools/plan-milestone.ts +45 -0
  579. package/src/resources/extensions/gsd/tools/plan-slice.ts +40 -0
  580. package/src/resources/extensions/gsd/tools/plan-task.ts +37 -1
  581. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +39 -1
  582. package/src/resources/extensions/gsd/tools/reopen-slice.ts +125 -0
  583. package/src/resources/extensions/gsd/tools/reopen-task.ts +129 -0
  584. package/src/resources/extensions/gsd/tools/replan-slice.ts +41 -1
  585. package/src/resources/extensions/gsd/tools/validate-milestone.ts +127 -0
  586. package/src/resources/extensions/gsd/types.ts +8 -0
  587. package/src/resources/extensions/gsd/unit-ownership.ts +104 -0
  588. package/src/resources/extensions/gsd/workflow-events.ts +154 -0
  589. package/src/resources/extensions/gsd/workflow-logger.ts +243 -0
  590. package/src/resources/extensions/gsd/workflow-manifest.ts +334 -0
  591. package/src/resources/extensions/gsd/workflow-migration.ts +345 -0
  592. package/src/resources/extensions/gsd/workflow-projections.ts +425 -0
  593. package/src/resources/extensions/gsd/workflow-reconcile.ts +503 -0
  594. package/src/resources/extensions/gsd/worktree-manager.ts +41 -5
  595. package/src/resources/extensions/gsd/worktree-resolver.ts +44 -0
  596. package/src/resources/extensions/gsd/write-intercept.ts +90 -0
  597. package/src/resources/extensions/mcp-client/index.ts +20 -0
  598. package/src/resources/extensions/voice/index.ts +11 -21
  599. package/src/resources/extensions/voice/linux-ready.ts +87 -0
  600. package/src/resources/extensions/voice/tests/linux-ready.test.ts +124 -0
  601. package/dist/web/standalone/.next/static/chunks/4024.0de81b543b28b9fe.js +0 -9
  602. package/dist/web/standalone/.next/static/chunks/app/page-7e9530a7122506c5.js +0 -1
  603. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  604. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  605. package/dist/web/standalone/.next/static/chunks/webpack-9014b5adb127a98a.js +0 -1
  606. package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +0 -1
  607. /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → j-BskPs0nxxPeYY-bSrab}/_buildManifest.js +0 -0
  608. /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → j-BskPs0nxxPeYY-bSrab}/_ssgManifest.js +0 -0
@@ -58,17 +58,18 @@ test("guided-resume-task prompt preserves recovery state until work is supersede
58
58
  assert.doesNotMatch(prompt, /Delete the continue file after reading it/i);
59
59
  });
60
60
 
61
- // ─── Prompt migration: execute-task → gsd_task_complete ───────────────
61
+ // ─── Prompt migration: execute-task → gsd_complete_task ───────────────
62
62
 
63
- test("execute-task prompt references gsd_task_complete tool", () => {
63
+ test("execute-task prompt references gsd_complete_task tool", () => {
64
64
  const prompt = readPrompt("execute-task");
65
- assert.match(prompt, /gsd_task_complete/);
65
+ assert.match(prompt, /gsd_complete_task/);
66
66
  });
67
67
 
68
- test("execute-task prompt does not instruct LLM to write summary file manually", () => {
68
+ test("execute-task prompt instructs writing task summary before tool call", () => {
69
69
  const prompt = readPrompt("execute-task");
70
- // Should not contain "Write {{taskSummaryPath}}" as an action instruction
71
- assert.doesNotMatch(prompt, /^\d+\.\s+Write `?\{\{taskSummaryPath\}\}`?/m);
70
+ // The prompt instructs writing the summary file AND calling the tool
71
+ assert.match(prompt, /\{\{taskSummaryPath\}\}/);
72
+ assert.match(prompt, /gsd_complete_task/);
72
73
  });
73
74
 
74
75
  test("execute-task prompt does not instruct LLM to toggle checkboxes manually", () => {
@@ -93,12 +94,11 @@ test("guided-execute-task prompt does not instruct manual file write", () => {
93
94
  assert.doesNotMatch(prompt, /Write `?\{\{taskId\}\}-SUMMARY\.md`?.*mark it done/i);
94
95
  });
95
96
 
96
- // ─── Prompt migration: complete-slice → gsd_slice_complete ────────────
97
- // These tests are for T02 — expected to fail until that task runs.
97
+ // ─── Prompt migration: complete-slice → gsd_complete_slice ────────────
98
98
 
99
- test("complete-slice prompt references gsd_slice_complete tool", () => {
99
+ test("complete-slice prompt references gsd_complete_slice tool", () => {
100
100
  const prompt = readPrompt("complete-slice");
101
- assert.match(prompt, /gsd_slice_complete/);
101
+ assert.match(prompt, /gsd_complete_slice/);
102
102
  });
103
103
 
104
104
  test("complete-slice prompt does not instruct LLM to toggle checkboxes manually", () => {
@@ -111,10 +111,12 @@ test("guided-complete-slice prompt references gsd_slice_complete tool", () => {
111
111
  assert.match(prompt, /gsd_slice_complete/);
112
112
  });
113
113
 
114
- test("complete-slice prompt does not instruct LLM to write summary/UAT files manually", () => {
114
+ test("complete-slice prompt instructs writing summary and UAT files before tool call", () => {
115
115
  const prompt = readPrompt("complete-slice");
116
- assert.doesNotMatch(prompt, /^\d+\.\s+Write `?\{\{sliceSummaryPath\}\}/m);
117
- assert.doesNotMatch(prompt, /^\d+\.\s+Write `?\{\{sliceUatPath\}\}/m);
116
+ // The prompt instructs writing the summary AND UAT files, then calling the tool
117
+ assert.match(prompt, /\{\{sliceSummaryPath\}\}/);
118
+ assert.match(prompt, /\{\{sliceUatPath\}\}/);
119
+ assert.match(prompt, /gsd_complete_slice/);
118
120
  });
119
121
 
120
122
  test("complete-slice prompt preserves decisions and knowledge review steps", () => {
@@ -127,7 +129,6 @@ test("complete-slice prompt still contains template variables for context", () =
127
129
  const prompt = readPrompt("complete-slice");
128
130
  assert.match(prompt, /\{\{sliceSummaryPath\}\}/);
129
131
  assert.match(prompt, /\{\{sliceUatPath\}\}/);
130
- assert.match(prompt, /\{\{roadmapPath\}\}/);
131
132
  });
132
133
 
133
134
  test("plan-milestone prompt references DB-backed planning tool and explicitly forbids manual roadmap writes", () => {
@@ -147,12 +148,12 @@ test("plan-slice prompt no longer frames direct PLAN writes as the source of tru
147
148
  assert.match(prompt, /Do \*\*not\*\* rely on direct `PLAN\.md` writes as the source of truth/i);
148
149
  });
149
150
 
150
- test("plan-slice prompt explicitly names gsd_plan_slice and gsd_plan_task as DB-backed planning tools", () => {
151
+ test("plan-slice prompt explicitly names gsd_plan_slice as DB-backed planning tool", () => {
151
152
  const prompt = readPrompt("plan-slice");
152
153
  assert.match(prompt, /gsd_plan_slice/);
153
154
  assert.match(prompt, /gsd_plan_task/);
154
- // The prompt should describe these as the canonical write path
155
- assert.match(prompt, /DB-backed tools are the canonical write path/i);
155
+ // The prompt should describe the DB-backed tool as the canonical write path
156
+ assert.match(prompt, /DB-backed tool is the canonical write path/i);
156
157
  });
157
158
 
158
159
  test("plan-slice prompt does not instruct direct file writes as a primary step", () => {
@@ -161,14 +162,18 @@ test("plan-slice prompt does not instruct direct file writes as a primary step",
161
162
  assert.doesNotMatch(prompt, /^\d+\.\s+Write `?\{\{outputPath\}\}`?\s*$/m);
162
163
  });
163
164
 
164
- test("plan-slice prompt instructs calling gsd_plan_task for each task", () => {
165
+ test("plan-slice prompt clarifies gsd_plan_slice handles task persistence", () => {
165
166
  const prompt = readPrompt("plan-slice");
166
- assert.match(prompt, /call `gsd_plan_task` for each task/i);
167
+ // gsd_plan_slice persists tasks in its transaction — no separate gsd_plan_task calls needed
168
+ assert.match(prompt, /gsd_plan_task/);
169
+ assert.match(prompt, /gsd_plan_slice` handles task persistence/i);
167
170
  });
168
171
 
169
- test("replan-slice prompt requires DB-backed planning state when available", () => {
172
+ test("replan-slice prompt uses gsd_replan_slice as canonical DB-backed tool", () => {
170
173
  const prompt = readPrompt("replan-slice");
171
- assert.match(prompt, /DB-backed planning tool exists for this phase, use it as the source of truth/i);
174
+ assert.match(prompt, /gsd_replan_slice/);
175
+ // Degraded fallback (direct file writes) was removed — DB tools are always available
176
+ assert.doesNotMatch(prompt, /Degraded fallback/i);
172
177
  });
173
178
 
174
179
  test("reassess-roadmap prompt references gsd_reassess_roadmap tool", () => {
@@ -5,7 +5,8 @@
5
5
  // (b) Helpers fall back to non-null output when DB unavailable
6
6
  // (c) Scoped filtering actually reduces content
7
7
 
8
- import { createTestContext } from './test-helpers.ts';
8
+ import { describe, test } from 'node:test';
9
+ import assert from 'node:assert/strict';
9
10
  import {
10
11
  openDatabase,
11
12
  closeDatabase,
@@ -22,8 +23,6 @@ import {
22
23
  formatRequirementsForPrompt,
23
24
  } from '../context-store.ts';
24
25
 
25
- const { assertEq, assertTrue, assertMatch, assertNoMatch, report } = createTestContext();
26
-
27
26
  // ═══════════════════════════════════════════════════════════════════════════
28
27
  // prompt-db: DB-aware decisions helper returns scoped content
29
28
  // ═══════════════════════════════════════════════════════════════════════════
@@ -50,23 +49,23 @@ console.log('\n=== prompt-db: scoped decisions from DB ===');
50
49
 
51
50
  // Query scoped to M001
52
51
  const m001Decisions = queryDecisions({ milestoneId: 'M001' });
53
- assertTrue(m001Decisions.length > 0, 'M001 decisions should exist');
54
- assertTrue(m001Decisions.length < 10, `scoped query should return fewer than 10 (got ${m001Decisions.length})`);
52
+ assert.ok(m001Decisions.length > 0, 'M001 decisions should exist');
53
+ assert.ok(m001Decisions.length < 10, `scoped query should return fewer than 10 (got ${m001Decisions.length})`);
55
54
 
56
55
  // Verify all returned decisions are for M001
57
56
  for (const d of m001Decisions) {
58
- assertMatch(d.when_context, /M001/, `decision ${d.id} should be for M001`);
57
+ assert.match(d.when_context, /M001/, `decision ${d.id} should be for M001`);
59
58
  }
60
59
 
61
60
  // Format and verify wrapping
62
61
  const formatted = formatDecisionsForPrompt(m001Decisions);
63
- assertTrue(formatted.length > 0, 'formatted decisions should be non-empty');
64
- assertMatch(formatted, /\| # \| When \| Scope/, 'formatted decisions have table header');
62
+ assert.ok(formatted.length > 0, 'formatted decisions should be non-empty');
63
+ assert.match(formatted, /\| # \| When \| Scope/, 'formatted decisions have table header');
65
64
 
66
65
  // Verify the expected wrapper format that inlineDecisionsFromDb would produce
67
66
  const wrapped = `### Decisions\nSource: \`.gsd/DECISIONS.md\`\n\n${formatted}`;
68
- assertMatch(wrapped, /^### Decisions/, 'wrapped decisions start with ### Decisions');
69
- assertMatch(wrapped, /Source:.*DECISIONS\.md/, 'wrapped decisions have source path');
67
+ assert.match(wrapped, /^### Decisions/, 'wrapped decisions start with ### Decisions');
68
+ assert.match(wrapped, /Source:.*DECISIONS\.md/, 'wrapped decisions have source path');
70
69
 
71
70
  closeDatabase();
72
71
  }
@@ -101,25 +100,25 @@ console.log('\n=== prompt-db: scoped requirements from DB ===');
101
100
 
102
101
  // Query scoped to S01 — should get R001 (primary) and R002 (supporting)
103
102
  const s01Reqs = queryRequirements({ sliceId: 'S01' });
104
- assertEq(s01Reqs.length, 2, 'S01 requirements should be 2 (primary + supporting)');
103
+ assert.deepStrictEqual(s01Reqs.length, 2, 'S01 requirements should be 2 (primary + supporting)');
105
104
  const ids = s01Reqs.map(r => r.id).sort();
106
- assertEq(ids, ['R001', 'R002'], 'S01 owns R001 and supports R002');
105
+ assert.deepStrictEqual(ids, ['R001', 'R002'], 'S01 owns R001 and supports R002');
107
106
 
108
107
  // Unscoped query returns all 3
109
108
  const allReqs = queryRequirements();
110
- assertEq(allReqs.length, 3, 'unscoped requirements should return all 3');
109
+ assert.deepStrictEqual(allReqs.length, 3, 'unscoped requirements should return all 3');
111
110
 
112
111
  // Format and verify wrapping
113
112
  const formatted = formatRequirementsForPrompt(s01Reqs);
114
- assertTrue(formatted.length > 0, 'formatted requirements should be non-empty');
115
- assertMatch(formatted, /### R001/, 'formatted requirements include R001');
116
- assertMatch(formatted, /### R002/, 'formatted requirements include R002');
117
- assertNoMatch(formatted, /### R003/, 'formatted requirements exclude R003');
113
+ assert.ok(formatted.length > 0, 'formatted requirements should be non-empty');
114
+ assert.match(formatted, /### R001/, 'formatted requirements include R001');
115
+ assert.match(formatted, /### R002/, 'formatted requirements include R002');
116
+ assert.doesNotMatch(formatted, /### R003/, 'formatted requirements exclude R003');
118
117
 
119
118
  // Verify the expected wrapper format that inlineRequirementsFromDb would produce
120
119
  const wrapped = `### Requirements\nSource: \`.gsd/REQUIREMENTS.md\`\n\n${formatted}`;
121
- assertMatch(wrapped, /^### Requirements/, 'wrapped requirements start with ### Requirements');
122
- assertMatch(wrapped, /Source:.*REQUIREMENTS\.md/, 'wrapped requirements have source path');
120
+ assert.match(wrapped, /^### Requirements/, 'wrapped requirements start with ### Requirements');
121
+ assert.match(wrapped, /Source:.*REQUIREMENTS\.md/, 'wrapped requirements have source path');
123
122
 
124
123
  closeDatabase();
125
124
  }
@@ -142,13 +141,13 @@ console.log('\n=== prompt-db: project content from DB ===');
142
141
  });
143
142
 
144
143
  const content = queryProject();
145
- assertEq(content, '# Test Project\n\nThis is the project description.', 'queryProject returns content');
144
+ assert.deepStrictEqual(content, '# Test Project\n\nThis is the project description.', 'queryProject returns content');
146
145
 
147
146
  // Verify the expected wrapper format that inlineProjectFromDb would produce
148
147
  const wrapped = `### Project\nSource: \`.gsd/PROJECT.md\`\n\n${content}`;
149
- assertMatch(wrapped, /^### Project/, 'wrapped project starts with ### Project');
150
- assertMatch(wrapped, /Source:.*PROJECT\.md/, 'wrapped project has source path');
151
- assertMatch(wrapped, /# Test Project/, 'wrapped project includes content');
148
+ assert.match(wrapped, /^### Project/, 'wrapped project starts with ### Project');
149
+ assert.match(wrapped, /Source:.*PROJECT\.md/, 'wrapped project has source path');
150
+ assert.match(wrapped, /# Test Project/, 'wrapped project includes content');
152
151
 
153
152
  closeDatabase();
154
153
  }
@@ -160,27 +159,27 @@ console.log('\n=== prompt-db: project content from DB ===');
160
159
  console.log('\n=== prompt-db: fallback when DB unavailable ===');
161
160
  {
162
161
  closeDatabase();
163
- assertTrue(!isDbAvailable(), 'DB should not be available');
162
+ assert.ok(!isDbAvailable(), 'DB should not be available');
164
163
 
165
164
  // queryDecisions returns [] when DB closed — helper would fall back
166
165
  const decisions = queryDecisions({ milestoneId: 'M001' });
167
- assertEq(decisions, [], 'queryDecisions returns [] when DB closed');
166
+ assert.deepStrictEqual(decisions, [], 'queryDecisions returns [] when DB closed');
168
167
 
169
168
  // queryRequirements returns [] when DB closed — helper would fall back
170
169
  const requirements = queryRequirements({ sliceId: 'S01' });
171
- assertEq(requirements, [], 'queryRequirements returns [] when DB closed');
170
+ assert.deepStrictEqual(requirements, [], 'queryRequirements returns [] when DB closed');
172
171
 
173
172
  // queryProject returns null when DB closed — helper would fall back
174
173
  const project = queryProject();
175
- assertEq(project, null, 'queryProject returns null when DB closed');
174
+ assert.deepStrictEqual(project, null, 'queryProject returns null when DB closed');
176
175
 
177
176
  // formatDecisionsForPrompt returns '' for empty input
178
177
  const formatted = formatDecisionsForPrompt([]);
179
- assertEq(formatted, '', 'formatDecisionsForPrompt returns empty for empty input');
178
+ assert.deepStrictEqual(formatted, '', 'formatDecisionsForPrompt returns empty for empty input');
180
179
 
181
180
  // formatRequirementsForPrompt returns '' for empty input
182
181
  const formattedReqs = formatRequirementsForPrompt([]);
183
- assertEq(formattedReqs, '', 'formatRequirementsForPrompt returns empty for empty input');
182
+ assert.deepStrictEqual(formattedReqs, '', 'formatRequirementsForPrompt returns empty for empty input');
184
183
  }
185
184
 
186
185
  // ═══════════════════════════════════════════════════════════════════════════
@@ -210,15 +209,15 @@ console.log('\n=== prompt-db: scoped filtering reduces content ===');
210
209
  const allDecisions = queryDecisions();
211
210
  const m001Decisions = queryDecisions({ milestoneId: 'M001' });
212
211
 
213
- assertEq(allDecisions.length, 10, 'unscoped returns all 10 decisions');
214
- assertTrue(m001Decisions.length < 10, `M001-scoped returns fewer than 10 (got ${m001Decisions.length})`);
215
- assertTrue(m001Decisions.length > 0, 'M001-scoped returns at least 1');
212
+ assert.deepStrictEqual(allDecisions.length, 10, 'unscoped returns all 10 decisions');
213
+ assert.ok(m001Decisions.length < 10, `M001-scoped returns fewer than 10 (got ${m001Decisions.length})`);
214
+ assert.ok(m001Decisions.length > 0, 'M001-scoped returns at least 1');
216
215
 
217
216
  // Format both and compare sizes — scoped should be shorter
218
217
  const allFormatted = formatDecisionsForPrompt(allDecisions);
219
218
  const scopedFormatted = formatDecisionsForPrompt(m001Decisions);
220
219
 
221
- assertTrue(
220
+ assert.ok(
222
221
  scopedFormatted.length < allFormatted.length,
223
222
  `scoped content (${scopedFormatted.length} chars) should be shorter than unscoped (${allFormatted.length} chars)`,
224
223
  );
@@ -245,14 +244,14 @@ console.log('\n=== prompt-db: scoped filtering reduces content ===');
245
244
  const allReqs = queryRequirements();
246
245
  const s01Reqs = queryRequirements({ sliceId: 'S01' });
247
246
 
248
- assertEq(allReqs.length, 8, 'unscoped returns all 8 requirements');
249
- assertTrue(s01Reqs.length < 8, `S01-scoped returns fewer than 8 (got ${s01Reqs.length})`);
250
- assertTrue(s01Reqs.length > 0, 'S01-scoped returns at least 1');
247
+ assert.deepStrictEqual(allReqs.length, 8, 'unscoped returns all 8 requirements');
248
+ assert.ok(s01Reqs.length < 8, `S01-scoped returns fewer than 8 (got ${s01Reqs.length})`);
249
+ assert.ok(s01Reqs.length > 0, 'S01-scoped returns at least 1');
251
250
 
252
251
  const allReqsFormatted = formatRequirementsForPrompt(allReqs);
253
252
  const scopedReqsFormatted = formatRequirementsForPrompt(s01Reqs);
254
253
 
255
- assertTrue(
254
+ assert.ok(
256
255
  scopedReqsFormatted.length < allReqsFormatted.length,
257
256
  `scoped requirements (${scopedReqsFormatted.length} chars) should be shorter than unscoped (${allReqsFormatted.length} chars)`,
258
257
  );
@@ -292,23 +291,23 @@ console.log('\n=== prompt-db: DB helpers wrapper format matches expected pattern
292
291
 
293
292
  // Simulate what inlineDecisionsFromDb does
294
293
  const decisions = queryDecisions({ milestoneId: 'M001' });
295
- assertTrue(decisions.length === 1, 'got 1 decision for M001');
294
+ assert.ok(decisions.length === 1, 'got 1 decision for M001');
296
295
  const dFormatted = formatDecisionsForPrompt(decisions);
297
296
  const dWrapped = `### Decisions\nSource: \`.gsd/DECISIONS.md\`\n\n${dFormatted}`;
298
- assertMatch(dWrapped, /^### Decisions\nSource: `.gsd\/DECISIONS\.md`\n\n\| #/, 'decisions wrapper format correct');
297
+ assert.match(dWrapped, /^### Decisions\nSource: `.gsd\/DECISIONS\.md`\n\n\| #/, 'decisions wrapper format correct');
299
298
 
300
299
  // Simulate what inlineRequirementsFromDb does
301
300
  const reqs = queryRequirements({ sliceId: 'S01' });
302
- assertTrue(reqs.length === 1, 'got 1 requirement for S01');
301
+ assert.ok(reqs.length === 1, 'got 1 requirement for S01');
303
302
  const rFormatted = formatRequirementsForPrompt(reqs);
304
303
  const rWrapped = `### Requirements\nSource: \`.gsd/REQUIREMENTS.md\`\n\n${rFormatted}`;
305
- assertMatch(rWrapped, /^### Requirements\nSource: `.gsd\/REQUIREMENTS\.md`\n\n### R001/, 'requirements wrapper format correct');
304
+ assert.match(rWrapped, /^### Requirements\nSource: `.gsd\/REQUIREMENTS\.md`\n\n### R001/, 'requirements wrapper format correct');
306
305
 
307
306
  // Simulate what inlineProjectFromDb does
308
307
  const project = queryProject();
309
- assertTrue(project !== null, 'project content exists');
308
+ assert.ok(project !== null, 'project content exists');
310
309
  const pWrapped = `### Project\nSource: \`.gsd/PROJECT.md\`\n\n${project}`;
311
- assertMatch(pWrapped, /^### Project\nSource: `.gsd\/PROJECT\.md`\n\n# Project Name/, 'project wrapper format correct');
310
+ assert.match(pWrapped, /^### Project\nSource: `.gsd\/PROJECT\.md`\n\n# Project Name/, 'project wrapper format correct');
312
311
 
313
312
  closeDatabase();
314
313
  }
@@ -322,8 +321,9 @@ import { join } from 'node:path';
322
321
  import { tmpdir } from 'node:os';
323
322
  import { migrateFromMarkdown } from '../md-importer.ts';
324
323
 
325
- console.log('\n=== prompt-db: re-import updates DB when source markdown changes ===');
326
- {
324
+
325
+ describe('prompt-db', () => {
326
+ test('prompt-db: re-import updates DB when source markdown changes', () => {
327
327
  // Create a temp dir simulating a project with .gsd/DECISIONS.md
328
328
  const tmpDir = mkdtempSync(join(tmpdir(), 'prompt-db-reimport-'));
329
329
  const gsdDir = join(tmpDir, '.gsd');
@@ -345,9 +345,9 @@ console.log('\n=== prompt-db: re-import updates DB when source markdown changes
345
345
 
346
346
  // Verify initial state: 2 decisions
347
347
  const initial = queryDecisions();
348
- assertEq(initial.length, 2, 're-import: initial import has 2 decisions');
348
+ assert.deepStrictEqual(initial.length, 2, 're-import: initial import has 2 decisions');
349
349
  const initialIds = initial.map(d => d.id).sort();
350
- assertEq(initialIds, ['D001', 'D002'], 're-import: initial decisions are D001, D002');
350
+ assert.deepStrictEqual(initialIds, ['D001', 'D002'], 're-import: initial decisions are D001, D002');
351
351
 
352
352
  // Now "the LLM modifies DECISIONS.md" — add a third decision
353
353
  const updatedDecisions = `# Decisions Register
@@ -365,23 +365,23 @@ console.log('\n=== prompt-db: re-import updates DB when source markdown changes
365
365
 
366
366
  // Verify DB now has 3 decisions
367
367
  const afterReimport = queryDecisions();
368
- assertEq(afterReimport.length, 3, 're-import: after re-import has 3 decisions');
368
+ assert.deepStrictEqual(afterReimport.length, 3, 're-import: after re-import has 3 decisions');
369
369
  const afterIds = afterReimport.map(d => d.id).sort();
370
- assertEq(afterIds, ['D001', 'D002', 'D003'], 're-import: decisions are D001, D002, D003');
370
+ assert.deepStrictEqual(afterIds, ['D001', 'D002', 'D003'], 're-import: decisions are D001, D002, D003');
371
371
 
372
372
  // Verify the new decision has correct data
373
373
  const d003 = afterReimport.find(d => d.id === 'D003');
374
- assertTrue(d003 !== undefined, 're-import: D003 exists');
375
- assertEq(d003!.when_context, 'M001/S02', 're-import: D003 when_context is M001/S02');
376
- assertEq(d003!.scope, 'runtime', 're-import: D003 scope is runtime');
377
- assertEq(d003!.choice, 'D014 pattern', 're-import: D003 choice is D014 pattern');
374
+ assert.ok(d003 !== undefined, 're-import: D003 exists');
375
+ assert.deepStrictEqual(d003!.when_context, 'M001/S02', 're-import: D003 when_context is M001/S02');
376
+ assert.deepStrictEqual(d003!.scope, 'runtime', 're-import: D003 scope is runtime');
377
+ assert.deepStrictEqual(d003!.choice, 'D014 pattern', 're-import: D003 choice is D014 pattern');
378
378
 
379
379
  // Verify scoped query picks up the new decision
380
380
  const m001Scoped = queryDecisions({ milestoneId: 'M001' });
381
- assertTrue(m001Scoped.length === 3, 're-import: all 3 decisions are for M001');
381
+ assert.ok(m001Scoped.length === 3, 're-import: all 3 decisions are for M001');
382
382
 
383
383
  closeDatabase();
384
- }
384
+ });
385
385
 
386
386
  // ─── Final Report ──────────────────────────────────────────────────────────
387
- report();
387
+ });
@@ -1,3 +1,5 @@
1
+ import { describe, test } from 'node:test';
2
+ import assert from 'node:assert/strict';
1
3
  import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
2
4
  import { join } from "node:path";
3
5
  import { tmpdir } from "node:os";
@@ -5,122 +7,94 @@ import { tmpdir } from "node:os";
5
7
  import { deriveState } from "../state.js";
6
8
  import { buildExistingMilestonesContext } from "../guided-flow.js";
7
9
 
8
- let passed = 0;
9
- let failed = 0;
10
-
11
- function assert(condition: boolean, message: string): void {
12
- if (condition) {
13
- passed++;
14
- } else {
15
- failed++;
16
- console.error(` FAIL: ${message}`);
17
- }
18
- }
19
-
20
- // ─── Fixture setup ──────────────────────────────────────────────────────
21
-
22
- const tmpBase = mkdtempSync(join(tmpdir(), "gsd-queue-draft-test-"));
23
- const gsd = join(tmpBase, ".gsd");
24
-
25
- // M001: has only CONTEXT-DRAFT.md (draft milestone)
26
- mkdirSync(join(gsd, "milestones", "M001"), { recursive: true });
27
- writeFileSync(
28
- join(gsd, "milestones", "M001", "M001-CONTEXT-DRAFT.md"),
29
- "# M001: Draft Milestone\n\nSeed material from prior discussion.\n",
30
- );
31
-
32
- // M002: has full CONTEXT.md (ready milestone)
33
- mkdirSync(join(gsd, "milestones", "M002"), { recursive: true });
34
- writeFileSync(
35
- join(gsd, "milestones", "M002", "M002-CONTEXT.md"),
36
- "# M002: Ready Milestone\n\nFull context from deep discussion.\n",
37
- );
38
-
39
- // M003: has both CONTEXT.md and CONTEXT-DRAFT.md (CONTEXT wins)
40
- mkdirSync(join(gsd, "milestones", "M003"), { recursive: true });
41
- writeFileSync(
42
- join(gsd, "milestones", "M003", "M003-CONTEXT.md"),
43
- "# M003: Full Context\n\nThis is the real context.\n",
44
- );
45
- writeFileSync(
46
- join(gsd, "milestones", "M003", "M003-CONTEXT-DRAFT.md"),
47
- "# M003: Draft\n\nThis should be ignored.\n",
48
- );
49
-
50
- // M004: has neither (empty milestone dir)
51
- mkdirSync(join(gsd, "milestones", "M004"), { recursive: true });
52
-
53
- // ─── Build context ──────────────────────────────────────────────────────
54
-
55
- const state = await deriveState(tmpBase);
56
- const milestoneIds = ["M001", "M002", "M003", "M004"];
57
- const context = await buildExistingMilestonesContext(tmpBase, milestoneIds, state);
58
-
59
- // ─── Test: draft-only milestone includes "Draft context available" ──────
60
-
61
- assert(
62
- context.includes("Draft context available"),
63
- "M001 (draft-only) should include 'Draft context available' label",
64
- );
65
-
66
- assert(
67
- context.includes("Seed material from prior discussion"),
68
- "M001 draft content should be included in context output",
69
- );
70
-
71
- // ─── Test: full-context milestone uses "Context:" label ────────────────
72
-
73
- assert(
74
- context.includes("**Context:**"),
75
- "M002 (full context) should use 'Context:' label",
76
- );
77
-
78
- assert(
79
- context.includes("Full context from deep discussion"),
80
- "M002 context content should be included",
81
- );
82
-
83
- // ─── Test: both files → CONTEXT.md wins, no draft label ────────────────
84
-
85
- // Find M003's section and check it has Context: but not Draft
86
- const m003Idx = context.indexOf("M003:");
87
- const m003Section = context.slice(m003Idx, m003Idx + 500);
88
-
89
- assert(
90
- m003Section.includes("**Context:**"),
91
- "M003 (both files) should use 'Context:' label (CONTEXT.md wins)",
92
- );
93
-
94
- assert(
95
- !m003Section.includes("Draft context available"),
96
- "M003 (both files) should NOT show draft label — CONTEXT.md takes precedence",
97
- );
98
-
99
- assert(
100
- m003Section.includes("This is the real context"),
101
- "M003 should show CONTEXT.md content, not draft content",
102
- );
103
-
104
- // ─── Test: neither file → no context section ───────────────────────────
105
-
106
- const m004Idx = context.indexOf("M004:");
107
- const m004Section = context.slice(m004Idx, m004Idx + 500);
108
-
109
- assert(
110
- !m004Section.includes("**Context:**"),
111
- "M004 (neither file) should not have Context: label",
112
- );
113
-
114
- assert(
115
- !m004Section.includes("Draft context available"),
116
- "M004 (neither file) should not have Draft label",
117
- );
118
-
119
- // ─── Cleanup ──────────────────────────────────────────────────────────
120
-
121
- rmSync(tmpBase, { recursive: true, force: true });
122
-
123
- // ─── Results ──────────────────────────────────────────────────────────
124
-
125
- console.log(`\nqueue-draft-detection: ${passed} passed, ${failed} failed`);
126
- if (failed > 0) process.exit(1);
10
+ describe('queue-draft-detection', () => {
11
+ test('draft and context milestone detection', async () => {
12
+ const tmpBase = mkdtempSync(join(tmpdir(), "gsd-queue-draft-test-"));
13
+ const gsd = join(tmpBase, ".gsd");
14
+
15
+ try {
16
+ // M001: has only CONTEXT-DRAFT.md (draft milestone)
17
+ mkdirSync(join(gsd, "milestones", "M001"), { recursive: true });
18
+ writeFileSync(
19
+ join(gsd, "milestones", "M001", "M001-CONTEXT-DRAFT.md"),
20
+ "# M001: Draft Milestone\n\nSeed material from prior discussion.\n",
21
+ );
22
+
23
+ // M002: has full CONTEXT.md (ready milestone)
24
+ mkdirSync(join(gsd, "milestones", "M002"), { recursive: true });
25
+ writeFileSync(
26
+ join(gsd, "milestones", "M002", "M002-CONTEXT.md"),
27
+ "# M002: Ready Milestone\n\nFull context from deep discussion.\n",
28
+ );
29
+
30
+ // M003: has both CONTEXT.md and CONTEXT-DRAFT.md (CONTEXT wins)
31
+ mkdirSync(join(gsd, "milestones", "M003"), { recursive: true });
32
+ writeFileSync(
33
+ join(gsd, "milestones", "M003", "M003-CONTEXT.md"),
34
+ "# M003: Full Context\n\nThis is the real context.\n",
35
+ );
36
+ writeFileSync(
37
+ join(gsd, "milestones", "M003", "M003-CONTEXT-DRAFT.md"),
38
+ "# M003: Draft\n\nThis should be ignored.\n",
39
+ );
40
+
41
+ // M004: has neither (empty milestone dir)
42
+ mkdirSync(join(gsd, "milestones", "M004"), { recursive: true });
43
+
44
+ // Build context
45
+ const state = await deriveState(tmpBase);
46
+ const milestoneIds = ["M001", "M002", "M003", "M004"];
47
+ const context = await buildExistingMilestonesContext(tmpBase, milestoneIds, state);
48
+
49
+ // draft-only milestone includes "Draft context available"
50
+ assert.ok(
51
+ context.includes("Draft context available"),
52
+ "M001 (draft-only) should include 'Draft context available' label",
53
+ );
54
+ assert.ok(
55
+ context.includes("Seed material from prior discussion"),
56
+ "M001 draft content should be included in context output",
57
+ );
58
+
59
+ // full-context milestone uses "Context:" label
60
+ assert.ok(
61
+ context.includes("**Context:**"),
62
+ "M002 (full context) should use 'Context:' label",
63
+ );
64
+ assert.ok(
65
+ context.includes("Full context from deep discussion"),
66
+ "M002 context content should be included",
67
+ );
68
+
69
+ // both files: CONTEXT.md wins, no draft label
70
+ const m003Idx = context.indexOf("M003:");
71
+ const m003Section = context.slice(m003Idx, m003Idx + 500);
72
+ assert.ok(
73
+ m003Section.includes("**Context:**"),
74
+ "M003 (both files) should use 'Context:' label (CONTEXT.md wins)",
75
+ );
76
+ assert.ok(
77
+ !m003Section.includes("Draft context available"),
78
+ "M003 (both files) should NOT show draft label — CONTEXT.md takes precedence",
79
+ );
80
+ assert.ok(
81
+ m003Section.includes("This is the real context"),
82
+ "M003 should show CONTEXT.md content, not draft content",
83
+ );
84
+
85
+ // neither file: no context section
86
+ const m004Idx = context.indexOf("M004:");
87
+ const m004Section = context.slice(m004Idx, m004Idx + 500);
88
+ assert.ok(
89
+ !m004Section.includes("**Context:**"),
90
+ "M004 (neither file) should not have Context: label",
91
+ );
92
+ assert.ok(
93
+ !m004Section.includes("Draft context available"),
94
+ "M004 (neither file) should not have Draft label",
95
+ );
96
+ } finally {
97
+ rmSync(tmpBase, { recursive: true, force: true });
98
+ }
99
+ });
100
+ });