@opengsd/gsd-pi 1.2.0-dev.844675c9 → 1.2.0-dev.8e6112e9

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 (1016) hide show
  1. package/dist/cli-model-override.d.ts +15 -0
  2. package/dist/cli-model-override.js +21 -0
  3. package/dist/cli-style.d.ts +17 -0
  4. package/dist/cli-style.js +28 -0
  5. package/dist/cli-web-branch.d.ts +2 -0
  6. package/dist/cli-web-branch.js +9 -2
  7. package/dist/cli.js +2 -19
  8. package/dist/headless-events.d.ts +4 -2
  9. package/dist/headless-events.js +14 -34
  10. package/dist/help-text.js +5 -0
  11. package/dist/loader.js +6 -4
  12. package/dist/mcp-server.js +2 -1
  13. package/dist/models-resolver.d.ts +3 -13
  14. package/dist/models-resolver.js +3 -22
  15. package/dist/register-agent-bundles.d.ts +11 -2
  16. package/dist/register-agent-bundles.js +18 -4
  17. package/dist/resource-loader.d.ts +10 -5
  18. package/dist/resource-loader.js +123 -20
  19. package/dist/resources/.managed-resources-content-hash +1 -1
  20. package/dist/resources/GSD-WORKFLOW.md +5 -4
  21. package/dist/resources/extensions/ask-user-questions.js +81 -25
  22. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  23. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  24. package/dist/resources/extensions/async-jobs/index.js +65 -0
  25. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  26. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  27. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  28. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  29. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  30. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  31. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  32. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  33. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  34. package/dist/resources/extensions/browser-tools/index.js +69 -12
  35. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  36. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +546 -426
  37. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +256 -0
  38. package/dist/resources/extensions/github-sync/templates.js +3 -3
  39. package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
  40. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  41. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  42. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  43. package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
  44. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  45. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  46. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  47. package/dist/resources/extensions/gsd/auto/loop.js +80 -56
  48. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  49. package/dist/resources/extensions/gsd/auto/orchestrator.js +310 -78
  50. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  51. package/dist/resources/extensions/gsd/auto/phases.js +17 -2299
  52. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
  53. package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
  54. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  55. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  56. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  57. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  58. package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
  59. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  60. package/dist/resources/extensions/gsd/auto-dispatch.js +56 -63
  61. package/dist/resources/extensions/gsd/auto-model-selection.js +44 -13
  62. package/dist/resources/extensions/gsd/auto-post-unit.js +47 -17
  63. package/dist/resources/extensions/gsd/auto-prompts.js +161 -26
  64. package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
  65. package/dist/resources/extensions/gsd/auto-runtime-state.js +14 -0
  66. package/dist/resources/extensions/gsd/auto-start.js +59 -52
  67. package/dist/resources/extensions/gsd/auto-timers.js +16 -2
  68. package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
  69. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  70. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +14 -47
  71. package/dist/resources/extensions/gsd/auto-verification.js +30 -37
  72. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  73. package/dist/resources/extensions/gsd/auto-worktree.js +68 -370
  74. package/dist/resources/extensions/gsd/auto.js +71 -29
  75. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  76. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  77. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
  78. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +74 -50
  79. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  80. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  81. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  82. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +316 -161
  83. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +365 -58
  84. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  85. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  86. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  87. package/dist/resources/extensions/gsd/captures.js +5 -15
  88. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
  89. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  90. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  91. package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
  92. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  93. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  94. package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
  95. package/dist/resources/extensions/gsd/commands-handlers.js +66 -3
  96. package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
  97. package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
  98. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  99. package/dist/resources/extensions/gsd/commands-ship.js +2 -2
  100. package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
  101. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  102. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  103. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  104. package/dist/resources/extensions/gsd/constants.js +0 -2
  105. package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
  106. package/dist/resources/extensions/gsd/db/engine.js +757 -0
  107. package/dist/resources/extensions/gsd/db/queries.js +428 -0
  108. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  109. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  110. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  111. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  112. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  113. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  114. package/dist/resources/extensions/gsd/db-workspace.js +103 -0
  115. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  116. package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
  117. package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
  118. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  119. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  120. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  121. package/dist/resources/extensions/gsd/doctor-environment.js +261 -136
  122. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  123. package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
  124. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  125. package/dist/resources/extensions/gsd/doctor.js +16 -9
  126. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  127. package/dist/resources/extensions/gsd/error-classifier.js +10 -1
  128. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  129. package/dist/resources/extensions/gsd/files.js +33 -19
  130. package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
  131. package/dist/resources/extensions/gsd/git-service.js +1 -0
  132. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  133. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  134. package/dist/resources/extensions/gsd/gsd-db.js +186 -2048
  135. package/dist/resources/extensions/gsd/guidance.js +158 -0
  136. package/dist/resources/extensions/gsd/guided-flow.js +174 -473
  137. package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
  138. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  139. package/dist/resources/extensions/gsd/markdown-renderer.js +12 -1
  140. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  141. package/dist/resources/extensions/gsd/mcp-filter.js +4 -20
  142. package/dist/resources/extensions/gsd/mcp-tool-name.js +18 -0
  143. package/dist/resources/extensions/gsd/md-importer.js +4 -3
  144. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  145. package/dist/resources/extensions/gsd/memory-relations.js +1 -1
  146. package/dist/resources/extensions/gsd/migrate/safety.js +22 -11
  147. package/dist/resources/extensions/gsd/migration-auto-check.js +27 -5
  148. package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
  149. package/dist/resources/extensions/gsd/milestone-closeout.js +97 -28
  150. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
  151. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
  152. package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
  153. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  154. package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
  155. package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
  156. package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
  157. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  158. package/dist/resources/extensions/gsd/model-router.js +3 -0
  159. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  160. package/dist/resources/extensions/gsd/notifications.js +12 -7
  161. package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
  162. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  163. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  164. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
  165. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  166. package/dist/resources/extensions/gsd/paths.js +37 -24
  167. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  168. package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
  169. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  170. package/dist/resources/extensions/gsd/preferences.js +161 -29
  171. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  172. package/dist/resources/extensions/gsd/prompts/complete-slice.md +5 -4
  173. package/dist/resources/extensions/gsd/prompts/execute-task.md +5 -2
  174. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
  175. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  176. package/dist/resources/extensions/gsd/prompts/plan-slice.md +3 -2
  177. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  178. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  179. package/dist/resources/extensions/gsd/prompts/refine-slice.md +3 -2
  180. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  181. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  182. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  183. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  184. package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
  185. package/dist/resources/extensions/gsd/prompts/system.md +6 -3
  186. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  187. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  188. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  189. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  190. package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
  191. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  192. package/dist/resources/extensions/gsd/publication.js +87 -0
  193. package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
  194. package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
  195. package/dist/resources/extensions/gsd/question-transport.js +86 -0
  196. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  197. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  198. package/dist/resources/extensions/gsd/roadmap-slices.js +33 -5
  199. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  200. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  201. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  202. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  203. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  204. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  205. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
  206. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  207. package/dist/resources/extensions/gsd/state.js +24 -26
  208. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  209. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  210. package/dist/resources/extensions/gsd/templates/plan.md +7 -0
  211. package/dist/resources/extensions/gsd/templates/project.md +1 -0
  212. package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
  213. package/dist/resources/extensions/gsd/templates/uat.md +5 -1
  214. package/dist/resources/extensions/gsd/tool-contract.js +66 -11
  215. package/dist/resources/extensions/gsd/tool-presentation-plan.js +17 -36
  216. package/dist/resources/extensions/gsd/tool-surface-readiness.js +108 -0
  217. package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
  218. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  219. package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
  220. package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
  221. package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
  222. package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
  223. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
  224. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  225. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +41 -2
  226. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
  227. package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
  228. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  229. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  230. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  231. package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
  232. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  233. package/dist/resources/extensions/gsd/uat-policy.js +57 -25
  234. package/dist/resources/extensions/gsd/uat-run.js +9 -14
  235. package/dist/resources/extensions/gsd/undo.js +8 -7
  236. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  237. package/dist/resources/extensions/gsd/unit-context-composer.js +114 -21
  238. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  239. package/dist/resources/extensions/gsd/unit-registry.js +367 -0
  240. package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
  241. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -181
  242. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
  243. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  244. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  245. package/dist/resources/extensions/gsd/web-app-uat.js +117 -0
  246. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  247. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  248. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  249. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  250. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  251. package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
  252. package/dist/resources/extensions/gsd/workflow-reconcile.js +25 -59
  253. package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
  254. package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
  255. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  256. package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
  257. package/dist/resources/extensions/gsd/worktree-manager.js +52 -29
  258. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  259. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  260. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  261. package/dist/resources/extensions/gsd/worktree-safety.js +36 -31
  262. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  263. package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
  264. package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
  265. package/dist/resources/extensions/gsd/worktree.js +8 -1
  266. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  267. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  268. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  269. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  270. package/dist/resources/extensions/shared/interview-ui.js +2 -2
  271. package/dist/resources/shared/claude-runtime-floor.js +182 -0
  272. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  273. package/dist/resources/shared/package-manager-detection.js +1 -1
  274. package/dist/resources/shared/package.json +3 -0
  275. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  276. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  277. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  278. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  279. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  280. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  281. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  282. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  283. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  284. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  285. package/dist/runtime-checks.d.ts +10 -0
  286. package/dist/runtime-checks.js +27 -0
  287. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  288. package/dist/update-check.d.ts +2 -0
  289. package/dist/update-check.js +24 -1
  290. package/dist/update-cmd.js +40 -3
  291. package/dist/web/standalone/.next/BUILD_ID +1 -1
  292. package/dist/web/standalone/.next/app-path-routes-manifest.json +4 -4
  293. package/dist/web/standalone/.next/build-manifest.json +3 -3
  294. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  295. package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
  296. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  297. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  298. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  299. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  300. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  301. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  302. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  303. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  304. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  305. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  306. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  307. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  308. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  309. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  310. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  311. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  312. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  313. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  314. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  315. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  316. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  317. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  318. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  319. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  320. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  321. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  322. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  323. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  324. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  325. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  326. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  327. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  328. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  329. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  330. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  331. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  332. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  333. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  334. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  335. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  336. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  337. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  338. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  339. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  340. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  341. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  342. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  343. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  344. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  345. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  346. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  347. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  348. package/dist/web/standalone/.next/server/app/index.html +1 -1
  349. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  350. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  351. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  352. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  353. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  354. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  355. package/dist/web/standalone/.next/server/app-paths-manifest.json +4 -4
  356. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  357. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  358. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  359. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  360. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  361. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  362. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  363. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  364. package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
  365. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
  366. package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
  367. package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
  368. package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
  369. package/dist/web/standalone/.next/static/chunks/796.e0bdc932325d7e03.js +10 -0
  370. package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
  371. package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  372. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  373. package/dist/web/standalone/package.json +1 -1
  374. package/dist/web-mode.d.ts +2 -0
  375. package/dist/web-mode.js +20 -8
  376. package/dist/worktree-cli.js +3 -6
  377. package/dist/worktree-status-banner.js +7 -11
  378. package/package.json +4 -3
  379. package/packages/cloud-mcp-gateway/package.json +2 -2
  380. package/packages/contracts/dist/rpc.d.ts +1 -0
  381. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  382. package/packages/contracts/dist/rpc.js.map +1 -1
  383. package/packages/contracts/dist/workflow.d.ts +4 -0
  384. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  385. package/packages/contracts/dist/workflow.js.map +1 -1
  386. package/packages/contracts/package.json +1 -1
  387. package/packages/daemon/package.json +4 -4
  388. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  389. package/packages/gsd-agent-core/dist/sdk.js +6 -4
  390. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  391. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
  392. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
  393. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
  394. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
  395. package/packages/gsd-agent-core/package.json +5 -5
  396. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  397. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  398. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  399. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  400. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
  401. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  402. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +58 -6
  403. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  404. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
  405. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  406. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
  407. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  408. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  409. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +113 -40
  410. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  411. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  412. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  413. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  414. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  415. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  416. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  417. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  418. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
  419. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  420. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
  421. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  422. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
  423. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  424. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  425. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  426. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  427. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  428. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  429. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  430. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  431. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  432. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  433. package/packages/gsd-agent-modes/package.json +7 -7
  434. package/packages/mcp-server/README.md +12 -3
  435. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  436. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  437. package/packages/mcp-server/dist/cli-runner.js +137 -0
  438. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  439. package/packages/mcp-server/dist/cli.js +2 -50
  440. package/packages/mcp-server/dist/cli.js.map +1 -1
  441. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  442. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  443. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  444. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  445. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  446. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  447. package/packages/mcp-server/dist/pid-registry.js +452 -0
  448. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  449. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  450. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  451. package/packages/mcp-server/dist/probe-mode.js +10 -0
  452. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  453. package/packages/mcp-server/dist/server.d.ts +10 -0
  454. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  455. package/packages/mcp-server/dist/server.js +12 -0
  456. package/packages/mcp-server/dist/server.js.map +1 -1
  457. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  458. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  459. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  460. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  461. package/packages/mcp-server/dist/workflow-tools.d.ts +49 -0
  462. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  463. package/packages/mcp-server/dist/workflow-tools.js +209 -103
  464. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  465. package/packages/mcp-server/package.json +5 -4
  466. package/packages/native/package.json +1 -1
  467. package/packages/pi-agent-core/dist/agent-loop.js +43 -2
  468. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  469. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  470. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  471. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  472. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  473. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  474. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  475. package/packages/pi-agent-core/dist/index.js +3 -0
  476. package/packages/pi-agent-core/dist/index.js.map +1 -1
  477. package/packages/pi-agent-core/package.json +1 -1
  478. package/packages/pi-ai/README.md +1 -0
  479. package/packages/pi-ai/dist/index.d.ts +2 -0
  480. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  481. package/packages/pi-ai/dist/index.js +2 -0
  482. package/packages/pi-ai/dist/index.js.map +1 -1
  483. package/packages/pi-ai/dist/models.generated.d.ts +183 -76
  484. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  485. package/packages/pi-ai/dist/models.generated.js +193 -112
  486. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  487. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  488. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  489. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  490. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  491. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  492. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  493. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  494. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  495. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  496. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  497. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  498. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  499. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  500. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  501. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  502. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  503. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  504. package/packages/pi-ai/package.json +3 -2
  505. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  506. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  507. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  508. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  509. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  510. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  511. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  512. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  513. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  514. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  515. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  516. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  517. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  518. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  519. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  520. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  521. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  522. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  523. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  524. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  525. package/packages/pi-coding-agent/dist/index.js +1 -1
  526. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  527. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  528. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  529. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  530. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  531. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  532. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  533. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  534. package/packages/pi-coding-agent/package.json +7 -7
  535. package/packages/pi-tui/dist/components/input.js +1 -1
  536. package/packages/pi-tui/dist/components/input.js.map +1 -1
  537. package/packages/pi-tui/dist/index.d.ts +1 -1
  538. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  539. package/packages/pi-tui/dist/index.js +1 -1
  540. package/packages/pi-tui/dist/index.js.map +1 -1
  541. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  542. package/packages/pi-tui/dist/keys.js +39 -30
  543. package/packages/pi-tui/dist/keys.js.map +1 -1
  544. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  545. package/packages/pi-tui/dist/stdin-buffer.js +22 -0
  546. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  547. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  548. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  549. package/packages/pi-tui/dist/terminal-image.js +54 -2
  550. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  551. package/packages/pi-tui/dist/tui.d.ts +8 -0
  552. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  553. package/packages/pi-tui/dist/tui.js +72 -18
  554. package/packages/pi-tui/dist/tui.js.map +1 -1
  555. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  556. package/packages/pi-tui/dist/utils.js +110 -36
  557. package/packages/pi-tui/dist/utils.js.map +1 -1
  558. package/packages/pi-tui/package.json +2 -2
  559. package/packages/rpc-client/package.json +2 -2
  560. package/pkg/dist/theme/theme.d.ts.map +1 -1
  561. package/pkg/dist/theme/theme.js +45 -17
  562. package/pkg/dist/theme/theme.js.map +1 -1
  563. package/pkg/package.json +1 -1
  564. package/src/resources/GSD-WORKFLOW.md +5 -4
  565. package/src/resources/extensions/ask-user-questions.ts +94 -26
  566. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  567. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  568. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  569. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  570. package/src/resources/extensions/async-jobs/index.ts +79 -0
  571. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  572. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  573. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  574. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  575. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  576. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  577. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  578. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  579. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  580. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  581. package/src/resources/extensions/browser-tools/index.ts +71 -13
  582. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  583. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  584. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  585. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  586. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +651 -483
  587. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +940 -7
  588. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +324 -0
  589. package/src/resources/extensions/github-sync/templates.ts +3 -3
  590. package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
  591. package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
  592. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  593. package/src/resources/extensions/gsd/auto/contracts.ts +32 -2
  594. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  595. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  596. package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
  597. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  598. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  599. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  600. package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -1
  601. package/src/resources/extensions/gsd/auto/loop.ts +89 -61
  602. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  603. package/src/resources/extensions/gsd/auto/orchestrator.ts +350 -81
  604. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  605. package/src/resources/extensions/gsd/auto/phases.ts +58 -2981
  606. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
  607. package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
  608. package/src/resources/extensions/gsd/auto/session.ts +7 -0
  609. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  610. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  611. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  612. package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
  613. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  614. package/src/resources/extensions/gsd/auto-dispatch.ts +68 -68
  615. package/src/resources/extensions/gsd/auto-model-selection.ts +49 -12
  616. package/src/resources/extensions/gsd/auto-post-unit.ts +56 -16
  617. package/src/resources/extensions/gsd/auto-prompts.ts +225 -44
  618. package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
  619. package/src/resources/extensions/gsd/auto-runtime-state.ts +26 -0
  620. package/src/resources/extensions/gsd/auto-start.ts +65 -53
  621. package/src/resources/extensions/gsd/auto-timers.ts +16 -2
  622. package/src/resources/extensions/gsd/auto-tool-tracking.ts +54 -0
  623. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  624. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +21 -49
  625. package/src/resources/extensions/gsd/auto-verification.ts +33 -36
  626. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  627. package/src/resources/extensions/gsd/auto-worktree.ts +83 -386
  628. package/src/resources/extensions/gsd/auto.ts +99 -34
  629. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  630. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  631. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
  632. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +93 -49
  633. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  634. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  635. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  636. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +375 -177
  637. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +452 -58
  638. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  639. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  640. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  641. package/src/resources/extensions/gsd/captures.ts +5 -16
  642. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
  643. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  644. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  645. package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
  646. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  647. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  648. package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
  649. package/src/resources/extensions/gsd/commands-handlers.ts +64 -3
  650. package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
  651. package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
  652. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  653. package/src/resources/extensions/gsd/commands-ship.ts +2 -2
  654. package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
  655. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  656. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  657. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  658. package/src/resources/extensions/gsd/constants.ts +0 -3
  659. package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
  660. package/src/resources/extensions/gsd/db/engine.ts +811 -0
  661. package/src/resources/extensions/gsd/db/queries.ts +519 -0
  662. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  663. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  664. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  665. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  666. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  667. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  668. package/src/resources/extensions/gsd/db-workspace.ts +170 -0
  669. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  670. package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
  671. package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
  672. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  673. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  674. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  675. package/src/resources/extensions/gsd/doctor-environment.ts +272 -155
  676. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  677. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
  678. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  679. package/src/resources/extensions/gsd/doctor.ts +15 -5
  680. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  681. package/src/resources/extensions/gsd/error-classifier.ts +12 -1
  682. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  683. package/src/resources/extensions/gsd/files.ts +33 -12
  684. package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
  685. package/src/resources/extensions/gsd/git-service.ts +1 -0
  686. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  687. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  688. package/src/resources/extensions/gsd/gsd-db.ts +190 -2375
  689. package/src/resources/extensions/gsd/guidance.ts +217 -0
  690. package/src/resources/extensions/gsd/guided-flow.ts +240 -585
  691. package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
  692. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  693. package/src/resources/extensions/gsd/markdown-renderer.ts +13 -1
  694. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  695. package/src/resources/extensions/gsd/mcp-filter.ts +4 -24
  696. package/src/resources/extensions/gsd/mcp-tool-name.ts +30 -0
  697. package/src/resources/extensions/gsd/md-importer.ts +3 -3
  698. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  699. package/src/resources/extensions/gsd/memory-relations.ts +1 -1
  700. package/src/resources/extensions/gsd/migrate/safety.ts +20 -9
  701. package/src/resources/extensions/gsd/migration-auto-check.ts +30 -5
  702. package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
  703. package/src/resources/extensions/gsd/milestone-closeout.ts +121 -28
  704. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
  705. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
  706. package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
  707. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  708. package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
  709. package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
  710. package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
  711. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  712. package/src/resources/extensions/gsd/model-router.ts +3 -0
  713. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  714. package/src/resources/extensions/gsd/notifications.ts +13 -6
  715. package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
  716. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  717. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  718. package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
  719. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  720. package/src/resources/extensions/gsd/paths.ts +42 -22
  721. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  722. package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
  723. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  724. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  725. package/src/resources/extensions/gsd/preferences.ts +191 -28
  726. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  727. package/src/resources/extensions/gsd/prompts/complete-slice.md +5 -4
  728. package/src/resources/extensions/gsd/prompts/execute-task.md +5 -2
  729. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
  730. package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  731. package/src/resources/extensions/gsd/prompts/plan-slice.md +3 -2
  732. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  733. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  734. package/src/resources/extensions/gsd/prompts/refine-slice.md +3 -2
  735. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  736. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  737. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  738. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  739. package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
  740. package/src/resources/extensions/gsd/prompts/system.md +6 -3
  741. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  742. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  743. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  744. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  745. package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
  746. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  747. package/src/resources/extensions/gsd/publication.ts +122 -0
  748. package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
  749. package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
  750. package/src/resources/extensions/gsd/question-transport.ts +138 -0
  751. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  752. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  753. package/src/resources/extensions/gsd/roadmap-slices.ts +36 -5
  754. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  755. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  756. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  757. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  758. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  759. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  760. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
  761. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  762. package/src/resources/extensions/gsd/state.ts +31 -27
  763. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  764. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  765. package/src/resources/extensions/gsd/templates/plan.md +7 -0
  766. package/src/resources/extensions/gsd/templates/project.md +1 -0
  767. package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
  768. package/src/resources/extensions/gsd/templates/uat.md +5 -1
  769. package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
  770. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  771. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  772. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
  773. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +649 -26
  774. package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
  775. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
  776. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  777. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +395 -30
  778. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  779. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +80 -2
  780. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  781. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  782. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  783. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
  784. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  785. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  786. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  787. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  788. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  789. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  790. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  791. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  792. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
  793. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  794. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  795. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
  796. package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
  797. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +46 -8
  798. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  799. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  800. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  801. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  802. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  803. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
  804. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
  805. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  806. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  807. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
  808. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
  809. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +89 -0
  810. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  811. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  812. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
  813. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  814. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  815. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  816. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  817. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  818. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  819. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  820. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
  821. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  822. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  823. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
  824. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
  825. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
  826. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  827. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  828. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  829. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
  830. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  831. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +89 -59
  832. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  833. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  834. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  835. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
  836. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  837. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  838. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  839. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  840. package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
  841. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +143 -1
  842. package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
  843. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +120 -4
  844. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  845. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
  846. package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
  847. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  848. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  849. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  850. package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
  851. package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
  852. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  853. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  854. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  855. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  856. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  857. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  858. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
  859. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  860. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  861. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  862. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
  863. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  864. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
  865. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  866. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  867. package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
  868. package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
  869. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +56 -2
  870. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  871. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  872. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +11 -4
  873. package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
  874. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  875. package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
  876. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  877. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +342 -1
  878. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  879. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
  880. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  881. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +51 -2
  882. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  883. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
  884. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  885. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +300 -41
  886. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  887. package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
  888. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +9 -4
  889. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  890. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  891. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  892. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  893. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  894. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
  895. package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
  896. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  897. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
  898. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +329 -0
  899. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  900. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  901. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -6
  902. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  903. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +114 -2
  904. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  905. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  906. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  907. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
  908. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  909. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +193 -0
  910. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  911. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  912. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +193 -13
  913. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  914. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  915. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  916. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  917. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
  918. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  919. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  920. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +43 -1
  921. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  922. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  923. package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
  924. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  925. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  926. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +75 -1
  927. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  928. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +24 -2
  929. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
  930. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  931. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  932. package/src/resources/extensions/gsd/tests/write-gate.test.ts +188 -1
  933. package/src/resources/extensions/gsd/tool-contract.ts +124 -11
  934. package/src/resources/extensions/gsd/tool-presentation-plan.ts +18 -35
  935. package/src/resources/extensions/gsd/tool-surface-readiness.ts +183 -0
  936. package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
  937. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  938. package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
  939. package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
  940. package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
  941. package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
  942. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
  943. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  944. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +45 -2
  945. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
  946. package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
  947. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  948. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  949. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  950. package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
  951. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  952. package/src/resources/extensions/gsd/uat-policy.ts +80 -25
  953. package/src/resources/extensions/gsd/uat-run.ts +10 -14
  954. package/src/resources/extensions/gsd/undo.ts +9 -8
  955. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  956. package/src/resources/extensions/gsd/unit-context-composer.ts +196 -21
  957. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  958. package/src/resources/extensions/gsd/unit-registry.ts +442 -0
  959. package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
  960. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -191
  961. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
  962. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  963. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  964. package/src/resources/extensions/gsd/web-app-uat.ts +144 -0
  965. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  966. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  967. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  968. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  969. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  970. package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
  971. package/src/resources/extensions/gsd/workflow-reconcile.ts +32 -65
  972. package/src/resources/extensions/gsd/workflow-tool-surface.ts +76 -0
  973. package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
  974. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  975. package/src/resources/extensions/gsd/worktree-lifecycle.ts +20 -25
  976. package/src/resources/extensions/gsd/worktree-manager.ts +53 -29
  977. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  978. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  979. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  980. package/src/resources/extensions/gsd/worktree-safety.ts +49 -44
  981. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  982. package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
  983. package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
  984. package/src/resources/extensions/gsd/worktree.ts +7 -1
  985. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  986. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  987. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  988. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  989. package/src/resources/extensions/shared/interview-ui.ts +15 -2
  990. package/src/resources/shared/claude-runtime-floor.ts +248 -0
  991. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  992. package/src/resources/shared/package-manager-detection.ts +1 -1
  993. package/src/resources/shared/package.json +3 -0
  994. package/src/resources/skills/create-skill/SKILL.md +3 -0
  995. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  996. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  997. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  998. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  999. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  1000. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  1001. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  1002. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  1003. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  1004. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -195
  1005. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  1006. package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
  1007. package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
  1008. package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
  1009. package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
  1010. package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
  1011. package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
  1012. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -88
  1013. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -198
  1014. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  1015. /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → pZbHa49xI-knmKlphIRq0}/_buildManifest.js +0 -0
  1016. /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → pZbHa49xI-knmKlphIRq0}/_ssgManifest.js +0 -0
