gsd-pi 2.82.0-dev.ed17d078d → 3.0.0-dev.2e8b124f7

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 (580) hide show
  1. package/README.md +93 -18
  2. package/dist/cli.js +20 -9
  3. package/dist/headless-ui.js +13 -6
  4. package/dist/headless.js +9 -2
  5. package/dist/resources/.managed-resources-content-hash +1 -1
  6. package/dist/resources/GSD-WORKFLOW.md +10 -1
  7. package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
  8. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -6
  9. package/dist/resources/extensions/cmux/index.js +5 -0
  10. package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
  11. package/dist/resources/extensions/gsd/auto/loop.js +110 -37
  12. package/dist/resources/extensions/gsd/auto/orchestrator.js +13 -2
  13. package/dist/resources/extensions/gsd/auto/phases.js +104 -38
  14. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  15. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -1
  16. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
  17. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  18. package/dist/resources/extensions/gsd/auto-dashboard.js +66 -1
  19. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  20. package/dist/resources/extensions/gsd/auto-dispatch.js +71 -20
  21. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  22. package/dist/resources/extensions/gsd/auto-post-unit.js +278 -137
  23. package/dist/resources/extensions/gsd/auto-prompts.js +36 -10
  24. package/dist/resources/extensions/gsd/auto-recovery.js +79 -14
  25. package/dist/resources/extensions/gsd/auto-start.js +90 -14
  26. package/dist/resources/extensions/gsd/auto-timers.js +11 -3
  27. package/dist/resources/extensions/gsd/auto-verification.js +102 -34
  28. package/dist/resources/extensions/gsd/auto-worktree.js +178 -11
  29. package/dist/resources/extensions/gsd/auto.js +107 -54
  30. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +31 -7
  31. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -9
  32. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +5 -4
  33. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  34. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
  35. package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
  36. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  37. package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -0
  38. package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
  39. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  40. package/dist/resources/extensions/gsd/commands-handlers.js +2 -0
  41. package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
  42. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +10 -2
  43. package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
  44. package/dist/resources/extensions/gsd/crash-recovery.js +52 -7
  45. package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
  46. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  47. package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
  48. package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
  49. package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
  50. package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
  51. package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -0
  52. package/dist/resources/extensions/gsd/doctor-git-checks.js +46 -1
  53. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  54. package/dist/resources/extensions/gsd/doctor.js +2 -28
  55. package/dist/resources/extensions/gsd/export-html.js +27 -425
  56. package/dist/resources/extensions/gsd/forensics.js +10 -3
  57. package/dist/resources/extensions/gsd/git-service.js +138 -10
  58. package/dist/resources/extensions/gsd/gsd-db.js +76 -33
  59. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  60. package/dist/resources/extensions/gsd/guided-flow.js +110 -117
  61. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  62. package/dist/resources/extensions/gsd/init-wizard.js +17 -2
  63. package/dist/resources/extensions/gsd/markdown-renderer.js +14 -11
  64. package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
  65. package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
  66. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  67. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  68. package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
  69. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
  70. package/dist/resources/extensions/gsd/paths.js +4 -0
  71. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  72. package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
  73. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
  74. package/dist/resources/extensions/gsd/pre-execution-checks.js +38 -11
  75. package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
  76. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  77. package/dist/resources/extensions/gsd/preferences-validation.js +138 -0
  78. package/dist/resources/extensions/gsd/preferences.js +2 -0
  79. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  80. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  81. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  83. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  84. package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
  85. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  86. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  87. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  88. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  89. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  90. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  91. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  92. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  93. package/dist/resources/extensions/gsd/repository-registry.js +44 -0
  94. package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
  95. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
  96. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +59 -2
  97. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  98. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  99. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  100. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  101. package/dist/resources/extensions/gsd/state.js +14 -4
  102. package/dist/resources/extensions/gsd/status-guards.js +14 -2
  103. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  104. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  105. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -8
  106. package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
  107. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  108. package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
  109. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
  110. package/dist/resources/extensions/gsd/unit-context-composer.js +2 -0
  111. package/dist/resources/extensions/gsd/unit-context-manifest.js +69 -17
  112. package/dist/resources/extensions/gsd/validation.js +23 -1
  113. package/dist/resources/extensions/gsd/verification-gate.js +142 -7
  114. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  115. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  116. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  117. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  118. package/dist/resources/extensions/gsd/worktree-lifecycle.js +83 -19
  119. package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
  120. package/dist/resources/extensions/gsd/worktree-safety.js +33 -1
  121. package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
  122. package/dist/resources/extensions/shared/html-shell.js +388 -0
  123. package/dist/resources/extensions/shared/interview-ui.js +6 -4
  124. package/dist/resources/extensions/subagent/index.js +448 -78
  125. package/dist/resources/extensions/subagent/launch.js +77 -0
  126. package/dist/resources/extensions/subagent/run-store.js +148 -0
  127. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  128. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  129. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  130. package/dist/resources/extensions/visual-brief/index.js +5 -0
  131. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  132. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  133. package/dist/resources/skills/forensics/SKILL.md +1 -1
  134. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  135. package/dist/web/standalone/.next/BUILD_ID +1 -1
  136. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  137. package/dist/web/standalone/.next/build-manifest.json +3 -3
  138. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  139. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  140. package/dist/web/standalone/.next/required-server-files.json +1 -1
  141. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  143. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  151. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  154. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  155. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  156. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  157. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  158. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  159. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  160. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  161. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/index.html +1 -1
  164. package/dist/web/standalone/.next/server/app/index.rsc +4 -7
  165. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  166. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -7
  167. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  169. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  170. package/dist/web/standalone/.next/server/app/page.js +2 -2
  171. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  174. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  175. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  179. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  180. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  181. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  182. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  183. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  184. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  185. package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
  186. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  187. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  188. package/dist/web/standalone/server.js +1 -1
  189. package/package.json +4 -4
  190. package/packages/contracts/dist/rpc.test.js +7 -0
  191. package/packages/contracts/dist/rpc.test.js.map +1 -1
  192. package/packages/contracts/dist/workflow.d.ts +21 -0
  193. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  194. package/packages/contracts/dist/workflow.js +24 -0
  195. package/packages/contracts/dist/workflow.js.map +1 -1
  196. package/packages/contracts/src/rpc.test.ts +8 -0
  197. package/packages/contracts/src/workflow.ts +24 -0
  198. package/packages/daemon/package.json +2 -2
  199. package/packages/mcp-server/README.md +13 -4
  200. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  201. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  202. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  203. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  204. package/packages/mcp-server/package.json +2 -2
  205. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  206. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  207. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  208. package/packages/native/package.json +1 -1
  209. package/packages/native/tsconfig.json +2 -1
  210. package/packages/native/tsconfig.tsbuildinfo +1 -1
  211. package/packages/pi-agent-core/package.json +1 -1
  212. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  213. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  214. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  215. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  216. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  217. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  218. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  219. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  220. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  221. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  222. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  223. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  224. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  225. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  226. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  227. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  228. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  229. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  230. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  231. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  232. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  233. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  234. package/packages/pi-ai/package.json +1 -1
  235. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  236. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  237. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  238. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  239. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  240. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  241. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  242. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  243. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  244. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  245. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  246. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  247. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  248. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  249. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  250. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
  251. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  252. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
  253. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  254. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
  255. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  256. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  257. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  258. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +8 -2
  259. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  260. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  261. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  262. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  263. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  264. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  265. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  266. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +71 -97
  267. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  268. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
  269. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  270. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
  271. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  273. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  275. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  276. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  277. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  278. package/packages/pi-coding-agent/package.json +1 -1
  279. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  280. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  281. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  282. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
  283. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
  284. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  285. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +17 -1
  286. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  287. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
  288. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -102
  289. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
  290. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
  291. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  292. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  293. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  294. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  295. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  296. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  297. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  298. package/packages/pi-tui/dist/__tests__/tui.test.js +45 -2
  299. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  300. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  301. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  302. package/packages/pi-tui/dist/terminal.js +12 -0
  303. package/packages/pi-tui/dist/terminal.js.map +1 -1
  304. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  305. package/packages/pi-tui/dist/tui.js +106 -27
  306. package/packages/pi-tui/dist/tui.js.map +1 -1
  307. package/packages/pi-tui/package.json +1 -1
  308. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  309. package/packages/pi-tui/src/__tests__/tui.test.ts +59 -2
  310. package/packages/pi-tui/src/terminal.ts +11 -0
  311. package/packages/pi-tui/src/tui.ts +108 -27
  312. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  313. package/packages/rpc-client/package.json +1 -1
  314. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  315. package/pkg/package.json +1 -1
  316. package/src/resources/GSD-WORKFLOW.md +10 -1
  317. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  318. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
  319. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  320. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
  321. package/src/resources/extensions/cmux/index.ts +6 -0
  322. package/src/resources/extensions/gsd/auto/contracts.ts +17 -6
  323. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  324. package/src/resources/extensions/gsd/auto/loop.ts +111 -38
  325. package/src/resources/extensions/gsd/auto/orchestrator.ts +13 -2
  326. package/src/resources/extensions/gsd/auto/phases.ts +127 -49
  327. package/src/resources/extensions/gsd/auto/session.ts +16 -0
  328. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  329. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +6 -2
  330. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  331. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  332. package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
  333. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  334. package/src/resources/extensions/gsd/auto-dispatch.ts +74 -20
  335. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  336. package/src/resources/extensions/gsd/auto-post-unit.ts +312 -148
  337. package/src/resources/extensions/gsd/auto-prompts.ts +36 -13
  338. package/src/resources/extensions/gsd/auto-recovery.ts +83 -11
  339. package/src/resources/extensions/gsd/auto-start.ts +99 -12
  340. package/src/resources/extensions/gsd/auto-timers.ts +10 -3
  341. package/src/resources/extensions/gsd/auto-verification.ts +124 -42
  342. package/src/resources/extensions/gsd/auto-worktree.ts +195 -11
  343. package/src/resources/extensions/gsd/auto.ts +100 -42
  344. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +42 -7
  345. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -9
  346. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +5 -4
  347. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  348. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
  349. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  350. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  351. package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -0
  352. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  353. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  354. package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
  355. package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
  356. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +11 -3
  357. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  358. package/src/resources/extensions/gsd/crash-recovery.ts +52 -6
  359. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  360. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  361. package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
  362. package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
  363. package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
  364. package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
  365. package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -0
  366. package/src/resources/extensions/gsd/doctor-git-checks.ts +45 -1
  367. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  368. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  369. package/src/resources/extensions/gsd/doctor.ts +2 -27
  370. package/src/resources/extensions/gsd/export-html.ts +27 -427
  371. package/src/resources/extensions/gsd/forensics.ts +9 -3
  372. package/src/resources/extensions/gsd/git-service.ts +166 -11
  373. package/src/resources/extensions/gsd/gsd-db.ts +80 -31
  374. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  375. package/src/resources/extensions/gsd/guided-flow.ts +142 -134
  376. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  377. package/src/resources/extensions/gsd/init-wizard.ts +17 -2
  378. package/src/resources/extensions/gsd/journal.ts +8 -1
  379. package/src/resources/extensions/gsd/markdown-renderer.ts +14 -11
  380. package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
  381. package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
  382. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  383. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  384. package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
  385. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
  386. package/src/resources/extensions/gsd/paths.ts +5 -0
  387. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  388. package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
  389. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
  390. package/src/resources/extensions/gsd/pre-execution-checks.ts +49 -11
  391. package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
  392. package/src/resources/extensions/gsd/preferences-types.ts +33 -0
  393. package/src/resources/extensions/gsd/preferences-validation.ts +145 -0
  394. package/src/resources/extensions/gsd/preferences.ts +5 -0
  395. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  396. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  397. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  398. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  399. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  400. package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
  401. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  402. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  403. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  404. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  405. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  406. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  407. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  408. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  409. package/src/resources/extensions/gsd/repository-registry.ts +77 -0
  410. package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
  411. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
  412. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +52 -1
  413. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  414. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  415. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  416. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  417. package/src/resources/extensions/gsd/state.ts +15 -4
  418. package/src/resources/extensions/gsd/status-guards.ts +16 -2
  419. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  420. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  421. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +10 -1
  422. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  423. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  424. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +300 -1
  425. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +197 -11
  426. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  427. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  428. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  429. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +129 -6
  430. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
  431. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  432. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  433. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  434. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
  435. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  436. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  437. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  438. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
  439. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  440. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  441. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
  442. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +5 -9
  443. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  444. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +104 -2
  445. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  446. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  447. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
  448. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
  449. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +111 -1
  450. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
  451. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  452. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
  453. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
  454. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  455. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
  456. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  457. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  458. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  459. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  460. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  461. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  462. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  463. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  464. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  465. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  466. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
  467. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  468. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +199 -2
  469. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  470. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
  471. package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
  472. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
  473. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
  474. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  475. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
  476. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  477. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
  478. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  479. package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
  480. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  481. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  482. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  483. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  484. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  485. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
  486. package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
  487. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  488. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
  489. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
  490. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  491. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +59 -0
  492. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
  493. package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
  494. package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
  495. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +78 -0
  496. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  497. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  498. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  499. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  500. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  501. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
  502. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  503. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +21 -1
  504. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +72 -1
  505. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  506. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +86 -2
  507. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  508. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  509. package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
  510. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  511. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
  512. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  513. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -0
  514. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +131 -9
  515. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
  516. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  517. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
  518. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +173 -1
  519. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  520. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  521. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  522. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  523. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1 -1
  524. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  525. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  526. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +57 -2
  527. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
  528. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +46 -0
  529. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
  530. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
  531. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
  532. package/src/resources/extensions/gsd/tools/complete-milestone.ts +8 -10
  533. package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
  534. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  535. package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
  536. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
  537. package/src/resources/extensions/gsd/types.ts +1 -1
  538. package/src/resources/extensions/gsd/unit-context-composer.ts +3 -0
  539. package/src/resources/extensions/gsd/unit-context-manifest.ts +86 -19
  540. package/src/resources/extensions/gsd/validation.ts +23 -1
  541. package/src/resources/extensions/gsd/verification-gate.ts +170 -6
  542. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  543. package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
  544. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  545. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  546. package/src/resources/extensions/gsd/worktree-lifecycle.ts +93 -20
  547. package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
  548. package/src/resources/extensions/gsd/worktree-safety.ts +45 -6
  549. package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
  550. package/src/resources/extensions/shared/html-shell.ts +412 -0
  551. package/src/resources/extensions/shared/interview-ui.ts +6 -4
  552. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
  553. package/src/resources/extensions/subagent/index.ts +567 -103
  554. package/src/resources/extensions/subagent/launch.ts +131 -0
  555. package/src/resources/extensions/subagent/run-store.ts +218 -0
  556. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  557. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  558. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  559. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  560. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  561. package/src/resources/extensions/visual-brief/index.ts +8 -0
  562. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  563. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  564. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  565. package/src/resources/skills/forensics/SKILL.md +1 -1
  566. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  567. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  568. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  569. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  570. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +0 -1
  571. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  572. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  573. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  574. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  575. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  576. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  577. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  578. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  579. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → zCegwxH2e6vLp1vEZLLuZ}/_buildManifest.js +0 -0
  580. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → zCegwxH2e6vLp1vEZLLuZ}/_ssgManifest.js +0 -0
