@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,211 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Tests for run-uat dispatch discovery boundaries.
3
+
4
+ import assert from "node:assert/strict";
5
+ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
6
+ import { tmpdir } from "node:os";
7
+ import { join } from "node:path";
8
+ import { test } from "node:test";
9
+
10
+ import { checkNeedsRunUat as checkNeedsRunUatFromPrompts } from "../auto-prompts.ts";
11
+ import {
12
+ closeDatabase,
13
+ insertMilestone,
14
+ insertSlice,
15
+ isDbAvailable,
16
+ openDatabase,
17
+ } from "../gsd-db.ts";
18
+ import { checkNeedsRunUat } from "../uat-dispatch.ts";
19
+ import type { GSDState } from "../types.ts";
20
+
21
+ function createFixtureBase(): string {
22
+ const base = mkdtempSync(join(tmpdir(), "gsd-uat-dispatch-test-"));
23
+ mkdirSync(join(base, ".gsd", "milestones"), { recursive: true });
24
+ return base;
25
+ }
26
+
27
+ function writeRoadmap(base: string, milestoneId: string): void {
28
+ const dir = join(base, ".gsd", "milestones", milestoneId);
29
+ mkdirSync(dir, { recursive: true });
30
+ writeFileSync(
31
+ join(dir, `${milestoneId}-ROADMAP.md`),
32
+ [
33
+ `# ${milestoneId}: UAT dispatch`,
34
+ "",
35
+ "## Slices",
36
+ "",
37
+ "- [x] **S01: First slice** `risk:low` `depends:[]`",
38
+ "- [ ] **S02: Next slice** `risk:low` `depends:[S01]`",
39
+ "",
40
+ "## Boundary Map",
41
+ "",
42
+ ].join("\n"),
43
+ );
44
+ }
45
+
46
+ function writeSliceFile(
47
+ base: string,
48
+ milestoneId: string,
49
+ sliceId: string,
50
+ suffix: string,
51
+ content: string,
52
+ ): void {
53
+ const dir = join(base, ".gsd", "milestones", milestoneId, "slices", sliceId);
54
+ mkdirSync(dir, { recursive: true });
55
+ writeFileSync(join(dir, `${sliceId}-${suffix}.md`), content);
56
+ }
57
+
58
+ test("checkNeedsRunUat resolves runtime harness dispatch from UAT plus summary context", async (t) => {
59
+ const base = createFixtureBase();
60
+ t.after(() => rmSync(base, { recursive: true, force: true }));
61
+
62
+ writeRoadmap(base, "M001");
63
+ writeSliceFile(
64
+ base,
65
+ "M001",
66
+ "S01",
67
+ "UAT",
68
+ [
69
+ "# S01 UAT",
70
+ "",
71
+ "## UAT Type",
72
+ "- UAT mode: browser-executable",
73
+ "",
74
+ "## Preconditions",
75
+ "- Start the dev server with `npm run test:server`.",
76
+ ].join("\n"),
77
+ );
78
+ writeSliceFile(
79
+ base,
80
+ "M001",
81
+ "S01",
82
+ "SUMMARY",
83
+ [
84
+ "# S01 Summary",
85
+ "",
86
+ "Verification: `npm run test:uat` passed and exercises the browser harness end-to-end.",
87
+ ].join("\n"),
88
+ );
89
+
90
+ assert.deepEqual(await checkNeedsRunUat(base, "M001", { uat_dispatch: true }, [{ sliceId: "S01" }]), {
91
+ sliceId: "S01",
92
+ uatType: "runtime-executable",
93
+ });
94
+ });
95
+
96
+ test("checkNeedsRunUat skips slices that already have an ASSESSMENT verdict", async (t) => {
97
+ const base = createFixtureBase();
98
+ t.after(() => rmSync(base, { recursive: true, force: true }));
99
+
100
+ writeRoadmap(base, "M001");
101
+ writeSliceFile(
102
+ base,
103
+ "M001",
104
+ "S01",
105
+ "UAT",
106
+ [
107
+ "# S01 UAT",
108
+ "",
109
+ "## UAT Type",
110
+ "- UAT mode: artifact-driven",
111
+ ].join("\n"),
112
+ );
113
+ writeSliceFile(base, "M001", "S01", "ASSESSMENT", "---\nverdict: PASS\n---\n# UAT Assessment\n");
114
+
115
+ assert.equal(await checkNeedsRunUat(base, "M001", { uat_dispatch: true }, [{ sliceId: "S01" }]), null);
116
+ });
117
+
118
+ test("auto-prompts keeps the compatibility checkNeedsRunUat wrapper", async (t) => {
119
+ const base = createFixtureBase();
120
+ t.after(() => rmSync(base, { recursive: true, force: true }));
121
+
122
+ writeRoadmap(base, "M001");
123
+ writeSliceFile(
124
+ base,
125
+ "M001",
126
+ "S01",
127
+ "UAT",
128
+ [
129
+ "# S01 UAT",
130
+ "",
131
+ "## UAT Type",
132
+ "- UAT mode: human-experience",
133
+ ].join("\n"),
134
+ );
135
+
136
+ const legacyState: GSDState = {
137
+ activeMilestone: { id: "M001", title: "UAT dispatch" },
138
+ activeSlice: { id: "S02", title: "Next slice" },
139
+ activeTask: null,
140
+ phase: "planning",
141
+ recentDecisions: [],
142
+ blockers: [],
143
+ nextAction: "Plan S02",
144
+ registry: [],
145
+ };
146
+
147
+ assert.deepEqual(
148
+ await checkNeedsRunUatFromPrompts(base, "M001", legacyState, { uat_dispatch: true }),
149
+ { sliceId: "S01", uatType: "human-experience" },
150
+ );
151
+ });
152
+
153
+ test("checkNeedsRunUat treats the DB as authoritative and ignores roadmap fallback when DB slices exist but none are complete", async (t) => {
154
+ const base = createFixtureBase();
155
+ t.after(() => {
156
+ closeDatabase();
157
+ rmSync(base, { recursive: true, force: true });
158
+ });
159
+
160
+ // DB knows this milestone's slices, but none are complete.
161
+ openDatabase(":memory:");
162
+ assert.ok(isDbAvailable());
163
+ insertMilestone({ id: "M001", title: "UAT dispatch", status: "active" });
164
+ insertSlice({ id: "S01", milestoneId: "M001", title: "First slice", status: "active", risk: "low", depends: [] });
165
+ insertSlice({ id: "S02", milestoneId: "M001", title: "Next slice", status: "pending", risk: "low", depends: [] });
166
+
167
+ // The roadmap shows S01 completed and a dispatchable UAT file exists, so the
168
+ // roadmap fallback *would* dispatch S01 if it were (incorrectly) consulted.
169
+ writeRoadmap(base, "M001");
170
+ writeSliceFile(
171
+ base,
172
+ "M001",
173
+ "S01",
174
+ "UAT",
175
+ ["# S01 UAT", "", "## UAT Type", "- UAT mode: human-experience"].join("\n"),
176
+ );
177
+
178
+ // DB is authoritative: no completed slices means no dispatch, and the roadmap
179
+ // fallback candidate must NOT be consulted (regression for #1268).
180
+ assert.equal(
181
+ await checkNeedsRunUat(base, "M001", { uat_dispatch: true }, [{ sliceId: "S01" }]),
182
+ null,
183
+ );
184
+ });
185
+
186
+ test("checkNeedsRunUat uses roadmap fallback candidates when the DB has no slice rows for the milestone", async (t) => {
187
+ const base = createFixtureBase();
188
+ t.after(() => {
189
+ closeDatabase();
190
+ rmSync(base, { recursive: true, force: true });
191
+ });
192
+
193
+ // DB is available but has no rows for M001, so it has no authoritative view.
194
+ openDatabase(":memory:");
195
+ assert.ok(isDbAvailable());
196
+
197
+ writeRoadmap(base, "M001");
198
+ writeSliceFile(
199
+ base,
200
+ "M001",
201
+ "S01",
202
+ "UAT",
203
+ ["# S01 UAT", "", "## UAT Type", "- UAT mode: human-experience"].join("\n"),
204
+ );
205
+
206
+ // With no DB slice rows, the roadmap-derived fallback candidate is honored.
207
+ assert.deepEqual(
208
+ await checkNeedsRunUat(base, "M001", { uat_dispatch: true }, [{ sliceId: "S01" }]),
209
+ { sliceId: "S01", uatType: "human-experience" },
210
+ );
211
+ });
@@ -30,7 +30,7 @@ import { join } from "node:path";
30
30
  import { tmpdir } from "node:os";
