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
@@ -1,15 +1,14 @@
1
1
  // GSD Extension - Override Tests
2
2
  // Tests for parseOverrides, appendOverride, loadActiveOverrides, formatOverridesSection, resolveAllOverrides
3
3
 
4
+ import { describe, test, afterEach } from 'node:test';
5
+ import assert from 'node:assert/strict';
4
6
  import { mkdtempSync, mkdirSync, readFileSync, writeFileSync, rmSync } from "node:fs";
5
7
  import { join } from "node:path";
6
8
  import { tmpdir } from "node:os";
7
- import { createTestContext } from './test-helpers.ts';
8
9
  import { parseOverrides, appendOverride, loadActiveOverrides, formatOverridesSection, resolveAllOverrides } from '../files.ts';
9
10
  import type { Override } from '../files.ts';
10
11
 
11
- const { assertEq, assertTrue, assertMatch, assertNoMatch, report } = createTestContext();
12
-
13
12
  const tempDirs: string[] = [];
14
13
 
15
14
  function makeTempDir(prefix: string): string {
@@ -26,106 +25,100 @@ function cleanup(): void {
26
25
  tempDirs.length = 0;
27
26
  }
28
27
 
29
- console.log('\n=== parseOverrides: empty content ===');
30
- { const result = parseOverrides(""); assertEq(result.length, 0, "empty content returns no overrides"); }
31
-
32
- console.log('\n=== parseOverrides: single active override ===');
33
- {
34
- const content = `# GSD Overrides\n\nUser-issued overrides that supersede plan document content.\n\n---\n\n## Override: 2026-03-14T10:00:00.000Z\n\n**Change:** Use Postgres instead of SQLite\n**Scope:** active\n**Applied-at:** M001/S02/T03\n\n---\n`;
35
- const result = parseOverrides(content);
36
- assertEq(result.length, 1, "parses one override");
37
- assertEq(result[0].timestamp, "2026-03-14T10:00:00.000Z", "correct timestamp");
38
- assertEq(result[0].change, "Use Postgres instead of SQLite", "correct change");
39
- assertEq(result[0].scope, "active", "correct scope");
40
- assertEq(result[0].appliedAt, "M001/S02/T03", "correct appliedAt");
41
- }
42
-
43
- console.log('\n=== parseOverrides: multiple overrides, mixed scopes ===');
44
- {
45
- const content = `# GSD Overrides\n\n---\n\n## Override: 2026-03-14T10:00:00.000Z\n\n**Change:** Use Postgres instead of SQLite\n**Scope:** resolved\n**Applied-at:** M001/S02/T03\n\n---\n\n## Override: 2026-03-14T11:00:00.000Z\n\n**Change:** Use JWT instead of session cookies\n**Scope:** active\n**Applied-at:** M001/S03/T01\n\n---\n`;
46
- const result = parseOverrides(content);
47
- assertEq(result.length, 2, "parses two overrides");
48
- assertEq(result[0].scope, "resolved", "first is resolved");
49
- assertEq(result[1].scope, "active", "second is active");
50
- assertEq(result[1].change, "Use JWT instead of session cookies", "second change text");
51
- }
52
-
53
- console.log('\n=== appendOverride: creates new file ===');
54
- {
55
- const tmp = makeTempDir("append-new");
56
- await appendOverride(tmp, "Use Postgres", "M001/S01/T01");
57
- const content = readFileSync(join(tmp, ".gsd", "OVERRIDES.md"), "utf-8");
58
- assertTrue(content.includes("# GSD Overrides"), "has header");
59
- assertTrue(content.includes("**Change:** Use Postgres"), "has change");
60
- assertTrue(content.includes("**Scope:** active"), "has active scope");
61
- assertTrue(content.includes("**Applied-at:** M001/S01/T01"), "has appliedAt");
62
- }
63
-
64
- console.log('\n=== appendOverride: appends to existing file ===');
65
- {
66
- const tmp = makeTempDir("append-existing");
67
- await appendOverride(tmp, "First override", "M001/S01/T01");
68
- await appendOverride(tmp, "Second override", "M001/S02/T02");
69
- const content = readFileSync(join(tmp, ".gsd", "OVERRIDES.md"), "utf-8");
70
- assertTrue(content.includes("**Change:** First override"), "has first override");
71
- assertTrue(content.includes("**Change:** Second override"), "has second override");
72
- const parsed = parseOverrides(content);
73
- assertEq(parsed.length, 2, "two overrides in file");
74
- }
75
-
76
- console.log('\n=== loadActiveOverrides: no file ===');
77
- {
78
- const tmp = makeTempDir("load-no-file");
79
- const result = await loadActiveOverrides(tmp);
80
- assertEq(result.length, 0, "returns empty when no file");
81
- }
82
-
83
- console.log('\n=== loadActiveOverrides: filters to active only ===');
84
- {
85
- const tmp = makeTempDir("load-filter");
86
- const content = `# GSD Overrides\n\n---\n\n## Override: 2026-03-14T10:00:00.000Z\n\n**Change:** Resolved change\n**Scope:** resolved\n**Applied-at:** M001/S01/T01\n\n---\n\n## Override: 2026-03-14T11:00:00.000Z\n\n**Change:** Active change\n**Scope:** active\n**Applied-at:** M001/S02/T01\n\n---\n`;
87
- writeFileSync(join(tmp, ".gsd", "OVERRIDES.md"), content, "utf-8");
88
- const result = await loadActiveOverrides(tmp);
89
- assertEq(result.length, 1, "only one active override");
90
- assertEq(result[0].change, "Active change", "correct active change");
91
- }
92
-
93
- console.log('\n=== formatOverridesSection: empty array ===');
94
- { const result = formatOverridesSection([]); assertEq(result, "", "empty overrides returns empty string"); }
95
-
96
- console.log('\n=== formatOverridesSection: formats section ===');
97
- {
98
- const overrides: Override[] = [
99
- { timestamp: "2026-03-14T10:00:00.000Z", change: "Use Postgres", scope: "active", appliedAt: "M001/S01/T01" },
100
- ];
101
- const result = formatOverridesSection(overrides);
102
- assertTrue(result.includes("## Active Overrides (supersede plan content)"), "has header");
103
- assertTrue(result.includes("**Use Postgres**"), "has change text");
104
- assertTrue(result.includes("supersede any conflicting content"), "has instruction");
105
- }
106
-
107
- console.log('\n=== resolveAllOverrides: marks all as resolved ===');
108
- {
109
- const tmp = makeTempDir("resolve-all");
110
- await appendOverride(tmp, "First", "M001/S01/T01");
111
- await appendOverride(tmp, "Second", "M001/S02/T01");
112
- let active = await loadActiveOverrides(tmp);
113
- assertEq(active.length, 2, "two active before resolve");
114
- await resolveAllOverrides(tmp);
115
- active = await loadActiveOverrides(tmp);
116
- assertEq(active.length, 0, "no active after resolve");
117
- const content = readFileSync(join(tmp, ".gsd", "OVERRIDES.md"), "utf-8");
118
- const allOverrides = parseOverrides(content);
119
- assertEq(allOverrides.length, 2, "still two overrides total");
120
- assertTrue(allOverrides.every(o => o.scope === "resolved"), "all resolved");
121
- }
122
-
123
- console.log('\n=== resolveAllOverrides: no file no error ===');
124
- {
125
- const tmp = makeTempDir("resolve-no-file");
126
- await resolveAllOverrides(tmp);
127
- assertTrue(true, "resolveAllOverrides with no file does not throw");
128
- }
129
-
130
- cleanup();
131
- report();
28
+ describe('overrides', () => {
29
+ afterEach(() => cleanup());
30
+
31
+ test('parseOverrides: empty content', () => {
32
+ const result = parseOverrides(""); assert.deepStrictEqual(result.length, 0, "empty content returns no overrides");
33
+ });
34
+
35
+ test('parseOverrides: single active override', () => {
36
+ const content = `# GSD Overrides\n\nUser-issued overrides that supersede plan document content.\n\n---\n\n## Override: 2026-03-14T10:00:00.000Z\n\n**Change:** Use Postgres instead of SQLite\n**Scope:** active\n**Applied-at:** M001/S02/T03\n\n---\n`;
37
+ const result = parseOverrides(content);
38
+ assert.deepStrictEqual(result.length, 1, "parses one override");
39
+ assert.deepStrictEqual(result[0].timestamp, "2026-03-14T10:00:00.000Z", "correct timestamp");
40
+ assert.deepStrictEqual(result[0].change, "Use Postgres instead of SQLite", "correct change");
41
+ assert.deepStrictEqual(result[0].scope, "active", "correct scope");
42
+ assert.deepStrictEqual(result[0].appliedAt, "M001/S02/T03", "correct appliedAt");
43
+ });
44
+
45
+ test('parseOverrides: multiple overrides, mixed scopes', () => {
46
+ const content = `# GSD Overrides\n\n---\n\n## Override: 2026-03-14T10:00:00.000Z\n\n**Change:** Use Postgres instead of SQLite\n**Scope:** resolved\n**Applied-at:** M001/S02/T03\n\n---\n\n## Override: 2026-03-14T11:00:00.000Z\n\n**Change:** Use JWT instead of session cookies\n**Scope:** active\n**Applied-at:** M001/S03/T01\n\n---\n`;
47
+ const result = parseOverrides(content);
48
+ assert.deepStrictEqual(result.length, 2, "parses two overrides");
49
+ assert.deepStrictEqual(result[0].scope, "resolved", "first is resolved");
50
+ assert.deepStrictEqual(result[1].scope, "active", "second is active");
51
+ assert.deepStrictEqual(result[1].change, "Use JWT instead of session cookies", "second change text");
52
+ });
53
+
54
+ test('appendOverride: creates new file', async () => {
55
+ const tmp = makeTempDir("append-new");
56
+ await appendOverride(tmp, "Use Postgres", "M001/S01/T01");
57
+ const content = readFileSync(join(tmp, ".gsd", "OVERRIDES.md"), "utf-8");
58
+ assert.ok(content.includes("# GSD Overrides"), "has header");
59
+ assert.ok(content.includes("**Change:** Use Postgres"), "has change");
60
+ assert.ok(content.includes("**Scope:** active"), "has active scope");
61
+ assert.ok(content.includes("**Applied-at:** M001/S01/T01"), "has appliedAt");
62
+ });
63
+
64
+ test('appendOverride: appends to existing file', async () => {
65
+ const tmp = makeTempDir("append-existing");
66
+ await appendOverride(tmp, "First override", "M001/S01/T01");
67
+ await appendOverride(tmp, "Second override", "M001/S02/T02");
68
+ const content = readFileSync(join(tmp, ".gsd", "OVERRIDES.md"), "utf-8");
69
+ assert.ok(content.includes("**Change:** First override"), "has first override");
70
+ assert.ok(content.includes("**Change:** Second override"), "has second override");
71
+ const parsed = parseOverrides(content);
72
+ assert.deepStrictEqual(parsed.length, 2, "two overrides in file");
73
+ });
74
+
75
+ test('loadActiveOverrides: no file', async () => {
76
+ const tmp = makeTempDir("load-no-file");
77
+ const result = await loadActiveOverrides(tmp);
78
+ assert.deepStrictEqual(result.length, 0, "returns empty when no file");
79
+ });
80
+
81
+ test('loadActiveOverrides: filters to active only', async () => {
82
+ const tmp = makeTempDir("load-filter");
83
+ const content = `# GSD Overrides\n\n---\n\n## Override: 2026-03-14T10:00:00.000Z\n\n**Change:** Resolved change\n**Scope:** resolved\n**Applied-at:** M001/S01/T01\n\n---\n\n## Override: 2026-03-14T11:00:00.000Z\n\n**Change:** Active change\n**Scope:** active\n**Applied-at:** M001/S02/T01\n\n---\n`;
84
+ writeFileSync(join(tmp, ".gsd", "OVERRIDES.md"), content, "utf-8");
85
+ const result = await loadActiveOverrides(tmp);
86
+ assert.deepStrictEqual(result.length, 1, "only one active override");
87
+ assert.deepStrictEqual(result[0].change, "Active change", "correct active change");
88
+ });
89
+
90
+ test('formatOverridesSection: empty array', () => {
91
+ const result = formatOverridesSection([]); assert.deepStrictEqual(result, "", "empty overrides returns empty string");
92
+ });
93
+
94
+ test('formatOverridesSection: formats section', () => {
95
+ const overrides: Override[] = [
96
+ { timestamp: "2026-03-14T10:00:00.000Z", change: "Use Postgres", scope: "active", appliedAt: "M001/S01/T01" },
97
+ ];
98
+ const result = formatOverridesSection(overrides);
99
+ assert.ok(result.includes("## Active Overrides (supersede plan content)"), "has header");
100
+ assert.ok(result.includes("**Use Postgres**"), "has change text");
101
+ assert.ok(result.includes("supersede any conflicting content"), "has instruction");
102
+ });
103
+
104
+ test('resolveAllOverrides: marks all as resolved', async () => {
105
+ const tmp = makeTempDir("resolve-all");
106
+ await appendOverride(tmp, "First", "M001/S01/T01");
107
+ await appendOverride(tmp, "Second", "M001/S02/T01");
108
+ let active = await loadActiveOverrides(tmp);
109
+ assert.deepStrictEqual(active.length, 2, "two active before resolve");
110
+ await resolveAllOverrides(tmp);
111
+ active = await loadActiveOverrides(tmp);
112
+ assert.deepStrictEqual(active.length, 0, "no active after resolve");
113
+ const content = readFileSync(join(tmp, ".gsd", "OVERRIDES.md"), "utf-8");
114
+ const allOverrides = parseOverrides(content);
115
+ assert.deepStrictEqual(allOverrides.length, 2, "still two overrides total");
116
+ assert.ok(allOverrides.every(o => o.scope === "resolved"), "all resolved");
117
+ });
118
+
119
+ test('resolveAllOverrides: no file no error', async () => {
120
+ const tmp = makeTempDir("resolve-no-file");
121
+ await resolveAllOverrides(tmp);
122
+ assert.ok(true, "resolveAllOverrides with no file does not throw");
123
+ });
124
+ });
@@ -322,7 +322,6 @@ test("budget — refreshWorkerStatuses updates worker state from disk", async ()
322
322
  const workers = getWorkerStatuses();
323
323
  assert.equal(workers.length, 1);
324
324
  assert.equal(workers[0]!.state, "paused", "worker state should be updated from disk");
325
- assert.equal(workers[0]!.completedUnits, 5, "completedUnits should be updated from disk");
326
325
  assert.equal(workers[0]!.cost, 2.5, "cost should be updated from disk");
327
326
  } finally {
328
327
  resetOrchestrator();
@@ -5,6 +5,8 @@
5
5
  * restored after a coordinator crash, with PID liveness filtering.
6
6
  */
7
7
 
8
+ import { describe, test } from 'node:test';
9
+ import assert from 'node:assert/strict';
8
10
  import {
9
11
  mkdtempSync,
10
12
  mkdirSync,
@@ -24,10 +26,6 @@ import {
24
26
  type PersistedState,
25
27
  } from "../parallel-orchestrator.ts";
26
28
  import { writeSessionStatus, readAllSessionStatuses, removeSessionStatus } from "../session-status-io.ts";
27
- import { createTestContext } from './test-helpers.ts';
28
-
29
- const { assertEq, assertTrue, report } = createTestContext();
30
-
31
29
  // ─── Helpers ──────────────────────────────────────────────────────────────────
32
30
 
33
31
  function makeTempDir(): string {
@@ -57,8 +55,9 @@ function makePersistedState(overrides: Partial<PersistedState> = {}): PersistedS
57
55
 
58
56
  // ─── Tests ────────────────────────────────────────────────────────────────────
59
57
 
60
- // Test 1: persistState writes valid JSON
61
- {
58
+
59
+ describe('parallel-crash-recovery', () => {
60
+ test('Test 1: persistState writes valid JSON', () => {
62
61
  const basePath = makeTempDir();
63
62
  try {
64
63
  // We can't call persistState directly without internal state set up,
@@ -72,7 +71,6 @@ function makePersistedState(overrides: Partial<PersistedState> = {}): PersistedS
72
71
  worktreePath: "/tmp/wt-M001",
73
72
  startedAt: Date.now(),
74
73
  state: "running",
75
- completedUnits: 3,
76
74
  cost: 0.15,
77
75
  },
78
76
  ],
@@ -82,29 +80,27 @@ function makePersistedState(overrides: Partial<PersistedState> = {}): PersistedS
82
80
 
83
81
  const raw = readFileSync(stateFilePath(basePath), "utf-8");
84
82
  const parsed = JSON.parse(raw) as PersistedState;
85
- assertEq(parsed.active, true, "persistState: active field preserved");
86
- assertEq(parsed.workers.length, 1, "persistState: worker count preserved");
87
- assertEq(parsed.workers[0].milestoneId, "M001", "persistState: milestoneId preserved");
88
- assertEq(parsed.workers[0].cost, 0.15, "persistState: cost preserved");
89
- assertEq(parsed.totalCost, 0.15, "persistState: totalCost preserved");
83
+ assert.deepStrictEqual(parsed.active, true, "persistState: active field preserved");
84
+ assert.deepStrictEqual(parsed.workers.length, 1, "persistState: worker count preserved");
85
+ assert.deepStrictEqual(parsed.workers[0].milestoneId, "M001", "persistState: milestoneId preserved");
86
+ assert.deepStrictEqual(parsed.workers[0].cost, 0.15, "persistState: cost preserved");
87
+ assert.deepStrictEqual(parsed.totalCost, 0.15, "persistState: totalCost preserved");
90
88
  } finally {
91
89
  rmSync(basePath, { recursive: true, force: true });
92
90
  }
93
- }
91
+ });
94
92
 
95
- // Test 2: restoreState returns null for missing file
96
- {
93
+ test('Test 2: restoreState returns null for missing file', () => {
97
94
  const basePath = makeTempDir();
98
95
  try {
99
96
  const result = restoreState(basePath);
100
- assertEq(result, null, "restoreState: returns null when no state file");
97
+ assert.deepStrictEqual(result, null, "restoreState: returns null when no state file");
101
98
  } finally {
102
99
  rmSync(basePath, { recursive: true, force: true });
103
100
  }
104
- }
101
+ });
105
102
 
106
- // Test 3: restoreState filters dead PIDs
107
- {
103
+ test('Test 3: restoreState filters dead PIDs', () => {
108
104
  const basePath = makeTempDir();
109
105
  try {
110
106
  // PID 99999999 is almost certainly not alive
@@ -117,7 +113,6 @@ function makePersistedState(overrides: Partial<PersistedState> = {}): PersistedS
117
113
  worktreePath: "/tmp/wt-M001",
118
114
  startedAt: Date.now(),
119
115
  state: "running",
120
- completedUnits: 0,
121
116
  cost: 0,
122
117
  },
123
118
  {
@@ -127,7 +122,6 @@ function makePersistedState(overrides: Partial<PersistedState> = {}): PersistedS
127
122
  worktreePath: "/tmp/wt-M002",
128
123
  startedAt: Date.now(),
129
124
  state: "running",
130
- completedUnits: 0,
131
125
  cost: 0,
132
126
  },
133
127
  ],
@@ -136,15 +130,14 @@ function makePersistedState(overrides: Partial<PersistedState> = {}): PersistedS
136
130
 
137
131
  const result = restoreState(basePath);
138
132
  // Both PIDs are dead, so result should be null and file should be cleaned up
139
- assertEq(result, null, "restoreState: returns null when all PIDs dead");
140
- assertTrue(!existsSync(stateFilePath(basePath)), "restoreState: cleans up state file when all dead");
133
+ assert.deepStrictEqual(result, null, "restoreState: returns null when all PIDs dead");
134
+ assert.ok(!existsSync(stateFilePath(basePath)), "restoreState: cleans up state file when all dead");
141
135
  } finally {
142
136
  rmSync(basePath, { recursive: true, force: true });
143
137
  }
144
- }
138
+ });
145
139
 
146
- // Test 4: restoreState keeps alive PIDs
147
- {
140
+ test('Test 4: restoreState keeps alive PIDs', () => {
148
141
  const basePath = makeTempDir();
149
142
  try {
150
143
  // Use current process PID (definitely alive)
@@ -157,7 +150,6 @@ function makePersistedState(overrides: Partial<PersistedState> = {}): PersistedS
157
150
  worktreePath: "/tmp/wt-M001",
158
151
  startedAt: Date.now(),
159
152
  state: "running",
160
- completedUnits: 5,
161
153
  cost: 0.25,
162
154
  },
163
155
  {
@@ -167,7 +159,6 @@ function makePersistedState(overrides: Partial<PersistedState> = {}): PersistedS
167
159
  worktreePath: "/tmp/wt-M002",
168
160
  startedAt: Date.now(),
169
161
  state: "running",
170
- completedUnits: 0,
171
162
  cost: 0,
172
163
  },
173
164
  ],
@@ -176,18 +167,16 @@ function makePersistedState(overrides: Partial<PersistedState> = {}): PersistedS
176
167
  writeStateFile(basePath, state);
177
168
 
178
169
  const result = restoreState(basePath);
179
- assertTrue(result !== null, "restoreState: returns state when alive PID exists");
180
- assertEq(result!.workers.length, 1, "restoreState: filters out dead PID");
181
- assertEq(result!.workers[0].milestoneId, "M001", "restoreState: keeps alive worker");
182
- assertEq(result!.workers[0].pid, process.pid, "restoreState: preserves PID");
183
- assertEq(result!.workers[0].completedUnits, 5, "restoreState: preserves progress");
170
+ assert.ok(result !== null, "restoreState: returns state when alive PID exists");
171
+ assert.deepStrictEqual(result!.workers.length, 1, "restoreState: filters out dead PID");
172
+ assert.deepStrictEqual(result!.workers[0].milestoneId, "M001", "restoreState: keeps alive worker");
173
+ assert.deepStrictEqual(result!.workers[0].pid, process.pid, "restoreState: preserves PID");
184
174
  } finally {
185
175
  rmSync(basePath, { recursive: true, force: true });
186
176
  }
187
- }
177
+ });
188
178
 
