@opengsd/gsd-pi 1.5.0 → 1.6.0

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 (499) hide show
  1. package/README.md +10 -10
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/extensions/ask-user-questions.js +1 -1
  4. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +114 -36
  5. package/dist/resources/extensions/gsd/activity-log.js +1 -1
  6. package/dist/resources/extensions/gsd/auto/closeout.js +97 -5
  7. package/dist/resources/extensions/gsd/auto/orchestrator.js +20 -13
  8. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +6 -3
  9. package/dist/resources/extensions/gsd/auto/unit-phase.js +5 -9
  10. package/dist/resources/extensions/gsd/auto-artifact-paths.js +14 -5
  11. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -7
  12. package/dist/resources/extensions/gsd/auto-dispatch.js +69 -17
  13. package/dist/resources/extensions/gsd/auto-model-selection.js +28 -1
  14. package/dist/resources/extensions/gsd/auto-post-unit.js +4 -3
  15. package/dist/resources/extensions/gsd/auto-prompts.js +29 -117
  16. package/dist/resources/extensions/gsd/auto-recovery.js +50 -6
  17. package/dist/resources/extensions/gsd/auto-start.js +57 -33
  18. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +12 -2
  19. package/dist/resources/extensions/gsd/auto-timers.js +9 -2
  20. package/dist/resources/extensions/gsd/auto-worktree-branch-lifecycle.js +189 -0
  21. package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +133 -0
  22. package/dist/resources/extensions/gsd/auto-worktree-conflict-auto-resolve.js +35 -0
  23. package/dist/resources/extensions/gsd/auto-worktree-creation.js +130 -0
  24. package/dist/resources/extensions/gsd/auto-worktree-entry.js +118 -0
  25. package/dist/resources/extensions/gsd/auto-worktree-merge-already-merged.js +98 -0
  26. package/dist/resources/extensions/gsd/auto-worktree-merge-branch-head.js +52 -0
  27. package/dist/resources/extensions/gsd/auto-worktree-merge-cleanup.js +87 -0
  28. package/dist/resources/extensions/gsd/auto-worktree-merge-code-changes.js +46 -0
  29. package/dist/resources/extensions/gsd/auto-worktree-merge-db-ready.js +68 -0
  30. package/dist/resources/extensions/gsd/auto-worktree-merge-integration-branch.js +51 -0
  31. package/dist/resources/extensions/gsd/auto-worktree-merge-message.js +106 -0
  32. package/dist/resources/extensions/gsd/auto-worktree-merge-pre-teardown.js +64 -0
  33. package/dist/resources/extensions/gsd/auto-worktree-merge-stash.js +168 -0
  34. package/dist/resources/extensions/gsd/auto-worktree-merge.js +302 -0
  35. package/dist/resources/extensions/gsd/auto-worktree-milestone-shelter.js +119 -0
  36. package/dist/resources/extensions/gsd/auto-worktree-path-resolution.js +5 -0
  37. package/dist/resources/extensions/gsd/auto-worktree-path-utils.js +5 -0
  38. package/dist/resources/extensions/gsd/auto-worktree-resource-version.js +41 -0
  39. package/dist/resources/extensions/gsd/auto-worktree-runtime-cleanup.js +99 -0
  40. package/dist/resources/extensions/gsd/auto-worktree-session-registry.js +57 -0
  41. package/dist/resources/extensions/gsd/auto-worktree-sync.js +249 -0
  42. package/dist/resources/extensions/gsd/auto-worktree-teardown.js +120 -0
  43. package/dist/resources/extensions/gsd/auto-worktree.js +20 -2073
  44. package/dist/resources/extensions/gsd/auto.js +106 -34
  45. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -1
  46. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +20 -2
  47. package/dist/resources/extensions/gsd/bootstrap/system-context.js +1 -1
  48. package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +185 -27
  49. package/dist/resources/extensions/gsd/codebase-generator.js +7 -1
  50. package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
  51. package/dist/resources/extensions/gsd/commands-workflow-templates.js +3 -3
  52. package/dist/resources/extensions/gsd/compat/compat-marker.js +44 -0
  53. package/dist/resources/extensions/gsd/config-overlay.js +7 -2
  54. package/dist/resources/extensions/gsd/db/engine.js +33 -0
  55. package/dist/resources/extensions/gsd/db/queries.js +9 -9
  56. package/dist/resources/extensions/gsd/db/writers/cascades.js +20 -2
  57. package/dist/resources/extensions/gsd/db-adapter.js +30 -3
  58. package/dist/resources/extensions/gsd/docs/preferences-reference.md +3 -3
  59. package/dist/resources/extensions/gsd/doctor-engine-checks.js +93 -11
  60. package/dist/resources/extensions/gsd/flat-phase-migration.js +32 -3
  61. package/dist/resources/extensions/gsd/forensics.js +1 -1
  62. package/dist/resources/extensions/gsd/git-conflict-resolve.js +2 -2
  63. package/dist/resources/extensions/gsd/git-service.js +45 -0
  64. package/dist/resources/extensions/gsd/gsd-db.js +23 -11
  65. package/dist/resources/extensions/gsd/guided-flow.js +22 -17
  66. package/dist/resources/extensions/gsd/journal.js +1 -1
  67. package/dist/resources/extensions/gsd/markdown-renderer.js +34 -79
  68. package/dist/resources/extensions/gsd/md-importer.js +89 -23
  69. package/dist/resources/extensions/gsd/metrics.js +2 -2
  70. package/dist/resources/extensions/gsd/migration-auto-check.js +30 -3
  71. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +11 -0
  72. package/dist/resources/extensions/gsd/milestone-settlement.js +1 -1
  73. package/dist/resources/extensions/gsd/parallel-merge.js +1 -1
  74. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -1
  75. package/dist/resources/extensions/gsd/paths.js +87 -52
  76. package/dist/resources/extensions/gsd/post-unit-hooks.js +27 -0
  77. package/dist/resources/extensions/gsd/preferences-models.js +66 -15
  78. package/dist/resources/extensions/gsd/preferences-skills.js +10 -16
  79. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  80. package/dist/resources/extensions/gsd/preferences-validation.js +148 -10
  81. package/dist/resources/extensions/gsd/preferences.js +20 -0
  82. package/dist/resources/extensions/gsd/prompts/system.md +6 -6
  83. package/dist/resources/extensions/gsd/quick.js +12 -3
  84. package/dist/resources/extensions/gsd/rule-registry.js +106 -10
  85. package/dist/resources/extensions/gsd/skill-discovery.js +36 -23
  86. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +2 -1
  87. package/dist/resources/extensions/gsd/state/derive/from-db.js +88 -153
  88. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +1 -10
  89. package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +3 -24
  90. package/dist/resources/extensions/gsd/state-reconciliation/index.js +10 -0
  91. package/dist/resources/extensions/gsd/tool-contract.js +14 -0
  92. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -5
  93. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +16 -10
  94. package/dist/resources/extensions/gsd/tools/reopen-slice.js +5 -0
  95. package/dist/resources/extensions/gsd/tools/reopen-task.js +13 -5
  96. package/dist/resources/extensions/gsd/tools/validate-milestone.js +3 -8
  97. package/dist/resources/extensions/gsd/uat-dispatch.js +94 -0
  98. package/dist/resources/extensions/gsd/unit-registry.js +12 -2
  99. package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +1 -1
  100. package/dist/resources/extensions/gsd/uok/audit-toggle.js +31 -2
  101. package/dist/resources/extensions/gsd/uok/audit.js +3 -0
  102. package/dist/resources/extensions/gsd/uok/gate-runner.js +22 -30
  103. package/dist/resources/extensions/gsd/uok/gitops.js +18 -15
  104. package/dist/resources/extensions/gsd/uok/kernel.js +120 -46
  105. package/dist/resources/extensions/gsd/uok/model-policy.js +17 -14
  106. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -1
  107. package/dist/resources/extensions/gsd/workflow-event-ledger.js +1 -1
  108. package/dist/resources/extensions/gsd/workflow-logger.js +1 -1
  109. package/dist/resources/extensions/gsd/workflow-projections.js +9 -26
  110. package/dist/resources/extensions/gsd/workspace-git-preflight.js +2 -2
  111. package/dist/resources/extensions/gsd/workspace.js +5 -14
  112. package/dist/resources/extensions/gsd/worktree-command.js +1 -1
  113. package/dist/resources/extensions/gsd/worktree-lifecycle.js +14 -9
  114. package/dist/resources/extensions/gsd/worktree-reentry.js +2 -1
  115. package/dist/resources/extensions/shared/gsd-browser-cli.js +29 -0
  116. package/dist/resources/extensions/shared/interview-ui.js +62 -9
  117. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  118. package/dist/web/standalone/.next/BUILD_ID +1 -1
  119. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  120. package/dist/web/standalone/.next/build-manifest.json +2 -2
  121. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  122. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  139. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  140. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  141. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  142. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  143. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  144. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  145. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  146. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  147. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  149. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  150. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  153. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  155. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  158. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  159. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  165. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  167. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  171. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/index.html +1 -1
  173. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  174. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  176. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  178. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  179. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  180. package/dist/web/standalone/.next/server/chunks/{1128.js → 1991.js} +1 -1
  181. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  182. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  184. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  185. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  186. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  187. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  188. package/dist/worktree-cli-create.d.ts +10 -0
  189. package/dist/worktree-cli-create.js +11 -0
  190. package/dist/worktree-cli-format.d.ts +12 -0
  191. package/dist/worktree-cli-format.js +38 -0
  192. package/dist/worktree-cli-plan.d.ts +16 -0
  193. package/dist/worktree-cli-plan.js +19 -0
  194. package/dist/worktree-cli-session.d.ts +13 -0
  195. package/dist/worktree-cli-session.js +18 -0
  196. package/dist/worktree-cli-status.d.ts +35 -0
  197. package/dist/worktree-cli-status.js +54 -0
  198. package/dist/worktree-cli.d.ts +1 -16
  199. package/dist/worktree-cli.js +28 -122
  200. package/integrations/hermes/open_gsd_hermes/gsd_client.py +25 -36
  201. package/integrations/hermes/pyproject.toml +1 -1
  202. package/integrations/hermes/tests/test_gsd_client_timeout.py +4 -4
  203. package/package.json +6 -6
  204. package/packages/cloud-mcp-gateway/package.json +2 -2
  205. package/packages/contracts/package.json +1 -1
  206. package/packages/daemon/dist/orchestrator-agent.d.ts +21 -0
  207. package/packages/daemon/dist/orchestrator-agent.d.ts.map +1 -0
  208. package/packages/daemon/dist/orchestrator-agent.js +113 -0
  209. package/packages/daemon/dist/orchestrator-agent.js.map +1 -0
  210. package/packages/daemon/dist/orchestrator-tools.d.ts +12 -0
  211. package/packages/daemon/dist/orchestrator-tools.d.ts.map +1 -0
  212. package/packages/daemon/dist/orchestrator-tools.js +137 -0
  213. package/packages/daemon/dist/orchestrator-tools.js.map +1 -0
  214. package/packages/daemon/dist/orchestrator.d.ts +4 -56
  215. package/packages/daemon/dist/orchestrator.d.ts.map +1 -1
  216. package/packages/daemon/dist/orchestrator.js +13 -303
  217. package/packages/daemon/dist/orchestrator.js.map +1 -1
  218. package/packages/daemon/dist/orchestrator.test.js +11 -1
  219. package/packages/daemon/dist/orchestrator.test.js.map +1 -1
  220. package/packages/daemon/package.json +4 -4
  221. package/packages/gsd-agent-core/dist/export-html/template.js +53 -4
  222. package/packages/gsd-agent-core/package.json +5 -5
  223. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  224. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +3 -2
  225. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  226. package/packages/gsd-agent-modes/package.json +7 -7
  227. package/packages/mcp-server/package.json +4 -4
  228. package/packages/native/package.json +1 -1
  229. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  230. package/packages/pi-agent-core/dist/agent-loop.js +14 -9
  231. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  232. package/packages/pi-agent-core/package.json +1 -1
  233. package/packages/pi-ai/dist/index.d.ts +1 -0
  234. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  235. package/packages/pi-ai/dist/index.js +1 -0
  236. package/packages/pi-ai/dist/index.js.map +1 -1
  237. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  238. package/packages/pi-ai/dist/providers/transform-messages.js +7 -3
  239. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  240. package/packages/pi-ai/dist/tool-result-content.d.ts +3 -0
  241. package/packages/pi-ai/dist/tool-result-content.d.ts.map +1 -0
  242. package/packages/pi-ai/dist/tool-result-content.js +62 -0
  243. package/packages/pi-ai/dist/tool-result-content.js.map +1 -0
  244. package/packages/pi-ai/dist/types.d.ts +8 -20
  245. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  246. package/packages/pi-ai/dist/types.js.map +1 -1
  247. package/packages/pi-ai/package.json +1 -1
  248. package/packages/pi-coding-agent/dist/core/package-manager.d.ts +9 -0
  249. package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  250. package/packages/pi-coding-agent/dist/core/package-manager.js +74 -53
  251. package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  252. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +6 -0
  253. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  254. package/packages/pi-coding-agent/dist/core/resource-loader.js +30 -2
  255. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  256. package/packages/pi-coding-agent/dist/core/skill-directories.d.ts +66 -0
  257. package/packages/pi-coding-agent/dist/core/skill-directories.d.ts.map +1 -0
  258. package/packages/pi-coding-agent/dist/core/skill-directories.js +138 -0
  259. package/packages/pi-coding-agent/dist/core/skill-directories.js.map +1 -0
  260. package/packages/pi-coding-agent/dist/core/skills.d.ts +4 -1
  261. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  262. package/packages/pi-coding-agent/dist/core/skills.js +4 -1
  263. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  264. package/packages/pi-coding-agent/dist/index.d.ts +1 -0
  265. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  266. package/packages/pi-coding-agent/dist/index.js +1 -0
  267. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  268. package/packages/pi-coding-agent/package.json +7 -7
  269. package/packages/pi-tui/package.json +2 -2
  270. package/packages/rpc-client/package.json +2 -2
  271. package/pkg/dist/core/export-html/template.js +53 -4
  272. package/pkg/package.json +1 -1
  273. package/src/resources/extensions/ask-user-questions.ts +1 -1
  274. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +146 -33
  275. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +25 -0
  276. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +93 -0
  277. package/src/resources/extensions/gsd/activity-log.ts +1 -1
  278. package/src/resources/extensions/gsd/auto/closeout.ts +114 -7
  279. package/src/resources/extensions/gsd/auto/orchestrator.ts +21 -14
  280. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +6 -3
  281. package/src/resources/extensions/gsd/auto/unit-phase.ts +5 -9
  282. package/src/resources/extensions/gsd/auto-artifact-paths.ts +14 -4
  283. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +13 -7
  284. package/src/resources/extensions/gsd/auto-dispatch.ts +77 -16
  285. package/src/resources/extensions/gsd/auto-model-selection.ts +33 -1
  286. package/src/resources/extensions/gsd/auto-post-unit.ts +4 -2
  287. package/src/resources/extensions/gsd/auto-prompts.ts +53 -113
  288. package/src/resources/extensions/gsd/auto-recovery.ts +50 -6
  289. package/src/resources/extensions/gsd/auto-start.ts +62 -31
  290. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +12 -2
  291. package/src/resources/extensions/gsd/auto-timers.ts +9 -2
  292. package/src/resources/extensions/gsd/auto-worktree-branch-lifecycle.ts +237 -0
  293. package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +166 -0
  294. package/src/resources/extensions/gsd/auto-worktree-conflict-auto-resolve.ts +37 -0
  295. package/src/resources/extensions/gsd/auto-worktree-creation.ts +171 -0
  296. package/src/resources/extensions/gsd/auto-worktree-entry.ts +154 -0
  297. package/src/resources/extensions/gsd/auto-worktree-merge-already-merged.ts +161 -0
  298. package/src/resources/extensions/gsd/auto-worktree-merge-branch-head.ts +83 -0
  299. package/src/resources/extensions/gsd/auto-worktree-merge-cleanup.ts +132 -0
  300. package/src/resources/extensions/gsd/auto-worktree-merge-code-changes.ts +71 -0
  301. package/src/resources/extensions/gsd/auto-worktree-merge-db-ready.ts +112 -0
  302. package/src/resources/extensions/gsd/auto-worktree-merge-integration-branch.ts +99 -0
  303. package/src/resources/extensions/gsd/auto-worktree-merge-message.ts +166 -0
  304. package/src/resources/extensions/gsd/auto-worktree-merge-pre-teardown.ts +93 -0
  305. package/src/resources/extensions/gsd/auto-worktree-merge-stash.ts +213 -0
  306. package/src/resources/extensions/gsd/auto-worktree-merge.ts +391 -0
  307. package/src/resources/extensions/gsd/auto-worktree-milestone-shelter.ts +159 -0
  308. package/src/resources/extensions/gsd/auto-worktree-path-resolution.ts +6 -0
  309. package/src/resources/extensions/gsd/auto-worktree-path-utils.ts +10 -0
  310. package/src/resources/extensions/gsd/auto-worktree-resource-version.ts +44 -0
  311. package/src/resources/extensions/gsd/auto-worktree-runtime-cleanup.ts +119 -0
  312. package/src/resources/extensions/gsd/auto-worktree-session-registry.ts +71 -0
  313. package/src/resources/extensions/gsd/auto-worktree-sync.ts +370 -0
  314. package/src/resources/extensions/gsd/auto-worktree-teardown.ts +161 -0
  315. package/src/resources/extensions/gsd/auto-worktree.ts +69 -2429
  316. package/src/resources/extensions/gsd/auto.ts +114 -47
  317. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -1
  318. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +20 -2
  319. package/src/resources/extensions/gsd/bootstrap/system-context.ts +1 -1
  320. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +218 -27
  321. package/src/resources/extensions/gsd/codebase-generator.ts +7 -1
  322. package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
  323. package/src/resources/extensions/gsd/commands-workflow-templates.ts +3 -3
  324. package/src/resources/extensions/gsd/compat/compat-marker.ts +47 -0
  325. package/src/resources/extensions/gsd/config-overlay.ts +7 -1
  326. package/src/resources/extensions/gsd/db/engine.ts +36 -0
  327. package/src/resources/extensions/gsd/db/queries.ts +9 -9
  328. package/src/resources/extensions/gsd/db/writers/cascades.ts +23 -1
  329. package/src/resources/extensions/gsd/db-adapter.ts +29 -3
  330. package/src/resources/extensions/gsd/docs/preferences-reference.md +3 -3
  331. package/src/resources/extensions/gsd/doctor-engine-checks.ts +109 -10
  332. package/src/resources/extensions/gsd/flat-phase-migration.ts +34 -3
  333. package/src/resources/extensions/gsd/forensics.ts +1 -1
  334. package/src/resources/extensions/gsd/git-conflict-resolve.ts +2 -2
  335. package/src/resources/extensions/gsd/git-service.ts +53 -0
  336. package/src/resources/extensions/gsd/gsd-db.ts +33 -11
  337. package/src/resources/extensions/gsd/guided-flow.ts +26 -18
  338. package/src/resources/extensions/gsd/journal.ts +1 -1
  339. package/src/resources/extensions/gsd/markdown-renderer.ts +52 -91
  340. package/src/resources/extensions/gsd/md-importer.ts +93 -22
  341. package/src/resources/extensions/gsd/metrics.ts +2 -2
  342. package/src/resources/extensions/gsd/migration-auto-check.ts +32 -3
  343. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +15 -0
  344. package/src/resources/extensions/gsd/milestone-settlement.ts +1 -1
  345. package/src/resources/extensions/gsd/parallel-merge.ts +1 -1
  346. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -1
  347. package/src/resources/extensions/gsd/paths.ts +108 -51
  348. package/src/resources/extensions/gsd/post-unit-hooks.ts +32 -0
  349. package/src/resources/extensions/gsd/preferences-models.ts +74 -20
  350. package/src/resources/extensions/gsd/preferences-skills.ts +10 -16
  351. package/src/resources/extensions/gsd/preferences-types.ts +54 -1
  352. package/src/resources/extensions/gsd/preferences-validation.ts +146 -9
  353. package/src/resources/extensions/gsd/preferences.ts +20 -0
  354. package/src/resources/extensions/gsd/prompts/system.md +6 -6
  355. package/src/resources/extensions/gsd/quick.ts +11 -3
  356. package/src/resources/extensions/gsd/rule-registry.ts +111 -9
  357. package/src/resources/extensions/gsd/skill-discovery.ts +47 -23
  358. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +3 -1
  359. package/src/resources/extensions/gsd/state/derive/from-db.ts +201 -157
  360. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +1 -9
  361. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +2 -22
  362. package/src/resources/extensions/gsd/state-reconciliation/index.ts +14 -0
  363. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +169 -1
  364. package/src/resources/extensions/gsd/tests/auto-loop-no-copy-artifacts.test.ts +2 -1
  365. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +41 -2
  366. package/src/resources/extensions/gsd/tests/auto-post-unit-artifact-diagnostic.test.ts +48 -1
  367. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +57 -0
  368. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +1 -1
  369. package/src/resources/extensions/gsd/tests/auto-start-project-milestone-reconcile.test.ts +29 -1
  370. package/src/resources/extensions/gsd/tests/auto-timeout-recovery-supervisor-inflight-guard.test.ts +159 -0
  371. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +2 -1
  372. package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +1 -1
  373. package/src/resources/extensions/gsd/tests/auto-worktree-merge-already-merged.test.ts +177 -0
  374. package/src/resources/extensions/gsd/tests/auto-worktree-merge-branch-head.test.ts +118 -0
  375. package/src/resources/extensions/gsd/tests/auto-worktree-merge-cleanup.test.ts +115 -0
  376. package/src/resources/extensions/gsd/tests/auto-worktree-merge-code-changes.test.ts +76 -0
  377. package/src/resources/extensions/gsd/tests/auto-worktree-merge-db-ready.test.ts +140 -0
  378. package/src/resources/extensions/gsd/tests/auto-worktree-merge-integration-branch.test.ts +123 -0
  379. package/src/resources/extensions/gsd/tests/auto-worktree-merge-message.test.ts +114 -0
  380. package/src/resources/extensions/gsd/tests/auto-worktree-merge-pre-teardown.test.ts +84 -0
  381. package/src/resources/extensions/gsd/tests/auto-worktree-merge-stash.test.ts +70 -0
  382. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-shelter.test.ts +52 -0
  383. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +6 -6
  384. package/src/resources/extensions/gsd/tests/auto-worktree-resource-version.test.ts +59 -0
  385. package/src/resources/extensions/gsd/tests/auto-worktree-untracked-content.test.ts +3 -1
  386. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
  387. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +3 -1
  388. package/src/resources/extensions/gsd/tests/compat-marker.test.ts +85 -0
  389. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +45 -0
  390. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +1 -1
  391. package/src/resources/extensions/gsd/tests/db-adapter.test.ts +39 -0
  392. package/src/resources/extensions/gsd/tests/db-writable-probe.test.ts +66 -0
  393. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -0
  394. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +174 -0
  395. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +1 -1
  396. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +71 -1
  397. package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +46 -1
  398. package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +72 -32
  399. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +40 -0
  400. package/src/resources/extensions/gsd/tests/import-completion-lost-update.test.ts +196 -0
  401. package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +4 -6
  402. package/src/resources/extensions/gsd/tests/integration/auto-stash-merge.test.ts +2 -1
  403. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +3 -3
  404. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +7 -8
  405. package/src/resources/extensions/gsd/tests/integration/feature-branch-lifecycle-integration.test.ts +2 -5
  406. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +76 -0
  407. package/src/resources/extensions/gsd/tests/integration/merge-cwd-restore.test.ts +1 -1
  408. package/src/resources/extensions/gsd/tests/integration/merge-preserve-worktree-on-preteardown-error.test.ts +1 -1
  409. package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +2 -1
  410. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +5 -7
  411. package/src/resources/extensions/gsd/tests/integration/paths.test.ts +88 -1
  412. package/src/resources/extensions/gsd/tests/integration/workspace-collapse-integration.test.ts +2 -4
  413. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +16 -15
  414. package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +1 -1
  415. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +1 -1
  416. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +1 -1
  417. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +91 -0
  418. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +2 -1
  419. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +439 -0
  420. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +24 -0
  421. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +1 -1
  422. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -3
  423. package/src/resources/extensions/gsd/tests/parallel-worker-lock-contention.test.ts +1 -1
  424. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +0 -1
  425. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +269 -0
  426. package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +8 -1
  427. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +1 -4
  428. package/src/resources/extensions/gsd/tests/preferences.test.ts +19 -0
  429. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +5 -0
  430. package/src/resources/extensions/gsd/tests/read-uat-gate-verdict.test.ts +54 -0
  431. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +49 -1
  432. package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +52 -0
  433. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +95 -1
  434. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -0
  435. package/src/resources/extensions/gsd/tests/sibling-model-fallbacks.test.ts +189 -0
  436. package/src/resources/extensions/gsd/tests/single-field-model-thinking.test.ts +156 -0
  437. package/src/resources/extensions/gsd/tests/skill-discovery.test.ts +46 -0
  438. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +6 -1
  439. package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +3 -5
  440. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +32 -0
  441. package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +2 -1
  442. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +2 -1
  443. package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +1 -1
  444. package/src/resources/extensions/gsd/tests/supervisor-model-swap-inflight-guard.test.ts +181 -0
  445. package/src/resources/extensions/gsd/tests/supervisor-model-swap-thinking-clamp.test.ts +122 -0
  446. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +1 -1
  447. package/src/resources/extensions/gsd/tests/system-flat-phase-layout.test.ts +33 -0
  448. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +4 -4
  449. package/src/resources/extensions/gsd/tests/teardown-cleanup-parity.test.ts +2 -1
  450. package/src/resources/extensions/gsd/tests/teardown-failure-clears-registry.test.ts +4 -4
  451. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +196 -0
  452. package/src/resources/extensions/gsd/tests/uat-dispatch.test.ts +211 -0
  453. package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +1 -1
  454. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +26 -1
  455. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +39 -0
  456. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +226 -2
  457. package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +6 -0
  458. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +213 -2
  459. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +1 -1
  460. package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +1 -1
  461. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +1 -3
  462. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +1 -1
  463. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +1 -1
  464. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +1 -1
  465. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +1 -1
  466. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +2 -1
  467. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +5 -2
  468. package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +1 -1
  469. package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +1 -1
  470. package/src/resources/extensions/gsd/tool-contract.ts +29 -0
  471. package/src/resources/extensions/gsd/tools/complete-milestone.ts +9 -5
  472. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +19 -8
  473. package/src/resources/extensions/gsd/tools/reopen-slice.ts +5 -0
  474. package/src/resources/extensions/gsd/tools/reopen-task.ts +13 -5
  475. package/src/resources/extensions/gsd/tools/validate-milestone.ts +13 -9
  476. package/src/resources/extensions/gsd/types.ts +23 -4
  477. package/src/resources/extensions/gsd/uat-dispatch.ts +176 -0
  478. package/src/resources/extensions/gsd/unit-registry.ts +16 -2
  479. package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +1 -1
  480. package/src/resources/extensions/gsd/uok/audit-toggle.ts +32 -2
  481. package/src/resources/extensions/gsd/uok/audit.ts +2 -0
  482. package/src/resources/extensions/gsd/uok/gate-runner.ts +26 -36
  483. package/src/resources/extensions/gsd/uok/gitops.ts +21 -18
  484. package/src/resources/extensions/gsd/uok/kernel.ts +169 -48
  485. package/src/resources/extensions/gsd/uok/model-policy.ts +20 -17
  486. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -1
  487. package/src/resources/extensions/gsd/workflow-event-ledger.ts +1 -1
  488. package/src/resources/extensions/gsd/workflow-logger.ts +1 -1
  489. package/src/resources/extensions/gsd/workflow-projections.ts +9 -24
  490. package/src/resources/extensions/gsd/workspace-git-preflight.ts +2 -2
  491. package/src/resources/extensions/gsd/workspace.ts +5 -21
  492. package/src/resources/extensions/gsd/worktree-command.ts +1 -1
  493. package/src/resources/extensions/gsd/worktree-lifecycle.ts +19 -15
  494. package/src/resources/extensions/gsd/worktree-reentry.ts +2 -1
  495. package/src/resources/extensions/shared/gsd-browser-cli.ts +29 -0
  496. package/src/resources/extensions/shared/interview-ui.ts +58 -11
  497. package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +32 -0
  498. /package/dist/web/standalone/.next/static/{bCg3aYrFN1DKZr2dqgE7L → 6xYMOzxVhsQgryneJ5KRc}/_buildManifest.js +0 -0
  499. /package/dist/web/standalone/.next/static/{bCg3aYrFN1DKZr2dqgE7L → 6xYMOzxVhsQgryneJ5KRc}/_ssgManifest.js +0 -0
