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

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 (530) hide show
  1. package/dist/cli-web-branch.d.ts +2 -0
  2. package/dist/cli-web-branch.js +9 -2
  3. package/dist/help-text.js +5 -0
  4. package/dist/resources/.managed-resources-content-hash +1 -1
  5. package/dist/resources/extensions/ask-user-questions.js +78 -23
  6. package/dist/resources/extensions/bg-shell/utilities.js +2 -2
  7. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  8. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +92 -230
  9. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
  10. package/dist/resources/extensions/github-sync/templates.js +3 -3
  11. package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
  12. package/dist/resources/extensions/gsd/auto/loop.js +74 -56
  13. package/dist/resources/extensions/gsd/auto/orchestrator.js +142 -15
  14. package/dist/resources/extensions/gsd/auto/phases.js +34 -4
  15. package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
  16. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  17. package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
  18. package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
  19. package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
  20. package/dist/resources/extensions/gsd/auto-post-unit.js +12 -9
  21. package/dist/resources/extensions/gsd/auto-prompts.js +81 -8
  22. package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
  23. package/dist/resources/extensions/gsd/auto-runtime-state.js +14 -0
  24. package/dist/resources/extensions/gsd/auto-start.js +20 -36
  25. package/dist/resources/extensions/gsd/auto-timers.js +16 -2
  26. package/dist/resources/extensions/gsd/auto-tool-tracking.js +32 -0
  27. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +4 -29
  28. package/dist/resources/extensions/gsd/auto-verification.js +7 -7
  29. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  30. package/dist/resources/extensions/gsd/auto-worktree.js +34 -289
  31. package/dist/resources/extensions/gsd/auto.js +15 -14
  32. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
  33. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +20 -43
  34. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  35. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +131 -140
  36. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +89 -8
  37. package/dist/resources/extensions/gsd/captures.js +5 -13
  38. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
  39. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  40. package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
  41. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  42. package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
  43. package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
  44. package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
  45. package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
  46. package/dist/resources/extensions/gsd/commands-ship.js +2 -2
  47. package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
  48. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  49. package/dist/resources/extensions/gsd/db/queries.js +372 -0
  50. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  51. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  52. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  53. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  54. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  55. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  56. package/dist/resources/extensions/gsd/db-workspace.js +103 -0
  57. package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
  58. package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
  59. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  60. package/dist/resources/extensions/gsd/doctor-environment.js +8 -10
  61. package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -3
  62. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +9 -2
  63. package/dist/resources/extensions/gsd/doctor.js +16 -9
  64. package/dist/resources/extensions/gsd/error-classifier.js +1 -1
  65. package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
  66. package/dist/resources/extensions/gsd/git-service.js +1 -0
  67. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  68. package/dist/resources/extensions/gsd/gsd-db.js +183 -2048
  69. package/dist/resources/extensions/gsd/guided-flow.js +68 -471
  70. package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
  71. package/dist/resources/extensions/gsd/markdown-renderer.js +2 -1
  72. package/dist/resources/extensions/gsd/mcp-filter.js +2 -1
  73. package/dist/resources/extensions/gsd/mcp-tool-name.js +26 -0
  74. package/dist/resources/extensions/gsd/md-importer.js +4 -3
  75. package/dist/resources/extensions/gsd/migrate/safety.js +19 -11
  76. package/dist/resources/extensions/gsd/migration-auto-check.js +27 -5
  77. package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
  78. package/dist/resources/extensions/gsd/milestone-closeout.js +12 -4
  79. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
  80. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
  81. package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
  82. package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
  83. package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
  84. package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
  85. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  86. package/dist/resources/extensions/gsd/model-router.js +3 -0
  87. package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
  88. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  89. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +7 -5
  90. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
  91. package/dist/resources/extensions/gsd/paths.js +10 -24
  92. package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
  93. package/dist/resources/extensions/gsd/preferences.js +161 -29
  94. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  95. package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
  96. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
  97. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  98. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -0
  99. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -0
  100. package/dist/resources/extensions/gsd/prompts/system.md +1 -1
  101. package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
  102. package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
  103. package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
  104. package/dist/resources/extensions/gsd/question-transport.js +86 -0
  105. package/dist/resources/extensions/gsd/recovery-classification.js +12 -1
  106. package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
  107. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  108. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  109. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  110. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
  111. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  112. package/dist/resources/extensions/gsd/state.js +13 -5
  113. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  114. package/dist/resources/extensions/gsd/templates/plan.md +7 -0
  115. package/dist/resources/extensions/gsd/templates/project.md +1 -0
  116. package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
  117. package/dist/resources/extensions/gsd/templates/uat.md +5 -1
  118. package/dist/resources/extensions/gsd/tool-contract.js +52 -8
  119. package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
  120. package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
  121. package/dist/resources/extensions/gsd/tools/complete-slice.js +24 -43
  122. package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -5
  123. package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
  124. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
  125. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
  126. package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
  127. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  128. package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
  129. package/dist/resources/extensions/gsd/uat-policy.js +16 -10
  130. package/dist/resources/extensions/gsd/uat-run.js +9 -14
  131. package/dist/resources/extensions/gsd/undo.js +8 -7
  132. package/dist/resources/extensions/gsd/unit-context-composer.js +40 -20
  133. package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
  134. package/dist/resources/extensions/gsd/unit-tool-contracts.js +2 -1
  135. package/dist/resources/extensions/gsd/user-input-boundary.js +23 -0
  136. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
  137. package/dist/resources/extensions/gsd/web-app-uat.js +80 -0
  138. package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
  139. package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
  140. package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
  141. package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
  142. package/dist/resources/extensions/gsd/worktree-git-recovery.js +287 -0
  143. package/dist/resources/extensions/gsd/worktree-lifecycle.js +9 -1
  144. package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
  145. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  146. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  147. package/dist/resources/extensions/gsd/worktree-root.js +17 -6
  148. package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
  149. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -10
  150. package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
  151. package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
  152. package/dist/resources/extensions/shared/interview-ui.js +2 -2
  153. package/dist/resources/shared/claude-runtime-floor.js +182 -0
  154. package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
  155. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  156. package/dist/update-cmd.js +20 -0
  157. package/dist/web/standalone/.next/BUILD_ID +1 -1
  158. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  159. package/dist/web/standalone/.next/build-manifest.json +3 -3
  160. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  161. package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
  162. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  163. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  164. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  166. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  167. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  169. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  171. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  172. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  174. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  176. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  178. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  179. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  183. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  184. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  185. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  186. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  187. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  189. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  191. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  195. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  197. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  201. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  202. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  203. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  204. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  205. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  207. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  208. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  209. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  210. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  211. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  212. package/dist/web/standalone/.next/server/app/index.html +1 -1
  213. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  214. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  215. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  216. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  217. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  218. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  219. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  220. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  221. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  222. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  224. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  225. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  226. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  227. package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
  228. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
  229. package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
  230. package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
  231. package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
  232. package/dist/web/standalone/.next/static/chunks/796.cf859a427a2cb2ac.js +10 -0
  233. package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
  234. package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-fbea77b5f9953368.js} +1 -1
  235. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  236. package/dist/web-mode.d.ts +2 -0
  237. package/dist/web-mode.js +20 -8
  238. package/dist/worktree-status-banner.js +7 -3
  239. package/package.json +2 -1
  240. package/packages/cloud-mcp-gateway/package.json +2 -2
  241. package/packages/contracts/package.json +1 -1
  242. package/packages/daemon/package.json +4 -4
  243. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
  244. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
  245. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
  246. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
  247. package/packages/gsd-agent-core/package.json +5 -5
  248. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  249. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -0
  250. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  251. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  252. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +106 -40
  253. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  254. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  255. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
  256. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  257. package/packages/gsd-agent-modes/package.json +7 -7
  258. package/packages/mcp-server/dist/server.d.ts +10 -0
  259. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  260. package/packages/mcp-server/dist/server.js +8 -0
  261. package/packages/mcp-server/dist/server.js.map +1 -1
  262. package/packages/mcp-server/dist/workflow-tools.d.ts +41 -0
  263. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  264. package/packages/mcp-server/dist/workflow-tools.js +32 -22
  265. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  266. package/packages/mcp-server/package.json +3 -3
  267. package/packages/native/package.json +1 -1
  268. package/packages/pi-agent-core/package.json +1 -1
  269. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  270. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  271. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  272. package/packages/pi-ai/dist/models.generated.d.ts +295 -98
  273. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  274. package/packages/pi-ai/dist/models.generated.js +309 -154
  275. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  276. package/packages/pi-ai/package.json +1 -1
  277. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  278. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  279. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  280. package/packages/pi-coding-agent/package.json +7 -7
  281. package/packages/pi-tui/dist/components/input.js +1 -1
  282. package/packages/pi-tui/dist/components/input.js.map +1 -1
  283. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  284. package/packages/pi-tui/dist/keys.js +39 -30
  285. package/packages/pi-tui/dist/keys.js.map +1 -1
  286. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  287. package/packages/pi-tui/dist/stdin-buffer.js +22 -0
  288. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  289. package/packages/pi-tui/package.json +2 -2
  290. package/packages/rpc-client/package.json +2 -2
  291. package/pkg/package.json +1 -1
  292. package/src/resources/extensions/ask-user-questions.ts +87 -24
  293. package/src/resources/extensions/bg-shell/utilities.ts +2 -2
  294. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  295. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +114 -281
  296. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +268 -0
  297. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
  298. package/src/resources/extensions/github-sync/templates.ts +3 -3
  299. package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
  300. package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
  301. package/src/resources/extensions/gsd/auto/contracts.ts +32 -2
  302. package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -1
  303. package/src/resources/extensions/gsd/auto/loop.ts +83 -61
  304. package/src/resources/extensions/gsd/auto/orchestrator.ts +164 -17
  305. package/src/resources/extensions/gsd/auto/phases.ts +45 -4
  306. package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
  307. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  308. package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
  309. package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
  310. package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
  311. package/src/resources/extensions/gsd/auto-post-unit.ts +16 -8
  312. package/src/resources/extensions/gsd/auto-prompts.ts +107 -9
  313. package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
  314. package/src/resources/extensions/gsd/auto-runtime-state.ts +26 -0
  315. package/src/resources/extensions/gsd/auto-start.ts +25 -34
  316. package/src/resources/extensions/gsd/auto-timers.ts +16 -2
  317. package/src/resources/extensions/gsd/auto-tool-tracking.ts +35 -0
  318. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +9 -30
  319. package/src/resources/extensions/gsd/auto-verification.ts +7 -8
  320. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  321. package/src/resources/extensions/gsd/auto-worktree.ts +53 -306
  322. package/src/resources/extensions/gsd/auto.ts +27 -17
  323. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
  324. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +20 -43
  325. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  326. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +147 -153
  327. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +132 -6
  328. package/src/resources/extensions/gsd/captures.ts +5 -14
  329. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
  330. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  331. package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
  332. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  333. package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
  334. package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
  335. package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
  336. package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
  337. package/src/resources/extensions/gsd/commands-ship.ts +2 -2
  338. package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
  339. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  340. package/src/resources/extensions/gsd/db/queries.ts +453 -0
  341. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  342. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  343. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  344. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  345. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  346. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  347. package/src/resources/extensions/gsd/db-workspace.ts +170 -0
  348. package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
  349. package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
  350. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  351. package/src/resources/extensions/gsd/doctor-environment.ts +8 -11
  352. package/src/resources/extensions/gsd/doctor-git-checks.ts +3 -3
  353. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +10 -3
  354. package/src/resources/extensions/gsd/doctor.ts +15 -5
  355. package/src/resources/extensions/gsd/error-classifier.ts +1 -1
  356. package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
  357. package/src/resources/extensions/gsd/git-service.ts +1 -0
  358. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  359. package/src/resources/extensions/gsd/gsd-db.ts +185 -2373
  360. package/src/resources/extensions/gsd/guided-flow.ts +81 -561
  361. package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
  362. package/src/resources/extensions/gsd/markdown-renderer.ts +2 -1
  363. package/src/resources/extensions/gsd/mcp-filter.ts +2 -1
  364. package/src/resources/extensions/gsd/mcp-tool-name.ts +35 -0
  365. package/src/resources/extensions/gsd/md-importer.ts +3 -3
  366. package/src/resources/extensions/gsd/migrate/safety.ts +17 -9
  367. package/src/resources/extensions/gsd/migration-auto-check.ts +30 -5
  368. package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
  369. package/src/resources/extensions/gsd/milestone-closeout.ts +12 -4
  370. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
  371. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
  372. package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
  373. package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
  374. package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
  375. package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
  376. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  377. package/src/resources/extensions/gsd/model-router.ts +3 -0
  378. package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
  379. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  380. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -5
  381. package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
  382. package/src/resources/extensions/gsd/paths.ts +9 -22
  383. package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
  384. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  385. package/src/resources/extensions/gsd/preferences.ts +191 -28
  386. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  387. package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
  388. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
  389. package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  390. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -0
  391. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -0
  392. package/src/resources/extensions/gsd/prompts/system.md +1 -1
  393. package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
  394. package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
  395. package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
  396. package/src/resources/extensions/gsd/question-transport.ts +138 -0
  397. package/src/resources/extensions/gsd/recovery-classification.ts +14 -1
  398. package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
  399. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  400. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  401. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  402. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
  403. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  404. package/src/resources/extensions/gsd/state.ts +15 -5
  405. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  406. package/src/resources/extensions/gsd/templates/plan.md +7 -0
  407. package/src/resources/extensions/gsd/templates/project.md +1 -0
  408. package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
  409. package/src/resources/extensions/gsd/templates/uat.md +5 -1
  410. package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
  411. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
  412. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +444 -5
  413. package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
  414. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
  415. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +133 -4
  416. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
  417. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  418. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
  419. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  420. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  421. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
  422. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +22 -0
  423. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
  424. package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
  425. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +38 -1
  426. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
  427. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +88 -0
  428. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
  429. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  430. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
  431. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  432. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
  433. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
  434. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
  435. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +5 -4
  436. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +1 -1
  437. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  438. package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
  439. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +143 -1
  440. package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
  441. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +25 -0
  442. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
  443. package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
  444. package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
  445. package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
  446. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
  447. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  448. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
  449. package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
  450. package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
  451. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +46 -0
  452. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
  453. package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
  454. package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
  455. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  456. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +185 -1
  457. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
  458. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +25 -1
  459. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  460. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
  461. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  462. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +144 -7
  463. package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
  464. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +2 -1
  465. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  466. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  467. package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
  468. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
  469. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +23 -0
  470. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +47 -0
  471. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +86 -1
  472. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
  473. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +150 -0
  474. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +126 -9
  475. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
  476. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  477. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +43 -1
  478. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  479. package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
  480. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  481. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
  482. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  483. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
  484. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
  485. package/src/resources/extensions/gsd/tests/write-gate.test.ts +121 -0
  486. package/src/resources/extensions/gsd/tool-contract.ts +86 -8
  487. package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
  488. package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
  489. package/src/resources/extensions/gsd/tools/complete-slice.ts +23 -58
  490. package/src/resources/extensions/gsd/tools/exec-tool.ts +5 -5
  491. package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
  492. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
  493. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
  494. package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
  495. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  496. package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
  497. package/src/resources/extensions/gsd/uat-policy.ts +19 -10
  498. package/src/resources/extensions/gsd/uat-run.ts +10 -14
  499. package/src/resources/extensions/gsd/undo.ts +9 -8
  500. package/src/resources/extensions/gsd/unit-context-composer.ts +85 -20
  501. package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
  502. package/src/resources/extensions/gsd/unit-tool-contracts.ts +2 -1
  503. package/src/resources/extensions/gsd/user-input-boundary.ts +18 -0
  504. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
  505. package/src/resources/extensions/gsd/web-app-uat.ts +101 -0
  506. package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
  507. package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
  508. package/src/resources/extensions/gsd/workflow-tool-surface.ts +73 -0
  509. package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
  510. package/src/resources/extensions/gsd/worktree-git-recovery.ts +308 -0
  511. package/src/resources/extensions/gsd/worktree-lifecycle.ts +17 -17
  512. package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
  513. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  514. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  515. package/src/resources/extensions/gsd/worktree-root.ts +17 -6
  516. package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
  517. package/src/resources/extensions/gsd/worktree-session-state.ts +12 -10
  518. package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
  519. package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
  520. package/src/resources/extensions/shared/interview-ui.ts +15 -2
  521. package/src/resources/shared/claude-runtime-floor.ts +248 -0
  522. package/src/resources/skills/gsd-browser/SKILL.md +1 -1
  523. package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
  524. package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
  525. package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
  526. package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
  527. package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
  528. package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
  529. /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → C24pqUd-aru-l0Dp0gLZP}/_buildManifest.js +0 -0
  530. /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → C24pqUd-aru-l0Dp0gLZP}/_ssgManifest.js +0 -0
