@opengsd/gsd-pi 1.2.0-dev.4c756166 → 1.2.0-dev.5457a158

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 (338) 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/bg-shell/utilities.js +5 -2
  11. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  12. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +35 -4
  13. package/dist/resources/extensions/gsd/auto/orchestrator.js +33 -4
  14. package/dist/resources/extensions/gsd/auto/phases.js +6 -1
  15. package/dist/resources/extensions/gsd/auto-post-unit.js +19 -8
  16. package/dist/resources/extensions/gsd/auto-prompts.js +3 -0
  17. package/dist/resources/extensions/gsd/auto-start.js +12 -14
  18. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  19. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +7 -16
  20. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  21. package/dist/resources/extensions/gsd/auto-worktree.js +35 -352
  22. package/dist/resources/extensions/gsd/auto.js +8 -20
  23. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +3 -2
  24. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +9 -6
  25. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +86 -6
  26. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +30 -4
  27. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  28. package/dist/resources/extensions/gsd/captures.js +5 -15
  29. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  30. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  31. package/dist/resources/extensions/gsd/crash-recovery.js +4 -12
  32. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  33. package/dist/resources/extensions/gsd/db/queries.js +372 -0
  34. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  35. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  36. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  37. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  38. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  39. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  40. package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
  41. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  42. package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -3
  43. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  44. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  45. package/dist/resources/extensions/gsd/git-service.js +1 -0
  46. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  47. package/dist/resources/extensions/gsd/gsd-db.js +171 -2048
  48. package/dist/resources/extensions/gsd/guidance.js +98 -0
  49. package/dist/resources/extensions/gsd/guided-flow.js +51 -5
  50. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  51. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  52. package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
  53. package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
  54. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  55. package/dist/resources/extensions/gsd/model-router.js +3 -0
  56. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  57. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  58. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  59. package/dist/resources/extensions/gsd/paths.js +37 -24
  60. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  61. package/dist/resources/extensions/gsd/preferences-models.js +12 -46
  62. package/dist/resources/extensions/gsd/preferences.js +14 -0
  63. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  64. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  65. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  66. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  67. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  68. package/dist/resources/extensions/gsd/publication.js +87 -0
  69. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  70. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  71. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  72. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  73. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  74. package/dist/resources/extensions/gsd/state.js +1 -20
  75. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  76. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  77. package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
  78. package/dist/resources/extensions/gsd/tools/complete-slice.js +24 -43
  79. package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -8
  80. package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
  81. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
  82. package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
  83. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  84. package/dist/resources/extensions/gsd/undo.js +8 -7
  85. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  86. package/dist/resources/extensions/gsd/unit-context-composer.js +9 -1
  87. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  88. package/dist/resources/extensions/gsd/unit-registry.js +350 -0
  89. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  90. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  91. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  92. package/dist/resources/extensions/gsd/worktree-lifecycle.js +9 -1
  93. package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
  94. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  95. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  96. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  97. package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
  98. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  99. package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
  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 +9 -9
  103. package/dist/web/standalone/.next/build-manifest.json +2 -2
  104. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  105. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  106. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  114. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  122. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  123. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  124. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  125. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  126. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  127. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  128. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  129. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  130. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  131. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  132. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  133. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  134. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  135. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  136. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  137. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  138. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  139. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  140. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  141. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  142. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  143. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  144. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  145. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  146. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  147. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  149. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  150. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  153. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  155. package/dist/web/standalone/.next/server/app/index.html +1 -1
  156. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  157. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  158. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  159. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  160. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  161. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  162. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  163. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  164. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  165. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  166. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  168. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  169. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  170. package/dist/worktree-cli.js +3 -6
  171. package/dist/worktree-status-banner.js +7 -11
  172. package/package.json +1 -1
  173. package/packages/cloud-mcp-gateway/package.json +2 -2
  174. package/packages/contracts/dist/workflow.d.ts +4 -0
  175. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  176. package/packages/contracts/dist/workflow.js.map +1 -1
  177. package/packages/contracts/package.json +1 -1
  178. package/packages/daemon/package.json +4 -4
  179. package/packages/gsd-agent-core/package.json +5 -5
  180. package/packages/gsd-agent-modes/package.json +7 -7
  181. package/packages/mcp-server/dist/cli.js +6 -3
  182. package/packages/mcp-server/dist/cli.js.map +1 -1
  183. package/packages/mcp-server/dist/workflow-tools.d.ts +8 -0
  184. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  185. package/packages/mcp-server/dist/workflow-tools.js +46 -21
  186. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  187. package/packages/mcp-server/package.json +3 -3
  188. package/packages/native/package.json +1 -1
  189. package/packages/pi-agent-core/package.json +1 -1
  190. package/packages/pi-ai/dist/models.generated.d.ts +294 -239
  191. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  192. package/packages/pi-ai/dist/models.generated.js +260 -256
  193. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  194. package/packages/pi-ai/package.json +1 -1
  195. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  196. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  197. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  198. package/packages/pi-coding-agent/package.json +7 -7
  199. package/packages/pi-tui/package.json +2 -2
  200. package/packages/rpc-client/package.json +2 -2
  201. package/pkg/package.json +1 -1
  202. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  203. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  204. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +37 -2
  205. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -0
  206. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  207. package/src/resources/extensions/gsd/auto/orchestrator.ts +39 -5
  208. package/src/resources/extensions/gsd/auto/phases.ts +10 -1
  209. package/src/resources/extensions/gsd/auto-post-unit.ts +25 -7
  210. package/src/resources/extensions/gsd/auto-prompts.ts +3 -0
  211. package/src/resources/extensions/gsd/auto-start.ts +12 -15
  212. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  213. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +10 -17
  214. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  215. package/src/resources/extensions/gsd/auto-worktree.ts +41 -364
  216. package/src/resources/extensions/gsd/auto.ts +20 -24
  217. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +3 -5
  218. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +10 -6
  219. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +87 -6
  220. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +29 -3
  221. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  222. package/src/resources/extensions/gsd/captures.ts +5 -16
  223. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  224. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  225. package/src/resources/extensions/gsd/crash-recovery.ts +3 -9
  226. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  227. package/src/resources/extensions/gsd/db/queries.ts +453 -0
  228. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  229. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  230. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  231. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  232. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  233. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  234. package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
  235. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  236. package/src/resources/extensions/gsd/doctor-git-checks.ts +3 -3
  237. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  238. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  239. package/src/resources/extensions/gsd/git-service.ts +1 -0
  240. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  241. package/src/resources/extensions/gsd/gsd-db.ts +173 -2373
  242. package/src/resources/extensions/gsd/guidance.ts +139 -0
  243. package/src/resources/extensions/gsd/guided-flow.ts +50 -5
  244. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  245. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  246. package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
  247. package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
  248. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  249. package/src/resources/extensions/gsd/model-router.ts +3 -0
  250. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  251. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  252. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  253. package/src/resources/extensions/gsd/paths.ts +42 -22
  254. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  255. package/src/resources/extensions/gsd/preferences-models.ts +10 -46
  256. package/src/resources/extensions/gsd/preferences.ts +18 -0
  257. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  258. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  259. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  260. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  261. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  262. package/src/resources/extensions/gsd/publication.ts +122 -0
  263. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  264. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  265. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  266. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  267. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  268. package/src/resources/extensions/gsd/state.ts +4 -21
  269. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  270. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  271. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +123 -0
  272. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
  273. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  274. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  275. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  276. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  277. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  278. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  279. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  280. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  281. package/src/resources/extensions/gsd/tests/guidance.test.ts +125 -0
  282. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +51 -4
  283. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +54 -1
  284. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  285. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
  286. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  287. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  288. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  289. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  290. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  291. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
  292. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +1 -0
  293. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  294. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  295. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
  296. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  297. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  298. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  299. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  300. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
  301. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  302. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +23 -2
  303. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  304. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  305. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +2 -2
  306. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  307. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
  308. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  309. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  310. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
  311. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  312. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
  313. package/src/resources/extensions/gsd/tests/write-gate.test.ts +42 -0
  314. package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
  315. package/src/resources/extensions/gsd/tools/complete-slice.ts +23 -58
  316. package/src/resources/extensions/gsd/tools/exec-tool.ts +5 -8
  317. package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
  318. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
  319. package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
  320. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  321. package/src/resources/extensions/gsd/undo.ts +9 -8
  322. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  323. package/src/resources/extensions/gsd/unit-context-composer.ts +12 -1
  324. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  325. package/src/resources/extensions/gsd/unit-registry.ts +425 -0
  326. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  327. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  328. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  329. package/src/resources/extensions/gsd/worktree-lifecycle.ts +10 -1
  330. package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
  331. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  332. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  333. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  334. package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
  335. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  336. package/src/resources/skills/gsd-browser/SKILL.md +1 -1
  337. /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → 2p9Rv9pQflAxCBbGVI2vb}/_buildManifest.js +0 -0
  338. /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → 2p9Rv9pQflAxCBbGVI2vb}/_ssgManifest.js +0 -0