@@ -0,0 +1,176 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Resolve whether a completed slice needs run-uat dispatch.
3
+
4
+ import { loadFile } from "./files.js";
5
+ import type { GSDPreferences } from "./preferences.js";
6
+ import { resolveSliceFile } from "./paths.js";
7
+ import {
8
+ classifyUatContentForRun,
9
+ shouldDispatchUatForContent,
10
+ type UatType,
11
+ } from "./uat-policy.js";
12
+ import { hasVerdict } from "./verdict-parser.js";
13
+ import { logWarning } from "./workflow-logger.js";
14
+
15
+ export interface UatDispatchCandidate {
16
+ sliceId: string;
17
+ }
18
+
19
+ export type RunUatDispatch = { sliceId: string; uatType: UatType };
20
+
21
+ async function loadSliceFileContent(
22
+ base: string,
23
+ milestoneId: string,
24
+ sliceId: string,
25
+ kind: "UAT" | "ASSESSMENT" | "SUMMARY",
26
+ ): Promise<string> {
27
+ const filePath = resolveSliceFile(base, milestoneId, sliceId, kind);
28
+ return filePath ? ((await loadFile(filePath)) ?? "") : "";
29
+ }
30
+
31
+ async function resolveRunUatEffectiveType(
32
+ base: string,
33
+ milestoneId: string,
34
+ sliceId: string,
35
+ uatContent: string,
36
+ ): Promise<UatType> {
37
+ let summaryContent = "";
38
+ try {
39
+ summaryContent = await loadSliceFileContent(
40
+ base,
41
+ milestoneId,
42
+ sliceId,
43
+ "SUMMARY",
44
+ );
45
+ } catch (err) {
46
+ logWarning(
47
+ "prompt",
48
+ `resolveRunUatEffectiveType SUMMARY load failed: ${err instanceof Error ? err.message : String(err)}`,
49
+ );
50
+ }
51
+ return classifyUatContentForRun(uatContent, summaryContent).effectiveType;
52
+ }
53
+
54
+ async function resolveCandidateRunUatDispatch(
55
+ base: string,
56
+ milestoneId: string,
57
+ candidate: UatDispatchCandidate,
58
+ prefs: GSDPreferences | undefined,
59
+ ): Promise<RunUatDispatch | null> {
60
+ const uatContent = await loadSliceFileContent(
61
+ base,
62
+ milestoneId,
63
+ candidate.sliceId,
64
+ "UAT",
65
+ );
66
+ if (!uatContent) return null;
67
+ if (hasVerdict(uatContent)) return null;
68
+
69
+ const assessmentContent = await loadSliceFileContent(
70
+ base,
71
+ milestoneId,
72
+ candidate.sliceId,
73
+ "ASSESSMENT",
74
+ );
75
+ if (assessmentContent && hasVerdict(assessmentContent)) return null;
76
+ if (!shouldDispatchUatForContent(uatContent, prefs)) return null;
77
+
78
+ return {
79
+ sliceId: candidate.sliceId,
80
+ uatType: await resolveRunUatEffectiveType(
81
+ base,
82
+ milestoneId,
83
+ candidate.sliceId,
84
+ uatContent,
85
+ ),
86
+ };
87
+ }
88
+
89
+ async function getDbCompletedSliceCandidates(
90
+ milestoneId: string,
91
+ ): Promise<UatDispatchCandidate[] | null> {
92
+ const { isDbAvailable, getMilestoneSlices } = await import("./gsd-db.js");
93
+ if (!isDbAvailable()) return null;
94
+
95
+ const slices = getMilestoneSlices(milestoneId);
96
+ // No DB slice rows for this milestone: the DB has no authoritative view, so
97
+ // return null to let the caller defer to the roadmap fallback.
98
+ if (slices.length === 0) return null;
99
+
100
+ // The DB has slice rows and is therefore authoritative for this milestone.
101
+ // Return a (possibly empty) array rather than null: an empty result must NOT
102
+ // fall through to the roadmap fallback, because the DB, not stale roadmap
103
+ // checkboxes, is the source of truth for which slices are complete.
104
+ return slices
105
+ .filter((slice) => slice.status === "complete")
106
+ .map((slice) => ({ sliceId: slice.id }))
107
+ .reverse();
108
+ }
109
+
110
+ export async function findRunUatDispatchFromCandidates(
111
+ base: string,
112
+ milestoneId: string,
113
+ candidates: readonly UatDispatchCandidate[],
114
+ prefs: GSDPreferences | undefined,
115
+ ): Promise<RunUatDispatch | null> {
116
+ for (const candidate of candidates) {
117
+ const dispatch = await resolveCandidateRunUatDispatch(
118
+ base,
119
+ milestoneId,
120
+ candidate,
121
+ prefs,
122
+ );
123
+ if (dispatch) return dispatch;
124
+ }
125
+ return null;
126
+ }
127
+
128
+ /**
129
+ * Check if the most recently completed slice needs a UAT run.
130
+ * Returns { sliceId, uatType } if UAT should be dispatched, null otherwise.
131
+ *
132
+ * When the DB has slice rows for the milestone it is authoritative: only its
133
+ * completed slices are considered and the `fallbackCandidates` (roadmap-derived)
134
+ * are ignored, even when no DB slice is complete. The fallback candidates are
135
+ * only consulted when the DB has no slice rows for the milestone, is
136
+ * unavailable, or errors.
137
+ *
138
+ * Skips when:
139
+ * - No completed slices exist in DB or the caller-provided fallback candidates
140
+ * - uat_dispatch is not enabled and the UAT spec does not require runtime/browser evidence
141
+ * - No UAT file exists for the slice
142
+ * - UAT result already exists in the UAT or ASSESSMENT file
143
+ */
144
+ export async function checkNeedsRunUat(
145
+ base: string,
146
+ milestoneId: string,
147
+ prefs: GSDPreferences | undefined,
148
+ fallbackCandidates: readonly UatDispatchCandidate[] = [],
149
+ ): Promise<RunUatDispatch | null> {
150
+ try {
151
+ const dbCandidates = await getDbCompletedSliceCandidates(milestoneId);
152
+ // A non-null result (including an empty array) means the DB is authoritative
153
+ // for this milestone; only fall through to the roadmap fallback when the DB
154
+ // has no slice rows at all (null).
155
+ if (dbCandidates !== null) {
156
+ return findRunUatDispatchFromCandidates(
157
+ base,
158
+ milestoneId,
159
+ dbCandidates,
160
+ prefs,
161
+ );
162
+ }
163
+ } catch (err) {
164
+ logWarning(
165
+ "prompt",
166
+ `checkNeedsRunUat DB lookup failed: ${err instanceof Error ? err.message : String(err)}`,
167
+ );
168
+ }
169
+
170
+ return findRunUatDispatchFromCandidates(
171
+ base,
172
+ milestoneId,
173
+ fallbackCandidates,
174
+ prefs,
175
+ );
176
+ }
@@ -21,8 +21,8 @@
21
21
  // Not yet declared here (remaining ADR-033 steps): the manifest data
