@opengsd/gsd-pi 1.1.1-dev.a5a2de8 → 1.1.1-dev.b2556262

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 (325) hide show
  1. package/dist/headless-recover.js +56 -1
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +18 -2
  4. package/dist/resources/extensions/browser-tools/engine/selection.js +1 -1
  5. package/dist/resources/extensions/browser-tools/extension-manifest.json +1 -1
  6. package/dist/resources/extensions/browser-tools/index.js +68 -24
  7. package/dist/resources/extensions/browser-tools/state.js +12 -0
  8. package/dist/resources/extensions/browser-tools/tools/session.js +3 -2
  9. package/dist/resources/extensions/browser-tools/utils.js +3 -3
  10. package/dist/resources/extensions/browser-tools/web-app-detect.js +52 -0
  11. package/dist/resources/extensions/gsd/auto/loop.js +4 -2
  12. package/dist/resources/extensions/gsd/auto/phases.js +87 -12
  13. package/dist/resources/extensions/gsd/auto/session.js +22 -1
  14. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +1 -0
  15. package/dist/resources/extensions/gsd/auto-dispatch.js +81 -13
  16. package/dist/resources/extensions/gsd/auto-model-selection.js +154 -9
  17. package/dist/resources/extensions/gsd/auto-post-unit.js +19 -2
  18. package/dist/resources/extensions/gsd/auto-prompts.js +26 -21
  19. package/dist/resources/extensions/gsd/auto-recovery.js +4 -2
  20. package/dist/resources/extensions/gsd/auto-runtime-state.js +3 -0
  21. package/dist/resources/extensions/gsd/auto-start.js +1 -1
  22. package/dist/resources/extensions/gsd/auto-timers.js +24 -10
  23. package/dist/resources/extensions/gsd/auto.js +40 -15
  24. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +3 -3
  25. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +192 -77
  26. package/dist/resources/extensions/gsd/bootstrap/system-context.js +1 -1
  27. package/dist/resources/extensions/gsd/closeout-wizard.js +32 -9
  28. package/dist/resources/extensions/gsd/commands/handlers/auto.js +10 -0
  29. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -9
  30. package/dist/resources/extensions/gsd/commands-maintenance.js +93 -15
  31. package/dist/resources/extensions/gsd/commands-mcp-status.js +1 -1
  32. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +2 -2
  33. package/dist/resources/extensions/gsd/config-overlay.js +1 -0
  34. package/dist/resources/extensions/gsd/context-masker.js +129 -5
  35. package/dist/resources/extensions/gsd/db-writer.js +35 -0
  36. package/dist/resources/extensions/gsd/docs/preferences-reference.md +50 -1
  37. package/dist/resources/extensions/gsd/gsd-db.js +480 -172
  38. package/dist/resources/extensions/gsd/guided-flow.js +4 -1
  39. package/dist/resources/extensions/gsd/markdown-renderer.js +37 -53
  40. package/dist/resources/extensions/gsd/md-importer.js +38 -3
  41. package/dist/resources/extensions/gsd/migration-auto-check.js +126 -31
  42. package/dist/resources/extensions/gsd/parsers-legacy.js +23 -0
  43. package/dist/resources/extensions/gsd/planner-handoff.js +98 -0
  44. package/dist/resources/extensions/gsd/planning-path-scope.js +22 -4
  45. package/dist/resources/extensions/gsd/pre-execution-checks.js +10 -2
  46. package/dist/resources/extensions/gsd/preferences-models.js +111 -43
  47. package/dist/resources/extensions/gsd/preferences-types.js +13 -0
  48. package/dist/resources/extensions/gsd/preferences-validation.js +68 -3
  49. package/dist/resources/extensions/gsd/preferences.js +4 -1
  50. package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +1 -1
  51. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  52. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  53. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  54. package/dist/resources/extensions/gsd/prompts/run-uat.md +2 -2
  55. package/dist/resources/extensions/gsd/prompts/system.md +1 -1
  56. package/dist/resources/extensions/gsd/roadmap-slices.js +5 -1
  57. package/dist/resources/extensions/gsd/safety/content-validator.js +6 -4
  58. package/dist/resources/extensions/gsd/skill-manifest.js +12 -0
  59. package/dist/resources/extensions/gsd/source-observations.js +306 -0
  60. package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +15 -8
  61. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +33 -5
  62. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-worker.js +34 -13
  63. package/dist/resources/extensions/gsd/state-reconciliation/index.js +39 -14
  64. package/dist/resources/extensions/gsd/state-reconciliation/spawn-gate.js +4 -4
  65. package/dist/resources/extensions/gsd/state.js +7 -3
  66. package/dist/resources/extensions/gsd/tool-contract.js +15 -1
  67. package/dist/resources/extensions/gsd/tool-presentation-plan.js +24 -2
  68. package/dist/resources/extensions/gsd/tools/complete-slice.js +28 -0
  69. package/dist/resources/extensions/gsd/tools/plan-slice.js +42 -11
  70. package/dist/resources/extensions/gsd/tools/plan-task.js +7 -1
  71. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +62 -406
  72. package/dist/resources/extensions/gsd/uat-policy.js +130 -0
  73. package/dist/resources/extensions/gsd/uat-run.js +414 -0
  74. package/dist/resources/extensions/gsd/unit-context-manifest.js +3 -4
  75. package/dist/resources/extensions/gsd/unit-tool-contracts.js +38 -14
  76. package/dist/resources/extensions/gsd/verdict-parser.js +3 -8
  77. package/dist/resources/extensions/gsd/workflow-manifest.js +132 -5
  78. package/dist/resources/extensions/gsd/workflow-mcp.js +2 -3
  79. package/dist/resources/extensions/gsd/workflow-projections.js +8 -0
  80. package/dist/resources/extensions/gsd/worktree-manager.js +26 -0
  81. package/dist/resources/extensions/gsd/worktree-reentry.js +96 -0
  82. package/dist/resources/extensions/gsd/worktree-state-projection.js +18 -17
  83. package/dist/resources/extensions/shared/gsd-browser-cli.js +6 -0
  84. package/dist/resources/extensions/subagent/agents.js +1 -0
  85. package/dist/resources/extensions/subagent/index.js +27 -12
  86. package/dist/resources/extensions/subagent/launch.js +7 -2
  87. package/dist/web/standalone/.next/BUILD_ID +1 -1
  88. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  89. package/dist/web/standalone/.next/build-manifest.json +2 -2
  90. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  91. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  100. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/index.html +1 -1
  108. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  115. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  116. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  118. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  119. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  120. package/dist/web/standalone/node_modules/@gsd/native/dist/native.js +22 -0
  121. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  122. package/package.json +4 -4
  123. package/packages/cloud-mcp-gateway/package.json +2 -2
  124. package/packages/contracts/package.json +1 -1
  125. package/packages/daemon/package.json +4 -4
  126. package/packages/gsd-agent-core/package.json +5 -5
  127. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  128. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js +21 -23
  129. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js.map +1 -1
  130. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +3 -0
  131. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  132. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +25 -0
  133. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  134. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +1 -0
  135. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  136. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +66 -12
  137. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  138. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  139. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +18 -11
  140. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  141. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  142. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +16 -0
  143. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  144. package/packages/gsd-agent-modes/package.json +7 -7
  145. package/packages/mcp-server/dist/workflow-tools.js +1 -1
  146. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  147. package/packages/mcp-server/package.json +3 -3
  148. package/packages/native/dist/native.js +22 -0
  149. package/packages/native/package.json +1 -1
  150. package/packages/pi-agent-core/package.json +1 -1
  151. package/packages/pi-ai/dist/image-models.generated.d.ts +30 -0
  152. package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  153. package/packages/pi-ai/dist/image-models.generated.js +30 -0
  154. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  155. package/packages/pi-ai/dist/models.generated.d.ts +174 -29
  156. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  157. package/packages/pi-ai/dist/models.generated.js +178 -54
  158. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  159. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  160. package/packages/pi-ai/dist/providers/transform-messages.js +8 -1
  161. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  162. package/packages/pi-ai/package.json +1 -1
  163. package/packages/pi-coding-agent/dist/core/settings-manager.js +1 -1
  164. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  165. package/packages/pi-coding-agent/dist/theme/themes.js +1 -1
  166. package/packages/pi-coding-agent/dist/theme/themes.js.map +1 -1
  167. package/packages/pi-coding-agent/package.json +7 -7
  168. package/packages/pi-tui/dist/utils.d.ts +11 -0
  169. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  170. package/packages/pi-tui/dist/utils.js +119 -6
  171. package/packages/pi-tui/dist/utils.js.map +1 -1
  172. package/packages/pi-tui/package.json +2 -1
  173. package/packages/rpc-client/package.json +2 -2
  174. package/pkg/dist/theme/themes.js +1 -1
  175. package/pkg/dist/theme/themes.js.map +1 -1
  176. package/pkg/package.json +1 -1
  177. package/scripts/install/handoff.js +16 -3
  178. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +21 -2
  179. package/src/resources/extensions/browser-tools/engine/selection.ts +1 -1
  180. package/src/resources/extensions/browser-tools/extension-manifest.json +1 -1
  181. package/src/resources/extensions/browser-tools/index.ts +75 -27
  182. package/src/resources/extensions/browser-tools/state.ts +13 -0
  183. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +2 -2
  184. package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +57 -0
  185. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +37 -0
  186. package/src/resources/extensions/browser-tools/tests/web-app-detect.test.mjs +68 -0
  187. package/src/resources/extensions/browser-tools/tools/session.ts +4 -2
  188. package/src/resources/extensions/browser-tools/utils.ts +3 -3
  189. package/src/resources/extensions/browser-tools/web-app-detect.ts +63 -0
  190. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  191. package/src/resources/extensions/gsd/auto/loop.ts +4 -2
  192. package/src/resources/extensions/gsd/auto/phases.ts +89 -15
  193. package/src/resources/extensions/gsd/auto/session.ts +24 -1
  194. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +1 -0
  195. package/src/resources/extensions/gsd/auto-dispatch.ts +117 -12
  196. package/src/resources/extensions/gsd/auto-model-selection.ts +190 -12
  197. package/src/resources/extensions/gsd/auto-post-unit.ts +20 -2
  198. package/src/resources/extensions/gsd/auto-prompts.ts +25 -22
  199. package/src/resources/extensions/gsd/auto-recovery.ts +22 -3
  200. package/src/resources/extensions/gsd/auto-runtime-state.ts +5 -0
  201. package/src/resources/extensions/gsd/auto-start.ts +1 -1
  202. package/src/resources/extensions/gsd/auto-timers.ts +25 -9
  203. package/src/resources/extensions/gsd/auto.ts +41 -14
  204. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +3 -3
  205. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +250 -78
  206. package/src/resources/extensions/gsd/bootstrap/system-context.ts +1 -1
  207. package/src/resources/extensions/gsd/closeout-wizard.ts +47 -13
  208. package/src/resources/extensions/gsd/commands/handlers/auto.ts +9 -0
  209. package/src/resources/extensions/gsd/commands/handlers/ops.ts +2 -17
  210. package/src/resources/extensions/gsd/commands-maintenance.ts +124 -13
  211. package/src/resources/extensions/gsd/commands-mcp-status.ts +1 -1
  212. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +2 -2
  213. package/src/resources/extensions/gsd/config-overlay.ts +1 -0
  214. package/src/resources/extensions/gsd/context-masker.ts +152 -5
  215. package/src/resources/extensions/gsd/db-writer.ts +38 -0
  216. package/src/resources/extensions/gsd/docs/preferences-reference.md +50 -1
  217. package/src/resources/extensions/gsd/gsd-db.ts +564 -186
  218. package/src/resources/extensions/gsd/guided-flow.ts +4 -1
  219. package/src/resources/extensions/gsd/markdown-renderer.ts +44 -66
  220. package/src/resources/extensions/gsd/md-importer.ts +49 -2
  221. package/src/resources/extensions/gsd/migration-auto-check.ts +154 -34
  222. package/src/resources/extensions/gsd/parsers-legacy.ts +20 -0
  223. package/src/resources/extensions/gsd/planner-handoff.ts +149 -0
  224. package/src/resources/extensions/gsd/planning-path-scope.ts +22 -4
  225. package/src/resources/extensions/gsd/pre-execution-checks.ts +9 -2
  226. package/src/resources/extensions/gsd/preferences-models.ts +113 -43
  227. package/src/resources/extensions/gsd/preferences-types.ts +47 -0
  228. package/src/resources/extensions/gsd/preferences-validation.ts +76 -2
  229. package/src/resources/extensions/gsd/preferences.ts +5 -0
  230. package/src/resources/extensions/gsd/prompts/gate-evaluate.md +1 -1
  231. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  232. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  233. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  234. package/src/resources/extensions/gsd/prompts/run-uat.md +2 -2
  235. package/src/resources/extensions/gsd/prompts/system.md +1 -1
  236. package/src/resources/extensions/gsd/roadmap-slices.ts +6 -1
  237. package/src/resources/extensions/gsd/safety/content-validator.ts +8 -5
  238. package/src/resources/extensions/gsd/skill-manifest.ts +12 -0
  239. package/src/resources/extensions/gsd/source-observations.ts +402 -0
  240. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +20 -8
  241. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +44 -5
  242. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +39 -11
  243. package/src/resources/extensions/gsd/state-reconciliation/index.ts +45 -15
  244. package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +4 -4
  245. package/src/resources/extensions/gsd/state.ts +7 -4
  246. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +114 -0
  247. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +66 -4
  248. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +299 -1
  249. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +32 -0
  250. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +75 -3
  251. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +22 -1
  252. package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +4 -0
  253. package/src/resources/extensions/gsd/tests/before-provider-context-management.test.ts +145 -0
  254. package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +9 -0
  255. package/src/resources/extensions/gsd/tests/closeout-wizard.test.ts +44 -0
  256. package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +26 -1
  257. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +118 -0
  258. package/src/resources/extensions/gsd/tests/content-validator.test.ts +74 -0
  259. package/src/resources/extensions/gsd/tests/context-masker.test.ts +56 -1
  260. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +17 -2
  261. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +24 -0
  262. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +1 -11
  263. package/src/resources/extensions/gsd/tests/gate-dispatch.test.ts +64 -0
  264. package/src/resources/extensions/gsd/tests/gate-storage.test.ts +15 -0
  265. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +62 -1
  266. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +4 -1
  267. package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +27 -0
  268. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +16 -0
  269. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +42 -0
  270. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +7 -1
  271. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +1 -1
  272. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +99 -0
  273. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +99 -2
  274. package/src/resources/extensions/gsd/tests/plan-task.test.ts +19 -0
  275. package/src/resources/extensions/gsd/tests/planner-handoff.test.ts +100 -0
  276. package/src/resources/extensions/gsd/tests/preferences.test.ts +14 -0
  277. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +1 -0
  278. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +133 -0
  279. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +55 -0
  280. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +101 -1
  281. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +2 -2
  282. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +28 -0
  283. package/src/resources/extensions/gsd/tests/schema-v21-sequence.test.ts +5 -3
  284. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +162 -18
  285. package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +4 -3
  286. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +8 -0
  287. package/src/resources/extensions/gsd/tests/source-observations.test.ts +275 -0
  288. package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +43 -0
  289. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +76 -21
  290. package/src/resources/extensions/gsd/tests/thinking-level-resolution.test.ts +203 -0
  291. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +170 -0
  292. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +7 -1
  293. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  294. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +306 -1
  295. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +77 -10
  296. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +260 -5
  297. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +511 -1
  298. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +102 -0
  299. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +44 -0
  300. package/src/resources/extensions/gsd/tool-contract.ts +29 -1
  301. package/src/resources/extensions/gsd/tool-presentation-plan.ts +41 -6
  302. package/src/resources/extensions/gsd/tools/complete-slice.ts +29 -0
  303. package/src/resources/extensions/gsd/tools/plan-slice.ts +54 -12
  304. package/src/resources/extensions/gsd/tools/plan-task.ts +8 -1
  305. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +71 -489
  306. package/src/resources/extensions/gsd/types.ts +1 -0
  307. package/src/resources/extensions/gsd/uat-policy.ts +191 -0
  308. package/src/resources/extensions/gsd/uat-run.ts +550 -0
  309. package/src/resources/extensions/gsd/unit-context-manifest.ts +3 -4
  310. package/src/resources/extensions/gsd/unit-tool-contracts.ts +38 -14
  311. package/src/resources/extensions/gsd/verdict-parser.ts +3 -10
  312. package/src/resources/extensions/gsd/workflow-manifest.ts +193 -7
  313. package/src/resources/extensions/gsd/workflow-mcp.ts +2 -3
  314. package/src/resources/extensions/gsd/workflow-projections.ts +9 -0
  315. package/src/resources/extensions/gsd/worktree-manager.ts +32 -0
  316. package/src/resources/extensions/gsd/worktree-reentry.ts +103 -0
  317. package/src/resources/extensions/gsd/worktree-state-projection.ts +22 -22
  318. package/src/resources/extensions/shared/gsd-browser-cli.ts +6 -0
  319. package/src/resources/extensions/shared/tests/format-utils.test.ts +8 -3
  320. package/src/resources/extensions/subagent/agents.ts +4 -0
  321. package/src/resources/extensions/subagent/index.ts +28 -3
  322. package/src/resources/extensions/subagent/launch.ts +8 -0
  323. package/src/resources/extensions/subagent/tests/model-override.test.ts +31 -0
  324. /package/dist/web/standalone/.next/static/{9y3LeeR2uGr2yRj9RjY3D → tJOKQbQRO-9MiFDO8DIDS}/_buildManifest.js +0 -0
  325. /package/dist/web/standalone/.next/static/{9y3LeeR2uGr2yRj9RjY3D → tJOKQbQRO-9MiFDO8DIDS}/_ssgManifest.js +0 -0