@@ -0,0 +1,425 @@
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 type { GSDModelPhaseKey } from "./preferences-types.js";
28
+ import type { WorkflowMcpAdapterToolName } from "./workflow-tool-surface.js";
29
+
30
+ // ─── Declaration vocabulary ───────────────────────────────────────────────
31
+
32
+ /** Workflow-surface names a Unit contract may reference. Drift from WORKFLOW_TOOL_CONTRACTS fails typecheck. */
33
+ export type UnitWorkflowToolName = CanonicalWorkflowToolName | WorkflowMcpAdapterToolName;
34
+
35
+ export type UnitGsdToolName = UnitWorkflowToolName | "subagent";
36
+
37
+ export interface UnitToolSurfaceContract {
38
+ allowedGsdTools: readonly UnitGsdToolName[];
39
+ requiredWorkflowTools: readonly UnitWorkflowToolName[];
40
+ forbiddenGsdTools?: Readonly<Record<string, string>>;
41
+ }
42
+
43
+ /**
44
+ * Scope class drives the tool-scoping Sets:
45
+ * - "execute-task" — source-writing execution units; members of both the
46
+ * execute-task Set and the section-close gate Set.
47
+ * - "section-close" — units that close quality gates by writing summary
48
+ * sections (gsd_save_gate_result is soft-blocked).
49
+ * - "standard" — everything else.
50
+ */
51
+ export type UnitScopeClass = "execute-task" | "section-close" | "standard";
52
+
53
+ export interface UnitDescriptor {
54
+ /** "variant" types are dispatchable but excluded from KNOWN_UNIT_TYPES/UnitType. */
55
+ readonly kind: "primary" | "variant";
56
+ readonly scopeClass: UnitScopeClass;
57
+ /**
58
+ * Ordered phase-bucket fallback chain for model/thinking resolution
59
+ * (ADR-026), most-specific first. `null` = no phase routing (the unit
60
+ * resolves against session defaults).
61
+ */
62
+ readonly phaseChain: readonly GSDModelPhaseKey[] | null;
63
+ /** `null` = the unit has no scoped gsd-tool contract. */
64
+ readonly toolContract: UnitToolSurfaceContract | null;
65
+ }
66
+
67
+ // ─── Shared tool-name constants (used by registry rows) ──────────────────
68
+
69
+ export const RUN_UAT_WORKFLOW_TOOL_NAMES = [
70
+ "gsd_uat_exec",
71
+ "gsd_uat_result_save",
72
+ "gsd_resume",
73
+ "gsd_milestone_status",
74
+ "gsd_journal_query",
75
+ ] as const;
76
+
77
+ export const RUN_UAT_READ_ONLY_TOOL_NAMES = [
78
+ "find",
79
+ "glob",
80
+ "grep",
81
+ "ls",
82
+ "read",
83
+ ] as const;
84
+
85
+ export const RUN_UAT_BROWSER_TOOL_NAMES = [
86
+ "browser_navigate",
87
+ "browser_click",
88
+ "browser_type",
89
+ "browser_fill_form",
90
+ "browser_click_ref",
91
+ "browser_fill_ref",
92
+ "browser_wait_for",
93
+ "browser_assert",
94
+ "browser_verify",
95
+ "browser_screenshot",
96
+ "browser_snapshot_refs",
97
+ "browser_find",
98
+ "browser_get_console_logs",
99
+ "browser_get_network_logs",
100
+ "browser_evaluate",
101
+ "browser_reload",
102
+ "browser_batch",
103
+ "browser_act",
104
+ ] as const;
105
+
106
+ // ─── The registry ─────────────────────────────────────────────────────────
107
+
108
+ export const UNIT_REGISTRY = {
109
+ "research-milestone": {
110
+ kind: "primary",
111
+ scopeClass: "standard",
112
+ phaseChain: ["research"],
113
+ toolContract: {
114
+ allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
115
+ requiredWorkflowTools: ["gsd_summary_save"],
116
+ },
117
+ },
118
+ "plan-milestone": {
119
+ kind: "primary",
120
+ scopeClass: "standard",
121
+ phaseChain: ["planning"],
122
+ toolContract: {
123
+ allowedGsdTools: [
124
+ "gsd_milestone_status",
125
+ "gsd_plan_milestone",
126
+ "gsd_plan_slice",
127
+ "gsd_decision_save",
128
+ "gsd_requirement_update",
129
+ ],
130
+ requiredWorkflowTools: ["gsd_milestone_status", "gsd_plan_milestone", "gsd_plan_slice"],
131
+ },
132
+ },
133
+ "discuss-milestone": {
134
+ kind: "primary",
135
+ scopeClass: "standard",
136
+ phaseChain: ["discuss", "planning"],
137
+ toolContract: {
138
+ allowedGsdTools: [
139
+ "gsd_summary_save",
140
+ "gsd_decision_save",
141
+ "gsd_requirement_save",
142
+ "gsd_requirement_update",
143
+ "gsd_plan_milestone",
144
+ "gsd_milestone_generate_id",
145
+ ],
146
+ requiredWorkflowTools: [
147
+ "ask_user_questions",
148
+ "gsd_summary_save",
149
+ "gsd_requirement_save",
150
+ "gsd_requirement_update",
151
+ "gsd_plan_milestone",
152
+ "gsd_milestone_generate_id",
153
+ ],
154
+ },
155
+ },
156
+ "discuss-slice": {
157
+ kind: "variant",
158
+ scopeClass: "standard",
159
+ phaseChain: ["discuss", "planning"],
160
+ toolContract: {
161
+ allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
162
+ requiredWorkflowTools: ["ask_user_questions", "gsd_summary_save"],
163
+ },
164
+ },
165
+ "validate-milestone": {
166
+ kind: "primary",
167
+ scopeClass: "section-close",
168
+ phaseChain: ["validation", "planning"],
169
+ toolContract: {
170
+ allowedGsdTools: ["gsd_milestone_status", "gsd_validate_milestone", "gsd_reassess_roadmap", "subagent"],
171
+ requiredWorkflowTools: ["gsd_milestone_status", "gsd_validate_milestone", "gsd_reassess_roadmap"],
172
+ },
173
+ },
174
+ "complete-milestone": {
175
+ kind: "primary",
176
+ scopeClass: "standard",
177
+ phaseChain: ["completion"],
178
+ toolContract: {
179
+ allowedGsdTools: [
180
+ "gsd_milestone_status",
181
+ "gsd_requirement_update",
182
+ "gsd_summary_save",
183
+ "gsd_complete_milestone",
184
+ "subagent",
185
+ ],
186
+ requiredWorkflowTools: [
187
+ "gsd_milestone_status",
188
+ "gsd_requirement_update",
189
+ "gsd_summary_save",
190
+ "gsd_complete_milestone",
191
+ ],
192
+ },
193
+ },
194
+ "research-slice": {
195
+ kind: "primary",
196
+ scopeClass: "standard",
197
+ phaseChain: ["research"],
198
+ toolContract: {
199
+ allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
200
+ requiredWorkflowTools: ["gsd_summary_save"],
201
+ },
202
+ },
203
+ "plan-slice": {
204
+ kind: "primary",
205
+ scopeClass: "standard",
206
+ phaseChain: ["planning"],
207
+ toolContract: {
208
+ allowedGsdTools: ["gsd_plan_slice", "gsd_reassess_roadmap", "gsd_decision_save"],
209
+ requiredWorkflowTools: ["gsd_plan_slice", "gsd_reassess_roadmap"],
210
+ },
211
+ },
212
+ "refine-slice": {
213
+ kind: "primary",
214
+ scopeClass: "standard",
215
+ phaseChain: ["planning"],
216
+ toolContract: {
217
+ allowedGsdTools: ["gsd_plan_slice", "gsd_decision_save"],
218
+ requiredWorkflowTools: ["gsd_plan_slice"],
219
+ },
220
+ },
221
+ "replan-slice": {
222
+ kind: "primary",
223
+ scopeClass: "standard",
224
+ phaseChain: ["planning"],
225
+ toolContract: {
226
+ allowedGsdTools: ["gsd_replan_slice", "gsd_decision_save"],
227
+ requiredWorkflowTools: ["gsd_replan_slice"],
228
+ },
229
+ },
230
+ "complete-slice": {
231
+ kind: "primary",
232
+ scopeClass: "section-close",
233
+ phaseChain: ["completion"],
234
+ toolContract: {
235
+ allowedGsdTools: [
236
+ "gsd_slice_complete",
237
+ "gsd_task_reopen",
238
+ "gsd_replan_slice",
239
+ "gsd_decision_save",
240
+ "gsd_requirement_update",
241
+ "gsd_summary_save",
242
+ "subagent",
243
+ ],
244
+ requiredWorkflowTools: [
245
+ "gsd_slice_complete",
246
+ "gsd_task_reopen",
247
+ "gsd_replan_slice",
248
+ "gsd_requirement_update",
249
+ "gsd_summary_save",
250
+ ],
251
+ forbiddenGsdTools: {
252
+ gsd_uat_result_save: "Run UAT owns persisted UAT Assessment.",
253
+ },
254
+ },
255
+ },
256
+ "reassess-roadmap": {
257
+ kind: "primary",
258
+ scopeClass: "standard",
259
+ phaseChain: ["validation", "planning"],
260
+ toolContract: {
261
+ allowedGsdTools: ["gsd_milestone_status", "gsd_reassess_roadmap"],
262
+ requiredWorkflowTools: ["gsd_milestone_status", "gsd_reassess_roadmap"],
263
+ },
264
+ },
265
+ "execute-task": {
266
+ kind: "primary",
267
+ scopeClass: "execute-task",
268
+ phaseChain: ["execution"],
269
+ toolContract: {
270
+ allowedGsdTools: ["gsd_task_complete", "gsd_decision_save"],
271
+ requiredWorkflowTools: ["gsd_task_complete"],
272
+ },
273
+ },
274
+ "execute-task-simple": {
275
+ kind: "variant",
276
+ scopeClass: "execute-task",
277
+ phaseChain: ["execution_simple", "execution"],
278
+ toolContract: {
279
+ allowedGsdTools: ["gsd_task_complete", "gsd_decision_save"],
280
+ requiredWorkflowTools: ["gsd_task_complete"],
281
+ },
282
+ },
283
+ "reactive-execute": {
284
+ kind: "primary",
285
+ scopeClass: "execute-task",
286
+ phaseChain: ["execution"],
287
+ toolContract: {
288
+ allowedGsdTools: ["gsd_task_complete", "gsd_summary_save", "gsd_decision_save"],
289
+ requiredWorkflowTools: ["gsd_task_complete", "gsd_summary_save"],
290
+ },
291
+ },
292
+ "run-uat": {
293
+ kind: "primary",
294
+ scopeClass: "standard",
295
+ phaseChain: ["uat", "completion"],
296
+ toolContract: {
297
+ allowedGsdTools: [...RUN_UAT_WORKFLOW_TOOL_NAMES, "subagent"],
298
+ requiredWorkflowTools: [...RUN_UAT_WORKFLOW_TOOL_NAMES],
299
+ forbiddenGsdTools: {
300
+ gsd_exec: "Use gsd_uat_exec so acceptance evidence is typed as UAT-owned.",
301
+ gsd_save_gate_result: "gsd_uat_result_save owns the aggregate UAT gate.",
302
+ gsd_summary_save: "gsd_uat_result_save owns persisted UAT Assessment writes.",
303
+ },
304
+ },
305
+ },
306
+ "gate-evaluate": {
307
+ kind: "primary",
308
+ scopeClass: "standard",
309
+ phaseChain: ["validation", "planning"],
310
+ toolContract: {
311
+ allowedGsdTools: ["gsd_save_gate_result"],
312
+ requiredWorkflowTools: ["gsd_save_gate_result"],
313
+ },
314
+ },
315
+ "rewrite-docs": {
316
+ kind: "primary",
317
+ scopeClass: "standard",
318
+ phaseChain: ["validation", "planning"],
319
+ toolContract: {
320
+ allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
321
+ requiredWorkflowTools: [],
322
+ },
323
+ },
324
+ // Sidecar units (triage, quick-task) — manifests exist, but no scoped tool
325
+ // contract and no phase routing (today's behaviour, preserved explicitly).
326
+ "triage-captures": {
327
+ kind: "primary",
328
+ scopeClass: "standard",
329
+ phaseChain: null,
330
+ toolContract: null,
331
+ },
332
+ "quick-task": {
333
+ kind: "primary",
334
+ scopeClass: "standard",
335
+ phaseChain: null,
336
+ toolContract: null,
337
+ },
338
+ // Deep planning mode (project-level) units
339
+ "workflow-preferences": {
340
+ kind: "primary",
341
+ scopeClass: "standard",
342
+ phaseChain: ["discuss", "planning"],
343
+ toolContract: {
344
+ allowedGsdTools: ["gsd_summary_save"],
345
+ requiredWorkflowTools: [],
346
+ },
347
+ },
348
+ "discuss-project": {
349
+ kind: "primary",
350
+ scopeClass: "standard",
351
+ phaseChain: ["discuss", "planning"],
352
+ toolContract: {
353
+ allowedGsdTools: ["gsd_summary_save", "gsd_decision_save", "gsd_requirement_save"],
354
+ requiredWorkflowTools: ["ask_user_questions", "gsd_summary_save"],
355
+ },
356
+ },
357
+ "discuss-requirements": {
358
+ kind: "primary",
359
+ scopeClass: "standard",
360
+ phaseChain: ["discuss", "planning"],
361
+ toolContract: {
362
+ allowedGsdTools: ["gsd_requirement_save", "gsd_summary_save"],
363
+ requiredWorkflowTools: ["ask_user_questions", "gsd_requirement_save", "gsd_summary_save"],
364
+ },
365
+ },
366
+ "research-decision": {
367
+ kind: "primary",
368
+ scopeClass: "standard",
369
+ phaseChain: ["discuss", "planning"],
370
+ toolContract: {
371
+ allowedGsdTools: ["gsd_summary_save"],
372
+ requiredWorkflowTools: ["ask_user_questions"],
373
+ },
374
+ },
375
+ "research-project": {
376
+ kind: "primary",
377
+ scopeClass: "standard",
378
+ phaseChain: ["research"],
379
+ toolContract: {
380
+ allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
381
+ requiredWorkflowTools: [],
382
+ },
383
+ },
384
+ } as const satisfies Record<string, UnitDescriptor>;
385
+
386
+ // ─── Derived types and views ──────────────────────────────────────────────
387
+
388
+ /** Every dispatchable unit type, including variants. */
389
+ export type UnitTypeOrVariant = keyof typeof UNIT_REGISTRY;
390
+
391
+ type PrimaryUnitKeys = {
392
+ [K in UnitTypeOrVariant]: (typeof UNIT_REGISTRY)[K]["kind"] extends "primary" ? K : never;
393
+ }[UnitTypeOrVariant];
394
+
395
+ /**
396
+ * The manifest-strict unit-type union — every type with a `UNIT_MANIFESTS`
397
+ * entry. Variants are excluded, exactly as the old hand-maintained
398
+ * `KNOWN_UNIT_TYPES` excluded them.
399
+ */
400
+ export type UnitType = PrimaryUnitKeys;
401
+
402
+ const ALL_UNIT_KEYS = Object.keys(UNIT_REGISTRY) as UnitTypeOrVariant[];
403
+
404
+ export const KNOWN_UNIT_TYPES: readonly UnitType[] = Object.freeze(
405
+ ALL_UNIT_KEYS.filter((t): t is UnitType => UNIT_REGISTRY[t].kind === "primary"),
406
+ );
407
+
408
+ export const EXECUTE_TASK_UNIT_TYPES: ReadonlySet<string> = new Set(
409
+ ALL_UNIT_KEYS.filter((t) => UNIT_REGISTRY[t].scopeClass === "execute-task"),
410
+ );
411
+
412
+ // Execute-task units close gates via summary sections too, so the section-close
413
+ // gate Set is every non-"standard" scope class.
414
+ export const SECTION_CLOSE_GATE_UNIT_TYPES: ReadonlySet<string> = new Set(
415
+ ALL_UNIT_KEYS.filter((t) => UNIT_REGISTRY[t].scopeClass !== "standard"),
416
+ );
417
+
418
+ export function getUnitDescriptor(unitType: string): UnitDescriptor | undefined {
419
+ return (UNIT_REGISTRY as Record<string, UnitDescriptor>)[unitType];
420
+ }
421
+
422
+ /** Phase-bucket fallback chain for a unit type, or null when the registry has no routing for it. */
423
+ export function getUnitPhaseChain(unitType: string): readonly GSDModelPhaseKey[] | null {
424
+ return getUnitDescriptor(unitType)?.phaseChain ?? null;
425
+ }
@@ -1,198 +1,33 @@
1
1
  // Project/App: gsd-pi
