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
@@ -0,0 +1,103 @@
1
+ import test, { describe } from "node:test";
2
+ import assert from "node:assert/strict";
3
+
4
+ import {
5
+ formatMcpStatusReport,
6
+ formatMcpServerDetail,
7
+ type McpServerStatus,
8
+ } from "../commands-mcp-status.ts";
9
+
10
+ // ─── formatMcpStatusReport ──────────────────────────────────────────────────
11
+
12
+ describe("formatMcpStatusReport", () => {
13
+ test("returns no-servers message when list is empty", () => {
14
+ const result = formatMcpStatusReport([]);
15
+ assert.match(result, /no mcp servers configured/i);
16
+ });
17
+
18
+ test("lists all servers with connection status", () => {
19
+ const servers: McpServerStatus[] = [
20
+ { name: "railway", transport: "stdio", connected: true, toolCount: 5, error: undefined },
21
+ { name: "linear", transport: "http", connected: false, toolCount: 0, error: undefined },
22
+ ];
23
+ const result = formatMcpStatusReport(servers);
24
+ assert.match(result, /railway/);
25
+ assert.match(result, /linear/);
26
+ assert.match(result, /connected/i);
27
+ assert.match(result, /disconnected/i);
28
+ assert.match(result, /5 tools/);
29
+ });
30
+
31
+ test("shows error state for servers with errors", () => {
32
+ const servers: McpServerStatus[] = [
33
+ { name: "broken", transport: "stdio", connected: false, toolCount: 0, error: "Connection refused" },
34
+ ];
35
+ const result = formatMcpStatusReport(servers);
36
+ assert.match(result, /error/i);
37
+ assert.match(result, /Connection refused/);
38
+ });
39
+
40
+ test("includes server count in header", () => {
41
+ const servers: McpServerStatus[] = [
42
+ { name: "a", transport: "stdio", connected: true, toolCount: 3, error: undefined },
43
+ { name: "b", transport: "http", connected: true, toolCount: 2, error: undefined },
44
+ ];
45
+ const result = formatMcpStatusReport(servers);
46
+ assert.match(result, /2/);
47
+ });
48
+ });
49
+
50
+ // ─── formatMcpServerDetail ──────────────────────────────────────────────────
51
+
52
+ describe("formatMcpServerDetail", () => {
53
+ test("shows server name and transport", () => {
54
+ const result = formatMcpServerDetail({
55
+ name: "railway",
56
+ transport: "stdio",
57
+ connected: true,
58
+ toolCount: 3,
59
+ tools: ["railway_list_projects", "railway_deploy", "railway_logs"],
60
+ error: undefined,
61
+ });
62
+ assert.match(result, /railway/);
63
+ assert.match(result, /stdio/);
64
+ });
65
+
66
+ test("lists individual tools when available", () => {
67
+ const result = formatMcpServerDetail({
68
+ name: "railway",
69
+ transport: "stdio",
70
+ connected: true,
71
+ toolCount: 2,
72
+ tools: ["railway_list_projects", "railway_deploy"],
73
+ error: undefined,
74
+ });
75
+ assert.match(result, /railway_list_projects/);
76
+ assert.match(result, /railway_deploy/);
77
+ });
78
+
79
+ test("shows error message for failed servers", () => {
80
+ const result = formatMcpServerDetail({
81
+ name: "broken",
82
+ transport: "stdio",
83
+ connected: false,
84
+ toolCount: 0,
85
+ tools: [],
86
+ error: "spawn ENOENT",
87
+ });
88
+ assert.match(result, /error/i);
89
+ assert.match(result, /spawn ENOENT/);
90
+ });
91
+
92
+ test("shows disconnected status with no tools", () => {
93
+ const result = formatMcpServerDetail({
94
+ name: "offline",
95
+ transport: "http",
96
+ connected: false,
97
+ toolCount: 0,
98
+ tools: [],
99
+ error: undefined,
100
+ });
101
+ assert.match(result, /disconnected/i);
102
+ });
103
+ });
@@ -1,4 +1,3 @@
1
- import { createTestContext } from './test-helpers.ts';
2
1
  import * as fs from 'node:fs';
3
2
  import * as path from 'node:path';
4
3
  import * as os from 'node:os';
