@opengsd/gsd-pi 1.2.0-dev.844675c9 → 1.2.0-dev.84c56d87

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 (657) hide show
  1. package/dist/cli-style.d.ts +17 -0
  2. package/dist/cli-style.js +28 -0
  3. package/dist/cli-web-branch.d.ts +2 -0
  4. package/dist/cli-web-branch.js +9 -2
  5. package/dist/cli.js +1 -1
  6. package/dist/headless-events.d.ts +4 -2
  7. package/dist/headless-events.js +7 -29
  8. package/dist/help-text.js +5 -0
  9. package/dist/models-resolver.d.ts +3 -13
  10. package/dist/models-resolver.js +3 -22
  11. package/dist/resource-loader.js +2 -14
  12. package/dist/resources/.managed-resources-content-hash +1 -1
  13. package/dist/resources/extensions/ask-user-questions.js +78 -23
  14. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  15. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  16. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  17. package/dist/resources/extensions/browser-tools/index.js +69 -12
  18. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  19. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +122 -234
  20. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
  21. package/dist/resources/extensions/github-sync/templates.js +3 -3
  22. package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
  23. package/dist/resources/extensions/gsd/auto/loop.js +74 -56
  24. package/dist/resources/extensions/gsd/auto/orchestrator.js +142 -15
  25. package/dist/resources/extensions/gsd/auto/phases.js +34 -4
  26. package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
  27. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  28. package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
  29. package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
  30. package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
  31. package/dist/resources/extensions/gsd/auto-post-unit.js +23 -11
  32. package/dist/resources/extensions/gsd/auto-prompts.js +84 -8
  33. package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
  34. package/dist/resources/extensions/gsd/auto-runtime-state.js +14 -0
  35. package/dist/resources/extensions/gsd/auto-start.js +24 -37
  36. package/dist/resources/extensions/gsd/auto-timers.js +16 -2
  37. package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
  38. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +11 -45
  39. package/dist/resources/extensions/gsd/auto-verification.js +7 -7
  40. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  41. package/dist/resources/extensions/gsd/auto-worktree.js +53 -368
  42. package/dist/resources/extensions/gsd/auto.js +19 -27
  43. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +3 -2
  44. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
  45. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +20 -43
  46. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  47. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  48. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +209 -149
  49. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +93 -8
  50. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  51. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  52. package/dist/resources/extensions/gsd/captures.js +5 -15
  53. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
  54. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  55. package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
  56. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  57. package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
  58. package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
  59. package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
  60. package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
  61. package/dist/resources/extensions/gsd/commands-ship.js +2 -2
  62. package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
  63. package/dist/resources/extensions/gsd/crash-recovery.js +4 -12
  64. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  65. package/dist/resources/extensions/gsd/db/queries.js +372 -0
  66. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  67. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  68. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  69. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  70. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  71. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  72. package/dist/resources/extensions/gsd/db-workspace.js +103 -0
  73. package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
  74. package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
  75. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  76. package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
  77. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  78. package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -3
  79. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  80. package/dist/resources/extensions/gsd/doctor.js +16 -9
  81. package/dist/resources/extensions/gsd/error-classifier.js +10 -1
  82. package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
  83. package/dist/resources/extensions/gsd/git-service.js +1 -0
  84. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  85. package/dist/resources/extensions/gsd/gsd-db.js +183 -2048
  86. package/dist/resources/extensions/gsd/guidance.js +98 -0
  87. package/dist/resources/extensions/gsd/guided-flow.js +83 -471
  88. package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
  89. package/dist/resources/extensions/gsd/markdown-renderer.js +2 -1
  90. package/dist/resources/extensions/gsd/mcp-filter.js +4 -20
  91. package/dist/resources/extensions/gsd/mcp-tool-name.js +18 -0
  92. package/dist/resources/extensions/gsd/md-importer.js +4 -3
  93. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  94. package/dist/resources/extensions/gsd/migrate/safety.js +22 -11
  95. package/dist/resources/extensions/gsd/migration-auto-check.js +27 -5
  96. package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
  97. package/dist/resources/extensions/gsd/milestone-closeout.js +12 -4
  98. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
  99. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
  100. package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
  101. package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
  102. package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
  103. package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
  104. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  105. package/dist/resources/extensions/gsd/model-router.js +3 -0
  106. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  107. package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
  108. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  109. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  110. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
  111. package/dist/resources/extensions/gsd/paths.js +37 -24
  112. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  113. package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
  114. package/dist/resources/extensions/gsd/preferences-models.js +12 -46
  115. package/dist/resources/extensions/gsd/preferences.js +161 -29
  116. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  117. package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
  118. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
  119. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  120. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -1
  121. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -1
  122. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  123. package/dist/resources/extensions/gsd/prompts/system.md +1 -1
  124. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  125. package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
  126. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  127. package/dist/resources/extensions/gsd/publication.js +87 -0
  128. package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
  129. package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
  130. package/dist/resources/extensions/gsd/question-transport.js +86 -0
  131. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  132. package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
  133. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  134. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  135. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  136. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
  137. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  138. package/dist/resources/extensions/gsd/state.js +14 -25
  139. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  140. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  141. package/dist/resources/extensions/gsd/templates/plan.md +7 -0
  142. package/dist/resources/extensions/gsd/templates/project.md +1 -0
  143. package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
  144. package/dist/resources/extensions/gsd/templates/uat.md +5 -1
  145. package/dist/resources/extensions/gsd/tool-contract.js +52 -8
  146. package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
  147. package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
  148. package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
  149. package/dist/resources/extensions/gsd/tools/complete-slice.js +24 -43
  150. package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -8
  151. package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
  152. package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
  153. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
  154. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
  155. package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
  156. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  157. package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
  158. package/dist/resources/extensions/gsd/uat-policy.js +17 -10
  159. package/dist/resources/extensions/gsd/uat-run.js +9 -14
  160. package/dist/resources/extensions/gsd/undo.js +8 -7
  161. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  162. package/dist/resources/extensions/gsd/unit-context-composer.js +49 -21
  163. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  164. package/dist/resources/extensions/gsd/unit-registry.js +337 -0
  165. package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
  166. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -181
  167. package/dist/resources/extensions/gsd/user-input-boundary.js +23 -0
  168. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
  169. package/dist/resources/extensions/gsd/web-app-uat.js +117 -0
  170. package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
  171. package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
  172. package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
  173. package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
  174. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  175. package/dist/resources/extensions/gsd/worktree-lifecycle.js +9 -1
  176. package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
  177. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  178. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  179. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  180. package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
  181. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  182. package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
  183. package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
  184. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  185. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  186. package/dist/resources/extensions/shared/gsd-browser-cli.js +72 -4
  187. package/dist/resources/extensions/shared/interview-ui.js +2 -2
  188. package/dist/resources/shared/claude-runtime-floor.js +182 -0
  189. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  190. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  191. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  192. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  193. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  194. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  195. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  196. package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
  197. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  198. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  199. package/dist/update-cmd.js +20 -0
  200. package/dist/web/standalone/.next/BUILD_ID +1 -1
  201. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  202. package/dist/web/standalone/.next/build-manifest.json +3 -3
  203. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  204. package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
  205. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  206. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  207. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  208. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  209. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  210. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  211. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  212. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  213. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  214. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  215. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  216. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  217. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  218. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  219. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  220. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  221. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  223. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  224. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  225. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  226. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  227. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  228. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  229. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  230. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  231. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  232. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  233. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  234. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  235. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  236. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  237. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  238. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  239. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  240. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  241. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  242. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  243. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  244. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  245. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  246. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  247. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  248. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  249. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  250. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  251. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  252. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  253. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  254. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  255. package/dist/web/standalone/.next/server/app/index.html +1 -1
  256. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  257. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  258. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  259. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  260. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  261. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  262. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  263. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  264. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  265. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  266. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  267. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  268. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  269. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  270. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  271. package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
  272. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
  273. package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
  274. package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
  275. package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
  276. package/dist/web/standalone/.next/static/chunks/796.cf859a427a2cb2ac.js +10 -0
  277. package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
  278. package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-fbea77b5f9953368.js} +1 -1
  279. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  280. package/dist/web/standalone/node_modules/postcss/lib/container.js +18 -26
  281. package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +14 -47
  282. package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
  283. package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
  284. package/dist/web/standalone/node_modules/postcss/lib/input.js +29 -54
  285. package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +37 -47
  286. package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +9 -26
  287. package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +55 -57
  288. package/dist/web/standalone/node_modules/postcss/lib/node.js +31 -99
  289. package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
  290. package/dist/web/standalone/node_modules/postcss/lib/parser.js +9 -10
  291. package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
  292. package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +11 -30
  293. package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
  294. package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
  295. package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
  296. package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +28 -69
  297. package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +2 -6
  298. package/dist/web/standalone/node_modules/postcss/package.json +48 -48
  299. package/dist/web/standalone/package.json +1 -1
  300. package/dist/web-mode.d.ts +2 -0
  301. package/dist/web-mode.js +20 -8
  302. package/dist/worktree-cli.js +3 -6
  303. package/dist/worktree-status-banner.js +7 -11
  304. package/package.json +2 -1
  305. package/packages/cloud-mcp-gateway/package.json +2 -2
  306. package/packages/contracts/dist/workflow.d.ts +4 -0
  307. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  308. package/packages/contracts/dist/workflow.js.map +1 -1
  309. package/packages/contracts/package.json +1 -1
  310. package/packages/daemon/package.json +4 -4
  311. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
  312. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
  313. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
  314. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
  315. package/packages/gsd-agent-core/package.json +5 -5
  316. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  317. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -0
  318. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  319. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  320. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +106 -40
  321. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  322. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  323. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
  324. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  325. package/packages/gsd-agent-modes/package.json +7 -7
  326. package/packages/mcp-server/dist/cli.js +6 -3
  327. package/packages/mcp-server/dist/cli.js.map +1 -1
  328. package/packages/mcp-server/dist/server.d.ts +10 -0
  329. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  330. package/packages/mcp-server/dist/server.js +8 -0
  331. package/packages/mcp-server/dist/server.js.map +1 -1
  332. package/packages/mcp-server/dist/workflow-tools.d.ts +49 -0
  333. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  334. package/packages/mcp-server/dist/workflow-tools.js +48 -22
  335. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  336. package/packages/mcp-server/package.json +3 -3
  337. package/packages/native/package.json +1 -1
  338. package/packages/pi-agent-core/package.json +1 -1
  339. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  340. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  341. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  342. package/packages/pi-ai/dist/models.generated.d.ts +455 -546
  343. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  344. package/packages/pi-ai/dist/models.generated.js +481 -599
  345. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  346. package/packages/pi-ai/package.json +1 -1
  347. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  348. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  349. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  350. package/packages/pi-coding-agent/package.json +7 -7
  351. package/packages/pi-tui/dist/components/input.js +1 -1
  352. package/packages/pi-tui/dist/components/input.js.map +1 -1
  353. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  354. package/packages/pi-tui/dist/keys.js +39 -30
  355. package/packages/pi-tui/dist/keys.js.map +1 -1
  356. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  357. package/packages/pi-tui/dist/stdin-buffer.js +22 -0
  358. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  359. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  360. package/packages/pi-tui/dist/tui.js +9 -0
  361. package/packages/pi-tui/dist/tui.js.map +1 -1
  362. package/packages/pi-tui/package.json +2 -2
  363. package/packages/rpc-client/package.json +2 -2
  364. package/pkg/package.json +1 -1
  365. package/src/resources/extensions/ask-user-questions.ts +87 -24
  366. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  367. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  368. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  369. package/src/resources/extensions/browser-tools/index.ts +71 -13
  370. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  371. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  372. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  373. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +148 -285
  374. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +268 -0
  375. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
  376. package/src/resources/extensions/github-sync/templates.ts +3 -3
  377. package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
  378. package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
  379. package/src/resources/extensions/gsd/auto/contracts.ts +32 -2
  380. package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -1
  381. package/src/resources/extensions/gsd/auto/loop.ts +83 -61
  382. package/src/resources/extensions/gsd/auto/orchestrator.ts +164 -17
  383. package/src/resources/extensions/gsd/auto/phases.ts +45 -4
  384. package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
  385. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  386. package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
  387. package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
  388. package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
  389. package/src/resources/extensions/gsd/auto-post-unit.ts +29 -10
  390. package/src/resources/extensions/gsd/auto-prompts.ts +110 -9
  391. package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
  392. package/src/resources/extensions/gsd/auto-runtime-state.ts +26 -0
  393. package/src/resources/extensions/gsd/auto-start.ts +29 -35
  394. package/src/resources/extensions/gsd/auto-timers.ts +16 -2
  395. package/src/resources/extensions/gsd/auto-tool-tracking.ts +54 -0
  396. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +19 -47
  397. package/src/resources/extensions/gsd/auto-verification.ts +7 -8
  398. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  399. package/src/resources/extensions/gsd/auto-worktree.ts +68 -384
  400. package/src/resources/extensions/gsd/auto.ts +35 -32
  401. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +3 -5
  402. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
  403. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +20 -43
  404. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  405. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  406. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +251 -161
  407. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +136 -6
  408. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  409. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  410. package/src/resources/extensions/gsd/captures.ts +5 -16
  411. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
  412. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  413. package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
  414. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  415. package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
  416. package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
  417. package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
  418. package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
  419. package/src/resources/extensions/gsd/commands-ship.ts +2 -2
  420. package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
  421. package/src/resources/extensions/gsd/crash-recovery.ts +3 -9
  422. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  423. package/src/resources/extensions/gsd/db/queries.ts +453 -0
  424. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  425. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  426. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  427. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  428. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  429. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  430. package/src/resources/extensions/gsd/db-workspace.ts +170 -0
  431. package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
  432. package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
  433. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  434. package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
  435. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  436. package/src/resources/extensions/gsd/doctor-git-checks.ts +3 -3
  437. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  438. package/src/resources/extensions/gsd/doctor.ts +15 -5
  439. package/src/resources/extensions/gsd/error-classifier.ts +12 -1
  440. package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
  441. package/src/resources/extensions/gsd/git-service.ts +1 -0
  442. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  443. package/src/resources/extensions/gsd/gsd-db.ts +185 -2373
  444. package/src/resources/extensions/gsd/guidance.ts +139 -0
  445. package/src/resources/extensions/gsd/guided-flow.ts +95 -561
  446. package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
  447. package/src/resources/extensions/gsd/markdown-renderer.ts +2 -1
  448. package/src/resources/extensions/gsd/mcp-filter.ts +4 -24
  449. package/src/resources/extensions/gsd/mcp-tool-name.ts +30 -0
  450. package/src/resources/extensions/gsd/md-importer.ts +3 -3
  451. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  452. package/src/resources/extensions/gsd/migrate/safety.ts +20 -9
  453. package/src/resources/extensions/gsd/migration-auto-check.ts +30 -5
  454. package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
  455. package/src/resources/extensions/gsd/milestone-closeout.ts +12 -4
  456. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
  457. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
  458. package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
  459. package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
  460. package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
  461. package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
  462. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  463. package/src/resources/extensions/gsd/model-router.ts +3 -0
  464. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  465. package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
  466. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  467. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  468. package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
  469. package/src/resources/extensions/gsd/paths.ts +42 -22
  470. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  471. package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
  472. package/src/resources/extensions/gsd/preferences-models.ts +10 -46
  473. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  474. package/src/resources/extensions/gsd/preferences.ts +191 -28
  475. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  476. package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
  477. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
  478. package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  479. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -1
  480. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -1
  481. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  482. package/src/resources/extensions/gsd/prompts/system.md +1 -1
  483. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  484. package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
  485. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  486. package/src/resources/extensions/gsd/publication.ts +122 -0
  487. package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
  488. package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
  489. package/src/resources/extensions/gsd/question-transport.ts +138 -0
  490. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  491. package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
  492. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  493. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  494. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  495. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
  496. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  497. package/src/resources/extensions/gsd/state.ts +19 -26
  498. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  499. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  500. package/src/resources/extensions/gsd/templates/plan.md +7 -0
  501. package/src/resources/extensions/gsd/templates/project.md +1 -0
  502. package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
  503. package/src/resources/extensions/gsd/templates/uat.md +5 -1
  504. package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
  505. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
  506. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +444 -5
  507. package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
  508. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
  509. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +133 -4
  510. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
  511. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  512. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
  513. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  514. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  515. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  516. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  517. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
  518. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  519. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  520. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
  521. package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
  522. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +46 -8
  523. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
  524. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +89 -0
  525. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
  526. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  527. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
  528. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  529. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  530. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
  531. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
  532. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
  533. package/src/resources/extensions/gsd/tests/guidance.test.ts +125 -0
  534. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  535. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
  536. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  537. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  538. package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
  539. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +143 -1
  540. package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
  541. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +25 -0
  542. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
  543. package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
  544. package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
  545. package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
  546. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  547. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
  548. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  549. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
  550. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  551. package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
  552. package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
  553. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +46 -0
  554. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  555. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
  556. package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
  557. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  558. package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
  559. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  560. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +342 -1
  561. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
  562. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -1
  563. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  564. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
  565. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  566. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +144 -7
  567. package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
  568. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +2 -1
  569. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  570. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  571. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  572. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +35 -0
  573. package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
  574. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  575. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
  576. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
  577. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +24 -6
  578. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  579. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +70 -2
  580. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  581. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +86 -1
  582. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
  583. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +193 -0
  584. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +128 -11
  585. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +2 -2
  586. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
  587. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  588. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +43 -1
  589. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  590. package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
  591. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  592. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
  593. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  594. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
  595. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
  596. package/src/resources/extensions/gsd/tests/write-gate.test.ts +121 -0
  597. package/src/resources/extensions/gsd/tool-contract.ts +86 -8
  598. package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
  599. package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
  600. package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
  601. package/src/resources/extensions/gsd/tools/complete-slice.ts +23 -58
  602. package/src/resources/extensions/gsd/tools/exec-tool.ts +5 -8
  603. package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
  604. package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
  605. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
  606. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
  607. package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
  608. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  609. package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
  610. package/src/resources/extensions/gsd/uat-policy.ts +20 -10
  611. package/src/resources/extensions/gsd/uat-run.ts +10 -14
  612. package/src/resources/extensions/gsd/undo.ts +9 -8
  613. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  614. package/src/resources/extensions/gsd/unit-context-composer.ts +97 -21
  615. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  616. package/src/resources/extensions/gsd/unit-registry.ts +412 -0
  617. package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
  618. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -191
  619. package/src/resources/extensions/gsd/user-input-boundary.ts +18 -0
  620. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
  621. package/src/resources/extensions/gsd/web-app-uat.ts +144 -0
  622. package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
  623. package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
  624. package/src/resources/extensions/gsd/workflow-tool-surface.ts +76 -0
  625. package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
  626. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  627. package/src/resources/extensions/gsd/worktree-lifecycle.ts +17 -17
  628. package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
  629. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  630. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  631. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  632. package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
  633. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  634. package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
  635. package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
  636. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  637. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  638. package/src/resources/extensions/shared/gsd-browser-cli.ts +88 -4
  639. package/src/resources/extensions/shared/interview-ui.ts +15 -2
  640. package/src/resources/shared/claude-runtime-floor.ts +248 -0
  641. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  642. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  643. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  644. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  645. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  646. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  647. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  648. package/src/resources/skills/gsd-browser/SKILL.md +1 -1
  649. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  650. package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
  651. package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
  652. package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
  653. package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
  654. package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
  655. package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
  656. /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → AOpDeK_gJHU8OZjRo31gQ}/_buildManifest.js +0 -0
  657. /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → AOpDeK_gJHU8OZjRo31gQ}/_ssgManifest.js +0 -0
