@opengsd/gsd-pi 1.2.0-dev.4c756166 → 1.2.0-dev.822c9439

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 (688) hide show
  1. package/dist/cli-style.d.ts +17 -0
  2. package/dist/cli-style.js +28 -0
  3. package/dist/cli.js +1 -1
  4. package/dist/headless-events.d.ts +4 -2
  5. package/dist/headless-events.js +14 -34
  6. package/dist/mcp-server.js +2 -1
  7. package/dist/models-resolver.d.ts +3 -13
  8. package/dist/models-resolver.js +3 -22
  9. package/dist/resource-loader.d.ts +9 -5
  10. package/dist/resource-loader.js +116 -20
  11. package/dist/resources/.managed-resources-content-hash +1 -1
  12. package/dist/resources/GSD-WORKFLOW.md +5 -4
  13. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  14. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  15. package/dist/resources/extensions/async-jobs/index.js +65 -0
  16. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  17. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  18. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  19. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  20. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  21. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  22. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  23. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  24. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  25. package/dist/resources/extensions/browser-tools/index.js +69 -12
  26. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  27. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +38 -6
  28. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  29. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  30. package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
  31. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  32. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  33. package/dist/resources/extensions/gsd/auto/orchestrator.js +122 -58
  34. package/dist/resources/extensions/gsd/auto/phases.js +54 -6
  35. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  36. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  37. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  38. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  39. package/dist/resources/extensions/gsd/auto-post-unit.js +43 -14
  40. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  41. package/dist/resources/extensions/gsd/auto-start.js +24 -26
  42. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  43. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  44. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  45. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  46. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  47. package/dist/resources/extensions/gsd/auto-worktree.js +49 -353
  48. package/dist/resources/extensions/gsd/auto.js +45 -21
  49. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  50. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  51. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -12
  52. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  53. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  54. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
  55. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
  56. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  57. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  58. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  59. package/dist/resources/extensions/gsd/captures.js +5 -15
  60. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  61. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  62. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  63. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  64. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  65. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  66. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  67. package/dist/resources/extensions/gsd/constants.js +0 -2
  68. package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
  69. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  70. package/dist/resources/extensions/gsd/db/queries.js +398 -0
  71. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  72. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  73. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  74. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  75. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  76. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  77. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  78. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  79. package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
  80. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  81. package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
  82. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  83. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  84. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  85. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  86. package/dist/resources/extensions/gsd/files.js +33 -19
  87. package/dist/resources/extensions/gsd/git-service.js +1 -0
  88. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  89. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  90. package/dist/resources/extensions/gsd/gsd-db.js +172 -2048
  91. package/dist/resources/extensions/gsd/guidance.js +158 -0
  92. package/dist/resources/extensions/gsd/guided-flow.js +57 -8
  93. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  94. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  95. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  96. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  97. package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
  98. package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
  99. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  100. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  101. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  102. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  103. package/dist/resources/extensions/gsd/model-router.js +3 -0
  104. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  105. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  106. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  107. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  108. package/dist/resources/extensions/gsd/paths.js +37 -24
  109. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  110. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  111. package/dist/resources/extensions/gsd/preferences.js +14 -0
  112. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  113. package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  114. package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
  115. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  116. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  117. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  118. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  119. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  120. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  121. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  122. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  123. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  124. package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -5
  125. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  126. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  127. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  128. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  129. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  130. package/dist/resources/extensions/gsd/publication.js +87 -0
  131. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  132. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  133. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  134. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  135. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  136. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  137. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  138. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  139. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  140. package/dist/resources/extensions/gsd/state.js +6 -20
  141. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  142. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  143. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  144. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  145. package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
  146. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  147. package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
  148. package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
  149. package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
  150. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
  151. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  152. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  153. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
  154. package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
  155. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  156. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  157. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  158. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  159. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  160. package/dist/resources/extensions/gsd/undo.js +8 -7
  161. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  162. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  163. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  164. package/dist/resources/extensions/gsd/unit-registry.js +337 -0
  165. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  166. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  167. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  168. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  169. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  170. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  171. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  172. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  173. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  174. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  175. package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
  176. package/dist/resources/extensions/gsd/worktree-manager.js +52 -29
  177. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  178. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  179. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  180. package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
  181. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  182. package/dist/resources/extensions/gsd/worktree.js +8 -1
  183. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  184. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  185. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  186. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  187. package/dist/resources/shared/package-manager-detection.js +1 -1
  188. package/dist/resources/shared/package.json +3 -0
  189. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  190. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  191. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  192. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  193. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  194. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  195. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  196. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  197. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  198. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  199. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  200. package/dist/update-check.d.ts +2 -0
  201. package/dist/update-check.js +24 -1
  202. package/dist/update-cmd.js +20 -3
  203. package/dist/web/standalone/.next/BUILD_ID +1 -1
  204. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  205. package/dist/web/standalone/.next/build-manifest.json +3 -3
  206. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  207. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  208. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  209. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  210. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  211. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  212. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  213. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  214. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  215. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  216. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  217. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  218. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  219. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  220. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  221. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  222. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  223. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  224. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  225. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  226. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  227. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  228. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  229. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  230. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  231. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  232. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  233. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  234. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  235. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  236. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  237. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  238. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  239. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  240. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  241. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  242. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  243. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  244. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  245. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  246. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  247. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  248. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  249. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  250. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  251. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  252. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  253. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  254. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  255. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  256. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  257. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  258. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  259. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  260. package/dist/web/standalone/.next/server/app/index.html +1 -1
  261. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  262. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  263. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  264. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  265. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  266. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  267. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  268. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  269. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  270. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  271. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  272. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  273. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  274. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  275. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  276. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  277. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  278. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  279. package/dist/web/standalone/package.json +1 -1
  280. package/dist/worktree-cli.js +3 -6
  281. package/dist/worktree-status-banner.js +7 -11
  282. package/package.json +1 -1
  283. package/packages/cloud-mcp-gateway/package.json +2 -2
  284. package/packages/contracts/dist/rpc.d.ts +1 -0
  285. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  286. package/packages/contracts/dist/rpc.js.map +1 -1
  287. package/packages/contracts/dist/workflow.d.ts +4 -0
  288. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  289. package/packages/contracts/dist/workflow.js.map +1 -1
  290. package/packages/contracts/package.json +1 -1
  291. package/packages/daemon/package.json +4 -4
  292. package/packages/gsd-agent-core/package.json +5 -5
  293. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
  294. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  295. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +5 -0
  296. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  297. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  298. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  299. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  300. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  301. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  302. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  303. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  304. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  305. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  306. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  307. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  308. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  309. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  310. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  311. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  312. package/packages/gsd-agent-modes/package.json +7 -7
  313. package/packages/mcp-server/dist/cli.js +9 -1
  314. package/packages/mcp-server/dist/cli.js.map +1 -1
  315. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  316. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  317. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  318. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  319. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  320. package/packages/mcp-server/dist/server.js +4 -0
  321. package/packages/mcp-server/dist/server.js.map +1 -1
  322. package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
  323. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  324. package/packages/mcp-server/dist/workflow-tools.js +145 -59
  325. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  326. package/packages/mcp-server/package.json +5 -4
  327. package/packages/native/package.json +1 -1
  328. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  329. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  330. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  331. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  332. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  333. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  334. package/packages/pi-agent-core/dist/index.js +3 -0
  335. package/packages/pi-agent-core/dist/index.js.map +1 -1
  336. package/packages/pi-agent-core/package.json +1 -1
  337. package/packages/pi-ai/README.md +1 -0
  338. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  339. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  340. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  341. package/packages/pi-ai/dist/index.d.ts +2 -0
  342. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  343. package/packages/pi-ai/dist/index.js +2 -0
  344. package/packages/pi-ai/dist/index.js.map +1 -1
  345. package/packages/pi-ai/dist/models.generated.d.ts +158 -17
  346. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  347. package/packages/pi-ai/dist/models.generated.js +132 -17
  348. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  349. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  350. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  351. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  352. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  353. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  354. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  355. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  356. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  357. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  358. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  359. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  360. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  361. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  362. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  363. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  364. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  365. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  366. package/packages/pi-ai/package.json +3 -2
  367. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  368. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  369. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  370. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  371. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  372. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  373. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  375. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  376. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  377. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  378. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  380. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  382. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  383. package/packages/pi-coding-agent/dist/index.js +1 -1
  384. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  386. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  387. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  388. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  389. package/packages/pi-coding-agent/package.json +7 -7
  390. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  391. package/packages/pi-tui/dist/tui.js +9 -0
  392. package/packages/pi-tui/dist/tui.js.map +1 -1
  393. package/packages/pi-tui/package.json +2 -2
  394. package/packages/rpc-client/package.json +2 -2
  395. package/pkg/package.json +1 -1
  396. package/src/resources/GSD-WORKFLOW.md +5 -4
  397. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  398. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  399. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  400. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  401. package/src/resources/extensions/async-jobs/index.ts +79 -0
  402. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  403. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  404. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  405. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  406. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  407. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  408. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  409. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  410. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  411. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  412. package/src/resources/extensions/browser-tools/index.ts +71 -13
  413. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  414. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  415. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  416. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  417. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +40 -4
  418. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -0
  419. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  420. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  421. package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
  422. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  423. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  424. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  425. package/src/resources/extensions/gsd/auto/orchestrator.ts +137 -61
  426. package/src/resources/extensions/gsd/auto/phases.ts +74 -26
  427. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  428. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  429. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  430. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  431. package/src/resources/extensions/gsd/auto-post-unit.ts +52 -13
  432. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  433. package/src/resources/extensions/gsd/auto-start.ts +24 -29
  434. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  435. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  436. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  437. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  438. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  439. package/src/resources/extensions/gsd/auto-worktree.ts +55 -365
  440. package/src/resources/extensions/gsd/auto.ts +64 -25
  441. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  442. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  443. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +33 -12
  444. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  445. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  446. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
  447. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
  448. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  449. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  450. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  451. package/src/resources/extensions/gsd/captures.ts +5 -16
  452. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  453. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  454. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  455. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  456. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  457. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  458. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  459. package/src/resources/extensions/gsd/constants.ts +0 -3
  460. package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
  461. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  462. package/src/resources/extensions/gsd/db/queries.ts +490 -0
  463. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  464. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  465. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  466. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  467. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  468. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  469. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  470. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  471. package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
  472. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  473. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
  474. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  475. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  476. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  477. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  478. package/src/resources/extensions/gsd/files.ts +33 -12
  479. package/src/resources/extensions/gsd/git-service.ts +1 -0
  480. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  481. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  482. package/src/resources/extensions/gsd/gsd-db.ts +176 -2375
  483. package/src/resources/extensions/gsd/guidance.ts +217 -0
  484. package/src/resources/extensions/gsd/guided-flow.ts +71 -31
  485. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  486. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  487. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  488. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  489. package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
  490. package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
  491. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  492. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  493. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  494. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  495. package/src/resources/extensions/gsd/model-router.ts +3 -0
  496. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  497. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  498. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  499. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  500. package/src/resources/extensions/gsd/paths.ts +42 -22
  501. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  502. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  503. package/src/resources/extensions/gsd/preferences.ts +18 -0
  504. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  505. package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  506. package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
  507. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  508. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  509. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  510. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  511. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  512. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  513. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  514. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  515. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  516. package/src/resources/extensions/gsd/prompts/run-uat.md +7 -5
  517. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  518. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  519. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  520. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  521. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  522. package/src/resources/extensions/gsd/publication.ts +122 -0
  523. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  524. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  525. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  526. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  527. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  528. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  529. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  530. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  531. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  532. package/src/resources/extensions/gsd/state.ts +9 -21
  533. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  534. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  535. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +123 -0
  536. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  537. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
  538. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
  539. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  540. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  541. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  542. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  543. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  544. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  545. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  546. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  547. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  548. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  549. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  550. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  551. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  552. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  553. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
  554. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  555. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  556. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
  557. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  558. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  559. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  560. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  561. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  562. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  563. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  564. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  565. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  566. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  567. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  568. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  569. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +2 -6
  570. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  571. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
  572. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  573. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  574. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
  575. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  576. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
  577. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  578. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  579. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  580. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  581. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  582. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
  583. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  584. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  585. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  586. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  587. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  588. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  589. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  590. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
  591. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  592. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -1
  593. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  594. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  595. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
  596. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  597. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  598. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  599. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  600. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
  601. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  602. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
  603. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  604. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  605. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  606. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  607. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  608. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  609. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  610. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  611. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  612. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  613. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  614. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  615. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  616. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  617. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
  618. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  619. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  620. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
  621. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  622. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +24 -2
  623. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  624. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  625. package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
  626. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  627. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  628. package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
  629. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  630. package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
  631. package/src/resources/extensions/gsd/tools/complete-task.ts +3 -2
  632. package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
  633. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
  634. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  635. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  636. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
  637. package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
  638. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  639. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  640. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  641. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  642. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  643. package/src/resources/extensions/gsd/undo.ts +9 -8
  644. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  645. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  646. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  647. package/src/resources/extensions/gsd/unit-registry.ts +412 -0
  648. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  649. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  650. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  651. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  652. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  653. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  654. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  655. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  656. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  657. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  658. package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
  659. package/src/resources/extensions/gsd/worktree-manager.ts +53 -29
  660. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  661. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  662. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  663. package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
  664. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  665. package/src/resources/extensions/gsd/worktree.ts +7 -1
  666. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  667. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  668. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  669. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  670. package/src/resources/shared/package-manager-detection.ts +1 -1
  671. package/src/resources/shared/package.json +3 -0
  672. package/src/resources/skills/create-skill/SKILL.md +3 -0
  673. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  674. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  675. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  676. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  677. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  678. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  679. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  680. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  681. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  682. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  683. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  684. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  685. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  686. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  687. /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → yWwBo-w09Y_W-nmeeWFRp}/_buildManifest.js +0 -0
  688. /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → yWwBo-w09Y_W-nmeeWFRp}/_ssgManifest.js +0 -0
