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
@@ -2,7 +2,8 @@
2
2
  //
3
3
  // Tests registry loading, template resolution, auto-detection, and listing.
4
4
 
5
- import { createTestContext } from './test-helpers.ts';
5
+ import { test } from 'node:test';
6
+ import assert from 'node:assert/strict';
6
7
  import {
7
8
  loadRegistry,
8
9
  resolveByName,
@@ -12,7 +13,6 @@ import {
12
13
  loadWorkflowTemplate,
13
14
  } from '../workflow-templates.ts';
14
15
 
15
- const { assertEq, assertTrue, assertMatch, report } = createTestContext();
16
16
 
17
17
  // ═══════════════════════════════════════════════════════════════════════════
18
18
  // Registry Loading
@@ -22,23 +22,23 @@ console.log('\n── Registry Loading ──');
22
22
 
23
23
  {
24
24
  const registry = loadRegistry();
25
- assertTrue(registry !== null, 'Registry should load');
26
- assertEq(registry.version, 1, 'Registry version should be 1');
27
- assertTrue(Object.keys(registry.templates).length >= 8, 'Should have at least 8 templates');
25
+ assert.ok(registry !== null, 'Registry should load');
26
+ assert.deepStrictEqual(registry.version, 1, 'Registry version should be 1');
27
+ assert.ok(Object.keys(registry.templates).length >= 8, 'Should have at least 8 templates');
28
28
 
29
29
  // Verify required template keys exist
30
30
  const expectedIds = ['full-project', 'bugfix', 'small-feature', 'refactor', 'spike', 'hotfix', 'security-audit', 'dep-upgrade'];
31
31
  for (const id of expectedIds) {
32
- assertTrue(id in registry.templates, `Template "${id}" should exist in registry`);
32
+ assert.ok(id in registry.templates, `Template "${id}" should exist in registry`);
33
33
  }
34
34
 
35
35
  // Verify each template has required fields
36
36
  for (const [id, entry] of Object.entries(registry.templates)) {
37
- assertTrue(typeof entry.name === 'string' && entry.name.length > 0, `${id}: name should be non-empty string`);
38
- assertTrue(typeof entry.description === 'string' && entry.description.length > 0, `${id}: description should be non-empty`);
39
- assertTrue(typeof entry.file === 'string' && entry.file.endsWith('.md'), `${id}: file should be a .md path`);
40
- assertTrue(Array.isArray(entry.phases) && entry.phases.length > 0, `${id}: phases should be non-empty array`);
41
- assertTrue(Array.isArray(entry.triggers) && entry.triggers.length > 0, `${id}: triggers should be non-empty array`);
37
+ assert.ok(typeof entry.name === 'string' && entry.name.length > 0, `${id}: name should be non-empty string`);
38
+ assert.ok(typeof entry.description === 'string' && entry.description.length > 0, `${id}: description should be non-empty`);
39
+ assert.ok(typeof entry.file === 'string' && entry.file.endsWith('.md'), `${id}: file should be a .md path`);
40
+ assert.ok(Array.isArray(entry.phases) && entry.phases.length > 0, `${id}: phases should be non-empty array`);
41
+ assert.ok(Array.isArray(entry.triggers) && entry.triggers.length > 0, `${id}: triggers should be non-empty array`);
42
42
  }
43
43
  }
44
44
 
@@ -51,31 +51,31 @@ console.log('\n── Resolve by Name ──');
51
51
  {
52
52
  // Exact match
53
53
  const bugfix = resolveByName('bugfix');
54
- assertTrue(bugfix !== null, 'Should resolve "bugfix"');
55
- assertEq(bugfix!.id, 'bugfix', 'ID should be "bugfix"');
56
- assertEq(bugfix!.confidence, 'exact', 'Exact name should have exact confidence');
54
+ assert.ok(bugfix !== null, 'Should resolve "bugfix"');
55
+ assert.deepStrictEqual(bugfix!.id, 'bugfix', 'ID should be "bugfix"');
56
+ assert.deepStrictEqual(bugfix!.confidence, 'exact', 'Exact name should have exact confidence');
57
57
 
58
58
  // Case-insensitive name match
59
59
  const spike = resolveByName('Research Spike');
60
- assertTrue(spike !== null, 'Should resolve "Research Spike" by name');
61
- assertEq(spike!.id, 'spike', 'Should resolve to spike');
60
+ assert.ok(spike !== null, 'Should resolve "Research Spike" by name');
61
+ assert.deepStrictEqual(spike!.id, 'spike', 'Should resolve to spike');
62
62
 
63
63
  // Alias match
64
64
  const bug = resolveByName('bug');
65
- assertTrue(bug !== null, 'Should resolve "bug" alias');
66
- assertEq(bug!.id, 'bugfix', 'Alias "bug" should map to bugfix');
65
+ assert.ok(bug !== null, 'Should resolve "bug" alias');
66
+ assert.deepStrictEqual(bug!.id, 'bugfix', 'Alias "bug" should map to bugfix');
67
67
 
68
68
  const feat = resolveByName('feat');
69
- assertTrue(feat !== null, 'Should resolve "feat" alias');
70
- assertEq(feat!.id, 'small-feature', 'Alias "feat" should map to small-feature');
69
+ assert.ok(feat !== null, 'Should resolve "feat" alias');
70
+ assert.deepStrictEqual(feat!.id, 'small-feature', 'Alias "feat" should map to small-feature');
71
71
 
72
72
  const deps = resolveByName('deps');
73
- assertTrue(deps !== null, 'Should resolve "deps" alias');
74
- assertEq(deps!.id, 'dep-upgrade', 'Alias "deps" should map to dep-upgrade');
73
+ assert.ok(deps !== null, 'Should resolve "deps" alias');
74
+ assert.deepStrictEqual(deps!.id, 'dep-upgrade', 'Alias "deps" should map to dep-upgrade');
75
75
 
76
76
  // No match
77
77
  const missing = resolveByName('nonexistent-template');
78
- assertTrue(missing === null, 'Should return null for unknown template');
78
+ assert.ok(missing === null, 'Should return null for unknown template');
79
79
  }
80
80
 
81
81
  // ═══════════════════════════════════════════════════════════════════════════
@@ -87,32 +87,32 @@ console.log('\n── Auto-Detection ──');
87
87
  {
88
88
  // Should detect bugfix from "fix" keyword
89
89
  const fixMatches = autoDetect('fix the login button');
90
- assertTrue(fixMatches.length > 0, 'Should detect matches for "fix the login button"');
91
- assertTrue(fixMatches.some(m => m.id === 'bugfix'), 'Should include bugfix in matches');
90
+ assert.ok(fixMatches.length > 0, 'Should detect matches for "fix the login button"');
91
+ assert.ok(fixMatches.some(m => m.id === 'bugfix'), 'Should include bugfix in matches');
92
92
 
93
93
  // Should detect spike from "research" keyword
94
94
  const researchMatches = autoDetect('research authentication libraries');
95
- assertTrue(researchMatches.length > 0, 'Should detect matches for "research"');
96
- assertTrue(researchMatches.some(m => m.id === 'spike'), 'Should include spike in matches');
95
+ assert.ok(researchMatches.length > 0, 'Should detect matches for "research"');
96
+ assert.ok(researchMatches.some(m => m.id === 'spike'), 'Should include spike in matches');
97
97
 
98
98
  // Should detect hotfix from "urgent" keyword
99
99
  const urgentMatches = autoDetect('urgent production is down');
100
- assertTrue(urgentMatches.length > 0, 'Should detect matches for "urgent"');
101
- assertTrue(urgentMatches.some(m => m.id === 'hotfix'), 'Should include hotfix in matches');
100
+ assert.ok(urgentMatches.length > 0, 'Should detect matches for "urgent"');
101
+ assert.ok(urgentMatches.some(m => m.id === 'hotfix'), 'Should include hotfix in matches');
102
102
 
103
103
  // Should detect dep-upgrade from "upgrade" keyword
104
104
  const upgradeMatches = autoDetect('upgrade react to v19');
105
- assertTrue(upgradeMatches.length > 0, 'Should detect matches for "upgrade"');
106
- assertTrue(upgradeMatches.some(m => m.id === 'dep-upgrade'), 'Should include dep-upgrade in matches');
105
+ assert.ok(upgradeMatches.length > 0, 'Should detect matches for "upgrade"');
106
+ assert.ok(upgradeMatches.some(m => m.id === 'dep-upgrade'), 'Should include dep-upgrade in matches');
107
107
 
108
108
  // Multi-word triggers should score higher
109
109
  const projectMatches = autoDetect('create a new project from scratch');
110
110
  const projectMatch = projectMatches.find(m => m.id === 'full-project');
111
- assertTrue(projectMatch !== undefined, 'Should detect full-project for "from scratch"');
111
+ assert.ok(projectMatch !== undefined, 'Should detect full-project for "from scratch"');
112
112
 
113
113
  // Empty input should return no matches
114
114
  const emptyMatches = autoDetect('');
115
- assertEq(emptyMatches.length, 0, 'Empty input should return no matches');
115
+ assert.deepStrictEqual(emptyMatches.length, 0, 'Empty input should return no matches');
116
116
  }
117
117
 
118
118
  // ═══════════════════════════════════════════════════════════════════════════
@@ -123,11 +123,11 @@ console.log('\n── List Templates ──');
123
123
 
124
124
  {
125
125
  const output = listTemplates();
126
- assertTrue(output.includes('Workflow Templates'), 'Should have header');
127
- assertTrue(output.includes('bugfix'), 'Should list bugfix');
128
- assertTrue(output.includes('spike'), 'Should list spike');
129
- assertTrue(output.includes('hotfix'), 'Should list hotfix');
130
- assertTrue(output.includes('/gsd start'), 'Should include usage hint');
126
+ assert.ok(output.includes('Workflow Templates'), 'Should have header');
127
+ assert.ok(output.includes('bugfix'), 'Should list bugfix');
128
+ assert.ok(output.includes('spike'), 'Should list spike');
129
+ assert.ok(output.includes('hotfix'), 'Should list hotfix');
130
+ assert.ok(output.includes('/gsd start'), 'Should include usage hint');
131
131
  }
132
132
 
133
133
  // ═══════════════════════════════════════════════════════════════════════════
@@ -138,13 +138,13 @@ console.log('\n── Template Info ──');
138
138
 
139
139
  {
140
140
  const info = getTemplateInfo('bugfix');
141
- assertTrue(info !== null, 'Should return info for bugfix');
142
- assertTrue(info!.includes('Bug Fix'), 'Should include template name');
143
- assertTrue(info!.includes('triage'), 'Should include phase names');
144
- assertTrue(info!.includes('Triggers'), 'Should include triggers section');
141
+ assert.ok(info !== null, 'Should return info for bugfix');
142
+ assert.ok(info!.includes('Bug Fix'), 'Should include template name');
143
+ assert.ok(info!.includes('triage'), 'Should include phase names');
144
+ assert.ok(info!.includes('Triggers'), 'Should include triggers section');
145
145
 
146
146
  const missing = getTemplateInfo('nonexistent');
147
- assertTrue(missing === null, 'Should return null for unknown template');
147
+ assert.ok(missing === null, 'Should return null for unknown template');
148
148
  }
149
149
 
150
150
  // ═══════════════════════════════════════════════════════════════════════════
@@ -155,19 +155,17 @@ console.log('\n── Load Workflow Template ──');
155
155
 
156
156
  {
157
157
  const content = loadWorkflowTemplate('bugfix');
158
- assertTrue(content !== null, 'Should load bugfix template');
159
- assertTrue(content!.includes('Bugfix Workflow'), 'Should contain workflow title');
160
- assertTrue(content!.includes('Phase 1: Triage'), 'Should contain triage phase');
161
- assertTrue(content!.includes('Phase 4: Ship'), 'Should contain ship phase');
158
+ assert.ok(content !== null, 'Should load bugfix template');
159
+ assert.ok(content!.includes('Bugfix Workflow'), 'Should contain workflow title');
160
+ assert.ok(content!.includes('Phase 1: Triage'), 'Should contain triage phase');
161
+ assert.ok(content!.includes('Phase 4: Ship'), 'Should contain ship phase');
162
162
 
163
163
  const hotfixContent = loadWorkflowTemplate('hotfix');
164
- assertTrue(hotfixContent !== null, 'Should load hotfix template');
165
- assertTrue(hotfixContent!.includes('Hotfix Workflow'), 'Should contain hotfix title');
164
+ assert.ok(hotfixContent !== null, 'Should load hotfix template');
165
+ assert.ok(hotfixContent!.includes('Hotfix Workflow'), 'Should contain hotfix title');
166
166
 
167
167
  const missingContent = loadWorkflowTemplate('nonexistent');
168
- assertTrue(missingContent === null, 'Should return null for unknown template');
168
+ assert.ok(missingContent === null, 'Should return null for unknown template');
169
169
  }
170
170
 
171
171
  // ═══════════════════════════════════════════════════════════════════════════
172
-
173
- report();
@@ -14,12 +14,10 @@ import { join } from "node:path";
14
14
  import { tmpdir } from "node:os";
15
15
  import { execSync } from "node:child_process";
16
16
  import { describe, it, after } from "node:test";
17
+ import assert from 'node:assert/strict';
17
18
 
18
19
  import { resolveGitDir } from "../worktree-manager.ts";
19
20
  import { detectWorktreeName, captureIntegrationBranch } from "../worktree.ts";
20
- import { createTestContext } from "./test-helpers.ts";
21
-
22
- const { assertEq, assertTrue, report } = createTestContext();
23
21
 
24
22
  // ─── Helpers ──────────────────────────────────────────────────────────────
25
23
 
@@ -40,7 +38,6 @@ describe("worktree-bugfix", () => {
40
38
  const dirs: string[] = [];
41
39
  after(() => {
42
40
  for (const d of dirs) rmSync(d, { recursive: true, force: true });
43
- report();
44
41
  });
45
42
 
46
43
  it("resolveGitDir returns .git directory in normal repo", () => {
@@ -48,8 +45,8 @@ describe("worktree-bugfix", () => {
48
45
  dirs.push(repo);
49
46
  initRepo(repo);
50
47
  const gitDir = resolveGitDir(repo);
51
- assertTrue(gitDir.endsWith(".git"), "ends with .git");
52
- assertTrue(existsSync(gitDir), ".git dir exists");
48
+ assert.ok(gitDir.endsWith(".git"), "ends with .git");
49
+ assert.ok(existsSync(gitDir), ".git dir exists");
53
50
  });
54
51
 
55
52
  it("resolveGitDir follows gitdir: pointer in worktree", () => {
@@ -65,18 +62,18 @@ describe("worktree-bugfix", () => {
65
62
  writeFileSync(join(wtDir, ".git"), `gitdir: ${realGitDir}\n`);
66
63
 
67
64
  const resolved = resolveGitDir(wtDir);
68
- assertEq(resolved, realGitDir, "resolves to real git dir");
65
+ assert.deepStrictEqual(resolved, realGitDir, "resolves to real git dir");
69
66
  });
70
67
 
71
68
  it("resolveGitDir returns default when .git doesn't exist", () => {
72
69
  const noGit = mkdtempSync(join(tmpdir(), "gsd-wt-fix-"));
73
70
  dirs.push(noGit);
74
71
  const gitDir = resolveGitDir(noGit);
75
- assertTrue(gitDir.endsWith(".git"), "returns default .git path");
72
+ assert.ok(gitDir.endsWith(".git"), "returns default .git path");
76
73
  });
77
74
 
78
75
  it("detectWorktreeName returns name for worktree path", () => {
79
- assertEq(
76
+ assert.deepStrictEqual(
80
77
  detectWorktreeName("/project/.gsd/worktrees/M005"),
81
78
  "M005",
82
79
  "detects worktree name",
@@ -84,7 +81,7 @@ describe("worktree-bugfix", () => {
84
81
  });
85
82
 
86
83
  it("detectWorktreeName returns null for normal repo", () => {
87
- assertEq(
84
+ assert.deepStrictEqual(
88
85
  detectWorktreeName("/project"),
89
86
  null,
90
87
  "null for non-worktree path",
@@ -106,7 +103,7 @@ describe("worktree-bugfix", () => {
106
103
  // captureIntegrationBranch should be a no-op — no META.json written
107
104
  const metaPath = join(wtPath, ".gsd", "milestones", "M005", "M005-META.json");
108
105
  captureIntegrationBranch(wtPath, "M005");
109
- assertTrue(!existsSync(metaPath), "no META.json written in worktree");
106
+ assert.ok(!existsSync(metaPath), "no META.json written in worktree");
110
107
  });
111
108
 
112
109
  it("detectWorktreeName prevents pull in worktree context", () => {
@@ -114,7 +111,7 @@ describe("worktree-bugfix", () => {
114
111
  // the caller should skip pull/fetch operations
115
112
  const inWorktree = detectWorktreeName("/project/.gsd/worktrees/M006");
116
113
  const inNormal = detectWorktreeName("/project");
117
- assertTrue(inWorktree !== null, "worktree detected → skip pull");
118
- assertTrue(inNormal === null, "normal repo → allow pull");
114
+ assert.ok(inWorktree !== null, "worktree detected → skip pull");
115
+ assert.ok(inNormal === null, "normal repo → allow pull");
119
116
  });
120
117
  });
@@ -29,9 +29,9 @@ import {
29
29
  isDbAvailable,
30
30
  } from "../gsd-db.ts";
31
31
 
32
- import { createTestContext } from "./test-helpers.ts";
32
+ import { describe, test } from 'node:test';
33
+ import assert from 'node:assert/strict';
33
34
 
34
- const { assertEq, assertTrue, report } = createTestContext();
35
35
 
36
36
  function run(command: string, cwd: string): string {
37
37
  return execSync(command, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
@@ -49,7 +49,7 @@ function createTempRepo(): string {
49
49
  return dir;
50
50
  }
51
51
 
52
- async function main(): Promise<void> {
52
+ describe('worktree-db-integration', async () => {
53
53
  const savedCwd = process.cwd();
54
54
  const tempDirs: string[] = [];
55
55
 
@@ -82,7 +82,7 @@ async function main(): Promise<void> {
82
82
  const wtPath = createAutoWorktree(tempDir, "M004");
83
83
 
84
84
  const worktreeDbPath = join(worktreePath(tempDir, "M004"), ".gsd", "gsd.db");
85
- assertTrue(
85
+ assert.ok(
86
86
  existsSync(worktreeDbPath),
87
87
  "gsd.db exists in worktree .gsd after createAutoWorktree",
88
88
  );
@@ -107,10 +107,10 @@ async function main(): Promise<void> {
107
107
  console.error(" Unexpected throw:", err);
108
108
  }
109
109
 
110
- assertTrue(!threw, "createAutoWorktree does not throw when no source DB");
110
+ assert.ok(!threw, "createAutoWorktree does not throw when no source DB");
111
111
 
112
112
  const worktreeDbPath = join(worktreePath(tempDir, "M004"), ".gsd", "gsd.db");
113
- assertTrue(
113
+ assert.ok(
114
114
  !existsSync(worktreeDbPath),
115
115
  "gsd.db is absent in worktree when source had none",
116
116
  );
@@ -145,7 +145,7 @@ async function main(): Promise<void> {
145
145
 
146
146
  // Reconcile worktree → main
147
147
  const result = reconcileWorktreeDb(mainDbPath, worktreeDbPath);
148
- assertTrue(result.decisions >= 1, "reconcile reports at least 1 decision merged");
148
+ assert.ok(result.decisions >= 1, "reconcile reports at least 1 decision merged");
149
149
 
150
150
  // Open main DB and verify the row is present
151
151
  openDatabase(mainDbPath);
@@ -153,7 +153,7 @@ async function main(): Promise<void> {
153
153
  closeDatabase();
154
154
 
155
155
  const found = decisions.some((d) => d.id === "D-WT-001");
156
- assertTrue(found, "worktree decision D-WT-001 present in main DB after reconcile");
156
+ assert.ok(found, "worktree decision D-WT-001 present in main DB after reconcile");
157
157
  }
158
158
 
159
159
  // ─── Test 4: reconcile non-fatal when both paths nonexistent ─────
@@ -165,7 +165,7 @@ async function main(): Promise<void> {
165
165
  } catch {
166
166
  threw = true;
167
167
  }
168
- assertTrue(!threw, "reconcileWorktreeDb does not throw when worktree DB is absent");
168
+ assert.ok(!threw, "reconcileWorktreeDb does not throw when worktree DB is absent");
169
169
  }
170
170
 
171
171
  // ─── Test 5: failure path observable via stderr (diagnostic) ─────
@@ -181,10 +181,10 @@ async function main(): Promise<void> {
181
181
  closeDatabase();
182
182
 
183
183
  const result = reconcileWorktreeDb(mainDbPath, "/definitely/does/not/exist.db");
184
- assertEq(result.decisions, 0, "decisions is 0 when worktree DB absent");
185
- assertEq(result.requirements, 0, "requirements is 0 when worktree DB absent");
186
- assertEq(result.artifacts, 0, "artifacts is 0 when worktree DB absent");
187
- assertEq(result.conflicts.length, 0, "conflicts is empty when worktree DB absent");
184
+ assert.deepStrictEqual(result.decisions, 0, "decisions is 0 when worktree DB absent");
185
+ assert.deepStrictEqual(result.requirements, 0, "requirements is 0 when worktree DB absent");
186
+ assert.deepStrictEqual(result.artifacts, 0, "artifacts is 0 when worktree DB absent");
187
+ assert.deepStrictEqual(result.conflicts.length, 0, "conflicts is empty when worktree DB absent");
188
188
  }
189
189
 
190
190
  } finally {
@@ -199,8 +199,4 @@ async function main(): Promise<void> {
199
199
  }
200
200
  }
201
201
  }
202
-
203
- report();
204
- }
205
-
206
- main();
202
+ });
@@ -1,4 +1,5 @@
1
- import { createTestContext } from './test-helpers.ts';
1
+ import { test } from 'node:test';
2
+ import assert from 'node:assert/strict';
2
3
  import * as fs from 'node:fs';
3
4
  import * as path from 'node:path';
4
5
  import * as os from 'node:os';
@@ -16,7 +17,6 @@ import {
16
17
  reconcileWorktreeDb,
17
18
  } from '../gsd-db.ts';
18
19
 
19
- const { assertEq, assertTrue, report } = createTestContext();
20
20
 
21
21
  // ═══════════════════════════════════════════════════════════════════════════
22
22
  // Helpers
@@ -91,18 +91,18 @@ console.log('\n=== worktree-db: copyWorktreeDb ===');
91
91
  closeDatabase();
92
92
 
93
93
  const result = copyWorktreeDb(srcDb, destDb);
94
- assertTrue(result === true, 'copyWorktreeDb returns true on success');
95
- assertTrue(fs.existsSync(destDb), 'dest DB file exists after copy');
94
+ assert.ok(result === true, 'copyWorktreeDb returns true on success');
95
+ assert.ok(fs.existsSync(destDb), 'dest DB file exists after copy');
96
96
 
97
97
  // Open the copy and verify data is queryable
98
98
  openDatabase(destDb);
99
99
  const d = getDecisionById('D001');
100
- assertTrue(d !== null, 'decision queryable in copied DB');
101
- assertEq(d?.choice, 'node:sqlite', 'decision data preserved in copy');
100
+ assert.ok(d !== null, 'decision queryable in copied DB');
101
+ assert.deepStrictEqual(d?.choice, 'node:sqlite', 'decision data preserved in copy');
102
102
 
103
103
  const r = getRequirementById('R001');
104
- assertTrue(r !== null, 'requirement queryable in copied DB');
105
- assertEq(r?.description, 'Must store decisions', 'requirement data preserved in copy');
104
+ assert.ok(r !== null, 'requirement queryable in copied DB');
105
+ assert.deepStrictEqual(r?.description, 'Must store decisions', 'requirement data preserved in copy');
106
106
 
107
107
  cleanup(srcDir, destDir);
108
108
  }
@@ -123,9 +123,9 @@ console.log('\n=== worktree-db: copyWorktreeDb ===');
123
123
 
124
124
  copyWorktreeDb(srcDb, destDb);
125
125
 
126
- assertTrue(fs.existsSync(destDb), 'DB file copied');
127
- assertTrue(!fs.existsSync(destDb + '-wal'), 'WAL file NOT copied');
128
- assertTrue(!fs.existsSync(destDb + '-shm'), 'SHM file NOT copied');
126
+ assert.ok(fs.existsSync(destDb), 'DB file copied');
127
+ assert.ok(!fs.existsSync(destDb + '-wal'), 'WAL file NOT copied');
128
+ assert.ok(!fs.existsSync(destDb + '-shm'), 'SHM file NOT copied');
129
129
 
130
130
  cleanup(srcDir, destDir);
131
131
  }
@@ -134,7 +134,7 @@ console.log('\n=== worktree-db: copyWorktreeDb ===');
134
134
  {
135
135
  const destDir = tempDir();
136
136
  const result = copyWorktreeDb('/nonexistent/path/gsd.db', path.join(destDir, 'gsd.db'));
137
- assertEq(result, false, 'returns false for missing source');
137
+ assert.deepStrictEqual(result, false, 'returns false for missing source');
138
138
  cleanup(destDir);
139
139
  }
140
140
 
@@ -149,8 +149,8 @@ console.log('\n=== worktree-db: copyWorktreeDb ===');
149
149
  closeDatabase();
150
150
 
151
151
  const result = copyWorktreeDb(srcDb, deepDest);
152
- assertTrue(result === true, 'copyWorktreeDb succeeds with nested dest');
153
- assertTrue(fs.existsSync(deepDest), 'DB file created at deeply nested path');
152
+ assert.ok(result === true, 'copyWorktreeDb succeeds with nested dest');
153
+ assert.ok(fs.existsSync(deepDest), 'DB file created at deeply nested path');
154
154
 
155
155
  cleanup(srcDir, destDir);
156
156
  }
@@ -192,10 +192,10 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
192
192
  openDatabase(mainDb);
193
193
  const result = reconcileWorktreeDb(mainDb, wtDb);
194
194
 
195
- assertTrue(result.decisions > 0, 'decisions merged count > 0');
195
+ assert.ok(result.decisions > 0, 'decisions merged count > 0');
196
196
  const d2 = getDecisionById('D002');
197
- assertTrue(d2 !== null, 'D002 from worktree now in main');
198
- assertEq(d2?.choice, 'WAL', 'D002 data correct after merge');
197
+ assert.ok(d2 !== null, 'D002 from worktree now in main');
198
+ assert.deepStrictEqual(d2?.choice, 'WAL', 'D002 data correct after merge');
199
199
 
200
200
  cleanup(mainDir, wtDir);
201
201
  }
@@ -231,10 +231,10 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
231
231
  openDatabase(mainDb);
232
232
  const result = reconcileWorktreeDb(mainDb, wtDb);
233
233
 
234
- assertTrue(result.requirements > 0, 'requirements merged count > 0');
234
+ assert.ok(result.requirements > 0, 'requirements merged count > 0');
235
235
  const r2 = getRequirementById('R002');
236
- assertTrue(r2 !== null, 'R002 from worktree now in main');
237
- assertEq(r2?.description, 'Must be fast', 'R002 data correct after merge');
236
+ assert.ok(r2 !== null, 'R002 from worktree now in main');
237
+ assert.deepStrictEqual(r2?.description, 'Must be fast', 'R002 data correct after merge');
238
238
 
239
239
  cleanup(mainDir, wtDir);
240
240
  }
@@ -264,11 +264,11 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
264
264
  openDatabase(mainDb);
265
265
  const result = reconcileWorktreeDb(mainDb, wtDb);
266
266
 
267
- assertTrue(result.artifacts > 0, 'artifacts merged count > 0');
267
+ assert.ok(result.artifacts > 0, 'artifacts merged count > 0');
268
268
  const adapter = _getAdapter()!;
269
269
  const row = adapter.prepare('SELECT * FROM artifacts WHERE path = ?').get('docs/api.md');
270
- assertTrue(row !== null, 'artifact from worktree now in main');
271
- assertEq(row?.['artifact_type'], 'reference', 'artifact data correct after merge');
270
+ assert.ok(row !== null, 'artifact from worktree now in main');
271
+ assert.deepStrictEqual(row?.['artifact_type'], 'reference', 'artifact data correct after merge');
272
272
 
273
273
  cleanup(mainDir, wtDir);
274
274
  }
@@ -305,15 +305,15 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
305
305
  openDatabase(mainDb);
306
306
  const result = reconcileWorktreeDb(mainDb, wtDb);
307
307
 
308
- assertTrue(result.conflicts.length > 0, 'conflicts detected');
309
- assertTrue(
308
+ assert.ok(result.conflicts.length > 0, 'conflicts detected');
309
+ assert.ok(
310
310
  result.conflicts.some(c => c.includes('D001')),
311
311
  'conflict mentions D001',
312
312
  );
313
313
 
314
314
  // Worktree-wins: D001 should now have worktree's value
315
315
  const d1 = getDecisionById('D001');
316
- assertEq(d1?.choice, 'sql.js', 'worktree wins on conflict (INSERT OR REPLACE)');
316
+ assert.deepStrictEqual(d1?.choice, 'sql.js', 'worktree wins on conflict (INSERT OR REPLACE)');
317
317
 
318
318
  cleanup(mainDir, wtDir);
319
319
  }
@@ -326,10 +326,10 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
326
326
  seedMainDb(mainDb);
327
327
 
328
328
  const result = reconcileWorktreeDb(mainDb, '/nonexistent/worktree.db');
329
- assertEq(result.decisions, 0, 'no decisions merged for missing worktree DB');
330
- assertEq(result.requirements, 0, 'no requirements merged for missing worktree DB');
331
- assertEq(result.artifacts, 0, 'no artifacts merged for missing worktree DB');
332
- assertEq(result.conflicts.length, 0, 'no conflicts for missing worktree DB');
329
+ assert.deepStrictEqual(result.decisions, 0, 'no decisions merged for missing worktree DB');
330
+ assert.deepStrictEqual(result.requirements, 0, 'no requirements merged for missing worktree DB');
331
+ assert.deepStrictEqual(result.artifacts, 0, 'no artifacts merged for missing worktree DB');
332
+ assert.deepStrictEqual(result.conflicts.length, 0, 'no conflicts for missing worktree DB');
333
333
 
334
334
  cleanup(mainDir);
335
335
  }
@@ -366,9 +366,9 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
366
366
 
367
367
  openDatabase(mainDb);
368
368
  const result = reconcileWorktreeDb(mainDb, wtDb);
369
- assertTrue(result.decisions > 0, 'reconciliation works with spaces in path');
369
+ assert.ok(result.decisions > 0, 'reconciliation works with spaces in path');
370
370
  const d3 = getDecisionById('D003');
371
- assertTrue(d3 !== null, 'D003 merged from worktree with spaces in path');
371
+ assert.ok(d3 !== null, 'D003 merged from worktree with spaces in path');
372
372
 
373
373
  cleanup(baseDir);
374
374
  }
@@ -388,7 +388,7 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
388
388
  reconcileWorktreeDb(mainDb, wtDb);
389
389
 
390
390
  // Verify main DB is still fully usable after DETACH
391
- assertTrue(isDbAvailable(), 'DB still available after reconciliation');
391
+ assert.ok(isDbAvailable(), 'DB still available after reconciliation');
392
392
 
393
393
  insertDecision({
394
394
  id: 'D099',
@@ -403,8 +403,8 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
403
403
  });
404
404
 
405
405
  const d99 = getDecisionById('D099');
406
- assertTrue(d99 !== null, 'can insert and query after reconciliation');
407
- assertEq(d99?.choice, 'works', 'post-reconcile data correct');
406
+ assert.ok(d99 !== null, 'can insert and query after reconciliation');
407
+ assert.deepStrictEqual(d99?.choice, 'works', 'post-reconcile data correct');
408
408
 
409
409
  // Verify no "wt" database still attached
410
410
  const adapter = _getAdapter()!;
@@ -415,7 +415,7 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
415
415
  } catch {
416
416
  // Expected — wt should be detached
417
417
  }
418
- assertTrue(!wtAccessible, 'wt database is detached after reconciliation');
418
+ assert.ok(!wtAccessible, 'wt database is detached after reconciliation');
419
419
 
420
420
  cleanup(mainDir, wtDir);
421
421
  }
@@ -436,11 +436,10 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
436
436
  const result = reconcileWorktreeDb(mainDb, wtDb);
437
437
 
438
438
  // Should still report counts for the existing rows (INSERT OR REPLACE touches them)
439
- assertTrue(result.conflicts.length === 0, 'no conflicts when DBs are identical');
440
- assertTrue(isDbAvailable(), 'DB usable after no-change reconciliation');
439
+ assert.ok(result.conflicts.length === 0, 'no conflicts when DBs are identical');
440
+ assert.ok(isDbAvailable(), 'DB usable after no-change reconciliation');
441
441
 
442
442
  cleanup(mainDir, wtDir);
443
443
  }
444
444
 
445
445
  // ─── Final Report ──────────────────────────────────────────────────────────
446
- report();