@@ -3,6 +3,7 @@
3
3
 
4
4
  import test, { mock } from "node:test";
5
5
  import assert from "node:assert/strict";
6
+ import { execSync } from "node:child_process";
6
7
  import { mkdirSync, mkdtempSync, realpathSync, rmSync, writeFileSync } from "node:fs";
7
8
  import { tmpdir } from "node:os";
8
9
  import { join } from "node:path";
@@ -23,11 +24,14 @@ import {
23
24
  import { runUnit, shouldDeferUnitFailsafeTimeout } from "../auto/run-unit.js";
24
25
  import { scheduleAutoWakeup, _resetAutoWakeupsForTest } from "../auto/schedule-wakeup.js";
25
26
  import { writeUnitRuntimeRecord, readUnitRuntimeRecord } from "../unit-runtime.js";
26
- import { autoLoop } from "../auto/loop.js";
27
- import { runDispatch, runUnitPhase } from "../auto/phases.js";
27
+ import { autoLoop as rawAutoLoop } from "../auto/loop.js";
28
+ import { runPreDispatch } from "../auto/pre-dispatch.js";
29
+ import { runDispatch } from "../auto/dispatch.js";
30
+ import { runUnitPhase, resetSessionTimeoutState } from "../auto/unit-phase.js";
28
31
  import { detectStuck } from "../auto/detect-stuck.js";
29
- import type { UnitResult, AgentEndEvent } from "../auto/types.js";
32
+ import type { UnitResult, AgentEndEvent, LoopState } from "../auto/types.js";
30
33
  import type { LoopDeps } from "../auto/loop-deps.js";
34
+ import type { AutoAdvanceResult, AutoOrchestrationModule, AutoStatus, UnitRef } from "../auto/contracts.js";
31
35
  import { WorktreeStateProjection } from "../worktree-state-projection.js";
32
36
  import { ModelPolicyDispatchBlockedError } from "../auto-model-selection.js";
33
37
  import type { SessionLockStatus } from "../session-lock.js";
@@ -40,6 +44,17 @@ import { SourceObservationStore } from "../source-observations.js";
40
44
 
41
45
  // ─── Helpers ─────────────────────────────────────────────────────────────────
42
46
 
47
+ const ORCHESTRATION_MISSING_REASON =
48
+ "Auto Orchestration Module is not wired; cannot dispatch built-in GSD Unit.";
49
+
50
+ type CapturedAutoSideEffects<T> = {
51
+ result: T;
52
+ stopped: boolean;
53
+ stoppedReason?: string;
54
+ paused: boolean;
55
+ pausedReason?: string;
56
+ };
57
+
43
58
  function makeEvent(
44
59
  messages: unknown[] = [{ role: "assistant" }],
45
60
  ): AgentEndEvent {
@@ -67,12 +82,203 @@ async function waitForMicrotasks(
67
82
  assert.fail(`Timed out waiting for ${label}`);
68
83
  }
69
84
 
85
+ function makeLoopState(): LoopState {
86
+ return {
87
+ recentUnits: [],
88
+ stuckRecoveryAttempts: 0,
89
+ consecutiveFinalizeTimeouts: 0,
90
+ consecutiveDispatchCount: new Map<string, number>(),
91
+ lastDispatchedKey: null,
92
+ lastDispatchPhase: null,
93
+ };
94
+ }
95
+
96
+ function createLoopTestOrchestration(
97
+ ctx: any,
98
+ pi: any,
99
+ s: any,
100
+ deps: LoopDeps,
101
+ ): AutoOrchestrationModule {
102
+ // Production auto.ts wires the real Auto Orchestration Module before entering
103
+ // autoLoop. These loop-mechanics tests keep their LoopDeps fixtures by
104
+ // adapting the old phase helpers to the public orchestration Interface.
105
+ const loopState = makeLoopState();
106
+ const status: AutoStatus = { phase: "running", transitionCount: 0 };
107
+ let iteration = 0;
108
+ let seq = 0;
109
+
110
+ function nextSeq(): number {
111
+ return ++seq;
112
+ }
113
+
114
+ function clearActiveUnit(): void {
115
+ status.activeUnit = undefined;
116
+ }
117
+
118
+ async function captureAutoSideEffects<T>(
119
+ run: () => Promise<T>,
120
+ ): Promise<CapturedAutoSideEffects<T>> {
121
+ const originalStopAuto = deps.stopAuto;
122
+ const originalPauseAuto = deps.pauseAuto;
123
+ let stoppedReason: string | undefined;
124
+ let pausedReason: string | undefined;
125
+ let stopped = false;
126
+ let paused = false;
127
+
128
+ (deps as any).stopAuto = async (...args: Parameters<LoopDeps["stopAuto"]>) => {
129
+ stopped = true;
130
+ stoppedReason = args[2];
131
+ return originalStopAuto(...args);
132
+ };
133
+ (deps as any).pauseAuto = async (...args: Parameters<LoopDeps["pauseAuto"]>) => {
134
+ paused = true;
135
+ const context = args[2] as { message?: string } | undefined;
136
+ pausedReason = context?.message;
137
+ return originalPauseAuto(...args);
138
+ };
139
+
140
+ try {
141
+ const result = await run();
142
+ return { result, stopped, stoppedReason, paused, pausedReason };
143
+ } finally {
144
+ (deps as any).stopAuto = originalStopAuto;
145
+ (deps as any).pauseAuto = originalPauseAuto;
146
+ }
147
+ }
148
+
149
+ function resultForBreak(
150
+ reason: string,
151
+ sideEffects: CapturedAutoSideEffects<unknown>,
152
+ ): AutoAdvanceResult {
153
+ clearActiveUnit();
154
+ status.phase = sideEffects.paused && !sideEffects.stopped ? "paused" : "stopped";
155
+ status.transitionCount += 1;
156
+ if (sideEffects.paused && !sideEffects.stopped) {
157
+ return {
158
+ kind: "blocked",
159
+ reason: sideEffects.pausedReason ?? reason,
160
+ action: "pause",
161
+ };
162
+ }
163
+ return {
164
+ kind: "stopped",
165
+ reason: sideEffects.stoppedReason ?? reason,
166
+ };
167
+ }
168
+
169
+ return {
170
+ async start() {
171
+ status.phase = "running";
172
+ status.transitionCount += 1;
173
+ return { kind: "started" };
174
+ },
175
+ async advance() {
176
+ iteration += 1;
177
+ seq = 0;
178
+ const prefs = deps.loadEffectiveGSDPreferences()?.preferences;
179
+ const ic = {
180
+ ctx,
181
+ pi,
182
+ s,
183
+ deps,
184
+ prefs,
185
+ iteration,
186
+ flowId: `loop-test-orchestration-${iteration}`,
187
+ nextSeq,
188
+ };
189
+
190
+ const preDispatch = await captureAutoSideEffects(() => runPreDispatch(ic, loopState));
191
+ const preDispatchResult = preDispatch.result;
192
+ if (preDispatchResult.action === "break") {
193
+ return resultForBreak(preDispatchResult.reason, preDispatch);
194
+ }
195
+ if (preDispatchResult.action === "continue") {
196
+ return { kind: "skipped", reason: "pre-dispatch-skip" };
197
+ }
198
+ if (preDispatchResult.action === "retry") {
199
+ return { kind: "paused", reason: preDispatchResult.reason };
200
+ }
201
+
202
+ const dispatch = await captureAutoSideEffects(() =>
203
+ runDispatch(ic, preDispatchResult.data, loopState),
204
+ );
205
+ if (dispatch.result.action === "break") {
206
+ return resultForBreak(dispatch.result.reason, dispatch);
207
+ }
208
+ if (dispatch.result.action === "continue") {
209
+ return {
210
+ kind: "skipped",
211
+ reason: "dispatch-skip",
212
+ stateSnapshot: preDispatchResult.data.state,
213
+ };
214
+ }
215
+ if (dispatch.result.action === "retry") {
216
+ return { kind: "paused", reason: dispatch.result.reason };
217
+ }
218
+
219
+ const data = dispatch.result.data;
220
+ const unit: UnitRef = { unitType: data.unitType, unitId: data.unitId };
221
+ s.pendingOrchestrationDispatch = {
222
+ unitType: data.unitType,
223
+ unitId: data.unitId,
224
+ prompt: data.prompt,
225
+ pauseAfterUatDispatch: data.pauseAfterUatDispatch,
226
+ state: data.state,
227
+ mid: data.mid,
228
+ midTitle: data.midTitle,
229
+ };
230
+ status.phase = "running";
231
+ status.activeUnit = unit;
232
+ status.transitionCount += 1;
233
+ return { kind: "advanced", unit, stateSnapshot: data.state };
234
+ },
235
+ async completeActiveUnit() {
236
+ clearActiveUnit();
237
+ },
238
+ async retryActiveUnit() {
239
+ clearActiveUnit();
240
+ },
241
+ async resume() {
242
+ status.phase = "running";
243
+ status.transitionCount += 1;
244
+ return { kind: "resumed" };
245
+ },
246
+ async stop(reason: string) {
247
+ status.phase = "stopped";
248
+ clearActiveUnit();
249
+ status.transitionCount += 1;
250
+ return { kind: "stopped", reason };
251
+ },
252
+ getStatus() {
253
+ return {
254
+ ...status,
255
+ activeUnit: status.activeUnit ? { ...status.activeUnit } : undefined,
256
+ };
257
+ },
258
+ };
259
+ }
260
+
261
+ async function autoLoop(
262
+ ctx: any,
263
+ pi: any,
264
+ s: any,
265
+ deps: LoopDeps,
266
+ options?: Parameters<typeof rawAutoLoop>[4],
267
+ ): Promise<void> {
268
+ if (!s.orchestration) {
269
+ s.orchestration = createLoopTestOrchestration(ctx, pi, s, deps);
270
+ }
271
+ await rawAutoLoop(ctx, pi, s, deps, options);
272
+ }
273
+
70
274
  /**
71
275
  * Build a minimal mock AutoSession with controllable newSession behavior.
72
276
  */
73
277
  function makeMockSession(opts?: {
74
278
  newSessionResult?: { cancelled: boolean };
75
279
  newSessionThrows?: string;
280
+ /** Reject newSession() with a specific Error instance (e.g. TypeError). */
281
+ newSessionThrowsError?: Error;
76
282
  newSessionDelayMs?: number;
77
283
  onNewSessionStart?: (session: any) => void;
78
284
  onNewSessionSettle?: (session: any) => void;
@@ -87,6 +293,9 @@ function makeMockSession(opts?: {
87
293
  cmdCtx: {
88
294
  newSession: (options?: { abortSignal?: AbortSignal; workspaceRoot?: string }) => {
89
295
  opts?.onNewSessionStart?.(session);
296
+ if (opts?.newSessionThrowsError) {
297
+ return Promise.reject(opts.newSessionThrowsError);
298
+ }
90
299
  if (opts?.newSessionThrows) {
91
300
  return Promise.reject(new Error(opts.newSessionThrows));
92
301
  }
@@ -325,7 +534,7 @@ test("runUnit failsafe defers cancellation while timeout recovery is making fres
325
534
  const ctx = makeMockCtx();
326
535
  const pi = makeMockPi();
327
536
  const s = makeMockSession();
328
- s.basePath = mkdtempSync(join(tmpdir(), "gsd-rununit-recovery-"));
537
+ s.basePath = makeLoopTestBase("gsd-rununit-recovery-");
329
538
  s.currentUnit = { type: "task", id: "T01", startedAt: 1234 };
330
539
 
331
540
  const resultPromise = runUnit(ctx, pi, s, "task", "T01", "prompt");
@@ -497,6 +706,73 @@ test("runUnit returns cancelled when session creation fails", async () => {
497
706
  assert.equal(pi.calls.length, 0);
498
707
  });
499
708
 
709
+ test("runUnit: TypeError from newSession is classified as structural (isTransient: false)", async () => {
710
+ // Regression for #572: a TypeError thrown from newSession (e.g. "something is
711
+ // not a function") indicates a programming error, not a transient provider
712
+ // blip. Before the fix it was always classified isTransient: true, causing
713
+ // auto-mode to retry indefinitely instead of surfacing the real problem.
714
+ _resetPendingResolve();
715
+
716
+ const baseCtx = {
717
+ ...makeMockCtx(),
718
+ ui: { notify: () => {}, setStatus: () => {}, setWorkingMessage: () => {} },
719
+ sessionManager: { getEntries: () => [] },
720
+ modelRegistry: { getProviderAuthMode: () => undefined, isProviderRequestReady: () => true },
721
+ } as any;
722
+ const pi = makeMockPi();
723
+ const s = makeMockSession({
724
+ newSessionThrowsError: new TypeError("pi.sendMessage is not a function"),
725
+ });
726
+
727
+ const result = await runUnit(baseCtx, pi, s, "task", "T01", "prompt");
728
+
729
+ assert.equal(result.status, "cancelled");
730
+ assert.equal(result.errorContext?.category, "session-failed");
731
+ assert.equal(result.errorContext?.isTransient, false, "TypeError must be non-transient");
732
+ });
733
+
734
+ test("runUnit: 'is not a function' message from newSession is classified as structural", async () => {
735
+ // Regression for #572: the pattern also catches errors where the thrown
736
+ // object is not a TypeError instance but the message contains "is not a function".
737
+ _resetPendingResolve();
738
+
739
+ const baseCtx = {
740
+ ...makeMockCtx(),
741
+ ui: { notify: () => {}, setStatus: () => {}, setWorkingMessage: () => {} },
742
+ sessionManager: { getEntries: () => [] },
743
+ modelRegistry: { getProviderAuthMode: () => undefined, isProviderRequestReady: () => true },
744
+ } as any;
745
+ const pi = makeMockPi();
746
+ const s = makeMockSession({ newSessionThrows: "pi.sendMessage is not a function" });
747
+
748
+ const result = await runUnit(baseCtx, pi, s, "task", "T01", "prompt");
749
+
750
+ assert.equal(result.status, "cancelled");
751
+ assert.equal(result.errorContext?.category, "session-failed");
752
+ assert.equal(result.errorContext?.isTransient, false, "'is not a function' errors must be non-transient");
753
+ });
754
+
755
+ test("runUnit: generic network error from newSession remains transient", async () => {
756
+ // Confirm that non-structural session errors (e.g. 429, ECONNREFUSED) are
757
+ // still classified as transient so auto-mode can retry them.
758
+ _resetPendingResolve();
759
+
760
+ const baseCtx = {
761
+ ...makeMockCtx(),
762
+ ui: { notify: () => {}, setStatus: () => {}, setWorkingMessage: () => {} },
763
+ sessionManager: { getEntries: () => [] },
764
+ modelRegistry: { getProviderAuthMode: () => undefined, isProviderRequestReady: () => true },
765
+ } as any;
766
+ const pi = makeMockPi();
767
+ const s = makeMockSession({ newSessionThrows: "connection refused" });
768
+
769
+ const result = await runUnit(baseCtx, pi, s, "task", "T01", "prompt");
770
+
771
+ assert.equal(result.status, "cancelled");
772
+ assert.equal(result.errorContext?.category, "session-failed");
773
+ assert.equal(result.errorContext?.isTransient, true, "network errors must remain transient");
774
+ });
775
+
500
776
  test("runUnit clears queued switch cancellation when session creation fails", async () => {
501
777
  _resetPendingResolve();
502
778
 
@@ -1093,12 +1369,19 @@ function makeMockDeps(
1093
1369
  * runUnit mock (dispatch counters, milestone state, etc.).
1094
1370
  */
1095
1371
  function makeLoopSession(overrides?: Partial<Record<string, unknown>>) {
1372
+ const basePath = mkdtempSync(join(tmpdir(), "gsd-auto-loop-"));
1373
+ // Plan 001 enforces worktree safety for all isolation modes. Loop-mechanics
1374
+ // tests run with getIsolationMode: () => "none", so the project root itself
1375
+ // must be a valid git working tree for source-writing Units to dispatch.
1376
+ execSync("git init --initial-branch=main", { cwd: basePath, stdio: "ignore" });
1377
+ execSync("git config user.email test@test.com", { cwd: basePath, stdio: "ignore" });
1378
+ execSync("git config user.name Test", { cwd: basePath, stdio: "ignore" });
1096
1379
  return {
1097
1380
  active: true,
1098
1381
  verbose: false,
1099
1382
  stepMode: false,
1100
1383
  paused: false,
1101
- basePath: mkdtempSync(join(tmpdir(), "gsd-auto-loop-")),
1384
+ basePath,
1102
1385
  originalBasePath: "",
1103
1386
  currentMilestoneId: "M001",
1104
1387
  currentUnit: null,
@@ -1146,6 +1429,15 @@ function makeLoopSession(overrides?: Partial<Record<string, unknown>>) {
1146
1429
  } as any;
1147
1430
  }
1148
1431
 
1432
+ /** Create a temp project root suitable for loop-mechanics tests. */
1433
+ function makeLoopTestBase(prefix: string): string {
1434
+ const base = mkdtempSync(join(tmpdir(), prefix));
1435
+ execSync("git init --initial-branch=main", { cwd: base, stdio: "ignore" });
1436
+ execSync("git config user.email test@test.com", { cwd: base, stdio: "ignore" });
1437
+ execSync("git config user.name Test", { cwd: base, stdio: "ignore" });
1438
+ return base;
1439
+ }
1440
+
1149
1441
  test("autoLoop exits when s.active is set to false", async (t) => {
1150
1442
  _resetPendingResolve();
1151
1443
 
@@ -1164,6 +1456,34 @@ test("autoLoop exits when s.active is set to false", async (t) => {
1164
1456
  );
1165
1457
  });
1166
1458
 
1459
+ test("autoLoop pauses visibly when Auto Orchestration Module is not wired", async () => {
1460
+ _resetPendingResolve();
1461
+
1462
+ const ctx = makeMockCtx();
1463
+ ctx.ui.setStatus = () => {};
1464
+ const pi = makeMockPi();
1465
+ const s = makeLoopSession();
1466
+ let pauseContext: unknown;
1467
+
1468
+ const deps = makeMockDeps({
1469
+ pauseAuto: async (_ctx, _pi, errorContext) => {
1470
+ pauseContext = errorContext;
1471
+ deps.callLog.push("pauseAuto");
1472
+ },
1473
+ });
1474
+
1475
+ await rawAutoLoop(ctx, pi, s, deps);
1476
+
1477
+ assert.ok(deps.callLog.includes("pauseAuto"), "missing orchestration should pause auto-mode");
1478
+ assert.equal(
1479
+ (pauseContext as { message?: string } | undefined)?.message,
1480
+ ORCHESTRATION_MISSING_REASON,
1481
+ );
1482
+ assert.equal(deps.callLog.includes("deriveState"), false);
1483
+ assert.equal(deps.callLog.includes("resolveDispatch"), false);
1484
+ assert.equal(s.pendingOrchestrationDispatch, null);
1485
+ });
1486
+
1167
1487
  test("autoLoop exits on terminal complete state", async (t) => {
1168
1488
  _resetPendingResolve();
1169
1489
 
@@ -1205,7 +1525,7 @@ test("autoLoop preserves stuck recovery counter when dispatch recovery continues
1205
1525
 
1206
1526
  const ctx = makeMockCtx();
1207
1527
  const pi = makeMockPi();
1208
- const basePath = realpathSync(mkdtempSync(join(tmpdir(), "gsd-stuck-counter-reset-")));
1528
+ const basePath = realpathSync(makeLoopTestBase("gsd-stuck-counter-reset-"));
1209
1529
  mkdirSync(join(basePath, ".gsd"), { recursive: true });
1210
1530
  mkdirSync(join(basePath, ".gsd", "milestones", "M001", "slices", "S01", "tasks"), { recursive: true });
1211
1531
  writeFileSync(
@@ -1280,7 +1600,7 @@ test("autoLoop skips provider dispatch when execute-task is already complete in
1280
1600
  ctx.ui.setStatus = () => {};
1281
1601
  ctx.ui.setWidget = () => {};
1282
1602
  const pi = makeMockPi();
1283
- const basePath = realpathSync(mkdtempSync(join(tmpdir(), "gsd-already-complete-dispatch-")));
1603
+ const basePath = realpathSync(makeLoopTestBase("gsd-already-complete-dispatch-"));
1284
1604
  mkdirSync(join(basePath, ".gsd"), { recursive: true });
1285
1605
 
1286
1606
  try {
@@ -1990,11 +2310,15 @@ test("autoLoop retries next iteration when orchestration reports paused", async
1990
2310
  },
1991
2311
  });
1992
2312
 
2313
+ const journalEvents: Array<{ eventType: string; data?: any }> = [];
1993
2314
  const deps = makeMockDeps({
1994
2315
  resolveDispatch: async () => {
1995
2316
  deps.callLog.push("resolveDispatch");
1996
2317
  throw new Error("legacy resolveDispatch must not run after orchestration paused");
1997
2318
  },
2319
+ emitJournalEvent: (entry: any) => {
2320
+ journalEvents.push(entry);
2321
+ },
1998
2322
  });
1999
2323
 
2000
2324
  await autoLoop(ctx, pi, s, deps);
@@ -2007,6 +2331,11 @@ test("autoLoop retries next iteration when orchestration reports paused", async
2007
2331
  "orchestration paused must not fall back to legacy dispatch",
2008
2332
  );
2009
2333
  assert.equal(s.pendingOrchestrationDispatch, null, "no orchestration dispatch should remain pending");
2334
+
2335
+ const pausedIterationEnd = journalEvents.find(
2336
+ (e) => e.eventType === "iteration-end" && e.data?.status === "paused",
2337
+ );
2338
+ assert.ok(pausedIterationEnd, "orchestration paused must emit iteration-end to close the iteration journal");
2010
2339
  });
2011
2340
 
2012
2341
  test("autoLoop consumes pending orchestration dispatch without advancing twice", async () => {
@@ -2094,8 +2423,13 @@ test("autoLoop stops orchestrator complete state through completion surface", as
2094
2423
  start: async () => ({ kind: "stopped" as const, reason: "unused" }),
2095
2424
  advance: async () => ({
2096
2425
  kind: "stopped" as const,
2097
- reason: "all milestones complete",
2426
+ reason: "legacy text not used",
2098
2427
  stateSnapshot,
2428
+ terminalOutcome: {
2429
+ code: "all-complete" as const,
2430
+ displayReason: "All milestones complete",
2431
+ allMilestonesComplete: true as const,
2432
+ },
2099
2433
  }),
2100
2434
  completeActiveUnit: async () => {},
2101
2435
  retryActiveUnit: async () => {},
@@ -2121,6 +2455,7 @@ test("autoLoop stops orchestrator complete state through completion surface", as
2121
2455
  milestoneTitle: "Priority Levels",
2122
2456
  allMilestonesComplete: true,
2123
2457
  });
2458
+ assert.equal((stopCalls[0]?.options as any)?.terminalOutcome?.code, "all-complete");
2124
2459
  assert.equal(
2125
2460
  deps.callLog.includes("resolveDispatch"),
2126
2461
  false,
@@ -2960,7 +3295,7 @@ test("autoLoop closes journal iteration on pre-dispatch health-gate break", asyn
2960
3295
  assert.equal(deps.callLog.includes("pauseAuto"), true);
2961
3296
  assert.deepEqual(pauseOptions, { expectedCurrentUnit: null });
2962
3297
  assert.ok(
2963
- journalEvents.some((event) => event.eventType === "iteration-end" && event.data?.reason === "pre-dispatch-break"),
3298
+ journalEvents.some((event) => event.eventType === "iteration-end" && event.data?.reason === "health-gate-failed"),
2964
3299
  "pre-dispatch break must close the started iteration",
2965
3300
  );
2966
3301
  });
@@ -3676,7 +4011,7 @@ test("resolveAgentEndCancelled with errorContext passes it through to resolved p
3676
4011
  test("runUnitPhase pauses transient aborted cancellations instead of hard-stopping", async (t) => {
3677
4012
  _resetPendingResolve();
3678
4013
 
3679
- const basePath = mkdtempSync(join(tmpdir(), "gsd-aborted-cancel-"));
4014
+ const basePath = makeLoopTestBase("gsd-aborted-cancel-");
3680
4015
  t.after(() => {
3681
4016
  rmSync(basePath, { recursive: true, force: true });
3682
4017
  });
@@ -3748,10 +4083,157 @@ test("runUnitPhase pauses transient aborted cancellations instead of hard-stoppi
3748
4083
  assert.equal(deps.callLog.includes("stopAuto"), false);
3749
4084
  });
3750
4085
 
4086
+ test("resetSessionTimeoutState gives a new auto session a fresh session-creation timeout budget", async (t) => {
4087
+ _resetPendingResolve();
4088
+
4089
+ // runUnitPhase schedules an auto-resume setTimeout on transient session
4090
+ // timeouts. Capture and clear those timers so the test process can exit
4091
+ // promptly while still exercising the real production path.
4092
+ const originalSetTimeout = globalThis.setTimeout;
4093
+ const timerHandles: ReturnType<typeof originalSetTimeout>[] = [];
4094
+ globalThis.setTimeout = ((callback: any, delay?: number, ...args: any[]) => {
4095
+ const handle = originalSetTimeout(callback, delay ?? 0, ...args);
4096
+ timerHandles.push(handle);
4097
+ return handle;
4098
+ }) as any;
4099
+
4100
+ const basePath = makeLoopTestBase("gsd-session-timeout-reset-");
4101
+ execSync("git init", { cwd: basePath });
4102
+ execSync('git -c user.email=test@test.com -c user.name=Test commit --allow-empty -m init', { cwd: basePath });
4103
+
4104
+ t.after(() => {
4105
+ for (const handle of timerHandles) clearTimeout(handle);
4106
+ globalThis.setTimeout = originalSetTimeout;
4107
+ rmSync(basePath, { recursive: true, force: true });
4108
+ });
4109
+
4110
+ const ctx = {
4111
+ ...makeMockCtx(),
4112
+ ui: {
4113
+ notify: () => {},
4114
+ setStatus: () => {},
4115
+ setWorkingMessage: () => {},
4116
+ },
4117
+ sessionManager: {
4118
+ getEntries: () => [],
4119
+ },
4120
+ modelRegistry: {
4121
+ getProviderAuthMode: () => undefined,
4122
+ isProviderRequestReady: () => true,
4123
+ },
4124
+ } as any;
4125
+ const notifications: Array<{ message: string; level?: string }> = [];
4126
+ ctx.ui.notify = (message: string, level?: string) => {
4127
+ notifications.push({ message, level });
4128
+ };
4129
+ const pi = makeMockPi();
4130
+ const s = makeLoopSession({
4131
+ basePath,
4132
+ canonicalProjectRoot: basePath,
4133
+ originalBasePath: basePath,
4134
+ });
4135
+ const deps = makeMockDeps();
4136
+
4137
+ async function runTimeoutUnit(iteration: number): Promise<string | undefined> {
4138
+ notifications.length = 0;
4139
+ const callsBefore = pi.calls.length;
4140
+ let seq = 0;
4141
+ const phasePromise = runUnitPhase(
4142
+ { ctx, pi, s, deps, prefs: undefined, iteration, flowId: `flow-${iteration}`, nextSeq: () => ++seq },
4143
+ {
4144
+ unitType: "plan-slice",
4145
+ unitId: "M001/S01",
4146
+ prompt: "plan the slice",
4147
+ finalPrompt: "plan the slice",
4148
+ pauseAfterUatDispatch: false,
4149
+ state: {
4150
+ phase: "planning",
4151
+ activeMilestone: { id: "M001", title: "Milestone" },
4152
+ activeSlice: { id: "S01", title: "Slice" },
4153
+ activeTask: null,
4154
+ registry: [{ id: "M001", title: "Milestone", status: "active" }],
4155
+ recentDecisions: [],
4156
+ blockers: [],
4157
+ nextAction: "",
4158
+ progress: { milestones: { done: 0, total: 1 } },
4159
+ requirements: { active: 0, validated: 0, deferred: 0, outOfScope: 0, blocked: 0, total: 0 },
4160
+ } as any,
4161
+ mid: "M001",
4162
+ midTitle: "Milestone",
4163
+ isRetry: false,
4164
+ previousTier: undefined,
4165
+ },
4166
+ makeLoopState(),
4167
+ );
4168
+
4169
+ // Wait until runUnit has dispatched the prompt, then resolve the unit
4170
+ // as a session-creation timeout. This avoids the 120s real timeout and
4171
+ // the mock-timer interaction that runUnitPhase's pre-flight setup makes
4172
+ // fragile.
4173
+ await new Promise<void>((resolve) => {
4174
+ const check = () => {
4175
+ if (pi.calls.length > callsBefore) return resolve();
4176
+ setTimeout(check, 5);
4177
+ };
4178
+ check();
4179
+ });
4180
+ resolveAgentEndCancelled({
4181
+ message: "Session creation timed out",
4182
+ category: "timeout",
4183
+ isTransient: true,
4184
+ });
4185
+
4186
+ const result = await phasePromise;
4187
+ return (result as any).reason;
4188
+ }
4189
+
4190
+ // Start from a known state in case a previous test left the counter raised.
4191
+ resetSessionTimeoutState();
4192
+
4193
+ // Exhaust the per-process timeout budget in the first "session".
4194
+ for (let i = 1; i <= 4; i++) {
4195
+ const reason = await runTimeoutUnit(i);
4196
+ assert.equal(reason, "session-timeout");
4197
+ }
4198
+ const lastBudgetNotification = notifications.find((n) =>
4199
+ n.message.includes("Session creation timed out")
4200
+ );
4201
+ assert.ok(lastBudgetNotification, "expected a session-creation timeout notification");
4202
+ assert.match(
4203
+ lastBudgetNotification.message,
4204
+ /Pausing for manual review/,
4205
+ "fourth consecutive timeout should exhaust the auto-resume budget",
4206
+ );
4207
+
4208
+ // Simulate a new auto-mode session starting. autoLoop() must reset the
4209
+ // module-level counter so the next timeout is treated as the first in the
4210
+ // new session rather than inheriting the exhausted budget.
4211
+ const freshSession = makeLoopSession({
4212
+ basePath,
4213
+ canonicalProjectRoot: basePath,
4214
+ originalBasePath: basePath,
4215
+ active: false,
4216
+ });
4217
+ freshSession.orchestration = createLoopTestOrchestration(ctx, pi, freshSession, deps);
4218
+ await rawAutoLoop(ctx, pi, freshSession, deps);
4219
+
4220
+ const reasonAfterReset = await runTimeoutUnit(5);
4221
+ assert.equal(reasonAfterReset, "session-timeout");
4222
+ const notificationAfterReset = notifications.find((n) =>
4223
+ n.message.includes("Auto-resuming")
4224
+ );
4225
+ assert.ok(notificationAfterReset, "expected an auto-resume notification after reset");
4226
+ assert.match(
4227
+ notificationAfterReset.message,
4228
+ /Auto-resuming/,
4229
+ "after autoLoop entry the timeout budget should be fresh so the first timeout auto-resumes",
4230
+ );
4231
+ });
4232
+
3751
4233
  test("runUnitPhase treats setup-race cancellations as pause-induced when session is already paused", async (t) => {
3752
4234
  _resetPendingResolve();
3753
4235
 
3754
- const basePath = mkdtempSync(join(tmpdir(), "gsd-paused-setup-race-"));
4236
+ const basePath = makeLoopTestBase("gsd-paused-setup-race-");
3755
4237
  t.after(() => {
3756
4238
  rmSync(basePath, { recursive: true, force: true });
3757
4239
  });
@@ -3826,7 +4308,7 @@ test("runUnitPhase treats setup-race cancellations as pause-induced when session
3826
4308
  test("runUnitPhase remembers aborted milestone closeout for same-unit resume", async (t) => {
3827
4309
  _resetPendingResolve();
3828
4310
 
3829
- const basePath = mkdtempSync(join(tmpdir(), "gsd-aborted-closeout-"));
4311
+ const basePath = makeLoopTestBase("gsd-aborted-closeout-");
3830
4312
  t.after(() => {
3831
4313
  rmSync(basePath, { recursive: true, force: true });
3832
4314
  });
@@ -3906,7 +4388,7 @@ test("runUnitPhase remembers aborted milestone closeout for same-unit resume", a
3906
4388
  test("runUnitPhase schedules default auto-resume for transient provider cancellations", async (t) => {
3907
4389
  _resetPendingResolve();
3908
4390
 
3909
- const basePath = mkdtempSync(join(tmpdir(), "gsd-provider-resume-"));
4391
+ const basePath = makeLoopTestBase("gsd-provider-resume-");
3910
4392
  t.after(() => {
3911
4393
  _resetPendingResolve();
3912
4394
  rmSync(basePath, { recursive: true, force: true });
@@ -4003,7 +4485,7 @@ test("runUnitPhase schedules default auto-resume for transient provider cancella
4003
4485
  test("runUnitPhase pauses ghost completions before closeout and finalize side effects", async (t) => {
4004
4486
  _resetPendingResolve();
4005
4487
 
4006
- const basePath = mkdtempSync(join(tmpdir(), "gsd-ghost-completion-"));
4488
+ const basePath = makeLoopTestBase("gsd-ghost-completion-");
4007
4489
  t.after(() => {
4008
4490
  _resetPendingResolve();
4009
4491
  rmSync(basePath, { recursive: true, force: true });
@@ -4105,7 +4587,7 @@ test("runUnitPhase pauses ghost completions before closeout and finalize side ef
4105
4587
  test("runUnitPhase records failed routing outcome when expected artifact is missing", async (t) => {
4106
4588
  _resetPendingResolve();
4107
4589
 
4108
- const basePath = mkdtempSync(join(tmpdir(), "gsd-routing-artifact-missing-"));
4590
+ const basePath = makeLoopTestBase("gsd-routing-artifact-missing-");
4109
4591
  t.after(() => {
4110
4592
  _resetPendingResolve();
4111
4593
  rmSync(basePath, { recursive: true, force: true });
@@ -4188,7 +4670,7 @@ test("runUnitPhase records failed routing outcome when expected artifact is miss
4188
4670
  test("runUnitPhase execute-task retry prompt instructs gsd_task_complete instead of manual summary writes", async (t) => {
4189
4671
  _resetPendingResolve();
4190
4672
 
4191
- const basePath = mkdtempSync(join(tmpdir(), "gsd-execute-task-retry-prompt-"));
4673
+ const basePath = makeLoopTestBase("gsd-execute-task-retry-prompt-");
4192
4674
  t.after(() => {
4193
4675
  _resetPendingResolve();
4194
4676
  rmSync(basePath, { recursive: true, force: true });
@@ -4269,7 +4751,7 @@ test("runUnitPhase execute-task retry prompt instructs gsd_task_complete instead
4269
4751
  test("runUnitPhase non-execute-task retry prompt keeps generic required-file guidance", async (t) => {
4270
4752
  _resetPendingResolve();
4271
4753
 
4272
- const basePath = mkdtempSync(join(tmpdir(), "gsd-non-execute-retry-prompt-"));
4754
+ const basePath = makeLoopTestBase("gsd-non-execute-retry-prompt-");
4273
4755
  t.after(() => {
4274
4756
  _resetPendingResolve();
4275
4757
  rmSync(basePath, { recursive: true, force: true });
@@ -4617,7 +5099,7 @@ test("autoLoop rejects execute-task with 0 tool calls as hallucinated (#1833)",
4617
5099
  test("runUnitPhase retries 0-tool units with ordinary network-related assistant text", async (t) => {
4618
5100
  _resetPendingResolve();
4619
5101
 
4620
- const basePath = mkdtempSync(join(tmpdir(), "gsd-zero-tool-network-text-"));
5102
+ const basePath = makeLoopTestBase("gsd-zero-tool-network-text-");
4621
5103
  t.after(() => {
4622
5104
  rmSync(basePath, { recursive: true, force: true });
4623
5105
  });
@@ -4712,7 +5194,7 @@ test("runUnitPhase retries 0-tool units with ordinary network-related assistant
4712
5194
  test("runUnitPhase pauses auto-mode when zero-tool-call retry is exhausted", async (t) => {
4713
5195
  _resetPendingResolve();
4714
5196
 
4715
- const basePath = mkdtempSync(join(tmpdir(), "gsd-zero-tool-exhausted-"));
5197
+ const basePath = makeLoopTestBase("gsd-zero-tool-exhausted-");
4716
5198
  t.after(() => {
4717
5199
  rmSync(basePath, { recursive: true, force: true });
4718
5200
  });
@@ -4997,7 +5479,7 @@ test("autoLoop rejects complete-slice with 0 tool calls as context-exhausted (#2
4997
5479
  test("autoLoop pauses on zero-tool-call rate-limit assistant messages instead of immediate retry", async (t) => {
4998
5480
  _resetPendingResolve();
4999
5481
 
5000
- const basePath = mkdtempSync(join(tmpdir(), "gsd-zero-tool-rate-limit-"));
5482
+ const basePath = makeLoopTestBase("gsd-zero-tool-rate-limit-");
5001
5483
  t.after(() => {
5002
5484
  _resetPendingResolve();
5003
5485
  rmSync(basePath, { recursive: true, force: true });
@@ -5201,6 +5683,147 @@ test("dispatch Worktree Safety wins before stuck detection for execute-task with
5201
5683
  );
5202
5684
  });
5203
5685
 
5686
+ test("dispatch Worktree Safety honors degraded branch fallback instead of demanding the canonical worktree root", async (t) => {
5687
+ _resetPendingResolve();
5688
+
5689
+ const ctx = makeMockCtx();
5690
+ const pi = makeMockPi();
5691
+ const notifications: string[] = [];
5692
+ ctx.ui.notify = (msg: string) => { notifications.push(msg); };
5693
+
5694
+ // Worktree creation failed and the lifecycle fell back to the milestone
5695
+ // branch in the project root. The safety gate must validate against that
5696
+ // effective branch mode, not the configured worktree mode.
5697
+ const projectRoot = mkdtempSync(join(tmpdir(), "gsd-wt-safety-degraded-"));
5698
+ execSync("git init --initial-branch=main", { cwd: projectRoot, stdio: "ignore" });
5699
+ execSync("git config user.email test@test.com", { cwd: projectRoot, stdio: "ignore" });
5700
+ execSync("git config user.name Test", { cwd: projectRoot, stdio: "ignore" });
5701
+ // The lifecycle fallback checks out the milestone branch in the project
5702
+ // root, so the safety gate's branch verification expects that branch here
5703
+ // too. expectedBranch comes from deps.autoWorktreeBranch (mocked to
5704
+ // "auto/M001"), so the fixture repo must be on that same branch.
5705
+ execSync("git commit --allow-empty -m init", { cwd: projectRoot, stdio: "ignore" });
5706
+ execSync("git checkout -b auto/M001", { cwd: projectRoot, stdio: "ignore" });
5707
+ t.after(() => rmSync(projectRoot, { recursive: true, force: true }));
5708
+
5709
+ const s = makeLoopSession({
5710
+ basePath: projectRoot,
5711
+ originalBasePath: projectRoot,
5712
+ canonicalProjectRoot: projectRoot,
5713
+ isolationDegraded: true,
5714
+ });
5715
+ const deps = makeMockDeps({
5716
+ getIsolationMode: () => "worktree",
5717
+ });
5718
+ const result = await runDispatch(
5719
+ {
5720
+ ctx,
5721
+ pi,
5722
+ s,
5723
+ deps,
5724
+ prefs: undefined,
5725
+ iteration: 1,
5726
+ flowId: "test-flow",
5727
+ nextSeq: () => 1,
5728
+ },
5729
+ {
5730
+ state: {
5731
+ phase: "executing",
5732
+ activeMilestone: { id: "M001", title: "Test", status: "active" },
5733
+ activeSlice: { id: "S01", title: "Slice 1" },
5734
+ activeTask: { id: "T01" },
5735
+ registry: [{ id: "M001", status: "active" }],
5736
+ blockers: [],
5737
+ } as any,
5738
+ mid: "M001",
5739
+ midTitle: "Test",
5740
+ },
5741
+ {
5742
+ recentUnits: [],
5743
+ stuckRecoveryAttempts: 0,
5744
+ consecutiveFinalizeTimeouts: 0,
5745
+ },
5746
+ );
5747
+
5748
+ assert.equal(result.action, "next", "dispatch must proceed under degraded branch isolation");
5749
+ assert.ok(
5750
+ !notifications.some((n) => n.includes("Worktree Safety failed")),
5751
+ "degraded branch fallback must not trip a false invalid-root",
5752
+ );
5753
+ assert.ok(!deps.callLog.includes("stopAuto"), "auto-mode must not stop on the degraded fallback");
5754
+ });
5755
+
5756
+ test("dispatch Worktree Safety honors stranded branch recovery instead of demanding the canonical worktree root", async (t) => {
5757
+ _resetPendingResolve();
5758
+
5759
+ const ctx = makeMockCtx();
5760
+ const pi = makeMockPi();
5761
+ const notifications: string[] = [];
5762
+ ctx.ui.notify = (msg: string) => { notifications.push(msg); };
5763
+
5764
+ // Bootstrap adopted stranded work by checking out the milestone branch in
5765
+ // the project root (strandedRecoveryIsolationMode = "branch"). Isolation is
5766
+ // NOT degraded — the adoption is intentional. The safety gate must validate
5767
+ // against the effective branch mode, not the configured worktree mode.
5768
+ const projectRoot = mkdtempSync(join(tmpdir(), "gsd-wt-safety-stranded-"));
5769
+ execSync("git init --initial-branch=main", { cwd: projectRoot, stdio: "ignore" });
5770
+ execSync("git config user.email test@test.com", { cwd: projectRoot, stdio: "ignore" });
5771
+ execSync("git config user.name Test", { cwd: projectRoot, stdio: "ignore" });
5772
+ // Stranded recovery adopts the milestone branch in the project root, so the
5773
+ // safety gate's branch verification expects that branch here too.
5774
+ // expectedBranch comes from deps.autoWorktreeBranch (mocked to "auto/M001"),
5775
+ // so the fixture repo must be on that same branch.
5776
+ execSync("git commit --allow-empty -m init", { cwd: projectRoot, stdio: "ignore" });
5777
+ execSync("git checkout -b auto/M001", { cwd: projectRoot, stdio: "ignore" });
5778
+ t.after(() => rmSync(projectRoot, { recursive: true, force: true }));
5779
+
5780
+ const s = makeLoopSession({
5781
+ basePath: projectRoot,
5782
+ originalBasePath: projectRoot,
5783
+ canonicalProjectRoot: projectRoot,
5784
+ strandedRecoveryIsolationMode: "branch",
5785
+ });
5786
+ const deps = makeMockDeps({
5787
+ getIsolationMode: () => "worktree",
5788
+ });
5789
+ const result = await runDispatch(
5790
+ {
5791
+ ctx,
5792
+ pi,
5793
+ s,
5794
+ deps,
5795
+ prefs: undefined,
5796
+ iteration: 1,
5797
+ flowId: "test-flow",
5798
+ nextSeq: () => 1,
5799
+ },
5800
+ {
5801
+ state: {
5802
+ phase: "executing",
5803
+ activeMilestone: { id: "M001", title: "Test", status: "active" },
5804
+ activeSlice: { id: "S01", title: "Slice 1" },
5805
+ activeTask: { id: "T01" },
5806
+ registry: [{ id: "M001", status: "active" }],
5807
+ blockers: [],
5808
+ } as any,
5809
+ mid: "M001",
5810
+ midTitle: "Test",
5811
+ },
5812
+ {
5813
+ recentUnits: [],
5814
+ stuckRecoveryAttempts: 0,
5815
+ consecutiveFinalizeTimeouts: 0,
5816
+ },
5817
+ );
5818
+
5819
+ assert.equal(result.action, "next", "dispatch must proceed under stranded branch recovery");
5820
+ assert.ok(
5821
+ !notifications.some((n) => n.includes("Worktree Safety failed")),
5822
+ "stranded branch recovery must not trip a false invalid-root",
5823
+ );
5824
+ assert.ok(!deps.callLog.includes("stopAuto"), "auto-mode must not stop on stranded branch recovery");
5825
+ });
5826
+
5204
5827
  test("runDispatch runs stuck detection while artifact verification retry is pending (#5719)", async (t) => {
5205
5828
  _resetPendingResolve();
5206
5829
 
@@ -5209,7 +5832,7 @@ test("runDispatch runs stuck detection while artifact verification retry is pend
5209
5832
  const notifications: string[] = [];
5210
5833
  ctx.ui.notify = (msg: string) => { notifications.push(msg); };
5211
5834
 
5212
- const basePath = mkdtempSync(join(tmpdir(), "gsd-5719-retry-stuck-"));
5835
+ const basePath = makeLoopTestBase("gsd-5719-retry-stuck-");
5213
5836
  t.after(() => rmSync(basePath, { recursive: true, force: true }));
5214
5837
 
5215
5838
  const s = makeLoopSession({
@@ -5277,7 +5900,7 @@ test("runDispatch falls back to main when dispatch guard cannot read main branch
5277
5900
 
5278
5901
  const ctx = makeMockCtx();
5279
5902
  const pi = makeMockPi();
5280
- const basePath = mkdtempSync(join(tmpdir(), "gsd-5530-main-branch-fallback-"));
5903
+ const basePath = makeLoopTestBase("gsd-5530-main-branch-fallback-");
5281
5904
  t.after(() => rmSync(basePath, { recursive: true, force: true }));
5282
5905
 
5283
5906
  let guardBranch: string | null = null;
@@ -5804,7 +6427,7 @@ test("pre-dispatch replace resolves final unit before dispatch health and stuck
5804
6427
  );
5805
6428
  });
5806
6429
 
5807
- test("autoLoop warns but proceeds for greenfield project (no project files) (#1833)", async () => {
6430
+ test("autoLoop warns but proceeds for greenfield project (no project files) (#1833)", async (t) => {
5808
6431
  _resetPendingResolve();
5809
6432
 
5810
6433
  const ctx = makeMockCtx();
@@ -5813,7 +6436,9 @@ test("autoLoop warns but proceeds for greenfield project (no project files) (#18
5813
6436
  const pi = makeMockPi();
5814
6437
 
5815
6438
  const notifications: string[] = [];
5816
- const s = makeLoopSession({ basePath: "/tmp/empty-worktree" });
6439
+ const basePath = makeLoopTestBase("gsd-greenfield-");
6440
+ t.after(() => rmSync(basePath, { recursive: true, force: true }));
6441
+ const s = makeLoopSession({ basePath });
5817
6442
 
5818
6443
  ctx.ui.notify = (msg: string) => {
5819
6444
  notifications.push(msg);
@@ -5836,8 +6461,6 @@ test("autoLoop warns but proceeds for greenfield project (no project files) (#18
5836
6461
  blockers: [],
5837
6462
  } as any;
5838
6463
  },
5839
- // Has .git but no package.json or src/
5840
- existsSync: (p: string) => p.endsWith(".git"),
5841
6464
  });
5842
6465
 
5843
6466
  await autoLoop(ctx, pi, s, deps);