22
22
  // (`UNIT_MANIFESTS` stays in unit-context-manifest.ts, already type-enforced
23
23
  // against the registry's `UnitType`). Prompt-template association is declared
24
- // for direct one-template units; conditional/composite prompt selection stays
25
- // with the prompt builders until it has a richer registry shape.
24
+ // for direct one-template units and verified conditional template sets;
25
+ // composition logic stays with prompt builders.
26
26
 
27
27
  import type { CanonicalWorkflowToolName } from "@opengsd/contracts";
28
28
  import { BROWSER_CONTRACT_TOOL_NAMES } from "../shared/browser-contract.js";
@@ -68,6 +68,11 @@ export interface UnitDescriptor {
68
68
  * verified prompt associations.
69
69
  */
70
70
  readonly promptTemplate?: string;
71
+ /**
72
+ * Prompt template ids a conditional or composite builder may choose from.
73
+ * Omitted unless every listed association is verified against the builder.
74
+ */
75
+ readonly promptTemplates?: readonly string[];
71
76
  /** `null` = the unit has no scoped gsd-tool contract. */
72
77
  readonly toolContract: UnitToolSurfaceContract | null;
73
78
  }
@@ -137,6 +142,7 @@ export const UNIT_REGISTRY = {
137
142
  kind: "primary",
138
143
  scopeClass: "standard",
139
144
  phaseChain: ["discuss", "planning"],
145
+ promptTemplates: ["discuss", "discuss-headless", "guided-discuss-milestone"],
140
146
  toolContract: {
141
147
  allowedGsdTools: [
142
148
  "gsd_summary_save",
@@ -526,3 +532,11 @@ export function getUnitPhaseChain(unitType: string): readonly GSDModelPhaseKey[]
526
532
  export function getUnitPromptTemplate(unitType: string): string | undefined {
527
533
  return getUnitDescriptor(unitType)?.promptTemplate;
528
534
  }
535
+
536
+ /** Prompt template ids for any verified direct or conditional prompt builder. */
537
+ export function getUnitPromptTemplates(unitType: string): readonly string[] {
538
+ const descriptor = getUnitDescriptor(unitType);
539
+ if (!descriptor) return [];
540
+ if (descriptor.promptTemplates) return descriptor.promptTemplates;
541
+ return descriptor.promptTemplate ? [descriptor.promptTemplate] : [];
542
+ }
@@ -9,7 +9,7 @@ import {
9
9
  nativeDiffNumstat,
10
10
  nativeIsAncestor,
11
11
  } from "./native-git-bridge.js";
12
- import { autoWorktreeBranch } from "./auto-worktree.js";
12
+ import { autoWorktreeBranch } from "./auto-worktree-branch-lifecycle.js";
13
13
  import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
14
14
  import { getAllMilestones } from "./gsd-db.js";
15
15
  import { resolveMilestoneIntegrationBranch } from "./git-service.js";
@@ -1,9 +1,39 @@
1
1
  const AUDIT_ENV_KEY = "GSD_UOK_AUDIT_UNIFIED";
2
+ const suppressedBasePaths = new Set<string>();
2
3
 
3
4
  export function setUnifiedAuditEnabled(enabled: boolean): void {
4
5
  process.env[AUDIT_ENV_KEY] = enabled ? "1" : "0";
5
6
  }
6
7
 
7
- export function isUnifiedAuditEnabled(): boolean {
8
- return process.env[AUDIT_ENV_KEY] === "1";
8
+ export function setUnifiedAuditSuppressedForBasePath(basePath: string, suppressed: boolean): void {
9
+ if (suppressed) {
10
+ suppressedBasePaths.add(basePath);
11
+ return;
12
+ }
13
+ suppressedBasePaths.delete(basePath);
14
+ }
15
+
16
+ export function isUnifiedAuditEnabled(basePath?: string): boolean {
17
+ if (basePath && suppressedBasePaths.has(basePath)) return false;
18
+ return process.env[AUDIT_ENV_KEY] !== "0";
19
+ }
20
+
21
+ export function getUnifiedAuditOverride(): boolean | undefined {
22
+ const raw = process.env[AUDIT_ENV_KEY];
23
+ if (raw === "0") return false;
24
+ if (raw === "1") return true;
25
+ return undefined;
26
+ }
27
+
28
+ export function restoreUnifiedAuditOverride(override: boolean | undefined): void {
29
+ if (override === undefined) {
30
+ delete process.env[AUDIT_ENV_KEY];
31
+ return;
32
+ }
33
+ setUnifiedAuditEnabled(override);
34
+ }
35
+
36
+ export function clearUnifiedAuditOverrideForTests(): void {
37
+ delete process.env[AUDIT_ENV_KEY];
38
+ suppressedBasePaths.clear();
9
39
  }
@@ -9,6 +9,7 @@ import { withFileLockSync } from "../file-lock.js";
9
9
  import { gsdRoot } from "../paths.js";
10
10
  import { isDbAvailable, insertAuditEvent } from "../gsd-db.js";
11
11
  import { CURRENT_UOK_CONTRACT_VERSION, validateAuditEvent, type AuditEventEnvelope } from "./contracts.js";
12
+ import { isUnifiedAuditEnabled } from "./audit-toggle.js";
12
13
 
13
14
  function auditLogPath(basePath: string): string {
14
15
  return join(gsdRoot(basePath), "audit", "events.jsonl");
@@ -42,6 +43,7 @@ export function buildAuditEnvelope(args: {
42
43
  export function emitUokAuditEvent(basePath: string, event: AuditEventEnvelope): void {
43
44
  // Drop writes from a turn superseded by timeout recovery / cancellation.
44
45
  if (isStaleWrite("uok-audit")) return;
46
+ if (!isUnifiedAuditEnabled(basePath)) return;
45
47
  const validation = validateAuditEvent(event);
46
48
  if (!validation.ok) {
47
49
  throw new Error(`Invalid UOK audit event: ${validation.issues.map((issue) => `${issue.path}: ${issue.message}`).join("; ")}`);
@@ -1,6 +1,7 @@
1
1
  import type { FailureClass, GateResult } from "./contracts.js";
2
2
  import { insertGateRun } from "../gsd-db.js";
3
3
  import { buildAuditEnvelope, emitUokAuditEvent } from "./audit.js";
4
+ import { isUnifiedAuditEnabled } from "./audit-toggle.js";
4
5
 
5
6
  export interface GateRunnerContext {
6
7
  basePath: string;
@@ -38,6 +39,29 @@ const RETRY_MATRIX: Record<FailureClass, number> = {
38
39
  unknown: 0,
39
40
  };
40
41
 
42
+ function emitGateAuditIfEnabled(ctx: GateRunnerContext, result: GateResult): void {
43
+ if (!isUnifiedAuditEnabled(ctx.basePath)) return;
44
+
45
+ emitUokAuditEvent(
46
+ ctx.basePath,
47
+ buildAuditEnvelope({
48
+ traceId: ctx.traceId,
49
+ turnId: ctx.turnId,
50
+ category: "gate",
51
+ type: "gate-run",
52
+ payload: {
53
+ gateId: result.gateId,
54
+ gateType: result.gateType,
55
+ outcome: result.outcome,
56
+ failureClass: result.failureClass,
57
+ attempt: result.attempt,
58
+ maxAttempts: result.maxAttempts,
59
+ retryable: result.retryable,
60
+ },
61
+ }),
62
+ );
63
+ }
64
+
41
65
  export class UokGateRunner {
42
66
  private readonly registry = new Map<string, GateExecutionInput>();
43
67
 
@@ -85,24 +109,7 @@ export class UokGateRunner {
85
109
  evaluatedAt: unknownResult.evaluatedAt,
86
110
  });
87
111
 
88
- emitUokAuditEvent(
89
- ctx.basePath,
90
- buildAuditEnvelope({
91
- traceId: ctx.traceId,
92
- turnId: ctx.turnId,
93
- category: "gate",
94
- type: "gate-run",
95
- payload: {
96
- gateId: unknownResult.gateId,
97
- gateType: unknownResult.gateType,
98
- outcome: unknownResult.outcome,
99
- failureClass: unknownResult.failureClass,
100
- attempt: unknownResult.attempt,
101
- maxAttempts: unknownResult.maxAttempts,
102
- retryable: unknownResult.retryable,
103
- },
104
- }),
105
- );
112
+ emitGateAuditIfEnabled(ctx, unknownResult);
106
113
 
107
114
  return unknownResult;
108
115
  }
@@ -170,24 +177,7 @@ export class UokGateRunner {
170
177
  evaluatedAt: final.evaluatedAt,
171
178
  });
172
179
 
173
- emitUokAuditEvent(
174
- ctx.basePath,
175
- buildAuditEnvelope({
176
- traceId: ctx.traceId,
177
- turnId: ctx.turnId,
178
- category: "gate",
179
- type: "gate-run",
180
- payload: {
181
- gateId: final.gateId,
182
- gateType: final.gateType,
183
- outcome: final.outcome,
184
- failureClass: final.failureClass,
185
- attempt: final.attempt,
186
- maxAttempts: final.maxAttempts,
187
- retryable: final.retryable,
188
- },
189
- }),
190
- );
180
+ emitGateAuditIfEnabled(ctx, final);
191
181
 
192
182
  if (!retryable) break;
193
183
  }
@@ -1,6 +1,7 @@
1
1
  import { isDbAvailable, upsertTurnGitTransaction } from "../gsd-db.js";
2
2
  import type { TurnCloseoutRecord } from "./contracts.js";
3
3
  import { buildAuditEnvelope, emitUokAuditEvent } from "./audit.js";
4
+ import { isUnifiedAuditEnabled } from "./audit-toggle.js";
4
5
 
5
6
  export type TurnGitStage = "turn-start" | "stage" | "checkpoint" | "publish" | "record";
6
7
 
@@ -34,24 +35,26 @@ export function writeTurnGitTransaction(args: GitTxArgs): void {
34
35
  updatedAt: new Date().toISOString(),
35
36
  });
36
37
 
37
- emitUokAuditEvent(
38
- args.basePath,
39
- buildAuditEnvelope({
40
- traceId: args.traceId,
41
- turnId: args.turnId,
42
- category: "gitops",
43
- type: `turn-git-${args.stage}`,
44
- payload: {
45
- unitType: args.unitType,
46
- unitId: args.unitId,
47
- action: args.action,
48
- push: args.push,
49
- status: args.status,
50
- error: args.error,
51
- ...(args.metadata ?? {}),
52
- },
53
- }),
54
- );
38
+ if (isUnifiedAuditEnabled(args.basePath)) {
39
+ emitUokAuditEvent(
40
+ args.basePath,
41
+ buildAuditEnvelope({
42
+ traceId: args.traceId,
43
+ turnId: args.turnId,
44
+ category: "gitops",
45
+ type: `turn-git-${args.stage}`,
46
+ payload: {
47
+ unitType: args.unitType,
48
+ unitId: args.unitId,
49
+ action: args.action,
50
+ push: args.push,
51
+ status: args.status,
52
+ error: args.error,
53
+ ...(args.metadata ?? {}),
54
+ },
55
+ }),
56
+ );
57
+ }
55
58
  }
56
59
 
57
60
  export function writeTurnCloseoutGitRecord(
@@ -8,10 +8,16 @@ import type { AutoSession } from "../auto/session.js";
8
8
  import type { LoopDeps } from "../auto/loop-deps.js";
9
9
  import { gsdRoot } from "../paths.js";
10
10
  import { buildAuditEnvelope, emitUokAuditEvent } from "./audit.js";
11
- import { setUnifiedAuditEnabled } from "./audit-toggle.js";
12
- import { resolveUokFlags } from "./flags.js";
11
+ import {
12
+ getUnifiedAuditOverride,
13
+ restoreUnifiedAuditOverride,
14
+ setUnifiedAuditEnabled,
15
+ setUnifiedAuditSuppressedForBasePath,
16
+ } from "./audit-toggle.js";
17
+ import { resolveUokFlags, type UokFlags } from "./flags.js";
13
18
  import { createTurnObserver } from "./loop-adapter.js";
14
19
  import { incrementLegacyTelemetry } from "../legacy-telemetry.js";
20
+ import { logWarning } from "../workflow-logger.js";
15
21
 
16
22
  interface RunAutoLoopWithUokArgs {
17
23
  ctx: ExtensionContext;
@@ -45,80 +51,195 @@ function writeParityEvent(basePath: string, event: Record<string, unknown>): voi
45
51
  }
46
52
  }
47
53
 
54
+ type UokKernelPathLabel = "uok-kernel" | "legacy-wrapper" | "legacy-fallback";
55
+
56
+ interface UokKernelRunPlan {
57
+ flags: UokFlags;
58
+ pathLabel: UokKernelPathLabel;
59
+ traceId: string;
60
+ useKernel: boolean;
61
+ }
62
+
48
63
  function resolveKernelPathLabel(
49
- flags: ReturnType<typeof resolveUokFlags>,
50
- ): "uok-kernel" | "legacy-wrapper" | "legacy-fallback" {
64
+ flags: UokFlags,
65
+ ): UokKernelPathLabel {
51
66
  if (flags.legacyFallback) return "legacy-fallback";
52
67
  return flags.enabled ? "uok-kernel" : "legacy-wrapper";
53
68
  }
54
69
 
55
- export async function runAutoLoopWithUok(args: RunAutoLoopWithUokArgs): Promise<void> {
56
- const { ctx, pi, s, deps, runKernelLoop, runLegacyLoop } = args;
57
- const prefs = deps.loadEffectiveGSDPreferences()?.preferences;
58
- const flags = resolveUokFlags(prefs);
59
- setUnifiedAuditEnabled(flags.auditUnified);
70
+ function createUokKernelRunPlan(input: {
71
+ preferences: ReturnType<LoopDeps["loadEffectiveGSDPreferences"]> | undefined;
72
+ autoStartTime?: unknown;
73
+ }): UokKernelRunPlan {
74
+ const flags = resolveUokFlags(input.preferences?.preferences);
60
75
  const pathLabel = resolveKernelPathLabel(flags);
61
- if (pathLabel !== "uok-kernel") {
62
- incrementLegacyTelemetry("legacy.uokFallbackUsed");
63
- }
64
-
65
- writeParityEvent(s.basePath, {
66
- ts: new Date().toISOString(),
67
- path: pathLabel,
76
+ return {
68
77
  flags,
69
- phase: "enter",
70
- });
78
+ pathLabel,
79
+ traceId: `session:${String(input.autoStartTime || Date.now())}`,
80
+ useKernel: flags.enabled,
81
+ };
82
+ }
83
+
84
+ interface KernelAuditStateController {
85
+ apply(enabled: boolean): void;
86
+ restore(): void;
87
+ }
88
+
89
+ function createKernelAuditStateController(basePath: string): KernelAuditStateController {
90
+ const previousAuditOverride = getUnifiedAuditOverride();
91
+ return {
92
+ apply(enabled): void {
93
+ setUnifiedAuditSuppressedForBasePath(basePath, !enabled);
94
+ setUnifiedAuditEnabled(enabled);
95
+ },
96
+ restore(): void {
97
+ restoreUnifiedAuditOverride(previousAuditOverride);
98
+ },
99
+ };
100
+ }
71
101
 
72
- if (flags.auditUnified) {
102
+ function emitKernelEnterAudit(input: {
103
+ basePath: string;
104
+ plan: UokKernelRunPlan;
105
+ sessionId?: string;
106
+ }): boolean {
107
+ if (!input.plan.flags.auditUnified) return true;
108
+
109
+ try {
73
110
  emitUokAuditEvent(
74
- s.basePath,
111
+ input.basePath,
75
112
  buildAuditEnvelope({
76
- traceId: `session:${String(s.autoStartTime || Date.now())}`,
113
+ traceId: input.plan.traceId,
77
114
  category: "orchestration",
78
115
  type: "uok-kernel-enter",
79
116
  payload: {
80
- flags,
81
- sessionId: ctx.sessionManager?.getSessionId?.(),
117
+ flags: input.plan.flags,
118
+ sessionId: input.sessionId,
82
119
  },
83
120
  }),
84
121
  );
122
+ return true;
123
+ } catch (err) {
124
+ const errorMessage = err instanceof Error ? err.message : String(err);
125
+ writeParityEvent(input.basePath, {
126
+ ts: new Date().toISOString(),
127
+ path: input.plan.pathLabel,
128
+ flags: input.plan.flags,
129
+ phase: "telemetry-error",
130
+ telemetry: "uok-kernel-enter",
131
+ error: errorMessage,
132
+ });
133
+ logWarning("db", `uok-kernel-enter audit emit failed (non-fatal): ${errorMessage}`);
134
+ return false;
85
135
  }
136
+ }
86
137
 
87
- const decoratedDeps: LoopDeps = flags.enabled
88
- ? {
89
- ...deps,
90
- uokObserver: createTurnObserver({
91
- basePath: s.basePath,
92
- gitAction: flags.gitopsTurnAction,
93
- gitPush: flags.gitopsTurnPush,
94
- enableAudit: flags.auditUnified,
95
- enableGitops: flags.gitops,
96
- }),
97
- }
98
- : deps;
138
+ function decorateLoopDepsForKernel(input: {
139
+ deps: LoopDeps;
140
+ basePath: string;
141
+ plan: UokKernelRunPlan;
142
+ auditHealthy: boolean;
143
+ }): LoopDeps {
144
+ if (!input.plan.useKernel) return input.deps;
145
+
146
+ return {
147
+ ...input.deps,
148
+ uokObserver: createTurnObserver({
149
+ basePath: input.basePath,
150
+ gitAction: input.plan.flags.gitopsTurnAction,
151
+ gitPush: input.plan.flags.gitopsTurnPush,
152
+ enableAudit: input.plan.flags.auditUnified && input.auditHealthy,
153
+ enableGitops: input.plan.flags.gitops,
154
+ }),
155
+ };
156
+ }
157
+
158
+ async function executeKernelRunPlan(input: {
159
+ plan: UokKernelRunPlan;
160
+ ctx: ExtensionContext;
161
+ pi: ExtensionAPI;
162
+ s: AutoSession;
163
+ deps: LoopDeps;
164
+ kernelDeps: LoopDeps;
165
+ runKernelLoop: RunAutoLoopWithUokArgs["runKernelLoop"];
166
+ runLegacyLoop: RunAutoLoopWithUokArgs["runLegacyLoop"];
167
+ }): Promise<void> {
168
+ if (input.plan.useKernel) {
169
+ await input.runKernelLoop(input.ctx, input.pi, input.s, input.kernelDeps);
170
+ return;
171
+ }
172
+ await input.runLegacyLoop(input.ctx, input.pi, input.s, input.deps);
173
+ }
174
+
175
+ export async function runAutoLoopWithUok(args: RunAutoLoopWithUokArgs): Promise<void> {
176
+ const { ctx, pi, s, deps, runKernelLoop, runLegacyLoop } = args;
177
+ const auditState = createKernelAuditStateController(s.basePath);
178
+ let plan: UokKernelRunPlan | null = null;
99
179
 
100
180
  try {
101
- if (flags.enabled) {
102
- await runKernelLoop(ctx, pi, s, decoratedDeps);
103
- } else {
104
- await runLegacyLoop(ctx, pi, s, deps);
181
+ plan = createUokKernelRunPlan({
182
+ preferences: deps.loadEffectiveGSDPreferences(),
183
+ autoStartTime: s.autoStartTime,
184
+ });
185
+ auditState.apply(plan.flags.auditUnified);
186
+
187
+ if (plan.pathLabel !== "uok-kernel") {
188
+ incrementLegacyTelemetry("legacy.uokFallbackUsed");
105
189
  }
190
+
106
191
  writeParityEvent(s.basePath, {
107
192
  ts: new Date().toISOString(),
108
- path: pathLabel,
109
- flags,
110
- phase: "exit",
111
- status: "ok",
193
+ path: plan.pathLabel,
194
+ flags: plan.flags,
195
+ phase: "enter",
112
196
  });
113
- } catch (err) {
197
+
198
+ const auditHealthy = emitKernelEnterAudit({
199
+ basePath: s.basePath,
200
+ plan,
201
+ sessionId: ctx.sessionManager?.getSessionId?.(),
202
+ });
203
+ auditState.apply(plan.flags.auditUnified && auditHealthy);
204
+
205
+ const kernelDeps = decorateLoopDepsForKernel({
206
+ deps,
207
+ basePath: s.basePath,
208
+ plan,
209
+ auditHealthy,
210
+ });
211
+
212
+ await executeKernelRunPlan({
213
+ plan,
214
+ ctx,
215
+ pi,
216
+ s,
217
+ deps,
218
+ kernelDeps,
219
+ runKernelLoop,
220
+ runLegacyLoop,
221
+ });
222
+
114
223
  writeParityEvent(s.basePath, {
115
224
  ts: new Date().toISOString(),
116
- path: pathLabel,
117
- flags,
225
+ path: plan.pathLabel,
226
+ flags: plan.flags,
118
227
  phase: "exit",
119
- status: "error",
120
- error: err instanceof Error ? err.message : String(err),
228
+ status: "ok",
121
229
  });
230
+ } catch (err) {
231
+ if (plan) {
232
+ writeParityEvent(s.basePath, {
233
+ ts: new Date().toISOString(),
234
+ path: plan.pathLabel,
235
+ flags: plan.flags,
236
+ phase: "exit",
237
+ status: "error",
238
+ error: err instanceof Error ? err.message : String(err),
239
+ });
240
+ }
122
241
  throw err;
242
+ } finally {
243
+ auditState.restore();
123
244
  }
124
245
  }