@@ -17,8 +16,8 @@ import {
17
16
  parseRequirementsSections,
18
17
  migrateFromMarkdown,
19
18
  } from '../md-importer.ts';
20
-
21
- const { assertEq, assertTrue, report } = createTestContext();
19
+ import { describe, test, beforeEach, afterEach } from 'node:test';
20
+ import assert from 'node:assert/strict';
22
21
 
23
22
  // ═══════════════════════════════════════════════════════════════════════════
24
23
  // Fixtures
@@ -135,43 +134,37 @@ function cleanupDir(dir: string): void {
135
134
  // md-importer: parseDecisionsTable
136
135
  // ═══════════════════════════════════════════════════════════════════════════
137
136
 
138
- console.log('\n=== md-importer: parseDecisionsTable ===');
139
-
140
- {
137
+ test('md-importer: parseDecisionsTable', () => {
141
138
  const decisions = parseDecisionsTable(DECISIONS_MD);
142
- assertEq(decisions.length, 4, 'should parse 4 decisions');
143
- assertEq(decisions[0].id, 'D001', 'first decision should be D001');
144
- assertEq(decisions[0].decision, 'SQLite library', 'D001 decision text');
145
- assertEq(decisions[0].choice, 'better-sqlite3', 'D001 choice');
146
- assertEq(decisions[0].scope, 'library', 'D001 scope');
147
- assertEq(decisions[0].revisable, 'No', 'D001 revisable');
148
- }
149
-
150
- console.log('=== md-importer: supersession detection ===');
151
-
152
- {
139
+ assert.deepStrictEqual(decisions.length, 4, 'should parse 4 decisions');
140
+ assert.deepStrictEqual(decisions[0].id, 'D001', 'first decision should be D001');
141
+ assert.deepStrictEqual(decisions[0].decision, 'SQLite library', 'D001 decision text');
142
+ assert.deepStrictEqual(decisions[0].choice, 'better-sqlite3', 'D001 choice');
143
+ assert.deepStrictEqual(decisions[0].scope, 'library', 'D001 scope');
144
+ assert.deepStrictEqual(decisions[0].revisable, 'No', 'D001 revisable');
145
+ });
146
+
147
+ test('md-importer: supersession detection', () => {
153
148
  const decisions = parseDecisionsTable(DECISIONS_MD);
154
149
 
155
150
  // D010 amends D001 → D001.superseded_by = D010
156
151
  const d001 = decisions.find(d => d.id === 'D001');
157
- assertEq(d001?.superseded_by, 'D010', 'D001 should be superseded by D010');
152
+ assert.deepStrictEqual(d001?.superseded_by, 'D010', 'D001 should be superseded by D010');
158
153
 
159
154
  // D020 amends D010 → D010.superseded_by = D020
160
155
  const d010 = decisions.find(d => d.id === 'D010');
161
- assertEq(d010?.superseded_by, 'D020', 'D010 should be superseded by D020');
156
+ assert.deepStrictEqual(d010?.superseded_by, 'D020', 'D010 should be superseded by D020');
162
157
 
163
158
  // D002 is not amended
164
159
  const d002 = decisions.find(d => d.id === 'D002');
165
- assertEq(d002?.superseded_by, null, 'D002 should not be superseded');
160
+ assert.deepStrictEqual(d002?.superseded_by, null, 'D002 should not be superseded');
166
161
 
167
162
  // D020 is the latest in chain, not superseded
168
163
  const d020 = decisions.find(d => d.id === 'D020');
169
- assertEq(d020?.superseded_by, null, 'D020 should not be superseded');
170
- }
164
+ assert.deepStrictEqual(d020?.superseded_by, null, 'D020 should not be superseded');
165
+ });
171
166
 
172
- console.log('=== md-importer: malformed/empty rows skipped ===');
173
-
174
- {
167
+ test('md-importer: malformed/empty rows skipped', () => {
175
168
  const malformedInput = `# Decisions
176
169
 
177
170
  | # | When | Scope | Decision | Choice | Rationale | Revisable? |
@@ -182,24 +175,20 @@ console.log('=== md-importer: malformed/empty rows skipped ===');
182
175
  | D003 | M001 | arch | Config | JSON | Simple | Yes |
183
176
  `;
184
177
  const decisions = parseDecisionsTable(malformedInput);
185
- assertEq(decisions.length, 2, 'should skip rows without D-prefix IDs');
186
- assertEq(decisions[0].id, 'D001', 'first valid row');
187
- assertEq(decisions[1].id, 'D003', 'second valid row (skipping malformed)');
188
- }
189
-
190
- console.log('=== md-importer: made_by backward compatibility (old 7-column format) ===');
178
+ assert.deepStrictEqual(decisions.length, 2, 'should skip rows without D-prefix IDs');
179
+ assert.deepStrictEqual(decisions[0].id, 'D001', 'first valid row');
180
+ assert.deepStrictEqual(decisions[1].id, 'D003', 'second valid row (skipping malformed)');
181
+ });
191
182
 
192
- {
183
+ test('md-importer: made_by backward compatibility (old 7-column format)', () => {
193
184
  const decisions = parseDecisionsTable(DECISIONS_MD);
194
185
  // Old format has no Made By column — should default to 'agent'
195
186
  for (const d of decisions) {
196
- assertEq(d.made_by, 'agent', `${d.id} made_by defaults to agent for legacy format`);
187
+ assert.deepStrictEqual(d.made_by, 'agent', `${d.id} made_by defaults to agent for legacy format`);
197
188
  }
198
- }
199
-
200
- console.log('=== md-importer: made_by column parsing (new 8-column format) ===');
189
+ });
201
190
 
202
- {
191
+ test('md-importer: made_by column parsing (new 8-column format)', () => {
203
192
  const newFormatMd = `# Decisions Register
204
193
 
205
194
  | # | When | Scope | Decision | Choice | Rationale | Revisable? | Made By |
@@ -210,62 +199,58 @@ console.log('=== md-importer: made_by column parsing (new 8-column format) ===')
210
199
  | D004 | M002 | impl | Cache strategy | LRU | Predictable | No | bogus |
211
200
  `;
212
201
  const decisions = parseDecisionsTable(newFormatMd);
213
- assertEq(decisions.length, 4, 'should parse 4 decisions with new format');
214
- assertEq(decisions[0].made_by, 'human', 'D001 made_by = human');
215
- assertEq(decisions[1].made_by, 'agent', 'D002 made_by = agent');
216
- assertEq(decisions[2].made_by, 'collaborative', 'D003 made_by = collaborative');
217
- assertEq(decisions[3].made_by, 'agent', 'D004 invalid made_by defaults to agent');
218
- }
202
+ assert.deepStrictEqual(decisions.length, 4, 'should parse 4 decisions with new format');
203
+ assert.deepStrictEqual(decisions[0].made_by, 'human', 'D001 made_by = human');
204
+ assert.deepStrictEqual(decisions[1].made_by, 'agent', 'D002 made_by = agent');
205
+ assert.deepStrictEqual(decisions[2].made_by, 'collaborative', 'D003 made_by = collaborative');
206
+ assert.deepStrictEqual(decisions[3].made_by, 'agent', 'D004 invalid made_by defaults to agent');
207
+ });
219
208
 
220
209
  // ═══════════════════════════════════════════════════════════════════════════
221
210
  // md-importer: parseRequirementsSections
222
211
  // ═══════════════════════════════════════════════════════════════════════════
223
212
 
224
- console.log('=== md-importer: parseRequirementsSections ===');
225
-
226
- {
213
+ test('md-importer: parseRequirementsSections', () => {
227
214
  const reqs = parseRequirementsSections(REQUIREMENTS_MD);
228
- assertEq(reqs.length, 5, 'should parse 5 unique requirements');
215
+ assert.deepStrictEqual(reqs.length, 5, 'should parse 5 unique requirements');
229
216
 
230
217
  const r001 = reqs.find(r => r.id === 'R001');
231
- assertTrue(!!r001, 'R001 should exist');
232
- assertEq(r001?.class, 'core-capability', 'R001 class');
233
- assertEq(r001?.status, 'active', 'R001 status');
234
- assertEq(r001?.description, 'A SQLite database with typed wrappers', 'R001 description');
235
- assertEq(r001?.why, 'Foundation for storage', 'R001 why');
236
- assertEq(r001?.source, 'user', 'R001 source');
237
- assertEq(r001?.primary_owner, 'M001/S01', 'R001 primary_owner');
238
- assertEq(r001?.supporting_slices, 'none', 'R001 supporting_slices');
239
- assertEq(r001?.validation, 'unmapped', 'R001 validation');
240
- assertEq(r001?.notes, 'WAL mode enabled', 'R001 notes');
241
- assertTrue(r001?.full_content?.includes('### R001') ?? false, 'R001 full_content should have heading');
218
+ assert.ok(!!r001, 'R001 should exist');
219
+ assert.deepStrictEqual(r001?.class, 'core-capability', 'R001 class');
220
+ assert.deepStrictEqual(r001?.status, 'active', 'R001 status');
221
+ assert.deepStrictEqual(r001?.description, 'A SQLite database with typed wrappers', 'R001 description');
222
+ assert.deepStrictEqual(r001?.why, 'Foundation for storage', 'R001 why');
223
+ assert.deepStrictEqual(r001?.source, 'user', 'R001 source');
224
+ assert.deepStrictEqual(r001?.primary_owner, 'M001/S01', 'R001 primary_owner');
225
+ assert.deepStrictEqual(r001?.supporting_slices, 'none', 'R001 supporting_slices');
226
+ assert.deepStrictEqual(r001?.validation, 'unmapped', 'R001 validation');
227
+ assert.deepStrictEqual(r001?.notes, 'WAL mode enabled', 'R001 notes');
228
+ assert.ok(r001?.full_content?.includes('### R001') ?? false, 'R001 full_content should have heading');
242
229
 
243
230
  // Validated section — R017 (abbreviated format with "Validated by" / "Proof" bullets)
244
231
  const r017 = reqs.find(r => r.id === 'R017');
245
- assertTrue(!!r017, 'R017 should exist');
246
- assertEq(r017?.status, 'validated', 'R017 status from validated section');
247
- assertEq(r017?.validation, 'M001/S01', 'R017 validation (from "Validated by" bullet)');
248
- assertEq(r017?.notes, '50 decisions queried in 0.62ms', 'R017 notes (from "Proof" bullet)');
232
+ assert.ok(!!r017, 'R017 should exist');
233
+ assert.deepStrictEqual(r017?.status, 'validated', 'R017 status from validated section');
234
+ assert.deepStrictEqual(r017?.validation, 'M001/S01', 'R017 validation (from "Validated by" bullet)');
235
+ assert.deepStrictEqual(r017?.notes, '50 decisions queried in 0.62ms', 'R017 notes (from "Proof" bullet)');
249
236
 
250
237
  // Deferred requirement
251
238
  const r030 = reqs.find(r => r.id === 'R030');
252
- assertEq(r030?.status, 'deferred', 'R030 status should be deferred');
253
- assertEq(r030?.class, 'differentiator', 'R030 class');
254
- assertEq(r030?.description, 'Rust crate for embeddings', 'R030 description');
239
+ assert.deepStrictEqual(r030?.status, 'deferred', 'R030 status should be deferred');
240
+ assert.deepStrictEqual(r030?.class, 'differentiator', 'R030 class');
241
+ assert.deepStrictEqual(r030?.description, 'Rust crate for embeddings', 'R030 description');
255
242
 
256
243
  // Out of scope
257
244
  const r040 = reqs.find(r => r.id === 'R040');
258
- assertEq(r040?.status, 'out-of-scope', 'R040 status should be out-of-scope');
259
- assertEq(r040?.class, 'anti-feature', 'R040 class');
260
- }
245
+ assert.deepStrictEqual(r040?.status, 'out-of-scope', 'R040 status should be out-of-scope');
246
+ assert.deepStrictEqual(r040?.class, 'anti-feature', 'R040 class');
247
+ });
261
248
 
262
249
  // ═══════════════════════════════════════════════════════════════════════════
263
250
  // md-importer: migrateFromMarkdown orchestrator
264
251
  // ═══════════════════════════════════════════════════════════════════════════
265
252
 
266
- console.log('=== md-importer: migrateFromMarkdown orchestrator ===');
267
-
268
- {
253
+ test('md-importer: migrateFromMarkdown orchestrator', () => {
269
254
  const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-import-test-'));
270
255
  createFixtureTree(tmpDir);
271
256
 
@@ -273,53 +258,51 @@ console.log('=== md-importer: migrateFromMarkdown orchestrator ===');
273
258
  openDatabase(':memory:');
274
259
  const result = migrateFromMarkdown(tmpDir);
275
260
 
276
- assertEq(result.decisions, 4, 'should import 4 decisions');
277
- assertEq(result.requirements, 5, 'should import 5 requirements');
278
- assertTrue(result.artifacts > 0, 'should import some artifacts');
261
+ assert.deepStrictEqual(result.decisions, 4, 'should import 4 decisions');
262
+ assert.deepStrictEqual(result.requirements, 5, 'should import 5 requirements');
263
+ assert.ok(result.artifacts > 0, 'should import some artifacts');
279
264
 
280
265
  // Verify decisions queryable
281
266
  const d001 = getDecisionById('D001');
282
- assertTrue(!!d001, 'D001 should be queryable');
283
- assertEq(d001?.superseded_by, 'D010', 'D001 superseded_by should be D010');
267
+ assert.ok(!!d001, 'D001 should be queryable');
268
+ assert.deepStrictEqual(d001?.superseded_by, 'D010', 'D001 superseded_by should be D010');
284
269
 
285
270
  // Verify requirements queryable
286
271
  const r001 = getRequirementById('R001');
287
- assertTrue(!!r001, 'R001 should be queryable');
288
- assertEq(r001?.status, 'active', 'R001 status from DB');
272
+ assert.ok(!!r001, 'R001 should be queryable');
273
+ assert.deepStrictEqual(r001?.status, 'active', 'R001 status from DB');
289
274
 
290
275
  // Verify active views
291
276
  const activeD = getActiveDecisions();
292
- assertEq(activeD.length, 2, 'should have 2 active decisions (D002, D020)');
277
+ assert.deepStrictEqual(activeD.length, 2, 'should have 2 active decisions (D002, D020)');
293
278
 
294
279
  // Verify artifacts table
295
280
  const adapter = _getAdapter();
296
281
  const artifacts = adapter?.prepare('SELECT count(*) as c FROM artifacts').get();
297
- assertTrue((artifacts?.c as number) > 0, 'artifacts table should have rows');
282
+ assert.ok((artifacts?.c as number) > 0, 'artifacts table should have rows');
298
283
 
299
284
  // Verify hierarchy correctness
300
285
  const roadmap = adapter?.prepare('SELECT * FROM artifacts WHERE artifact_type = :type').get({ ':type': 'ROADMAP' });
301
- assertTrue(!!roadmap, 'ROADMAP artifact should exist');
302
- assertEq(roadmap?.milestone_id, 'M001', 'ROADMAP should be in M001');
286
+ assert.ok(!!roadmap, 'ROADMAP artifact should exist');
287
+ assert.deepStrictEqual(roadmap?.milestone_id, 'M001', 'ROADMAP should be in M001');
303
288
 
304
289
  const taskPlan = adapter?.prepare('SELECT * FROM artifacts WHERE task_id = :taskId AND artifact_type = :type').get({
305
290
  ':taskId': 'T01',
306
291
  ':type': 'PLAN',
307
292
  });
308
- assertTrue(!!taskPlan, 'T01-PLAN artifact should exist');
293
+ assert.ok(!!taskPlan, 'T01-PLAN artifact should exist');
309
294
 
310
295
  closeDatabase();
311
296
  } finally {
312
297
  cleanupDir(tmpDir);
313
298
  }
314
- }
299
+ });
315
300
 