189
- // Test 5: restoreState skips stopped/error workers even with alive PIDs
190
- {
179
+ test('Test 5: restoreState skips stopped/error workers even with alive PIDs', () => {
191
180
  const basePath = makeTempDir();
192
181
  try {
193
182
  const state = makePersistedState({
@@ -199,7 +188,6 @@ function makePersistedState(overrides: Partial<PersistedState> = {}): PersistedS
199
188
  worktreePath: "/tmp/wt-M001",
200
189
  startedAt: Date.now(),
201
190
  state: "stopped",
202
- completedUnits: 10,
203
191
  cost: 0.50,
204
192
  },
205
193
  ],
@@ -207,14 +195,13 @@ function makePersistedState(overrides: Partial<PersistedState> = {}): PersistedS
207
195
  writeStateFile(basePath, state);
208
196
 
209
197
  const result = restoreState(basePath);
210
- assertEq(result, null, "restoreState: skips stopped workers");
198
+ assert.deepStrictEqual(result, null, "restoreState: skips stopped workers");
211
199
  } finally {
212
200
  rmSync(basePath, { recursive: true, force: true });
213
201
  }
214
- }
202
+ });
215
203
 
216
- // Test 6: orphan detection finds stale sessions
217
- {
204
+ test('Test 6: orphan detection finds stale sessions', () => {
218
205
  const basePath = makeTempDir();
219
206
  try {
220
207
  // Write a session status with a dead PID
@@ -246,7 +233,7 @@ function makePersistedState(overrides: Partial<PersistedState> = {}): PersistedS
246
233
 
247
234
  // Read all sessions — both should exist initially
248
235
  const before = readAllSessionStatuses(basePath);
249
- assertEq(before.length, 2, "orphan: both sessions exist before detection");
236
+ assert.deepStrictEqual(before.length, 2, "orphan: both sessions exist before detection");
250
237
 
251
238
  // Now simulate orphan detection logic (same as prepareParallelStart)
252
239
  const sessions = readAllSessionStatuses(basePath);
@@ -265,34 +252,33 @@ function makePersistedState(overrides: Partial<PersistedState> = {}): PersistedS
265
252
  }
266
253
  }
267
254
 
268
- assertTrue(orphans.length === 2, "orphan: detected both sessions");
255
+ assert.ok(orphans.length === 2, "orphan: detected both sessions");
269
256
  const deadOrphan = orphans.find(o => o.milestoneId === "M001");
270
- assertTrue(deadOrphan !== undefined && !deadOrphan.alive, "orphan: M001 detected as dead");
257
+ assert.ok(deadOrphan !== undefined && !deadOrphan.alive, "orphan: M001 detected as dead");
271
258
  const aliveOrphan = orphans.find(o => o.milestoneId === "M002");
272
- assertTrue(aliveOrphan !== undefined && aliveOrphan.alive, "orphan: M002 detected as alive");
259
+ assert.ok(aliveOrphan !== undefined && aliveOrphan.alive, "orphan: M002 detected as alive");
273
260
 
274
261
  // Dead session should be cleaned up
275
262
  const after = readAllSessionStatuses(basePath);
276
- assertEq(after.length, 1, "orphan: dead session cleaned up");
277
- assertEq(after[0].milestoneId, "M002", "orphan: alive session remains");
263
+ assert.deepStrictEqual(after.length, 1, "orphan: dead session cleaned up");
264
+ assert.deepStrictEqual(after[0].milestoneId, "M002", "orphan: alive session remains");
278
265
  } finally {
279
266
  rmSync(basePath, { recursive: true, force: true });
280
267
  }
281
- }
268
+ });
282
269
 