@@ -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
+ }
@@ -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.
@@ -36,6 +36,8 @@ After the opening answer, classify project shape as **`simple`** or **`complex`*
36
36
 
37
37
  Persist the verdict through `gsd_summary_save` with `artifact_type: "PROJECT"` into `## Project Shape`; downstream `discuss-requirements`, `discuss-milestone`, and `discuss-slice` read the rendered projection.
38
38
 
39
+ When the project is browser-facing (web app, SPA, static site with UI, Next/React/Vue, etc.), also record **`Web stack:`** under `## Project Shape` (framework + whether Playwright or browser UAT is expected). Downstream planning uses this to choose `browser-executable` / `runtime-executable` UAT instead of deferring UI proof to humans.
40
+
39
41
  ### Before deeper rounds
40
42
 
41
43
  Ground your questions in the **Preparation Context snapshot above** (stack, structure, greenfield/brownfield and framework signals) plus any prior `.planning/` or `.gsd/` artifacts — those are authoritative. **Do not survey the codebase** with `rg`/`find`/`scout` before asking; read a specific file only when a question's answer genuinely hinges on it.
@@ -103,7 +105,7 @@ Once the user confirms depth:
103
105
 
104
106
  1. Use the **Project** output template (inlined above).
105
107
  2. Call `gsd_summary_save` with `artifact_type: "PROJECT"` and full project markdown as `content`; omit `milestone_id`. The tool persists the DB-backed PROJECT artifact and renders `.gsd/PROJECT.md`. Preserve the user's terms and framing.
