@opengsd/gsd-pi 1.2.0-dev.955e4da0 → 1.2.0-dev.fb12b103

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 (378) hide show
  1. package/dist/cli-style.d.ts +17 -0
  2. package/dist/cli-style.js +28 -0
  3. package/dist/cli.js +1 -1
  4. package/dist/headless-events.d.ts +4 -2
  5. package/dist/headless-events.js +7 -29
  6. package/dist/models-resolver.d.ts +3 -13
  7. package/dist/models-resolver.js +3 -22
  8. package/dist/resource-loader.js +2 -14
  9. package/dist/resources/.managed-resources-content-hash +1 -1
  10. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  11. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  12. package/dist/resources/extensions/async-jobs/index.js +65 -0
  13. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  14. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  15. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  16. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  17. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  18. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  19. package/dist/resources/extensions/bg-shell/utilities.js +3 -0
  20. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  21. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  22. package/dist/resources/extensions/browser-tools/index.js +69 -12
  23. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +30 -4
  24. package/dist/resources/extensions/gsd/auto/orchestrator.js +7 -5
  25. package/dist/resources/extensions/gsd/auto-dispatch.js +12 -1
  26. package/dist/resources/extensions/gsd/auto-model-selection.js +25 -6
  27. package/dist/resources/extensions/gsd/auto-post-unit.js +11 -2
  28. package/dist/resources/extensions/gsd/auto-prompts.js +15 -10
  29. package/dist/resources/extensions/gsd/auto-start.js +15 -10
  30. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  31. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +7 -16
  32. package/dist/resources/extensions/gsd/auto-worktree.js +30 -90
  33. package/dist/resources/extensions/gsd/auto.js +4 -13
  34. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +3 -2
  35. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +23 -6
  36. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  37. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +122 -20
  38. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +6 -2
  39. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  40. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  41. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  42. package/dist/resources/extensions/gsd/captures.js +4 -6
  43. package/dist/resources/extensions/gsd/constants.js +0 -2
  44. package/dist/resources/extensions/gsd/crash-recovery.js +4 -12
  45. package/dist/resources/extensions/gsd/doctor-environment.js +2 -6
  46. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  47. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -15
  48. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  49. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  50. package/dist/resources/extensions/gsd/guidance.js +98 -0
  51. package/dist/resources/extensions/gsd/guided-flow.js +17 -2
  52. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  53. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  54. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  55. package/dist/resources/extensions/gsd/migrate/safety.js +4 -1
  56. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  57. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +6 -4
  58. package/dist/resources/extensions/gsd/paths.js +27 -0
  59. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  60. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  61. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  62. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  63. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  64. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  65. package/dist/resources/extensions/gsd/prompts/run-uat.md +1 -1
  66. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  67. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  68. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  69. package/dist/resources/extensions/gsd/publication.js +87 -0
  70. package/dist/resources/extensions/gsd/recovery-classification.js +37 -94
  71. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  72. package/dist/resources/extensions/gsd/state.js +1 -20
  73. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  74. package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
  75. package/dist/resources/extensions/gsd/tools/exec-tool.js +9 -7
  76. package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
  77. package/dist/resources/extensions/gsd/uat-policy.js +2 -1
  78. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  79. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  80. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  81. package/dist/resources/extensions/gsd/unit-registry.js +337 -0
  82. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  83. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  84. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  85. package/dist/resources/extensions/gsd/worktree-git-recovery.js +15 -9
  86. package/dist/resources/extensions/gsd/worktree-root.js +11 -0
  87. package/dist/resources/extensions/gsd/worktree-session-state.js +4 -5
  88. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  89. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  90. package/dist/resources/extensions/shared/gsd-browser-cli.js +96 -5
  91. package/dist/resources/shared/package.json +3 -0
  92. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  93. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  94. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  95. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  96. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  97. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  98. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  99. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  100. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  101. package/dist/web/standalone/.next/BUILD_ID +1 -1
  102. package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
  103. package/dist/web/standalone/.next/build-manifest.json +3 -3
  104. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  105. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  106. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  107. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  115. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  124. package/dist/web/standalone/.next/server/app/index.html +1 -1
  125. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
  132. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  133. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  134. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  137. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  138. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  139. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  140. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  141. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  142. package/dist/web/standalone/node_modules/postcss/lib/container.js +18 -26
  143. package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +14 -47
  144. package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
  145. package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
  146. package/dist/web/standalone/node_modules/postcss/lib/input.js +29 -54
  147. package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +37 -47
  148. package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +9 -26
  149. package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +55 -57
  150. package/dist/web/standalone/node_modules/postcss/lib/node.js +31 -99
  151. package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
  152. package/dist/web/standalone/node_modules/postcss/lib/parser.js +9 -10
  153. package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
  154. package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +11 -30
  155. package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
  156. package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
  157. package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
  158. package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +28 -69
  159. package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +2 -6
  160. package/dist/web/standalone/node_modules/postcss/package.json +48 -48
  161. package/dist/web/standalone/package.json +1 -1
  162. package/dist/worktree-cli.js +3 -6
  163. package/dist/worktree-status-banner.js +7 -15
  164. package/package.json +1 -1
  165. package/packages/cloud-mcp-gateway/package.json +2 -2
  166. package/packages/contracts/dist/rpc.d.ts +1 -0
  167. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  168. package/packages/contracts/dist/rpc.js.map +1 -1
  169. package/packages/contracts/dist/workflow.d.ts +4 -0
  170. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  171. package/packages/contracts/dist/workflow.js.map +1 -1
  172. package/packages/contracts/package.json +1 -1
  173. package/packages/daemon/package.json +4 -4
  174. package/packages/gsd-agent-core/package.json +5 -5
  175. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
  176. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  177. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +5 -0
  178. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  179. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  180. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  181. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  182. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  183. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  184. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  185. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  186. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  187. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  188. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  189. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  190. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  191. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  192. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  193. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  194. package/packages/gsd-agent-modes/package.json +7 -7
  195. package/packages/mcp-server/dist/cli.js +6 -3
  196. package/packages/mcp-server/dist/cli.js.map +1 -1
  197. package/packages/mcp-server/dist/workflow-tools.d.ts +8 -0
  198. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  199. package/packages/mcp-server/dist/workflow-tools.js +17 -1
  200. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  201. package/packages/mcp-server/package.json +3 -3
  202. package/packages/native/package.json +1 -1
  203. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  204. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  205. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  206. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  207. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  208. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  209. package/packages/pi-agent-core/dist/index.js +3 -0
  210. package/packages/pi-agent-core/dist/index.js.map +1 -1
  211. package/packages/pi-agent-core/package.json +1 -1
  212. package/packages/pi-ai/dist/models.generated.d.ts +94 -382
  213. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  214. package/packages/pi-ai/dist/models.generated.js +149 -422
  215. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  216. package/packages/pi-ai/package.json +1 -1
  217. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  218. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  219. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  220. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  221. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  222. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  223. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  224. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  225. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  226. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  227. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  228. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  229. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  230. package/packages/pi-coding-agent/dist/index.js +1 -1
  231. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  232. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  233. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  234. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  235. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  236. package/packages/pi-coding-agent/package.json +7 -7
  237. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  238. package/packages/pi-tui/dist/tui.js +9 -0
  239. package/packages/pi-tui/dist/tui.js.map +1 -1
  240. package/packages/pi-tui/package.json +2 -2
  241. package/packages/rpc-client/package.json +2 -2
  242. package/pkg/package.json +1 -1
  243. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  244. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  245. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  246. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  247. package/src/resources/extensions/async-jobs/index.ts +79 -0
  248. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  249. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  250. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  251. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  252. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  253. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  254. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  255. package/src/resources/extensions/bg-shell/utilities.ts +3 -0
  256. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  257. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  258. package/src/resources/extensions/browser-tools/index.ts +71 -13
  259. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  260. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +29 -1
  261. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  262. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +34 -4
  263. package/src/resources/extensions/gsd/auto/orchestrator.ts +7 -5
  264. package/src/resources/extensions/gsd/auto-dispatch.ts +12 -0
  265. package/src/resources/extensions/gsd/auto-model-selection.ts +25 -5
  266. package/src/resources/extensions/gsd/auto-post-unit.ts +13 -2
  267. package/src/resources/extensions/gsd/auto-prompts.ts +40 -26
  268. package/src/resources/extensions/gsd/auto-start.ts +15 -10
  269. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  270. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +10 -17
  271. package/src/resources/extensions/gsd/auto-worktree.ts +30 -93
  272. package/src/resources/extensions/gsd/auto.ts +8 -15
  273. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +3 -5
  274. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +23 -6
  275. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  276. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +151 -15
  277. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +6 -2
  278. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  279. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  280. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  281. package/src/resources/extensions/gsd/captures.ts +4 -6
  282. package/src/resources/extensions/gsd/constants.ts +0 -3
  283. package/src/resources/extensions/gsd/crash-recovery.ts +3 -9
  284. package/src/resources/extensions/gsd/doctor-environment.ts +2 -7
  285. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  286. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +13 -15
  287. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  288. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  289. package/src/resources/extensions/gsd/guidance.ts +139 -0
  290. package/src/resources/extensions/gsd/guided-flow.ts +16 -2
  291. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  292. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  293. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  294. package/src/resources/extensions/gsd/migrate/safety.ts +4 -1
  295. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  296. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -4
  297. package/src/resources/extensions/gsd/paths.ts +33 -0
  298. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  299. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  300. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  301. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  302. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  303. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  304. package/src/resources/extensions/gsd/prompts/run-uat.md +1 -1
  305. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  306. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  307. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  308. package/src/resources/extensions/gsd/publication.ts +122 -0
  309. package/src/resources/extensions/gsd/recovery-classification.ts +42 -96
  310. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  311. package/src/resources/extensions/gsd/state.ts +4 -21
  312. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  313. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +22 -0
  314. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +16 -19
  315. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  316. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  317. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  318. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  319. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +22 -0
  320. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  321. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  322. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  323. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  324. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  325. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  326. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  327. package/src/resources/extensions/gsd/tests/guidance.test.ts +125 -0
  328. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +53 -11
  329. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +73 -58
  330. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  331. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  332. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  333. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  334. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  335. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  336. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  337. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  338. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +157 -0
  339. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +1 -0
  340. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  341. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
  342. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  343. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
  344. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +24 -29
  345. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  346. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  347. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  348. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  349. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  350. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +2 -2
  351. package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
  352. package/src/resources/extensions/gsd/tools/exec-tool.ts +8 -7
  353. package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
  354. package/src/resources/extensions/gsd/uat-policy.ts +2 -1
  355. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  356. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  357. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  358. package/src/resources/extensions/gsd/unit-registry.ts +412 -0
  359. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  360. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  361. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  362. package/src/resources/extensions/gsd/worktree-git-recovery.ts +15 -9
  363. package/src/resources/extensions/gsd/worktree-root.ts +12 -0
  364. package/src/resources/extensions/gsd/worktree-session-state.ts +3 -5
  365. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  366. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  367. package/src/resources/extensions/shared/gsd-browser-cli.ts +119 -5
  368. package/src/resources/shared/package.json +3 -0
  369. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  370. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  371. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  372. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  373. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  374. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  375. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  376. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  377. /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → mU4QIDlpVHDdjDpeEKh5W}/_buildManifest.js +0 -0
  378. /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → mU4QIDlpVHDdjDpeEKh5W}/_ssgManifest.js +0 -0