283
- // Test 7: restoreState handles corrupt JSON gracefully
284
- {
270
+ test('Test 7: restoreState handles corrupt JSON gracefully', () => {
285
271
  const basePath = makeTempDir();
286
272
  try {
287
273
  writeFileSync(stateFilePath(basePath), "{ not valid json !!!", "utf-8");
288
274
  const result = restoreState(basePath);
289
- assertEq(result, null, "restoreState: returns null for corrupt JSON");
275
+ assert.deepStrictEqual(result, null, "restoreState: returns null for corrupt JSON");
290
276
  } finally {
291
277
  rmSync(basePath, { recursive: true, force: true });
292
278
  }
293
- }
279
+ });
294
280
 
295
281
  // Clean up module state
296
282
  resetOrchestrator();
297
283
 
298
- report();
284
+ });
@@ -70,7 +70,6 @@ function makeWorker(overrides: Partial<WorkerInfo> = {}): WorkerInfo {
70
70
  worktreePath: "/tmp/test",
71
71
  startedAt: Date.now(),
72
72
  state: "stopped",
73
- completedUnits: 3,
74
73
  cost: 1.5,
75
74
  ...overrides,
76
75
  };
@@ -132,16 +131,16 @@ test("determineMergeOrder — by-completion sorts by startedAt (earliest first)"
132
131
  assert.deepEqual(order, ["M003", "M002", "M001"]);
133
132
  });
