@opengsd/gsd-pi 1.2.0-dev.b1abb545 → 1.2.0-dev.ddc97c10

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 (662) 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.js +2 -14
  10. package/dist/resources/.managed-resources-content-hash +1 -1
  11. package/dist/resources/GSD-WORKFLOW.md +5 -4
  12. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  13. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  14. package/dist/resources/extensions/async-jobs/index.js +65 -0
  15. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  16. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  17. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  18. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  19. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  20. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  21. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  22. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  23. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  24. package/dist/resources/extensions/browser-tools/index.js +69 -12
  25. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  26. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +38 -6
  27. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  28. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  29. package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
  30. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  31. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  32. package/dist/resources/extensions/gsd/auto/orchestrator.js +122 -58
  33. package/dist/resources/extensions/gsd/auto/phases.js +54 -6
  34. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  35. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  36. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  37. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  38. package/dist/resources/extensions/gsd/auto-post-unit.js +43 -14
  39. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  40. package/dist/resources/extensions/gsd/auto-start.js +24 -26
  41. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  42. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  43. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  44. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  45. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  46. package/dist/resources/extensions/gsd/auto-worktree.js +35 -352
  47. package/dist/resources/extensions/gsd/auto.js +45 -21
  48. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  49. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  50. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -12
  51. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  52. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  53. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
  54. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
  55. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  56. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  57. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  58. package/dist/resources/extensions/gsd/captures.js +5 -15
  59. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  60. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  61. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  62. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  63. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  64. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  65. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  66. package/dist/resources/extensions/gsd/constants.js +0 -2
  67. package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
  68. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  69. package/dist/resources/extensions/gsd/db/queries.js +398 -0
  70. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  71. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  72. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  73. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  74. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  75. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  76. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  77. package/dist/resources/extensions/gsd/doctor-engine-checks.js +3 -3
  78. package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
  79. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  80. package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
  81. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  82. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  83. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  84. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  85. package/dist/resources/extensions/gsd/files.js +33 -19
  86. package/dist/resources/extensions/gsd/git-service.js +1 -0
  87. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  88. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  89. package/dist/resources/extensions/gsd/gsd-db.js +172 -2048
  90. package/dist/resources/extensions/gsd/guidance.js +158 -0
  91. package/dist/resources/extensions/gsd/guided-flow.js +57 -8
  92. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  93. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  94. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  95. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  96. package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
  97. package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
  98. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  99. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  100. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  101. package/dist/resources/extensions/gsd/model-router.js +3 -0
  102. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  103. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  104. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  105. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  106. package/dist/resources/extensions/gsd/paths.js +37 -24
  107. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  108. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  109. package/dist/resources/extensions/gsd/preferences.js +14 -0
  110. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  111. package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  112. package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
  113. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  114. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  115. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  116. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  117. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  118. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  119. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  120. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  121. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  122. package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -5
  123. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  124. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  125. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  126. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  127. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  128. package/dist/resources/extensions/gsd/publication.js +87 -0
  129. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  130. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  131. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  132. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  133. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  134. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  135. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  136. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  137. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  138. package/dist/resources/extensions/gsd/state.js +6 -20
  139. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  140. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  141. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  142. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  143. package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
  144. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  145. package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
  146. package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
  147. package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
  148. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
  149. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  150. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  151. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
  152. package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
  153. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  154. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  155. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  156. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  157. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  158. package/dist/resources/extensions/gsd/undo.js +8 -7
  159. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  160. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  161. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  162. package/dist/resources/extensions/gsd/unit-registry.js +337 -0
  163. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  164. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  165. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  166. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  167. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  168. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  169. package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
  170. package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
  171. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  172. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  173. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  174. package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
  175. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  176. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  177. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  178. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  179. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  180. package/dist/resources/shared/package-manager-detection.js +1 -1
  181. package/dist/resources/shared/package.json +3 -0
  182. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  183. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  184. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  185. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  186. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  187. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  188. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  189. package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
  190. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  191. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  192. package/dist/update-check.d.ts +2 -0
  193. package/dist/update-check.js +24 -1
  194. package/dist/update-cmd.js +20 -3
  195. package/dist/web/standalone/.next/BUILD_ID +1 -1
  196. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  197. package/dist/web/standalone/.next/build-manifest.json +3 -3
  198. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  199. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  200. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  201. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  202. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  203. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  204. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  206. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  207. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  208. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  209. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  210. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  211. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  212. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  213. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  214. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  215. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  216. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  217. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  218. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  219. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  220. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  221. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  223. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  224. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  225. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  226. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  227. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  228. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  229. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  230. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  231. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  232. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  233. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  234. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  235. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  236. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  237. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  238. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  239. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  240. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  241. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  242. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  243. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  244. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  245. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  246. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  247. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  248. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  249. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  250. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  251. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  252. package/dist/web/standalone/.next/server/app/index.html +1 -1
  253. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  254. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  255. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  256. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  257. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  258. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  259. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  260. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  261. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  262. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  263. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  264. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  265. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  266. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  267. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  268. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  269. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  270. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  271. package/dist/web/standalone/package.json +1 -1
  272. package/dist/worktree-cli.js +3 -6
  273. package/dist/worktree-status-banner.js +7 -11
  274. package/package.json +1 -1
  275. package/packages/cloud-mcp-gateway/package.json +2 -2
  276. package/packages/contracts/dist/rpc.d.ts +1 -0
  277. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  278. package/packages/contracts/dist/rpc.js.map +1 -1
  279. package/packages/contracts/dist/workflow.d.ts +4 -0
  280. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  281. package/packages/contracts/dist/workflow.js.map +1 -1
  282. package/packages/contracts/package.json +1 -1
  283. package/packages/daemon/package.json +4 -4
  284. package/packages/gsd-agent-core/package.json +5 -5
  285. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
  286. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  287. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +8 -0
  288. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  289. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  290. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  291. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  292. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  293. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  294. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  295. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  296. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  297. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  298. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  299. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  300. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  301. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  302. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  303. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  304. package/packages/gsd-agent-modes/package.json +7 -7
  305. package/packages/mcp-server/dist/cli.js +9 -1
  306. package/packages/mcp-server/dist/cli.js.map +1 -1
  307. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  308. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  309. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  310. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  311. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  312. package/packages/mcp-server/dist/server.js +4 -0
  313. package/packages/mcp-server/dist/server.js.map +1 -1
  314. package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
  315. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  316. package/packages/mcp-server/dist/workflow-tools.js +145 -59
  317. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  318. package/packages/mcp-server/package.json +5 -4
  319. package/packages/native/package.json +1 -1
  320. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  321. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  322. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  323. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  324. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  325. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  326. package/packages/pi-agent-core/dist/index.js +3 -0
  327. package/packages/pi-agent-core/dist/index.js.map +1 -1
  328. package/packages/pi-agent-core/package.json +1 -1
  329. package/packages/pi-ai/README.md +1 -0
  330. package/packages/pi-ai/dist/index.d.ts +2 -0
  331. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  332. package/packages/pi-ai/dist/index.js +2 -0
  333. package/packages/pi-ai/dist/index.js.map +1 -1
  334. package/packages/pi-ai/dist/models.generated.d.ts +192 -0
  335. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  336. package/packages/pi-ai/dist/models.generated.js +166 -0
  337. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  338. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  339. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  340. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  341. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  342. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  343. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  344. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  345. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  346. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  347. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  348. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  349. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  350. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  351. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  352. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  353. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  354. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  355. package/packages/pi-ai/package.json +3 -2
  356. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  357. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  358. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  359. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  361. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  362. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  363. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  364. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  365. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  366. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  367. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  368. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  369. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  370. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  371. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  372. package/packages/pi-coding-agent/dist/index.js +1 -1
  373. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  375. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  376. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  377. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  378. package/packages/pi-coding-agent/package.json +7 -7
  379. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  380. package/packages/pi-tui/dist/tui.js +9 -0
  381. package/packages/pi-tui/dist/tui.js.map +1 -1
  382. package/packages/pi-tui/package.json +2 -2
  383. package/packages/rpc-client/package.json +2 -2
  384. package/pkg/package.json +1 -1
  385. package/src/resources/GSD-WORKFLOW.md +5 -4
  386. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  387. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  388. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  389. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  390. package/src/resources/extensions/async-jobs/index.ts +79 -0
  391. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  392. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  393. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  394. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  395. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  396. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  397. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  398. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  399. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  400. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  401. package/src/resources/extensions/browser-tools/index.ts +71 -13
  402. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  403. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  404. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  405. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  406. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +40 -4
  407. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -0
  408. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  409. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  410. package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
  411. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  412. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  413. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  414. package/src/resources/extensions/gsd/auto/orchestrator.ts +137 -61
  415. package/src/resources/extensions/gsd/auto/phases.ts +74 -26
  416. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  417. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  418. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  419. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  420. package/src/resources/extensions/gsd/auto-post-unit.ts +52 -13
  421. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  422. package/src/resources/extensions/gsd/auto-start.ts +24 -29
  423. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  424. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  425. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  426. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  427. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  428. package/src/resources/extensions/gsd/auto-worktree.ts +41 -364
  429. package/src/resources/extensions/gsd/auto.ts +64 -25
  430. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  431. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  432. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +33 -12
  433. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  434. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  435. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
  436. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
  437. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  438. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  439. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  440. package/src/resources/extensions/gsd/captures.ts +5 -16
  441. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  442. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  443. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  444. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  445. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  446. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  447. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  448. package/src/resources/extensions/gsd/constants.ts +0 -3
  449. package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
  450. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  451. package/src/resources/extensions/gsd/db/queries.ts +490 -0
  452. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  453. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  454. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  455. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  456. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  457. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  458. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  459. package/src/resources/extensions/gsd/doctor-engine-checks.ts +3 -3
  460. package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
  461. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  462. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
  463. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  464. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  465. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  466. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  467. package/src/resources/extensions/gsd/files.ts +33 -12
  468. package/src/resources/extensions/gsd/git-service.ts +1 -0
  469. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  470. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  471. package/src/resources/extensions/gsd/gsd-db.ts +176 -2375
  472. package/src/resources/extensions/gsd/guidance.ts +217 -0
  473. package/src/resources/extensions/gsd/guided-flow.ts +71 -31
  474. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  475. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  476. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  477. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  478. package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
  479. package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
  480. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  481. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  482. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  483. package/src/resources/extensions/gsd/model-router.ts +3 -0
  484. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  485. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  486. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  487. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  488. package/src/resources/extensions/gsd/paths.ts +42 -22
  489. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  490. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  491. package/src/resources/extensions/gsd/preferences.ts +18 -0
  492. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  493. package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  494. package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
  495. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  496. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  497. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  498. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  499. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  500. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  501. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  502. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  503. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  504. package/src/resources/extensions/gsd/prompts/run-uat.md +7 -5
  505. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  506. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  507. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  508. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  509. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  510. package/src/resources/extensions/gsd/publication.ts +122 -0
  511. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  512. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  513. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  514. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  515. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  516. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  517. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  518. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  519. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  520. package/src/resources/extensions/gsd/state.ts +9 -21
  521. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  522. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  523. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +123 -0
  524. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +91 -0
  525. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
  526. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
  527. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  528. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  529. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  530. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  531. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  532. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  533. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  534. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  535. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  536. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  537. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  538. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  539. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  540. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  541. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
  542. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  543. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
  544. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  545. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  546. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  547. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  548. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  549. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  550. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  551. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  552. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  553. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  554. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  555. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  556. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +2 -6
  557. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  558. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
  559. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  560. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  561. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
  562. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  563. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
  564. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  565. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  566. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  567. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  568. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  569. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
  570. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  571. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  572. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  573. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  574. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  575. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  576. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  577. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
  578. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  579. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -1
  580. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  581. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  582. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
  583. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  584. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  585. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  586. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
  587. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  588. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
  589. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  590. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  591. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  592. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  593. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  594. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  595. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  596. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  597. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  598. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  599. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  600. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
  601. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  602. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  603. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
  604. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  605. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
  606. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  607. package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
  608. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  609. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  610. package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
  611. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  612. package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
  613. package/src/resources/extensions/gsd/tools/complete-task.ts +3 -2
  614. package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
  615. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
  616. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  617. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  618. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
  619. package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
  620. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  621. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  622. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  623. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  624. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  625. package/src/resources/extensions/gsd/undo.ts +9 -8
  626. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  627. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  628. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  629. package/src/resources/extensions/gsd/unit-registry.ts +412 -0
  630. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  631. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  632. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  633. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  634. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  635. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  636. package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
  637. package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
  638. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  639. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  640. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  641. package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
  642. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  643. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  644. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  645. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  646. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  647. package/src/resources/shared/package-manager-detection.ts +1 -1
  648. package/src/resources/shared/package.json +3 -0
  649. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  650. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  651. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  652. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  653. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  654. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  655. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  656. package/src/resources/skills/gsd-browser/SKILL.md +1 -1
  657. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  658. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  659. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  660. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  661. /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → McokybTayhff1xEVc-d3T}/_buildManifest.js +0 -0
  662. /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → McokybTayhff1xEVc-d3T}/_ssgManifest.js +0 -0