316
301
  // ═══════════════════════════════════════════════════════════════════════════
317
302
  // md-importer: idempotent re-import
318
303
  // ═══════════════════════════════════════════════════════════════════════════
319
304
 
320
- console.log('=== md-importer: idempotent re-import ===');
321
-
322
- {
305
+ test('md-importer: idempotent re-import', () => {
323
306
  const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-idemp-test-'));
324
307
  createFixtureTree(tmpDir);
325
308
 
@@ -328,9 +311,9 @@ console.log('=== md-importer: idempotent re-import ===');
328
311
  const r1 = migrateFromMarkdown(tmpDir);
329
312
  const r2 = migrateFromMarkdown(tmpDir);
330
313
 
331
- assertEq(r1.decisions, r2.decisions, 'double import should produce same decision count');
332
- assertEq(r1.requirements, r2.requirements, 'double import should produce same requirement count');
333
- assertEq(r1.artifacts, r2.artifacts, 'double import should produce same artifact count');
314
+ assert.deepStrictEqual(r1.decisions, r2.decisions, 'double import should produce same decision count');
315
+ assert.deepStrictEqual(r1.requirements, r2.requirements, 'double import should produce same requirement count');
316
+ assert.deepStrictEqual(r1.artifacts, r2.artifacts, 'double import should produce same artifact count');
334
317
 
335
318
  // Verify no duplicates
336
319
  const adapter = _getAdapter();
@@ -338,23 +321,21 @@ console.log('=== md-importer: idempotent re-import ===');
338
321
  const rc = adapter?.prepare('SELECT count(*) as c FROM requirements').get()?.c as number;
339
322
  const ac = adapter?.prepare('SELECT count(*) as c FROM artifacts').get()?.c as number;
340
323
 
341
- assertEq(dc, r1.decisions, 'DB decision count matches import count');
342
- assertEq(rc, r1.requirements, 'DB requirement count matches import count');
343
- assertEq(ac, r1.artifacts, 'DB artifact count matches import count');
324
+ assert.deepStrictEqual(dc, r1.decisions, 'DB decision count matches import count');
325
+ assert.deepStrictEqual(rc, r1.requirements, 'DB requirement count matches import count');
326
+ assert.deepStrictEqual(ac, r1.artifacts, 'DB artifact count matches import count');
344
327
 
345
328
  closeDatabase();
346
329
  } finally {
347
330
  cleanupDir(tmpDir);
348
331
  }
349
- }
332
+ });
350
333
 
