gsd-pi 2.43.0 → 2.44.0-dev.0b97ffd

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 (693) hide show
  1. package/README.md +30 -12
  2. package/dist/cli.js +13 -1
  3. package/dist/help-text.js +24 -0
  4. package/dist/resources/extensions/bg-shell/overlay.js +3 -0
  5. package/dist/resources/extensions/github-sync/sync.js +2 -1
  6. package/dist/resources/extensions/gsd/auto/loop.js +0 -2
  7. package/dist/resources/extensions/gsd/auto/phases.js +7 -12
  8. package/dist/resources/extensions/gsd/auto-dashboard.js +19 -18
  9. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +34 -19
  10. package/dist/resources/extensions/gsd/auto-dispatch.js +36 -21
  11. package/dist/resources/extensions/gsd/auto-post-unit.js +128 -14
  12. package/dist/resources/extensions/gsd/auto-prompts.js +202 -92
  13. package/dist/resources/extensions/gsd/auto-recovery.js +83 -135
  14. package/dist/resources/extensions/gsd/auto-start.js +10 -0
  15. package/dist/resources/extensions/gsd/auto-supervisor.js +14 -0
  16. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +4 -7
  17. package/dist/resources/extensions/gsd/auto-verification.js +5 -10
  18. package/dist/resources/extensions/gsd/auto-worktree.js +123 -30
  19. package/dist/resources/extensions/gsd/auto.js +1 -4
  20. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +611 -0
  21. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +28 -3
  22. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -0
  23. package/dist/resources/extensions/gsd/commands/catalog.js +3 -1
  24. package/dist/resources/extensions/gsd/commands/handlers/ops.js +15 -1
  25. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
  26. package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
  27. package/dist/resources/extensions/gsd/commands-maintenance.js +78 -3
  28. package/dist/resources/extensions/gsd/dashboard-overlay.js +32 -31
  29. package/dist/resources/extensions/gsd/db-writer.js +95 -4
  30. package/dist/resources/extensions/gsd/dispatch-guard.js +35 -30
  31. package/dist/resources/extensions/gsd/doctor-checks.js +28 -11
  32. package/dist/resources/extensions/gsd/doctor-environment.js +28 -0
  33. package/dist/resources/extensions/gsd/doctor-types.js +0 -15
  34. package/dist/resources/extensions/gsd/doctor.js +46 -282
  35. package/dist/resources/extensions/gsd/file-watcher.js +5 -1
  36. package/dist/resources/extensions/gsd/files.js +14 -198
  37. package/dist/resources/extensions/gsd/git-service.js +4 -0
  38. package/dist/resources/extensions/gsd/gitignore.js +4 -0
  39. package/dist/resources/extensions/gsd/gsd-db.js +819 -197
  40. package/dist/resources/extensions/gsd/guided-flow.js +18 -8
  41. package/dist/resources/extensions/gsd/markdown-renderer.js +862 -0
  42. package/dist/resources/extensions/gsd/md-importer.js +182 -4
  43. package/dist/resources/extensions/gsd/native-git-bridge.js +10 -1
  44. package/dist/resources/extensions/gsd/parallel-eligibility.js +14 -19
  45. package/dist/resources/extensions/gsd/parallel-orchestrator.js +38 -0
  46. package/dist/resources/extensions/gsd/parsers-legacy.js +239 -0
  47. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  48. package/dist/resources/extensions/gsd/preferences-validation.js +9 -0
  49. package/dist/resources/extensions/gsd/preferences.js +1 -0
  50. package/dist/resources/extensions/gsd/prompts/complete-slice.md +22 -9
  51. package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
  52. package/dist/resources/extensions/gsd/prompts/execute-task.md +15 -5
  53. package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  54. package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
  55. package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
  56. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
  57. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -7
  58. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
  59. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
  60. package/dist/resources/extensions/gsd/prompts/replan-slice.md +6 -6
  61. package/dist/resources/extensions/gsd/reactive-graph.js +33 -3
  62. package/dist/resources/extensions/gsd/skill-health.js +3 -1
  63. package/dist/resources/extensions/gsd/state.js +484 -30
  64. package/dist/resources/extensions/gsd/tools/complete-milestone.js +128 -0
  65. package/dist/resources/extensions/gsd/tools/complete-slice.js +244 -0
  66. package/dist/resources/extensions/gsd/tools/complete-task.js +204 -0
  67. package/dist/resources/extensions/gsd/tools/plan-milestone.js +205 -0
  68. package/dist/resources/extensions/gsd/tools/plan-slice.js +155 -0
  69. package/dist/resources/extensions/gsd/tools/plan-task.js +94 -0
  70. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +152 -0
  71. package/dist/resources/extensions/gsd/tools/replan-slice.js +146 -0
  72. package/dist/resources/extensions/gsd/triage-resolution.js +17 -1
  73. package/dist/resources/extensions/gsd/undo.js +197 -3
  74. package/dist/resources/extensions/gsd/visualizer-data.js +53 -16
  75. package/dist/resources/extensions/gsd/workspace-index.js +63 -39
  76. package/dist/web/standalone/.next/BUILD_ID +1 -1
  77. package/dist/web/standalone/.next/app-path-routes-manifest.json +18 -17
  78. package/dist/web/standalone/.next/build-manifest.json +4 -4
  79. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  80. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  81. package/dist/web/standalone/.next/required-server-files.json +4 -4
  82. package/dist/web/standalone/.next/routes-manifest.json +6 -0
  83. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  84. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  85. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  86. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  91. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  94. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  95. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  96. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  97. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  98. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  100. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  103. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  110. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  148. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  154. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -0
  166. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -0
  167. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -0
  168. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  171. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  173. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  175. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/index.html +1 -1
  185. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  186. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  187. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  188. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  189. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  190. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  191. package/dist/web/standalone/.next/server/app/page.js +2 -2
  192. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app-paths-manifest.json +18 -17
  194. package/dist/web/standalone/.next/server/chunks/229.js +3 -3
  195. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  196. package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -0
  197. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/middleware.js +2 -2
  200. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  202. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  203. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  204. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  205. package/dist/web/standalone/.next/static/alS4hoANx0TK4UVZY27da/_buildManifest.js +1 -0
  206. package/dist/web/standalone/.next/static/chunks/{4024.c195dc1fdd2adbea.js → 4024.0de81b543b28b9fe.js} +2 -2
  207. package/dist/web/standalone/.next/static/chunks/app/_global-error/{page-d07a2c023f1aef1e.js → page-d83ba70a25a85472.js} +1 -1
  208. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-f2a7482d42a5614b.js +1 -0
  209. package/dist/web/standalone/.next/static/chunks/app/api/boot/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  210. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  211. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  212. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +1 -0
  213. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +1 -0
  214. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +1 -0
  215. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +1 -0
  216. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +1 -0
  217. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +1 -0
  218. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +1 -0
  219. package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +1 -0
  220. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +1 -0
  221. package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +1 -0
  222. package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +1 -0
  223. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +1 -0
  224. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +1 -0
  225. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +1 -0
  226. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +1 -0
  227. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +1 -0
  228. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +1 -0
  229. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +1 -0
  230. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +1 -0
  231. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +1 -0
  232. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +1 -0
  233. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +1 -0
  234. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +1 -0
  235. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +1 -0
  236. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +1 -0
  237. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +1 -0
  238. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +1 -0
  239. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +1 -0
  240. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +1 -0
  241. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +1 -0
  242. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +1 -0
  243. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +1 -0
  244. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +1 -0
  245. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +1 -0
  246. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +1 -0
  247. package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +1 -0
  248. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +1 -0
  249. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +1 -0
  250. package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +1 -0
  251. package/dist/web/standalone/.next/static/chunks/{main-app-2f2ee7b85712c2bd.js → main-app-fdab67f7802d7832.js} +1 -1
  252. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d83ba70a25a85472.js +1 -0
  253. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.js +1 -0
  254. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  255. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d83ba70a25a85472.js +1 -0
  256. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +1 -0
  257. package/dist/web/standalone/.next/static/chunks/{webpack-fa307370fcf9fb2c.js → webpack-9014b5adb127a98a.js} +1 -1
  258. package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +1 -0
  259. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  260. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  261. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  262. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  263. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  264. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  265. package/dist/web/standalone/server.js +1 -1
  266. package/package.json +4 -4
  267. package/packages/pi-ai/dist/models.custom.d.ts +173 -0
  268. package/packages/pi-ai/dist/models.custom.d.ts.map +1 -0
  269. package/packages/pi-ai/dist/models.custom.js +170 -0
  270. package/packages/pi-ai/dist/models.custom.js.map +1 -0
  271. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  272. package/packages/pi-ai/dist/models.js +16 -1
  273. package/packages/pi-ai/dist/models.js.map +1 -1
  274. package/packages/pi-ai/dist/models.test.d.ts +2 -0
  275. package/packages/pi-ai/dist/models.test.d.ts.map +1 -0
  276. package/packages/pi-ai/dist/models.test.js +67 -0
  277. package/packages/pi-ai/dist/models.test.js.map +1 -0
  278. package/packages/pi-ai/src/models.custom.ts +172 -0
  279. package/packages/pi-ai/src/models.test.ts +85 -0
  280. package/packages/pi-ai/src/models.ts +17 -1
  281. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +10 -3
  282. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  283. package/packages/pi-coding-agent/dist/core/agent-session.js +21 -34
  284. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  285. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
  286. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts +2 -2
  288. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  289. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
  290. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +2 -2
  291. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +4 -4
  294. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  296. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  297. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  298. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +6 -0
  299. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  300. package/packages/pi-coding-agent/dist/core/extensions/loader.js +80 -0
  301. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/extensions/loader.test.js +63 -0
  303. package/packages/pi-coding-agent/dist/core/extensions/loader.test.js.map +1 -1
  304. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
  305. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  306. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +37 -0
  307. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  308. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  309. package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts.map +1 -1
  310. package/packages/pi-coding-agent/dist/core/fallback-resolver.js +2 -3
  311. package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -1
  312. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +12 -2
  313. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -1
  314. package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
  315. package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
  316. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +38 -0
  317. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -0
  318. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +192 -0
  319. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -0
  320. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +5 -0
  321. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
  322. package/packages/pi-coding-agent/dist/core/lsp/client.js +69 -21
  323. package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts +2 -0
  325. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts.map +1 -0
  326. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +255 -0
  327. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -0
  328. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +15 -0
  329. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  330. package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
  331. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  332. package/packages/pi-coding-agent/dist/core/package-commands.d.ts +25 -0
  333. package/packages/pi-coding-agent/dist/core/package-commands.d.ts.map +1 -0
  334. package/packages/pi-coding-agent/dist/core/package-commands.js +253 -0
  335. package/packages/pi-coding-agent/dist/core/package-commands.js.map +1 -0
  336. package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts +2 -0
  337. package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts.map +1 -0
  338. package/packages/pi-coding-agent/dist/core/package-commands.test.js +225 -0
  339. package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -0
  340. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
  341. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  342. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  343. package/packages/pi-coding-agent/dist/core/sdk.js +4 -0
  344. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
  346. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  347. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
  348. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/index.d.ts +3 -1
  350. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/index.js +1 -0
  352. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  353. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  354. package/packages/pi-coding-agent/dist/main.js +11 -199
  355. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  356. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts +6 -0
  357. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  358. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +21 -0
  359. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
  361. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  362. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +8 -15
  363. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  364. package/packages/pi-coding-agent/dist/modes/print-mode.d.ts.map +1 -1
  365. package/packages/pi-coding-agent/dist/modes/print-mode.js +45 -34
  366. package/packages/pi-coding-agent/dist/modes/print-mode.js.map +1 -1
  367. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts +1 -0
  368. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  369. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js +7 -2
  370. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
  371. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  372. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +2 -1
  373. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
  375. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
  376. package/packages/pi-coding-agent/package.json +1 -1
  377. package/packages/pi-coding-agent/src/core/agent-session.ts +26 -37
  378. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
  379. package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +2 -2
  380. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +3 -3
  381. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +4 -4
  382. package/packages/pi-coding-agent/src/core/extensions/index.ts +5 -0
  383. package/packages/pi-coding-agent/src/core/extensions/loader.test.ts +96 -0
  384. package/packages/pi-coding-agent/src/core/extensions/loader.ts +89 -0
  385. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
  386. package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -0
  387. package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +15 -2
  388. package/packages/pi-coding-agent/src/core/fallback-resolver.ts +2 -3
  389. package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
  390. package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +274 -0
  391. package/packages/pi-coding-agent/src/core/lsp/client.ts +83 -21
  392. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +288 -0
  393. package/packages/pi-coding-agent/src/core/model-registry.ts +39 -3
  394. package/packages/pi-coding-agent/src/core/package-commands.test.ts +240 -0
  395. package/packages/pi-coding-agent/src/core/package-commands.ts +310 -0
  396. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
  397. package/packages/pi-coding-agent/src/core/sdk.ts +4 -0
  398. package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
  399. package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
  400. package/packages/pi-coding-agent/src/index.ts +7 -0
  401. package/packages/pi-coding-agent/src/main.ts +11 -232
  402. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +20 -0
  403. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +9 -16
  404. package/packages/pi-coding-agent/src/modes/print-mode.ts +42 -32
  405. package/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +8 -2
  406. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -1
  407. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
  408. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
  409. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  410. package/pkg/dist/modes/interactive/theme/theme.js +8 -15
  411. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  412. package/pkg/package.json +1 -1
  413. package/src/resources/extensions/bg-shell/overlay.ts +4 -0
  414. package/src/resources/extensions/github-sync/sync.ts +2 -1
  415. package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -8
  416. package/src/resources/extensions/gsd/auto/loop.ts +0 -2
  417. package/src/resources/extensions/gsd/auto/phases.ts +7 -20
  418. package/src/resources/extensions/gsd/auto/types.ts +0 -1
  419. package/src/resources/extensions/gsd/auto-dashboard.ts +20 -16
  420. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +34 -19
  421. package/src/resources/extensions/gsd/auto-dispatch.ts +38 -21
  422. package/src/resources/extensions/gsd/auto-post-unit.ts +150 -15
  423. package/src/resources/extensions/gsd/auto-prompts.ts +186 -103
  424. package/src/resources/extensions/gsd/auto-recovery.ts +77 -142
  425. package/src/resources/extensions/gsd/auto-start.ts +14 -0
  426. package/src/resources/extensions/gsd/auto-supervisor.ts +14 -0
  427. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +6 -7
  428. package/src/resources/extensions/gsd/auto-verification.ts +4 -9
  429. package/src/resources/extensions/gsd/auto-worktree.ts +126 -30
  430. package/src/resources/extensions/gsd/auto.ts +0 -9
  431. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +675 -4
  432. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +31 -3
  433. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -0
  434. package/src/resources/extensions/gsd/commands/catalog.ts +3 -1
  435. package/src/resources/extensions/gsd/commands/handlers/ops.ts +15 -1
  436. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
  437. package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
  438. package/src/resources/extensions/gsd/commands-maintenance.ts +86 -3
  439. package/src/resources/extensions/gsd/dashboard-overlay.ts +17 -13
  440. package/src/resources/extensions/gsd/db-writer.ts +105 -4
  441. package/src/resources/extensions/gsd/dispatch-guard.ts +32 -30
  442. package/src/resources/extensions/gsd/doctor-checks.ts +25 -11
  443. package/src/resources/extensions/gsd/doctor-environment.ts +31 -0
  444. package/src/resources/extensions/gsd/doctor-types.ts +0 -23
  445. package/src/resources/extensions/gsd/doctor.ts +45 -295
  446. package/src/resources/extensions/gsd/file-watcher.ts +4 -1
  447. package/src/resources/extensions/gsd/files.ts +16 -220
  448. package/src/resources/extensions/gsd/git-service.ts +4 -0
  449. package/src/resources/extensions/gsd/gitignore.ts +4 -0
  450. package/src/resources/extensions/gsd/gsd-db.ts +1157 -370
  451. package/src/resources/extensions/gsd/guided-flow.ts +20 -8
  452. package/src/resources/extensions/gsd/markdown-renderer.ts +1098 -0
  453. package/src/resources/extensions/gsd/md-importer.ts +211 -2
  454. package/src/resources/extensions/gsd/native-git-bridge.ts +12 -1
  455. package/src/resources/extensions/gsd/parallel-eligibility.ts +14 -18
  456. package/src/resources/extensions/gsd/parallel-orchestrator.ts +43 -0
  457. package/src/resources/extensions/gsd/parsers-legacy.ts +271 -0
  458. package/src/resources/extensions/gsd/preferences-types.ts +3 -0
  459. package/src/resources/extensions/gsd/preferences-validation.ts +9 -0
  460. package/src/resources/extensions/gsd/preferences.ts +1 -0
  461. package/src/resources/extensions/gsd/prompts/complete-slice.md +22 -9
  462. package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
  463. package/src/resources/extensions/gsd/prompts/execute-task.md +15 -5
  464. package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  465. package/src/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
  466. package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
  467. package/src/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
  468. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -7
  469. package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
  470. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
  471. package/src/resources/extensions/gsd/prompts/replan-slice.md +6 -6
  472. package/src/resources/extensions/gsd/reactive-graph.ts +33 -3
  473. package/src/resources/extensions/gsd/skill-health.ts +2 -1
  474. package/src/resources/extensions/gsd/state.ts +547 -29
  475. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
  476. package/src/resources/extensions/gsd/tests/atomic-task-closeout.test.ts +8 -120
  477. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +14 -16
  478. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +20 -11
  479. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
  480. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
  481. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +600 -513
  482. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
  483. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
  484. package/src/resources/extensions/gsd/tests/auto-stash-merge.test.ts +121 -0
  485. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +540 -668
  486. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
  487. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
  488. package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
  489. package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
  490. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
  491. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
  492. package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
  493. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +39 -60
  494. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +375 -0
  495. package/src/resources/extensions/gsd/tests/complete-task.test.ts +387 -0
  496. package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
  497. package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
  498. package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
  499. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +27 -35
  500. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -2
  501. package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
  502. package/src/resources/extensions/gsd/tests/db-writer.test.ts +390 -420
  503. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
  504. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +512 -0
  505. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +644 -84
  506. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
  507. package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
  508. package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
  509. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
  510. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +192 -161
  511. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
  512. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
  513. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +30 -90
  514. package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
  515. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +57 -80
  516. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +164 -0
  517. package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
  518. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +55 -153
  519. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
  520. package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
  521. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +53 -97
  522. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
  523. package/src/resources/extensions/gsd/tests/doctor.test.ts +109 -149
  524. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
  525. package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
  526. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
  527. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
  528. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +278 -0
  529. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +232 -0
  530. package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
  531. package/src/resources/extensions/gsd/tests/git-service.test.ts +291 -390
  532. package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
  533. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
  534. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
  535. package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
  536. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +440 -0
  537. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
  538. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
  539. package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
  540. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +81 -270
  541. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
  542. package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
  543. package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
  544. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
  545. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +643 -0
  546. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
  547. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1161 -0
  548. package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
  549. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
  550. package/src/resources/extensions/gsd/tests/memory-store.test.ts +81 -94
  551. package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
  552. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +429 -0
  553. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
  554. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
  555. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
  556. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +89 -97
  557. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +127 -164
  558. package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
  559. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +35 -36
  560. package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
  561. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +40 -47
  562. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
  563. package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
  564. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
  565. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
  566. package/src/resources/extensions/gsd/tests/parsers.test.ts +548 -612
  567. package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
  568. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +176 -113
  569. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +7 -0
  570. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +179 -0
  571. package/src/resources/extensions/gsd/tests/plan-task.test.ts +145 -0
  572. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +305 -0
  573. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
  574. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +139 -0
  575. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
  576. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
  577. package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
  578. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
  579. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
  580. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
  581. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +325 -0
  582. package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
  583. package/src/resources/extensions/gsd/tests/replan-handler.test.ts +410 -0
  584. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
  585. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
  586. package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
  587. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
  588. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
  589. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +1 -1
  590. package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +296 -0
  591. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
  592. package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
  593. package/src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts +176 -0
  594. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
  595. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -44
  596. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +209 -0
  597. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
  598. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
  599. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
  600. package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +118 -0
  601. package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
  602. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
  603. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +19 -13
  604. package/src/resources/extensions/gsd/tests/undo.test.ts +321 -1
  605. package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
  606. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
  607. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +1 -1
  608. package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -142
  609. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
  610. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
  611. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
  612. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
  613. package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
  614. package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
  615. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
  616. package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
  617. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
  618. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
  619. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
  620. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +12 -5
  621. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
  622. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
  623. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
  624. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
  625. package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
  626. package/src/resources/extensions/gsd/tools/complete-milestone.ts +176 -0
  627. package/src/resources/extensions/gsd/tools/complete-slice.ts +300 -0
  628. package/src/resources/extensions/gsd/tools/complete-task.ts +245 -0
  629. package/src/resources/extensions/gsd/tools/plan-milestone.ts +249 -0
  630. package/src/resources/extensions/gsd/tools/plan-slice.ts +194 -0
  631. package/src/resources/extensions/gsd/tools/plan-task.ts +116 -0
  632. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +203 -0
  633. package/src/resources/extensions/gsd/tools/replan-slice.ts +192 -0
  634. package/src/resources/extensions/gsd/triage-resolution.ts +20 -1
  635. package/src/resources/extensions/gsd/types.ts +50 -0
  636. package/src/resources/extensions/gsd/undo.ts +247 -3
  637. package/src/resources/extensions/gsd/visualizer-data.ts +54 -17
  638. package/src/resources/extensions/gsd/workspace-index.ts +64 -46
  639. package/dist/resources/extensions/gsd/auto-observability.js +0 -56
  640. package/dist/resources/extensions/gsd/observability-validator.js +0 -422
  641. package/dist/resources/extensions/gsd/roadmap-mutations.js +0 -110
  642. package/dist/web/standalone/.next/static/VvclDCW6TAWjEyLU-EYL1/_buildManifest.js +0 -1
  643. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +0 -1
  644. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d07a2c023f1aef1e.js +0 -1
  645. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d07a2c023f1aef1e.js +0 -1
  646. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d07a2c023f1aef1e.js +0 -1
  647. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d07a2c023f1aef1e.js +0 -1
  648. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d07a2c023f1aef1e.js +0 -1
  649. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d07a2c023f1aef1e.js +0 -1
  650. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d07a2c023f1aef1e.js +0 -1
  651. package/dist/web/standalone/.next/static/chunks/app/api/files/route-d07a2c023f1aef1e.js +0 -1
  652. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d07a2c023f1aef1e.js +0 -1
  653. package/dist/web/standalone/.next/static/chunks/app/api/git/route-d07a2c023f1aef1e.js +0 -1
  654. package/dist/web/standalone/.next/static/chunks/app/api/history/route-d07a2c023f1aef1e.js +0 -1
  655. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d07a2c023f1aef1e.js +0 -1
  656. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d07a2c023f1aef1e.js +0 -1
  657. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d07a2c023f1aef1e.js +0 -1
  658. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d07a2c023f1aef1e.js +0 -1
  659. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d07a2c023f1aef1e.js +0 -1
  660. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d07a2c023f1aef1e.js +0 -1
  661. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d07a2c023f1aef1e.js +0 -1
  662. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d07a2c023f1aef1e.js +0 -1
  663. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d07a2c023f1aef1e.js +0 -1
  664. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d07a2c023f1aef1e.js +0 -1
  665. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d07a2c023f1aef1e.js +0 -1
  666. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d07a2c023f1aef1e.js +0 -1
  667. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d07a2c023f1aef1e.js +0 -1
  668. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d07a2c023f1aef1e.js +0 -1
  669. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d07a2c023f1aef1e.js +0 -1
  670. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d07a2c023f1aef1e.js +0 -1
  671. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d07a2c023f1aef1e.js +0 -1
  672. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d07a2c023f1aef1e.js +0 -1
  673. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d07a2c023f1aef1e.js +0 -1
  674. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d07a2c023f1aef1e.js +0 -1
  675. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d07a2c023f1aef1e.js +0 -1
  676. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d07a2c023f1aef1e.js +0 -1
  677. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d07a2c023f1aef1e.js +0 -1
  678. package/dist/web/standalone/.next/static/chunks/app/api/update/route-d07a2c023f1aef1e.js +0 -1
  679. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d07a2c023f1aef1e.js +0 -1
  680. package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +0 -1
  681. package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +0 -1
  682. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d07a2c023f1aef1e.js +0 -1
  683. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d07a2c023f1aef1e.js +0 -1
  684. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +0 -1
  685. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d07a2c023f1aef1e.js +0 -1
  686. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d07a2c023f1aef1e.js +0 -1
  687. package/dist/web/standalone/.next/static/css/123c0bb039697968.css +0 -1
  688. package/src/resources/extensions/gsd/auto-observability.ts +0 -74
  689. package/src/resources/extensions/gsd/observability-validator.ts +0 -456
  690. package/src/resources/extensions/gsd/roadmap-mutations.ts +0 -134
  691. package/src/resources/extensions/gsd/tests/doctor-task-done-missing-summary-slice-loop.test.ts +0 -174
  692. package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -474
  693. /package/dist/web/standalone/.next/static/{VvclDCW6TAWjEyLU-EYL1 → alS4hoANx0TK4UVZY27da}/_ssgManifest.js +0 -0
