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
@@ -12,6 +12,8 @@
12
12
  * 8. Discard milestone that has depends_on on others
13
13
  */
14
14
 
15
+ import { describe, test } from 'node:test';
16
+ import assert from 'node:assert/strict';
15
17
  import { mkdtempSync, mkdirSync, rmSync, writeFileSync, readFileSync } from 'node:fs';
16
18
  import { join } from 'node:path';
17
19
  import { tmpdir } from 'node:os';
@@ -20,16 +22,6 @@ import { deriveState, invalidateStateCache } from '../state.ts';
20
22
  import { clearPathCache } from '../paths.ts';
21
23
  import { parkMilestone, unparkMilestone, discardMilestone } from '../milestone-actions.ts';
22
24
 
23
- let passed = 0;
24
- let failed = 0;
25
-
26
- function assert(condition: boolean, message: string): void {
27
- if (condition) { passed++; } else { failed++; console.error(` FAIL: ${message}`); }
28
- }
29
- function assertEq<T>(actual: T, expected: T, message: string): void {
30
- if (JSON.stringify(actual) === JSON.stringify(expected)) { passed++; }
31
- else { failed++; console.error(` FAIL: ${message} — expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`); }
32
- }
33
25
 
34
26
  function createFixture(): string {
35
27
  const b = mkdtempSync(join(tmpdir(), 'gsd-edge-'));
@@ -61,11 +53,10 @@ function createM(b: string, mid: string, opts?: { roadmap?: boolean; summary?: b
61
53
  function clear(): void { clearPathCache(); invalidateStateCache(); }
62
54
  function cleanup(b: string): void { rmSync(b, { recursive: true, force: true }); }
63
55
 
64
- async function main(): Promise<void> {
65
-
66
56
  // ─── EDGE 1: Discard breaks depends_on → downstream is BLOCKED ────────
67
- console.log('\n=== EDGE 1: Discard breaks depends_on chain ===');
68
- {
57
+
58
+ describe('park-edge-cases', () => {
59
+ test('EDGE 1: Discard breaks depends_on chain', async () => {
69
60
  const b = createFixture();
70
61
  try {
71
62
  createM(b, 'M001', { roadmap: true, summary: true }); // complete
@@ -78,17 +69,16 @@ async function main(): Promise<void> {
78
69
 
79
70
  // M003 depends on M002 which no longer exists.
80
71
  // M002 is not in completeMilestoneIds → dep is unmet → M003 stays pending
81
- assertEq(s.registry.find(e => e.id === 'M003')?.status, 'pending', 'M003 stays pending after dep discarded');
82
- assertEq(s.phase, 'blocked', 'system is blocked (unmet dep on deleted milestone)');
83
- assert(s.blockers.length > 0, 'blockers list is not empty');
72
+ assert.deepStrictEqual(s.registry.find(e => e.id === 'M003')?.status, 'pending', 'M003 stays pending after dep discarded');
73
+ assert.deepStrictEqual(s.phase, 'blocked', 'system is blocked (unmet dep on deleted milestone)');
74
+ assert.ok(s.blockers.length > 0, 'blockers list is not empty');
84
75
  } finally {
85
76
  cleanup(b);
86
77
  }
87
- }
78
+ });
88
79
 
89
80
  // ─── EDGE 2: Park blocks depends_on chain ────────────────────────────
90
- console.log('\n=== EDGE 2: Park blocks depends_on chain ===');
91
- {
81
+ test('EDGE 2: Park blocks depends_on chain', async () => {
92
82
  const b = createFixture();
93
83
  try {
94
84
  createM(b, 'M001', { roadmap: true, summary: true });
@@ -98,17 +88,16 @@ async function main(): Promise<void> {
98
88
 
99
89
  parkMilestone(b, 'M002', 'testing');
100
90
  const s = await deriveState(b);
101
- assertEq(s.registry.find(e => e.id === 'M003')?.status, 'pending', 'M003 pending when M002 parked');
91
+ assert.deepStrictEqual(s.registry.find(e => e.id === 'M003')?.status, 'pending', 'M003 pending when M002 parked');
102
92
  // System should be blocked since M003 deps unmet and M002 is parked
103
- assert(s.activeMilestone === null, 'no active milestone (M002 parked, M003 dep-blocked)');
93
+ assert.ok(s.activeMilestone === null, 'no active milestone (M002 parked, M003 dep-blocked)');
104
94
  } finally {
105
95
  cleanup(b);
106
96
  }
107
- }
97
+ });
108
98
 
109
99
  // ─── EDGE 3: Discard active, next (no deps) activates ────────────────
110
- console.log('\n=== EDGE 3: Discard active → next activates ===');
111
- {
100
+ test('EDGE 3: Discard active → next activates', async () => {
112
101
  const b = createFixture();
113
102
  try {
114
103
  createM(b, 'M001', { roadmap: true });
@@ -117,16 +106,15 @@ async function main(): Promise<void> {
117
106
 
118
107
  discardMilestone(b, 'M001');
119
108
  const s = await deriveState(b);
120
- assertEq(s.activeMilestone?.id, 'M002', 'M002 becomes active');
121
- assert(s.phase !== 'blocked', 'not blocked');
109
+ assert.deepStrictEqual(s.activeMilestone?.id, 'M002', 'M002 becomes active');
110
+ assert.ok(s.phase !== 'blocked', 'not blocked');
122
111
  } finally {
123
112
  cleanup(b);
124
113
  }
125
- }
114
+ });
126
115
 
127
116
  // ─── EDGE 4: Park all + discard all → clean pre-planning ─────────────
128
- console.log('\n=== EDGE 4: Park all → discard all → clean state ===');
129
- {
117
+ test('EDGE 4: Park all → discard all → clean state', async () => {
130
118
  const b = createFixture();
131
119
  try {
132
120
  createM(b, 'M001', { roadmap: true });
@@ -138,30 +126,28 @@ async function main(): Promise<void> {
138
126
  discardMilestone(b, 'M001');
139
127
  discardMilestone(b, 'M002');
140
128
  const s = await deriveState(b);
141
- assertEq(s.activeMilestone, null, 'no active milestone');
142
- assertEq(s.phase, 'pre-planning', 'phase is pre-planning');
143
- assertEq(s.registry.length, 0, 'empty registry');
144
- assert(s.nextAction.includes('No milestones'), 'nextAction mentions no milestones');
129
+ assert.deepStrictEqual(s.activeMilestone, null, 'no active milestone');
130
+ assert.deepStrictEqual(s.phase, 'pre-planning', 'phase is pre-planning');
131
+ assert.deepStrictEqual(s.registry.length, 0, 'empty registry');
132
+ assert.ok(s.nextAction.includes('No milestones'), 'nextAction mentions no milestones');
145
133
  } finally {
146
134
  cleanup(b);
147
135
  }
148
- }
136
+ });
149
137
 
150
138
  // ─── EDGE 5: Discard non-existent → graceful false ───────────────────
151
- console.log('\n=== EDGE 5: Discard non-existent ===');
152
- {
139
+ test('EDGE 5: Discard non-existent', () => {
153
140
  const b = createFixture();
154
141
  try {
155
142
  const result = discardMilestone(b, 'M999');
156
- assert(!result, 'returns false for non-existent');
143
+ assert.ok(!result, 'returns false for non-existent');
157
144
  } finally {
158
145
  cleanup(b);
159
146
  }
160
- }
147
+ });
161
148
 
162
149
  // ─── EDGE 6: Queue order survives discards ───────────────────────────
163
- console.log('\n=== EDGE 6: Queue order after discard ===');
164
- {
150
+ test('EDGE 6: Queue order after discard', async () => {
165
151
  const b = createFixture();
166
152
  try {
167
153
  createM(b, 'M001', { roadmap: true });
@@ -176,24 +162,23 @@ async function main(): Promise<void> {
176
162
 
177
163
  // With custom queue order, M003 should be active first
178
164
  let s = await deriveState(b);
179
- assertEq(s.activeMilestone?.id, 'M003', 'M003 active (custom queue order)');
165
+ assert.deepStrictEqual(s.activeMilestone?.id, 'M003', 'M003 active (custom queue order)');
180
166
 
181
167
  // Discard M003 → M001 should be next per queue order
182
168
  discardMilestone(b, 'M003');
183
169
  s = await deriveState(b);
184
- assertEq(s.activeMilestone?.id, 'M001', 'M001 active after M003 discarded');
170
+ assert.deepStrictEqual(s.activeMilestone?.id, 'M001', 'M001 active after M003 discarded');
185
171
 
186
172
  // Verify queue order file was updated
187
173
  const order = JSON.parse(readFileSync(join(b, '.gsd', 'QUEUE-ORDER.json'), 'utf-8'));
188
- assert(!order.order.includes('M003'), 'M003 removed from QUEUE-ORDER.json');
174
+ assert.ok(!order.order.includes('M003'), 'M003 removed from QUEUE-ORDER.json');
189
175
  } finally {
190
176
  cleanup(b);
191
177
  }
192
- }
178
+ });
193
179
 
194
180
  // ─── EDGE 7: Discard milestone that has deps on others ───────────────
195
- console.log('\n=== EDGE 7: Discard a milestone that depends on others ===');
196
- {
181
+ test('EDGE 7: Discard a milestone that depends on others', async () => {
197
182
  const b = createFixture();
198
183
  try {
199
184
  createM(b, 'M001', { roadmap: true });
@@ -203,23 +188,22 @@ async function main(): Promise<void> {
203
188
 
204
189
  // M002 depends on M001, so M001 is active, M002 is pending
205
190
  let s = await deriveState(b);
206
- assertEq(s.activeMilestone?.id, 'M001', 'M001 is active');
207
- assertEq(s.registry.find(e => e.id === 'M002')?.status, 'pending', 'M002 pending (dep on M001)');
191
+ assert.deepStrictEqual(s.activeMilestone?.id, 'M001', 'M001 is active');
192
+ assert.deepStrictEqual(s.registry.find(e => e.id === 'M002')?.status, 'pending', 'M002 pending (dep on M001)');
208
193
 
209
194
  // Discard M002 (the one WITH deps) — should be fine, M003 becomes pending
210
195
  discardMilestone(b, 'M002');
211
196
  s = await deriveState(b);
212
- assertEq(s.activeMilestone?.id, 'M001', 'M001 still active');
213
- assert(!s.registry.some(e => e.id === 'M002'), 'M002 gone from registry');
214
- assertEq(s.registry.find(e => e.id === 'M003')?.status, 'pending', 'M003 is pending (after M001)');
197
+ assert.deepStrictEqual(s.activeMilestone?.id, 'M001', 'M001 still active');
198
+ assert.ok(!s.registry.some(e => e.id === 'M002'), 'M002 gone from registry');
199
+ assert.deepStrictEqual(s.registry.find(e => e.id === 'M003')?.status, 'pending', 'M003 is pending (after M001)');
215
200
  } finally {
216
201
  cleanup(b);
217
202
  }
218
- }
203
+ });
219
204
 
220
205
  // ─── EDGE 8: Park → Discard → state transitions ─────────────────────
221
- console.log('\n=== EDGE 8: Park then discard same milestone ===');
222
- {
206
+ test('EDGE 8: Park then discard same milestone', async () => {
223
207
  const b = createFixture();
224
208
  try {
225
209
  createM(b, 'M001', { roadmap: true });
@@ -228,22 +212,21 @@ async function main(): Promise<void> {
228
212
 
229
213
  parkMilestone(b, 'M001', 'temp');
230
214
  let s = await deriveState(b);
231
- assertEq(s.activeMilestone?.id, 'M002', 'M002 active while M001 parked');
215
+ assert.deepStrictEqual(s.activeMilestone?.id, 'M002', 'M002 active while M001 parked');
232
216
 
233
217
  // Now discard the parked milestone
234
218
  discardMilestone(b, 'M001');
235
219
  s = await deriveState(b);
236
- assertEq(s.activeMilestone?.id, 'M002', 'M002 still active');
237
- assert(!s.registry.some(e => e.id === 'M001'), 'M001 gone completely');
238
- assertEq(s.registry.length, 1, 'only M002 in registry');
220
+ assert.deepStrictEqual(s.activeMilestone?.id, 'M002', 'M002 still active');
221
+ assert.ok(!s.registry.some(e => e.id === 'M001'), 'M001 gone completely');
222
+ assert.deepStrictEqual(s.registry.length, 1, 'only M002 in registry');
239
223
  } finally {
240
224
  cleanup(b);
241
225
  }
242
- }
226
+ });
243
227
 
244
228
  // ─── EDGE 9: Complete + parked + pending coexist ─────────────────────
245
- console.log('\n=== EDGE 9: Mixed states — complete + parked + active ===');
246
- {
229
+ test('EDGE 9: Mixed states — complete + parked + active', async () => {
247
230
  const b = createFixture();
248
231
  try {
249
232
  createM(b, 'M001', { roadmap: true, summary: true }); // complete
@@ -254,23 +237,17 @@ async function main(): Promise<void> {
254
237
 
255
238
  parkMilestone(b, 'M002', 'parked');
256
239
  const s = await deriveState(b);
257
- assertEq(s.registry.find(e => e.id === 'M001')?.status, 'complete', 'M001 complete');
258
- assertEq(s.registry.find(e => e.id === 'M002')?.status, 'parked', 'M002 parked');
259
- assertEq(s.registry.find(e => e.id === 'M003')?.status, 'active', 'M003 active');
260
- assertEq(s.registry.find(e => e.id === 'M004')?.status, 'pending', 'M004 pending');
261
- assertEq(s.activeMilestone?.id, 'M003', 'M003 is the active milestone');
262
- assertEq(s.progress?.milestones.done, 1, '1 done');
263
- assertEq(s.progress?.milestones.total, 4, '4 total');
240
+ assert.deepStrictEqual(s.registry.find(e => e.id === 'M001')?.status, 'complete', 'M001 complete');
241
+ assert.deepStrictEqual(s.registry.find(e => e.id === 'M002')?.status, 'parked', 'M002 parked');
242
+ assert.deepStrictEqual(s.registry.find(e => e.id === 'M003')?.status, 'active', 'M003 active');
243
+ assert.deepStrictEqual(s.registry.find(e => e.id === 'M004')?.status, 'pending', 'M004 pending');
244
+ assert.deepStrictEqual(s.activeMilestone?.id, 'M003', 'M003 is the active milestone');
245
+ assert.deepStrictEqual(s.progress?.milestones.done, 1, '1 done');
246
+ assert.deepStrictEqual(s.progress?.milestones.total, 4, '4 total');
264
247
  } finally {
265
248
  cleanup(b);
266
249
  }
267
- }
250
+ });
268
251
 
269
- // ═══════════════════════════════════════════════════════════════════════
270
- console.log(`\n${'='.repeat(50)}`);
271
- console.log(`Results: ${passed} passed, ${failed} failed`);
272
- if (failed > 0) process.exit(1);
273
- else console.log('All edge cases passed!');
274
- }
252
+ });
275
253
 
276
- main().catch(e => { console.error(e); process.exit(1); });
@@ -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, existsSync, readFileSync } from 'node:fs';
2
4
  import { join } from 'node:path';
3
5
  import { tmpdir } from 'node:os';
@@ -6,26 +8,7 @@ import { deriveState, invalidateStateCache, getActiveMilestoneId } from '../stat
6
8
  import { clearPathCache } from '../paths.ts';
7
9
  import { parkMilestone, unparkMilestone, discardMilestone, isParked, getParkedReason } from '../milestone-actions.ts';
8
10
 
9
- let passed = 0;
10
- let failed = 0;
11
11
 
12
- function assert(condition: boolean, message: string): void {
13
- if (condition) {
14
- passed++;
15
- } else {
16
- failed++;
17
- console.error(` FAIL: ${message}`);
18
- }
19
- }
20
-
21
- function assertEq<T>(actual: T, expected: T, message: string): void {
22
- if (JSON.stringify(actual) === JSON.stringify(expected)) {
23
- passed++;
24
- } else {
25
- failed++;
26
- console.error(` FAIL: ${message} — expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`);
27
- }
28
- }
29
12
 
30
13
  // ─── Fixture Helpers ───────────────────────────────────────────────────────
31
14
 
@@ -89,30 +72,28 @@ function clearCaches(): void {
89
72
  // Tests
90
73
  // ═══════════════════════════════════════════════════════════════════════════
91
74
 
92
- async function main(): Promise<void> {
93
-
94
75
  // ─── Test 1: parkMilestone creates PARKED.md ──────────────────────────
95
- console.log('\n=== parkMilestone creates PARKED.md ===');
96
- {
76
+
77
+ describe('park-milestone', () => {
78
+ test('parkMilestone creates PARKED.md', () => {
97
79
  const base = createFixtureBase();
98
80
  try {
99
81
  createMilestone(base, 'M001', { withRoadmap: true });
100
82
  clearCaches();
101
83
 
102
84
  const success = parkMilestone(base, 'M001', 'Priority shift');
103
- assert(success, 'parkMilestone returns true');
104
- assert(isParked(base, 'M001'), 'isParked returns true after parking');
85
+ assert.ok(success, 'parkMilestone returns true');
86
+ assert.ok(isParked(base, 'M001'), 'isParked returns true after parking');
105
87
 
106
88
  const reason = getParkedReason(base, 'M001');
107
- assertEq(reason, 'Priority shift', 'reason matches');
89
+ assert.deepStrictEqual(reason, 'Priority shift', 'reason matches');
108
90
  } finally {
109
91
  cleanup(base);
110
92
  }
111
- }
93
+ });
112
94
 
113
95
  // ─── Test 2: parkMilestone is idempotent — fails if already parked ────
114
- console.log('\n=== parkMilestone fails if already parked ===');
115
- {
96
+ test('parkMilestone fails if already parked', () => {
116
97
  const base = createFixtureBase();
117
98
  try {
118
99
  createMilestone(base, 'M001', { withRoadmap: true });
@@ -120,50 +101,47 @@ async function main(): Promise<void> {
120
101
 
121
102
  parkMilestone(base, 'M001', 'First park');
122
103
  const secondPark = parkMilestone(base, 'M001', 'Second park');
123
- assert(!secondPark, 'second parkMilestone returns false');
124
- assertEq(getParkedReason(base, 'M001'), 'First park', 'reason unchanged from first park');
104
+ assert.ok(!secondPark, 'second parkMilestone returns false');
105
+ assert.deepStrictEqual(getParkedReason(base, 'M001'), 'First park', 'reason unchanged from first park');
125
106
  } finally {
126
107
  cleanup(base);
127
108
  }
128
- }
109
+ });
129
110
 
130
111
  // ─── Test 3: unparkMilestone removes PARKED.md ────────────────────────
131
- console.log('\n=== unparkMilestone removes PARKED.md ===');
132
- {
112
+ test('unparkMilestone removes PARKED.md', () => {
133
113
  const base = createFixtureBase();
134
114
  try {
135
115
  createMilestone(base, 'M001', { withRoadmap: true });
136
116
  clearCaches();
137
117
 
138
118
  parkMilestone(base, 'M001', 'Test reason');
139
- assert(isParked(base, 'M001'), 'milestone is parked');
119
+ assert.ok(isParked(base, 'M001'), 'milestone is parked');
140
120
 
141
121
  const success = unparkMilestone(base, 'M001');
142
- assert(success, 'unparkMilestone returns true');
143
- assert(!isParked(base, 'M001'), 'isParked returns false after unpark');
122
+ assert.ok(success, 'unparkMilestone returns true');
123
+ assert.ok(!isParked(base, 'M001'), 'isParked returns false after unpark');
144
124
  } finally {
145
125
  cleanup(base);
146
126
  }
147
- }
127
+ });
148
128
 
149
129
  // ─── Test 4: unparkMilestone fails if not parked ──────────────────────
150
- console.log('\n=== unparkMilestone fails if not parked ===');
151
- {
130
+ test('unparkMilestone fails if not parked', () => {
152
131
  const base = createFixtureBase();
153
132
  try {
154
133
  createMilestone(base, 'M001', { withRoadmap: true });
155
134
  clearCaches();
156
135
 
157
136
  const result = unparkMilestone(base, 'M001');
158
- assert(!result, 'unparkMilestone returns false when not parked');
137
+ assert.ok(!result, 'unparkMilestone returns false when not parked');
159
138
  } finally {
160
139
  cleanup(base);
161
140
  }
162
- }
141
+ });
163
142
 
164
143
  // ─── Test 5: deriveState returns 'parked' status ──────────────────────
165
- console.log('\n=== deriveState returns parked status ===');
166
- {
144
+ test('deriveState returns parked status', async () => {
167
145
  const base = createFixtureBase();
168
146
  try {
169
147
  createMilestone(base, 'M001', { withRoadmap: true });
@@ -173,16 +151,15 @@ async function main(): Promise<void> {
173
151
 
174
152
  const state = await deriveState(base);
175
153
  const entry = state.registry.find(e => e.id === 'M001');
176
- assert(!!entry, 'M001 in registry');
177
- assertEq(entry?.status, 'parked', 'status is parked');
154
+ assert.ok(!!entry, 'M001 in registry');
155
+ assert.deepStrictEqual(entry?.status, 'parked', 'status is parked');
178
156
  } finally {
179
157
  cleanup(base);
180
158
  }
181
- }
159
+ });
182
160
 
183
161
  // ─── Test 6: deriveState skips parked milestone for active ─────────────
184
- console.log('\n=== deriveState skips parked milestone ===');
185
- {
162
+ test('deriveState skips parked milestone', async () => {
186
163
  const base = createFixtureBase();
187
164
  try {
188
165
  createMilestone(base, 'M001', { withRoadmap: true });
@@ -191,29 +168,28 @@ async function main(): Promise<void> {
191
168
 
192
169
  // Before park: M001 is active
193
170
  const stateBefore = await deriveState(base);
194
- assertEq(stateBefore.activeMilestone?.id, 'M001', 'before park: M001 is active');
171
+ assert.deepStrictEqual(stateBefore.activeMilestone?.id, 'M001', 'before park: M001 is active');
195
172
 
196
173
  parkMilestone(base, 'M001', 'Testing');
197
174
 
198
175
  // After park: M002 becomes active
199
176
  const stateAfter = await deriveState(base);
200
- assertEq(stateAfter.activeMilestone?.id, 'M002', 'after park: M002 is active');
177
+ assert.deepStrictEqual(stateAfter.activeMilestone?.id, 'M002', 'after park: M002 is active');
201
178
 
202
179
  // M001 still in registry as parked
203
180
  const m001 = stateAfter.registry.find(e => e.id === 'M001');
204
- assertEq(m001?.status, 'parked', 'M001 has parked status');
181
+ assert.deepStrictEqual(m001?.status, 'parked', 'M001 has parked status');
205
182
 
206
183
  // M002 is active
207
184
  const m002 = stateAfter.registry.find(e => e.id === 'M002');
208
- assertEq(m002?.status, 'active', 'M002 has active status');
185
+ assert.deepStrictEqual(m002?.status, 'active', 'M002 has active status');
209
186
  } finally {
210
187
  cleanup(base);
211
188
  }
212
- }
189
+ });
213
190
 
214
191
  // ─── Test 7: getActiveMilestoneId skips parked ────────────────────────
215
- console.log('\n=== getActiveMilestoneId skips parked ===');
216
- {
192
+ test('getActiveMilestoneId skips parked', async () => {
217
193
  const base = createFixtureBase();
218
194
  try {
219
195
  createMilestone(base, 'M001', { withRoadmap: true });
@@ -223,15 +199,14 @@ async function main(): Promise<void> {
223
199
  parkMilestone(base, 'M001', 'Testing');
224
200
 
225
201
  const activeId = await getActiveMilestoneId(base);
226
- assertEq(activeId, 'M002', 'getActiveMilestoneId returns M002');
202
+ assert.deepStrictEqual(activeId, 'M002', 'getActiveMilestoneId returns M002');
227
203
  } finally {
228
204
  cleanup(base);
229
205
  }
230
- }
206
+ });
231
207
 
232
208
  // ─── Test 8: Parked milestone does NOT satisfy depends_on ─────────────
233
- console.log('\n=== Parked milestone does not satisfy depends_on ===');
234
- {
209
+ test('Parked milestone does not satisfy depends_on', async () => {
235
210
  const base = createFixtureBase();
236
211
  try {
237
212
  createMilestone(base, 'M001', { withRoadmap: true });
@@ -243,18 +218,17 @@ async function main(): Promise<void> {
243
218
  const state = await deriveState(base);
244
219
  // M001 is parked, M002 depends on M001 → M002 should be pending, not active
245
220
  const m002 = state.registry.find(e => e.id === 'M002');
246
- assertEq(m002?.status, 'pending', 'M002 stays pending when M001 is parked');
221
+ assert.deepStrictEqual(m002?.status, 'pending', 'M002 stays pending when M001 is parked');
247
222
 
248
223
  // No active milestone (both are blocked/parked)
249
- assertEq(state.activeMilestone, null, 'no active milestone');
224
+ assert.deepStrictEqual(state.activeMilestone, null, 'no active milestone');
250
225
  } finally {
251
226
  cleanup(base);
252
227
  }
253
- }
228
+ });
254
229
 
255
230
  // ─── Test 9: Park then unpark restores correct status ─────────────────
256
- console.log('\n=== Park then unpark restores status ===');
257
- {
231
+ test('Park then unpark restores status', async () => {
258
232
  const base = createFixtureBase();
259
233
  try {
260
234
  createMilestone(base, 'M001', { withRoadmap: true });
@@ -264,43 +238,41 @@ async function main(): Promise<void> {
264
238
  // Park M001
265
239
  parkMilestone(base, 'M001', 'Testing');
266
240
  const stateParked = await deriveState(base);
267
- assertEq(stateParked.activeMilestone?.id, 'M002', 'while parked: M002 is active');
241
+ assert.deepStrictEqual(stateParked.activeMilestone?.id, 'M002', 'while parked: M002 is active');
268
242
 
269
243
  // Unpark M001 — M001 should become active again (it's first in queue)
270
244
  unparkMilestone(base, 'M001');
271
245
  const stateUnparked = await deriveState(base);
272
- assertEq(stateUnparked.activeMilestone?.id, 'M001', 'after unpark: M001 is active again');
273
- assertEq(stateUnparked.registry.find(e => e.id === 'M001')?.status, 'active', 'M001 is active status');
246
+ assert.deepStrictEqual(stateUnparked.activeMilestone?.id, 'M001', 'after unpark: M001 is active again');
247
+ assert.deepStrictEqual(stateUnparked.registry.find(e => e.id === 'M001')?.status, 'active', 'M001 is active status');
274
248
  } finally {
275
249
  cleanup(base);
276
250
  }
277
- }
251
+ });
278
252
 
279
253
  // ─── Test 10: discardMilestone removes directory ──────────────────────
280
- console.log('\n=== discardMilestone removes directory ===');
281
- {
254
+ test('discardMilestone removes directory', async () => {
282
255
  const base = createFixtureBase();
283
256
  try {
284
257
  createMilestone(base, 'M001', { withRoadmap: true });
285
258
  clearCaches();
286
259
 
287
260
  const mDir = join(base, '.gsd', 'milestones', 'M001');
288
- assert(existsSync(mDir), 'milestone dir exists before discard');
261
+ assert.ok(existsSync(mDir), 'milestone dir exists before discard');
289
262
 
290
263
  const success = discardMilestone(base, 'M001');
291
- assert(success, 'discardMilestone returns true');
292
- assert(!existsSync(mDir), 'milestone dir removed after discard');
264
+ assert.ok(success, 'discardMilestone returns true');
265
+ assert.ok(!existsSync(mDir), 'milestone dir removed after discard');
293
266
 
294
267
  const state = await deriveState(base);
295
- assert(!state.registry.some(e => e.id === 'M001'), 'M001 not in registry after discard');
268
+ assert.ok(!state.registry.some(e => e.id === 'M001'), 'M001 not in registry after discard');
296
269
  } finally {
297
270
  cleanup(base);
298
271
  }
299
- }
272
+ });
300
273
 
301
274
  // ─── Test 11: discardMilestone updates queue order ────────────────────
302
- console.log('\n=== discardMilestone updates queue order ===');
303
- {
275
+ test('discardMilestone updates queue order', () => {
304
276
  const base = createFixtureBase();
305
277
  try {
306
278
  createMilestone(base, 'M001', { withRoadmap: true });
@@ -315,16 +287,15 @@ async function main(): Promise<void> {
315
287
 
316
288
  // Queue order should no longer include M001
317
289
  const queueContent = JSON.parse(readFileSync(queuePath, 'utf-8'));
318
- assert(!queueContent.order.includes('M001'), 'M001 removed from queue order');
319
- assert(queueContent.order.includes('M002'), 'M002 still in queue order');
290
+ assert.ok(!queueContent.order.includes('M001'), 'M001 removed from queue order');
291
+ assert.ok(queueContent.order.includes('M002'), 'M002 still in queue order');
320
292
  } finally {
321
293
  cleanup(base);
322
294
  }
323
- }
295
+ });
324
296
 
325
297
  // ─── Test 12: All milestones parked → no active milestone ─────────────
326
- console.log('\n=== All milestones parked → no active ===');
327
- {
298
+ test('All milestones parked → no active', async () => {
328
299
  const base = createFixtureBase();
329
300
  try {
330
301
  createMilestone(base, 'M001', { withRoadmap: true });
@@ -333,18 +304,17 @@ async function main(): Promise<void> {
333
304
  parkMilestone(base, 'M001', 'Testing');
334
305
 
335
306
  const state = await deriveState(base);
336
- assertEq(state.activeMilestone, null, 'no active milestone when all parked');
337
- assertEq(state.phase, 'pre-planning', 'phase is pre-planning');
338
- assert(state.registry.length === 1, 'registry still has 1 entry');
339
- assertEq(state.registry[0]?.status, 'parked', 'entry is parked');
307
+ assert.deepStrictEqual(state.activeMilestone, null, 'no active milestone when all parked');
308
+ assert.deepStrictEqual(state.phase, 'pre-planning', 'phase is pre-planning');
309
+ assert.ok(state.registry.length === 1, 'registry still has 1 entry');
310
+ assert.deepStrictEqual(state.registry[0]?.status, 'parked', 'entry is parked');
340
311
  } finally {
341
312
  cleanup(base);
342
313
  }
343
- }
314
+ });
344
315
 
345
316
  // ─── Test 13: Parked milestone without roadmap ────────────────────────
346
- console.log('\n=== Park milestone without roadmap ===');
347
- {
317
+ test('Park milestone without roadmap', async () => {
348
318
  const base = createFixtureBase();
349
319
  try {
350
320
  createMilestone(base, 'M001'); // No roadmap
@@ -354,16 +324,15 @@ async function main(): Promise<void> {
354
324
  parkMilestone(base, 'M001', 'Not ready yet');
355
325
 
356
326
  const state = await deriveState(base);
357
- assertEq(state.activeMilestone?.id, 'M002', 'M002 is active when M001 (no roadmap) is parked');
358
- assertEq(state.registry.find(e => e.id === 'M001')?.status, 'parked', 'M001 is parked');
327
+ assert.deepStrictEqual(state.activeMilestone?.id, 'M002', 'M002 is active when M001 (no roadmap) is parked');
328
+ assert.deepStrictEqual(state.registry.find(e => e.id === 'M001')?.status, 'parked', 'M001 is parked');
359
329
  } finally {
360
330
  cleanup(base);
361
331
  }
362
- }
332
+ });
363
333
 
364
334
  // ─── Test 14: Progress counts with parked milestone ───────────────────
365
- console.log('\n=== Progress counts with parked ===');
366
- {
335
+ test('Progress counts with parked', async () => {
367
336
  const base = createFixtureBase();
368
337
  try {
369
338
  createMilestone(base, 'M001', { withRoadmap: true, withSummary: true }); // complete
@@ -374,28 +343,12 @@ async function main(): Promise<void> {
374
343
  parkMilestone(base, 'M002', 'Parked');
375
344
 
376
345
  const state = await deriveState(base);
377
- assertEq(state.progress?.milestones.done, 1, '1 complete milestone');
378
- assertEq(state.progress?.milestones.total, 3, '3 total milestones (including parked)');
379
- assertEq(state.activeMilestone?.id, 'M003', 'M003 is active');
346
+ assert.deepStrictEqual(state.progress?.milestones.done, 1, '1 complete milestone');
347
+ assert.deepStrictEqual(state.progress?.milestones.total, 3, '3 total milestones (including parked)');
348
+ assert.deepStrictEqual(state.activeMilestone?.id, 'M003', 'M003 is active');
380
349
  } finally {
381
350
  cleanup(base);
382
351
  }
383
- }
384
-
385
- // ═══════════════════════════════════════════════════════════════════════════
386
- // Results
387
- // ═══════════════════════════════════════════════════════════════════════════
388
-
389
- console.log(`\n${'='.repeat(40)}`);
390
- console.log(`Results: ${passed} passed, ${failed} failed`);
391
- if (failed > 0) {
392
- process.exit(1);
393
- } else {
394
- console.log('All tests passed ✓');
395
- }
396
- }
352
+ });
397
353
 
398
- main().catch((error) => {
399
- console.error(error);
400
- process.exit(1);
401
354
  });