@@ -43,8 +43,10 @@ import {
43
43
  type ComputedArtifactId,
44
44
  type ComputedArtifactRegistry,
45
45
  type ContextModePolicy,
46
+ type ToolsPolicy,
46
47
  type UnitContextManifest,
47
48
  } from "./unit-context-manifest.js";
49
+ import { getUnitToolSurfaceContract } from "./unit-tool-contracts.js";
48
50
  import type { UnitPromptContextContract } from "./tool-contract.js";
49
51
 
50
52
  /**
@@ -133,6 +135,16 @@ const CONTEXT_MODE_GUIDANCE_BY_LANE: Record<Exclude<ContextModePolicy, "none">,
133
135
  "Use `gsd_resume` for prior context, `gsd_exec_search` for saved evidence, and `gsd_exec` for noisy doc validation commands.",
134
136
  };
135
137
 
138
+ // Per-unit overrides win over the lane default. run-uat's tool contract
139
+ // forbids `gsd_exec`/`gsd_exec_search` (acceptance evidence must flow through
140
+ // `gsd_uat_exec`) and Claude Code dispatch strips the tools entirely, so the
141
+ // shared verification-lane guidance would steer the agent into calling an
142
+ // unavailable tool.
143
+ const CONTEXT_MODE_GUIDANCE_BY_UNIT: Record<string, string> = {
144
+ "run-uat":
145
+ "Use `gsd_uat_exec` for acceptance checks so evidence is typed as UAT-owned, and `gsd_resume` after compaction or resume.",
146
+ };
147
+
136
148
  /**
137
149
  * Render the Context Mode instruction lane for a unit type. Unknown unit
138
150
  * types, disabled config, and explicit `contextMode: "none"` all omit the
@@ -147,7 +159,8 @@ export function composeContextModeInstructions(
147
159
  if (!manifest || manifest.contextMode === "none") return "";
148
160
 
149
161
  const lane = CONTEXT_MODE_LANE_LABELS[manifest.contextMode];
150
- const guidance = CONTEXT_MODE_GUIDANCE_BY_LANE[manifest.contextMode];
162
+ const guidance =
163
+ CONTEXT_MODE_GUIDANCE_BY_UNIT[unitType] ?? CONTEXT_MODE_GUIDANCE_BY_LANE[manifest.contextMode];
151
164
  if (opts.renderMode === "nested") {
152
165
  return `Context Mode (${lane} lane): ${guidance}`;
153
166
  }
@@ -160,6 +173,103 @@ export function composeContextModeInstructions(
160
173
  ].join("\n");
161
174
  }
162
175
 
176
+ // ─── Tool surface hardening ───────────────────────────────────────────────
177
+ //
178
+ // Upfront guidance for units whose runtime tool surface is narrower than the
179
+ // default Claude/native set. Prevents wasted turns on tools that are blocked
180
+ // by the write gate or Claude Code SDK allowlists (run-uat gsd_exec/Bash).
181
+
182
+ export interface ComposeToolSurfaceInstructionOptions {
183
+ readonly renderMode: ContextModeRenderMode;
184
+ }
185
+
186
+ const TOOL_SURFACE_GUIDANCE_BY_UNIT: Record<string, string> = {
187
+ "run-uat":
188
+ "Do not call `gsd_exec`, `Bash`, `Write`, or `Edit` — they are unavailable in this unit. Run every automated check through `gsd_uat_exec` with the appropriate `intent`. For browser UAT modes, use `browser_*` tools when presented; if browser automation fails, record the failure honestly and use `gsd_uat_exec` for the best objective substitute.",
189
+ "complete-slice":
190
+ "Run slice-level verification through `gsd_exec` (or MCP-scoped `mcp__…__gsd_exec`), not direct `bash`. Do not call `gsd_uat_result_save` — run-uat owns persisted UAT assessment. On verification failure, do not edit user source files in this unit.",
191
+ "gate-evaluate":
192
+ "Dispatch only **tester** subagents via `subagent`. Persist each gate with `gsd_save_gate_result`. Do not use `ToolSearch` — it is not available.",
193
+ "reactive-execute":
194
+ "Dispatch only **worker** subagents via `subagent`. Do not call `gsd_task_complete` from this parent batch — each worker owns its task completion. If a failed task left no summary, call `gsd_summary_save` with `blocker_discovered: true`.",
195
+ "execute-task":
196
+ "Complete only this task via `gsd_task_complete`. Do not call `gsd_slice_complete`, `gsd_validate_milestone`, or `gsd_complete_milestone` — the orchestrator owns phase transitions.",
197
+ "validate-milestone":
198
+ "Dispatch reviewer subagents in parallel, then persist the verdict via `gsd_validate_milestone`. Do not query `.gsd/gsd.db` directly — use `gsd_milestone_status` and inlined context.",
199
+ "complete-milestone":
200
+ "Persist completion only through `gsd_complete_milestone` after verification passes. Do not query `.gsd/gsd.db` directly. Do not write `.gsd/PROJECT.md` or `.gsd/REQUIREMENTS.md` by hand — use `gsd_summary_save` and `gsd_requirement_update`.",
201
+ "replan-slice":
202
+ "Persist replans through `gsd_replan_slice` only. Do not edit `PLAN.md` or task plans directly.",
203
+ "plan-slice":
204
+ "Persist planning through `gsd_plan_slice` only. Dispatch subagents only to **scout** or **planner** for reconnaissance — not implementation agents. Do not edit user source files outside `.gsd/**`.",
205
+ "refine-slice":
206
+ "Persist refinements through `gsd_plan_slice` only. Dispatch subagents only to **scout** or **planner**. Do not edit user source files outside `.gsd/**`.",
207
+ "plan-milestone":
208
+ "Persist milestone planning through `gsd_plan_milestone` / `gsd_plan_slice`. Do not edit user source files outside `.gsd/**`.",
209
+ "research-slice":
210
+ "Dispatch subagents only to **scout** or **planner** for reconnaissance. Do not edit user source files outside `.gsd/**`.",
211
+ };
212
+
213
+ function guidanceForToolsPolicy(policy: ToolsPolicy): string | null {
214
+ switch (policy.mode) {
215
+ case "planning":
216
+ return "Writes are restricted to `.gsd/**` under the working directory — do not edit user source files. `bash` is limited to read-only investigation commands. Do not dispatch subagents. For human elicitation, use workflow MCP `ask_user_questions` when available — not native `AskUserQuestion`.";
217
+ case "planning-dispatch": {
218
+ const agents = policy.allowedSubagents.map((agent) => `**${agent}**`).join(", ");
219
+ return `Writes are restricted to \`.gsd/**\`. Dispatch subagents only to: ${agents}. Do not edit user source files.`;
220
+ }
221
+ case "docs":
222
+ return "Writes are restricted to `.gsd/**` and project documentation paths (`docs/`, `README*`, `CHANGELOG.md`, root `*.md`). Do not edit application source.";
223
+ case "verification": {
224
+ const subagentLine = policy.allowedSubagents?.length
225
+ ? ` Dispatch subagents only to: ${policy.allowedSubagents.map((agent) => `**${agent}**`).join(", ")}.`
226
+ : " Do not dispatch subagents.";
227
+ return `\`bash\` is limited to build/test verification commands. Writes restricted to \`.gsd/**\`.${subagentLine}`;
228
+ }
229
+ default:
230
+ return null;
231
+ }
232
+ }
233
+
234
+ function formatForbiddenWorkflowToolsLine(
235
+ unitType: string,
236
+ unitGuidance: string | undefined,
237
+ ): string | null {
238
+ const forbidden = getUnitToolSurfaceContract(unitType)?.forbiddenGsdTools;
239
+ if (!forbidden) return null;
240
+ const names = Object.keys(forbidden).filter((name) => !unitGuidance?.includes(`\`${name}\``));
241
+ if (names.length === 0) return null;
242
+ return `Do not call ${names.map((name) => `\`${name}\``).join(", ")} in this unit.`;
243
+ }
244
+
245
+ /**
246
+ * Render upfront tool-surface guidance for a unit type. Unknown units and
247
+ * unrestricted (`tools.mode: "all"`) units omit the block unless they have
248
+ * unit-specific closeout guidance registered above.
249
+ */
250
+ export function composeToolSurfaceInstructions(
251
+ unitType: string,
252
+ opts: ComposeToolSurfaceInstructionOptions,
253
+ ): string {
254
+ const manifest = resolveManifest(unitType);
255
+ if (!manifest) return "";
256
+
257
+ const unitGuidance = TOOL_SURFACE_GUIDANCE_BY_UNIT[unitType];
258
+ const policyGuidance = unitGuidance ? null : guidanceForToolsPolicy(manifest.tools);
259
+ const forbiddenLine = formatForbiddenWorkflowToolsLine(unitType, unitGuidance);
260
+ const parts = [unitGuidance, policyGuidance, forbiddenLine].filter(
261
+ (part): part is string => typeof part === "string" && part.length > 0,
262
+ );
263
+ if (parts.length === 0) return "";
264
+
265
+ const body = parts.join(" ");
266
+ if (opts.renderMode === "nested") {
267
+ return `Tool surface: ${body}`;
268
+ }
269
+
270
+ return ["## Tool Surface", "", body].join("\n");
271
+ }
272
+
163
273
  // ─── v2 surface (#4924) ───────────────────────────────────────────────────