@@ -73,6 +73,7 @@ const COMMON_BUDGET_SMALL = 250_000; // ~65K tokens
73
73
  // allowed-path set for the docs policy lives in one reviewable place.
74
74
  const TOOLS_ALL = { mode: "all" };
75
75
  const TOOLS_PLANNING = { mode: "planning" };
76
+ const TOOLS_VERIFICATION = { mode: "verification" };
76
77
  // Like TOOLS_PLANNING but permits dispatch to read-only recon/planning
77
78
  // specialists. Runtime-enforced by write-gate.ts before the subagent tool runs.
78
79
  const TOOLS_PLANNING_DISPATCH_RECON = {
@@ -122,6 +123,9 @@ export const KNOWN_UNIT_TYPES = [
122
123
  "run-uat",
123
124
  "gate-evaluate",
124
125
  "rewrite-docs",
126
+ // Sidecar units (triage, quick-task)
127
+ "triage-captures",
128
+ "quick-task",
125
129
  // Deep planning mode (project-level) units
126
130
  "workflow-preferences",
127
131
  "discuss-project",
@@ -185,11 +189,9 @@ export const UNIT_MANIFESTS = {
185
189
  codebaseMap: false,
186
190
  preferences: "active-only",
187
191
  contextMode: "verification",
188
- // planning-dispatch: validation is a verification-fan-out unit. It reads
189
- // the milestone surface and dispatches reviewer/security/tester subagents
190
- // to report findings without touching user source. Mirrors
191
- // complete-milestone's policy. Write isolation to .gsd/ is preserved.
192
- tools: TOOLS_PLANNING_DISPATCH_REVIEW,
192
+ // Validation may need to run shell verification commands and apply source
193
+ // fixes before milestone closeout can proceed.
194
+ tools: TOOLS_ALL,
193
195
  artifacts: {
194
196
  inline: ["roadmap", "slice-summary", "slice-uat", "requirements", "decisions", "templates"],
195
197
  excerpt: [],
@@ -204,11 +206,9 @@ export const UNIT_MANIFESTS = {
204
206
  codebaseMap: false,
205
207
  preferences: "active-only",
206
208
  contextMode: "verification",
207
- // planning-dispatch: completion is a high-leverage place to fan out to
208
- // reviewer / security / tester subagents. They read the diff and report
209
- // findings; they do not write user source. Write isolation to .gsd/ is
210
- // preserved.
211
- tools: TOOLS_PLANNING_DISPATCH_REVIEW,
209
+ // Milestone closeout must run unrestricted shell verification commands
210
+ // against the final diff before recording completion.
211
+ tools: TOOLS_ALL,
212
212
  artifacts: {
213
213
  // #4780 landed slice-summary as excerpt for this unit; phase 2 of
214
214
  // the architecture will read this manifest as the source of truth
@@ -227,7 +227,9 @@ export const UNIT_MANIFESTS = {
227
227
  codebaseMap: true,
228
228
  preferences: "active-only",
229
229
  contextMode: "research",
230
- tools: TOOLS_PLANNING,
230
+ // Multi-slice research dispatches use the research-slice unit contract to
231
+ // fan out scout subagents that write .gsd research artifacts.
232
+ tools: TOOLS_PLANNING_DISPATCH_RECON,
231
233
  artifacts: {
232
234
  inline: ["roadmap", "milestone-research", "dependency-summaries", "templates"],
233
235
  excerpt: [],
@@ -293,10 +295,9 @@ export const UNIT_MANIFESTS = {
293
295
  codebaseMap: false,
294
296
  preferences: "active-only",
295
297
  contextMode: "verification",
296
- // See complete-milestone same rationale: dispatch to reviewer / security /
297
- // tester subagents to fan out review work without bloating this unit's
298
- // context.
299
- tools: TOOLS_PLANNING_DISPATCH_REVIEW,
298
+ // Slice closeout may need to run shell verification commands and apply
299
+ // source fixes before completion can be recorded.
300
+ tools: TOOLS_ALL,
300
301
  artifacts: {
301
302
  // Phase 3 migration (#4782): matches today's actual
302
303
  // buildCompleteSlicePrompt inlining order. Overrides prepend +
@@ -365,7 +366,7 @@ export const UNIT_MANIFESTS = {
365
366
  codebaseMap: false,
366
367
  preferences: "active-only",
367
368
  contextMode: "verification",
368
- tools: TOOLS_PLANNING,
369
+ tools: TOOLS_VERIFICATION,
369
370
  artifacts: {
370
371
  // Phase 3 migration (#4782): manifest matches today's actual
371
372
  // buildRunUatPrompt inlining. Prior phase-1 entry listed
@@ -384,7 +385,9 @@ export const UNIT_MANIFESTS = {
384
385
  codebaseMap: false,
385
386
  preferences: "active-only",
386
387
  contextMode: "verification",
387
- tools: TOOLS_PLANNING,
388
+ // Gate evaluation fans out tester-style subagents, which read the slice
389
+ // plan and report via the DB-backed gate-result tool.
390
+ tools: TOOLS_PLANNING_DISPATCH_REVIEW,
388
391
  artifacts: {
389
392
  inline: ["slice-plan", "prior-task-summaries"],
390
393
  excerpt: [],
@@ -407,6 +410,36 @@ export const UNIT_MANIFESTS = {
407
410
  },
408
411
  maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
409
412
  },
413
+ "triage-captures": {
414
+ skills: { mode: "all" },
415
+ knowledge: "scoped",
416
+ memory: "prompt-relevant",
417
+ codebaseMap: false,
418
+ preferences: "active-only",
419
+ contextMode: "triage",
420
+ tools: TOOLS_PLANNING,
421
+ artifacts: {
422
+ inline: ["roadmap", "slice-plan", "slice-summary", "requirements", "decisions", "templates"],
423
+ excerpt: [],
424
+ onDemand: [],
425
+ },
426
+ maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
427
+ },
428
+ "quick-task": {
429
+ skills: { mode: "all" },
430
+ knowledge: "full",
431
+ memory: "prompt-relevant",
432
+ codebaseMap: true,
433
+ preferences: "active-only",
434
+ contextMode: "execution",
435
+ tools: TOOLS_ALL,
436
+ artifacts: {
437
+ inline: ["roadmap", "slice-plan", "task-plan", "requirements", "decisions", "templates"],
438
+ excerpt: [],
439
+ onDemand: [],
440
+ },
441
+ maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
442
+ },
410
443
  // ─── Deep planning mode (project-level) units ────────────────────────
411
444
  // workflow-preferences: default-writing stage that records
412
445
  // commit_policy / branch_model in PREFERENCES.md, defaults
@@ -509,3 +542,22 @@ export const UNIT_MANIFESTS = {
509
542
  export function resolveManifest(unitType) {
510
543
  return UNIT_MANIFESTS[unitType] ?? null;
511
544
  }
545
+ export function compileSubagentPermissionContract(policy) {
546
+ if (!policy) {
547
+ return { allowed: false, allowedSubagents: [], toolsMode: "unknown" };
548
+ }
549
+ if (policy.mode === "all") {
550
+ return { allowed: true, allowedSubagents: ["*"], toolsMode: policy.mode };
551
+ }
552
+ if (policy.mode === "planning-dispatch") {
553
+ return {
554
+ allowed: true,
555
+ allowedSubagents: [...policy.allowedSubagents],
556
+ toolsMode: policy.mode,
557
+ };
558
+ }
559
+ return { allowed: false, allowedSubagents: [], toolsMode: policy.mode };
560
+ }
561
+ export function resolveSubagentPermissionContract(unitType) {
562
+ return compileSubagentPermissionContract(resolveManifest(unitType)?.tools);
563
+ }
@@ -5,6 +5,27 @@
5
5
  export function isNonEmptyString(value) {
6
6
  return typeof value === "string" && value.trim().length > 0;
7
7
  }
8
+ /**
9
+ * Characters that are used as delimiters in GSD state management documents
10
+ * and should not appear in milestone or slice titles.
11
+ */
12
+ const TITLE_DELIMITER_RE = /[\u2014\u2013\/]/; // em dash, en dash, forward slash
13
+ /**
14
+ * Check whether a milestone or slice title contains characters that conflict
15
+ * with GSD's state document delimiter conventions.
16
+ * Returns a human-readable description of the problem, or null if the title is safe.
17
+ */
18
+ export function validateTitle(title) {
19
+ if (TITLE_DELIMITER_RE.test(title)) {
20
+ const found = [];
21
+ if (/[\u2014\u2013]/.test(title))
22
+ found.push("em/en dash (\u2014 or \u2013)");
23
+ if (/\//.test(title))
24
+ found.push("forward slash (/)");
25
+ return `title contains ${found.join(" and ")}, which conflict with GSD state document delimiters`;
26
+ }
27
+ return null;
28
+ }
8
29
  /**
9
30
  * Validate that `value` is an array of non-empty strings.
10
31
  * Throws with a message referencing `field` on failure.
@@ -12,7 +33,8 @@ export function isNonEmptyString(value) {
12
33
  */
13
34
  export function validateStringArray(value, field) {
14
35
  if (!Array.isArray(value)) {
15
- throw new Error(`${field} must be an array`);
36
+ const received = value === null ? "null" : typeof value;
37
+ throw new Error(`${field} must be an array of strings, not ${received}`);
16
38
  }
17
39
  if (value.some((item) => !isNonEmptyString(item))) {
18
40
  throw new Error(`${field} must contain only non-empty strings`);
@@ -3,7 +3,7 @@
3
3
  // Discovery order (D003): preference → task plan verify → package.json scripts.
4
4
  // First non-empty source wins.
5
5
  import { spawnSync } from "node:child_process";
6
- import { existsSync, readFileSync } from "node:fs";
6
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
7
7
  import { join, basename } from "node:path";
8
8
  import { DEFAULT_COMMAND_TIMEOUT_MS } from "./constants.js";
9
9
  import { rewriteCommandWithRtk } from "../shared/rtk.js";
@@ -27,7 +27,9 @@ const PACKAGE_SCRIPT_KEYS = ["typecheck", "lint", "test"];
27
27
  * 1. Explicit preference commands
28
28
  * 2. Task plan verify field (split on &&)
29
29
  * 3. package.json scripts (typecheck, lint, test)
30
- * 4. None found
30
+ * 4. Python pytest project markers
31
+ * 5. Dependency-free Node test files
32
+ * 6. None found
31
33
  */
32
34
  export function discoverCommands(options) {
33
35
  // 1. Preference commands
@@ -72,9 +74,76 @@ export function discoverCommands(options) {
72
74
  // Malformed package.json — fall through to "none"
73
75
  }
74
76
  }
75
- // 4. Nothing found
77
+ const pythonCommand = discoverPythonPytestCommand(options.cwd);
78
+ if (pythonCommand) {
79
+ return { commands: [pythonCommand], source: "python-project" };
80
+ }
81
+ const nodeTestCommand = discoverNodeTestFileCommand(options.cwd);
82
+ if (nodeTestCommand) {
83
+ return { commands: [nodeTestCommand], source: "node-test-file" };
84
+ }
85
+ // 6. Nothing found
76
86
  return { commands: [], source: "none" };
77
87
  }
88
+ function discoverNodeTestFileCommand(cwd) {
89
+ let entries;
90
+ try {
91
+ entries = readdirSync(cwd, { withFileTypes: true });
92
+ }
93
+ catch {
94
+ return null;
95
+ }
96
+ const testFile = entries
97
+ .filter((entry) => entry.isFile())
98
+ .map((entry) => entry.name)
99
+ .filter((name) => /^test-[A-Za-z0-9._-]+\.js$|^[A-Za-z0-9._-]+\.test\.js$/.test(name))
100
+ .sort()[0];
101
+ return testFile ? `node ${testFile}` : null;
102
+ }
103
+ function discoverPythonPytestCommand(cwd) {
104
+ const hasPythonTestFiles = hasPythonTests(join(cwd, "tests"));
105
+ const hasPytestConfig = existsSync(join(cwd, "pytest.ini"));
106
+ const pyprojectPath = join(cwd, "pyproject.toml");
107
+ const hasPyproject = existsSync(pyprojectPath);
108
+ if (!hasPythonTestFiles && !hasPytestConfig && !hasPyproject) {
109
+ return null;
110
+ }
111
+ if (hasPytestConfig || hasPythonTestFiles) {
112
+ return "python3 -m pytest";
113
+ }
114
+ try {
115
+ const pyproject = readFileSync(pyprojectPath, "utf-8");
116
+ if (pyproject.includes("[tool.pytest]") ||
117
+ pyproject.includes("[tool.pytest.") ||
118
+ pyproject.includes("[pytest]") ||
119
+ pyproject.includes("[tool:pytest]")) {
120
+ return "python3 -m pytest";
121
+ }
122
+ }
123
+ catch {
124
+ // Ignore unreadable pyproject.toml and fall through.
125
+ }
126
+ return null;
127
+ }
128
+ function hasPythonTests(dir) {
129
+ let entries;
130
+ try {
131
+ entries = readdirSync(dir, { withFileTypes: true });
132
+ }
133
+ catch {
134
+ return false;
135
+ }
136
+ for (const entry of entries) {
137
+ const path = join(dir, entry.name);
138
+ if (entry.isDirectory() && hasPythonTests(path)) {
139
+ return true;
140
+ }
141
+ if (entry.isFile() && /^test_.*\.py$|^.*_test\.py$/.test(entry.name)) {
142
+ return true;
143
+ }
144
+ }
145
+ return false;
146
+ }
78
147
  // ─── Failure Context Formatting ──────────────────────────────────────────────
79
148
  /** Maximum chars of stderr to include per failed check in failure context. */
80
149
  const MAX_STDERR_PER_CHECK = 2_000;
@@ -112,7 +181,7 @@ export function formatFailureContext(result) {
112
181
  }
113
182
  // ─── Gate Execution ─────────────────────────────────────────────────────────
114
183
  /** Characters that indicate shell injection when found in a command string. */
115
- const SHELL_INJECTION_PATTERN = /[;|`]|\$\(/;
184
+ const SHELL_INJECTION_PATTERN = /[;|`<>]|\$\(/;
116
185
  /**
117
186
  * Known executable first-tokens that are safe to run.
118
187
  * Lowercase commands, common build/test tools, and npm/yarn/pnpm invocations.
@@ -148,6 +217,7 @@ const KNOWN_COMMAND_PREFIXES = new Set([
148
217
  * Heuristics (any true → prose-like):
149
218
  * 1. First token starts with an uppercase letter and the string has 4+ words
150
219
  * 2. String contains commas followed by spaces (prose clause structure)
220
+ * 3. First token has no ASCII letters or digits and the string has 4+ words
151
221
  */
152
222
  export function isLikelyCommand(cmd) {
153
223
  const trimmed = cmd.trim();
@@ -173,19 +243,48 @@ export function isLikelyCommand(cmd) {
173
243
  // First token has uppercase letters and no path separators → prose
174
244
  if (/[A-Z]/.test(firstToken) && !firstToken.includes("/"))
175
245
  return false;
246
+ // Non-ASCII prose with multiple words should not be executed as a command.
247
+ if (!/[A-Za-z0-9]/.test(firstToken) && tokens.length >= 4)
248
+ return false;
176
249
  return true;
177
250
  }
178
251
  /**
179
252
  * Validate a command string for obvious shell injection patterns.
180
253
  * Returns the command unchanged if safe, or null if suspicious.
181
254
  */
255
+ export function validateVerificationCommand(cmd) {
256
+ if (SHELL_INJECTION_PATTERN.test(cmd)) {
257
+ return { ok: false, reason: "contains shell control syntax such as pipes, redirects, semicolons, backticks, or command substitution" };
258
+ }
259
+ if (!isLikelyCommand(cmd)) {
260
+ return { ok: false, reason: "does not look like a runnable command" };
261
+ }
262
+ return { ok: true };
263
+ }
182
264
  function sanitizeCommand(cmd) {
183
- if (SHELL_INJECTION_PATTERN.test(cmd))
184
- return null;
185
- if (!isLikelyCommand(cmd))
265
+ const validation = validateVerificationCommand(cmd);
266
+ if (!validation.ok)
186
267
  return null;
187
268
  return cmd;
188
269
  }
270
+ function mergeDiscoverySource(sources) {
271
+ if (sources.length === 0)
272
+ return "none";
273
+ const first = sources[0];
274
+ if (sources.every((source) => source === first))
275
+ return first;
276
+ const precedence = [
277
+ "preference",
278
+ "task-plan",
279
+ "package-json",
280
+ "python-project",
281
+ ];
282
+ for (const source of precedence) {
283
+ if (sources.includes(source))
284
+ return source;
285
+ }
286
+ return "none";
287
+ }
189
288
  /**
190
289
  * Run the verification gate: discover commands, execute each via spawnSync,
191
290
  * and return a structured result.
@@ -251,6 +350,42 @@ export function runVerificationGate(options) {
251
350
  timestamp,
252
351
  };
253
352
  }
353
+ export function runVerificationGateForTargets(options) {
354
+ const timestamp = Date.now();
355
+ if (options.targets.length === 0) {
356
+ return {
357
+ passed: true,
358
+ checks: [],
359
+ discoverySource: "none",
360
+ timestamp,
361
+ };
362
+ }
363
+ const checks = [];
364
+ const sources = [];
365
+ let passed = true;
366
+ for (const target of options.targets) {
367
+ const result = runVerificationGate({
368
+ cwd: target.cwd,
369
+ preferenceCommands: options.preferenceCommands ?? target.preferenceCommands,
370
+ taskPlanVerify: options.taskPlanVerify,
371
+ commandTimeoutMs: options.commandTimeoutMs,
372
+ });
373
+ passed = passed && result.passed;
374
+ sources.push(result.discoverySource);
375
+ for (const check of result.checks) {
376
+ checks.push({
377
+ ...check,
378
+ command: target.id === "project" ? check.command : `[${target.id}] ${check.command}`,
379
+ });
380
+ }
381
+ }
382
+ return {
383
+ passed,
384
+ checks,
385
+ discoverySource: mergeDiscoverySource(sources),
386
+ timestamp,
387
+ };
388
+ }
254
389
  // ─── Runtime Error Capture ──────────────────────────────────────────────────
255
390
  /** Maximum characters of browser console text to retain per entry. */
256
391
  const MAX_BROWSER_TEXT_CHARS = 500;
@@ -0,0 +1,26 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Host-owned verification verdict policy for auto-mode units.
3
+ export function decideVerificationVerdict(unitType, result) {
4
+ if (unitType === "execute-task" && result.discoverySource === "none" && result.checks.length === 0) {
5
+ return {
6
+ passed: false,
7
+ reason: "no-host-checks",
8
+ retryable: false,
9
+ failureContext: "No runnable host-owned verification command was discovered. Add project verification_commands or a runnable task-plan Verify command before completing this execute-task.",
10
+ };
11
+ }
12
+ if (!result.passed) {
13
+ return {
14
+ passed: false,
15
+ reason: "checks-failed",
16
+ retryable: true,
17
+ failureContext: "",
18
+ };
19
+ }
20
+ return {
21
+ passed: true,
22
+ reason: "passed",
23
+ retryable: false,
24
+ failureContext: "",
25
+ };
26
+ }
@@ -83,6 +83,7 @@ export function snapshotState() {
83
83
  proof_level: r["proof_level"] ?? "",
84
84
  integration_closure: r["integration_closure"] ?? "",
85
85
  observability_impact: r["observability_impact"] ?? "",
86
+ target_repositories: JSON.parse(r["target_repositories"] || "[]"),
86
87
  sequence: toNumeric(r["sequence"], 0),
87
88
  replan_triggered_at: r["replan_triggered_at"] ?? null,
88
89
  is_sketch: toNumeric(r["is_sketch"], 0),
@@ -114,6 +115,7 @@ export function snapshotState() {
114
115
  expected_output: JSON.parse(r["expected_output"] || "[]"),
115
116
  observability_impact: r["observability_impact"] ?? "",
116
117
  full_plan_md: r["full_plan_md"] ?? "",
118
+ target_repositories: JSON.parse(r["target_repositories"] || "[]"),
117
119
  sequence: toNumeric(r["sequence"], 0),
118
120
  blocker_source: r["blocker_source"] ?? "",
119
121
  escalation_pending: toNumeric(r["escalation_pending"], 0),
@@ -322,6 +322,16 @@ function hasAskUserQuestionsTool(activeTools) {
322
322
  return toolSeparator >= 0 && toolName.slice(toolSeparator + 2) === "ask_user_questions";
323
323
  });
324
324
  }
325
+ function hasRequiredTool(requiredTool, activeTools) {
326
+ return activeTools.some((toolName) => {
327
+ if (toolName === requiredTool)
328
+ return true;
329
+ if (!toolName.startsWith("mcp__"))
330
+ return false;
331
+ const toolSeparator = toolName.indexOf("__", "mcp__".length);
332
+ return toolSeparator >= 0 && toolName.slice(toolSeparator + 2) === requiredTool;
333
+ });
334
+ }
325
335
  function workflowMcpStructuredQuestionsOptIn(env = process.env) {
326
336
  const value = env.GSD_WORKFLOW_MCP_STRUCTURED_QUESTIONS;
327
337
  return value === "1" || value === "true";
@@ -352,8 +362,14 @@ export function getWorkflowTransportSupportError(provider, requiredTools, option
352
362
  if (!launch) {
353
363
  return `Provider ${providerLabel} cannot run ${surface}${unitLabel}: the GSD workflow MCP server is not configured or discoverable. Detected Claude Code model but no workflow MCP. Please run /gsd mcp init . from your project root. You can also configure GSD_WORKFLOW_MCP_COMMAND, build packages/mcp-server/dist/cli.js, or install gsd-mcp-server on PATH.`;
354
364
  }
355
- const missing = [...new Set(requiredTools)].filter((tool) => !MCP_WORKFLOW_TOOL_SURFACE.has(tool));
365
+ const uniqueRequired = [...new Set(requiredTools)];
366
+ const missing = (options.activeTools && options.activeTools.length > 0)
367
+ ? uniqueRequired.filter((tool) => !hasRequiredTool(tool, options.activeTools))
368
+ : uniqueRequired.filter((tool) => !MCP_WORKFLOW_TOOL_SURFACE.has(tool));
356
369
  if (missing.length === 0)
357
370
  return null;
371
+ if (options.activeTools && options.activeTools.length > 0) {
372
+ return `Provider ${providerLabel} cannot run ${surface}${unitLabel}: this unit requires ${missing.join(", ")}, but the active runtime toolset currently exposes only ${options.activeTools.slice().sort().join(", ")}.`;
373
+ }
358
374
  return `Provider ${providerLabel} cannot run ${surface}${unitLabel}: this unit requires ${missing.join(", ")}, but the workflow MCP transport currently exposes only ${Array.from(MCP_WORKFLOW_TOOL_SURFACE).sort().join(", ")}.`;
359
375
  }
@@ -150,11 +150,11 @@ export function renderSummaryContent(taskRow, sliceId, milestoneId, evidence) {
150
150
  }
151
151
  // ── Frontmatter (YAML list format, matches parseSummary() expectations) ──
152
152
  const keyFilesYaml = taskRow.key_files && taskRow.key_files.length > 0
153
- ? taskRow.key_files.map(f => ` - ${f}`).join("\n")
154
- : " - (none)";
153
+ ? `\n${taskRow.key_files.map(f => ` - ${f}`).join("\n")}`
154
+ : " []";
155
155
  const keyDecisionsYaml = taskRow.key_decisions && taskRow.key_decisions.length > 0
156
- ? taskRow.key_decisions.map(d => ` - ${d}`).join("\n")
157
- : " - (none)";
156
+ ? `\n${taskRow.key_decisions.map(d => ` - ${d}`).join("\n")}`
157
+ : " []";
158
158
  // Derive verification_result from evidence if available
159
159
  const evidenceList = evidence ?? [];
160
160
  const allPassed = evidenceList.length > 0 &&
@@ -182,10 +182,8 @@ export function renderSummaryContent(taskRow, sliceId, milestoneId, evidence) {
182
182
  id: ${taskRow.id}
183
183
  parent: ${sliceId}
184
184
  milestone: ${milestoneId}
185
- key_files:
186
- ${keyFilesYaml}
187
- key_decisions:
188
- ${keyDecisionsYaml}
185
+ key_files:${keyFilesYaml}
186
+ key_decisions:${keyDecisionsYaml}
189
187
  duration: ${taskRow.duration || ""}
190
188
  verification_result: ${verificationResult}
191
189
  completed_at: ${taskRow.completed_at || ""}
@@ -20,6 +20,7 @@ import { existsSync, readFileSync, unlinkSync } from "node:fs";
20
20
  import { randomUUID } from "node:crypto";
21
21
  import { join } from "node:path";
22
22
  import { debugLog } from "./debug-logger.js";
23
+ import { logWarning } from "./workflow-logger.js";
23
24
  import { emitJournalEvent } from "./journal.js";
24
25
  import { emitWorktreeCreated, emitWorktreeMerged } from "./worktree-telemetry.js";
25
26
  import { resolveWorktreeProjectRoot, normalizeWorktreePathForCompare, } from "./worktree-root.js";
@@ -48,6 +49,11 @@ import { nativeCheckoutBranch } from "./native-git-bridge.js";
48
49
  // is the only Module that calls them, and they live alongside the Module's
49
50
  // other primitives in `auto-worktree.ts`.
50
51
  import { autoWorktreeBranch, createAutoWorktree, enterAutoWorktree, enterBranchModeForMilestone, getAutoWorktreePath, isInAutoWorktree, teardownAutoWorktree, } from "./auto-worktree.js";
52
+ const recentWorktreeMergeFailures = new Map();
53
+ const MERGE_FAILURE_DEDUPE_MS = 60_000;
54
+ export function resetRecentWorktreeMergeFailuresForTest() {
55
+ recentWorktreeMergeFailures.clear();
56
+ }
51
57
  /**
52
58
  * Internal sentinel — thrown by `_mergeBranchMode` when it has already
53
59
  * emitted a user-visible error. The outer `mergeAndExit` catches the type
@@ -197,18 +203,9 @@ export function _enterMilestoneCore(s, deps, milestoneId, ctx) {
197
203
  cause: invalidMilestoneIdError(milestoneId),
198
204
  };
199
205
  }
200
- if (s.isolationDegraded) {
201
- debugLog("WorktreeLifecycle", {
202
- action: "enterMilestone",
203
- milestoneId,
204
- skipped: true,
205
- reason: "isolation-degraded",
206
- });
207
- return { ok: false, reason: "isolation-degraded" };
208
- }
209
206
  // Phase B: claim a milestone lease before any worktree mutation. Two
210
207
  // workers cannot enter the same milestone concurrently. Best-effort:
211
- // skip if no worker registered (single-worker fallback) or DB
208
+ // warn if no worker registered (single-worker fallback) or skip if DB
212
209
  // unavailable; reuse existing lease if we already hold it on this
213
210
  // milestone (re-entry within the same session).
214
211
  if (s.workerId) {
@@ -288,11 +285,43 @@ export function _enterMilestoneCore(s, deps, milestoneId, ctx) {
288
285
  }
289
286
  }
290
287
  }
288
+ else {
289
+ logWarning("worktree", `enterMilestone(${milestoneId}) ran before auto worker registration; milestone lease was not claimed.`);
290
+ }
291
291
  // Resolve the project root for worktree operations via shared helper.
292
292
  // Handles the case where originalBasePath is falsy and basePath is itself
293
293
  // a worktree path — prevents double-nested worktree paths (#3729).
294
294
  const basePath = resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
295
295
  const mode = getIsolationMode(basePath);
296
+ if (s.isolationDegraded) {
297
+ if (mode === "worktree") {
298
+ try {
299
+ lifecycleEnterBranchMode(deps, basePath, milestoneId);
300
+ s.basePath = basePath;
301
+ rebuildGitService(s, deps);
302
+ invalidateAllCaches();
303
+ ctx.notify(`Worktree isolation is degraded. Fell back to branch milestone/${milestoneId}.`, "warning");
304
+ return { ok: true, mode: "branch", path: basePath };
305
+ }
306
+ catch (err) {
307
+ debugLog("WorktreeLifecycle", {
308
+ action: "enterMilestone",
309
+ milestoneId,
310
+ skipped: true,
311
+ reason: "isolation-degraded",
312
+ fallback: "branch-failed",
313
+ error: err instanceof Error ? err.message : String(err),
314
+ });
315
+ }
316
+ }
317
+ debugLog("WorktreeLifecycle", {
318
+ action: "enterMilestone",
319
+ milestoneId,
320
+ skipped: true,
321
+ reason: "isolation-degraded",
322
+ });
323
+ return { ok: false, reason: "isolation-degraded" };
324
+ }
296
325
  if (mode === "none") {
297
326
  debugLog("WorktreeLifecycle", {
298
327
  action: "enterMilestone",
@@ -477,6 +506,28 @@ function rebuildGitService(s, deps) {
477
506
  // GitService cast.
478
507
  s.gitService = deps.gitServiceFactory(s.basePath);
479
508
  }
509
+ function emitWorktreeMergeFailedOnce(basePath, milestoneId, err) {
510
+ const msg = err instanceof Error ? err.message : String(err);
511
+ const errorCategory = err instanceof Error ? err.name : "Error";
512
+ const now = Date.now();
513
+ const key = `${basePath}\0${milestoneId}\0${errorCategory}`;
514
+ const previous = recentWorktreeMergeFailures.get(key);
515
+ if (previous && now - previous < MERGE_FAILURE_DEDUPE_MS)
516
+ return;
517
+ for (const [candidate, ts] of recentWorktreeMergeFailures) {
518
+ if (now - ts >= MERGE_FAILURE_DEDUPE_MS) {
519
+ recentWorktreeMergeFailures.delete(candidate);
520
+ }
521
+ }
522
+ emitJournalEvent(basePath, {
523
+ ts: new Date().toISOString(),
524
+ flowId: randomUUID(),
525
+ seq: 0,
526
+ eventType: "worktree-merge-failed",
527
+ data: { milestoneId, error: msg },
528
+ });
529
+ recentWorktreeMergeFailures.set(key, now);
530
+ }
480
531
  // ─── Session-less merge entry (ADR-016 phase 2 / A1) ─────────────────────
481
532
  /**
482
533
  * Worktree-mode merge body. Session-less — operates on a `MergeContext`.
@@ -590,13 +641,7 @@ function _mergeWorktreeModeImpl(deps, mctx) {
590
641
  error: msg,
591
642
  fallback: "chdir-to-project-root",
592
643
  });
593
- emitJournalEvent(originalBasePath || worktreeBasePath, {
594
- ts: new Date().toISOString(),
595
- flowId: randomUUID(),
596
- seq: 0,
597
- eventType: "worktree-merge-failed",
598
- data: { milestoneId, error: msg },
599
- });
644
+ emitWorktreeMergeFailedOnce(originalBasePath || worktreeBasePath, milestoneId, err);
600
645
  // Surface a clear, actionable error. Worktree and milestone branch
601
646
  // are intentionally preserved — nothing has been deleted. User can
602
647
  // retry /gsd dispatch complete-milestone or merge manually once the
@@ -1198,17 +1243,36 @@ export class WorktreeLifecycle {
1198
1243
  }
1199
1244
  }
1200
1245
  /**
1201
- * Restore `s.basePath` to `s.originalBasePath` and rebuild `s.gitService`.
1202
- * No-op when `originalBasePath` is empty (fresh sessions).
1246
+ * Restore `s.basePath` to `s.originalBasePath`, chdir process cwd, and
1247
+ * rebuild `s.gitService`. No-op when `originalBasePath` is empty (fresh
1248
+ * sessions).
1203
1249
  *
1204
1250
  * Used by error/cleanup paths that need the session to behave as if the
1205
1251
  * worktree was never entered. Does NOT teardown the worktree directory —
1206
1252
  * callers that need teardown go through `exitMilestone({ merge: false })`.
1253
+ *
1254
+ * ADR-016 phase 3 (#5693): chdir lives inside the verb so callers do not
1255
+ * pair `restoreToProjectRoot()` with a redundant `process.chdir`. The
1256
+ * chdir runs BEFORE the throwable work (`rebuildGitService`, cache
1257
+ * invalidation) so that cleanup-path cwd is restored even if the
1258
+ * downstream rebuild throws. The chdir itself is best-effort; failure is
1259
+ * logged via debugLog and swallowed.
1207
1260
  */
1208
1261
  restoreToProjectRoot() {
1209
1262
  if (!this.s.originalBasePath)
1210
1263
  return;
1211
1264
  this.s.basePath = this.s.originalBasePath;
1265
+ try {
1266
+ process.chdir(this.s.basePath);
1267
+ }
1268
+ catch (err) {
1269
+ debugLog("WorktreeLifecycle", {
1270
+ action: "restoreToProjectRoot",
1271
+ result: "chdir-failed",
1272
+ basePath: this.s.basePath,
1273
+ error: err instanceof Error ? err.message : String(err),
1274
+ });
1275
+ }
1212
1276
  rebuildGitService(this.s, this.deps);
1213
1277
  invalidateAllCaches();
1214
1278
  }