106
- 3. The `## Project Shape` section MUST contain `**Complexity:** simple` or `**Complexity:** complex` (matching the verdict you announced) plus a one-line `**Why:**` rationale. Downstream stages read this line.
108
+ 3. The `## Project Shape` section MUST contain `**Complexity:** simple` or `**Complexity:** complex` (matching the verdict you announced) plus a one-line `**Why:**` rationale. For browser-facing projects, also include `**Web stack:**` (framework and expected browser/Playwright UAT approach). Downstream stages read these lines.
107
109
  4. The `## Capability Contract` section MUST reference `.gsd/REQUIREMENTS.md` — that file does not yet exist; the next stage (`discuss-requirements`) will produce it.
108
110
  5. The `## Milestone Sequence` MUST list at least M001 with title and one-liner. Subsequent milestones may be listed as known intents; they will be elaborated in their own discuss-milestone stages.
109
111
  6. Do NOT use `artifact_type: "CONTEXT"` and do NOT pass `milestone_id: "PROJECT"`; that creates a fake milestone named PROJECT.
@@ -47,6 +47,8 @@ If milestone research is inlined, trust it and skip redundant exploration. If fi
47
47
 
48
48
  Narrate decomposition reasoning in complete sentences: grouping, risk order, verification strategy.
49
49
 