@@ -16,7 +16,7 @@ import { spawnSync } from "node:child_process";
16
16
  import { nativeScanGsdTree } from "./native-parser-bridge.js";
17
17
  import { DIR_CACHE_MAX } from "./constants.js";
18
18
  import { gsdHome } from "./gsd-home.js";
19
- import { isGsdWorktreePath, resolveExternalStateProjectGsdFromWorktreePath, resolveWorktreeProjectRoot } from "./worktree-root.js";
19
+ import { findWorktreeSegment, isGsdWorktreePath, resolveExternalStateProjectGsdFromWorktreePath, resolveWorktreeProjectRoot } from "./worktree-root.js";
20
20
  // ─── Directory Listing Cache ──────────────────────────────────────────────────
21
21
  const dirEntryCache = new Map();
22
22
  const dirListCache = new Map();
@@ -139,6 +139,33 @@ export function clearPathCache() {
139
139
  nativeTreeBase = null;
140
140
  }
141
141
  // ─── Name Builders ─────────────────────────────────────────────────────────
142
+ /** Directories owned by the GSD framework — metadata, never project source. */
143
+ export const FRAMEWORK_METADATA_DIRS = [".gsd", ".planning", ".audits"];
144
+ /**
145
+ * Every artifact suffix used with the name builders below — the single source
146
+ * for the `<ID>-<SUFFIX>.md` naming vocabulary. Extend this list when a new
147
+ * artifact type is introduced; consumers (md-importer walking, pre-execution
148
+ * artifact detection) pick it up from here.
149
+ */
150
+ export const PLANNING_ARTIFACT_SUFFIXES = [
151
+ "CONTEXT",
152
+ "CONTEXT-DRAFT",
153
+ "ROADMAP",
154
+ "PLAN",
155
+ "REPLAN",
156
+ "SUMMARY",
157
+ "RESEARCH",
158
+ "VALIDATION",
159
+ "ASSESSMENT",
160
+ "UAT",
161
+ "DISCUSSION",
162
+ "EVAL-REVIEW",
163
+ "PARKED",
164
+ "VERIFICATION-FAILED",
165
+ "CONTINUE",
166
+ ];
167
+ /** Matches a bare planning-artifact file name, e.g. "M001-CONTEXT.md", "S01-PLAN.md". */
168
+ export const PLANNING_ARTIFACT_NAME_RE = new RegExp(`^[MST]\\d+-(${PLANNING_ARTIFACT_SUFFIXES.join("|")})\\.md$`, "i");
142
169
  /**
143
170
  * Build a milestone-level file name.
144
171
  * ("M001", "CONTEXT") → "M001-CONTEXT.md"
@@ -422,31 +449,17 @@ function assertNotGlobalGsdHome(basePath, result) {
422
449
  * When gsdRoot() is called with such a path, we must NOT walk up to the
423
450
  * project root's .gsd — each worktree manages its own .gsd state (#2594).
424
451
  *
425
- * Matches both forward-slash and platform-native separators to handle
426
- * Windows paths (path.sep = '\\') and normalized Unix paths.
452
+ * Layout matching is owned by worktree-root's findWorktreeSegment; this
453
+ * only adds the requirement that a non-empty worktree name follows the
454
+ * marker (the worktrees container dir itself is not a worktree).
427
455
  */