@@ -20,11 +20,11 @@ import {
20
20
  _getRegisteredLockDirs,
21
21
  } from '../session-lock.ts';
22
22
  import { gsdRoot } from '../paths.ts';
23
- import { createTestContext } from './test-helpers.ts';
23
+ import { describe, test } from 'node:test';
24
+ import assert from 'node:assert/strict';
24
25
 
25
- const { assertEq, assertTrue, report } = createTestContext();
26
26
 
27
- async function main(): Promise<void> {
27
+ describe('session-lock-multipath', async () => {
28
28
 
29
29
  // ─── 1. Lock dir registry tracks gsdDir on acquisition ──────────────────
30
30
  console.log('\n=== 1. Lock dir registry tracks gsdDir on acquisition ===');
@@ -34,17 +34,17 @@ async function main(): Promise<void> {
34
34
 
35
35
  try {
36
36
  const result = acquireSessionLock(base);
37
- assertTrue(result.acquired, 'lock acquired');
37
+ assert.ok(result.acquired, 'lock acquired');
38
38
 
39
39
  const registered = _getRegisteredLockDirs();
40
40
  const gsdDir = gsdRoot(base);
41
- assertTrue(registered.includes(gsdDir), 'gsdDir is registered in lock dir registry');
41
+ assert.ok(registered.includes(gsdDir), 'gsdDir is registered in lock dir registry');
42
42
 
43
43
  releaseSessionLock(base);
44
44
 
45
45
  // After release, registry should be cleared
46
46
  const afterRelease = _getRegisteredLockDirs();
47
- assertEq(afterRelease.length, 0, 'lock dir registry cleared after release');
47
+ assert.deepStrictEqual(afterRelease.length, 0, 'lock dir registry cleared after release');
48
48
  } finally {
49
49
  rmSync(base, { recursive: true, force: true });
50
50
  }
@@ -62,7 +62,7 @@ async function main(): Promise<void> {
62
62
 
63
63
  try {
64
64
  const result = acquireSessionLock(base);
65
- assertTrue(result.acquired, 'lock acquired');
65
+ assert.ok(result.acquired, 'lock acquired');
66
66
 
67
67
  // Manually plant a stale lock file at the secondary path to simulate
68
68
  // multi-path lock accumulation
@@ -72,8 +72,8 @@ async function main(): Promise<void> {
72
72
  mkdirSync(secondaryLockDir, { recursive: true });
73
73
 
74
74
  // Verify they exist before release
75
- assertTrue(existsSync(secondaryLockFile), 'secondary lock file exists before release');
76
- assertTrue(existsSync(secondaryLockDir), 'secondary lock dir exists before release');
75
+ assert.ok(existsSync(secondaryLockFile), 'secondary lock file exists before release');
76
+ assert.ok(existsSync(secondaryLockDir), 'secondary lock dir exists before release');
77
77
 
78
78
  // Manually add the secondary dir to the registry (simulating ensureExitHandler call)
79
79
  // We do this by acquiring knowledge of internals — the registry is populated
@@ -83,10 +83,10 @@ async function main(): Promise<void> {
83
83
 
84
84
  // Primary lock artifacts should be cleaned
85
85
  const primaryLockFile = join(gsdRoot(base), 'auto.lock');
86
- assertTrue(!existsSync(primaryLockFile), 'primary auto.lock removed after release');
86
+ assert.ok(!existsSync(primaryLockFile), 'primary auto.lock removed after release');
87
87
 
88
88
  const primaryLockDir = gsdRoot(base) + '.lock';
89
- assertTrue(!existsSync(primaryLockDir), 'primary .gsd.lock/ removed after release');
89
+ assert.ok(!existsSync(primaryLockDir), 'primary .gsd.lock/ removed after release');
90
90
  } finally {
91
91
  rmSync(base, { recursive: true, force: true });
92
92
  }
@@ -106,7 +106,7 @@ async function main(): Promise<void> {
106
106
  const gsdDir = gsdRoot(base);
107
107
  // Should only appear once (Set deduplication)
108
108
  const count = registered.filter(d => d === gsdDir).length;
109
- assertEq(count, 1, 'gsdDir registered exactly once after re-entrant acquisition');
109
+ assert.deepStrictEqual(count, 1, 'gsdDir registered exactly once after re-entrant acquisition');
110
110
 
111
111
  releaseSessionLock(base);
112
112
  } finally {
@@ -124,17 +124,17 @@ async function main(): Promise<void> {
124
124
 
125
125
  try {
126
126
  const r1 = acquireSessionLock(base1);
127
- assertTrue(r1.acquired, 'first base lock acquired');
127
+ assert.ok(r1.acquired, 'first base lock acquired');
128
128
 
129
129
  // Release first to acquire second (module state is single-lock)
130
130
  releaseSessionLock(base1);
131
131
 
132
132
  const r2 = acquireSessionLock(base2);
133
- assertTrue(r2.acquired, 'second base lock acquired');
133
+ assert.ok(r2.acquired, 'second base lock acquired');
134
134
 
135
135
  const registered = _getRegisteredLockDirs();
136
136
  const gsd2 = gsdRoot(base2);
137
- assertTrue(registered.includes(gsd2), 'second gsdDir is registered');
137
+ assert.ok(registered.includes(gsd2), 'second gsdDir is registered');
138
138
 
139
139
  releaseSessionLock(base2);
140
140
  } finally {
@@ -156,18 +156,11 @@ async function main(): Promise<void> {
156
156
  // Verify everything is clean
157
157
  const lockFile = join(gsdRoot(base), 'auto.lock');
158
158
  const lockDir = gsdRoot(base) + '.lock';
159
- assertTrue(!existsSync(lockFile), 'auto.lock cleaned');
160
- assertTrue(!existsSync(lockDir), '.gsd.lock/ cleaned');
161
- assertEq(_getRegisteredLockDirs().length, 0, 'registry empty');
159
+ assert.ok(!existsSync(lockFile), 'auto.lock cleaned');
160
+ assert.ok(!existsSync(lockDir), '.gsd.lock/ cleaned');
161
+ assert.deepStrictEqual(_getRegisteredLockDirs().length, 0, 'registry empty');
162
162
  } finally {
163
163
  rmSync(base, { recursive: true, force: true });
164
164
  }
165
165
  }
166
-
167
- report();
168
- }
169
-
170
- main().catch((error) => {
171
- console.error(error);
172
- process.exit(1);
173
166
  });
@@ -25,9 +25,9 @@ import {
25
25
  isSessionLockHeld,
26
26
  } from '../session-lock.ts';
27
27
  import { gsdRoot } from '../paths.ts';
28
- import { createTestContext } from './test-helpers.ts';
28
+ import { describe, test } from 'node:test';
29
+ import assert from 'node:assert/strict';
29
30
 
30
- const { assertEq, assertTrue, report } = createTestContext();
31
31
  const require = createRequire(import.meta.url);
32
32
 
33
33
  function hasProperLockfile(): boolean {
@@ -41,7 +41,7 @@ function hasProperLockfile(): boolean {
41
41
 
42
42
  const properLockfileAvailable = hasProperLockfile();
43
43
 
44
- async function main(): Promise<void> {
44
+ describe('session-lock-regression', async () => {
45
45
 
46
46
  // ─── 1. Basic acquire/release lifecycle ───────────────────────────────
47
47
  console.log('\n=== 1. acquire → validate → release lifecycle ===');
@@ -51,22 +51,22 @@ async function main(): Promise<void> {
51
51
 
52
52
  try {
53
53
  const result = acquireSessionLock(base);
54
- assertTrue(result.acquired, 'lock acquired successfully');
54
+ assert.ok(result.acquired, 'lock acquired successfully');
55
55
 
56
56
  const valid = validateSessionLock(base);
57
- assertTrue(valid, 'lock validates after acquisition');
57
+ assert.ok(valid, 'lock validates after acquisition');
58
58
 
59
- assertTrue(isSessionLockHeld(base), 'isSessionLockHeld returns true');
59
+ assert.ok(isSessionLockHeld(base), 'isSessionLockHeld returns true');
60
60
 
61
61
  releaseSessionLock(base);
62
62
 
63
63
  // After release, the lock file should be cleaned up
64
64
  const lockFile = join(gsdRoot(base), 'auto.lock');
65
- assertTrue(!existsSync(lockFile), 'lock file removed after release');
65
+ assert.ok(!existsSync(lockFile), 'lock file removed after release');
66
66
 
67
67
  // The .gsd.lock/ directory should be cleaned up
68
68
  const lockDir = gsdRoot(base) + '.lock';
69
- assertTrue(!existsSync(lockDir), '.gsd.lock/ directory removed after release (#1245)');
69
+ assert.ok(!existsSync(lockDir), '.gsd.lock/ directory removed after release (#1245)');
70
70
  } finally {
71
71
  rmSync(base, { recursive: true, force: true });
72
72
  }
@@ -88,7 +88,7 @@ async function main(): Promise<void> {
88
88
  } catch {
89
89
  threw = true;
90
90
  }
91
- assertTrue(!threw, 'double release does not throw');
91
+ assert.ok(!threw, 'double release does not throw');
92
92
  } finally {
93
93
  rmSync(base, { recursive: true, force: true });
94
94
  }
@@ -106,13 +106,13 @@ async function main(): Promise<void> {
106
106
  updateSessionLock(base, 'execute-task', 'M001/S01/T01', 5, '/tmp/session.json');
107
107
 
108
108
  const data = readSessionLockData(base);
109
- assertTrue(data !== null, 'lock data readable after update');
109
+ assert.ok(data !== null, 'lock data readable after update');
110
110
  if (data) {
111
- assertEq(data.pid, process.pid, 'lock data has correct PID');
112
- assertEq(data.unitType, 'execute-task', 'lock data has correct unit type');
113
- assertEq(data.unitId, 'M001/S01/T01', 'lock data has correct unit ID');
114
- assertEq(data.completedUnits, 5, 'lock data has correct completed count');
115
- assertEq(data.sessionFile, '/tmp/session.json', 'lock data has session file');
111
+ assert.deepStrictEqual(data.pid, process.pid, 'lock data has correct PID');
112
+ assert.deepStrictEqual(data.unitType, 'execute-task', 'lock data has correct unit type');
113
+ assert.deepStrictEqual(data.unitId, 'M001/S01/T01', 'lock data has correct unit ID');
114
+ assert.deepStrictEqual(data.completedUnits, 5, 'lock data has correct completed count');
115
+ assert.deepStrictEqual(data.sessionFile, '/tmp/session.json', 'lock data has session file');
116
116
  }
117
117
 
118
118
  releaseSessionLock(base);
@@ -142,7 +142,7 @@ async function main(): Promise<void> {
142
142
 
143
143
  // Should be able to acquire despite the stale lock
144
144
  const result = acquireSessionLock(base);
145
- assertTrue(result.acquired, '#1245: stale lock from dead PID → re-acquirable');
145
+ assert.ok(result.acquired, '#1245: stale lock from dead PID → re-acquirable');
146
146
 
147
147
  releaseSessionLock(base);
148
148
  } finally {
@@ -158,7 +158,7 @@ async function main(): Promise<void> {
158
158
 
159
159
  try {
160
160
  const data = readSessionLockData(base);
161
- assertEq(data, null, 'no lock file → null');
161
+ assert.deepStrictEqual(data, null, 'no lock file → null');
162
162
  } finally {
163
163
  rmSync(base, { recursive: true, force: true });
164
164
  }
@@ -176,7 +176,7 @@ async function main(): Promise<void> {
176
176
  // Multiple validations should all return true (regression for #1257)
177
177
  for (let i = 0; i < 5; i++) {
178
178
  const valid = validateSessionLock(base);
179
- assertTrue(valid, `#1257: validation ${i + 1} returns true for own lock`);
179
+ assert.ok(valid, `#1257: validation ${i + 1} returns true for own lock`);
180
180
  }
181
181
 
182
182
  releaseSessionLock(base);
@@ -196,7 +196,7 @@ async function main(): Promise<void> {
196
196
  writeFileSync(lockFile, 'NOT VALID JSON {{{');
197
197
 
198
198
  const data = readSessionLockData(base);
199
- assertEq(data, null, 'corrupt JSON → null');
199
+ assert.deepStrictEqual(data, null, 'corrupt JSON → null');
200
200
  } finally {
201
201
  rmSync(base, { recursive: true, force: true });
202
202
  }
@@ -210,9 +210,9 @@ async function main(): Promise<void> {
210
210
 
211
211
  try {
212
212
  const status = getSessionLockStatus(base);
213
- assertEq(status.valid, false, 'missing lock metadata is invalid');
214
- assertEq(status.failureReason, 'missing-metadata', 'missing metadata reason is surfaced');
215
- assertEq(status.expectedPid, process.pid, 'expected PID is included');
213
+ assert.deepStrictEqual(status.valid, false, 'missing lock metadata is invalid');
214
+ assert.deepStrictEqual(status.failureReason, 'missing-metadata', 'missing metadata reason is surfaced');
215
+ assert.deepStrictEqual(status.expectedPid, process.pid, 'expected PID is included');
216
216
  } finally {
217
217
  rmSync(base, { recursive: true, force: true });
218
218
  }
@@ -237,10 +237,10 @@ async function main(): Promise<void> {
237
237
  }, null, 2));
238
238
 
239
239
  const status = getSessionLockStatus(base);
240
- assertEq(status.valid, false, 'foreign PID lock is invalid');
241
- assertEq(status.failureReason, 'pid-mismatch', 'PID mismatch reason is surfaced');
242
- assertEq(status.existingPid, foreignPid, 'existing PID is included');
243
- assertEq(status.expectedPid, process.pid, 'expected PID is included');
240
+ assert.deepStrictEqual(status.valid, false, 'foreign PID lock is invalid');
241
+ assert.deepStrictEqual(status.failureReason, 'pid-mismatch', 'PID mismatch reason is surfaced');
242
+ assert.deepStrictEqual(status.existingPid, foreignPid, 'existing PID is included');
243
+ assert.deepStrictEqual(status.expectedPid, process.pid, 'expected PID is included');
244
244
  } finally {
245
245
  rmSync(base, { recursive: true, force: true });
246
246
  }
@@ -254,11 +254,11 @@ async function main(): Promise<void> {
254
254
 
255
255
  try {
256
256
  const r1 = acquireSessionLock(base);
257
- assertTrue(r1.acquired, 'first acquisition');
257
+ assert.ok(r1.acquired, 'first acquisition');
258
258
  releaseSessionLock(base);
259
259
 
260
260
  const r2 = acquireSessionLock(base);
261
- assertTrue(r2.acquired, 're-acquisition after release');
261
+ assert.ok(r2.acquired, 're-acquisition after release');
262
262
  releaseSessionLock(base);
263
263
  } finally {
264
264
  rmSync(base, { recursive: true, force: true });
@@ -273,13 +273,13 @@ async function main(): Promise<void> {
273
273
 
274
274
  try {
275
275
  const r1 = acquireSessionLock(base);
276
- assertTrue(r1.acquired, 'first acquisition succeeds');
276
+ assert.ok(r1.acquired, 'first acquisition succeeds');
277
277
 
278
278
  const r2 = acquireSessionLock(base);
279
- assertTrue(r2.acquired, 're-entrant acquisition succeeds');
279
+ assert.ok(r2.acquired, 're-entrant acquisition succeeds');
280
280
 
281
281
  const valid = validateSessionLock(base);
282
- assertTrue(valid, 're-entrant acquisition does not corrupt validation state');
282
+ assert.ok(valid, 're-entrant acquisition does not corrupt validation state');
283
283
 
284
284
  releaseSessionLock(base);
285
285
  } finally {
@@ -295,31 +295,24 @@ async function main(): Promise<void> {
295
295
 
296
296
  try {
297
297
  const r1 = acquireSessionLock(base);
298
- assertTrue(r1.acquired, 'first acquisition succeeds');
298
+ assert.ok(r1.acquired, 'first acquisition succeeds');
299
299
 
300
300
  const lockDir = gsdRoot(base) + '.lock';
301
301
  if (properLockfileAvailable) {
302
- assertTrue(existsSync(lockDir), '.gsd.lock/ exists after first acquisition');
302
+ assert.ok(existsSync(lockDir), '.gsd.lock/ exists after first acquisition');
303
303
  }
304
304
 
305
305
  const r2 = acquireSessionLock(base);
306
- assertTrue(r2.acquired, 'second acquisition succeeds');
306
+ assert.ok(r2.acquired, 'second acquisition succeeds');
307
307
  if (properLockfileAvailable) {
308
- assertTrue(existsSync(lockDir), '.gsd.lock/ exists after re-entrant acquisition');
308
+ assert.ok(existsSync(lockDir), '.gsd.lock/ exists after re-entrant acquisition');
309
309
  }
310
- assertTrue(validateSessionLock(base), 'lock remains valid after re-entrant acquisition');
310
+ assert.ok(validateSessionLock(base), 'lock remains valid after re-entrant acquisition');
311
311
 
312
312
  releaseSessionLock(base);
313
- assertTrue(!existsSync(lockDir), '.gsd.lock/ is removed after release');
313
+ assert.ok(!existsSync(lockDir), '.gsd.lock/ is removed after release');
314
314
  } finally {
315
315
  rmSync(base, { recursive: true, force: true });
316
316
  }
317
317
  }
318
-
319
- report();
320
- }
321
-
322
- main().catch((error) => {
323
- console.error(error);
324
- process.exit(1);
325
318
  });
@@ -0,0 +1,209 @@
1
+ // shared-wal.test.ts — Tests for shared WAL DB path resolution and concurrent writes.
2
+ // Verifies: resolveProjectRootDbPath() for worktree/root paths, WAL concurrent writes.
3
+
4
+ import { mkdtempSync, mkdirSync, rmSync } from 'node:fs';
5
+ import { join, sep } from 'node:path';
6
+ import { tmpdir } from 'node:os';
7
+
8
+ import { resolveProjectRootDbPath } from '../bootstrap/dynamic-tools.ts';
9
+ import {
10
+ openDatabase,
11
+ closeDatabase,
12
+ transaction,
13
+ insertMilestone,
14
+ getAllMilestones,
15
+ _getAdapter,
16
+ } from '../gsd-db.ts';
17
+ import { describe, test } from 'node:test';
18
+ import assert from 'node:assert/strict';
19
+
20
+
21
+ // ─── Helpers ──────────────────────────────────────────────────────────────
22
+
23
+ function createTmpDir(suffix: string): string {
24
+ return mkdtempSync(join(tmpdir(), `gsd-wal-${suffix}-`));
25
+ }
26
+
27
+ function cleanup(dir: string): void {
28
+ rmSync(dir, { recursive: true, force: true });
29
+ }
30
+
31
+ // ─── Tests ────────────────────────────────────────────────────────────────
32
+
33
+ describe('shared-wal', async () => {
34
+ // ─── Test (a): resolveProjectRootDbPath returns project root DB for worktree path ───
35
+ console.log('\n=== shared-wal: resolve worktree path to project root DB ===');
36
+ {
37
+ const projectRoot = '/home/user/myproject';
38
+ const worktreePath = join(projectRoot, '.gsd', 'worktrees', 'M001');
39
+ const result = resolveProjectRootDbPath(worktreePath);
40
+ assert.deepStrictEqual(result, join(projectRoot, '.gsd', 'gsd.db'),
41
+ 'worktree path resolves to project root DB');
42
+ }
43
+
44
+ // ─── Test (b): resolveProjectRootDbPath returns same base for project root ────
45
+ console.log('\n=== shared-wal: resolve project root path ===');
46
+ {
47
+ const projectRoot = '/home/user/myproject';
48
+ const result = resolveProjectRootDbPath(projectRoot);
49
+ assert.deepStrictEqual(result, join(projectRoot, '.gsd', 'gsd.db'),
50
+ 'project root path stays at project root DB');
51
+ }
52
+
53
+ // ─── Test (c): resolve nested worktree subdir ──────────────────────────
54
+ console.log('\n=== shared-wal: resolve nested worktree subdir ===');
55
+ {
56
+ const projectRoot = '/home/user/myproject';
57
+ const nestedPath = join(projectRoot, '.gsd', 'worktrees', 'M002', 'src', 'lib');
58
+ const result = resolveProjectRootDbPath(nestedPath);
59
+ assert.deepStrictEqual(result, join(projectRoot, '.gsd', 'gsd.db'),
60
+ 'nested worktree subdir resolves to project root DB');
61
+ }
62
+
63
+ // ─── Test (d): resolve with forward slashes (cross-platform) ──────────
64
+ console.log('\n=== shared-wal: resolve forward-slash path ===');
65
+ {
66
+ const result = resolveProjectRootDbPath('/proj/.gsd/worktrees/M001');
67
+ assert.deepStrictEqual(result, join('/proj', '.gsd', 'gsd.db'),
68
+ 'forward-slash worktree path resolves correctly');
69
+ }
70
+
71
+ // ─── Test (e): Concurrent writes — 3 connections to same WAL DB ───────
72
+ console.log('\n=== shared-wal: concurrent writes via WAL ===');
73
+ {
74
+ const tmp = createTmpDir('concurrent');
75
+ const dbPath = join(tmp, 'test.db');
76
+ try {
77
+ // Open with openDatabase to init schema + WAL mode
78
+ openDatabase(dbPath);
79
+
80
+ // Insert milestones from the main connection
81
+ insertMilestone({
82
+ id: 'M001', title: 'From conn 1', status: 'active',
83
+ });
84
+
85
+ // Open two additional raw connections via openDatabase in separate calls.
86
+ // Since openDatabase closes the previous connection and opens a new one,
87
+ // we simulate concurrent access by using the transaction() wrapper to
88
+ // verify WAL allows reads while writes are happening.
89
+
90
+ // Write M002
91
+ insertMilestone({
92
+ id: 'M002', title: 'From conn 2', status: 'active',
93
+ });
94
+
95
+ // Write M003
96
+ insertMilestone({
97
+ id: 'M003', title: 'From conn 3', status: 'active',
98
+ });
99
+
100
+ // Verify all 3 milestones are visible
101
+ const all = getAllMilestones();
102
+ assert.deepStrictEqual(all.length, 3, 'concurrent: all 3 milestones visible');
103
+ const ids = all.map(m => m.id).sort();
104
+ assert.deepStrictEqual(ids, ['M001', 'M002', 'M003'], 'concurrent: correct IDs');
105
+
106
+ closeDatabase();
107
+ } finally {
108
+ closeDatabase();
109
+ cleanup(tmp);
110
+ }
111
+ }
112
+
113
+ // ─── Test (f): WAL concurrent — multiple raw connections to file DB ────
114
+ console.log('\n=== shared-wal: true concurrent connections via raw SQLite ===');
115
+ {
116
+ const tmp = createTmpDir('rawconc');
117
+ const dbPath = join(tmp, 'concurrent.db');
118
+ try {
119
+ // Open first connection and init schema
120
+ openDatabase(dbPath);
121
+ closeDatabase();
122
+
123
+ // To test true concurrent access, we open 3 separate raw connections
124
+ // using the same provider. The openDatabase/closeDatabase cycle proves
125
+ // WAL mode persists and multiple sequential openers see each other's writes.
126
+
127
+ // Connection 1: write M001
128
+ openDatabase(dbPath);
129
+ insertMilestone({ id: 'M001', title: 'Writer 1', status: 'active' });
130
+ closeDatabase();
131
+
132
+ // Connection 2: write M002, verify sees M001
133
+ openDatabase(dbPath);
134
+ const afterConn2Before = getAllMilestones();
135
+ assert.ok(afterConn2Before.some(m => m.id === 'M001'),
136
+ 'rawconc: conn2 sees M001 from conn1');
137
+ insertMilestone({ id: 'M002', title: 'Writer 2', status: 'active' });
138
+ closeDatabase();
139
+
140
+ // Connection 3: write M003, verify sees M001 + M002
141
+ openDatabase(dbPath);
142
+ const afterConn3Before = getAllMilestones();
143
+ assert.ok(afterConn3Before.some(m => m.id === 'M001'),
144
+ 'rawconc: conn3 sees M001');
145
+ assert.ok(afterConn3Before.some(m => m.id === 'M002'),
146
+ 'rawconc: conn3 sees M002');
147
+ insertMilestone({ id: 'M003', title: 'Writer 3', status: 'active' });
148
+
149
+ // Final read: all 3 visible
150
+ const finalAll = getAllMilestones();
151
+ assert.deepStrictEqual(finalAll.length, 3, 'rawconc: all 3 milestones visible');
152
+ assert.deepStrictEqual(
153
+ finalAll.map(m => m.id).sort(),
154
+ ['M001', 'M002', 'M003'],
155
+ 'rawconc: all IDs present',
156
+ );
157
+
158
+ closeDatabase();
159
+ } finally {
160
+ closeDatabase();
161
+ cleanup(tmp);
162
+ }
163
+ }
164
+
165
+ // ─── Test (g): BUSY retry — transaction wrapper handles contention ─────
166
+ console.log('\n=== shared-wal: transaction rollback on error ===');
167
+ {
168
+ const tmp = createTmpDir('busy');
169
+ const dbPath = join(tmp, 'busy.db');
170
+ try {
171
+ openDatabase(dbPath);
172
+
173
+ // Insert a milestone in a transaction
174
+ transaction(() => {
175
+ insertMilestone({ id: 'M001', title: 'In txn', status: 'active' });
176
+ });
177
+
178
+ // Verify it committed
179
+ const all = getAllMilestones();
180
+ assert.deepStrictEqual(all.length, 1, 'busy: M001 committed via transaction');
181
+
182
+ // Verify transaction rolls back on error
183
+ let errorCaught = false;
184
+ try {
185
+ transaction(() => {
186
+ insertMilestone({ id: 'M002', title: 'Will fail', status: 'active' });
187
+ throw new Error('Simulated failure');
188
+ });
189
+ } catch (err) {
190
+ errorCaught = true;
191
+ assert.ok(
192
+ (err as Error).message.includes('Simulated failure'),
193
+ 'busy: error propagated from transaction',
194
+ );
195
+ }
196
+ assert.ok(errorCaught, 'busy: transaction threw on error');
197
+
198
+ // M002 should NOT be visible (rolled back)
199
+ const afterRollback = getAllMilestones();
200
+ assert.deepStrictEqual(afterRollback.length, 1, 'busy: M002 rolled back — still only 1 milestone');
201
+ assert.deepStrictEqual(afterRollback[0]!.id, 'M001', 'busy: only M001 survives');
202
+
203
+ closeDatabase();
204
+ } finally {
205
+ closeDatabase();
206
+ cleanup(tmp);
207
+ }
208
+ }
209
+ });
@@ -0,0 +1,63 @@
1
+ /**
2
+ * sqlite-unavailable-gate.test.ts — #2419
3
+ *
4
+ * When the SQLite provider fails to open, bootstrapAutoSession must
5
+ * refuse to start auto-mode. Otherwise gsd_task_complete returns
6
+ * "db_unavailable", artifact retry re-dispatches the same task, and
7
+ * the session loops forever.
8
+ *
9
+ * This test verifies the gate by reading auto-start.ts source and
10
+ * confirming the pattern: after the DB lifecycle block, if the DB
11
+ * file exists on disk but isDbAvailable() still returns false after
12
+ * the open attempt, bootstrap must abort with an error notification.
13
+ */
14
+
15
+ import { readFileSync } from "node:fs";
16
+ import { join } from "node:path";
17
+ import { createTestContext } from "./test-helpers.ts";
18
+
19
+ const { assertTrue, report } = createTestContext();
20
+
21
+ const srcPath = join(import.meta.dirname, "..", "auto-start.ts");
22
+ const src = readFileSync(srcPath, "utf-8");
23
+
24
+ console.log("\n=== #2419: SQLite unavailable gate in auto-start.ts ===");
25
+
26
+ // The DB lifecycle section tries to open the DB. After those try/catch
27
+ // blocks, there must be a HARD GATE: if the DB file exists on disk but
28
+ // isDbAvailable() is still false (open failed), bootstrap must abort
29
+ // by calling releaseLockAndReturn() with an error notification.
30
+
31
+ const dbLifecycleIdx = src.indexOf("DB lifecycle");
32
+ assertTrue(dbLifecycleIdx > 0, "auto-start.ts has a DB lifecycle section");
33
+
34
+ const afterDbLifecycle = src.slice(dbLifecycleIdx);
35
+
36
+ // Find the second isDbAvailable check — the one AFTER the open attempts.
37
+ // The first check at line ~543 tries to open the DB.
38
+ // There must be a SECOND check that gates bootstrap if it's still unavailable.
39
+ const firstCheck = afterDbLifecycle.indexOf("isDbAvailable()");
40
+ assertTrue(firstCheck > 0, "DB lifecycle section has isDbAvailable() check");
41
+
42
+ const afterFirstCheck = afterDbLifecycle.slice(firstCheck + "isDbAvailable()".length);
43
+ const secondCheck = afterFirstCheck.indexOf("isDbAvailable()");
44
+
45
+ assertTrue(
46
+ secondCheck > 0,
47
+ "auto-start.ts has a SECOND isDbAvailable() check after the open attempt — this is the gate (#2419)",
48
+ );
49
+
50
+ // The second check must lead to releaseLockAndReturn (abort bootstrap)
51
+ if (secondCheck > 0) {
52
+ const gateRegion = afterFirstCheck.slice(secondCheck, secondCheck + 500);
53
+ assertTrue(
54
+ gateRegion.includes("releaseLockAndReturn"),
55
+ "The DB availability gate calls releaseLockAndReturn() to abort bootstrap (#2419)",
56
+ );
57
+ assertTrue(
58
+ /database|sqlite|db.*unavailable/i.test(gateRegion),
59
+ "The DB availability gate includes a user-facing error message about the database (#2419)",
60
+ );
61
+ }
62
+
63
+ report();
@@ -19,9 +19,9 @@ import { mkdtempSync, mkdirSync, rmSync } from "node:fs";
19
19
  import { join } from "node:path";
20
20
  import { tmpdir } from "node:os";
21
21
  import { recoverTimedOutUnit, type RecoveryContext } from "../auto-timeout-recovery.ts";
22
- import { createTestContext } from './test-helpers.ts';
22
+ import { test } from 'node:test';
23
+ import assert from 'node:assert/strict';
23
24
 
24
- const { assertTrue, report } = createTestContext();
25
25
 
26
26
  // Minimal mock for ExtensionContext — only the fields recoverTimedOutUnit touches.
27
27
  function makeMockCtx() {
@@ -55,12 +55,12 @@ function makeMockPi() {
55
55
  await recoverTimedOutUnit(ctx, pi, "execute-task", "M001/S01/T01", "idle", emptyRctx);
56
56
  } catch (err: any) {
57
57
  crashed = true;
58
- assertTrue(
58
+ assert.ok(
59
59
  err.message.includes("path") || err.message.includes("string") || err.code === "ERR_INVALID_ARG_TYPE",
60
60
  `should crash with path/type error, got: ${err.message}`,
61
61
  );
62
62
  }
63
- assertTrue(crashed, "should crash when basePath is undefined (reproduces #1855)");
63
+ assert.ok(crashed, "should crash when basePath is undefined (reproduces #1855)");
64
64
  }
65
65
 
66
66
  // ═══ #1855: valid RecoveryContext does not crash ═════════════════════════════
@@ -90,13 +90,11 @@ function makeMockPi() {
90
90
  crashed = true;
91
91
  console.error(` Unexpected crash: ${err.message}`);
92
92
  }
93
- assertTrue(!crashed, "should not crash with valid basePath");
93
+ assert.ok(!crashed, "should not crash with valid basePath");
94
94
  // With no runtime record on disk and recoveryAttempts=0, the function
95
95
  // should attempt steering recovery (sendMessage) and return "recovered".
96
- assertTrue(result === "recovered", `should return 'recovered', got '${result}'`);
96
+ assert.ok(result === "recovered", `should return 'recovered', got '${result}'`);
97
97
  } finally {
98
98
  rmSync(base, { recursive: true, force: true });
99
99
  }
100
100
  }
101
-
102
- report();