164
274
 
165
275
  /**
@@ -343,35 +343,11 @@ const TOOLS_DOCS: ToolsPolicy = {
343
343
  * enumerates these against `UNIT_MANIFESTS` to catch manifest drift when
344
344
  * a new unit type lands.
345
345
  */
346
- export const KNOWN_UNIT_TYPES = [
347
- "research-milestone",
348
- "plan-milestone",
349
- "discuss-milestone",
350
- "validate-milestone",
351
- "complete-milestone",
352
- "research-slice",
353
- "plan-slice",
354
- "refine-slice",
355
- "replan-slice",
356
- "complete-slice",
357
- "reassess-roadmap",
358
- "execute-task",
359
- "reactive-execute",
360
- "run-uat",
361
- "gate-evaluate",
362
- "rewrite-docs",
363
- // Sidecar units (triage, quick-task)
364
- "triage-captures",
365
- "quick-task",
366
- // Deep planning mode (project-level) units
367
- "workflow-preferences",
368
- "discuss-project",
369
- "discuss-requirements",
370
- "research-decision",
371
- "research-project",
372
- ] as const;
346
+ // Unit-type vocabulary is owned by the Unit Registry (ADR-033); re-exported
347
+ // here so established import paths keep working.
348
+ import { KNOWN_UNIT_TYPES, type UnitType } from "./unit-registry.js";
373
349
 