351
334
  // ═══════════════════════════════════════════════════════════════════════════
352
335
  // md-importer: missing file graceful handling
353
336
  // ═══════════════════════════════════════════════════════════════════════════
354
337
 
355
- console.log('=== md-importer: missing file handling ===');
356
-
357
- {
338
+ test('md-importer: missing file handling', () => {
358
339
  const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-empty-test-'));
359
340
  // Create empty .gsd/ with no files
360
341
  fs.mkdirSync(path.join(tmpDir, '.gsd'), { recursive: true });
@@ -363,43 +344,39 @@ console.log('=== md-importer: missing file handling ===');
363
344
  openDatabase(':memory:');
364
345
  const result = migrateFromMarkdown(tmpDir);
365
346
 
366
- assertEq(result.decisions, 0, 'missing DECISIONS.md → 0 decisions');
367
- assertEq(result.requirements, 0, 'missing REQUIREMENTS.md → 0 requirements');
368
- assertEq(result.artifacts, 0, 'empty tree → 0 artifacts');
347
+ assert.deepStrictEqual(result.decisions, 0, 'missing DECISIONS.md → 0 decisions');
348
+ assert.deepStrictEqual(result.requirements, 0, 'missing REQUIREMENTS.md → 0 requirements');
349
+ assert.deepStrictEqual(result.artifacts, 0, 'empty tree → 0 artifacts');
369
350
 
370
351
  closeDatabase();
371
352
  } finally {
372
353
  cleanupDir(tmpDir);
373
354
  }
374
- }
355
+ });
375
356
 