134
133
 
135
- test("determineMergeOrder — only includes stopped workers with completedUnits > 0", () => {
134
+ test("determineMergeOrder — only includes stopped workers", () => {
136
135
  const workers = [
137
- makeWorker({ milestoneId: "M001", state: "stopped", completedUnits: 3 }),
138
- makeWorker({ milestoneId: "M002", state: "running", completedUnits: 2 }),
139
- makeWorker({ milestoneId: "M003", state: "stopped", completedUnits: 0 }),
140
- makeWorker({ milestoneId: "M004", state: "error", completedUnits: 5 }),
141
- makeWorker({ milestoneId: "M005", state: "paused", completedUnits: 1 }),
136
+ makeWorker({ milestoneId: "M001", state: "stopped" }),
137
+ makeWorker({ milestoneId: "M002", state: "running" }),
138
+ makeWorker({ milestoneId: "M003", state: "stopped" }),
139
+ makeWorker({ milestoneId: "M004", state: "error" }),
140
+ makeWorker({ milestoneId: "M005", state: "paused" }),
142
141
  ];
143
142
  const order = determineMergeOrder(workers, "sequential");
144
- assert.deepEqual(order, ["M001"]);
143
+ assert.deepEqual(order, ["M001", "M003"]);
145
144
  });
146
145
 
147
146
  test("determineMergeOrder — empty workers returns empty array", () => {
@@ -297,7 +297,6 @@ describe("parallel-orchestrator: lifecycle", () => {
297
297
  worktreePath: "/tmp/wt-M001",
298
298
  startedAt: Date.now(),
299
299
  state: "running",
300
- completedUnits: 2,
301
300
  cost: 0.25,
302
301
  },
303
302
  ],
@@ -309,7 +308,6 @@ describe("parallel-orchestrator: lifecycle", () => {
309
308
  const workers = getWorkerStatuses(base);
310
309
  assert.equal(workers.length, 1);
311
310
  assert.equal(workers[0].milestoneId, "M001");
312
- assert.equal(workers[0].completedUnits, 2);
313
311
  assert.equal(isParallelActive(), true);
314
312
  } finally {
315
313
  resetOrchestrator();
@@ -416,7 +414,6 @@ describe("parallel-orchestrator: lifecycle", () => {
416
414
  const workers = getWorkerStatuses();
417
415
  assert.equal(workers.length, 1);
418
416
  assert.equal(workers[0].state, "running");
419
- assert.equal(workers[0].completedUnits, 4);
420
417
  } finally {
421
418
  resetOrchestrator();
422
419
  rmSync(base, { recursive: true, force: true });
@@ -552,7 +549,6 @@ function makeWorker(overrides: Partial<WorkerInfo> = {}): WorkerInfo {
552
549
  worktreePath: "/tmp/test-worktree",
553
550
  startedAt: Date.now() - 60_000,
554
551
  state: "stopped",
555
- completedUnits: 5,
556
552
  cost: 2.50,
557
553
  ...overrides,
558
554
  };
@@ -563,9 +559,9 @@ function makeWorker(overrides: Partial<WorkerInfo> = {}): WorkerInfo {
563
559
  describe("parallel-merge: determineMergeOrder sequential", () => {
564
560
  it("returns milestone IDs sorted alphabetically by default", () => {
565
561
  const workers = [
566
- makeWorker({ milestoneId: "M003", state: "stopped", completedUnits: 1 }),
567
- makeWorker({ milestoneId: "M001", state: "stopped", completedUnits: 2 }),
568
- makeWorker({ milestoneId: "M002", state: "stopped", completedUnits: 3 }),
562
+ makeWorker({ milestoneId: "M003", state: "stopped" }),
563
+ makeWorker({ milestoneId: "M001", state: "stopped" }),
564
+ makeWorker({ milestoneId: "M002", state: "stopped" }),
569
565
  ];
570
566
  const order = determineMergeOrder(workers, "sequential");
571
567
  assert.deepEqual(order, ["M001", "M002", "M003"]);
@@ -573,27 +569,27 @@ describe("parallel-merge: determineMergeOrder sequential", () => {
573
569
 
574
570
  it("excludes workers that are still running", () => {
575
571
  const workers = [
576
- makeWorker({ milestoneId: "M001", state: "stopped", completedUnits: 5 }),
577
- makeWorker({ milestoneId: "M002", state: "running", completedUnits: 0 }),
578
- makeWorker({ milestoneId: "M003", state: "stopped", completedUnits: 2 }),
572
+ makeWorker({ milestoneId: "M001", state: "stopped" }),
573
+ makeWorker({ milestoneId: "M002", state: "running" }),
574
+ makeWorker({ milestoneId: "M003", state: "stopped" }),
579
575
  ];
580
576
  const order = determineMergeOrder(workers, "sequential");
581
577
  assert.deepEqual(order, ["M001", "M003"]);
582
578
  });
583
579
 
584
- it("excludes workers with zero completedUnits even if stopped", () => {
580
+ it("includes all stopped workers", () => {
585
581
  const workers = [
586
- makeWorker({ milestoneId: "M001", state: "stopped", completedUnits: 0 }),
587
- makeWorker({ milestoneId: "M002", state: "stopped", completedUnits: 3 }),
582
+ makeWorker({ milestoneId: "M001", state: "stopped" }),
583
+ makeWorker({ milestoneId: "M002", state: "stopped" }),
588
584
  ];
589
585
  const order = determineMergeOrder(workers, "sequential");
590
- assert.deepEqual(order, ["M002"]);
586
+ assert.deepEqual(order, ["M001", "M002"]);
591
587
  });
592
588
 
593
589
  it("returns empty array when no workers are completed", () => {
594
590
  const workers = [
595
- makeWorker({ milestoneId: "M001", state: "running", completedUnits: 0 }),
596
- makeWorker({ milestoneId: "M002", state: "paused", completedUnits: 0 }),
591
+ makeWorker({ milestoneId: "M001", state: "running" }),
592
+ makeWorker({ milestoneId: "M002", state: "paused" }),
597
593
  ];
598
594
  const order = determineMergeOrder(workers);
599
595
  assert.deepEqual(order, []);
@@ -601,8 +597,8 @@ describe("parallel-merge: determineMergeOrder sequential", () => {
601
597
 
602
598
  it("uses sequential order as the default when no order arg provided", () => {
603
599
  const workers = [
604
- makeWorker({ milestoneId: "M002", state: "stopped", completedUnits: 1 }),
605
- makeWorker({ milestoneId: "M001", state: "stopped", completedUnits: 1 }),
600
+ makeWorker({ milestoneId: "M002", state: "stopped" }),
601
+ makeWorker({ milestoneId: "M001", state: "stopped" }),
606
602
  ];
607
603
  // Call with no second argument — should default to "sequential"
608
604
  const order = determineMergeOrder(workers);
@@ -614,9 +610,9 @@ describe("parallel-merge: determineMergeOrder by-completion", () => {
614
610
  it("returns milestones sorted by startedAt (earliest first)", () => {
615
611
  const now = Date.now();
616
612
  const workers = [
617
- makeWorker({ milestoneId: "M003", state: "stopped", completedUnits: 1, startedAt: now - 30_000 }),
618
- makeWorker({ milestoneId: "M001", state: "stopped", completedUnits: 1, startedAt: now - 90_000 }),
619
- makeWorker({ milestoneId: "M002", state: "stopped", completedUnits: 1, startedAt: now - 60_000 }),
613
+ makeWorker({ milestoneId: "M003", state: "stopped", startedAt: now - 30_000 }),
614
+ makeWorker({ milestoneId: "M001", state: "stopped", startedAt: now - 90_000 }),
615
+ makeWorker({ milestoneId: "M002", state: "stopped", startedAt: now - 60_000 }),
620
616
  ];
621
617
  const order = determineMergeOrder(workers, "by-completion");
622
618
  assert.deepEqual(order, ["M001", "M002", "M003"]);
@@ -625,9 +621,9 @@ describe("parallel-merge: determineMergeOrder by-completion", () => {
625
621
  it("excludes paused workers from by-completion order", () => {
626
622
  const now = Date.now();
627
623
  const workers = [
628
- makeWorker({ milestoneId: "M001", state: "stopped", completedUnits: 2, startedAt: now - 90_000 }),
629
- makeWorker({ milestoneId: "M002", state: "paused", completedUnits: 1, startedAt: now - 60_000 }),
630
- makeWorker({ milestoneId: "M003", state: "stopped", completedUnits: 3, startedAt: now - 30_000 }),
624
+ makeWorker({ milestoneId: "M001", state: "stopped", startedAt: now - 90_000 }),
625
+ makeWorker({ milestoneId: "M002", state: "paused", startedAt: now - 60_000 }),
626
+ makeWorker({ milestoneId: "M003", state: "stopped", startedAt: now - 30_000 }),
631
627
  ];
632
628
  const order = determineMergeOrder(workers, "by-completion");
633
629
  assert.deepEqual(order, ["M001", "M003"]);