@opengsd/gsd-pi 1.2.0-dev.0b870afa → 1.2.0-dev.23d85b63

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 (579) hide show
  1. package/dist/cli-model-override.d.ts +15 -0
  2. package/dist/cli-model-override.js +21 -0
  3. package/dist/cli.js +14 -19
  4. package/dist/headless-events.d.ts +16 -1
  5. package/dist/headless-events.js +19 -2
  6. package/dist/headless.js +8 -1
  7. package/dist/loader.js +6 -4
  8. package/dist/onboarding.js +9 -4
  9. package/dist/provider-migrations.d.ts +23 -0
  10. package/dist/provider-migrations.js +41 -0
  11. package/dist/register-agent-bundles.d.ts +11 -2
  12. package/dist/register-agent-bundles.js +18 -4
  13. package/dist/resource-loader.d.ts +10 -5
  14. package/dist/resource-loader.js +121 -6
  15. package/dist/resources/.managed-resources-content-hash +1 -1
  16. package/dist/resources/extensions/ask-user-questions.js +3 -2
  17. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
  18. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  19. package/dist/resources/extensions/google-cli/stream-adapter.js +16 -1
  20. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  21. package/dist/resources/extensions/gsd/auto/dispatch-history.js +21 -6
  22. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  23. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  24. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  25. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  26. package/dist/resources/extensions/gsd/auto/orchestrator.js +119 -18
  27. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  28. package/dist/resources/extensions/gsd/auto/phases.js +17 -2372
  29. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +542 -0
  30. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  31. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  32. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  33. package/dist/resources/extensions/gsd/auto-closeout-messaging.js +90 -0
  34. package/dist/resources/extensions/gsd/auto-dashboard.js +255 -431
  35. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +15 -3
  36. package/dist/resources/extensions/gsd/auto-dispatch.js +19 -1
  37. package/dist/resources/extensions/gsd/auto-model-selection.js +9 -6
  38. package/dist/resources/extensions/gsd/auto-post-unit.js +12 -8
  39. package/dist/resources/extensions/gsd/auto-prompts.js +5 -1
  40. package/dist/resources/extensions/gsd/auto-recovery.js +52 -6
  41. package/dist/resources/extensions/gsd/auto-start.js +28 -7
  42. package/dist/resources/extensions/gsd/auto-worktree.js +48 -3
  43. package/dist/resources/extensions/gsd/auto.js +83 -19
  44. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +4 -2
  45. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -7
  46. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +3 -1
  47. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +32 -3
  48. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +56 -16
  49. package/dist/resources/extensions/gsd/closeout-wizard.js +8 -3
  50. package/dist/resources/extensions/gsd/commands/handlers/core.js +22 -8
  51. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  52. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  53. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +8 -0
  54. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  55. package/dist/resources/extensions/gsd/config-overlay.js +11 -8
  56. package/dist/resources/extensions/gsd/db/engine.js +24 -6
  57. package/dist/resources/extensions/gsd/db/queries.js +30 -0
  58. package/dist/resources/extensions/gsd/db/writers/reconcile.js +19 -1
  59. package/dist/resources/extensions/gsd/db-migration-backup.js +51 -8
  60. package/dist/resources/extensions/gsd/db-transaction.js +27 -23
  61. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  62. package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
  63. package/dist/resources/extensions/gsd/doctor-git-checks.js +5 -1
  64. package/dist/resources/extensions/gsd/doctor-providers.js +1 -1
  65. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +11 -9
  66. package/dist/resources/extensions/gsd/gsd-db.js +15 -20
  67. package/dist/resources/extensions/gsd/guided-flow.js +88 -2
  68. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  69. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  70. package/dist/resources/extensions/gsd/memory-relations.js +1 -1
  71. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  72. package/dist/resources/extensions/gsd/notifications.js +12 -7
  73. package/dist/resources/extensions/gsd/preferences-models.js +17 -9
  74. package/dist/resources/extensions/gsd/preferences.js +91 -5
  75. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
  76. package/dist/resources/extensions/gsd/prompts/complete-slice.md +6 -2
  77. package/dist/resources/extensions/gsd/prompts/execute-task.md +7 -2
  78. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  79. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
  80. package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -1
  81. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  83. package/dist/resources/extensions/gsd/provider-error-guidance.js +24 -0
  84. package/dist/resources/extensions/gsd/session-lock.js +4 -3
  85. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  86. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +13 -6
  87. package/dist/resources/extensions/gsd/state.js +6 -2
  88. package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
  89. package/dist/resources/extensions/gsd/tools/complete-task.js +62 -0
  90. package/dist/resources/extensions/gsd/tools/exec-tool.js +2 -109
  91. package/dist/resources/extensions/gsd/tui/render-kit.js +38 -13
  92. package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
  93. package/dist/resources/extensions/gsd/unit-registry.js +34 -4
  94. package/dist/resources/extensions/gsd/workflow-logger.js +4 -0
  95. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  96. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  97. package/dist/resources/extensions/gsd/worktree-manager.js +101 -2
  98. package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
  99. package/dist/resources/extensions/gsd/worktree-shell-guard.js +113 -0
  100. package/dist/resources/extensions/gsd/worktree.js +8 -1
  101. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  102. package/dist/resources/extensions/search-the-web/index.js +41 -9
  103. package/dist/resources/extensions/search-the-web/native-search.js +18 -4
  104. package/dist/resources/extensions/shared/gsd-browser-cli.js +40 -2
  105. package/dist/resources/extensions/subagent/index.js +20 -15
  106. package/dist/resources/extensions/subagent/worktree-cwd.js +31 -0
  107. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  108. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  109. package/dist/runtime-checks.d.ts +10 -0
  110. package/dist/runtime-checks.js +27 -0
  111. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  112. package/dist/web/standalone/.next/BUILD_ID +1 -1
  113. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  114. package/dist/web/standalone/.next/build-manifest.json +2 -2
  115. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  116. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  125. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  133. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  134. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  135. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  136. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  137. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  138. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  139. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  140. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  141. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  142. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  143. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  144. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  145. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  146. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  147. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  149. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  150. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  153. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  155. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  158. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  159. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  165. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/index.html +1 -1
  167. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  169. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  171. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  172. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  174. package/dist/web/standalone/.next/server/chunks/{5942.js → 1128.js} +1 -1
  175. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  176. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  178. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  179. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  180. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  181. package/package.json +4 -4
  182. package/packages/cloud-mcp-gateway/package.json +2 -2
  183. package/packages/contracts/package.json +1 -1
  184. package/packages/daemon/package.json +4 -4
  185. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  186. package/packages/gsd-agent-core/dist/sdk.js +12 -6
  187. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  188. package/packages/gsd-agent-core/package.json +5 -5
  189. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts +5 -5
  190. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  191. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js +12 -24
  192. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js.map +1 -1
  193. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js +5 -5
  194. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js.map +1 -1
  195. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts +3 -3
  196. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  197. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js +20 -11
  198. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  199. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts +4 -3
  200. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts.map +1 -1
  201. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js +5 -54
  202. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js.map +1 -1
  203. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -4
  204. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  205. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js +2 -4
  206. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  207. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts +2 -0
  208. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  209. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js +4 -0
  210. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js.map +1 -1
  211. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts +9 -12
  212. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts.map +1 -1
  213. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js +100 -166
  214. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js.map +1 -1
  215. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts +2 -0
  216. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts.map +1 -0
  217. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js +4 -0
  218. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js.map +1 -0
  219. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts +23 -0
  220. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts.map +1 -0
  221. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js +178 -0
  222. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js.map +1 -0
  223. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +8 -0
  224. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  225. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +21 -9
  226. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
  227. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  228. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  229. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  230. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  231. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -3
  232. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  233. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js +2 -3
  234. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  235. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +11 -0
  236. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  237. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +85 -19
  238. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  239. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +71 -3
  240. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  241. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +257 -37
  242. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts +3 -3
  244. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  245. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js +19 -19
  246. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js.map +1 -1
  247. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -0
  248. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  249. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +26 -10
  250. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  251. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.d.ts.map +1 -1
  252. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js +12 -1
  253. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js.map +1 -1
  254. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  255. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +5 -0
  256. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  257. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
  258. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js +3 -1
  259. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  260. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  261. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +3 -5
  262. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  263. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js +2 -2
  264. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
  265. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts +1 -0
  266. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  267. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +25 -0
  268. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  269. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.d.ts.map +1 -1
  270. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js +1 -0
  271. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js.map +1 -1
  272. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts +1 -0
  273. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts.map +1 -1
  274. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js +20 -49
  275. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js.map +1 -1
  276. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +4 -0
  277. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  278. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  279. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +10 -2
  280. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  281. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +48 -6
  282. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  283. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  284. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  285. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  286. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.d.ts.map +1 -1
  287. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js +0 -1
  288. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js.map +1 -1
  289. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  290. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -0
  291. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  292. package/packages/gsd-agent-modes/package.json +7 -7
  293. package/packages/mcp-server/README.md +12 -3
  294. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  295. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  296. package/packages/mcp-server/dist/cli-runner.js +137 -0
  297. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  298. package/packages/mcp-server/dist/cli.js +2 -58
  299. package/packages/mcp-server/dist/cli.js.map +1 -1
  300. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  301. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  302. package/packages/mcp-server/dist/pid-registry.js +459 -0
  303. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  304. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  305. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  306. package/packages/mcp-server/dist/probe-mode.js +10 -0
  307. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  308. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  309. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  310. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  311. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  312. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  313. package/packages/mcp-server/dist/workflow-tools.js +62 -43
  314. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  315. package/packages/mcp-server/package.json +5 -5
  316. package/packages/native/package.json +1 -1
  317. package/packages/pi-agent-core/dist/agent-loop.js +52 -2
  318. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  319. package/packages/pi-agent-core/package.json +1 -1
  320. package/packages/pi-ai/package.json +1 -1
  321. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +28 -2
  322. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
  323. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  325. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  326. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -1
  328. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  329. package/packages/pi-coding-agent/dist/core/extensions/runner.js +3 -1
  330. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  331. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  332. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  333. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  334. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  335. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  336. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  337. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  340. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  341. package/packages/pi-coding-agent/package.json +8 -8
  342. package/packages/pi-tui/README.md +15 -0
  343. package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
  344. package/packages/pi-tui/dist/autocomplete.js +6 -1
  345. package/packages/pi-tui/dist/autocomplete.js.map +1 -1
  346. package/packages/pi-tui/dist/components/input.js +1 -1
  347. package/packages/pi-tui/dist/components/input.js.map +1 -1
  348. package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
  349. package/packages/pi-tui/dist/components/loader.js +1 -0
  350. package/packages/pi-tui/dist/components/loader.js.map +1 -1
  351. package/packages/pi-tui/dist/components/select-list.d.ts.map +1 -1
  352. package/packages/pi-tui/dist/components/select-list.js +8 -2
  353. package/packages/pi-tui/dist/components/select-list.js.map +1 -1
  354. package/packages/pi-tui/dist/index.d.ts +2 -2
  355. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  356. package/packages/pi-tui/dist/index.js +2 -2
  357. package/packages/pi-tui/dist/index.js.map +1 -1
  358. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  359. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  360. package/packages/pi-tui/dist/terminal-image.js +54 -2
  361. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  362. package/packages/pi-tui/dist/terminal.d.ts +12 -0
  363. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  364. package/packages/pi-tui/dist/terminal.js +70 -25
  365. package/packages/pi-tui/dist/terminal.js.map +1 -1
  366. package/packages/pi-tui/dist/tui.d.ts +15 -0
  367. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  368. package/packages/pi-tui/dist/tui.js +106 -21
  369. package/packages/pi-tui/dist/tui.js.map +1 -1
  370. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  371. package/packages/pi-tui/dist/utils.js +110 -36
  372. package/packages/pi-tui/dist/utils.js.map +1 -1
  373. package/packages/pi-tui/package.json +2 -2
  374. package/packages/rpc-client/package.json +2 -2
  375. package/pkg/dist/theme/theme.d.ts.map +1 -1
  376. package/pkg/dist/theme/theme.js +45 -17
  377. package/pkg/dist/theme/theme.js.map +1 -1
  378. package/pkg/package.json +1 -1
  379. package/src/resources/extensions/ask-user-questions.ts +7 -2
  380. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +80 -0
  381. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
  382. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
  383. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  384. package/src/resources/extensions/google-cli/stream-adapter.ts +22 -1
  385. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  386. package/src/resources/extensions/gsd/auto/dispatch-history.ts +22 -6
  387. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  388. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  389. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  390. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  391. package/src/resources/extensions/gsd/auto/orchestrator.ts +140 -18
  392. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  393. package/src/resources/extensions/gsd/auto/phases.ts +58 -3061
  394. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +716 -0
  395. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  396. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  397. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  398. package/src/resources/extensions/gsd/auto-closeout-messaging.ts +90 -0
  399. package/src/resources/extensions/gsd/auto-dashboard.ts +310 -454
  400. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
  401. package/src/resources/extensions/gsd/auto-dispatch.ts +24 -2
  402. package/src/resources/extensions/gsd/auto-model-selection.ts +20 -5
  403. package/src/resources/extensions/gsd/auto-post-unit.ts +16 -9
  404. package/src/resources/extensions/gsd/auto-prompts.ts +5 -1
  405. package/src/resources/extensions/gsd/auto-recovery.ts +62 -8
  406. package/src/resources/extensions/gsd/auto-start.ts +44 -7
  407. package/src/resources/extensions/gsd/auto-worktree.ts +51 -3
  408. package/src/resources/extensions/gsd/auto.ts +118 -18
  409. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +6 -2
  410. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +56 -6
  411. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -1
  412. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +36 -3
  413. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +69 -16
  414. package/src/resources/extensions/gsd/closeout-wizard.ts +11 -2
  415. package/src/resources/extensions/gsd/commands/handlers/core.ts +27 -8
  416. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -2
  417. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  418. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +7 -0
  419. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  420. package/src/resources/extensions/gsd/config-overlay.ts +22 -9
  421. package/src/resources/extensions/gsd/db/engine.ts +26 -6
  422. package/src/resources/extensions/gsd/db/queries.ts +29 -0
  423. package/src/resources/extensions/gsd/db/writers/reconcile.ts +24 -1
  424. package/src/resources/extensions/gsd/db-migration-backup.ts +56 -7
  425. package/src/resources/extensions/gsd/db-transaction.ts +37 -20
  426. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  427. package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
  428. package/src/resources/extensions/gsd/doctor-git-checks.ts +4 -1
  429. package/src/resources/extensions/gsd/doctor-providers.ts +1 -1
  430. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +10 -10
  431. package/src/resources/extensions/gsd/gsd-db.ts +15 -19
  432. package/src/resources/extensions/gsd/guided-flow.ts +128 -2
  433. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  434. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  435. package/src/resources/extensions/gsd/memory-relations.ts +1 -1
  436. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  437. package/src/resources/extensions/gsd/notifications.ts +13 -6
  438. package/src/resources/extensions/gsd/preferences-models.ts +26 -8
  439. package/src/resources/extensions/gsd/preferences.ts +111 -5
  440. package/src/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
  441. package/src/resources/extensions/gsd/prompts/complete-slice.md +6 -2
  442. package/src/resources/extensions/gsd/prompts/execute-task.md +7 -2
  443. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  444. package/src/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
  445. package/src/resources/extensions/gsd/prompts/run-uat.md +7 -1
  446. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  447. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  448. package/src/resources/extensions/gsd/provider-error-guidance.ts +32 -0
  449. package/src/resources/extensions/gsd/session-lock.ts +8 -7
  450. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  451. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +23 -10
  452. package/src/resources/extensions/gsd/state.ts +7 -1
  453. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  454. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  455. package/src/resources/extensions/gsd/tests/auto-closeout-messaging.test.ts +71 -0
  456. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +68 -116
  457. package/src/resources/extensions/gsd/tests/auto-direct-dispatch-parse.test.ts +33 -0
  458. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
  459. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +7 -2
  460. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +16 -1
  461. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +89 -22
  462. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  463. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +97 -4
  464. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  465. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  466. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  467. package/src/resources/extensions/gsd/tests/auto-verification.test.ts +36 -0
  468. package/src/resources/extensions/gsd/tests/blocker-placeholder-logs.test.ts +218 -0
  469. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +6 -2
  470. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  471. package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +1 -0
  472. package/src/resources/extensions/gsd/tests/db-engine-logs.test.ts +207 -0
  473. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +68 -19
  474. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +59 -0
  475. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  476. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +2 -1
  477. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +62 -0
  478. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  479. package/src/resources/extensions/gsd/tests/dispatch-db-degradation-logs.test.ts +98 -0
  480. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +55 -0
  481. package/src/resources/extensions/gsd/tests/dispatch-logs.test.ts +103 -0
  482. package/src/resources/extensions/gsd/tests/dispatch-reactive-logs.test.ts +98 -0
  483. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  484. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +6 -4
  485. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  486. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  487. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -1
  488. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +40 -7
  489. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +19 -0
  490. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +16 -0
  491. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +75 -0
  492. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
  493. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  494. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +18 -0
  495. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +1 -0
  496. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  497. package/src/resources/extensions/gsd/tests/loop.test.ts +60 -0
  498. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  499. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  500. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  501. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  502. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  503. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  504. package/src/resources/extensions/gsd/tests/model-router.test.ts +139 -0
  505. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  506. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +13 -1
  507. package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +1 -1
  508. package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +335 -0
  509. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  510. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +5 -0
  511. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  512. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +1 -1
  513. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  514. package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +35 -4
  515. package/src/resources/extensions/gsd/tests/progress-strip-test-helpers.ts +79 -0
  516. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +2 -0
  517. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +11 -2
  518. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +15 -0
  519. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  520. package/src/resources/extensions/gsd/tests/reconcile-logs.test.ts +244 -0
  521. package/src/resources/extensions/gsd/tests/recovery-finalize-logs.test.ts +119 -0
  522. package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +428 -0
  523. package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +25 -0
  524. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  525. package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +5 -5
  526. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +7 -1
  527. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +68 -0
  528. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +3 -0
  529. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
  530. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  531. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  532. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +17 -1
  533. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  534. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  535. package/src/resources/extensions/gsd/tests/thinking-level-resolution.test.ts +1 -1
  536. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -2
  537. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
  538. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +40 -86
  539. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +44 -6
  540. package/src/resources/extensions/gsd/tests/uok-audit.test.ts +194 -0
  541. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  542. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  543. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
  544. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  545. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  546. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  547. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +36 -0
  548. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  549. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  550. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
  551. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  552. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +75 -3
  553. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  554. package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
  555. package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
  556. package/src/resources/extensions/gsd/tools/exec-tool.ts +2 -118
  557. package/src/resources/extensions/gsd/tui/render-kit.ts +56 -13
  558. package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
  559. package/src/resources/extensions/gsd/unit-registry.ts +34 -4
  560. package/src/resources/extensions/gsd/workflow-logger.ts +5 -0
  561. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  562. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  563. package/src/resources/extensions/gsd/worktree-manager.ts +97 -2
  564. package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
  565. package/src/resources/extensions/gsd/worktree-shell-guard.ts +123 -0
  566. package/src/resources/extensions/gsd/worktree.ts +7 -1
  567. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  568. package/src/resources/extensions/search-the-web/index.ts +45 -9
  569. package/src/resources/extensions/search-the-web/native-search.ts +16 -4
  570. package/src/resources/extensions/shared/gsd-browser-cli.ts +41 -2
  571. package/src/resources/extensions/subagent/index.ts +20 -15
  572. package/src/resources/extensions/subagent/tests/worktree-cwd.test.ts +57 -0
  573. package/src/resources/extensions/subagent/worktree-cwd.ts +35 -0
  574. package/src/resources/skills/create-skill/SKILL.md +3 -0
  575. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  576. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  577. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  578. /package/dist/web/standalone/.next/static/{T-LTxEw5wir5Lm5T3qEVd → Wn9u2NYq0cyUigB_3Z0_N}/_buildManifest.js +0 -0
  579. /package/dist/web/standalone/.next/static/{T-LTxEw5wir5Lm5T3qEVd → Wn9u2NYq0cyUigB_3Z0_N}/_ssgManifest.js +0 -0