50
+ **Web apps:** when inlined Web App UAT guidance is present, set milestone `Verification Classes` → UAT to browser-observable acceptance (Playwright spec or `browser_*` checks). Order an early slice to add Playwright smoke scaffolding when the dependency is missing.
51
+
50
52
  Then:
51
53
  1. Use the **Roadmap** output template from the inlined context above
52
54
  2. {{skillActivation}}
@@ -41,6 +41,7 @@ If slice research is inlined, trust its architectural findings, but verify every
41
41
  3. Use the inlined Output Template sections already present in this prompt. Do not read template files from disk.
42
42
  4. {{skillActivation}} Record expected executor skills in each task plan's `skills_used` frontmatter.
43
43
  5. Define slice verification before tasks. Non-trivial slices need real tests or executable assertions; boundary contracts need contract-exercising checks. Tests must not read .gitignore/gitignored paths such as `.gsd/`, `.planning/`, or `.audits/`.
44
+ **Web apps:** when inlined Web App UAT guidance is present, follow it — add Playwright smoke scaffolding on the first UI slice if missing, name localhost preconditions, and plan verification commands that match browser-capable UAT modes at slice closeout.
44
45
  6. Include Threat Surface (Q3), Requirement Impact (Q4), proof level, observability, integration closure, Failure Modes (Q5), Load Profile (Q6), and Negative Tests (Q7) only where applicable.