374
- export type UnitType = typeof KNOWN_UNIT_TYPES[number];
350
+ export { KNOWN_UNIT_TYPES, type UnitType };
375
351
 
376
352
  export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
377
353
  // ─── Milestone-scoped ────────────────────────────────────────────────
@@ -0,0 +1,412 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Unit Registry — the single declaration point for what a Unit type is (ADR-033).
3
+ //
4
+ // One Unit Descriptor per Unit type. The previously independent tables —
5
+ // `KNOWN_UNIT_TYPES`/`UnitType` (unit-context-manifest.ts), `UNIT_TOOL_CONTRACTS`
6
+ // (unit-tool-contracts.ts), the scope-class Sets (auto-unit-tool-scope.ts), and
7
+ // the unit→phase switch (preferences-models.ts) — are derived views over this
8
+ // registry. Import paths stay stable: each former home re-exports its view
9
+ // (the `gsd-db.ts` barrel discipline).
10
+ //
11
+ // Behaviour-neutral by construction. The registry preserves the asymmetries the
12
+ // old tables had drifted into, explicitly instead of accidentally:
13
+ // - `discuss-slice` and `execute-task-simple` had tool contracts and scope-Set
14
+ // membership but were absent from `KNOWN_UNIT_TYPES` → declared here as
15
+ // `kind: "variant"` (excluded from the derived `KNOWN_UNIT_TYPES`/`UnitType`).
16
+ // - `triage-captures` and `quick-task` had manifests but no tool contract and
17
+ // no phase routing → `toolContract: null`, `phaseChain: null`.
18
+ // The parity test (tests/unit-registry.test.ts) pins every derived view to the
19
+ // pre-registry values.
20
+ //
21
+ // Not yet declared here (remaining ADR-033 steps): the manifest data
22
+ // (`UNIT_MANIFESTS` stays in unit-context-manifest.ts, already type-enforced
23
+ // against the registry's `UnitType`) and prompt-template association (still
24
+ // implicit in auto-prompts.ts builders).
25
+
26
+ import type { CanonicalWorkflowToolName } from "@opengsd/contracts";
27
+ import { BROWSER_CONTRACT_TOOL_NAMES } from "../shared/browser-contract.js";
28
+ import type { GSDModelPhaseKey } from "./preferences-types.js";
29
+ import type { WorkflowMcpAdapterToolName } from "./workflow-tool-surface.js";
30
+
31
+ // ─── Declaration vocabulary ───────────────────────────────────────────────
32
+
33
+ /** Workflow-surface names a Unit contract may reference. Drift from WORKFLOW_TOOL_CONTRACTS fails typecheck. */
34
+ export type UnitWorkflowToolName = CanonicalWorkflowToolName | WorkflowMcpAdapterToolName;
35
+
36
+ export type UnitGsdToolName = UnitWorkflowToolName | "subagent";
37
+
38
+ export interface UnitToolSurfaceContract {
39
+ allowedGsdTools: readonly UnitGsdToolName[];
40
+ requiredWorkflowTools: readonly UnitWorkflowToolName[];
41
+ forbiddenGsdTools?: Readonly<Record<string, string>>;
42
+ }
43
+
44
+ /**
45
+ * Scope class drives the tool-scoping Sets:
46
+ * - "execute-task" — source-writing execution units; members of both the
47
+ * execute-task Set and the section-close gate Set.
48
+ * - "section-close" — units that close quality gates by writing summary
49
+ * sections (gsd_save_gate_result is soft-blocked).
50
+ * - "standard" — everything else.
51
+ */
52
+ export type UnitScopeClass = "execute-task" | "section-close" | "standard";
53
+
54
+ export interface UnitDescriptor {
55
+ /** "variant" types are dispatchable but excluded from KNOWN_UNIT_TYPES/UnitType. */
56
+ readonly kind: "primary" | "variant";
57
+ readonly scopeClass: UnitScopeClass;
58
+ /**
59
+ * Ordered phase-bucket fallback chain for model/thinking resolution
60
+ * (ADR-026), most-specific first. `null` = no phase routing (the unit
61
+ * resolves against session defaults).
62
+ */
63
+ readonly phaseChain: readonly GSDModelPhaseKey[] | null;
64
+ /** `null` = the unit has no scoped gsd-tool contract. */
65
+ readonly toolContract: UnitToolSurfaceContract | null;
66
+ }
67
+
68
+ // ─── Shared tool-name constants (used by registry rows) ──────────────────
69
+
70
+ export const RUN_UAT_WORKFLOW_TOOL_NAMES = [
71
+ "gsd_uat_exec",
72
+ "gsd_uat_result_save",
73
+ "gsd_resume",
74
+ "gsd_milestone_status",
75
+ "gsd_journal_query",
76
+ ] as const;
77
+
78
+ export const RUN_UAT_READ_ONLY_TOOL_NAMES = [
79
+ "find",
80
+ "glob",
81
+ "grep",
82
+ "ls",
83
+ "read",
84
+ ] as const;
85
+
86
+ /**
87
+ * Browser tools presented to run-uat. A derived view of the Browser Automation
88
+ * Contract vocabulary (shared/browser-contract.ts) — the contract module is the
89
+ * only place browser tool names are declared.
90
+ */
91
+ export const RUN_UAT_BROWSER_TOOL_NAMES = BROWSER_CONTRACT_TOOL_NAMES;
92
+
93
+ // ─── The registry ─────────────────────────────────────────────────────────
94
+
95
+ export const UNIT_REGISTRY = {
96
+ "research-milestone": {
97
+ kind: "primary",
98
+ scopeClass: "standard",
99
+ phaseChain: ["research"],
100
+ toolContract: {
101
+ allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
102
+ requiredWorkflowTools: ["gsd_summary_save"],
103
+ },
104
+ },
105
+ "plan-milestone": {
106
+ kind: "primary",
107
+ scopeClass: "standard",
108
+ phaseChain: ["planning"],
109
+ toolContract: {
110
+ allowedGsdTools: [
111
+ "gsd_milestone_status",
112
+ "gsd_plan_milestone",
113
+ "gsd_plan_slice",
114
+ "gsd_decision_save",
115
+ "gsd_requirement_update",
116
+ ],
117
+ requiredWorkflowTools: ["gsd_milestone_status", "gsd_plan_milestone", "gsd_plan_slice"],
118
+ },
119
+ },
120
+ "discuss-milestone": {
121
+ kind: "primary",
122
+ scopeClass: "standard",
123
+ phaseChain: ["discuss", "planning"],
124
+ toolContract: {
125
+ allowedGsdTools: [
126
+ "gsd_summary_save",
127
+ "gsd_decision_save",
128
+ "gsd_requirement_save",
129
+ "gsd_requirement_update",
130
+ "gsd_plan_milestone",
131
+ "gsd_milestone_generate_id",
132
+ ],
133
+ requiredWorkflowTools: [
134
+ "ask_user_questions",
135
+ "gsd_summary_save",
136
+ "gsd_requirement_save",
137
+ "gsd_requirement_update",
138
+ "gsd_plan_milestone",
139
+ "gsd_milestone_generate_id",
140
+ ],
141
+ },
142
+ },
143
+ "discuss-slice": {
144
+ kind: "variant",
145
+ scopeClass: "standard",
146
+ phaseChain: ["discuss", "planning"],
147
+ toolContract: {
148
+ allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
149
+ requiredWorkflowTools: ["ask_user_questions", "gsd_summary_save"],
150
+ },
151
+ },
152
+ "validate-milestone": {
153
+ kind: "primary",
154
+ scopeClass: "section-close",
155
+ phaseChain: ["validation", "planning"],
156
+ toolContract: {
157
+ allowedGsdTools: ["gsd_milestone_status", "gsd_validate_milestone", "gsd_reassess_roadmap", "subagent"],
158
+ requiredWorkflowTools: ["gsd_milestone_status", "gsd_validate_milestone", "gsd_reassess_roadmap"],
159
+ },
160
+ },
161
+ "complete-milestone": {
162
+ kind: "primary",
163
+ scopeClass: "standard",
164
+ phaseChain: ["completion"],
165
+ toolContract: {
166
+ allowedGsdTools: [
167
+ "gsd_milestone_status",
168
+ "gsd_requirement_update",
169
+ "gsd_summary_save",
170
+ "gsd_complete_milestone",
171
+ "subagent",
172
+ ],
173
+ requiredWorkflowTools: [
174
+ "gsd_milestone_status",
175
+ "gsd_requirement_update",
176
+ "gsd_summary_save",
177
+ "gsd_complete_milestone",
178
+ ],
179
+ },
180
+ },
181
+ "research-slice": {
182
+ kind: "primary",
183
+ scopeClass: "standard",
184
+ phaseChain: ["research"],
185
+ toolContract: {
186
+ allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
187
+ requiredWorkflowTools: ["gsd_summary_save"],
188
+ },
189
+ },
190
+ "plan-slice": {
191
+ kind: "primary",
192
+ scopeClass: "standard",
193
+ phaseChain: ["planning"],
194
+ toolContract: {
195
+ allowedGsdTools: ["gsd_plan_slice", "gsd_reassess_roadmap", "gsd_decision_save"],
196
+ requiredWorkflowTools: ["gsd_plan_slice", "gsd_reassess_roadmap"],
197
+ },
198
+ },
199
+ "refine-slice": {
200
+ kind: "primary",
201
+ scopeClass: "standard",
202
+ phaseChain: ["planning"],
203
+ toolContract: {
204
+ allowedGsdTools: ["gsd_plan_slice", "gsd_decision_save"],
205
+ requiredWorkflowTools: ["gsd_plan_slice"],
206
+ },
207
+ },
208
+ "replan-slice": {
209
+ kind: "primary",
210
+ scopeClass: "standard",
211
+ phaseChain: ["planning"],
212
+ toolContract: {
213
+ allowedGsdTools: ["gsd_replan_slice", "gsd_decision_save"],
214
+ requiredWorkflowTools: ["gsd_replan_slice"],
215
+ },
216
+ },
217
+ "complete-slice": {
218
+ kind: "primary",
219
+ scopeClass: "section-close",
220
+ phaseChain: ["completion"],
221
+ toolContract: {
222
+ allowedGsdTools: [
223
+ "gsd_slice_complete",
224
+ "gsd_task_reopen",
225
+ "gsd_replan_slice",
226
+ "gsd_decision_save",
227
+ "gsd_requirement_update",
228
+ "gsd_summary_save",
229
+ "subagent",
230
+ ],
231
+ requiredWorkflowTools: [
232
+ "gsd_slice_complete",
233
+ "gsd_task_reopen",
234
+ "gsd_replan_slice",
235
+ "gsd_requirement_update",
236
+ "gsd_summary_save",
237
+ ],
238
+ forbiddenGsdTools: {
239
+ gsd_uat_result_save: "Run UAT owns persisted UAT Assessment.",
240
+ },
241
+ },
242
+ },
243
+ "reassess-roadmap": {
244
+ kind: "primary",
245
+ scopeClass: "standard",
246
+ phaseChain: ["validation", "planning"],
247
+ toolContract: {
248
+ allowedGsdTools: ["gsd_milestone_status", "gsd_reassess_roadmap"],
249
+ requiredWorkflowTools: ["gsd_milestone_status", "gsd_reassess_roadmap"],
250
+ },
251
+ },
252
+ "execute-task": {
253
+ kind: "primary",
254
+ scopeClass: "execute-task",
255
+ phaseChain: ["execution"],
256
+ toolContract: {
257
+ allowedGsdTools: ["gsd_task_complete", "gsd_decision_save"],
258
+ requiredWorkflowTools: ["gsd_task_complete"],
259
+ },
260
+ },
261
+ "execute-task-simple": {
262
+ kind: "variant",
263
+ scopeClass: "execute-task",
264
+ phaseChain: ["execution_simple", "execution"],
265
+ toolContract: {
266
+ allowedGsdTools: ["gsd_task_complete", "gsd_decision_save"],
267
+ requiredWorkflowTools: ["gsd_task_complete"],
268
+ },
269
+ },
270
+ "reactive-execute": {
271
+ kind: "primary",
272
+ scopeClass: "execute-task",
273
+ phaseChain: ["execution"],
274
+ toolContract: {
275
+ allowedGsdTools: ["gsd_task_complete", "gsd_summary_save", "gsd_decision_save"],
276
+ requiredWorkflowTools: ["gsd_task_complete", "gsd_summary_save"],
277
+ },
278
+ },
279
+ "run-uat": {
280
+ kind: "primary",
281
+ scopeClass: "standard",
282
+ phaseChain: ["uat", "completion"],
283
+ toolContract: {
284
+ allowedGsdTools: [...RUN_UAT_WORKFLOW_TOOL_NAMES, "subagent"],
285
+ requiredWorkflowTools: [...RUN_UAT_WORKFLOW_TOOL_NAMES],
286
+ forbiddenGsdTools: {
287
+ gsd_exec: "Use gsd_uat_exec so acceptance evidence is typed as UAT-owned.",
288
+ gsd_save_gate_result: "gsd_uat_result_save owns the aggregate UAT gate.",
289
+ gsd_summary_save: "gsd_uat_result_save owns persisted UAT Assessment writes.",
290
+ },
291
+ },
292
+ },
293
+ "gate-evaluate": {
294
+ kind: "primary",
295
+ scopeClass: "standard",
296
+ phaseChain: ["validation", "planning"],
297
+ toolContract: {
298
+ allowedGsdTools: ["gsd_save_gate_result"],
299
+ requiredWorkflowTools: ["gsd_save_gate_result"],
300
+ },
301
+ },
302
+ "rewrite-docs": {
303
+ kind: "primary",
304
+ scopeClass: "standard",
305
+ phaseChain: ["validation", "planning"],
306
+ toolContract: {
307
+ allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
308
+ requiredWorkflowTools: [],
309
+ },
310
+ },
311
+ // Sidecar units (triage, quick-task) — manifests exist, but no scoped tool
312
+ // contract and no phase routing (today's behaviour, preserved explicitly).
313
+ "triage-captures": {
314
+ kind: "primary",
315
+ scopeClass: "standard",
316
+ phaseChain: null,
317
+ toolContract: null,
318
+ },
319
+ "quick-task": {
320
+ kind: "primary",
321
+ scopeClass: "standard",
322
+ phaseChain: null,
323
+ toolContract: null,
324
+ },
325
+ // Deep planning mode (project-level) units
326
+ "workflow-preferences": {
327
+ kind: "primary",
328
+ scopeClass: "standard",
329
+ phaseChain: ["discuss", "planning"],
330
+ toolContract: {
331
+ allowedGsdTools: ["gsd_summary_save"],
332
+ requiredWorkflowTools: [],
333
+ },
334
+ },
335
+ "discuss-project": {
336
+ kind: "primary",
337
+ scopeClass: "standard",
338
+ phaseChain: ["discuss", "planning"],
339
+ toolContract: {
340
+ allowedGsdTools: ["gsd_summary_save", "gsd_decision_save", "gsd_requirement_save"],
341
+ requiredWorkflowTools: ["ask_user_questions", "gsd_summary_save"],
342
+ },
343
+ },
344
+ "discuss-requirements": {
345
+ kind: "primary",
346
+ scopeClass: "standard",
347
+ phaseChain: ["discuss", "planning"],
348
+ toolContract: {
349
+ allowedGsdTools: ["gsd_requirement_save", "gsd_summary_save"],
350
+ requiredWorkflowTools: ["ask_user_questions", "gsd_requirement_save", "gsd_summary_save"],
351
+ },
352
+ },
353
+ "research-decision": {
354
+ kind: "primary",
355
+ scopeClass: "standard",
356
+ phaseChain: ["discuss", "planning"],
357
+ toolContract: {
358
+ allowedGsdTools: ["gsd_summary_save"],
359
+ requiredWorkflowTools: ["ask_user_questions"],
360
+ },
361
+ },
362
+ "research-project": {
363
+ kind: "primary",
364
+ scopeClass: "standard",
365
+ phaseChain: ["research"],
366
+ toolContract: {
367
+ allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
368
+ requiredWorkflowTools: [],
369
+ },
370
+ },
371
+ } as const satisfies Record<string, UnitDescriptor>;
372
+
373
+ // ─── Derived types and views ──────────────────────────────────────────────
374
+
375
+ /** Every dispatchable unit type, including variants. */
376
+ export type UnitTypeOrVariant = keyof typeof UNIT_REGISTRY;
377
+
378
+ type PrimaryUnitKeys = {
379
+ [K in UnitTypeOrVariant]: (typeof UNIT_REGISTRY)[K]["kind"] extends "primary" ? K : never;
380
+ }[UnitTypeOrVariant];
381
+
382
+ /**
383
+ * The manifest-strict unit-type union — every type with a `UNIT_MANIFESTS`
384
+ * entry. Variants are excluded, exactly as the old hand-maintained
385
+ * `KNOWN_UNIT_TYPES` excluded them.
386
+ */
387
+ export type UnitType = PrimaryUnitKeys;
388
+
389
+ const ALL_UNIT_KEYS = Object.keys(UNIT_REGISTRY) as UnitTypeOrVariant[];
390
+
391
+ export const KNOWN_UNIT_TYPES: readonly UnitType[] = Object.freeze(
392
+ ALL_UNIT_KEYS.filter((t): t is UnitType => UNIT_REGISTRY[t].kind === "primary"),
393
+ );
394
+
395
+ export const EXECUTE_TASK_UNIT_TYPES: ReadonlySet<string> = new Set(
396
+ ALL_UNIT_KEYS.filter((t) => UNIT_REGISTRY[t].scopeClass === "execute-task"),
397
+ );
398
+
399
+ // Execute-task units close gates via summary sections too, so the section-close
400
+ // gate Set is every non-"standard" scope class.
401
+ export const SECTION_CLOSE_GATE_UNIT_TYPES: ReadonlySet<string> = new Set(
402
+ ALL_UNIT_KEYS.filter((t) => UNIT_REGISTRY[t].scopeClass !== "standard"),
403
+ );
404
+
405
+ export function getUnitDescriptor(unitType: string): UnitDescriptor | undefined {
406
+ return (UNIT_REGISTRY as Record<string, UnitDescriptor>)[unitType];
407
+ }
408
+
409
+ /** Phase-bucket fallback chain for a unit type, or null when the registry has no routing for it. */
410
+ export function getUnitPhaseChain(unitType: string): readonly GSDModelPhaseKey[] | null {
411
+ return getUnitDescriptor(unitType)?.phaseChain ?? null;
412
+ }