31
31
  import { execFileSync } from "node:child_process";
32
32
 
33
- import { syncProjectRootToWorktree } from "../auto-worktree.ts";
33
+ import { syncProjectRootToWorktree } from "../auto-worktree-sync.ts";
34
34
  import {
35
35
  createWorktree,
36
36
  removeWorktree,
@@ -18,6 +18,7 @@ import {
18
18
  getUnitDescriptor,
19
19
  getUnitPhaseChain,
20
20
  getUnitPromptTemplate,
21
+ getUnitPromptTemplates,
21
22
  } from "../unit-registry.ts";
22
23
  import {
23
24
  AUTO_UNIT_SCOPED_TOOLS,
@@ -123,13 +124,16 @@ const EXPECTED_DIRECT_PROMPT_TEMPLATES: Record<string, string> = {
123
124
  };
124
125
 
125
126
  const EXPECTED_UNDECLARED_PROMPT_TEMPLATE_TYPES = [
126
- "discuss-milestone",
127
127
  "discuss-slice",
128
128
  "execute-task-simple",
129
129
  "triage-captures",
130
130
  "quick-task",
131
131
  ];
132
132
 
133
+ const EXPECTED_CONDITIONAL_PROMPT_TEMPLATES: Record<string, string[]> = {
134
+ "discuss-milestone": ["discuss", "discuss-headless", "guided-discuss-milestone"],
135
+ };
136
+
133
137
  // ─── Derived-view parity ──────────────────────────────────────────────────
134
138
 
135
139
  test("KNOWN_UNIT_TYPES derives exactly the pre-registry list, in order", () => {
@@ -190,6 +194,27 @@ test("direct prompt-template associations live on the Unit Registry", () => {
190
194
  }
191
195
  });
192
196
 
197
+ test("conditional prompt-template associations live on the Unit Registry without pretending to be direct", () => {
198
+ for (const [unitType, promptTemplates] of Object.entries(EXPECTED_CONDITIONAL_PROMPT_TEMPLATES)) {
199
+ assert.equal(
200
+ getUnitPromptTemplate(unitType),
201
+ undefined,
202
+ `${unitType} must not expose a single direct prompt template`,
203
+ );
204
+ assert.deepEqual(
205
+ getUnitPromptTemplates(unitType),
206
+ promptTemplates,
207
+ `prompt templates for ${unitType}`,
208
+ );
209
+ for (const promptTemplate of promptTemplates) {
210
+ assert.ok(
211
+ existsSync(join(process.cwd(), "src/resources/extensions/gsd/prompts", `${promptTemplate}.md`)),
212
+ `prompt template file must exist for ${unitType}: ${promptTemplate}`,
213
+ );
214
+ }
215
+ }
216
+ });
217
+
193
218
  test("AUTO_UNIT_SCOPED_TOOLS mirrors each contract's allowed tools", () => {
194
219
  for (const [unitType, contract] of Object.entries(UNIT_TOOL_CONTRACTS)) {
195
220
  assert.deepEqual(AUTO_UNIT_SCOPED_TOOLS[unitType], contract.allowedGsdTools);
@@ -3,14 +3,20 @@ import assert from "node:assert/strict";
3
3
 
4
4
  import { closeDatabase, openDatabase, _getAdapter } from "../gsd-db.ts";
5
5
  import { UokGateRunner } from "../uok/gate-runner.ts";
6
+ import {
7
+ clearUnifiedAuditOverrideForTests,
8
+ setUnifiedAuditEnabled,
9
+ } from "../uok/audit-toggle.ts";
6
10
 
7
11
  test.beforeEach(() => {
12
+ setUnifiedAuditEnabled(true);
8
13
  closeDatabase();
9
14
  const ok = openDatabase(":memory:");
10
15
  assert.equal(ok, true);
11
16
  });
12
17
 
13
18
  test.afterEach(() => {
19
+ clearUnifiedAuditOverrideForTests();
14
20
  closeDatabase();
15
21
  });
16
22
 
@@ -69,6 +75,39 @@ test("uok gate runner returns manual-attention for unknown gate id", async () =>
69
75
  assert.equal(result.failureClass, "unknown");
70
76
  });
71
77
 
78
+ test("uok gate runner emits audit by default for standalone callers", async () => {
79
+ clearUnifiedAuditOverrideForTests();
80
+ const runner = new UokGateRunner();
81
+ await runner.run("standalone-missing-gate", {
82
+ basePath: process.cwd(),
83
+ traceId: "trace-standalone",
84
+ turnId: "turn-standalone",
85
+ });
86
+
87
+ const adapter = _getAdapter();
88
+ const rows = adapter?.prepare(
89
+ "SELECT type FROM audit_events WHERE trace_id = 'trace-standalone'",
90
+ ).all() ?? [];
91
+ assert.equal(rows.length, 1);
92
+ assert.equal(rows[0]?.["type"], "gate-run");
93
+ });
94
+
95
+ test("uok gate runner skips audit when unified audit is explicitly disabled", async () => {
96
+ setUnifiedAuditEnabled(false);
97
+ const runner = new UokGateRunner();
98
+ await runner.run("disabled-audit-missing-gate", {
99
+ basePath: process.cwd(),
100
+ traceId: "trace-disabled-audit",
101
+ turnId: "turn-disabled-audit",
102
+ });
103
+
104
+ const adapter = _getAdapter();
105
+ const rows = adapter?.prepare(
106
+ "SELECT type FROM audit_events WHERE trace_id = 'trace-disabled-audit'",
107
+ ).all() ?? [];
108
+ assert.equal(rows.length, 0);
109
+ });
110
+
72
111
  // Regression tests for #4950
73
112
 
74
113
  test("uok gate runner: gate.execute throws — outcome is fail, audit emitted, DB row written, no exception escapes", async () => {
@@ -2,7 +2,7 @@
2
2
  // File Purpose: Verifies UOK kernel path selection and legacy fallback telemetry.
3
3
  import test from "node:test";
4
4
  import assert from "node:assert/strict";
5
- import { mkdtempSync, readFileSync, rmSync } from "node:fs";
5
+ import { mkdirSync, mkdtempSync, readFileSync, rmSync } from "node:fs";
6
6
  import { join } from "node:path";
7
7
  import { tmpdir } from "node:os";
8
8
 
@@ -14,6 +14,16 @@ import type { LoopDeps } from "../auto/loop-deps.ts";
14
14
  import { gsdRoot } from "../paths.ts";
15
15
  import type { GSDPreferences } from "../preferences.ts";
16
16
  import { getLegacyTelemetry, resetLegacyTelemetry } from "../legacy-telemetry.ts";
17
+ import { _getAdapter, closeDatabase, openDatabase } from "../gsd-db.ts";
18
+ import { UokGateRunner } from "../uok/gate-runner.ts";
19
+ import { applyModelPolicyFilter } from "../uok/model-policy.ts";
20
+ import {
21
+ clearUnifiedAuditOverrideForTests,
22
+ isUnifiedAuditEnabled,
23
+ setUnifiedAuditEnabled,
24
+ } from "../uok/audit-toggle.ts";
25
+ import { writeEscalationArtifact } from "../escalation.ts";
26
+ import { peekLogs, _resetLogs } from "../workflow-logger.ts";
17
27
 
18
28
  function makeBasePath(): string {
19
29
  return mkdtempSync(join(tmpdir(), "gsd-uok-kernel-"));
@@ -104,7 +114,8 @@ test("runAutoLoopWithUok uses kernel path by default and records uok-kernel pari
104
114
  assert.ok(args.calls.kernelDeps);
105
115
  assert.notEqual(args.calls.kernelDeps, args.deps);
106
116
  assert.ok(args.calls.kernelDeps?.uokObserver);
107
- assert.equal(process.env.GSD_UOK_AUDIT_UNIFIED, "0");
117
+ assert.equal(isUnifiedAuditEnabled(), true);
118
+ assert.equal(isUnifiedAuditEnabled(basePath), false);
108
119
 
109
120
  const events = readParityEvents(basePath);
110
121
  assert.equal(events.length, 2);
@@ -120,6 +131,37 @@ test("runAutoLoopWithUok uses kernel path by default and records uok-kernel pari
120
131
  }
121
132
  });
122
133
 
134
+ test("runAutoLoopWithUok keeps audit disabled for legacy-wrapper while restoring process override", async () => {
135
+ const basePath = makeBasePath();
136
+ clearUnifiedAuditOverrideForTests();
137
+ try {
138
+ resetLegacyTelemetry();
139
+ const args = makeArgs(basePath, {
140
+ uok: {
141
+ enabled: false,
142
+ audit_unified: { enabled: false },
143
+ },
144
+ });
145
+ await runAutoLoopWithUok(args);
146
+
147
+ assert.equal(args.calls.kernel, 0);
148
+ assert.equal(args.calls.legacy, 1);
149
+ assert.equal(isUnifiedAuditEnabled(), true);
150
+ assert.equal(isUnifiedAuditEnabled(basePath), false);
151
+
152
+ const events = readParityEvents(basePath);
153
+ assert.equal(events.length, 2);
154
+ assert.equal(events[0]?.path, "legacy-wrapper");
155
+ assert.equal(events[1]?.path, "legacy-wrapper");
156
+ assert.equal(events[1]?.status, "ok");
157
+ assert.equal(getLegacyTelemetry()["legacy.uokFallbackUsed"], 1);
158
+ } finally {
159
+ clearUnifiedAuditOverrideForTests();
160
+ resetLegacyTelemetry();
161
+ rmSync(basePath, { recursive: true, force: true });
162
+ }
163
+ });
164
+
123
165
  test("runAutoLoopWithUok uses legacy path when explicit legacy fallback is enabled", async () => {
124
166
  const basePath = makeBasePath();
125
167
  try {
@@ -176,3 +218,185 @@ test("runAutoLoopWithUok respects GSD_UOK_FORCE_LEGACY emergency switch", async
176
218
  rmSync(basePath, { recursive: true, force: true });
177
219
  }
178
220
  });
221
+
222
+ test("runAutoLoopWithUok records error exit and restores previous audit override when kernel fails", async () => {
223
+ const basePath = makeBasePath();
224
+ clearUnifiedAuditOverrideForTests();
225
+ setUnifiedAuditEnabled(false);
226
+ try {
227
+ resetLegacyTelemetry();
228
+ const args = makeArgs(basePath, {
229
+ uok: {
230
+ enabled: true,
231
+ audit_unified: { enabled: true },
232
+ gitops: { enabled: false },
233
+ },
234
+ });
235
+ args.runKernelLoop = async (_ctx, _pi, _s, loopDeps): Promise<void> => {
236
+ args.calls.kernel += 1;
237
+ args.calls.kernelDeps = loopDeps;
238
+ throw new Error("kernel exploded");
239
+ };
240
+
241
+ await assert.rejects(
242
+ () => runAutoLoopWithUok(args),
243
+ /kernel exploded/,
244
+ );
245
+
246
+ assert.equal(args.calls.kernel, 1);
247
+ assert.equal(args.calls.legacy, 0);
248
+ assert.equal(isUnifiedAuditEnabled(), false);
249
+
250
+ const events = readParityEvents(basePath);
251
+ assert.equal(events.length, 2);
252
+ assert.equal(events[0]?.phase, "enter");
253
+ assert.equal(events[1]?.phase, "exit");
254
+ assert.equal(events[1]?.status, "error");
255
+ assert.match(String(events[1]?.error), /kernel exploded/);
256
+ } finally {
257
+ clearUnifiedAuditOverrideForTests();
258
+ resetLegacyTelemetry();
259
+ rmSync(basePath, { recursive: true, force: true });
260
+ }
261
+ });
262
+
263
+ test("runAutoLoopWithUok treats kernel-enter audit failures as telemetry-only", async (t) => {
264
+ const basePath = makeBasePath();
265
+ const dbPath = join(basePath, ".gsd", "gsd.db");
266
+ clearUnifiedAuditOverrideForTests();
267
+ _resetLogs();
268
+ mkdirSync(join(basePath, ".gsd"), { recursive: true });
269
+ assert.equal(openDatabase(dbPath), true, "DB must open for this scenario");
270
+ t.after(() => {
271
+ clearUnifiedAuditOverrideForTests();
272
+ closeDatabase();
273
+ _resetLogs();
274
+ rmSync(basePath, { recursive: true, force: true });
275
+ });
276
+
277
+ _getAdapter()!.exec("DROP TABLE audit_events");
278
+
279
+ const args = makeArgs(basePath, {
280
+ uok: {
281
+ enabled: true,
282
+ audit_unified: { enabled: true },
283
+ gitops: { enabled: false },
284
+ },
285
+ });
286
+ args.runKernelLoop = async (_ctx, _pi, _s, loopDeps): Promise<void> => {
287
+ args.calls.kernel += 1;
288
+ args.calls.kernelDeps = loopDeps;
289
+ const observer = loopDeps.uokObserver;
290
+ assert.ok(observer, "kernel path must still install a turn observer");
291
+ observer.onTurnStart({
292
+ basePath,
293
+ traceId: "trace-audit-down",
294
+ turnId: "turn-audit-down",
295
+ iteration: 1,
296
+ unitType: "execute-task",
297
+ unitId: "M001/S01/T01",
298
+ startedAt: new Date().toISOString(),
299
+ });
300
+ observer.onTurnResult({
301
+ traceId: "trace-audit-down",
302
+ turnId: "turn-audit-down",
303
+ iteration: 1,
304
+ unitType: "execute-task",
305
+ unitId: "M001/S01/T01",
306
+ status: "completed",
307
+ failureClass: "none",
308
+ phaseResults: [],
309
+ startedAt: new Date().toISOString(),
310
+ finishedAt: new Date().toISOString(),
311
+ });
312
+
313
+ const gateRunner = new UokGateRunner();
314
+ gateRunner.register({
315
+ id: "test-gate",
316
+ type: "policy",
317
+ execute: async () => ({
318
+ outcome: "pass",
319
+ failureClass: "none",
320
+ rationale: "ok",
321
+ }),
322
+ });
323
+ await gateRunner.run("test-gate", {
324
+ basePath,
325
+ traceId: "trace-audit-down",
326
+ turnId: "turn-audit-down",
327
+ unitType: "execute-task",
328
+ unitId: "M001/S01/T01",
329
+ });
330
+
331
+ const filtered = applyModelPolicyFilter(
332
+ [{ id: "model-a", provider: "openai", api: "responses" }],
333
+ {
334
+ basePath,
335
+ traceId: "trace-audit-down",
336
+ turnId: "turn-audit-down",
337
+ unitType: "execute-task",
338
+ },
339
+ );
340
+ assert.equal(filtered.eligible.length, 1);
341
+
342
+ mkdirSync(join(basePath, ".gsd", "milestones", "M001", "slices", "S01", "tasks"), {
343
+ recursive: true,
344
+ });
345
+ writeEscalationArtifact(basePath, {
346
+ version: 1,
347
+ taskId: "T01",
348
+ sliceId: "S01",
349
+ milestoneId: "M001",
350
+ question: "Choose a path",
351
+ options: [
352
+ { id: "a", label: "A", tradeoffs: "First path" },
353
+ { id: "b", label: "B", tradeoffs: "Second path" },
354
+ ],
355
+ recommendation: "a",
356
+ recommendationRationale: "Test recommendation",
357
+ continueWithDefault: false,
358
+ createdAt: new Date().toISOString(),
359
+ });
360
+ };
361
+
362
+ await runAutoLoopWithUok(args);
363
+
364
+ assert.equal(args.calls.kernel, 1);
365
+ assert.equal(args.calls.legacy, 0);
366
+
367
+ const events = readParityEvents(basePath);
368
+ assert.equal(events.length, 3);
369
+ assert.equal(events[0]?.phase, "enter");
370
+ assert.equal(events[1]?.phase, "telemetry-error");
371
+ assert.equal(events[1]?.telemetry, "uok-kernel-enter");
372
+ assert.equal(events[2]?.phase, "exit");
373
+ assert.equal(events[2]?.status, "ok");
374
+ assert.equal(isUnifiedAuditEnabled(), true);
375
+ assert.equal(isUnifiedAuditEnabled(basePath), false);
376
+ assert.ok(
377
+ peekLogs().some(entry =>
378
+ entry.severity === "warn" &&
379
+ entry.component === "db" &&
380
+ entry.message.includes("uok-kernel-enter audit emit failed"),
381
+ ),
382
+ "degraded audit path should emit a non-fatal warning",
383
+ );
384
+
385
+ assert.doesNotThrow(() => {
386
+ writeEscalationArtifact(basePath, {
387
+ version: 1,
388
+ taskId: "T02",
389
+ sliceId: "S01",
390
+ milestoneId: "M001",
391
+ question: "Continue?",
392
+ options: [
393
+ { id: "yes", label: "Yes", tradeoffs: "Continue" },
394
+ { id: "no", label: "No", tradeoffs: "Stop" },
395
+ ],
396
+ recommendation: "yes",
397
+ recommendationRationale: "Audit stayed disabled after degraded enter",
398
+ continueWithDefault: true,
399
+ createdAt: new Date().toISOString(),
400
+ });
401
+ });
402
+ });
@@ -12,8 +12,13 @@ import {
12
12
  registerToolCompatibility,
13
13
  resetToolCompatibilityRegistry,
14
14
  } from "@gsd/pi-coding-agent";
15
+ import {
16
+ clearUnifiedAuditOverrideForTests,
17
+ setUnifiedAuditEnabled,
18
+ } from "../uok/audit-toggle.ts";
15
19
 
16
20
  test.afterEach(() => {
21
+ clearUnifiedAuditOverrideForTests();
17
22
  resetToolCompatibilityRegistry();
18
23
  });
19
24
 
@@ -32,6 +37,7 @@ test("uok model policy builds requirement vectors from unit metadata", () => {
32
37
  test("uok model policy enforces provider/api/tool constraints and emits decision audit events", () => {
33
38
  const basePath = mkdtempSync(join(tmpdir(), "gsd-uok-model-policy-"));
34
39
  try {
40
+ setUnifiedAuditEnabled(true);
35
41
  mkdirSync(join(basePath, ".gsd"), { recursive: true });
36
42
  registerToolCompatibility("screenshot", { producesImages: true });
37
43