@@ -1,187 +1,14 @@
1
1
  // Project/App: gsd-pi
2
- // File Purpose: Central Unit-to-tool contracts for phase-aware GSD tool surfaces.
3
- export const RUN_UAT_WORKFLOW_TOOL_NAMES = [
4
- "gsd_uat_exec",
5
- "gsd_uat_result_save",
6
- "gsd_resume",
7
- "gsd_milestone_status",
8
- "gsd_journal_query",
9
- ];
10
- export const RUN_UAT_READ_ONLY_TOOL_NAMES = [
11
- "find",
12
- "glob",
13
- "grep",
14
- "ls",
15
- "read",
16
- ];
17
- export const RUN_UAT_BROWSER_TOOL_NAMES = [
18
- "browser_navigate",
19
- "browser_click",
20
- "browser_type",
21
- "browser_fill_form",
22
- "browser_click_ref",
23
- "browser_fill_ref",
24
- "browser_wait_for",
25
- "browser_assert",
26
- "browser_verify",
27
- "browser_screenshot",
28
- "browser_snapshot_refs",
29
- "browser_find",
30
- "browser_get_console_logs",
31
- "browser_get_network_logs",
32
- "browser_evaluate",
33
- "browser_reload",
34
- "browser_batch",
35
- "browser_act",
36
- ];
2
+ // File Purpose: Unit-to-tool contract views derived from the Unit Registry (ADR-033).
3
+ //
4
+ // The contract data lives in unit-registry.ts (one Unit Descriptor per unit
5
+ // type). This file keeps the established import surface: the derived
6
+ // `UNIT_TOOL_CONTRACTS` table and its accessor functions are unchanged for
7
+ // consumers.
8
+ import { UNIT_REGISTRY, } from "./unit-registry.js";
9
+ export { RUN_UAT_WORKFLOW_TOOL_NAMES, RUN_UAT_READ_ONLY_TOOL_NAMES, RUN_UAT_BROWSER_TOOL_NAMES, } from "./unit-registry.js";
37
10
  export const RUN_UAT_TOOL_PRESENTATION_PLAN_ID = "run-uat/default-v1";