2
- // File Purpose: Central Unit-to-tool contracts for phase-aware GSD tool surfaces.
3
-
4
- export interface UnitToolSurfaceContract {
5
- allowedGsdTools: readonly string[];
6
- requiredWorkflowTools: readonly string[];
7
- forbiddenGsdTools?: Readonly<Record<string, string>>;
8
- }
9
-
10
- export const RUN_UAT_WORKFLOW_TOOL_NAMES = [
11
- "gsd_uat_exec",
12
- "gsd_uat_result_save",
13
- "gsd_resume",
14
- "gsd_milestone_status",
15
- "gsd_journal_query",
16
- ] as const;
17
-
18
- export const RUN_UAT_READ_ONLY_TOOL_NAMES = [
19
- "find",
20
- "glob",
21
- "grep",
22
- "ls",
23
- "read",
24
- ] as const;
25
-
26
- export const RUN_UAT_BROWSER_TOOL_NAMES = [
27
- "browser_navigate",
28
- "browser_click",
29
- "browser_type",
30
- "browser_fill_form",
31
- "browser_click_ref",
32
- "browser_fill_ref",
33
- "browser_wait_for",
34
- "browser_assert",
35
- "browser_verify",
36
- "browser_screenshot",
37
- "browser_snapshot_refs",
38
- "browser_find",
39
- "browser_get_console_logs",
40
- "browser_get_network_logs",
41
- "browser_evaluate",
42
- "browser_reload",
43
- "browser_batch",
44
- "browser_act",
45
- ] as const;
2
+ // File Purpose: Unit-to-tool contract views derived from the Unit Registry (ADR-033).
3
+ //
4
+ // The contract data lives in unit-registry.ts (one Unit Descriptor per unit
5
+ // type). This file keeps the established import surface: the derived
6
+ // `UNIT_TOOL_CONTRACTS` table and its accessor functions are unchanged for
7
+ // consumers.
8
+
9
+ import {
10
+ UNIT_REGISTRY,
11
+ type UnitToolSurfaceContract,
12
+ type UnitWorkflowToolName,
13
+ } from "./unit-registry.js";
14
+
15
+ export {
16
+ RUN_UAT_WORKFLOW_TOOL_NAMES,
17
+ RUN_UAT_READ_ONLY_TOOL_NAMES,
18
+ RUN_UAT_BROWSER_TOOL_NAMES,
19
+ type UnitToolSurfaceContract,
20
+ type UnitWorkflowToolName,
21
+ type UnitGsdToolName,
22
+ } from "./unit-registry.js";
46
23
 