428
456
  function isInsideGsdWorktree(p) {
429
- // Match /.gsd/worktrees/<name> where <name> is the final segment or
430
- // followed by a separator. The <name> segment must be non-empty.
431
- const sepFwd = "/";
432
- const sepNative = "\\";
433
- const markers = [
434
- `${sepFwd}.gsd${sepFwd}worktrees${sepFwd}`,
435
- `${sepNative}.gsd${sepNative}worktrees${sepNative}`,
436
- ];
437
- for (const marker of markers) {
438
- const idx = p.indexOf(marker);
439
- if (idx === -1)
440
- continue;
441
- // Verify there's a non-empty worktree name after the marker
442
- const afterMarker = p.slice(idx + marker.length);
443
- // The name is everything up to the next separator (or end of string)
444
- const nameEnd = afterMarker.search(/[/\\]/);
445
- const name = nameEnd === -1 ? afterMarker : afterMarker.slice(0, nameEnd);
446
- if (name.length > 0)
447
- return true;
448
- }
449
- return false;
457
+ const normalized = p.replaceAll("\\", "/");
458
+ const segment = findWorktreeSegment(normalized);
459
+ if (!segment)
460
+ return false;
461
+ const name = normalized.slice(segment.afterWorktrees).split("/")[0];
462
+ return name.length > 0;
450
463
  }