38
- export const UNIT_TOOL_CONTRACTS = {
39
- "research-milestone": {
40
- allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
41
- requiredWorkflowTools: ["gsd_summary_save"],
42
- },
43
- "plan-milestone": {
44
- allowedGsdTools: [
45
- "gsd_milestone_status",
46
- "gsd_plan_milestone",
47
- "gsd_plan_slice",
48
- "gsd_decision_save",
49
- "gsd_requirement_update",
50
- ],
51
- requiredWorkflowTools: ["gsd_milestone_status", "gsd_plan_milestone", "gsd_plan_slice"],
52
- },
53
- "discuss-milestone": {
54
- allowedGsdTools: [
55
- "gsd_summary_save",
56
- "gsd_decision_save",
57
- "gsd_requirement_save",
58
- "gsd_requirement_update",
59
- "gsd_plan_milestone",
60
- "gsd_milestone_generate_id",
61
- ],
62
- requiredWorkflowTools: [
63
- "ask_user_questions",
64
- "gsd_summary_save",
65
- "gsd_requirement_save",
66
- "gsd_requirement_update",
67
- "gsd_plan_milestone",
68
- "gsd_milestone_generate_id",
69
- ],
70
- },
71
- "discuss-slice": {
72
- allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
73
- requiredWorkflowTools: ["ask_user_questions", "gsd_summary_save"],
74
- },
75
- "validate-milestone": {
76
- allowedGsdTools: ["gsd_milestone_status", "gsd_validate_milestone", "gsd_reassess_roadmap", "subagent"],
77
- requiredWorkflowTools: ["gsd_milestone_status", "gsd_validate_milestone", "gsd_reassess_roadmap"],
78
- },
79
- "complete-milestone": {
80
- allowedGsdTools: [
81
- "gsd_milestone_status",
82
- "gsd_requirement_update",
83
- "gsd_summary_save",
84
- "gsd_complete_milestone",
85
- "subagent",
86
- ],
87
- requiredWorkflowTools: [
88
- "gsd_milestone_status",
89
- "gsd_requirement_update",
90
- "gsd_summary_save",
91
- "gsd_complete_milestone",
92
- ],
93
- },
94
- "research-slice": {
95
- allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
96
- requiredWorkflowTools: ["gsd_summary_save"],
97
- },
98
- "plan-slice": {
99
- allowedGsdTools: ["gsd_plan_slice", "gsd_reassess_roadmap", "gsd_decision_save"],
100
- requiredWorkflowTools: ["gsd_plan_slice", "gsd_reassess_roadmap"],
101
- },
102
- "refine-slice": {
103
- allowedGsdTools: ["gsd_plan_slice", "gsd_decision_save"],
104
- requiredWorkflowTools: ["gsd_plan_slice"],
105
- },
106
- "replan-slice": {
107
- allowedGsdTools: ["gsd_replan_slice", "gsd_decision_save"],
108
- requiredWorkflowTools: ["gsd_replan_slice"],
109
- },
110
- "complete-slice": {
111
- allowedGsdTools: [
112
- "gsd_slice_complete",
113
- "gsd_task_reopen",
114
- "gsd_replan_slice",
115
- "gsd_decision_save",
116
- "gsd_requirement_update",
117
- "gsd_summary_save",
118
- "subagent",
119
- ],
120
- requiredWorkflowTools: [
121
- "gsd_slice_complete",
122
- "gsd_task_reopen",
123
- "gsd_replan_slice",
124
- "gsd_requirement_update",
125
- "gsd_summary_save",
126
- ],
127
- forbiddenGsdTools: {
128
- gsd_uat_result_save: "Run UAT owns persisted UAT Assessment.",
129
- },
130
- },
131
- "reassess-roadmap": {
132
- allowedGsdTools: ["gsd_milestone_status", "gsd_reassess_roadmap"],
133
- requiredWorkflowTools: ["gsd_milestone_status", "gsd_reassess_roadmap"],
134
- },
135
- "execute-task": {
136
- allowedGsdTools: ["gsd_task_complete", "gsd_decision_save"],
137
- requiredWorkflowTools: ["gsd_task_complete"],
138
- },
139
- "execute-task-simple": {
140
- allowedGsdTools: ["gsd_task_complete", "gsd_decision_save"],
141
- requiredWorkflowTools: ["gsd_task_complete"],
142
- },
143
- "reactive-execute": {
144
- allowedGsdTools: ["gsd_task_complete", "gsd_summary_save", "gsd_decision_save"],
145
- requiredWorkflowTools: ["gsd_task_complete", "gsd_summary_save"],
146
- },
147
- "run-uat": {
148
- allowedGsdTools: [...RUN_UAT_WORKFLOW_TOOL_NAMES, "subagent"],
149
- requiredWorkflowTools: [...RUN_UAT_WORKFLOW_TOOL_NAMES],
150
- forbiddenGsdTools: {
151
- gsd_exec: "Use gsd_uat_exec so acceptance evidence is typed as UAT-owned.",
152
- gsd_save_gate_result: "gsd_uat_result_save owns the aggregate UAT gate.",
153
- gsd_summary_save: "gsd_uat_result_save owns persisted UAT Assessment writes.",
154
- },
155
- },
156
- "gate-evaluate": {
157
- allowedGsdTools: ["gsd_save_gate_result"],
158
- requiredWorkflowTools: ["gsd_save_gate_result"],
159
- },
160
- "rewrite-docs": {
161
- allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
162
- requiredWorkflowTools: [],
163
- },
164
- "workflow-preferences": {
165
- allowedGsdTools: ["gsd_summary_save"],
166
- requiredWorkflowTools: [],
167
- },
168
- "discuss-project": {
169
- allowedGsdTools: ["gsd_summary_save", "gsd_decision_save", "gsd_requirement_save"],
170
- requiredWorkflowTools: ["ask_user_questions", "gsd_summary_save"],
171
- },
172
- "discuss-requirements": {
173
- allowedGsdTools: ["gsd_requirement_save", "gsd_summary_save"],
174
- requiredWorkflowTools: ["ask_user_questions", "gsd_requirement_save", "gsd_summary_save"],
175
- },
176
- "research-decision": {
177
- allowedGsdTools: ["gsd_summary_save"],
178
- requiredWorkflowTools: ["ask_user_questions"],
179
- },
180
- "research-project": {
181
- allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
182
- requiredWorkflowTools: [],
183
- },
184
- };
11
+ export const UNIT_TOOL_CONTRACTS = Object.fromEntries(Object.entries(UNIT_REGISTRY).flatMap(([unitType, descriptor]) => descriptor.toolContract ? [[unitType, descriptor.toolContract]] : []));
185
12
  export const AUTO_UNIT_SCOPED_TOOLS = Object.fromEntries(Object.entries(UNIT_TOOL_CONTRACTS).map(([unitType, contract]) => [unitType, contract.allowedGsdTools]));