47
24
  export const RUN_UAT_TOOL_PRESENTATION_PLAN_ID = "run-uat/default-v1";
48
25
 
49
- export const UNIT_TOOL_CONTRACTS: Record<string, UnitToolSurfaceContract> = {
50
- "research-milestone": {
51
- allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
52
- requiredWorkflowTools: ["gsd_summary_save"],
53
- },
54
- "plan-milestone": {
55
- allowedGsdTools: [
56
- "gsd_milestone_status",
57
- "gsd_plan_milestone",
58
- "gsd_plan_slice",
59
- "gsd_decision_save",
60
- "gsd_requirement_update",
61
- ],
62
- requiredWorkflowTools: ["gsd_milestone_status", "gsd_plan_milestone", "gsd_plan_slice"],
63
- },
64
- "discuss-milestone": {
65
- allowedGsdTools: [
66
- "gsd_summary_save",
67
- "gsd_decision_save",
68
- "gsd_requirement_save",
69
- "gsd_requirement_update",
70
- "gsd_plan_milestone",
71
- "gsd_milestone_generate_id",
72
- ],
73
- requiredWorkflowTools: [
74
- "ask_user_questions",
75
- "gsd_summary_save",
76
- "gsd_requirement_save",
77
- "gsd_requirement_update",
78
- "gsd_plan_milestone",
79
- "gsd_milestone_generate_id",
80
- ],
81
- },
82
- "discuss-slice": {
83
- allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
84
- requiredWorkflowTools: ["ask_user_questions", "gsd_summary_save"],
85
- },
86
- "validate-milestone": {
87
- allowedGsdTools: ["gsd_milestone_status", "gsd_validate_milestone", "gsd_reassess_roadmap", "subagent"],
88
- requiredWorkflowTools: ["gsd_milestone_status", "gsd_validate_milestone", "gsd_reassess_roadmap"],
89
- },
90
- "complete-milestone": {
91
- allowedGsdTools: [
92
- "gsd_milestone_status",
93
- "gsd_requirement_update",
94
- "gsd_summary_save",
95
- "gsd_complete_milestone",
96
- "subagent",
97
- ],
98
- requiredWorkflowTools: [
99
- "gsd_milestone_status",
100
- "gsd_requirement_update",
101
- "gsd_summary_save",
102
- "gsd_complete_milestone",
103
- ],
104
- },
105
- "research-slice": {
106
- allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
107
- requiredWorkflowTools: ["gsd_summary_save"],
108
- },
109
- "plan-slice": {
110
- allowedGsdTools: ["gsd_plan_slice", "gsd_reassess_roadmap", "gsd_decision_save"],
111
- requiredWorkflowTools: ["gsd_plan_slice", "gsd_reassess_roadmap"],
112
- },
113
- "refine-slice": {
114
- allowedGsdTools: ["gsd_plan_slice", "gsd_decision_save"],
115
- requiredWorkflowTools: ["gsd_plan_slice"],
116
- },
117
- "replan-slice": {
118
- allowedGsdTools: ["gsd_replan_slice", "gsd_decision_save"],
119
- requiredWorkflowTools: ["gsd_replan_slice"],
120
- },
121
- "complete-slice": {
122
- allowedGsdTools: [
123
- "gsd_slice_complete",
124
- "gsd_task_reopen",
125
- "gsd_replan_slice",
126
- "gsd_decision_save",
127
- "gsd_requirement_update",
128
- "gsd_summary_save",
129
- "subagent",
130
- ],
131
- requiredWorkflowTools: [
132
- "gsd_slice_complete",
133
- "gsd_task_reopen",
134
- "gsd_replan_slice",
135
- "gsd_requirement_update",
136
- "gsd_summary_save",
137
- ],
138
- forbiddenGsdTools: {
139
- gsd_uat_result_save: "Run UAT owns persisted UAT Assessment.",
140
- },
141
- },
142
- "reassess-roadmap": {
143
- allowedGsdTools: ["gsd_milestone_status", "gsd_reassess_roadmap"],
144
- requiredWorkflowTools: ["gsd_milestone_status", "gsd_reassess_roadmap"],
145
- },
146
- "execute-task": {
147
- allowedGsdTools: ["gsd_task_complete", "gsd_decision_save"],
148
- requiredWorkflowTools: ["gsd_task_complete"],
149
- },
150
- "execute-task-simple": {
151
- allowedGsdTools: ["gsd_task_complete", "gsd_decision_save"],
152
- requiredWorkflowTools: ["gsd_task_complete"],
153
- },
154
- "reactive-execute": {
155
- allowedGsdTools: ["gsd_task_complete", "gsd_summary_save", "gsd_decision_save"],
156
- requiredWorkflowTools: ["gsd_task_complete", "gsd_summary_save"],
157
- },
158
- "run-uat": {
159
- allowedGsdTools: [...RUN_UAT_WORKFLOW_TOOL_NAMES, "subagent"],
160
- requiredWorkflowTools: [...RUN_UAT_WORKFLOW_TOOL_NAMES],
161
- forbiddenGsdTools: {
162
- gsd_exec: "Use gsd_uat_exec so acceptance evidence is typed as UAT-owned.",
163
- gsd_save_gate_result: "gsd_uat_result_save owns the aggregate UAT gate.",
164
- gsd_summary_save: "gsd_uat_result_save owns persisted UAT Assessment writes.",
165
- },
166
- },
167
- "gate-evaluate": {
168
- allowedGsdTools: ["gsd_save_gate_result"],
169
- requiredWorkflowTools: ["gsd_save_gate_result"],
170
- },
171
- "rewrite-docs": {
172
- allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
173
- requiredWorkflowTools: [],
174
- },
175
- "workflow-preferences": {
176
- allowedGsdTools: ["gsd_summary_save"],
177
- requiredWorkflowTools: [],
178
- },
179
- "discuss-project": {
180
- allowedGsdTools: ["gsd_summary_save", "gsd_decision_save", "gsd_requirement_save"],
181
- requiredWorkflowTools: ["ask_user_questions", "gsd_summary_save"],
182
- },
183
- "discuss-requirements": {
184
- allowedGsdTools: ["gsd_requirement_save", "gsd_summary_save"],
185
- requiredWorkflowTools: ["ask_user_questions", "gsd_requirement_save", "gsd_summary_save"],
186
- },
187
- "research-decision": {
188
- allowedGsdTools: ["gsd_summary_save"],
189
- requiredWorkflowTools: ["ask_user_questions"],
190
- },
191
- "research-project": {
192
- allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
193
- requiredWorkflowTools: [],
194
- },
195
- };
26
+ export const UNIT_TOOL_CONTRACTS: Record<string, UnitToolSurfaceContract> = Object.fromEntries(
27
+ Object.entries(UNIT_REGISTRY).flatMap(([unitType, descriptor]) =>
28
+ descriptor.toolContract ? [[unitType, descriptor.toolContract]] : [],
29
+ ),
30
+ );
196
31
 