451
464
  function probeGsdRoot(rawBasePath) {
452
465
  const contract = resolveGsdPathContract(rawBasePath);
@@ -20,6 +20,7 @@ import { spawn } from "node:child_process";
20
20
  import { homedir } from "node:os";
21
21
  import { isAbsolute, relative, resolve } from "node:path";
22
22
  import { validateVerificationCommand } from "./verification-gate.js";
23
+ import { FRAMEWORK_METADATA_DIRS, PLANNING_ARTIFACT_NAME_RE } from "./paths.js";
23
24
  const NPM_COMMAND = process.platform === "win32" ? "npm.cmd" : "npm";
24
25
  function inputExistsOnDisk(normalizedFile, basePath, context) {
25
26
  if (existsSync(resolve(basePath, normalizedFile)))
@@ -510,6 +511,10 @@ export function checkFilePathConsistency(tasks, basePath, context) {
510
511
  continue;
511
512
  if (!shouldValidateInputAsPath(file))
512
513
  continue;
514
+ // Planning-artifact references are owned by checkPlanningArtifactReferences,
515
+ // which reports a precise removal message instead of "doesn't exist".
516
+ if (isPlanningArtifactReference(file, basePath, context))
517
+ continue;
513
518
  // Normalize path for consistent comparison
514
519
  const normalizedFile = toComparisonPath(file, basePath);
515
520
  if (containsGlobPattern(normalizedFile))
@@ -546,6 +551,71 @@ export function checkFilePathConsistency(tasks, basePath, context) {
546
551
  }
547
552
  return results;
548
553
  }
554
+ // ─── Planning Artifact Reference Check ───────────────────────────────────────
555
+ function isFrameworkMetadataPath(normalizedFile) {
556
+ return normalizedFile.split("/").some((segment) => FRAMEWORK_METADATA_DIRS.includes(segment.toLowerCase()));
557
+ }
558
+ /**
559
+ * True when a task IO entry references a GSD planning artifact.
560
+ *
561
+ * Task inputs are source files only — planning artifacts are projections of DB
562
+ * state that the framework preloads as composed context (see CONTEXT.md "Task
563
+ * Input"). Two triggers, deliberately different in strictness:
564
+ *
565
+ * - Any path entering framework-owned metadata (.gsd/, .planning/, .audits/)
566
+ * is always a violation, even when the file exists.
567
+ * - A bare artifact-style basename (M001-CONTEXT.md, S01-PLAN.md, …) is a
568
+ * violation only when it does NOT resolve to a real file. When such a file
569
+ * genuinely exists in the source tree (e.g. a fixture), it is a source file
570
+ * and stays legal; a path with directory components is likewise left to the
571
+ * ordinary existence checks.
572
+ */
573
+ function isPlanningArtifactReference(rawEntry, basePath, context) {
574
+ if (!shouldValidateInputAsPath(rawEntry))
575
+ return false;
576
+ const normalized = toComparisonPath(rawEntry, basePath);
577
+ if (isFrameworkMetadataPath(normalized))
578
+ return true;
579
+ return (!normalized.includes("/") &&
580
+ PLANNING_ARTIFACT_NAME_RE.test(normalized) &&
581
+ !inputExistsOnDisk(normalized, basePath, context));
582
+ }
583
+ /**
584
+ * Block GSD planning artifacts in task IO fields (inputs, files, expectedOutput).
585
+ *
586
+ * For inputs/files the violation smuggles a projection into the executor's
587
+ * preloaded source context; for expectedOutput it promises a write the runtime
588
+ * write-gate would reject mid-execution. Both get a precise message so the
589
+ * planning retry steers toward *removing* the reference, not creating the file.
590
+ * checkFilePathConsistency and checkTaskOrdering skip entries this check owns.
591
+ */
592
+ export function checkPlanningArtifactReferences(tasks, basePath, context) {
593
+ const results = [];
594
+ for (const task of tasks) {
595
+ const fields = [
596
+ { label: "inputs", entries: task.inputs },
597
+ { label: "files", entries: task.files },
598
+ { label: "expectedOutput", entries: task.expected_output },
599
+ ];
600
+ for (const { label, entries } of fields) {
601
+ for (const file of entries) {
602
+ if (!isPlanningArtifactReference(file, basePath, context))
603
+ continue;
604
+ const message = label === "expectedOutput"
605
+ ? `Task ${task.id} lists '${file}' in expectedOutput — GSD planning artifacts are written by workflow tools (e.g. gsd_summary_save), never by tasks; remove it`
606
+ : `Task ${task.id} lists '${file}' in ${label} — GSD planning artifacts are projections preloaded as context, never task ${label}; remove it`;
607
+ results.push({
608
+ category: "file",
609
+ target: file,
610
+ passed: false,
611
+ message,
612
+ blocking: true,
613
+ });
614
+ }
615
+ }
616
+ }
617
+ return results;
618
+ }
549
619
  // ─── Task Ordering Check ─────────────────────────────────────────────────────
550
620
  /**
551
621
  * Detect impossible task ordering: task N reads a file that task N+M creates.
@@ -583,6 +653,10 @@ export function checkTaskOrdering(tasks, basePath, context) {
583
653
  continue;
584
654
  if (!shouldValidateInputAsPath(file))
585
655
  continue;
656
+ // Owned by checkPlanningArtifactReferences — avoid a duplicate sequence
657
+ // finding on top of the removal message.
658
+ if (isPlanningArtifactReference(file, basePath, context))
659
+ continue;
586
660
  const normalizedFile = toComparisonPath(file, basePath);
587
661
  if (containsGlobPattern(normalizedFile))
588
662
  continue;
@@ -611,6 +685,21 @@ export function checkTaskOrdering(tasks, basePath, context) {
611
685
  }
612
686
  return results;
613
687
  }
688
+ // ─── Shared Path-Check Composition ───────────────────────────────────────────
689
+ /**
690
+ * The synchronous path-shaped checks, in order. One list shared by the
691
+ * plan-persist gate (gsd_plan_slice) and the dispatch gate
692
+ * (runPreExecutionChecks) so the two cannot drift — the checks coordinate
693
+ * ownership of planning-artifact entries via isPlanningArtifactReference
694
+ * skips, which only works when they run as a set.
695
+ */
696
+ export function runTaskPathChecks(tasks, basePath, context) {
697
+ return [
698
+ ...checkPlanningArtifactReferences(tasks, basePath, context),
699
+ ...checkFilePathConsistency(tasks, basePath, context),
700
+ ...checkTaskOrdering(tasks, basePath, context),
701
+ ];
702
+ }
614
703
  /**
615
704
  * Extract function signatures from code blocks in task description.
616
705
  * Uses heuristic regex — not an AST parser.
@@ -741,11 +830,10 @@ export async function runPreExecutionChecks(tasks, basePath, context) {
741
830
  const startTime = Date.now();
742
831
  const allChecks = [];
743
832
  // Run sync checks first
744
- const fileChecks = checkFilePathConsistency(tasks, basePath, context);
745
- const orderingChecks = checkTaskOrdering(tasks, basePath, context);
833
+ const pathChecks = runTaskPathChecks(tasks, basePath, context);
746
834
  const contractChecks = checkInterfaceContracts(tasks, basePath);
747
835
  const verificationChecks = checkVerificationCommands(tasks);
748
- allChecks.push(...fileChecks, ...orderingChecks, ...contractChecks, ...verificationChecks);
836
+ allChecks.push(...pathChecks, ...contractChecks, ...verificationChecks);
749
837
  // Run async package checks
750
838
  const packageChecks = await checkPackageExistence(tasks, basePath);
751
839
  allChecks.push(...packageChecks);
@@ -0,0 +1,67 @@
1
+ import { loadGlobalGSDPreferences, loadProjectGSDPreferences, } from "./preferences.js";
2
+ const notifiedPreferenceDiagnostics = new Set();
3
+ export function collectPreferenceDiagnostics(basePath) {
4
+ const diagnostics = [
5
+ ...(loadGlobalGSDPreferences()?.diagnostics ?? []),
6
+ ...(loadProjectGSDPreferences(basePath)?.diagnostics ?? []),
7
+ ];
8
+ const seen = new Set();
9
+ const unique = [];
10
+ for (const diagnostic of diagnostics) {
11
+ const signature = preferenceDiagnosticSignature(diagnostic);
12
+ if (seen.has(signature))
13
+ continue;
14
+ seen.add(signature);
15
+ unique.push(diagnostic);
16
+ }
17
+ return unique;
18
+ }
19
+ export function formatPreferenceDiagnostic(diagnostic) {
20
+ const scope = diagnostic.scope === "global" ? "global" : "project";
21
+ const level = diagnostic.severity === "error" ? "error" : "warning";
22
+ const heading = diagnostic.kind === "parse"
23
+ ? `GSD ${scope} preferences ${level}: ${diagnostic.path} could not be parsed.`
24
+ : `GSD ${scope} preferences ${level}: ${diagnostic.path} contains invalid settings.`;
25
+ const detail = formatPreferenceDiagnosticDetail(diagnostic);
26
+ const impact = diagnostic.ignored
27
+ ? "Preferences from this file were ignored; auto-mode may be using defaults."
28
+ : "Invalid settings were ignored or sanitized; auto-mode may be using defaults for them.";
29
+ return `${heading}\n${detail}\n${impact}\nRun /gsd doctor for details.`;
30
+ }
31
+ export function formatPreferenceDiagnosticDetail(diagnostic) {
32
+ if (diagnostic.line !== undefined && diagnostic.column !== undefined) {
33
+ return `YAML error at line ${diagnostic.line}, column ${diagnostic.column}: ${diagnostic.message}`;
34
+ }
35
+ return diagnostic.message;
36
+ }
37
+ export function notifyPreferenceDiagnostics(ctx, basePath, options) {
38
+ let notified = 0;
39
+ for (const diagnostic of collectPreferenceDiagnostics(basePath)) {
40
+ const signature = preferenceDiagnosticNotificationSignature(diagnostic, options?.surface);
41
+ if (notifiedPreferenceDiagnostics.has(signature))
42
+ continue;
43
+ notifiedPreferenceDiagnostics.add(signature);
44
+ ctx.ui.notify(formatPreferenceDiagnostic(diagnostic), diagnostic.severity === "error" ? "error" : "warning");
45
+ notified++;
46
+ }
47
+ return notified;
48
+ }
49
+ export function _resetPreferenceDiagnosticNotificationsForTests() {
50
+ notifiedPreferenceDiagnostics.clear();
51
+ }
52
+ function preferenceDiagnosticSignature(diagnostic) {
53
+ return [
54
+ diagnostic.path,
55
+ diagnostic.scope,
56
+ diagnostic.severity,
57
+ diagnostic.kind,
58
+ diagnostic.message,
59
+ diagnostic.line ?? "",
60
+ diagnostic.column ?? "",
61
+ diagnostic.ignored === true ? "ignored" : "",
62
+ diagnostic.sanitized === true ? "sanitized" : "",
63
+ ].join("\u0000");
64
+ }
65
+ function preferenceDiagnosticNotificationSignature(diagnostic, surface = "default") {
66
+ return `${surface}\u0000${preferenceDiagnosticSignature(diagnostic)}`;
67
+ }
@@ -11,6 +11,7 @@ import { join } from "node:path";
11
11
  import { gsdHome } from "./gsd-home.js";
12
12
  import { canonicalModelForTier, defaultRoutingConfig, resolveModelForTier } from "./model-router.js";
13
13
  import { loadEffectiveGSDPreferences, getGlobalGSDPreferencesPath } from "./preferences.js";
14
+ import { getUnitPhaseChain } from "./unit-registry.js";
14
15
  /**
15
16
  * Resolve which model ID to use for a given auto-mode unit type.
16
17
  * Returns undefined if no model preference is set for this unit type.
@@ -29,53 +30,18 @@ export function resolveModelForUnit(unitType) {
29
30
  * (`resolveThinkingLevelForUnit`) so the two never drift (ADR-026).
30
31
  */
31
32
  export function phaseChainForUnit(unitType) {
32
- switch (unitType) {
33
- case "research-milestone":
34
- case "research-slice":
35
- // Deep-mode project research orchestrator. Reads PROJECT.md / REQUIREMENTS.md
36
- // and fans out research subagents. Routes to the research bucket.
37
- case "research-project":
38
- return ["research"];
39
- case "plan-milestone":
40
- case "plan-slice":
41
- case "refine-slice":
42
- case "replan-slice":
43
- return ["planning"];
44
- // Deep-mode project-level discussion units route to the same model bucket
45
- // as milestone-level discussion (interactive interview style). Workflow
46
- // preferences and research-decision are tiny ask_user_questions style units
47
- // that share the discuss bucket because they are conversational. All fall
48
- // back to planning when no `discuss` bucket is set.
49
- case "discuss-milestone":
50
- case "discuss-slice":
51
- case "discuss-project":
52
- case "discuss-requirements":
53
- case "workflow-preferences":
54
- case "research-decision":
55
- return ["discuss", "planning"];
56
- case "execute-task":
57
- case "reactive-execute":
58
- return ["execution"];
59
- case "execute-task-simple":
60
- return ["execution_simple", "execution"];
61
- case "complete-slice":
62
- case "complete-milestone":
63
- case "worktree-merge":
64
- return ["completion"];
65
- case "run-uat":
66
- return ["uat", "completion"];
67
- case "reassess-roadmap":
68
- case "rewrite-docs":
69
- case "gate-evaluate":
70
- case "validate-milestone":
71
- return ["validation", "planning"];
72
- default:
73
- // Subagent unit types (e.g., "subagent", "subagent/scout")
74
- if (unitType === "subagent" || unitType.startsWith("subagent/")) {
75
- return ["subagent"];
76
- }
77
- return undefined;
33
+ // Unit types declare their chain on their Unit Descriptor (ADR-033).
34
+ const declared = getUnitPhaseChain(unitType);
35
+ if (declared)
36
+ return [...declared];
37
+ // Dispatch types without a Unit Descriptor.
38
+ if (unitType === "worktree-merge")
39
+ return ["completion"];
40
+ // Subagent unit types (e.g., "subagent", "subagent/scout")
41
+ if (unitType === "subagent" || unitType.startsWith("subagent/")) {
42
+ return ["subagent"];
78
43
  }
44
+ return undefined;
79
45
  }
80
46
  /**
81
47
  * Find the phase bucket whose `models` entry wins the chain for a unit, plus
@@ -98,37 +98,41 @@ export function normalizePreferencesShape(loaded) {
98
98
  }
99
99
  // ─── Loading ────────────────────────────────────────────────────────────────
100
100
  export function loadGlobalGSDPreferences() {
101
- return loadPreferencesFile(globalPreferencesPath(), "global")
102
- ?? loadPreferencesFile(legacyGlobalPreferencesPathLowercase(), "global")
103
- ?? loadPreferencesFile(legacyGlobalPreferencesPath(), "global");
101
+ return loadFirstUsablePreferencesFile([
102
+ globalPreferencesPath(),
103
+ legacyGlobalPreferencesPathLowercase(),
104
+ legacyGlobalPreferencesPath(),
105
+ ], "global");
104
106
  }
105
107
  export function loadProjectGSDPreferences(basePath) {
106
- return loadPreferencesFile(projectPreferencesPath(basePath), "project")
107
- ?? loadPreferencesFile(legacyProjectPreferencesPathLowercase(basePath), "project");
108
+ return loadFirstUsablePreferencesFile([
109
+ projectPreferencesPath(basePath),
110
+ legacyProjectPreferencesPathLowercase(basePath),
111
+ ], "project");
108
112
  }
109
113
  export function loadEffectiveGSDPreferences(basePath, opts) {
110
114
  const globalPreferences = loadGlobalGSDPreferences();
111
115
  const projectPreferences = loadProjectGSDPreferences(basePath);
112
- const projectHasPlanningDepth = projectPreferences?.preferences.planning_depth !== undefined;
113
- if (!globalPreferences && !projectPreferences)
116
+ const effectiveGlobalPreferences = globalPreferences?.ignored ? null : globalPreferences;
117
+ const effectiveProjectPreferences = projectPreferences?.ignored ? null : projectPreferences;
118
+ const projectHasPlanningDepth = effectiveProjectPreferences?.preferences.planning_depth !== undefined;
119
+ if (!effectiveGlobalPreferences && !effectiveProjectPreferences)
114
120
  return null;
115
121
  let result;
116
- if (!globalPreferences) {
117
- result = projectPreferences;
122
+ if (!effectiveGlobalPreferences) {
123
+ result = effectiveProjectPreferences;
118
124
  }
119
- else if (!projectPreferences) {
120
- result = globalPreferences;
125
+ else if (!effectiveProjectPreferences) {
126
+ result = mergePreferenceMetadata(effectiveGlobalPreferences, projectPreferences);
121
127
  }
122
128
  else {
123
- const mergedWarnings = [
124
- ...(globalPreferences.warnings ?? []),
125
- ...(projectPreferences.warnings ?? []),
126
- ];
129
+ const metadata = mergePreferenceMetadata(effectiveGlobalPreferences, effectiveProjectPreferences);
127
130
  result = {
128
- path: projectPreferences.path,
131
+ path: effectiveProjectPreferences.path,
129
132
  scope: "project",
130
- preferences: mergePreferences(globalPreferences.preferences, projectPreferences.preferences),
131
- ...(mergedWarnings.length > 0 ? { warnings: mergedWarnings } : {}),
133
+ preferences: mergePreferences(effectiveGlobalPreferences.preferences, effectiveProjectPreferences.preferences),
134
+ ...(metadata.warnings ? { warnings: metadata.warnings } : {}),
135
+ ...(metadata.diagnostics ? { diagnostics: metadata.diagnostics } : {}),
132
136
  };
133
137
  }
134
138
  // Apply token-profile defaults as the lowest-priority layer so that
@@ -152,6 +156,35 @@ export function loadEffectiveGSDPreferences(basePath, opts) {
152
156
  result = stripInheritedPlanningDepth(result, projectHasPlanningDepth);
153
157
  return result;
154
158
  }
159
+ function mergePreferenceMetadata(primary, secondary) {
160
+ const mergedWarnings = [
161
+ ...(primary.warnings ?? []),
162
+ ...(secondary?.warnings ?? []),
163
+ ];
164
+ const mergedDiagnostics = [
165
+ ...(primary.diagnostics ?? []),
166
+ ...(secondary?.diagnostics ?? []),
167
+ ];
168
+ return {
169
+ ...primary,
170
+ ...(mergedWarnings.length > 0 ? { warnings: mergedWarnings } : {}),
171
+ ...(mergedDiagnostics.length > 0 ? { diagnostics: mergedDiagnostics } : {}),
172
+ };
173
+ }
174
+ function loadFirstUsablePreferencesFile(paths, scope) {
175
+ let ignoredPreferences = null;
176
+ for (const path of paths) {
177
+ const loaded = loadPreferencesFile(path, scope);
178
+ if (!loaded)
179
+ continue;
180
+ if (!loaded.ignored)
181
+ return mergePreferenceMetadata(loaded, ignoredPreferences);
182
+ ignoredPreferences = ignoredPreferences
183
+ ? mergePreferenceMetadata(ignoredPreferences, loaded)
184
+ : loaded;
185
+ }
186
+ return ignoredPreferences;
187
+ }
155
188
  function stripInheritedPlanningDepth(loaded, projectHasPlanningDepth) {
156
189
  if (projectHasPlanningDepth || loaded.preferences.planning_depth === undefined) {
157
190
  return loaded;
@@ -167,16 +200,39 @@ function loadPreferencesFile(path, scope) {
167
200
  if (!existsSync(path))
168
201
  return null;
169
202
  const raw = readFileSync(path, "utf-8");
170
- const preferences = parsePreferencesMarkdown(raw);
171
- if (!preferences)
203
+ const parsed = parsePreferencesMarkdownWithDiagnostics(raw);
204
+ if (!parsed.preferences && parsed.diagnostics.length === 0)
172
205
  return null;
206
+ const ignored = parsed.diagnostics.some((diagnostic) => diagnostic.ignored === true);
207
+ const preferences = parsed.preferences ?? {};
173
208
  const validation = validatePreferences(preferences);
174
209
  const allWarnings = [...validation.warnings, ...validation.errors];
210
+ const diagnostics = [
211
+ ...parsed.diagnostics.map((diagnostic) => ({ ...diagnostic, path, scope })),
212
+ ...validation.errors.map((message) => ({
213
+ path,
214
+ scope,
215
+ severity: "error",
216
+ kind: "validation",
217
+ message,
218
+ sanitized: true,
219
+ })),
220
+ ...validation.warnings.map((message) => ({
221
+ path,
222
+ scope,
223
+ severity: "warning",
224
+ kind: "validation",
225
+ message,
226
+ sanitized: true,
227
+ })),
228
+ ];
175
229
  return {
176
230
  path,
177
231
  scope,
178
232
  preferences: validation.preferences,
233
+ ...(ignored ? { ignored: true } : {}),
179
234
  ...(allWarnings.length > 0 ? { warnings: allWarnings } : {}),
235
+ ...(diagnostics.length > 0 ? { diagnostics } : {}),
180
236
  };
181
237
  }
182
238
  let _warnedUnrecognizedFormat = false;
@@ -189,20 +245,35 @@ export function _resetParseWarningFlag() {
189
245
  }
190
246
  /** @internal Exported for testing only */
191
247
  export function parsePreferencesMarkdown(content) {
248
+ return parsePreferencesMarkdownWithDiagnostics(content).preferences;
249
+ }
250
+ function parsePreferencesMarkdownWithDiagnostics(content) {
192
251
  // Use indexOf instead of [\s\S]*? regex to avoid backtracking (#468)
193
252
  const startMarker = content.startsWith('---\r\n') ? '---\r\n' : '---\n';
194
253
  if (content.startsWith(startMarker)) {
195
254
  const searchStart = startMarker.length;
196
255
  const endIdx = content.indexOf('\n---', searchStart);
197
- if (endIdx === -1)
198
- return null;
256
+ if (endIdx === -1) {
257
+ return {
258
+ preferences: null,
259
+ diagnostics: [{
260
+ severity: "error",
261
+ kind: "parse",
262
+ message: "preferences frontmatter is missing a closing --- delimiter",
263
+ ignored: true,
264
+ }],
265
+ };
266
+ }
199
267
  const block = content.slice(searchStart, endIdx);
200
- return parseFrontmatterBlock(block.replace(/\r/g, ''));
268
+ return parseFrontmatterBlockWithDiagnostics(block.replace(/\r/g, ''), 1);
201
269
  }
202
270
  // Fallback: heading+list format (e.g. "## Git\n- isolation: none") (#2036)
203
271
  // GSD agents may write preferences files without frontmatter delimiters.
204
272
  if (/^##\s+\w/m.test(content)) {
205
- return parseHeadingListFormat(content);
273
+ return {
274
+ preferences: parseHeadingListFormat(content),
275
+ diagnostics: [],
276
+ };
206
277
  }
207
278
  // Warn when a non-empty file exists but lacks frontmatter delimiters (#2036).
208
279
  if (content.trim().length > 0 && !_warnedUnrecognizedFormat) {
@@ -210,16 +281,37 @@ export function parsePreferencesMarkdown(content) {
210
281
  console.warn("[GSD] Warning: preferences file has unrecognized format — content does not use YAML frontmatter delimiters (---). " +
211
282
  "Wrap your preferences in --- fences. See https://github.com/open-gsd/gsd-pi/issues/2036");
212
283
  }
213
- return null;
284
+ return {
285
+ preferences: null,
286
+ diagnostics: content.trim().length > 0
287
+ ? [{
288
+ severity: "error",
289
+ kind: "parse",
290
+ message: "preferences file has unrecognized format; expected YAML frontmatter delimiters (---) or markdown preference sections",
291
+ ignored: true,
292
+ }]
293
+ : [],
294
+ };
214
295
  }
215
296
  let _warnedFrontmatterParse = false;
216
- function parseFrontmatterBlock(frontmatter) {
297
+ function parseFrontmatterBlockWithDiagnostics(frontmatter, lineOffset) {
217
298
  try {
218
299
  const parsed = parseYaml(frontmatter);
219
300
  if (typeof parsed !== 'object' || parsed === null) {
220
- return {};
301
+ return {
302
+ preferences: {},
303
+ diagnostics: [{
304
+ severity: "error",
305
+ kind: "validation",
306
+ message: "preferences frontmatter must be a YAML object",
307
+ ignored: true,
308
+ }],
309
+ };
221
310
  }
222
- return normalizeParsedPreferences(parsed);
311
+ return {
312
+ preferences: normalizeParsedPreferences(parsed),
313
+ diagnostics: [],
314
+ };
223
315
  }
224
316
  catch (e) {
225
317
  // Warn at most once per session to avoid flooding TUI (#3376)
@@ -227,9 +319,35 @@ function parseFrontmatterBlock(frontmatter) {
227
319
  _warnedFrontmatterParse = true;
228
320
  logWarning("guided", `YAML parse error in preferences frontmatter (suppressing further): ${e.message}`);
229
321
  }
230
- return {};
322
+ const location = extractYamlErrorLocation(e, lineOffset);
323
+ return {
324
+ preferences: {},
325
+ diagnostics: [{
326
+ severity: "error",
327
+ kind: "parse",
328
+ message: cleanYamlErrorMessage(e),
329
+ ...(location.line !== undefined ? { line: location.line } : {}),
330
+ ...(location.column !== undefined ? { column: location.column } : {}),
331
+ ignored: true,
332
+ }],
333
+ };
231
334
  }
232
335
  }
336
+ function cleanYamlErrorMessage(error) {
337
+ const message = error instanceof Error ? error.message : String(error);
338
+ const firstLine = message.split("\n")[0]?.trim() ?? "unknown YAML parse error";
339
+ return firstLine.replace(/\s+at line \d+, column \d+:?$/, "");
340
+ }
341
+ function extractYamlErrorLocation(error, lineOffset) {
342
+ const linePos = error?.linePos;
343
+ const first = Array.isArray(linePos) ? linePos[0] : undefined;
344
+ const line = typeof first?.line === "number" ? first.line + lineOffset : undefined;
345
+ const column = typeof first?.col === "number" ? first.col : undefined;
346
+ return {
347
+ ...(line !== undefined ? { line } : {}),
348
+ ...(column !== undefined ? { column } : {}),
349
+ };
350
+ }
233
351
  function normalizeParsedPreferences(preferences) {
234
352
  const remoteQuestions = preferences.remote_questions;
235
353
  if (remoteQuestions && typeof remoteQuestions === "object" && typeof remoteQuestions.channel_id === "number") {
@@ -581,6 +699,20 @@ export function getIsolationMode(basePath) {
581
699
  return "branch";
582
700
  return "none"; // default — no isolation, work on current branch
583
701
  }
702
+ /**
703
+ * Resolve the isolation mode a unit actually runs under. A session whose
704
+ * worktree isolation has degraded (worktree creation failed) falls back to
705
+ * the milestone branch in the project root, so configured "worktree" becomes
706
+ * effective "branch". A stranded-work recovery session likewise runs under
707
+ * the adopted mode (`strandedRecoveryIsolationMode`) rather than the
708
+ * configured one until the recovered milestone merges — adopting the
709
+ * milestone branch in the project root is intentional, not degraded.
710
+ */
711
+ export function resolveEffectiveUnitIsolationMode(configuredMode, isolationDegraded, strandedRecoveryIsolationMode = null) {
712
+ if (configuredMode === "worktree" && isolationDegraded)
713
+ return "branch";
714
+ return strandedRecoveryIsolationMode ?? configuredMode;
715
+ }
584
716
  export function resolveParallelConfig(prefs) {
585
717
  return {
586
718
  enabled: prefs?.parallel?.enabled ?? false,
@@ -37,6 +37,7 @@ Use `subagent` only when useful: reviewer, security, or tester. Apply findings b
37
37
  9. If requirement status changed, call `gsd_requirement_update`; do not write `.gsd/REQUIREMENTS.md` directly.
38
38
  10. Prepare `gsd_slice_complete` content with camelCase fields `milestoneId`, `sliceId`, `sliceTitle`, `oneLiner`, `narrative`, `verification`, and `uatContent`.
39
39
  11. Draft concrete UAT with preconditions, steps, expected outcomes, edge cases, and UAT Type.
40
+ **Web apps:** when inlined Web App UAT guidance is present, declare `browser-executable` or `runtime-executable` (not `artifact-driven`) for localhost/browser/screenshot steps; include dev-server preconditions and name Playwright specs when they exist.
40
41
  12. Review the inlined task-summary excerpts for DECISIONS.md/KNOWLEDGE.md-worthy decisions and gotchas. Read full `*-SUMMARY.md` only if needed. Capture with `capture_thought`; do not append knowledge files.
41
42
  13. When verification passes, call `gsd_slice_complete`. The DB-backed tool is the canonical write path. Do **not** manually write `{{sliceSummaryPath}}`. Do **not** manually write `{{sliceUatPath}}`. Do not edit roadmap checkboxes.
42
43
  14. Do not run git commands.
@@ -32,6 +32,8 @@ You execute. The inlined task plan is authoritative. Verify referenced files and
32
32
  - Prior task summaries:
33
33
  {{priorTaskLines}}
34
34
 
35
+ {{onDemandContext}}
36
+
35
37
  ## Execution Rules
36
38
 
37
39
  1. Tersely narrate transitions, decisions, and verification outcomes between tool-call clusters.