376
357
  // ═══════════════════════════════════════════════════════════════════════════
377
358
  // md-importer: schema v1→v2 migration on existing DBs
378
359
  // ═══════════════════════════════════════════════════════════════════════════
379
360
 
380
- console.log('=== md-importer: schema v1→v2 migration ===');
381
-
382
- {
361
+ test('md-importer: schema v1→v2 migration', () => {
383
362
  // This test verifies that opening a fresh DB auto-migrates to current schema version
384
363
  openDatabase(':memory:');
385
364
  const adapter = _getAdapter();
386
365
  const version = adapter?.prepare('SELECT MAX(version) as v FROM schema_version').get();
387
- assertEq(version?.v, 10, 'new DB should be at schema version 10');
366
+ assert.deepStrictEqual(version?.v, 11, 'new DB should be at schema version 11');
388
367
 
389
368
  // Artifacts table should exist
390
369
  const tableCheck = adapter?.prepare("SELECT count(*) as c FROM sqlite_master WHERE type='table' AND name='artifacts'").get();
391
- assertEq(tableCheck?.c, 1, 'artifacts table should exist');
370
+ assert.deepStrictEqual(tableCheck?.c, 1, 'artifacts table should exist');
392
371
 
393
372
  closeDatabase();
394
- }
373
+ });
395
374
 