197
32
  export const AUTO_UNIT_SCOPED_TOOLS: Record<string, readonly string[]> = Object.fromEntries(
198
33
  Object.entries(UNIT_TOOL_CONTRACTS).map(([unitType, contract]) => [unitType, contract.allowedGsdTools]),
@@ -202,7 +37,7 @@ export function getUnitToolSurfaceContract(unitType: string): UnitToolSurfaceCon
202
37
  return UNIT_TOOL_CONTRACTS[unitType];
203
38
  }
204
39
 
205
- export function getRequiredWorkflowToolsForUnit(unitType: string): string[] {
40
+ export function getRequiredWorkflowToolsForUnit(unitType: string): UnitWorkflowToolName[] {
206
41
  return [...(UNIT_TOOL_CONTRACTS[unitType]?.requiredWorkflowTools ?? [])];
207
42
  }
208
43
 
@@ -28,7 +28,7 @@ export const WORKFLOW_TOOL_ALIAS_PAIRS: readonly WorkflowToolAliasPair[] =
28
28
  export const WORKFLOW_TOOL_ALIAS_TO_CANONICAL: Readonly<Record<string, string>> =
29
29
  Object.fromEntries(WORKFLOW_TOOL_ALIAS_PAIRS.map(({ alias, canonical }) => [alias, canonical]));
30
30
 
31
- const WORKFLOW_MCP_ADAPTER_TOOL_NAMES = [
31
+ export const WORKFLOW_MCP_ADAPTER_TOOL_NAMES = [
32
32
  "gsd_cancel",
33
33
  "gsd_captures",
34
34
  "ask_user_questions",
@@ -45,6 +45,9 @@ const WORKFLOW_MCP_ADAPTER_TOOL_NAMES = [
45
45
  "gsd_status",
46
46
  ] as const;
47
47
 
48
+ /** Session-orchestration tools exposed by the workflow MCP adapter alongside the contract tools. */
49
+ export type WorkflowMcpAdapterToolName = (typeof WORKFLOW_MCP_ADAPTER_TOOL_NAMES)[number];
50
+
48
51
  export const WORKFLOW_TOOL_SURFACE_NAMES = [
49
52
  ...WORKFLOW_MCP_ADAPTER_TOOL_NAMES,
50
53
  ...DB_WORKFLOW_TOOL_NAMES,