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,3 +1,5 @@
1
+ import { describe, test } from 'node:test';
2
+ import assert from 'node:assert/strict';
1
3
  /**
2
4
  * doctor-git.test.ts — Integration tests for doctor git health checks.
3
5
  *
@@ -14,10 +16,6 @@ import { tmpdir } from "node:os";
14
16
  import { execSync } from "node:child_process";
15
17
 
16
18
  import { runGSDDoctor } from "../doctor.ts";
17
- import { createTestContext } from "./test-helpers.ts";
18
-
19
- const { assertEq, assertTrue, report } = createTestContext();
20
-
21
19
  function run(cmd: string, cwd: string): string {
22
20
  return execSync(cmd, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
23
21
  }
@@ -114,7 +112,7 @@ _None_
114
112
  return dir;
115
113
  }
116
114
 
117
- async function main(): Promise<void> {
115
+ describe('doctor-git', async () => {
118
116
  const cleanups: string[] = [];
119
117
 
120
118
  try {
@@ -124,8 +122,7 @@ async function main(): Promise<void> {
124
122
  // logic is correct (tested on macOS/Linux) — the test infra doesn't
125
123
  // produce matching paths on Windows CI.
126
124
  if (process.platform !== "win32") {
127
- console.log("\n=== orphaned_auto_worktree ===");
128
- {
125
+ test('orphaned_auto_worktree', async () => {
129
126
  const dir = createRepoWithCompletedMilestone();
130
127
  cleanups.push(dir);
131
128
 
@@ -135,26 +132,24 @@ async function main(): Promise<void> {
135
132
 
136
133
  const detect = await runGSDDoctor(dir, { isolationMode: "worktree" });
137
134
  const orphanIssues = detect.issues.filter(i => i.code === "orphaned_auto_worktree");
138
- assertTrue(orphanIssues.length > 0, "detects orphaned worktree");
139
- assertEq(orphanIssues[0]?.unitId, "M001", "orphaned worktree unitId is M001");
135
+ assert.ok(orphanIssues.length > 0, "detects orphaned worktree");
136
+ assert.deepStrictEqual(orphanIssues[0]?.unitId, "M001", "orphaned worktree unitId is M001");
140
137
 
141
138
  const fixed = await runGSDDoctor(dir, { fix: true, isolationMode: "worktree" });
142
- assertTrue(fixed.fixesApplied.some(f => f.includes("removed orphaned worktree")), "fix removes orphaned worktree");
139
+ assert.ok(fixed.fixesApplied.some(f => f.includes("removed orphaned worktree")), "fix removes orphaned worktree");
143
140
 
144
141
  // Verify worktree is gone
145
142
  const wtList = run("git worktree list", dir);
146
- assertTrue(!wtList.includes("milestone/M001"), "worktree no longer listed after fix");
147
- }
143
+ assert.ok(!wtList.includes("milestone/M001"), "worktree no longer listed after fix");
144
+ });
148
145
  } else {
149
- console.log("\n=== orphaned_auto_worktree (skipped on Windows) ===");
150
146
  }
151
147
 
152
148
  // ─── Test 2: Stale milestone branch detection & fix ────────────────
153
149
  // Skip on Windows: git branch glob matching and path resolution
154
150
  // behave differently in Windows temp dirs.
155
151
  if (process.platform !== "win32") {
156
- console.log("\n=== stale_milestone_branch ===");
157
- {
152
+ test('stale_milestone_branch', async () => {
158
153
  const dir = createRepoWithCompletedMilestone();
159
154
  cleanups.push(dir);
160
155
 
@@ -163,23 +158,21 @@ async function main(): Promise<void> {
163
158
 
164
159
  const detect = await runGSDDoctor(dir, { isolationMode: "worktree" });
165
160
  const staleIssues = detect.issues.filter(i => i.code === "stale_milestone_branch");
166
- assertTrue(staleIssues.length > 0, "detects stale milestone branch");
167
- assertEq(staleIssues[0]?.unitId, "M001", "stale branch unitId is M001");
161
+ assert.ok(staleIssues.length > 0, "detects stale milestone branch");
162
+ assert.deepStrictEqual(staleIssues[0]?.unitId, "M001", "stale branch unitId is M001");
168
163
 
169
164
  const fixed = await runGSDDoctor(dir, { fix: true, isolationMode: "worktree" });
170
- assertTrue(fixed.fixesApplied.some(f => f.includes("deleted stale branch")), "fix deletes stale branch");
165
+ assert.ok(fixed.fixesApplied.some(f => f.includes("deleted stale branch")), "fix deletes stale branch");
171
166
 
172
167
  // Verify branch is gone
173
168
  const branches = run("git branch --list milestone/*", dir);
174
- assertTrue(!branches.includes("milestone/M001"), "branch gone after fix");
175
- }
169
+ assert.ok(!branches.includes("milestone/M001"), "branch gone after fix");
170
+ });
176
171
  } else {
177
- console.log("\n=== stale_milestone_branch (skipped on Windows) ===");
178
172
  }
179
173
 
180
174
  // ─── Test 3: Corrupt merge state detection & fix ───────────────────
181
- console.log("\n=== corrupt_merge_state ===");
182
- {
175
+ test('corrupt_merge_state', async () => {
183
176
  const dir = createRepoWithCompletedMilestone();
184
177
  cleanups.push(dir);
185
178
 
@@ -189,18 +182,17 @@ async function main(): Promise<void> {
189
182
 
190
183
  const detect = await runGSDDoctor(dir);
191
184
  const mergeIssues = detect.issues.filter(i => i.code === "corrupt_merge_state");
192
- assertTrue(mergeIssues.length > 0, "detects corrupt merge state");
185
+ assert.ok(mergeIssues.length > 0, "detects corrupt merge state");
193
186
 
194
187
  const fixed = await runGSDDoctor(dir, { fix: true });
195
- assertTrue(fixed.fixesApplied.some(f => f.includes("cleaned merge state")), "fix cleans merge state");
188
+ assert.ok(fixed.fixesApplied.some(f => f.includes("cleaned merge state")), "fix cleans merge state");
196
189
 
197
190
  // Verify MERGE_HEAD is gone
198
- assertTrue(!existsSync(join(dir, ".git", "MERGE_HEAD")), "MERGE_HEAD removed after fix");
199
- }
191
+ assert.ok(!existsSync(join(dir, ".git", "MERGE_HEAD")), "MERGE_HEAD removed after fix");
192
+ });
200
193
 
201
194
  // ─── Test 4: Tracked runtime files detection & fix ─────────────────
202
- console.log("\n=== tracked_runtime_files ===");
203
- {
195
+ test('tracked_runtime_files', async () => {
204
196
  const dir = createRepoWithCompletedMilestone();
205
197
  cleanups.push(dir);
206
198
 
@@ -213,19 +205,18 @@ async function main(): Promise<void> {
213
205
 
214
206
  const detect = await runGSDDoctor(dir);
215
207
  const trackedIssues = detect.issues.filter(i => i.code === "tracked_runtime_files");
216
- assertTrue(trackedIssues.length > 0, "detects tracked runtime files");
208
+ assert.ok(trackedIssues.length > 0, "detects tracked runtime files");
217
209
 
218
210
  const fixed = await runGSDDoctor(dir, { fix: true });
219
- assertTrue(fixed.fixesApplied.some(f => f.includes("untracked")), "fix untracks runtime files");
211
+ assert.ok(fixed.fixesApplied.some(f => f.includes("untracked")), "fix untracks runtime files");
220
212
 
221
213
  // Verify file is no longer tracked
222
214
  const tracked = run("git ls-files .gsd/activity/", dir);
223
- assertEq(tracked, "", "runtime file untracked after fix");
224
- }
215
+ assert.deepStrictEqual(tracked, "", "runtime file untracked after fix");
216
+ });
225
217
 
226
218
  // ─── Test 5: Non-git directory — graceful degradation ──────────────
227
- console.log("\n=== non-git directory ===");
228
- {
219
+ test('non-git directory', async () => {
229
220
  const dir = realpathSync(mkdtempSync(join(tmpdir(), "doc-git-test-")));
230
221
  cleanups.push(dir);
231
222
 
@@ -236,15 +227,14 @@ async function main(): Promise<void> {
236
227
  const gitIssues = result.issues.filter(i =>
237
228
  ["orphaned_auto_worktree", "stale_milestone_branch", "corrupt_merge_state", "tracked_runtime_files"].includes(i.code)
238
229
  );
239
- assertEq(gitIssues.length, 0, "no git issues in non-git directory");
230
+ assert.deepStrictEqual(gitIssues.length, 0, "no git issues in non-git directory");
240
231
  // Should not throw — reaching here means no crash
241
- assertTrue(true, "non-git directory does not crash");
242
- }
232
+ assert.ok(true, "non-git directory does not crash");
233
+ });
243
234
 
244
235
  // ─── Test 6: Active worktree NOT flagged (false positive prevention) ─
245
236
  if (process.platform !== "win32") {
246
- console.log("\n=== active worktree safety ===");
247
- {
237
+ test('active worktree safety', async () => {
248
238
  const dir = createRepoWithActiveMilestone();
249
239
  cleanups.push(dir);
250
240
 
@@ -254,10 +244,9 @@ async function main(): Promise<void> {
254
244
 
255
245
  const detect = await runGSDDoctor(dir, { isolationMode: "worktree" });
256
246
  const orphanIssues = detect.issues.filter(i => i.code === "orphaned_auto_worktree");
257
- assertEq(orphanIssues.length, 0, "active worktree NOT flagged as orphaned");
258
- }
247
+ assert.deepStrictEqual(orphanIssues.length, 0, "active worktree NOT flagged as orphaned");
248
+ });
259
249
  } else {
260
- console.log("\n=== active worktree safety (skipped on Windows) ===");
261
250
  }
262
251
 
263
252
  // ─── Test 7: none-mode skips orphaned worktree check ───────────────
@@ -265,8 +254,7 @@ async function main(): Promise<void> {
265
254
  // at module load time from process.cwd(). We write the prefs file to
266
255
  // the test runner's cwd .gsd/preferences.md and clean up afterwards.
267
256
  if (process.platform !== "win32") {
268
- console.log("\n=== none-mode skips orphaned worktree ===");
269
- {
257
+ test('none-mode skips orphaned worktree', async () => {
270
258
  const dir = createRepoWithCompletedMilestone();
271
259
  cleanups.push(dir);
272
260
 
@@ -276,16 +264,14 @@ async function main(): Promise<void> {
276
264
 
277
265
  const result = await runGSDDoctor(dir, { isolationMode: "none" });
278
266
  const orphanIssues = result.issues.filter(i => i.code === "orphaned_auto_worktree");
279
- assertEq(orphanIssues.length, 0, "none-mode: orphaned worktree NOT detected");
280
- }
267
+ assert.deepStrictEqual(orphanIssues.length, 0, "none-mode: orphaned worktree NOT detected");
268
+ });
281
269
  } else {
282
- console.log("\n=== none-mode skips orphaned worktree (skipped on Windows) ===");
283
270
  }
284
271
 
285
272
  // ─── Test 8: none-mode skips stale branch check ────────────────────
286
273
  if (process.platform !== "win32") {
287
- console.log("\n=== none-mode skips stale branch ===");
288
- {
274
+ test('none-mode skips stale branch', async () => {
289
275
  const dir = createRepoWithCompletedMilestone();
290
276
  cleanups.push(dir);
291
277
 
@@ -294,16 +280,14 @@ async function main(): Promise<void> {
294
280
 
295
281
  const result = await runGSDDoctor(dir, { isolationMode: "none" });
296
282
  const staleIssues = result.issues.filter(i => i.code === "stale_milestone_branch");
297
- assertEq(staleIssues.length, 0, "none-mode: stale branch NOT detected");
298
- }
283
+ assert.deepStrictEqual(staleIssues.length, 0, "none-mode: stale branch NOT detected");
284
+ });
299
285
  } else {
300
- console.log("\n=== none-mode skips stale branch (skipped on Windows) ===");
301
286
  }
302
287
 
303
288
  // ─── Test: Integration branch missing ──────────────────────────────
304
289
  if (process.platform !== "win32") {
305
- console.log("\n=== integration_branch_missing ===");
306
- {
290
+ test('integration_branch_missing', async () => {
307
291
  const dir = createRepoWithActiveMilestone();
308
292
  cleanups.push(dir);
309
293
 
@@ -313,22 +297,20 @@ async function main(): Promise<void> {
313
297
 
314
298
  const detect = await runGSDDoctor(dir);
315
299
  const missingBranchIssues = detect.issues.filter(i => i.code === "integration_branch_missing");
316
- assertTrue(missingBranchIssues.length > 0, "detects missing integration branch");
317
- assertTrue(
300
+ assert.ok(missingBranchIssues.length > 0, "detects missing integration branch");
301
+ assert.ok(
318
302
  missingBranchIssues[0]?.message.includes("feat/does-not-exist"),
319
303
  "message includes the missing branch name",
320
304
  );
321
- assertEq(missingBranchIssues[0]?.fixable, true, "integration_branch_missing is auto-fixable via fallback");
322
- assertEq(missingBranchIssues[0]?.severity, "warning", "severity is warning (fallback available)");
323
- }
305
+ assert.deepStrictEqual(missingBranchIssues[0]?.fixable, true, "integration_branch_missing is auto-fixable via fallback");
306
+ assert.deepStrictEqual(missingBranchIssues[0]?.severity, "warning", "severity is warning (fallback available)");
307
+ });
324
308
  } else {
325
- console.log("\n=== integration_branch_missing (skipped on Windows) ===");
326
309
  }
327
310
 
328
311
  // ─── Test: Integration branch present — no false positive ──────────
329
312
  if (process.platform !== "win32") {
330
- console.log("\n=== integration_branch_missing (no false positive) ===");
331
- {
313
+ test('integration_branch_missing (no false positive)', async () => {
332
314
  const dir = createRepoWithActiveMilestone();
333
315
  cleanups.push(dir);
334
316
 
@@ -338,15 +320,13 @@ async function main(): Promise<void> {
338
320
 
339
321
  const detect = await runGSDDoctor(dir);
340
322
  const missingBranchIssues = detect.issues.filter(i => i.code === "integration_branch_missing");
341
- assertEq(missingBranchIssues.length, 0, "existing integration branch NOT flagged");
342
- }
323
+ assert.deepStrictEqual(missingBranchIssues.length, 0, "existing integration branch NOT flagged");
324
+ });
343
325
  } else {
344
- console.log("\n=== integration_branch_missing (no false positive — skipped on Windows) ===");
345
326
  }
346
327
 
347
328
  // ─── Test: Orphaned worktree directory ─────────────────────────────
348
- console.log("\n=== integration_branch_missing: stale metadata with detected fallback ===");
349
- {
329
+ test('integration_branch_missing: stale metadata with detected fallback', async () => {
350
330
  const dir = createRepoWithActiveMilestone();
351
331
  cleanups.push(dir);
352
332
 
@@ -355,27 +335,26 @@ async function main(): Promise<void> {
355
335
 
356
336
  const detect = await runGSDDoctor(dir);
357
337
  const missingBranchIssues = detect.issues.filter(i => i.code === "integration_branch_missing");
358
- assertEq(missingBranchIssues.length, 1, "reports one stale integration branch issue");
359
- assertEq(missingBranchIssues[0]?.severity, "warning", "stale metadata is warning when a fallback branch exists");
360
- assertEq(missingBranchIssues[0]?.fixable, true, "stale metadata becomes auto-fixable when fallback exists");
361
- assertTrue(
338
+ assert.deepStrictEqual(missingBranchIssues.length, 1, "reports one stale integration branch issue");
339
+ assert.deepStrictEqual(missingBranchIssues[0]?.severity, "warning", "stale metadata is warning when a fallback branch exists");
340
+ assert.deepStrictEqual(missingBranchIssues[0]?.fixable, true, "stale metadata becomes auto-fixable when fallback exists");
341
+ assert.ok(
362
342
  missingBranchIssues[0]?.message.includes("feat/does-not-exist") &&
363
343
  missingBranchIssues[0]?.message.includes("main"),
364
344
  "warning mentions stale recorded branch and detected fallback branch",
365
345
  );
366
346
 
367
347
  const fixed = await runGSDDoctor(dir, { fix: true });
368
- assertTrue(
348
+ assert.ok(
369
349
  fixed.fixesApplied.some(f => f.includes('updated integration branch for M001 to "main"')),
370
350
  "doctor fix rewrites stale integration branch metadata to detected fallback branch",
371
351
  );
372
352
 
373
353
  const repairedMeta = JSON.parse(readFileSync(metaPath, "utf-8"));
374
- assertEq(repairedMeta.integrationBranch, "main", "metadata rewritten to detected fallback branch");
375
- }
354
+ assert.deepStrictEqual(repairedMeta.integrationBranch, "main", "metadata rewritten to detected fallback branch");
355
+ });
376
356
 
377
- console.log("\n=== integration_branch_missing: stale metadata with configured fallback ===");
378
- {
357
+ test('integration_branch_missing: stale metadata with configured fallback', async () => {
379
358
  const dir = createRepoWithActiveMilestone();
380
359
  cleanups.push(dir);
381
360
 
@@ -390,17 +369,17 @@ async function main(): Promise<void> {
390
369
  try {
391
370
  const detect = await runGSDDoctor(dir);
392
371
  const missingBranchIssues = detect.issues.filter(i => i.code === "integration_branch_missing");
393
- assertEq(missingBranchIssues.length, 1, "configured fallback still reports one stale integration branch issue");
394
- assertEq(missingBranchIssues[0]?.severity, "warning", "configured fallback keeps stale metadata at warning severity");
395
- assertEq(missingBranchIssues[0]?.fixable, true, "configured fallback remains auto-fixable");
396
- assertTrue(
372
+ assert.deepStrictEqual(missingBranchIssues.length, 1, "configured fallback still reports one stale integration branch issue");
373
+ assert.deepStrictEqual(missingBranchIssues[0]?.severity, "warning", "configured fallback keeps stale metadata at warning severity");
374
+ assert.deepStrictEqual(missingBranchIssues[0]?.fixable, true, "configured fallback remains auto-fixable");
375
+ assert.ok(
397
376
  missingBranchIssues[0]?.message.includes("feat/does-not-exist") &&
398
377
  missingBranchIssues[0]?.message.includes("trunk"),
399
378
  "warning mentions stale recorded branch and configured fallback branch",
400
379
  );
401
380
 
402
381
  const fixed = await runGSDDoctor(dir, { fix: true });
403
- assertTrue(
382
+ assert.ok(
404
383
  fixed.fixesApplied.some(f => f.includes('updated integration branch for M001 to "trunk"')),
405
384
  "doctor fix rewrites stale metadata to configured fallback branch",
406
385
  );
@@ -409,12 +388,11 @@ async function main(): Promise<void> {
409
388
  }
410
389
 
411
390
  const repairedMeta = JSON.parse(readFileSync(metaPath, "utf-8"));
412
- assertEq(repairedMeta.integrationBranch, "trunk", "metadata rewritten to configured fallback branch");
413
- }
391
+ assert.deepStrictEqual(repairedMeta.integrationBranch, "trunk", "metadata rewritten to configured fallback branch");
392
+ });
414
393
 
415
394
  if (process.platform !== "win32") {
416
- console.log("\n=== worktree_directory_orphaned ===");
417
- {
395
+ test('worktree_directory_orphaned', async () => {
418
396
  const dir = createRepoWithActiveMilestone();
419
397
  cleanups.push(dir);
420
398
 
@@ -425,28 +403,26 @@ async function main(): Promise<void> {
425
403
 
426
404
  const detect = await runGSDDoctor(dir);
427
405
  const orphanDirIssues = detect.issues.filter(i => i.code === "worktree_directory_orphaned");
428
- assertTrue(orphanDirIssues.length > 0, "detects orphaned worktree directory");
429
- assertTrue(
406
+ assert.ok(orphanDirIssues.length > 0, "detects orphaned worktree directory");
407
+ assert.ok(
430
408
  orphanDirIssues[0]?.message.includes("orphan-feature"),
431
409
  "message includes the orphaned directory name",
432
410
  );
433
- assertTrue(orphanDirIssues[0]?.fixable === true, "worktree_directory_orphaned is fixable");
411
+ assert.ok(orphanDirIssues[0]?.fixable === true, "worktree_directory_orphaned is fixable");
434
412
 
435
413
  const fixed = await runGSDDoctor(dir, { fix: true });
436
- assertTrue(
414
+ assert.ok(
437
415
  fixed.fixesApplied.some(f => f.includes("removed orphaned worktree directory")),
438
416
  "fix removes orphaned worktree directory",
439
417
  );
440
- assertTrue(!existsSync(orphanDir), "orphaned directory removed after fix");
441
- }
418
+ assert.ok(!existsSync(orphanDir), "orphaned directory removed after fix");
419
+ });
442
420
  } else {
443
- console.log("\n=== worktree_directory_orphaned (skipped on Windows) ===");
444
421
  }
445
422
 
446
423
  // ─── Test: Registered worktree NOT flagged as orphaned ─────────────
447
424
  if (process.platform !== "win32") {
448
- console.log("\n=== worktree_directory_orphaned (registered worktree not flagged) ===");
449
- {
425
+ test('worktree_directory_orphaned (registered worktree not flagged)', async () => {
450
426
  const dir = createRepoWithActiveMilestone();
451
427
  cleanups.push(dir);
452
428
 
@@ -456,15 +432,13 @@ async function main(): Promise<void> {
456
432
 
457
433
  const detect = await runGSDDoctor(dir);
458
434
  const orphanDirIssues = detect.issues.filter(i => i.code === "worktree_directory_orphaned");
459
- assertEq(orphanDirIssues.length, 0, "registered worktree NOT flagged as orphaned");
460
- }
435
+ assert.deepStrictEqual(orphanDirIssues.length, 0, "registered worktree NOT flagged as orphaned");
436
+ });
461
437
  } else {
462
- console.log("\n=== worktree_directory_orphaned (registered worktree not flagged — skipped on Windows) ===");
463
438
  }
464
439
 
465
440
  // ─── Test 9: none-mode still detects corrupt merge state ───────────
466
- console.log("\n=== none-mode keeps corrupt merge state ===");
467
- {
441
+ test('none-mode keeps corrupt merge state', async () => {
468
442
  const dir = createRepoWithCompletedMilestone();
469
443
  cleanups.push(dir);
470
444
 
@@ -474,12 +448,11 @@ async function main(): Promise<void> {
474
448
 
475
449
  const result = await runGSDDoctor(dir, { isolationMode: "none" });
476
450
  const mergeIssues = result.issues.filter(i => i.code === "corrupt_merge_state");
477
- assertTrue(mergeIssues.length > 0, "none-mode: corrupt merge state IS detected");
478
- }
451
+ assert.ok(mergeIssues.length > 0, "none-mode: corrupt merge state IS detected");
452
+ });
479
453
 
480
454
  // ─── Test 10: none-mode still detects tracked runtime files ────────
481
- console.log("\n=== none-mode keeps tracked runtime files ===");
482
- {
455
+ test('none-mode keeps tracked runtime files', async () => {
483
456
  const dir = createRepoWithCompletedMilestone();
484
457
  cleanups.push(dir);
485
458
 
@@ -492,13 +465,12 @@ async function main(): Promise<void> {
492
465
 
493
466
  const result = await runGSDDoctor(dir, { isolationMode: "none" });
494
467
  const trackedIssues = result.issues.filter(i => i.code === "tracked_runtime_files");
495
- assertTrue(trackedIssues.length > 0, "none-mode: tracked runtime files IS detected");
496
- }
468
+ assert.ok(trackedIssues.length > 0, "none-mode: tracked runtime files IS detected");
469
+ });
497
470
 
498
471
  // ─── Test: Symlinked .gsd does not cause false orphan detection ────
499
472
  if (process.platform !== "win32") {
500
- console.log("\n=== worktree_directory_orphaned (symlinked .gsd not false-positive) ===");
501
- {
473
+ test('worktree_directory_orphaned (symlinked .gsd not false-positive)', async () => {
502
474
  const dir = createRepoWithActiveMilestone();
503
475
  cleanups.push(dir);
504
476
 
@@ -515,16 +487,14 @@ async function main(): Promise<void> {
515
487
 
516
488
  const detect = await runGSDDoctor(dir);
517
489
  const orphanDirIssues = detect.issues.filter(i => i.code === "worktree_directory_orphaned");
518
- assertEq(orphanDirIssues.length, 0, "registered worktree via symlinked .gsd NOT flagged as orphaned");
519
- }
490
+ assert.deepStrictEqual(orphanDirIssues.length, 0, "registered worktree via symlinked .gsd NOT flagged as orphaned");
491
+ });
520
492
  } else {
521
- console.log("\n=== worktree_directory_orphaned (symlinked .gsd — skipped on Windows) ===");
522
493
  }
523
494
 
524
495
  // ─── Test: worktree_branch_merged detection & fix ──────────────────
525
496
  if (process.platform !== "win32") {
526
- console.log("\n=== worktree_branch_merged ===");
527
- {
497
+ test('worktree_branch_merged', async () => {
528
498
  const dir = createRepoWithActiveMilestone();
529
499
  cleanups.push(dir);
530
500
 
@@ -541,23 +511,21 @@ async function main(): Promise<void> {
541
511
 
542
512
  const detect = await runGSDDoctor(dir);
543
513
  const mergedIssues = detect.issues.filter(i => i.code === "worktree_branch_merged");
544
- assertTrue(mergedIssues.length > 0, "detects merged worktree branch");
545
- assertTrue(mergedIssues[0]?.message.includes("safe to remove"), "message says safe to remove");
546
- assertTrue(mergedIssues[0]?.fixable === true, "merged worktree is fixable");
514
+ assert.ok(mergedIssues.length > 0, "detects merged worktree branch");
515
+ assert.ok(mergedIssues[0]?.message.includes("safe to remove"), "message says safe to remove");
516
+ assert.ok(mergedIssues[0]?.fixable === true, "merged worktree is fixable");
547
517
 
548
518
  // Fix should remove the worktree
549
519
  const fixed = await runGSDDoctor(dir, { fix: true });
550
- assertTrue(fixed.fixesApplied.some(f => f.includes("removed merged worktree")), "fix removes merged worktree");
551
- assertTrue(!existsSync(wtPath), "worktree directory removed after fix");
552
- }
520
+ assert.ok(fixed.fixesApplied.some(f => f.includes("removed merged worktree")), "fix removes merged worktree");
521
+ assert.ok(!existsSync(wtPath), "worktree directory removed after fix");
522
+ });
553
523
  } else {
554
- console.log("\n=== worktree_branch_merged (skipped on Windows) ===");
555
524
  }
556
525
 
557
526
  // ─── Test: merged milestone/* worktree removes milestone branch ────
558
527
  if (process.platform !== "win32") {
559
- console.log("\n=== worktree_branch_merged (milestone branch cleanup) ===");
560
- {
528
+ test('worktree_branch_merged (milestone branch cleanup)', async () => {
561
529
  const dir = createRepoWithActiveMilestone();
562
530
  cleanups.push(dir);
563
531
 
@@ -570,20 +538,18 @@ async function main(): Promise<void> {
570
538
  run("git merge milestone/M001 --no-edit", dir);
571
539
 
572
540
  const fixed = await runGSDDoctor(dir, { fix: true });
573
- assertTrue(fixed.fixesApplied.some(f => f.includes("removed merged worktree")), "fix removes merged milestone worktree");
574
- assertTrue(!existsSync(wtPath), "milestone worktree directory removed after fix");
541
+ assert.ok(fixed.fixesApplied.some(f => f.includes("removed merged worktree")), "fix removes merged milestone worktree");
542
+ assert.ok(!existsSync(wtPath), "milestone worktree directory removed after fix");
575
543
 
576
544
  const branches = run("git branch --list milestone/M001", dir);
577
- assertEq(branches, "", "milestone/M001 branch deleted after merged worktree cleanup");
578
- }
545
+ assert.deepStrictEqual(branches, "", "milestone/M001 branch deleted after merged worktree cleanup");
546
+ });
579
547
  } else {
580
- console.log("\n=== worktree_branch_merged (milestone branch cleanup — skipped on Windows) ===");
581
548
  }
582
549
 
583
550
  // ─── Test: worktree_branch_merged NOT flagged for unmerged worktree ─
584
551
  if (process.platform !== "win32") {
585
- console.log("\n=== worktree_branch_merged (no false positive) ===");
586
- {
552
+ test('worktree_branch_merged (no false positive)', async () => {
587
553
  const dir = createRepoWithActiveMilestone();
588
554
  cleanups.push(dir);
589
555
 
@@ -597,16 +563,14 @@ async function main(): Promise<void> {
597
563
  // Do NOT merge — branch is ahead of main
598
564
  const detect = await runGSDDoctor(dir);
599
565
  const mergedIssues = detect.issues.filter(i => i.code === "worktree_branch_merged");
600
- assertEq(mergedIssues.length, 0, "unmerged worktree NOT flagged as merged");
601
- }
566
+ assert.deepStrictEqual(mergedIssues.length, 0, "unmerged worktree NOT flagged as merged");
567
+ });
602
568
  } else {
603
- console.log("\n=== worktree_branch_merged (no false positive — skipped on Windows) ===");
604
569
  }
605
570
 
606
571
  // ─── Test: legacy_slice_branches now fixable ───────────────────────
607
572
  if (process.platform !== "win32") {
608
- console.log("\n=== legacy_slice_branches (fixable) ===");
609
- {
573
+ test('legacy_slice_branches (fixable)', async () => {
610
574
  const dir = createRepoWithActiveMilestone();
611
575
  cleanups.push(dir);
612
576
 
@@ -618,18 +582,17 @@ async function main(): Promise<void> {
618
582
 
619
583
  const detect = await runGSDDoctor(dir);
620
584
  const legacyIssues = detect.issues.filter(i => i.code === "legacy_slice_branches");
621
- assertTrue(legacyIssues.length > 0, "detects legacy slice branches");
622
- assertTrue(legacyIssues[0]?.fixable === true, "legacy branches are fixable");
585
+ assert.ok(legacyIssues.length > 0, "detects legacy slice branches");
586
+ assert.ok(legacyIssues[0]?.fixable === true, "legacy branches are fixable");
623
587
 
624
588
  const fixed = await runGSDDoctor(dir, { fix: true });
625
- assertTrue(fixed.fixesApplied.some(f => f.includes("legacy slice branch")), "fix deletes legacy branches");
589
+ assert.ok(fixed.fixesApplied.some(f => f.includes("legacy slice branch")), "fix deletes legacy branches");
626
590
 
627
591
  // Verify branches are gone
628
592
  const remaining = run("git branch --list gsd/*/*", dir);
629
- assertEq(remaining, "gsd/quick/1-fix-typo", "quick branch preserved; legacy branches removed");
630
- }
593
+ assert.deepStrictEqual(remaining, "gsd/quick/1-fix-typo", "quick branch preserved; legacy branches removed");
594
+ });
631
595
  } else {
632
- console.log("\n=== legacy_slice_branches (fixable — skipped on Windows) ===");
633
596
  }
634
597
 
635
598
  } finally {
@@ -637,8 +600,4 @@ async function main(): Promise<void> {
637
600
  try { rmSync(dir, { recursive: true, force: true }); } catch { /* ignore */ }
638
601
  }
639
602
  }
640
-
641
- report();
642
- }
643
-
644
- main();
603
+ });