@@ -9,6 +9,10 @@ import {
9
9
  } from "./unit-context-manifest.js";
10
10
  import { getRequiredWorkflowToolsForAutoUnit } from "./workflow-mcp.js";
11
11
  import { getUnitToolSurfaceContract } from "./unit-tool-contracts.js";
12
+ import {
13
+ WHOLE_FILE_OBSERVATION_MAX_BYTES,
14
+ WHOLE_FILE_OBSERVATION_MAX_LINES,
15
+ } from "./source-observations.js";
12
16
 
13
17
  export interface UnitToolContract {
14
18
  unitType: string;
@@ -19,6 +23,7 @@ export interface UnitToolContract {
19
23
  promptObligations: readonly string[];
20
24
  validationRules: readonly string[];
21
25
  closeoutTools: readonly string[];
26
+ sourceObservations: UnitSourceObservationContract;
22
27
  artifacts: {
23
28
  inline: readonly ArtifactKey[];
24
29
  excerpt: readonly ArtifactKey[];
@@ -26,6 +31,16 @@ export interface UnitToolContract {
26
31
  };
27
32
  }
28
33
 
34
+ export type UnitSourceObservationContract =
35
+ | { mode: "none" }
36
+ | {
37
+ mode: "whole-file-active-unit";
38
+ seedFields: readonly ["task.files", "task.inputs"];
39
+ excludedFields: readonly ["expectedOutput"];
40
+ maxBytes: number;
41
+ maxLines: number;
42
+ };
43
+
29
44
  export type ToolContractResult =
30
45
  | { ok: true; contract: UnitToolContract }
31
46
  | { ok: false; reason: "unknown-unit-type" | "missing-closeout-tool"; detail: string };
@@ -45,7 +60,7 @@ export function compileUnitToolContract(unitType: string): ToolContractResult {
45
60
  const forbiddenWorkflowTools = Object.entries(surfaceContract?.forbiddenGsdTools ?? {})
46
61
  .map(([name, reason]) => ({ name, reason }));
47
62
  const closeoutTools = requiredWorkflowTools.filter((tool) =>
48
- /^gsd_(?:task|slice|milestone|complete|validate|save|summary)/.test(tool),
63
+ /^gsd_(?:task|slice|milestone|complete|validate|save|summary|uat)/.test(tool),
49
64
  );
50
65
 
51
66
  if (requiresCloseoutTool(unitType) && closeoutTools.length === 0) {
@@ -72,8 +87,10 @@ export function compileUnitToolContract(unitType: string): ToolContractResult {
72
87
  "unit-manifest-present",
73
88
  "workflow-tool-surface-present",
74
89
  ...(requiresCloseoutTool(unitType) ? ["closeout-tool-present"] : []),
90
+ ...(unitType === "execute-task" ? ["source-observation-contract-present"] : []),
75
91
  ],
76
92
  closeoutTools,
93
+ sourceObservations: sourceObservationContractForUnit(unitType),
77
94
  artifacts: {
78
95
  inline: manifest.artifacts.inline,
79
96
  excerpt: manifest.artifacts.excerpt,
@@ -83,6 +100,17 @@ export function compileUnitToolContract(unitType: string): ToolContractResult {
83
100
  };
84
101
  }
85
102
 
103
+ function sourceObservationContractForUnit(unitType: string): UnitSourceObservationContract {
104
+ if (unitType !== "execute-task") return { mode: "none" };
105
+ return {
106
+ mode: "whole-file-active-unit",
107
+ seedFields: ["task.files", "task.inputs"],
108
+ excludedFields: ["expectedOutput"],
109
+ maxBytes: WHOLE_FILE_OBSERVATION_MAX_BYTES,
110
+ maxLines: WHOLE_FILE_OBSERVATION_MAX_LINES,
111
+ };
112
+ }
113
+
86
114
  function requiresCloseoutTool(unitType: string): boolean {
87
115
  return /^(execute-task|reactive-execute|complete-slice|validate-milestone|complete-milestone|run-uat|gate-evaluate)$/.test(unitType);
88
116
  }
@@ -2,12 +2,15 @@
2
2
  // File Purpose: Resolve phase-aware tool surfaces for GSD model presentations.
3
3
 
4
4
  import {
5
+ RUN_UAT_BROWSER_TOOL_NAMES,
5
6
  RUN_UAT_READ_ONLY_TOOL_NAMES,
6
7
  RUN_UAT_TOOL_PRESENTATION_PLAN_ID,
7
8
  RUN_UAT_WORKFLOW_TOOL_NAMES,
8
9
  } from "./unit-tool-contracts.js";
10
+ import { uatTypeIncludesBrowser } from "./uat-policy.js";
9
11
 
10
12
  export {
13
+ RUN_UAT_BROWSER_TOOL_NAMES,
11
14
  RUN_UAT_READ_ONLY_TOOL_NAMES,
12
15
  RUN_UAT_TOOL_PRESENTATION_PLAN_ID,
13
16
  RUN_UAT_WORKFLOW_TOOL_NAMES,
@@ -32,6 +35,13 @@ export interface ToolPresentationPlan {
32
35
  diagnostics: string[];
33
36
  }
34
37
 
38
+ export interface RunUatResultPresentation {
39
+ surface: ToolPresentationSurface;
40
+ presentedTools: string[];
41
+ blockedTools: Array<{ name: string; reason: string }>;
42
+ toolPresentationPlanId: string;
43
+ }
44
+
35
45
  export const RUN_UAT_FORBIDDEN_TOOL_NAMES = [
36
46
  "edit",
37
47
  "write",
@@ -114,16 +124,41 @@ export function buildRunUatCanonicalToolNames(options: { includeBrowserTools?: r
114
124
  ]);
115
125
  }
116
126
 
127
+ // UAT modes whose run-uat instructions direct the runner to exercise the live
128
+ // app in a browser. These modes receive the browser tool surface so the runner
129
+ // can actually drive the page instead of silently deferring browser checks to a
130
+ // human. See run-uat.md automation rules: `browser-executable`, `live-runtime`,
131
+ // and `mixed` are all told to drive a browser/runtime path, and
132
+ // `human-experience` is told to capture screenshots. Without this, a webpage
133
+ // UAT classified as anything but `browser-executable` had no browser tools and
134
+ // downgraded its live checks to NEEDS-HUMAN (M001/S03 regression).
135
+ export function runUatBrowserToolsForType(uatType: string | undefined): readonly string[] {
136
+ return uatTypeIncludesBrowser(uatType) ? RUN_UAT_BROWSER_TOOL_NAMES : [];
137
+ }
138
+
139
+ export function runUatPresentationSurfaceForType(uatType: string | undefined): ToolPresentationSurface {
140
+ return uatTypeIncludesBrowser(uatType) ? "hybrid" : "mcp";
141
+ }
142
+
143
+ export function buildRunUatPresentationForType(
144
+ uatType: string | undefined,
145
+ options: {
146
+ surface?: ToolPresentationSurface;
147
+ presentedTools?: readonly string[];
148
+ } = {},
149
+ ): RunUatResultPresentation {
150
+ return buildRunUatResultPresentation({
151
+ ...options,
152
+ surface: options.surface ?? runUatPresentationSurfaceForType(uatType),
153
+ includeBrowserTools: runUatBrowserToolsForType(uatType),
154
+ });
155
+ }
156
+
117
157
  export function buildRunUatResultPresentation(options: {
118
158
  surface?: ToolPresentationSurface;
119
159
  includeBrowserTools?: readonly string[];
120
160
  presentedTools?: readonly string[];
121
- } = {}): {
122
- surface: ToolPresentationSurface;
123
- presentedTools: string[];
124
- blockedTools: Array<{ name: string; reason: string }>;
125
- toolPresentationPlanId: string;
126
- } {
161
+ } = {}): RunUatResultPresentation {
127
162
  const presentedTools = options.presentedTools
128
163
  ? dedupe(options.presentedTools)
129
164
  : buildRunUatCanonicalToolNames({ includeBrowserTools: options.includeBrowserTools });
@@ -35,6 +35,7 @@ import { gsdProjectionRoot, clearPathCache, resolveMilestoneFile } from "../path
35
35
  import { resolveCanonicalMilestoneRoot } from "../worktree-manager.js";
36
36
  import { checkOwnership, sliceUnitKey } from "../unit-ownership.js";
37
37
  import { saveFile, clearParseCache } from "../files.js";
38
+ import { getDeclaredUatType, shouldEscalateArtifactUatToBrowser } from "../uat-policy.js";
38
39
  import { invalidateStateCache } from "../state.js";
39
40
  import { renderRoadmapFromDb } from "../markdown-renderer.js";
40
41
  import { parseRoadmap } from "../parsers-legacy.js";
@@ -342,6 +343,34 @@ export async function handleCompleteSlice(
342
343
  return { error: `slice verification indicates blocked/failed state — do not complete a slice that has not passed verification. Address the blockers and re-verify first.` };
343
344
  }
344
345
 
346
+ // ── Browser/web UAT classification gate ────────────────────────────────
347
+ // A UAT that drives a running web UI (opening a page in a browser,
348
+ // navigating to a page/localhost) must declare a browser-capable mode so the
349
+ // run-uat runner surfaces browser tools and actually launches a browser.
350
+ // Otherwise the browser checks get silently deferred to a human and the slice
351
+ // passes on static checks alone (M001/S03 regression). `browser-executable`,
352
+ // `live-runtime`, and `mixed` all receive browser tools (see
353
+ // UAT_MODE_POLICIES); only the non-browser modes are rejected here.
354
+ //
355
+ // Reuse the canonical hasBrowserRequiredText detector (also used by dispatch
356
+ // and milestone validation): it skips Not-Proven/Out-of-Scope disclaimer
357
+ // sections and only treats verbs like navigate/open as web when they sit next
358
+ // to browser/page/localhost — avoiding false positives on CLI/file/API steps.
359
+ //
360
+ // Only `artifact-driven` is gated. It is the one mode that performs no
361
+ // execution at all (static/file checks), so a browser-requiring UAT under it
362
+ // genuinely defers verification to a human. Every other mode has a real
363
+ // verification path: `runtime-executable` runs browser test commands like
364
+ // `npx playwright test` via gsd_uat_exec, and live-runtime/mixed/
365
+ // browser-executable receive browser tools (UAT_MODE_POLICIES).
366
+ const uatContent = params.uatContent || "";
367
+ const declaredUatMode = getDeclaredUatType(uatContent);
368
+ if (shouldEscalateArtifactUatToBrowser(uatContent)) {
369
+ return {
370
+ error: `UAT requires browser verification (opening a page in a browser, navigating to a page or localhost, screenshots) but declares "UAT mode: artifact-driven", which only runs static/file checks and would defer the browser work to a human. Use a mode that actually verifies the UI: "browser-executable" (interactive browser tools), "runtime-executable" (a browser test command such as playwright), or a browser-inclusive "mixed"/"live-runtime". Re-author the UAT Type section and complete the slice again.`,
371
+ };
372
+ }
373
+
345
374
  // ── Guards + DB writes inside a single transaction (prevents TOCTOU) ───
346
375
  const completedAt = new Date().toISOString();
347
376
  let guardError: string | null = null;
@@ -1,8 +1,9 @@
1
1
  import { existsSync, rmSync } from "node:fs";
2
- import { join, relative } from "node:path";
2
+ import { join, relative, resolve } from "node:path";
3
3
  import { clearParseCache } from "../files.js";
4
4
  import { isClosedStatus, isDeferredStatus } from "../status-guards.js";
5
5
  import { isNonEmptyString, validateStringArray } from "../validation.js";
6
+ import { getGateIdsForTurn } from "../gate-registry.js";
6
7
  import {
7
8
  transaction,
8
9
  getMilestone,
@@ -17,14 +18,14 @@ import {
17
18
  deleteTask,
18
19
  deleteArtifactByPath,
19
20
  } from "../gsd-db.js";
20
- import type { GateId } from "../types.js";
21
+ import type { GateEvaluationConfig, GateId } from "../types.js";
21
22
  import { invalidateStateCache } from "../state.js";
22
23
  import { renderPlanFromDb } from "../markdown-renderer.js";
23
24
  import { renderAllProjections } from "../workflow-projections.js";
24
25
  import { writeManifest } from "../workflow-manifest.js";
25
26
  import { appendEvent } from "../workflow-events.js";
26
27
  import { logWarning } from "../workflow-logger.js";
27
- import { validatePlanningPathScope } from "../planning-path-scope.js";
28
+ import { validatePathOnlyPlanningFields, validatePlanningPathScope } from "../planning-path-scope.js";
28
29
  import { checkFilePathConsistency, checkTaskOrdering } from "../pre-execution-checks.js";
29
30
  import type { TaskRow } from "../db-task-slice-rows.js";
30
31
  import { buildTaskFileName, gsdProjectionRoot } from "../paths.js";
@@ -163,9 +164,27 @@ function validateParams(params: PlanSliceParams): PlanSliceParams {
163
164
  };
164
165
  }
165
166
 
166
- function loadRepositoryRegistry(basePath: string): RepositoryRegistry {
167
+ function loadPlanningContext(basePath: string): {
168
+ repositoryRegistry: RepositoryRegistry;
169
+ gateEvaluation?: GateEvaluationConfig;
170
+ } {
167
171
  const loaded = loadEffectiveGSDPreferences(basePath);
168
- return createRepositoryRegistryFromPreferences(basePath, loaded?.preferences);
172
+ return {
173
+ repositoryRegistry: createRepositoryRegistryFromPreferences(basePath, loaded?.preferences),
174
+ gateEvaluation: loaded?.preferences?.gate_evaluation,
175
+ };
176
+ }
177
+
178
+ function resolveGateEvaluateSliceGates(config: GateEvaluationConfig | undefined): GateId[] {
179
+ const ownedGateIds = [...getGateIdsForTurn("gate-evaluate")];
180
+ if (!config?.slice_gates?.length) return ownedGateIds;
181
+ const owned = new Set<string>(ownedGateIds);
182
+ return config.slice_gates.filter((gateId): gateId is GateId => owned.has(gateId));
183
+ }
184
+
185
+ function resolveTaskGates(config: GateEvaluationConfig | undefined): GateId[] {
186
+ if (config?.task_gates === false) return [];
187
+ return [...getGateIdsForTurn("execute-task")];
169
188
  }
170
189
 
171
190
  function validateReferencedRepositories(
@@ -238,11 +257,21 @@ function toTaskRows(params: PlanSliceParams, defaultTargets: string[]): TaskRow[
238
257
  }));
239
258
  }
240
259
 
241
- function validateTaskPathsBeforePersist(params: PlanSliceParams, basePath: string, defaultTargets: string[]): string | null {
260
+ function validateTaskPathsBeforePersist(
261
+ params: PlanSliceParams,
262
+ basePath: string,
263
+ defaultTargets: string[],
264
+ allowedRoots: string[],
265
+ ): string | null {
242
266
  const taskRows = toTaskRows(params, defaultTargets);
267
+ const baseRoot = resolve(basePath);
268
+ const additionalRoots = allowedRoots
269
+ .map((root) => resolve(root))
270
+ .filter((root) => root !== baseRoot);
271
+ const context = additionalRoots.length > 0 ? { additionalRoots } : undefined;
243
272
  const checks = [
244
- ...checkFilePathConsistency(taskRows, basePath),
245
- ...checkTaskOrdering(taskRows, basePath),
273
+ ...checkFilePathConsistency(taskRows, basePath, context),
274
+ ...checkTaskOrdering(taskRows, basePath, context),
246
275
  ];
247
276
  const blocking = checks.filter((check) => !check.passed && check.blocking);
248
277
 
@@ -265,8 +294,11 @@ export async function handlePlanSlice(
265
294
  }
266
295
 
267
296
  let repositoryRegistry: RepositoryRegistry;
297
+ let gateEvaluation: GateEvaluationConfig | undefined;
268
298
  try {
269
- repositoryRegistry = loadRepositoryRegistry(basePath);
299
+ const context = loadPlanningContext(basePath);
300
+ repositoryRegistry = context.repositoryRegistry;
301
+ gateEvaluation = context.gateEvaluation;
270
302
  } catch (err) {
271
303
  const message = err instanceof Error ? err.message : String(err);
272
304
  return { error: `validation failed: ${message}` };
@@ -279,6 +311,16 @@ export async function handlePlanSlice(
279
311
 
280
312
  const allowedAbsoluteRoots = resolveAllowedRootsForPathScope(params, repositoryRegistry, defaultTargets);
281
313
 
314
+ const pathOnlyError = validatePathOnlyPlanningFields(
315
+ params.tasks.map((task, index) => ({
316
+ field: `tasks[${index}].expectedOutput`,
317
+ values: task.expectedOutput,
318
+ })),
319
+ );
320
+ if (pathOnlyError) {
321
+ return { error: `validation failed: ${pathOnlyError}` };
322
+ }
323
+
282
324
  const pathScopeError = validatePlanningPathScope(
283
325
  basePath,
284
326
  params.tasks.flatMap((task, index) => [
@@ -292,7 +334,7 @@ export async function handlePlanSlice(
292
334
  return { error: `validation failed: ${pathScopeError}` };
293
335
  }
294
336
 
295
- const pathError = validateTaskPathsBeforePersist(params, basePath, defaultTargets);
337
+ const pathError = validateTaskPathsBeforePersist(params, basePath, defaultTargets, allowedAbsoluteRoots);
296
338
  if (pathError) {
297
339
  return { error: `pre-execution validation failed:\n${pathError}` };
298
340
  }
@@ -384,11 +426,11 @@ export async function handlePlanSlice(
384
426
 
385
427
  // Seed quality gate rows inside the transaction — all-or-nothing with
386
428
  // the plan data so a crash can't leave orphaned gates without tasks.
387
- const sliceGates: GateId[] = ["Q3", "Q4"];
429
+ const sliceGates = resolveGateEvaluateSliceGates(gateEvaluation);
388
430
  for (const gid of sliceGates) {
389
431
  insertGateRow({ milestoneId: params.milestoneId, sliceId: params.sliceId, gateId: gid, scope: "slice" });
390
432
  }
391
- const taskGates: GateId[] = ["Q5", "Q6", "Q7"];
433
+ const taskGates = resolveTaskGates(gateEvaluation);
392
434
  for (const task of params.tasks) {
393
435
  for (const gid of taskGates) {
394
436
  insertGateRow({ milestoneId: params.milestoneId, sliceId: params.sliceId, gateId: gid, scope: "task", taskId: task.taskId });
@@ -8,7 +8,7 @@ import { renderAllProjections } from "../workflow-projections.js";
8
8
  import { writeManifest } from "../workflow-manifest.js";
9
9
  import { appendEvent } from "../workflow-events.js";
10
10
  import { logWarning } from "../workflow-logger.js";
11
- import { validatePlanningPathScope } from "../planning-path-scope.js";
11
+ import { validatePathOnlyPlanningFields, validatePlanningPathScope } from "../planning-path-scope.js";
12
12
 
13
13
  export interface PlanTaskParams {
14
14
  milestoneId: string;
@@ -67,6 +67,13 @@ export async function handlePlanTask(
67
67
  return { error: `validation failed: ${(err as Error).message}` };
68
68
  }
69
69
 
70
+ const pathOnlyError = validatePathOnlyPlanningFields([
71
+ { field: "expectedOutput", values: params.expectedOutput },
72
+ ]);
73
+ if (pathOnlyError) {
74
+ return { error: `validation failed: ${pathOnlyError}` };
75
+ }
76
+
70
77
  const pathScopeError = validatePlanningPathScope(basePath, [
71
78
  { field: "files", values: params.files },
72
79
  { field: "inputs", values: params.inputs },