186
13
  export function getUnitToolSurfaceContract(unitType) {
187
14
  return UNIT_TOOL_CONTRACTS[unitType];
@@ -128,7 +128,7 @@ export function isValidMilestoneVerdict(verdict) {
128
128
  * Extract the UAT type from content, defaulting to `"artifact-driven"`.
129
129
  *
130
130
  * The `"artifact-driven"` fallback is the original default used throughout
131
- * the codebase when a UAT file lacks an explicit `## UAT Type` section.
131
+ * the codebase when a UAT file has no parseable UAT mode declaration.
132
132
  */
133
133
  export function getUatType(content) {
134
134
  return getDeclaredUatType(content);
@@ -1,5 +1,6 @@
1
1
  // Project/App: gsd-pi
2
2
  // File Purpose: Host-owned verification verdict policy for auto-mode units.
3
+ export const NO_HOST_CHECKS_FAILURE_CONTEXT = "No runnable host-owned verification command was discovered. Add project verification_commands in .gsd/PREFERENCES.md or a runnable task-plan Verify command, then resume with /gsd next.";
3
4
  export function decideVerificationVerdict(unitType, result) {
4
5
  if (unitType === "execute-task" && result.discoverySource === "task-plan-prose" && result.checks.length === 0) {
5
6
  return {
@@ -14,7 +15,7 @@ export function decideVerificationVerdict(unitType, result) {
14
15
  passed: false,
15
16
  reason: "no-host-checks",
16
17
  retryable: false,
17
- failureContext: "No runnable host-owned verification command was discovered. Add project verification_commands or a runnable task-plan Verify command before completing this execute-task.",
18
+ failureContext: NO_HOST_CHECKS_FAILURE_CONTEXT,
18
19
  };
19
20
  }
20
21
  if (!result.passed) {
@@ -1,8 +1,10 @@
1
1
  // Project/App: gsd-pi
2
- // File Purpose: Web-app detection and Playwright/UAT guidance for planning and slice closeout.
2
+ // File Purpose: Web-app detection and browser-UAT guidance for planning and slice closeout.
3
3
  import { existsSync, readFileSync } from "node:fs";
4
4
  import { resolve } from "node:path";
5
+ import { resolveAmbientBrowserEngineResolution } from "../browser-tools/engine/selection.js";
5
6
  import { detectWebApp } from "../browser-tools/web-app-detect.js";
7
+ import { UAT_MODE_POLICIES } from "./uat-policy.js";
6
8
  export { detectWebApp };
7
9
  function readPackageJson(projectRoot) {
8
10
  const packageJsonPath = resolve(projectRoot, "package.json");
@@ -39,24 +41,56 @@ export function findPlaywrightTestScript(projectRoot) {
39
41
  }
40
42
  return null;
41
43
  }
44
+ function describeBrowserToolBacking(engineResolution) {
45
+ switch (engineResolution.engine) {
46
+ case "gsd-browser":
47
+ return "This project looks browser-facing. GSD exposes `browser_*` tools backed by the managed gsd-browser engine for run-uat.";
48
+ case "legacy":
49
+ return "This project looks browser-facing. GSD exposes Playwright-backed `browser_*` tools for run-uat.";
50
+ case "off":
51
+ return "This project looks browser-facing, but Pi browser tools are disabled (GSD_BROWSER_ENGINE=off) — prefer `runtime-executable` UAT with automated browser test commands.";
52
+ }
53
+ }
54
+ // One bullet per recommended UAT mode; `mode` keys into UAT_MODE_POLICIES so
55
+ // modes that require browser tools drop out of the guidance when the resolved
56
+ // engine provides none (mixed/live-runtime share one bullet and one policy bit).
57
+ const UAT_MODE_GUIDANCE = [
58
+ {
59
+ mode: "browser-executable",
60
+ bullet: "- `browser-executable` — navigate to `http://localhost:…`, click, screenshot, assert via `browser_*` tools during run-uat",
61
+ },
62
+ {
63
+ mode: "runtime-executable",
64
+ bullet: "- `runtime-executable` — run an automated browser test command via `gsd_uat_exec` (for example `npx playwright test`)",
65
+ },
66
+ {
67
+ mode: "mixed",
68
+ bullet: "- `mixed` / `live-runtime` — combine runtime startup checks with interactive browser verification",
69
+ },
70
+ ];
42
71
  /**
43
72
  * Markdown block injected into plan/complete-slice prompts when the project
44
- * looks browser-facing. Returns null for CLI/library-only repos.
73
+ * looks browser-facing. Returns null for CLI/library-only repos. Guidance is
74
+ * composed from the resolved Browser Automation Engine so prompts never claim
75
+ * an engine the runtime is not using; `engineResolution` is injectable for
76
+ * tests and defaults to the ambient resolution.
45
77
  */
46
- export function buildWebAppUatGuidanceBlock(projectRoot) {
78
+ export function buildWebAppUatGuidanceBlock(projectRoot, engineResolution) {
47
79
  if (!detectWebApp(projectRoot))
48
80
  return null;
81
+ const resolvedEngine = engineResolution ?? resolveAmbientBrowserEngineResolution(projectRoot);
82
+ const browserToolsAvailable = resolvedEngine.engine !== "off";
49
83
  const playwrightScript = findPlaywrightTestScript(projectRoot);
50
84
  const hasPlaywright = hasPlaywrightTestDependency(projectRoot) || playwrightScript !== null;
51
85
  const lines = [
52
86
  "### Web App UAT (detected)",
53
87
  "",
54
- "This project looks browser-facing. GSD exposes Playwright-backed `browser_*` tools by default for run-uat.",
88
+ describeBrowserToolBacking(resolvedEngine),
55
89
  "",
56
90
  "**UAT modes (pick one per slice — do not use `artifact-driven` for browser steps):**",
57
- "- `browser-executable` — navigate to `http://localhost:…`, click, screenshot, assert via `browser_*` tools during run-uat",
58
- "- `runtime-executable` run an automated browser test command via `gsd_uat_exec` (for example `npx playwright test`)",
59
- "- `mixed` / `live-runtime` — combine runtime startup checks with interactive browser verification",
91
+ ...UAT_MODE_GUIDANCE
92
+ .filter(({ mode }) => browserToolsAvailable || !UAT_MODE_POLICIES[mode].browserTools)
93
+ .map(({ bullet }) => bullet),
60
94
  "",
61
95
  "**Planning / closeout rules:**",
62
96
  "- Preconditions must name the dev-server command and URL (for example `npm run dev` → `http://localhost:3000`)",
@@ -74,7 +108,10 @@ export function buildWebAppUatGuidanceBlock(projectRoot) {
74
108
  lines.push("- Name concrete spec paths in slice Verification (for example `e2e/smoke.spec.ts`)");
75
109
  }
76
110
  else {
77
- lines.push("", "**Playwright scaffolding (first UI slice):** no `playwright` / `@playwright/test` dependency yet.", "- Add a planning task that installs Playwright, adds `playwright.config.ts`, and creates a minimal smoke spec (for example `e2e/smoke.spec.ts`)", "- Task `verify` should run `npx playwright test` (or the focused spec) with a safe, simple command", "- Until specs exist, use `browser-executable` UAT with localhost preconditions and interactive `browser_*` checks at slice closeout");
111
+ lines.push("", "**Playwright scaffolding (first UI slice):** no `playwright` / `@playwright/test` dependency yet.", "- Add a planning task that installs Playwright, adds `playwright.config.ts`, and creates a minimal smoke spec (for example `e2e/smoke.spec.ts`)", "- Task `verify` should run `npx playwright test` (or the focused spec) with a safe, simple command");
112
+ if (browserToolsAvailable) {
113
+ lines.push("- Until specs exist, use `browser-executable` UAT with localhost preconditions and interactive `browser_*` checks at slice closeout");
114
+ }
78
115
  }
79
116
  return lines.join("\n");
80
117
  }
@@ -8,7 +8,7 @@ export const WORKFLOW_TOOL_ALIAS_NAMES = CONTRACT_WORKFLOW_TOOL_ALIAS_NAMES;
8
8
  export const DB_WORKFLOW_TOOL_NAMES = CONTRACT_WORKFLOW_TOOL_NAMES;
9
9
  export const WORKFLOW_TOOL_ALIAS_PAIRS = WORKFLOW_TOOL_CONTRACTS.flatMap((tool) => tool.aliases.map((alias) => ({ canonical: tool.canonicalName, alias })));
10
10
  export const WORKFLOW_TOOL_ALIAS_TO_CANONICAL = Object.fromEntries(WORKFLOW_TOOL_ALIAS_PAIRS.map(({ alias, canonical }) => [alias, canonical]));
11
- const WORKFLOW_MCP_ADAPTER_TOOL_NAMES = [
11
+ export const WORKFLOW_MCP_ADAPTER_TOOL_NAMES = [
12
12
  "gsd_cancel",
13
13
  "gsd_captures",
14
14
  "ask_user_questions",
@@ -0,0 +1,293 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Git checkout/stash/merge-state recovery primitives for worktree operations.
3
+ /**
4
+ * Worktree Git Recovery — the recurring-bug hot spot, in one place.
5
+ *
6
+ * Owns the verbs that recover a repository from interrupted or conflicting
7
+ * git operations during worktree transitions:
8
+ *
9
+ * - `checkoutBranchWithStashGuard` — branch switch with stash protection,
10
+ * including the stash-pop EEXIST collision recovery for untracked files
11
+ * (force-checkout + targeted stash drop; #645 broadened it beyond `.gsd/`,
12
+ * guarded by "no non-.gsd unmerged entries remain").
13
+ * - `removeMergeStateFiles` — clears SQUASH_MSG / MERGE_HEAD / etc. left by
14
+ * a failed merge so subsequent merges don't fail on stale state.
15
+ * - `cleanupConflictState` — merge-abort + index reset + state-file cleanup
16
+ * after a conflicted (including squash) merge.
17
+ * - stash helpers (`popStashByRef`, `stashRefFromError`,
18
+ * `stashAlreadyExistsFilesFromError`, `gsdJsonlFilesWithConflictMarkers`)
19
+ * used by the merge pipeline in auto-worktree.ts.
20
+ *
21
+ * Extracted from auto-worktree.ts so recovery fixes land here instead of as
22
+ * embedded special cases in a 2,600-line orchestration module, and so the
23
+ * rules can be tested against scripted git states.
24
+ *
25
+ * The State Reconciliation drift repair (`state-reconciliation/drift/
26
+ * merge-state.ts`) keeps its own merge-state primitive by design — drift
27
+ * repairs own their raw primitives (see CONTEXT.md, Drift repair).
28
+ */
29
+ import { execFileSync } from "node:child_process";
30
+ import { existsSync, readFileSync, unlinkSync } from "node:fs";
31
+ import { isAbsolute, join, resolve } from "node:path";
32
+ import { debugLog } from "./debug-logger.js";
33
+ import { logError, logWarning } from "./workflow-logger.js";
34
+ import { nativeAddPaths, nativeCheckoutBranch, nativeConflictFiles, nativeLsFiles, nativeMergeAbort, nativeWorkingTreeStatus, } from "./native-git-bridge.js";
35
+ import { resolveGitDir } from "./worktree-manager.js";
36
+ /**
37
+ * Pop the stash entry created with `stashMarker` in its subject, resolving it
38
+ * to a concrete `stash@{n}` ref first so a concurrent stash push cannot make
39
+ * `git stash pop` grab the wrong entry.
40
+ *
41
+ * If `stashMarker` is null or no longer present in the stash list (e.g. a
42
+ * concurrent process popped/dropped it), leaves the stash list untouched and
43
+ * returns null.
44
+ *
45
+ * Throws on pop failure so callers can handle conflict cases the same way
46
+ * they would with the prior `git stash pop` form. When throwing after a
47
+ * targeted pop attempt, the error is annotated with the targeted stash ref.
48
+ *
49
+ * (Issue #4980 HIGH-6)
50
+ */
51
+ export function popStashByRef(basePath, stashMarker) {
52
+ let popArg = null;
53
+ if (stashMarker) {
54
+ try {
55
+ const list = execFileSync("git", ["stash", "list", "--format=%gd%x00%s"], {
56
+ cwd: basePath,
57
+ stdio: ["ignore", "pipe", "pipe"],
58
+ encoding: "utf-8",
59
+ }).trim().split("\n").filter(Boolean);
60
+ for (const entry of list) {
61
+ const [ref, subject] = entry.split("\0");
62
+ if (ref && subject?.includes(stashMarker)) {
63
+ popArg = ref;
64
+ break;
65
+ }
66
+ }
67
+ }
68
+ catch (err) {
69
+ logWarning("worktree", `stash list lookup failed; leaving stash untouched: ${err instanceof Error ? err.message : String(err)}`);
70
+ }
71
+ }
72
+ if (!popArg) {
73
+ logWarning("worktree", "recorded stash entry could not be resolved; skipping automatic pop");
74
+ return null;
75
+ }
76
+ try {
77
+ execFileSync("git", ["stash", "pop", popArg], {
78
+ cwd: basePath,
79
+ stdio: ["ignore", "pipe", "pipe"],
80
+ encoding: "utf-8",
81
+ });
82
+ }
83
+ catch (err) {
84
+ if (err && typeof err === "object") {
85
+ err.stashRef = popArg;
86
+ }
87
+ throw err;
88
+ }
89
+ return popArg;
90
+ }
91
+ /**
92
+ * Extract a stash ref annotation injected by popStashByRef() when git stash
93
+ * pop fails and we need to conditionally drop the exact stash entry later.
94
+ */
95
+ export function stashRefFromError(err) {
96
+ if (!err || typeof err !== "object")
97
+ return null;
98
+ const stashRef = err.stashRef;
99
+ return typeof stashRef === "string" && stashRef.length > 0 ? stashRef : null;
100
+ }
101
+ export function stashAlreadyExistsFilesFromError(err) {
102
+ if (!err || typeof err !== "object")
103
+ return [];
104
+ const stderr = err.stderr;
105
+ const stderrText = typeof stderr === "string"
106
+ ? stderr
107
+ : stderr instanceof Uint8Array
108
+ ? Buffer.from(stderr).toString("utf-8")
109
+ : "";
110
+ const message = err instanceof Error ? err.message : String(err);
111
+ const text = `${stderrText}\n${message}`;
112
+ const files = new Set();
113
+ for (const line of text.split("\n")) {
114
+ const m = line.match(/^(.*?)\s+already exists, no checkout\s*$/i);
115
+ if (!m)
116
+ continue;
117
+ const filePath = m[1]?.trim();
118
+ if (filePath)
119
+ files.add(filePath);
120
+ }
121
+ return [...files];
122
+ }
123
+ /**
124
+ * Detect whether an on-disk file still contains unresolved merge conflict
125
+ * markers from a failed stash-pop or merge attempt.
126
+ *
127
+ * Returns false when the file cannot be read.
128
+ */
129
+ export function hasConflictMarkers(filePath) {
130
+ try {
131
+ const content = readFileSync(filePath, "utf-8");
132
+ return content.includes("<<<<<<<") && content.includes("=======") && content.includes(">>>>>>>");
133
+ }
134
+ catch {
135
+ return false;
136
+ }
137
+ }
138
+ export function gsdJsonlFilesWithConflictMarkers(basePath) {
139
+ return nativeLsFiles(basePath, ".gsd/*.jsonl").filter((f) => hasConflictMarkers(join(basePath, f)));
140
+ }
141
+ export function removeMergeStateFiles(basePath, contextLabel) {
142
+ try {
143
+ for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_MODE", "MERGE_HEAD", "AUTO_MERGE"]) {
144
+ const rawPath = execFileSync("git", ["rev-parse", "--git-path", f], {
145
+ cwd: basePath,
146
+ stdio: ["ignore", "pipe", "pipe"],
147
+ encoding: "utf-8",
148
+ }).trim();
149
+ const p = rawPath.length > 0
150
+ ? (isAbsolute(rawPath) ? rawPath : resolve(basePath, rawPath))
151
+ : join(resolveGitDir(basePath), f);
152
+ if (existsSync(p))
153
+ unlinkSync(p);
154
+ }
155
+ }
156
+ catch (err) {
157
+ logError("worktree", `${contextLabel} merge state cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
158
+ }
159
+ }
160
+ export function cleanupConflictState(basePath) {
161
+ // Merge conflicts can leave unmerged index entries; merge-abort alone is not
162
+ // enough for squash merges (MERGE_HEAD is never written). Reset the merge
163
+ // index, then remove merge message files that native/libgit2 paths may have
164
+ // created.
165
+ try {
166
+ nativeMergeAbort(basePath);
167
+ }
168
+ catch (err) {
169
+ // MERGE_HEAD absent (squash merge path) — abort is a no-op, which is fine.
170
+ debugLog("conflict-cleanup:merge-abort-skipped", {
171
+ error: err instanceof Error ? err.message : String(err),
172
+ });
173
+ }
174
+ try {
175
+ execFileSync("git", ["reset", "--merge"], {
176
+ cwd: basePath,
177
+ stdio: ["ignore", "pipe", "pipe"],
178
+ encoding: "utf-8",
179
+ });
180
+ }
181
+ catch (err) {
182
+ logError("worktree", `git reset --merge failed after merge conflict: ${err instanceof Error ? err.message : String(err)}`);
183
+ }
184
+ removeMergeStateFiles(basePath, "conflict");
185
+ }
186
+ export function checkoutBranchWithStashGuard(basePath, branch, reason) {
187
+ let stashMarker = null;
188
+ let stashed = false;
189
+ const status = nativeWorkingTreeStatus(basePath).trim();
190
+ if (status.length > 0) {
191
+ stashMarker = `gsd-checkout-stash:${reason}:${process.pid}:${Date.now()}:${process.hrtime.bigint().toString(36)}`;
192
+ const stashListBefore = execFileSync("git", ["stash", "list"], {
193
+ cwd: basePath,
194
+ stdio: ["ignore", "pipe", "pipe"],
195
+ encoding: "utf-8",
196
+ });
197
+ execFileSync("git", ["stash", "push", "--include-untracked", "-m", `gsd: checkout stash [${stashMarker}]`], {
198
+ cwd: basePath,
199
+ stdio: ["ignore", "pipe", "pipe"],
200
+ encoding: "utf-8",
201
+ });
202
+ const stashListAfter = execFileSync("git", ["stash", "list"], {
203
+ cwd: basePath,
204
+ stdio: ["ignore", "pipe", "pipe"],
205
+ encoding: "utf-8",
206
+ });
207
+ stashed = stashListAfter !== stashListBefore;
208
+ }
209
+ // Checkout and stash-restore are split so we can distinguish two failure
210
+ // modes: (a) checkout failed → HEAD did not move, restore stash and rethrow;
211
+ // (b) checkout succeeded but stash pop failed → HEAD moved to `branch` but
212
+ // the working-tree changes remain in the stash list. We surface a distinct
213
+ // error in case (b) so callers don't assume the branch switch was rolled back.
214
+ try {
215
+ nativeCheckoutBranch(basePath, branch);
216
+ }
217
+ catch (checkoutErr) {
218
+ if (stashed) {
219
+ try {
220
+ popStashByRef(basePath, stashMarker);
221
+ }
222
+ catch (restoreErr) {
223
+ logWarning("worktree", `git stash pop failed during checkout restore: ${restoreErr instanceof Error ? restoreErr.message : String(restoreErr)}`);
224
+ }
225
+ }
226
+ throw checkoutErr;
227
+ }
228
+ if (stashed) {
229
+ try {
230
+ popStashByRef(basePath, stashMarker);
231
+ }
232
+ catch (popErr) {
233
+ const msg = popErr instanceof Error ? popErr.message : String(popErr);
234
+ const stderr = popErr && typeof popErr === "object"
235
+ ? popErr.stderr
236
+ : undefined;
237
+ const stderrText = typeof stderr === "string"
238
+ ? stderr
239
+ : stderr instanceof Uint8Array
240
+ ? Buffer.from(stderr).toString("utf-8")
241
+ : "";
242
+ const stashPopMessage = `${stderrText}\n${msg}`.trim();
243
+ const alreadyExists = stashAlreadyExistsFilesFromError(popErr);
244
+ const isUntrackedRestoreFailure = stashPopMessage.includes("could not restore untracked files from stash");
245
+ const stashRefForDrop = stashRefFromError(popErr);
246
+ const allConflictFiles = nativeConflictFiles(basePath);
247
+ const nonGsdUnmerged = allConflictFiles.filter((f) => !f.startsWith(".gsd/"));
248
+ const gsdUnmerged = allConflictFiles.filter((f) => f.startsWith(".gsd/"));
249
+ const gsdContentConflicts = isUntrackedRestoreFailure
250
+ ? gsdJsonlFilesWithConflictMarkers(basePath)
251
+ : [];
252
+ // Resolve ALL untracked-collision files by accepting HEAD — files in
253
+ // alreadyExists were untracked on the source branch by definition of the
254
+ // "already exists, no checkout" failure, so target HEAD is authoritative.
255
+ // gsdUnmerged: .gsd/ index conflicts left by the partial stash pop are
256
+ // also resolved via HEAD — .gsd/ runtime state is always authoritative
257
+ // on the target branch, so accepting HEAD is safe here too.
258
+ const resolvable = [...new Set([...alreadyExists, ...gsdContentConflicts, ...gsdUnmerged])];
259
+ if (isUntrackedRestoreFailure &&
260
+ resolvable.length > 0 &&
261
+ nonGsdUnmerged.length === 0) {
262
+ for (const f of resolvable) {
263
+ execFileSync("git", ["checkout", "HEAD", "--", f], {
264
+ cwd: basePath,
265
+ stdio: ["ignore", "pipe", "pipe"],
266
+ encoding: "utf-8",
267
+ });
268
+ nativeAddPaths(basePath, [f]);
269
+ }
270
+ if (stashRefForDrop) {
271
+ try {
272
+ execFileSync("git", ["stash", "drop", stashRefForDrop], {
273
+ cwd: basePath,
274
+ stdio: ["ignore", "pipe", "pipe"],
275
+ encoding: "utf-8",
276
+ });
277
+ }
278
+ catch (err) { /* stash may already be consumed */
279
+ logWarning("worktree", `git stash drop failed: ${err instanceof Error ? err.message : String(err)}`);
280
+ }
281
+ }
282
+ else {
283
+ logWarning("worktree", "recorded stash entry could not be resolved; skipping automatic drop");
284
+ }
285
+ return;
286
+ }
287
+ const wrapped = new Error(`checkout to '${branch}' succeeded but stash restore failed; working tree changes remain in the stash list. Original error: ${msg}`);
288
+ if (stashRefForDrop)
289
+ wrapped.stashRef = stashRefForDrop;
290
+ throw wrapped;
291
+ }
292
+ }
293
+ }
@@ -32,6 +32,7 @@ import { getCollapseCadence, getMilestoneResquash, resquashMilestoneOnMain, } fr
32
32
  // callers — production wiring previously injected them via deps; the seam
33
33
  // added type churn without enabling test variation.
34
34
  import { loadEffectiveGSDPreferences, getIsolationMode } from "./preferences.js";
35
+ import { isolationDegradedFallbackGuidance, worktreeCreationFailedGuidance } from "./guidance.js";
35
36
  import { invalidateAllCaches } from "./cache.js";
36
37
  import { resolveMilestoneFile } from "./paths.js";
37
38
  import { getMilestone, insertMilestone, isDbAvailable, updateMilestoneStatus } from "./gsd-db.js";
@@ -327,7 +328,15 @@ export function _enterMilestoneCore(s, deps, milestoneId, ctx, opts = {}) {
327
328
  // Handles the case where originalBasePath is falsy and basePath is itself
328
329
  // a worktree path — prevents double-nested worktree paths (#3729).
329
330
  const basePath = resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
330
- const mode = opts.modeOverride ?? getIsolationMode(basePath);
331
+ // A stranded-recovery session that adopted the milestone branch in the
332
+ // project root must keep re-entering in that mode: the root checkout holds
333
+ // the branch, so creating the canonical worktree would fail with "already
334
+ // in use by another worktree". The override clears when the recovered
335
+ // milestone merges (_mergeAndExit), restoring configured isolation for
336
+ // subsequent milestones.
337
+ const mode = opts.modeOverride ??
338
+ s.strandedRecoveryIsolationMode ??
339
+ getIsolationMode(basePath);
331
340
  if (s.isolationDegraded) {
332
341
  if (mode === "worktree") {
333
342
  try {
@@ -335,7 +344,7 @@ export function _enterMilestoneCore(s, deps, milestoneId, ctx, opts = {}) {
335
344
  s.basePath = basePath;
336
345
  rebuildGitService(s, deps);
337
346
  invalidateAllCaches();
338
- ctx.notify(`Worktree isolation is degraded. Fell back to branch milestone/${milestoneId}.`, "warning");
347
+ ctx.notify(isolationDegradedFallbackGuidance(milestoneId), "warning");
339
348
  return { ok: true, mode: "branch", path: basePath };
340
349
  }
341
350
  catch (err) {
@@ -509,7 +518,7 @@ export function _enterMilestoneCore(s, deps, milestoneId, ctx, opts = {}) {
509
518
  eventType: "worktree-create-failed",
510
519
  data: { milestoneId, error: msg, fallback: "project-root" },
511
520
  });
512
- ctx.notify(`Auto-worktree creation for ${milestoneId} failed: ${msg}. Continuing in project root.`, "warning");
521
+ ctx.notify(worktreeCreationFailedGuidance(milestoneId, msg), "warning");
513
522
  // Degrade isolation for the rest of this session so mergeAndExit
514
523
  // doesn't try to merge a nonexistent worktree branch (#2483)
515
524
  s.isolationDegraded = true;