45
46
  7. Right-size tasks. Simple slices can be one task; split only when context, ownership, or verification boundaries justify it.
46
47
  8. Task `verify` commands must be safe, simple commands. Do not use shell pipes, redirects, semicolons, backticks, command substitution, output trimming, or grep regex alternation with `|`. If multiple checks are needed, create a small test file and run it with `node --test` or a package test script, or use separate simple commands joined only with `&&`. For absence checks, verify a pattern does not exist with `! grep -q 'pattern' file` or `! rg -q 'pattern' file`; do not use `grep -c` or `rg -c` to assert zero matches because count commands exit 1 when they find zero matches, and the verification gate treats that as failure.
@@ -63,6 +63,7 @@ Then:
63
63
  - `{{taskPlanTemplatePath}}`
64
64
  2. {{skillActivation}} Record the installed skills you expect executors to use in each task plan's `skills_used` frontmatter.
65
65
  3. Define slice-level verification: the objective stopping condition. Plan real test files with real assertions; for simple slices, executable commands are fine.
66
+ **Web apps:** when inlined Web App UAT guidance is present, follow it for Playwright scaffolding and browser-capable verification commands.
66
67
  4. For non-trivial slices, plan observability / proof level / integration closure, threat surface, and requirement impact. Omit entirely for simple slices.