@@ -6,8 +6,9 @@ import { isDbAvailable, _getAdapter } from "./gsd-db.js";
6
6
  import { isAfter, latestExplicitReopenAt } from "./milestone-reopen-events.js";
7
7
  import { resolveGsdPathContract, resolveMilestoneFile } from "./paths.js";
8
8
  import { deriveState } from "./state.js";
9
+ import { workflowEventLogPath } from "./workflow-event-ledger.js";
9
10
  import { readEvents } from "./workflow-events.js";
10
- import { renderAllProjections } from "./workflow-projections.js";
11
+ import { flushWorkflowProjections } from "./projection-flush.js";
11
12
 
12
13
  export async function checkEngineHealth(
13
14
  basePath: string,
@@ -260,7 +261,7 @@ export async function checkEngineHealth(
260
261
  // relative to the event log and re-render them.
261
262
  try {
262
263
  if (isDbAvailable()) {
263
- const eventLogPath = join(basePath, ".gsd", "event-log.jsonl");
264
+ const eventLogPath = workflowEventLogPath(basePath);
264
265
  const events = readEvents(eventLogPath);
265
266
  if (events.length > 0) {
266
267
  const lastEventTs = new Date(events[events.length - 1]!.ts).getTime();
@@ -270,7 +271,7 @@ export async function checkEngineHealth(
270
271
  const roadmapPath = resolveMilestoneFile(basePath, milestone.id, "ROADMAP");
271
272
  if (!roadmapPath || !existsSync(roadmapPath)) {
272
273
  try {
273
- await renderAllProjections(basePath, milestone.id);
274
+ await flushWorkflowProjections(basePath, { milestoneId: milestone.id });
274
275
  fixesApplied.push(`re-rendered missing projections for ${milestone.id}`);
275
276
  } catch {
276
277
  // Non-fatal — projection re-render failed
@@ -280,7 +281,7 @@ export async function checkEngineHealth(
280
281
  const projectionMtime = statSync(roadmapPath).mtimeMs;
281
282
  if (lastEventTs > projectionMtime) {
282
283
  try {
283
- await renderAllProjections(basePath, milestone.id);
284
+ await flushWorkflowProjections(basePath, { milestoneId: milestone.id });
284
285
  fixesApplied.push(`re-rendered stale projections for ${milestone.id}`);
285
286
  } catch {
286
287
  // Non-fatal — projection re-render failed
@@ -15,6 +15,7 @@ import { join } from "node:path";
15
15
 
16
16
  import type { DoctorIssue, DoctorIssueCode } from "./doctor-types.js";
17
17
  import { detectPythonExecutable } from "./python-resolver.js";
18
+ import { projectRootFromWorktreePath } from "./worktree-root.js";
18
19
 
19
20
  // ── Types ──────────────────────────────────────────────────────────────────
20
21
 
@@ -38,27 +39,18 @@ const CMD_TIMEOUT = 5_000;
38
39
 
39
40
  // ── Helpers ────────────────────────────────────────────────────────────────
40
41
 
41
- /** Worktree sentinel — path segment that marks an auto-worktree directory. */
42
- const WORKTREE_PATH_SEGMENT = `${join(".gsd", "worktrees")}/`;
43
-
44
42
  /**
45
- * Resolve the project root when running inside a `.gsd/worktrees/<name>/`
46
- * auto-worktree. Returns `null` if not in a worktree.
43
+ * Resolve the project root when running inside a GSD auto-worktree.
44
+ * Returns `null` if not in a worktree.
47
45
  *
48
46
  * Detection order:
49
47
  * 1. `GSD_WORKTREE` env var (set by the worktree launcher)
50
- * 2. `.gsd/worktrees/` segment in basePath
48
+ * 2. worktree segment in basePath (via worktree-root's layout matching)
51
49
  */
52
50
  function resolveWorktreeProjectRoot(basePath: string): string | null {
53
51
  const envRoot = process.env.GSD_WORKTREE;
54
52
  if (envRoot) return envRoot;
55
-
56
- const normalised = basePath.replace(/\\/g, "/");
57
- const idx = normalised.indexOf(WORKTREE_PATH_SEGMENT.replace(/\\/g, "/"));
58
- if (idx === -1) return null;
59
-
60
- // Everything before `.gsd/worktrees/` is the project root
61
- return basePath.slice(0, idx);
53
+ return projectRootFromWorktreePath(basePath);
62
54
  }
63
55
 
64
56
  function tryExec(cmd: string, cwd: string): string | null {
@@ -1,4 +1,9 @@
1
- import type { DoctorIssue, DoctorIssueCode, DoctorReport, DoctorSummary } from "./doctor-types.js";
1
+ import type { DoctorIssue, DoctorIssueCode, DoctorReport, DoctorSummary, DoctorSeverity } from "./doctor-types.js";
2
+ import { doctorFixHint } from "./guidance.js";
3
+
4
+ function severityTag(severity: DoctorSeverity): string {
5
+ return severity === "error" ? "ERROR" : severity === "warning" ? "WARN" : "INFO";
6
+ }
2
7
 
3
8
  function matchesScope(unitId: string, scope?: string): boolean {
4
9
  if (!scope) return true;
@@ -53,8 +58,9 @@ export function formatDoctorReport(
53
58
  if (scopedIssues.length > 0) {
54
59
  lines.push("Priority issues:");
55
60
  for (const issue of scopedIssues.slice(0, maxIssues)) {
56
- const prefix = issue.severity === "error" ? "ERROR" : issue.severity === "warning" ? "WARN" : "INFO";
57
- lines.push(`- [${prefix}] ${issue.unitId}: ${issue.message}${issue.file ? ` (${issue.file})` : ""}`);
61
+ lines.push(`- [${severityTag(issue.severity)}] ${issue.unitId}: ${issue.message}${issue.file ? ` (${issue.file})` : ""}`);
62
+ const hint = doctorFixHint(issue.code);
63
+ if (hint && issue.severity !== "info") lines.push(` Fix: ${hint}`);
58
64
  }
59
65
  if (scopedIssues.length > maxIssues) {
60
66
  lines.push(`- ...and ${scopedIssues.length - maxIssues} more in scope`);
@@ -72,10 +78,9 @@ export function formatDoctorReport(
72
78
 
73
79
  export function formatDoctorIssuesForPrompt(issues: DoctorIssue[]): string {
74
80
  if (issues.length === 0) return "- No remaining issues in scope.";
75
- return issues.map(issue => {
76
- const prefix = issue.severity === "error" ? "ERROR" : issue.severity === "warning" ? "WARN" : "INFO";
77
- return `- [${prefix}] ${issue.unitId} | ${issue.code} | ${issue.message}${issue.file ? ` | file: ${issue.file}` : ""} | fixable: ${issue.fixable ? "yes" : "no"}`;
78
- }).join("\n");
81
+ return issues.map(issue =>
82
+ `- [${severityTag(issue.severity)}] ${issue.unitId} | ${issue.code} | ${issue.message}${issue.file ? ` | file: ${issue.file}` : ""} | fixable: ${issue.fixable ? "yes" : "no"}`
83
+ ).join("\n");
79
84
  }
80
85
 
81
86
  /**
@@ -5,11 +5,10 @@ import { dirname, join } from "node:path";
5
5
 
6
6
  import type { DoctorIssue, DoctorIssueCode } from "./doctor-types.js";
7
7
  import { loadFile } from "./files.js";
8
- import { parseRoadmap as parseLegacyRoadmap } from "./parsers-legacy.js";
9
- import { isDbAvailable, getMilestone } from "./gsd-db.js";
10
8
  import { resolveMilestoneFile } from "./paths.js";
11
- import { deriveState, isMilestoneComplete } from "./state.js";
12
- import { createWorktree, listWorktrees, resolveGitDir, worktreesDir } from "./worktree-manager.js";
9
+ import { isCompletedMilestoneTerminal } from "./milestone-closeout.js";
10
+ import { deriveState } from "./state.js";
11
+ import { allWorktreesDirs, createWorktree, listWorktrees, resolveGitDir } from "./worktree-manager.js";
13
12
  import { abortAndReset } from "./git-self-heal.js";
14
13
  import { RUNTIME_EXCLUSION_PATHS, resolveMilestoneIntegrationBranch, writeIntegrationBranch } from "./git-service.js";
15
14
  import { nativeIsRepo, nativeWorktreeList, nativeWorktreeRemove, nativeBranchList, nativeBranchDelete, nativeLsFiles, nativeRmCached, nativeHasChanges, nativeLastCommitEpoch, nativeGetCurrentBranch, nativeAddTracked, nativeCommit } from "./native-git-bridge.js";
@@ -146,22 +145,6 @@ function getSnapshotDiffCheckFailure(basePath: string): string | null {
146
145
  return failures.length > 0 ? failures.join("\n") : null;
147
146
  }
148
147
 
149
- async function isCompletedMilestoneTerminal(basePath: string, milestoneId: string): Promise<boolean> {
150
- const summaryPath = resolveMilestoneFile(basePath, milestoneId, "SUMMARY");
151
- if (!summaryPath) return false;
152
-
153
- if (isDbAvailable()) {
154
- const milestone = getMilestone(milestoneId);
155
- return !!milestone && milestone.status === "complete";
156
- }
157
-
158
- const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
159
- const roadmapContent = roadmapPath ? await loadFile(roadmapPath) : null;
160
- if (!roadmapContent) return false;
161
- const roadmap = parseLegacyRoadmap(roadmapContent);
162
- return isMilestoneComplete(roadmap);
163
- }
164
-
165
148
  export async function checkGitHealth(
166
149
  basePath: string,
167
150
  issues: DoctorIssue[],
@@ -496,8 +479,8 @@ export async function checkGitHealth(
496
479
  // that is no longer registered with git. These orphaned dirs cause
497
480
  // "already exists" errors when re-creating the same worktree name.
498
481
  try {
499
- const wtDir = worktreesDir(basePath);
500
- if (existsSync(wtDir)) {
482
+ for (const wtDir of allWorktreesDirs(basePath)) {
483
+ if (!existsSync(wtDir)) continue;
501
484
  // Resolve symlinks and normalize separators so that symlinked .gsd
502
485
  // paths (e.g. ~/.gsd/projects/<hash>/worktrees/…) match the paths
503
486
  // returned by `git worktree list`.
@@ -414,26 +414,31 @@ export async function checkRuntimeHealth(
414
414
  ".gsd/event-log.jsonl",
415
415
  ];
416
416
 
417
- // If blanket .gsd/ or .gsd is present, all patterns are covered
417
+ // If blanket .gsd/ or .gsd is present, all .gsd/* patterns are covered
418
+ // but NOT the .gsd-worktrees/ sibling, which always needs its own entry.
418
419
  const hasBlanketIgnore = existingLines.has(".gsd/") || existingLines.has(".gsd");
419
-
420
+ const missing: string[] = [];
421
+ if (!existingLines.has(".gsd-worktrees/") && !existingLines.has(".gsd-worktrees")) {
422
+ missing.push(".gsd-worktrees/");
423
+ }
420
424
  if (!hasBlanketIgnore) {
421
- const missing = criticalPatterns.filter(p => !existingLines.has(p));
422
- if (missing.length > 0) {
423
- issues.push({
424
- severity: "warning",
425
- code: "gitignore_missing_patterns",
426
- scope: "project",
427
- unitId: "project",
428
- message: `${missing.length} critical GSD runtime pattern(s) missing from .gitignore: ${missing.join(", ")}`,
429
- file: ".gitignore",
430
- fixable: true,
431
- });
425
+ missing.push(...criticalPatterns.filter(p => !existingLines.has(p)));
426
+ }
432
427
 
433
- if (shouldFix("gitignore_missing_patterns")) {
434
- ensureGitignore(basePath, { manageGitignore });
435
- fixesApplied.push("added missing GSD runtime patterns to .gitignore");
436
- }
428
+ if (missing.length > 0) {
429
+ issues.push({
430
+ severity: "warning",
431
+ code: "gitignore_missing_patterns",
432
+ scope: "project",
433
+ unitId: "project",
434
+ message: `${missing.length} critical GSD runtime pattern(s) missing from .gitignore: ${missing.join(", ")}`,
435
+ file: ".gitignore",
436
+ fixable: true,
437
+ });
438
+
439
+ if (shouldFix("gitignore_missing_patterns")) {
440
+ ensureGitignore(basePath, { manageGitignore });
441
+ fixesApplied.push("added missing GSD runtime patterns to .gitignore");
437
442
  }
438
443
  }
439
444
  }
@@ -0,0 +1,79 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Typed contract for which tool lifecycle hooks fire under which
3
+ // engine, plus the single seam for tool-name normalization.
4
+ //
5
+ // ── Why this contract exists ────────────────────────────────────────────────
6
+ // External engines (claude-code-cli) pre-execute tools inside the vendor CLI
7
+ // and hand the agent loop a `toolCall.externalResult`. The loop short-circuits
8
+ // before `beforeToolCall`/`afterToolCall` ever run for those calls
9
+ // (packages/pi-agent-core/src/agent-loop.ts, prepareToolCall: the
10
+ // externalResult branch returns an "immediate" outcome before the
11
+ // config.beforeToolCall invocation, and "immediate" outcomes skip
12
+ // finalizeExecutedToolCall where config.afterToolCall lives).
13
+ // `beforeToolCall`/`afterToolCall` are exactly what the extension runner maps
14
+ // to the `tool_call`/`tool_result` extension events
15
+ // (packages/gsd-agent-core/src/session/agent-session-extensions.ts,
16
+ // installAgentToolHooks).
17
+ //
18
+ // `tool_execution_start` is emitted unconditionally before prepareToolCall
19
+ // and `tool_execution_end` after every finalized outcome — immediate or
20
+ // executed — so those two are the ONLY tool lifecycle hooks that fire for
21
+ // every tool call on every engine.
22
+ //
23
+ // Consequence: any enforcement attached only to `tool_call` (blocking) or
24
+ // `tool_result` (rewriting) is silently dead under external engines. Safety
25
+ // enforcement must ride `tool_execution_start`/`tool_execution_end`, or
26
+ // mirror across both with toolCallId dedup. See the per-registration contract
27
+ // comments in bootstrap/register-hooks.ts for how each registered hook
28
+ // honors (or knowingly violates) this contract.
29
+
30
+ import { stripMcpToolPrefix } from "./mcp-tool-name.js";
31
+ import { canonicalWorkflowSurfaceToolName } from "./workflow-tool-surface.js";
32
+
33
+ /**
34
+ * Tool lifecycle hooks that fire for EVERY tool call on EVERY engine,
35
+ * including external engines (claude-code-cli) that pre-execute tools.
36
+ * Attach safety-critical enforcement and evidence collection here.
37
+ */
38
+ export const UNIVERSAL_TOOL_HOOKS = ["tool_execution_start", "tool_execution_end"] as const;
39
+
40
+ /**
41
+ * Tool lifecycle hooks that fire ONLY for natively executed tools. External
42
+ * engines pre-execute tools (externalResult), short-circuiting the agent
43
+ * loop's beforeToolCall/afterToolCall — so handlers on these events never run
44
+ * for those calls. Blocking guards attached only here are dead under external
45
+ * engines; they need a tool_execution_start mirror to be universal.
46
+ */
47
+ export const NATIVE_ONLY_TOOL_HOOKS = ["tool_call", "tool_result"] as const;
48
+
49
+ export type UniversalToolHook = (typeof UNIVERSAL_TOOL_HOOKS)[number];
50
+ export type NativeOnlyToolHook = (typeof NATIVE_ONLY_TOOL_HOOKS)[number];
51
+
52
+ // Non-tool lifecycle events (session_start, agent_end, message_update, ...)
53
+ // are intentionally NOT classified here: they are emitted by the session
54
+ // host / extension runner independent of tool execution, so the external
55
+ // engine short-circuit above does not apply to them. Only classify events
56
+ // whose engine behavior has been verified against the agent loop.
57
+
58
+ /**
59
+ * Canonical tool name: strips the `mcp__<server>__` prefix when present,
60
+ * nothing else. Use for identity checks against host/native tool names and
61
+ * for any guard that must NOT conflate workflow aliases with their canonical
62
+ * tools (e.g. write gates, evidence keys).
63
+ *
64
+ * Malformed MCP names (empty server or empty tool segment, e.g.
65
+ * `mcp____tool` or `mcp__server__`) are returned unchanged.
66
+ */
67
+ export function canonicalToolName(toolName: string): string {
68
+ return stripMcpToolPrefix(toolName);
69
+ }
70
+
71
+ /**
72
+ * Workflow-aware canonical tool name: strips the MCP prefix AND resolves
73
+ * workflow tool aliases to their canonical contract names. Use whenever the
74
+ * name is compared against the workflow tool surface (scoping, presentation,
75
+ * dispatch) — plain {@link canonicalToolName} would miss alias spellings.
76
+ */
77
+ export function canonicalWorkflowToolName(toolName: string): string {
78
+ return canonicalWorkflowSurfaceToolName(toolName);
79
+ }
@@ -10,6 +10,8 @@
10
10
  * @see https://github.com/open-gsd/gsd-pi/issues/2577
11
11
  */
12
12
 
13
+ import { TOOL_SURFACE_NOT_READY } from "./tool-surface-readiness.js";
14
+
13
15
  // ── ErrorClass discriminated union ──────────────────────────────────────────
14
16
 
15
17
  export type ErrorClass =
@@ -70,6 +72,10 @@ const CONNECTION_RE = /terminated|connection.?(?:refused|error)|other side close
70
72
  const STREAM_RE = /in JSON at position \d+|Unexpected end of JSON|SyntaxError.*JSON/i;
71
73
  const RESET_DELAY_RE = /reset in (\d+)s/i;
72
74
  const TOOL_SCHEMA_RE = /schema overload|consecutive tool validation failures/i;
75
+ // GSD tool-surface readiness abort (claude-code stream adapter): the workflow
76
+ // MCP server had not registered the Unit's required tools at SDK init. The
77
+ // server typically finishes connecting within seconds — same-model retry.
78
+ const TOOL_SURFACE_NOT_READY_RE = new RegExp(TOOL_SURFACE_NOT_READY, "i");
73
79
  // Provider rejected the request shape for the selected model (400 bad request,
74
80
  // grammar limits, etc.). Not transient — try a different model/fallback.
75
81
  // Context-window 400s stay in SERVER_RE (checked earlier).
@@ -108,6 +114,11 @@ export function classifyError(errorMsg: string, retryAfterMs?: number): ErrorCla
108
114
  return { kind: "tool-schema", retryAfterMs: 0 };
109
115
  }
110
116
 
117
+ // Tool-surface readiness abort — transient; retry the same model shortly.
118
+ if (TOOL_SURFACE_NOT_READY_RE.test(errorMsg)) {
119
+ return { kind: "network", retryAfterMs: retryAfterMs ?? 3_000 };
120
+ }
121
+
111
122
  const isPermanent = PERMANENT_RE.test(errorMsg);
112
123
  const isRateLimit = RATE_LIMIT_RE.test(errorMsg) || AFFORDABILITY_RE.test(errorMsg);
113
124
  const isUnsupportedModel =
@@ -12,6 +12,7 @@ import { spawn } from "node:child_process";
12
12
  import { existsSync, mkdirSync, writeFileSync } from "node:fs";
13
13
  import { randomUUID } from "node:crypto";
14
14
  import { resolve } from "node:path";
15
+ import { killProcessTree, SIGKILL_GRACE_MS, HARD_DEADLINE_MS } from "@gsd/pi-coding-agent";
15
16
 
16
17
  export interface ExecSandboxRequest {
17
18
  /** Interpreter to use. */
@@ -47,6 +48,17 @@ export interface ExecSandboxOptions {
47
48
  now?: () => Date;
48
49
  /** Optional override for id generation (tests). */
49
50
  generateId?: () => string;
51
+ /**
52
+ * Grace period (ms) between SIGTERM and SIGKILL on timeout.
53
+ * Defaults to SIGKILL_GRACE_MS. Exposed as a test seam.
54
+ */
55
+ kill_grace_ms?: number;
56
+ /**
57
+ * Delay (ms) after a kill is initiated before the hard-deadline force-resolves
58
+ * the promise (handles D-state / non-closing children).
59
+ * Defaults to SIGKILL_GRACE_MS + HARD_DEADLINE_MS. Exposed as a test seam.
60
+ */
61
+ force_resolve_delay_ms?: number;
50
62
  }
51
63
 
52
64
  export interface ExecSandboxResult {
@@ -55,6 +67,12 @@ export interface ExecSandboxResult {
55
67
  exit_code: number | null;
56
68
  signal: NodeJS.Signals | null;
57
69
  timed_out: boolean;
70
+ /**
71
+ * True when the result came from the hard-deadline force-resolve (a non-closing
72
+ * D-state child that never emitted 'close') rather than an observed process exit.
73
+ * In that case `signal` is the synthetic "SIGKILL" marker, not a delivered signal.
74
+ */
75
+ force_resolved: boolean;
58
76
  duration_ms: number;
59
77
  stdout_bytes: number;
60
78
  stderr_bytes: number;
@@ -68,6 +86,10 @@ export interface ExecSandboxResult {
68
86
 
69
87
  const ALWAYS_FORWARD_ENV = ["PATH", "HOME"] as const;
70
88
 
89
+ // SIGKILL_GRACE_MS / HARD_DEADLINE_MS are imported from @gsd/pi-coding-agent
90
+ // (shell.ts) — the single source of truth for the graceful-kill timing ladder —
91
+ // so this sandbox can never drift from the canonical kill path it delegates to.
92
+
71
93
  export const EXEC_DEFAULTS = {
72
94
  clampTimeoutMs: 600_000,
73
95
  defaultTimeoutMs: 30_000,
@@ -180,6 +202,7 @@ export function runExecSandbox(
180
202
  exit_code: null,
181
203
  signal: null,
182
204
  timed_out: false,
205
+ force_resolved: false,
183
206
  duration_ms: duration,
184
207
  stdout_bytes: 0,
185
208
  stderr_bytes: Buffer.byteLength(`spawn error: ${message}\n`),
@@ -233,23 +256,39 @@ export function runExecSandbox(
233
256
  }
234
257
  });
235
258
 
259
+ const effectiveGraceMs = opts.kill_grace_ms ?? SIGKILL_GRACE_MS;
260
+ const effectiveForceResolveDelay = opts.force_resolve_delay_ms ?? (effectiveGraceMs + HARD_DEADLINE_MS);
261
+
236
262
  let timedOut = false;
263
+ let settled = false;
264
+ let forceResolveTimer: NodeJS.Timeout | undefined;
265
+
237
266
  const timer = setTimeout(() => {
238
267
  timedOut = true;
239
- if (useProcessGroup && child.pid != null) {
240
- try {
241
- process.kill(-child.pid, "SIGKILL");
242
- } catch {
243
- child.kill("SIGKILL");
244
- }
268
+ // killProcessTree handles both platforms and kills the whole tree: on Unix
269
+ // it signals the process group (SIGTERM -> grace -> SIGKILL); on Windows it
270
+ // force-kills the tree via taskkill /F /T. Using child.kill("SIGTERM") here
271
+ // would only terminate the direct child on Windows, orphaning grandchildren.
272
+ if (child.pid != null) {
273
+ killProcessTree(child.pid, { graceMs: effectiveGraceMs });
245
274
  } else {
246
- child.kill("SIGKILL");
275
+ child.kill("SIGTERM");
247
276
  }
277
+ // Arm hard-deadline force-resolve in case child never closes (D-state).
278
+ // The "SIGKILL" here is a synthetic marker (the process may not have actually
279
+ // received it); force_resolved=true records that this was a deadline, not an exit.
280
+ forceResolveTimer = setTimeout(() => {
281
+ finalize(null, "SIGKILL", true);
282
+ }, effectiveForceResolveDelay);
283
+ forceResolveTimer.unref?.();
248
284
  }, timeoutMs);
249
285
  timer.unref?.();
250
286
 
251
- const finalize = (exitCode: number | null, signal: NodeJS.Signals | null) => {
287
+ const finalize = (exitCode: number | null, signal: NodeJS.Signals | null, forceResolved = false) => {
288
+ if (settled) return;
289
+ settled = true;
252
290
  clearTimeout(timer);
291
+ clearTimeout(forceResolveTimer);
253
292
  const duration = Date.now() - started;
254
293
  const stdoutBuf = Buffer.concat(stdoutChunks);
255
294
  const stderrBuf = Buffer.concat(stderrChunks);
@@ -274,6 +313,7 @@ export function runExecSandbox(
274
313
  exit_code: exitCode,
275
314
  signal,
276
315
  timed_out: timedOut,
316
+ force_resolved: forceResolved,
277
317
  duration_ms: duration,
278
318
  stdout_bytes: stdoutBytes,
279
319
  stderr_bytes: stderrBytes,
@@ -324,6 +364,7 @@ function writeMeta(
324
364
  exit_code: result.exit_code,
325
365
  signal: result.signal,
326
366
  timed_out: result.timed_out,
367
+ force_resolved: result.force_resolved,
327
368
  duration_ms: result.duration_ms,
328
369
  stdout_bytes: result.stdout_bytes,
329
370
  stderr_bytes: result.stderr_bytes,
@@ -331,7 +372,6 @@ function writeMeta(
331
372
  stderr_truncated: result.stderr_truncated,
332
373
  stdout_path: result.stdout_path,
333
374
  stderr_path: result.stderr_path,
334
- ...(request.metadata ? { metadata: request.metadata } : {}),
335
375
  };
336
376
  writeFileSync(path, `${JSON.stringify(meta, null, 2)}\n`);
337
377
  }
@@ -671,33 +671,54 @@ export function parseTaskPlanIO(content: string): { inputFiles: string[]; output
671
671
  */
672
672
  export type UatType = 'artifact-driven' | 'live-runtime' | 'human-experience' | 'mixed' | 'browser-executable' | 'runtime-executable';
673
673
 
674
+ /** Canonical list of recognised UAT types — uat-policy.ts re-exports this as UAT_TYPES. */
675
+ export const UAT_TYPE_KEYWORDS: readonly UatType[] = [
676
+ 'artifact-driven',
677
+ 'browser-executable',
678
+ 'runtime-executable',
679
+ 'live-runtime',
680
+ 'mixed',
681
+ 'human-experience',
682
+ ];
683
+
684
+ /** Match a value against the recognised UAT type keywords (leading-keyword-only). */
685
+ function matchUatTypeKeyword(value: string): UatType | undefined {
686
+ const normalized = value.trim().toLowerCase();
687
+ return UAT_TYPE_KEYWORDS.find(keyword => normalized.startsWith(keyword));
688
+ }
689
+
674
690
  /**
675
691
  * Extract the UAT type from a UAT file's raw content.
676
692
  *
677
693
  * UAT files have no YAML frontmatter - pass raw file content directly.
678
694
  * Classification is leading-keyword-only: e.g. `mixed (artifact-driven + live-runtime)` → `'mixed'`.
679
695
  *
696
+ * The canonical form is a `- UAT mode: <type>` bullet under `## UAT Type`
697
+ * (case-insensitive prefix, `**bold**` tolerated). When no such line exists,
698
+ * a line that itself starts with a recognised keyword — e.g. a bare
699
+ * `browser-executable` under the heading — is accepted, so agent-authored
700
+ * format drift does not silently fall back to artifact-driven.
701
+ *
680
702
  * Returns `undefined` when:
681
703
  * - the `## UAT Type` section is absent
682
- * - no `UAT mode:` bullet is found in the section
683
- * - the value does not start with a recognised keyword
704
+ * - a `UAT mode:` line exists but its value starts with no recognised keyword
705
+ * - no line in the section starts with `UAT mode:` or a recognised keyword
684
706
  */
685
707
  export function extractUatType(content: string): UatType | undefined {
686
708
  const sectionText = extractSection(content, 'UAT Type');
687
709
  if (!sectionText) return undefined;
688
710
 
689
- const bullets = parseBullets(sectionText);
690
- const modeBullet = bullets.find(b => b.startsWith('UAT mode:'));
691
- if (!modeBullet) return undefined;
711
+ const lines = parseBullets(sectionText).map(line => line.replace(/\*\*/g, ''));
692
712
 
693
- const rawValue = modeBullet.slice('UAT mode:'.length).trim().toLowerCase();
713
+ for (const line of lines) {
714
+ const declared = /^uat mode:\s*(.*)$/i.exec(line);
715
+ if (declared) return matchUatTypeKeyword(declared[1]);
716
+ }
694
717
 
695
- if (rawValue.startsWith('artifact-driven')) return 'artifact-driven';
696
- if (rawValue.startsWith('browser-executable')) return 'browser-executable';
697
- if (rawValue.startsWith('runtime-executable')) return 'runtime-executable';
698
- if (rawValue.startsWith('live-runtime')) return 'live-runtime';
699
- if (rawValue.startsWith('human-experience')) return 'human-experience';
700
- if (rawValue.startsWith('mixed')) return 'mixed';
718
+ for (const line of lines) {
719
+ const matched = matchUatTypeKeyword(line);
720
+ if (matched) return matched;
721
+ }
701
722
 
702
723
  return undefined;
703
724
  }
@@ -359,6 +359,7 @@ export interface PreMergeCheckResult {
359
359
  * This array must stay synchronized with it.
360
360
  */
361
361
  export const RUNTIME_EXCLUSION_PATHS: readonly string[] = [
362
+ ".gsd-worktrees/",
362
363
  ".gsd/activity/",
363
364
  ".gsd/audit/",
364
365
  ".gsd/forensics/",
@@ -25,6 +25,7 @@ import { GIT_NO_PROMPT_ENV } from "./git-constants.js";
25
25
  * but retained for backwards compatibility during migration.
26
26
  */
27
27
  const GSD_RUNTIME_PATTERNS = [
28
+ ".gsd-worktrees/",
28
29
  ".gsd/activity/",
29
30
  ".gsd/audit/",
30
31
  ".gsd/forensics/",
@@ -48,6 +49,8 @@ const GSD_RUNTIME_PATTERNS = [
48
49
  const BASELINE_PATTERNS = [
49
50
  // ── GSD state directory (symlink to external storage) ──
50
51
  ".gsd",
52
+ // Worktree container sibling — NOT covered by the ".gsd" pattern above.
53
+ ".gsd-worktrees/",
51
54
  ".gsd-id",
52
55
  ".mcp.json",
53
56
  ".bg-shell/",
@@ -66,7 +66,7 @@ function disabled(description: string, reason: string): string {
66
66
 
67
67
  export function buildGsdHomeModel(
68
68
  state: GSDState,
69
- closeout?: Pick<CloseoutContext, "strandedQuick" | "unmergedMilestones">,
69
+ closeout?: Pick<CloseoutContext, "strandedQuick" | "unmergedMilestones" | "idleResidueHint">,
70
70
  ): GsdHomeModel {
71
71
  const blocked = isBlocked(state);
72
72
  const complete = state.phase === "complete";
@@ -74,10 +74,14 @@ export function buildGsdHomeModel(
74
74
  const workLabel = activeWorkLabel(state);
75
75
  const strandedQuick = closeout?.strandedQuick ?? null;
76
76
  const unmergedMilestone = closeout?.unmergedMilestones?.[0];
77
+ const idleResidueHint = closeout?.idleResidueHint ?? null;
78
+ const hasIdleResidue = Boolean(idleResidueHint);
77
79
  const nextReason = complete
78
80
  ? "all milestones are complete"
79
81
  : blocked
80
82
  ? "the active milestone is blocked"
83
+ : hasIdleResidue
84
+ ? "milestone git residue needs recovery"
81
85
  : !hasActiveWork
82
86
  ? "there is no active milestone"
83
87
  : "";
@@ -91,6 +95,8 @@ export function buildGsdHomeModel(
91
95
  ? "finish_milestone"
92
96
  : blocked
93
97
  ? "fix_recover"
98
+ : hasIdleResidue
99
+ ? "fix_recover"
94
100
  : canAdvance
95
101
  ? "continue_step"
96
102
  : complete && unmappedActive > 0
@@ -107,6 +113,8 @@ export function buildGsdHomeModel(
107
113
  ? [`Quick task Q${strandedQuick.taskNum} finished on ${strandedQuick.quickBranch} but is not merged to ${strandedQuick.originalBranch}.`]
108
114
  : unmergedMilestone
109
115
  ? [`${unmergedMilestone.milestoneId} is complete but not merged into ${unmergedMilestone.integrationBranch}.`]
116
+ : idleResidueHint
117
+ ? [idleResidueHint.message]
110
118
  : completionSummary;
111
119
 
112
120
  return {
@@ -181,10 +189,12 @@ export function buildGsdHomeModel(
181
189
  label: "Fix or recover",
182
190
  description: blocked
183
191
  ? "Review the blocker and recovery commands for the active milestone."
192
+ : hasIdleResidue
193
+ ? "Review stranded milestone worktrees/branches and run the suggested recovery command."
184
194
  : disabled("This becomes active when closeout, validation, or state recovery is needed.", "no blocker is active"),
185
- enabled: blocked,
195
+ enabled: blocked || hasIdleResidue,
186
196
  recommended: recommended === "fix_recover",
187
- disabledReason: blocked ? undefined : "no blocker is active",
197
+ disabledReason: blocked || hasIdleResidue ? undefined : "no blocker is active",
188
198
  },
189
199
  {
190
200
  id: "start_configure",