396
375
  // ═══════════════════════════════════════════════════════════════════════════
397
376
  // md-importer: round-trip fidelity
398
377
  // ═══════════════════════════════════════════════════════════════════════════
399
378
 
400
- console.log('=== md-importer: round-trip fidelity ===');
401
-
402
- {
379
+ test('md-importer: round-trip fidelity', () => {
403
380
  const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-roundtrip-test-'));
404
381
  createFixtureTree(tmpDir);
405
382
 
@@ -409,32 +386,31 @@ console.log('=== md-importer: round-trip fidelity ===');
409
386
 
410
387
  // Round-trip: verify imported field values match source
411
388
  const d002 = getDecisionById('D002');
412
- assertEq(d002?.when_context, 'M001', 'D002 when_context round-trip');
413
- assertEq(d002?.scope, 'arch', 'D002 scope round-trip');
414
- assertEq(d002?.decision, 'DB location', 'D002 decision round-trip');
415
- assertEq(d002?.choice, '.gsd/gsd.db', 'D002 choice round-trip');
416
- assertEq(d002?.rationale, 'Derived state', 'D002 rationale round-trip');
389
+ assert.deepStrictEqual(d002?.when_context, 'M001', 'D002 when_context round-trip');
390
+ assert.deepStrictEqual(d002?.scope, 'arch', 'D002 scope round-trip');
391
+ assert.deepStrictEqual(d002?.decision, 'DB location', 'D002 decision round-trip');
392
+ assert.deepStrictEqual(d002?.choice, '.gsd/gsd.db', 'D002 choice round-trip');
393
+ assert.deepStrictEqual(d002?.rationale, 'Derived state', 'D002 rationale round-trip');
417
394
 
418
395
  const r002 = getRequirementById('R002');
419
- assertEq(r002?.class, 'failure-visibility', 'R002 class round-trip');
420
- assertEq(r002?.description, 'Falls back to markdown if SQLite unavailable', 'R002 description round-trip');
421
- assertEq(r002?.why, 'Must not break on exotic platforms', 'R002 why round-trip');
422
- assertEq(r002?.primary_owner, 'M001/S01', 'R002 primary_owner round-trip');
423
- assertEq(r002?.supporting_slices, 'M001/S03', 'R002 supporting_slices round-trip');
424
- assertEq(r002?.notes, 'Transparent fallback', 'R002 notes round-trip');
425
- assertEq(r002?.validation, 'unmapped', 'R002 validation round-trip');
396
+ assert.deepStrictEqual(r002?.class, 'failure-visibility', 'R002 class round-trip');
397
+ assert.deepStrictEqual(r002?.description, 'Falls back to markdown if SQLite unavailable', 'R002 description round-trip');
398
+ assert.deepStrictEqual(r002?.why, 'Must not break on exotic platforms', 'R002 why round-trip');
399
+ assert.deepStrictEqual(r002?.primary_owner, 'M001/S01', 'R002 primary_owner round-trip');
400
+ assert.deepStrictEqual(r002?.supporting_slices, 'M001/S03', 'R002 supporting_slices round-trip');
401
+ assert.deepStrictEqual(r002?.notes, 'Transparent fallback', 'R002 notes round-trip');
402
+ assert.deepStrictEqual(r002?.validation, 'unmapped', 'R002 validation round-trip');
426
403
 
427
404
  // Verify artifact content is stored
428
405
  const adapter = _getAdapter();
429
406
  const project = adapter?.prepare("SELECT * FROM artifacts WHERE path = :path").get({ ':path': 'PROJECT.md' });
430
- assertTrue((project?.full_content as string)?.includes('Test Project'), 'PROJECT.md content round-trip');
407
+ assert.ok((project?.full_content as string)?.includes('Test Project'), 'PROJECT.md content round-trip');
431
408
 
432
409
  closeDatabase();
433
410
  } finally {
434
411
  cleanupDir(tmpDir);
435
412
  }
436
- }
413
+ });
437
414
 
438
415
  // ═══════════════════════════════════════════════════════════════════════════
439
416
 
440
- report();