67
68
  5. Decompose the slice into tasks that fit one context window each. Every task passed to `gsd_plan_slice` must use the exact keys `taskId`, `title`, `description`, `estimate`, `files`, `verify`, `inputs`, `expectedOutput`, and optional `observabilityImpact`. Put Why / Do / Done-when detail in `description`. `files`, `inputs`, and `expectedOutput` must be JSON arrays of strings, even for one path (for example, `"expectedOutput": ["src/index.ts"]`, never `"expectedOutput": "src/index.ts"`). `expectedOutput` is path-only: list only files the task creates or overwrites, and use `[]` for pure verification tasks.
68
69
  6. **Persist planning state through `gsd_plan_slice`.** Call it with the full payload. The tool writes to the DB and renders `{{outputPath}}` and `{{slicePath}}/tasks/T##-PLAN.md` automatically. Do NOT rely on direct `PLAN.md` writes.
@@ -158,7 +158,7 @@ Fix root causes, not symptoms. If applying temporary mitigation, label it and pr
158
158
  - State uncertainty plainly: "Not sure this handles X - testing it." No performed confidence, no hedging paragraphs.
159
159
  - All user-visible narration must be grammatical English. Do not emit compressed planner notes like "Need inspect X". If it fits a commit comment or standup note, it is acceptable.
160
160
  - When debugging, stay curious. Problems are puzzles. Say what's interesting about the failure before reaching for fixes.
161
- - After completing a task, give a brief summary and 2-4 numbered next-step options; last option is always "Other". Omit the list for strict output formats.
161
+ - After completing a task, give a brief summary and 2-4 numbered next-step options; last option is always "Other". Omit the list for strict output formats, or when the active workflow prompt already ends with its own explicit "Next steps:" handoff block — in that case follow the workflow's handoff and do not add a second list.
162
162
 
163
163
  If any next step is destructive/outward-facing, present it via `ask_user_questions` and wait for the user's answer before execution. Do not execute a next-step item from a prior plain-text numbered list without fresh confirmation.