@@ -9,7 +9,7 @@
9
9
  * integrate into the doctor pipeline via checkEnvironmentHealth().
10
10
  */
11
11
  import { existsSync, readFileSync, statSync } from "node:fs";
12
- import { execSync } from "node:child_process";
12
+ import { execFile, execSync } from "node:child_process";
13
13
  import { join } from "node:path";
14
14
  import { detectPythonExecutable } from "./python-resolver.js";
15
15
  import { projectRootFromWorktreePath } from "./worktree-root.js";
@@ -56,44 +56,49 @@ function commandExists(name, cwd) {
56
56
  /**
57
57
  * Check that Node.js version meets the project's engines requirement.
58
58
  */
59
- function checkNodeVersion(basePath) {
59
+ function readPackageEngineNode(basePath) {
60
60
  const pkgPath = join(basePath, "package.json");
61
61
  if (!existsSync(pkgPath))
62
62
  return null;
63
63
  try {
64
64
  const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
65
- const required = pkg.engines?.node;
66
- if (!required)
67
- return null;
68
- const currentVersion = tryExec("node --version", basePath);
69
- if (!currentVersion) {
70
- return { name: "node_version", status: "error", message: "Node.js not found in PATH" };
71
- }
72
- // Parse semver requirement (handles >=X.Y.Z format)
73
- const reqMatch = required.match(/>=?\s*(\d+)(?:\.(\d+))?/);
74
- if (!reqMatch)
75
- return null;
76
- const reqMajor = parseInt(reqMatch[1], 10);
77
- const reqMinor = parseInt(reqMatch[2] ?? "0", 10);
78
- const curMatch = currentVersion.match(/v?(\d+)\.(\d+)/);
79
- if (!curMatch)
80
- return null;
81
- const curMajor = parseInt(curMatch[1], 10);
82
- const curMinor = parseInt(curMatch[2], 10);
83
- if (curMajor < reqMajor || (curMajor === reqMajor && curMinor < reqMinor)) {
84
- return {
85
- name: "node_version",
86
- status: "warning",
87
- message: `Node.js ${currentVersion} does not meet requirement "${required}"`,
88
- detail: `Current: ${currentVersion}, Required: ${required}`,
89
- };
90
- }
91
- return { name: "node_version", status: "ok", message: `Node.js ${currentVersion}` };
65
+ return pkg.engines?.node ?? null;
92
66
  }
93
67
  catch {
94
68
  return null;
95
69
  }
96
70
  }
71
+ function buildNodeVersionResult(required, currentVersion) {
72
+ if (!currentVersion) {
73
+ return { name: "node_version", status: "error", message: "Node.js not found in PATH" };
74
+ }
75
+ // Parse semver requirement (handles >=X.Y.Z format)
76
+ const reqMatch = required.match(/>=?\s*(\d+)(?:\.(\d+))?/);
77
+ if (!reqMatch)
78
+ return null;
79
+ const reqMajor = parseInt(reqMatch[1], 10);
80
+ const reqMinor = parseInt(reqMatch[2] ?? "0", 10);
81
+ const curMatch = currentVersion.match(/v?(\d+)\.(\d+)/);
82
+ if (!curMatch)
83
+ return null;
84
+ const curMajor = parseInt(curMatch[1], 10);
85
+ const curMinor = parseInt(curMatch[2], 10);
86
+ if (curMajor < reqMajor || (curMajor === reqMajor && curMinor < reqMinor)) {
87
+ return {
88
+ name: "node_version",
89
+ status: "warning",
90
+ message: `Node.js ${currentVersion} does not meet requirement "${required}"`,
91
+ detail: `Current: ${currentVersion}, Required: ${required}`,
92
+ };
93
+ }
94
+ return { name: "node_version", status: "ok", message: `Node.js ${currentVersion}` };
95
+ }
96
+ function checkNodeVersion(basePath) {
97
+ const required = readPackageEngineNode(basePath);
98
+ if (!required)
99
+ return null;
100
+ return buildNodeVersionResult(required, tryExec("node --version", basePath));
101
+ }
97
102
  /**
98
103
  * Check if node_modules exists and is not stale vs the lockfile.
99
104
  */
@@ -184,20 +189,15 @@ function checkEnvFiles(basePath) {
184
189
  * Check for port conflicts on common dev server ports.
185
190
  * Only checks ports that appear in package.json scripts.
186
191
  */
187
- function checkPortConflicts(basePath) {
188
- // Only run on macOS/Linux lsof is not available on Windows
189
- if (process.platform === "win32")
190
- return [];
191
- const results = [];
192
- // Try to detect ports from package.json scripts
192
+ // Detect the dev ports worth checking from package.json scripts, falling back to
193
+ // common defaults. Returns an empty set when there's no Node project (no
194
+ // package.json) or a parse failure — the caller then skips port checks entirely,
195
+ // avoiding false positives from system services (e.g. macOS AirPlay on 5000, #1381).
196
+ function collectPortsToCheck(basePath) {
193
197
  const portsToCheck = new Set();
194
198
  const pkgPath = join(basePath, "package.json");
195
- if (!existsSync(pkgPath)) {
196
- // No package.json — this isn't a Node.js project. Skip port checks
197
- // entirely to avoid false positives from system services (e.g., macOS
198
- // AirPlay Receiver on port 5000). (#1381)
199
- return [];
200
- }
199
+ if (!existsSync(pkgPath))
200
+ return portsToCheck;
201
201
  try {
202
202
  const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
203
203
  const scripts = pkg.scripts ?? {};
@@ -211,11 +211,8 @@ function checkPortConflicts(basePath) {
211
211
  }
212
212
  }
213
213
  catch {
214
- // parse failed — skip port checks rather than using defaults
215
- return [];
214
+ return new Set();
216
215
  }
217
- // If no ports found in scripts, check common defaults.
218
- // Filter out port 5000 on macOS — AirPlay Receiver uses it by default (#1381).
219
216
  if (portsToCheck.size === 0) {
220
217
  for (const p of DEFAULT_DEV_PORTS) {
221
218
  if (p === 5000 && process.platform === "darwin")
@@ -223,30 +220,54 @@ function checkPortConflicts(basePath) {
223
220
  portsToCheck.add(p);
224
221
  }
225
222
  }
223
+ return portsToCheck;
224
+ }
225
+ // Parse a single `lsof -nP -iTCP -sTCP:LISTEN` scan and report which of the
226
+ // requested ports are in use. Replaces the old per-port lsof loop (up to ~14
227
+ // system-wide socket scans, ~350ms) with one scan + an in-memory lookup.
228
+ function buildPortConflictResults(lsofOut, portsToCheck) {
229
+ const results = [];
230
+ const listening = new Map();
231
+ if (lsofOut) {
232
+ for (const line of lsofOut.split("\n")) {
233
+ // COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
234
+ // e.g. `node 12345 user 23u IPv4 0x.. 0t0 TCP *:3000 (LISTEN)`
235
+ const portMatch = line.match(/:(\d+)(?:\s+\(LISTEN\))?\s*$/);
236
+ if (!portMatch)
237
+ continue;
238
+ const port = parseInt(portMatch[1], 10);
239
+ if (!Number.isFinite(port) || listening.has(port))
240
+ continue;
241
+ const cols = line.split(/\s+/);
242
+ listening.set(port, { command: cols[0] ?? "unknown", pid: cols[1] ?? "?" });
243
+ }
244
+ }
226
245
  for (const port of portsToCheck) {
227
- const result = tryExec(`lsof -i :${port} -sTCP:LISTEN -t`, basePath);
228
- if (result && result.length > 0) {
229
- // Get process name
230
- const nameResult = tryExec(`lsof -i :${port} -sTCP:LISTEN -Fp | head -2`, basePath);
231
- const processName = nameResult?.match(/p(\d+)\n?c?(.+)?/)?.[2] ?? "unknown";
246
+ const hit = listening.get(port);
247
+ if (hit) {
232
248
  results.push({
233
249
  name: "port_conflict",
234
250
  status: "warning",
235
- message: `Port ${port} is already in use by ${processName} (PID ${result.split("\n")[0]})`,
251
+ message: `Port ${port} is already in use by ${hit.command} (PID ${hit.pid})`,
236
252
  detail: `Kill the process or use a different port`,
237
253
  });
238
254
  }
239
255
  }
240
256
  return results;
241
257
  }
258
+ function checkPortConflicts(basePath) {
259
+ // Only run on macOS/Linux — lsof is not available on Windows
260
+ if (process.platform === "win32")
261
+ return [];
262
+ const portsToCheck = collectPortsToCheck(basePath);
263
+ if (portsToCheck.size === 0)
264
+ return [];
265
+ return buildPortConflictResults(tryExec("lsof -nP -iTCP -sTCP:LISTEN", basePath), portsToCheck);
266
+ }
242
267
  /**
243
268
  * Check available disk space on the working directory partition.
244
269
  */
245
- function checkDiskSpace(basePath) {
246
- // Only run on macOS/Linux
247
- if (process.platform === "win32")
248
- return null;
249
- const dfOutput = tryExec(`df -k "${basePath}" | tail -1`, basePath);
270
+ function buildDiskSpaceResult(dfOutput) {
250
271
  if (!dfOutput)
251
272
  return null;
252
273
  try {
@@ -267,11 +288,7 @@ function checkDiskSpace(basePath) {
267
288
  };
268
289
  }
269
290
  if (availBytes < MIN_DISK_BYTES * 4) {
270
- return {
271
- name: "disk_space",
272
- status: "warning",
273
- message: `Disk space getting low: ${availGB}GB free`,
274
- };
291
+ return { name: "disk_space", status: "warning", message: `Disk space getting low: ${availGB}GB free` };
275
292
  }
276
293
  return { name: "disk_space", status: "ok", message: `${availGB}GB free` };
277
294
  }
@@ -279,16 +296,24 @@ function checkDiskSpace(basePath) {
279
296
  return null;
280
297
  }
281
298
  }
299
+ function checkDiskSpace(basePath) {
300
+ // Only run on macOS/Linux
301
+ if (process.platform === "win32")
302
+ return null;
303
+ return buildDiskSpaceResult(tryExec(`df -k "${basePath}" | tail -1`, basePath));
304
+ }
282
305
  /**
283
306
  * Check if Docker is available when project has a Dockerfile.
284
307
  */
285
- function checkDocker(basePath) {
286
- const hasDockerfile = existsSync(join(basePath, "Dockerfile")) ||
308
+ function hasDockerConfig(basePath) {
309
+ return existsSync(join(basePath, "Dockerfile")) ||
287
310
  existsSync(join(basePath, "docker-compose.yml")) ||
288
311
  existsSync(join(basePath, "docker-compose.yaml")) ||
289
312
  existsSync(join(basePath, "compose.yml")) ||
290
313
  existsSync(join(basePath, "compose.yaml"));
291
- if (!hasDockerfile)
314
+ }
315
+ function checkDocker(basePath) {
316
+ if (!hasDockerConfig(basePath))
292
317
  return null;
293
318
  if (!commandExists("docker", basePath)) {
294
319
  return {
@@ -308,74 +333,62 @@ function checkDocker(basePath) {
308
333
  }
309
334
  return { name: "docker", status: "ok", message: `Docker ${info}` };
310
335
  }
311
- /**
312
- * Check for common project tools that should be available.
313
- */
314
- function checkProjectTools(basePath) {
315
- const results = [];
336
+ // Decide which project tools to verify from package.json + marker files (pure fs).
337
+ // The actual `command -v` probes are left to the sync/async checkers so both share
338
+ // this logic.
339
+ function readProjectToolSpec(basePath) {
316
340
  const pkgPath = join(basePath, "package.json");
317
341
  if (!existsSync(pkgPath))
318
- return results;
342
+ return null;
319
343
  try {
320
344
  const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
321
- const allDeps = {
322
- ...(pkg.dependencies ?? {}),
323
- ...(pkg.devDependencies ?? {}),
324
- };
325
- // Check for package manager
326
- const packageManager = pkg.packageManager;
327
- if (packageManager) {
328
- const managerName = packageManager.split("@")[0];
329
- if (managerName && managerName !== "npm" && !commandExists(managerName, basePath)) {
330
- results.push({
331
- name: "package_manager",
332
- status: "warning",
333
- message: `Project requires ${managerName} but it's not installed`,
334
- detail: `Install with: npm install -g ${managerName}`,
335
- });
336
- }
337
- }
338
- // Check for TypeScript if it's a dependency
339
- if (allDeps["typescript"] && !existsSync(join(basePath, "node_modules", ".bin", "tsc"))) {
340
- results.push({
341
- name: "typescript",
342
- status: "warning",
343
- message: "TypeScript is a dependency but tsc is not available (run npm install)",
344
- });
345
- }
346
- // Check for Python if pyproject.toml or requirements.txt exists
347
- if (existsSync(join(basePath, "pyproject.toml")) || existsSync(join(basePath, "requirements.txt"))) {
348
- if (detectPythonExecutable() === null) {
349
- results.push({
350
- name: "python",
351
- status: "warning",
352
- message: "Project has Python config but python is not installed",
353
- });
354
- }
355
- }
356
- // Check for Rust if Cargo.toml exists
357
- if (existsSync(join(basePath, "Cargo.toml"))) {
358
- if (!commandExists("cargo", basePath)) {
359
- results.push({
360
- name: "cargo",
361
- status: "warning",
362
- message: "Project has Cargo.toml but cargo is not installed",
363
- });
364
- }
365
- }
366
- // Check for Go if go.mod exists
367
- if (existsSync(join(basePath, "go.mod"))) {
368
- if (!commandExists("go", basePath)) {
369
- results.push({
370
- name: "go",
371
- status: "warning",
372
- message: "Project has go.mod but go is not installed",
373
- });
374
- }
345
+ const allDeps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };
346
+ let packageManager = null;
347
+ if (pkg.packageManager) {
348
+ const managerName = String(pkg.packageManager).split("@")[0];
349
+ if (managerName && managerName !== "npm")
350
+ packageManager = managerName;
375
351
  }
352
+ return {
353
+ packageManager,
354
+ needsTsc: Boolean(allDeps["typescript"]) && !existsSync(join(basePath, "node_modules", ".bin", "tsc")),
355
+ needsPython: existsSync(join(basePath, "pyproject.toml")) || existsSync(join(basePath, "requirements.txt")),
356
+ needsCargo: existsSync(join(basePath, "Cargo.toml")),
357
+ needsGo: existsSync(join(basePath, "go.mod")),
358
+ };
376
359
  }
377
360
  catch {
378
- // parse failed — skip
361
+ return null;
362
+ }
363
+ }
364
+ function checkProjectTools(basePath) {
365
+ const spec = readProjectToolSpec(basePath);
366
+ if (!spec)
367
+ return [];
368
+ const results = [];
369
+ if (spec.packageManager && !commandExists(spec.packageManager, basePath)) {
370
+ results.push({
371
+ name: "package_manager",
372
+ status: "warning",
373
+ message: `Project requires ${spec.packageManager} but it's not installed`,
374
+ detail: `Install with: npm install -g ${spec.packageManager}`,
375
+ });
376
+ }
377
+ if (spec.needsTsc) {
378
+ results.push({
379
+ name: "typescript",
380
+ status: "warning",
381
+ message: "TypeScript is a dependency but tsc is not available (run npm install)",
382
+ });
383
+ }
384
+ if (spec.needsPython && detectPythonExecutable() === null) {
385
+ results.push({ name: "python", status: "warning", message: "Project has Python config but python is not installed" });
386
+ }
387
+ if (spec.needsCargo && !commandExists("cargo", basePath)) {
388
+ results.push({ name: "cargo", status: "warning", message: "Project has Cargo.toml but cargo is not installed" });
389
+ }
390
+ if (spec.needsGo && !commandExists("go", basePath)) {
391
+ results.push({ name: "go", status: "warning", message: "Project has go.mod but go is not installed" });
379
392
  }
380
393
  return results;
381
394
  }
@@ -461,6 +474,124 @@ function checkTestHealth(basePath) {
461
474
  * Run all environment health checks. Returns structured results for
462
475
  * integration with the doctor pipeline.
463
476
  */
477
+ // ── Async variants ─────────────────────────────────────────────────────────
478
+ // The always-on health widget refreshes off the first-paint path, but the sync
479
+ // `runEnvironmentChecks` blocks the event loop on its subprocess checks (~300ms,
480
+ // and again every 60s). These async siblings run the same checks via non-blocking
481
+ // `execFile` and fan the independent ones out concurrently, so the UI thread never
482
+ // stalls. The sync API above is unchanged for /gsd doctor and the dashboards.
483
+ function tryExecAsync(cmd, cwd) {
484
+ return new Promise((resolve) => {
485
+ const isWin = process.platform === "win32";
486
+ const child = execFile(isWin ? "cmd" : "sh", isWin ? ["/c", cmd] : ["-c", cmd], { cwd, timeout: CMD_TIMEOUT, encoding: "utf-8" }, (err, stdout) => resolve(err ? null : String(stdout).trim()));
487
+ child.on("error", () => resolve(null));
488
+ });
489
+ }
490
+ async function commandExistsAsync(name, cwd) {
491
+ const whichCmd = process.platform === "win32" ? `where ${name}` : `command -v ${name}`;
492
+ return (await tryExecAsync(whichCmd, cwd)) !== null;
493
+ }
494
+ async function checkNodeVersionAsync(basePath) {
495
+ const required = readPackageEngineNode(basePath);
496
+ if (!required)
497
+ return null;
498
+ const currentVersion = await tryExecAsync("node --version", basePath);
499
+ return buildNodeVersionResult(required, currentVersion);
500
+ }
501
+ async function checkPortConflictsAsync(basePath) {
502
+ if (process.platform === "win32")
503
+ return [];
504
+ const portsToCheck = collectPortsToCheck(basePath);
505
+ if (portsToCheck.size === 0)
506
+ return [];
507
+ const lsofOut = await tryExecAsync("lsof -nP -iTCP -sTCP:LISTEN", basePath);
508
+ return buildPortConflictResults(lsofOut, portsToCheck);
509
+ }
510
+ async function checkDiskSpaceAsync(basePath) {
511
+ if (process.platform === "win32")
512
+ return null;
513
+ return buildDiskSpaceResult(await tryExecAsync(`df -k "${basePath}" | tail -1`, basePath));
514
+ }
515
+ async function checkDockerAsync(basePath) {
516
+ if (!hasDockerConfig(basePath))
517
+ return null;
518
+ if (!(await commandExistsAsync("docker", basePath))) {
519
+ return { name: "docker", status: "warning", message: "Project has Docker files but docker is not installed" };
520
+ }
521
+ const info = await tryExecAsync("docker info --format '{{.ServerVersion}}'", basePath);
522
+ if (!info) {
523
+ return {
524
+ name: "docker",
525
+ status: "warning",
526
+ message: "Docker is installed but daemon is not running",
527
+ detail: "Start Docker Desktop or the docker daemon",
528
+ };
529
+ }
530
+ return { name: "docker", status: "ok", message: `Docker ${info}` };
531
+ }
532
+ async function checkProjectToolsAsync(basePath) {
533
+ const spec = readProjectToolSpec(basePath);
534
+ if (!spec)
535
+ return [];
536
+ const results = [];
537
+ if (spec.packageManager && !(await commandExistsAsync(spec.packageManager, basePath))) {
538
+ results.push({
539
+ name: "package_manager",
540
+ status: "warning",
541
+ message: `Project requires ${spec.packageManager} but it's not installed`,
542
+ detail: `Install with: npm install -g ${spec.packageManager}`,
543
+ });
544
+ }
545
+ if (spec.needsTsc) {
546
+ results.push({
547
+ name: "typescript",
548
+ status: "warning",
549
+ message: "TypeScript is a dependency but tsc is not available (run npm install)",
550
+ });
551
+ }
552
+ if (spec.needsPython && detectPythonExecutable() === null) {
553
+ results.push({ name: "python", status: "warning", message: "Project has Python config but python is not installed" });
554
+ }
555
+ if (spec.needsCargo && !(await commandExistsAsync("cargo", basePath))) {
556
+ results.push({ name: "cargo", status: "warning", message: "Project has Cargo.toml but cargo is not installed" });
557
+ }
558
+ if (spec.needsGo && !(await commandExistsAsync("go", basePath))) {
559
+ results.push({ name: "go", status: "warning", message: "Project has go.mod but go is not installed" });
560
+ }
561
+ return results;
562
+ }
563
+ /**
564
+ * Non-blocking equivalent of `runEnvironmentChecks` for the health-widget
565
+ * background refresh. Cheap fs checks run inline; the subprocess-backed checks
566
+ * fan out concurrently so the whole suite costs ~max(check), not the sum.
567
+ */
568
+ export async function runEnvironmentChecksAsync(basePath) {
569
+ const results = [];
570
+ // fs-only checks — already cheap and synchronous.
571
+ const depsCheck = checkDependenciesInstalled(basePath);
572
+ if (depsCheck)
573
+ results.push(depsCheck);
574
+ const envCheck = checkEnvFiles(basePath);
575
+ if (envCheck)
576
+ results.push(envCheck);
577
+ // subprocess-backed checks — run concurrently, off the event-loop critical path.
578
+ const [nodeCheck, portChecks, diskCheck, dockerCheck, toolChecks] = await Promise.all([
579
+ checkNodeVersionAsync(basePath),
580
+ checkPortConflictsAsync(basePath),
581
+ checkDiskSpaceAsync(basePath),
582
+ checkDockerAsync(basePath),
583
+ checkProjectToolsAsync(basePath),
584
+ ]);
585
+ if (nodeCheck)
586
+ results.push(nodeCheck);
587
+ results.push(...portChecks);
588
+ if (diskCheck)
589
+ results.push(diskCheck);
590
+ if (dockerCheck)
591
+ results.push(dockerCheck);
592
+ results.push(...toolChecks);
593
+ return results;
594
+ }
464
595
  export function runEnvironmentChecks(basePath) {
465
596
  const results = [];
466
597
  const nodeCheck = checkNodeVersion(basePath);
@@ -6,6 +6,7 @@ import { loadFile } from "./files.js";
6
6
  import { resolveMilestoneFile } from "./paths.js";
7
7
  import { isCompletedMilestoneTerminal } from "./milestone-closeout.js";
8
8
  import { deriveState } from "./state.js";
9
+ import { isClosedStatus } from "./status-guards.js";
9
10
  import { allWorktreesDirs, createWorktree, listWorktrees, resolveGitDir } from "./worktree-manager.js";
10
11
  import { abortAndReset } from "./git-self-heal.js";
11
12
  import { RUNTIME_EXCLUSION_PATHS, resolveMilestoneIntegrationBranch, writeIntegrationBranch } from "./git-service.js";
@@ -174,7 +175,7 @@ export async function checkGitHealth(basePath, issues, fixesApplied, shouldFix,
174
175
  const milestoneId = wt.branch.replace(/^milestone\//, "");
175
176
  const milestoneEntry = state.registry.find(m => m.id === milestoneId);
176
177
  const isComplete = milestoneEntry
177
- ? await isCompletedMilestoneTerminal(basePath, milestoneId)
178
+ ? isClosedStatus(milestoneEntry.status)
178
179
  : false;
179
180
  if (!isComplete && !hasProjectContentOnDisk(wt.path) && hasProjectContentOnDisk(basePath)) {
180
181
  issues.push({
@@ -269,6 +270,9 @@ export async function checkGitHealth(basePath, issues, fixesApplied, shouldFix,
269
270
  const roadmapContent = roadmapPath ? await loadFile(roadmapPath) : null;
270
271
  if (!roadmapContent)
271
272
  continue;
273
+ const milestoneEntry = state.registry.find(m => m.id === milestoneId);
274
+ if (!milestoneEntry || !isClosedStatus(milestoneEntry.status))
275
+ continue;
272
276
  branchMilestoneComplete = await isCompletedMilestoneTerminal(basePath, milestoneId);
273
277
  if (branchMilestoneComplete) {
274
278
  issues.push({
@@ -35,7 +35,7 @@ const CLI_AUTH_PROVIDERS = new Set([
35
35
  const PROVIDER_ROUTES = {
36
36
  anthropic: ["github-copilot", "claude-code"],
37
37
  openai: ["github-copilot", "openai-codex"],
38
- google: ["google-gemini-cli"],
38
+ google: ["google-antigravity", "google-gemini-cli"],
39
39
  };
40
40
  // ── Model → Provider ID mapping ───────────────────────────────────────────────
41
41
  /**
@@ -53,19 +53,21 @@ export async function checkRuntimeHealth(basePath, issues, fixesApplied, shouldF
53
53
  if (lock) {
54
54
  const alive = isLockProcessAlive(lock);
55
55
  if (!alive) {
56
- issues.push({
57
- severity: "error",
58
- code: "stale_crash_lock",
59
- scope: "project",
60
- unitId: "project",
61
- message: `Stale auto-mode worker (PID ${lock.pid}, started ${lock.startedAt}, was executing ${lock.unitType} ${lock.unitId}) — process is no longer running`,
62
- file: "<workers table>",
63
- fixable: true,
64
- });
65
56
  if (shouldFix("stale_crash_lock")) {
66
57
  clearStaleWorkerLock(basePath);
67
58
  fixesApplied.push("cleared stale auto-mode worker state");
68
59
  }
60
+ else {
61
+ issues.push({
62
+ severity: "error",
63
+ code: "stale_crash_lock",
64
+ scope: "project",
65
+ unitId: "project",
66
+ message: `Stale auto-mode worker (PID ${lock.pid}, started ${lock.startedAt}, was executing ${lock.unitType} ${lock.unitId}) — process is no longer running`,
67
+ file: "<workers table>",
68
+ fixable: true,
69
+ });
70
+ }
69
71
  }
70
72
  }
71
73
  }
@@ -3,13 +3,15 @@
3
3
  //
4
4
  // ─── Single-writer invariant ─────────────────────────────────────────────
5
5
  // Every write-SQL statement against `.gsd/gsd.db` lives behind a typed
6
- // wrapper in the single-writer layer (this file plus db/writers/*). Connection
7
- // ownership, lifecycle, schema/migrations and transaction primitives live in
8
- // db/engine.ts and are re-exported here for backward compatibility, so callers
9
- // keep importing from "./gsd-db.js".
6
+ // wrapper in the explicit writer allowlist: this compatibility barrel,
7
+ // db/writers/*, typed coordination/runtime writers, schema/migration helpers,
8
+ // and ADR backfill helpers. Connection ownership, lifecycle, schema/migrations,
9
+ // and transaction primitives live in db/engine.ts and are re-exported here for
10
+ // backward compatibility, so callers keep importing from "./gsd-db.js".
10
11
  //
11
12
  // `_getAdapter()` (re-exported from the engine) is retained for read-only
12
- // SELECTs in query modules. Do NOT use it for writes — add a wrapper here.
13
+ // SELECTs in query modules. Do NOT use it for writes — add or call a typed
14
+ // wrapper in the explicit writer layer.
13
15
  //
14
16
  // The separate `.gsd/unit-claims.db` (unit-ownership.ts) is an intentionally
15
17
  // independent store and is excluded from this invariant.
@@ -22,10 +24,10 @@ import { isClosedStatus } from "./status-guards.js";
22
24
  // primitives now live in the engine; re-export the full public surface so
23
25
  // existing `from "./gsd-db.js"` imports keep working.
24
26
  export * from "./db/engine.js";
25
- import { transaction, getDbOrNull } from "./db/engine.js";
27
+ import { immediateTransaction, transaction, getDb, getDbOrNull } from "./db/engine.js";
26
28
  // ─── Single Writer Layer re-exports ──────────────────────────────────────
27
- // Write subsystems live in db/writers/*; re-exported here so callers keep
28
- // importing from "./gsd-db.js".
29
+ // Domain write subsystems live in db/writers/*; re-exported here so callers
30
+ // keep importing from "./gsd-db.js".
29
31
  export * from "./db/writers/memory.js";
30
32
  export * from "./db/writers/reconcile.js";
31
33
  export * from "./db/writers/import-restore.js";
@@ -529,21 +531,14 @@ export function insertVerificationEvidence(e) {
529
531
  });
530
532
  }
531
533
  export function setMilestoneQueueOrder(order) {
532
- if (!getDbOrNull())
533
- throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
534
- getDbOrNull().exec("BEGIN IMMEDIATE");
535
- try {
536
- getDbOrNull().prepare("UPDATE milestones SET sequence = 0").run();
537
- const stmt = getDbOrNull().prepare("UPDATE milestones SET sequence = :sequence WHERE id = :id");
534
+ const db = getDb();
535
+ immediateTransaction(() => {
536
+ db.prepare("UPDATE milestones SET sequence = 0").run();
537
+ const stmt = db.prepare("UPDATE milestones SET sequence = :sequence WHERE id = :id");
538
538
  order.forEach((id, index) => {
539
539
  stmt.run({ ":id": id, ":sequence": index + 1 });
540
540
  });
541
- getDbOrNull().exec("COMMIT");
542
- }
543
- catch (err) {
544
- getDbOrNull().exec("ROLLBACK");
545
- throw err;
546
- }
541
+ });
547
542
  }
548
543
  function getMilestoneStatusForUpdate(milestoneId) {
549
544
  if (!getDbOrNull())