164
164
 
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Provider Payload Policy - ordered shaping of provider request payloads.
3
+ *
4
+ * The order is intentional:
5
+ * 1. observation budgeting masks old tool results in auto-mode,
6
+ * 2. display truncation caps tool-result text for every mode,
7
+ * 3. the protected Source Context Block is appended after truncation,
8
+ * 4. supported models receive the configured service tier.
9
+ */
10
+ import { createObservationMask, createResponsesInputObservationMask, truncateContextResultMessages, truncateResponsesInputResultItems, } from "./context-masker.js";
11
+ import { getSourceObservationStore, isAutoActive } from "./auto-runtime-state.js";
12
+ import { loadEffectiveGSDPreferences } from "./preferences.js";
13
+ import { getEffectiveServiceTier, supportsServiceTier } from "./service-tier.js";
14
+ import { injectSourceContextBlockIntoPayload } from "./source-observations.js";
15
+ const DEFAULT_OBSERVATION_MASK_TURNS = 8;
16
+ const DEFAULT_TOOL_RESULT_MAX_CHARS = 800;
17
+ export const DEFAULT_PROVIDER_PAYLOAD_POLICY_DEPS = {
18
+ isAutoActive,
19
+ loadContextManagementConfig: () => loadEffectiveGSDPreferences()?.preferences.context_management,
20
+ renderSourceContextBlock: () => getSourceObservationStore().renderActiveBlock(),
21
+ getEffectiveServiceTier,
22
+ supportsServiceTier,
23
+ };
24
+ export function applyProviderPayloadPolicy({ payload, modelId, deps: overrides, }) {
25
+ const deps = { ...DEFAULT_PROVIDER_PAYLOAD_POLICY_DEPS, ...overrides };
26
+ try {
27
+ applyContextManagement(payload, deps);
28
+ }
29
+ catch {
30
+ // Provider payload shaping should not block a request when optional
31
+ // context management preferences or adapters fail.
32
+ }
33
+ try {
34
+ applySourceContextBlock(payload, deps);
35
+ }
36
+ catch {
37
+ // Source observations are opportunistic; execution can continue without
38
+ // an injected block.
39
+ }
40
+ applyServiceTier(payload, modelId, deps);
41
+ return payload;
42
+ }
43
+ function applyContextManagement(payload, deps) {
44
+ const config = deps.loadContextManagementConfig();
45
+ applyObservationBudget(payload, config, deps.isAutoActive());
46
+ applyDisplayTruncation(payload, config);
47
+ }
48
+ function applyObservationBudget(payload, config, autoActive) {
49
+ if (!autoActive || config?.observation_masking === false)
50
+ return;
51
+ const keepTurns = config?.observation_mask_turns ?? DEFAULT_OBSERVATION_MASK_TURNS;
52
+ if (Array.isArray(payload.messages)) {
53
+ payload.messages = createObservationMask(keepTurns)(payload.messages);
54
+ }
55
+ if (Array.isArray(payload.input)) {
56
+ payload.input = createResponsesInputObservationMask(keepTurns)(payload.input);
57
+ }
58
+ }
59
+ function applyDisplayTruncation(payload, config) {
60
+ const maxChars = config?.tool_result_max_chars ?? DEFAULT_TOOL_RESULT_MAX_CHARS;
61
+ if (Array.isArray(payload.messages)) {
62
+ payload.messages = truncateContextResultMessages(payload.messages, maxChars);
63
+ }
64
+ if (Array.isArray(payload.input)) {
65
+ payload.input = truncateResponsesInputResultItems(payload.input, maxChars);
66
+ }
67
+ }
68
+ function applySourceContextBlock(payload, deps) {
69
+ if (!deps.isAutoActive())
70
+ return;
71
+ const sourceContextBlock = deps.renderSourceContextBlock();
72
+ if (!sourceContextBlock)
73
+ return;
74
+ Object.assign(payload, injectSourceContextBlockIntoPayload(payload, sourceContextBlock));
75
+ }
76
+ function applyServiceTier(payload, modelId, deps) {
77
+ if (!modelId)
78
+ return;
79
+ const tier = deps.getEffectiveServiceTier();
80
+ if (!tier || !deps.supportsServiceTier(modelId))
81
+ return;
82
+ payload.service_tier = tier;
83
+ }
@@ -0,0 +1,13 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Process-level pull request policy for GSD-generated PRs.
3
+ import { createDraftPR } from "./git-service.js";
4
+ import { buildPrEvidence, } from "./pr-evidence.js";
5
+ export function buildPullRequestEvidence(input) {
6
+ return buildPrEvidence({
7
+ ...input,
8
+ aiAssisted: false,
9
+ });
10
+ }
11
+ export function createDraftPullRequestFromEvidence(basePath, milestoneId, evidence, options, deps = { createDraftPR }) {
12
+ return deps.createDraftPR(basePath, milestoneId, evidence.title, evidence.body, options);
13
+ }
@@ -0,0 +1,109 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Canonical quality-gate closure from durable DB and artifact evidence.
3
+ import { existsSync, readFileSync } from "node:fs";
4
+ import { extractSection } from "./files.js";
5
+ import { getGateDefinition } from "./gate-registry.js";
6
+ import { getMilestoneSlices, getPendingGates, saveGateResult } from "./gsd-db.js";
7
+ import { resolveSliceFile, resolveTaskFile } from "./paths.js";
8
+ const GATE_SECTION_HEADINGS = {
9
+ Q3: ["Threat Surface", "Abuse Surface"],
10
+ Q4: ["Requirement Impact", "Broken Promises"],
11
+ Q5: ["Failure Modes"],
12
+ Q6: ["Load Profile"],
13
+ Q7: ["Negative Tests"],
14
+ Q8: ["Operational Readiness"],
15
+ };
16
+ function readFile(path) {
17
+ if (!path || !existsSync(path))
18
+ return null;
19
+ return readFileSync(path, "utf-8");
20
+ }
21
+ function firstSection(content, gateId) {
22
+ if (!content)
23
+ return null;
24
+ for (const heading of GATE_SECTION_HEADINGS[gateId] ?? []) {
25
+ const section = extractSection(content, heading);
26
+ if (section)
27
+ return section;
28
+ }
29
+ return null;
30
+ }
31
+ function evidenceArtifactContent(row, basePath) {
32
+ const def = getGateDefinition(row.gate_id);
33
+ switch (def?.ownerTurn) {
34
+ case "gate-evaluate":
35
+ return readFile(resolveSliceFile(basePath, row.milestone_id, row.slice_id, "PLAN"));
36
+ case "execute-task":
37
+ return readFile(resolveTaskFile(basePath, row.milestone_id, row.slice_id, row.task_id, "SUMMARY"));
38
+ case "complete-slice":
39
+ return readFile(resolveSliceFile(basePath, row.milestone_id, row.slice_id, "SUMMARY"));
40
+ default:
41
+ return null;
42
+ }
43
+ }
44
+ function closureEvidence(row, options) {
45
+ const def = getGateDefinition(row.gate_id);
46
+ if (!def)
47
+ return null;
48
+ if (def.ownerTurn === "validate-milestone" && options.milestoneValidationPassed) {
49
+ return {
50
+ verdict: "pass",
51
+ rationale: `${def.promptSection} covered by passing milestone validation`,
52
+ findings: "",
53
+ };
54
+ }
55
+ if (!options.artifactBasePath)
56
+ return null;
57
+ const section = firstSection(evidenceArtifactContent(row, options.artifactBasePath), row.gate_id);
58
+ if (section) {
59
+ return {
60
+ verdict: "pass",
61
+ rationale: `${def.promptSection} evidence found in durable artifact`,
62
+ findings: section,
63
+ };
64
+ }
65
+ if (!options.milestoneValidationPassed)
66
+ return null;
67
+ return {
68
+ verdict: "omitted",
69
+ rationale: `${def.promptSection} has no durable artifact section; milestone validation passed`,
70
+ findings: "",
71
+ };
72
+ }
73
+ function closeGate(row, evidence) {
74
+ saveGateResult({
75
+ milestoneId: row.milestone_id,
76
+ sliceId: row.slice_id,
77
+ gateId: row.gate_id,
78
+ taskId: row.task_id,
79
+ verdict: evidence.verdict,
80
+ rationale: evidence.rationale,
81
+ findings: evidence.findings,
82
+ });
83
+ }
84
+ export function closeQualityGatesFromEvidence(milestoneId, options = {}) {
85
+ const repaired = [];
86
+ const unresolved = [];
87
+ for (const slice of getMilestoneSlices(milestoneId)) {
88
+ const sliceId = slice.id;
89
+ for (const row of getPendingGates(milestoneId, sliceId)) {
90
+ if (!getGateDefinition(row.gate_id)) {
91
+ unresolved.push(row);
92
+ continue;
93
+ }
94
+ const evidence = closureEvidence(row, options);
95
+ if (!evidence) {
96
+ unresolved.push(row);
97
+ continue;
98
+ }
99
+ closeGate(row, evidence);
100
+ repaired.push({
101
+ gateId: row.gate_id,
102
+ sliceId: row.slice_id,
103
+ ...(row.task_id ? { taskId: row.task_id } : {}),
104
+ verdict: evidence.verdict,
105
+ });
106
+ }
107
+ }
108
+ return { repaired, unresolved };
109
+ }