@opengsd/gsd-pi 1.2.0-dev.b1abb545 → 1.2.0-dev.ddc97c10

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 (662) hide show
  1. package/dist/cli-style.d.ts +17 -0
  2. package/dist/cli-style.js +28 -0
  3. package/dist/cli.js +1 -1
  4. package/dist/headless-events.d.ts +4 -2
  5. package/dist/headless-events.js +14 -34
  6. package/dist/mcp-server.js +2 -1
  7. package/dist/models-resolver.d.ts +3 -13
  8. package/dist/models-resolver.js +3 -22
  9. package/dist/resource-loader.js +2 -14
  10. package/dist/resources/.managed-resources-content-hash +1 -1
  11. package/dist/resources/GSD-WORKFLOW.md +5 -4
  12. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  13. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  14. package/dist/resources/extensions/async-jobs/index.js +65 -0
  15. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  16. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  17. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  18. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  19. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  20. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  21. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  22. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  23. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  24. package/dist/resources/extensions/browser-tools/index.js +69 -12
  25. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  26. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +38 -6
  27. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  28. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  29. package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
  30. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  31. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  32. package/dist/resources/extensions/gsd/auto/orchestrator.js +122 -58
  33. package/dist/resources/extensions/gsd/auto/phases.js +54 -6
  34. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  35. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  36. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  37. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  38. package/dist/resources/extensions/gsd/auto-post-unit.js +43 -14
  39. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  40. package/dist/resources/extensions/gsd/auto-start.js +24 -26
  41. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  42. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  43. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  44. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  45. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  46. package/dist/resources/extensions/gsd/auto-worktree.js +35 -352
  47. package/dist/resources/extensions/gsd/auto.js +45 -21
  48. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  49. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  50. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -12
  51. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  52. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  53. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
  54. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
  55. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  56. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  57. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  58. package/dist/resources/extensions/gsd/captures.js +5 -15
  59. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  60. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  61. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  62. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  63. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  64. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  65. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  66. package/dist/resources/extensions/gsd/constants.js +0 -2
  67. package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
  68. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  69. package/dist/resources/extensions/gsd/db/queries.js +398 -0
  70. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  71. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  72. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  73. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  74. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  75. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  76. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  77. package/dist/resources/extensions/gsd/doctor-engine-checks.js +3 -3
  78. package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
  79. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  80. package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
  81. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  82. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  83. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  84. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  85. package/dist/resources/extensions/gsd/files.js +33 -19
  86. package/dist/resources/extensions/gsd/git-service.js +1 -0
  87. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  88. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  89. package/dist/resources/extensions/gsd/gsd-db.js +172 -2048
  90. package/dist/resources/extensions/gsd/guidance.js +158 -0
  91. package/dist/resources/extensions/gsd/guided-flow.js +57 -8
  92. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  93. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  94. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  95. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  96. package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
  97. package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
  98. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  99. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  100. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  101. package/dist/resources/extensions/gsd/model-router.js +3 -0
  102. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  103. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  104. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  105. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  106. package/dist/resources/extensions/gsd/paths.js +37 -24
  107. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  108. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  109. package/dist/resources/extensions/gsd/preferences.js +14 -0
  110. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  111. package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  112. package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
  113. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  114. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  115. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  116. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  117. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  118. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  119. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  120. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  121. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  122. package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -5
  123. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  124. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  125. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  126. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  127. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  128. package/dist/resources/extensions/gsd/publication.js +87 -0
  129. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  130. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  131. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  132. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  133. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  134. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  135. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  136. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  137. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  138. package/dist/resources/extensions/gsd/state.js +6 -20
  139. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  140. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  141. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  142. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  143. package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
  144. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  145. package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
  146. package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
  147. package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
  148. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
  149. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  150. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  151. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
  152. package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
  153. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  154. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  155. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  156. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  157. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  158. package/dist/resources/extensions/gsd/undo.js +8 -7
  159. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  160. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  161. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  162. package/dist/resources/extensions/gsd/unit-registry.js +337 -0
  163. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  164. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  165. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  166. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  167. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  168. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  169. package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
  170. package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
  171. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  172. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  173. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  174. package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
  175. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  176. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  177. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  178. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  179. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  180. package/dist/resources/shared/package-manager-detection.js +1 -1
  181. package/dist/resources/shared/package.json +3 -0
  182. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  183. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  184. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  185. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  186. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  187. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  188. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  189. package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
  190. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  191. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  192. package/dist/update-check.d.ts +2 -0
  193. package/dist/update-check.js +24 -1
  194. package/dist/update-cmd.js +20 -3
  195. package/dist/web/standalone/.next/BUILD_ID +1 -1
  196. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  197. package/dist/web/standalone/.next/build-manifest.json +3 -3
  198. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  199. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  200. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  201. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  202. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  203. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  204. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  206. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  207. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  208. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  209. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  210. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  211. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  212. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  213. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  214. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  215. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  216. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  217. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  218. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  219. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  220. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  221. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  223. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  224. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  225. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  226. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  227. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  228. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  229. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  230. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  231. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  232. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  233. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  234. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  235. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  236. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  237. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  238. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  239. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  240. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  241. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  242. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  243. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  244. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  245. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  246. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  247. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  248. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  249. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  250. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  251. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  252. package/dist/web/standalone/.next/server/app/index.html +1 -1
  253. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  254. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  255. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  256. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  257. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  258. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  259. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  260. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  261. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  262. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  263. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  264. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  265. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  266. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  267. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  268. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  269. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  270. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  271. package/dist/web/standalone/package.json +1 -1
  272. package/dist/worktree-cli.js +3 -6
  273. package/dist/worktree-status-banner.js +7 -11
  274. package/package.json +1 -1
  275. package/packages/cloud-mcp-gateway/package.json +2 -2
  276. package/packages/contracts/dist/rpc.d.ts +1 -0
  277. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  278. package/packages/contracts/dist/rpc.js.map +1 -1
  279. package/packages/contracts/dist/workflow.d.ts +4 -0
  280. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  281. package/packages/contracts/dist/workflow.js.map +1 -1
  282. package/packages/contracts/package.json +1 -1
  283. package/packages/daemon/package.json +4 -4
  284. package/packages/gsd-agent-core/package.json +5 -5
  285. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
  286. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  287. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +8 -0
  288. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  289. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  290. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  291. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  292. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  293. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  294. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  295. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  296. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  297. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  298. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  299. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  300. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  301. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  302. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  303. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  304. package/packages/gsd-agent-modes/package.json +7 -7
  305. package/packages/mcp-server/dist/cli.js +9 -1
  306. package/packages/mcp-server/dist/cli.js.map +1 -1
  307. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  308. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  309. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  310. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  311. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  312. package/packages/mcp-server/dist/server.js +4 -0
  313. package/packages/mcp-server/dist/server.js.map +1 -1
  314. package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
  315. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  316. package/packages/mcp-server/dist/workflow-tools.js +145 -59
  317. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  318. package/packages/mcp-server/package.json +5 -4
  319. package/packages/native/package.json +1 -1
  320. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  321. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  322. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  323. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  324. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  325. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  326. package/packages/pi-agent-core/dist/index.js +3 -0
  327. package/packages/pi-agent-core/dist/index.js.map +1 -1
  328. package/packages/pi-agent-core/package.json +1 -1
  329. package/packages/pi-ai/README.md +1 -0
  330. package/packages/pi-ai/dist/index.d.ts +2 -0
  331. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  332. package/packages/pi-ai/dist/index.js +2 -0
  333. package/packages/pi-ai/dist/index.js.map +1 -1
  334. package/packages/pi-ai/dist/models.generated.d.ts +192 -0
  335. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  336. package/packages/pi-ai/dist/models.generated.js +166 -0
  337. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  338. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  339. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  340. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  341. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  342. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  343. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  344. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  345. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  346. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  347. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  348. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  349. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  350. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  351. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  352. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  353. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  354. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  355. package/packages/pi-ai/package.json +3 -2
  356. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  357. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  358. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  359. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  361. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  362. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  363. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  364. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  365. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  366. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  367. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  368. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  369. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  370. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  371. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  372. package/packages/pi-coding-agent/dist/index.js +1 -1
  373. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  375. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  376. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  377. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  378. package/packages/pi-coding-agent/package.json +7 -7
  379. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  380. package/packages/pi-tui/dist/tui.js +9 -0
  381. package/packages/pi-tui/dist/tui.js.map +1 -1
  382. package/packages/pi-tui/package.json +2 -2
  383. package/packages/rpc-client/package.json +2 -2
  384. package/pkg/package.json +1 -1
  385. package/src/resources/GSD-WORKFLOW.md +5 -4
  386. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  387. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  388. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  389. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  390. package/src/resources/extensions/async-jobs/index.ts +79 -0
  391. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  392. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  393. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  394. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  395. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  396. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  397. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  398. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  399. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  400. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  401. package/src/resources/extensions/browser-tools/index.ts +71 -13
  402. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  403. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  404. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  405. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  406. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +40 -4
  407. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -0
  408. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  409. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  410. package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
  411. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  412. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  413. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  414. package/src/resources/extensions/gsd/auto/orchestrator.ts +137 -61
  415. package/src/resources/extensions/gsd/auto/phases.ts +74 -26
  416. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  417. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  418. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  419. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  420. package/src/resources/extensions/gsd/auto-post-unit.ts +52 -13
  421. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  422. package/src/resources/extensions/gsd/auto-start.ts +24 -29
  423. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  424. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  425. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  426. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  427. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  428. package/src/resources/extensions/gsd/auto-worktree.ts +41 -364
  429. package/src/resources/extensions/gsd/auto.ts +64 -25
  430. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  431. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  432. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +33 -12
  433. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  434. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  435. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
  436. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
  437. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  438. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  439. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  440. package/src/resources/extensions/gsd/captures.ts +5 -16
  441. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  442. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  443. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  444. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  445. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  446. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  447. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  448. package/src/resources/extensions/gsd/constants.ts +0 -3
  449. package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
  450. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  451. package/src/resources/extensions/gsd/db/queries.ts +490 -0
  452. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  453. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  454. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  455. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  456. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  457. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  458. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  459. package/src/resources/extensions/gsd/doctor-engine-checks.ts +3 -3
  460. package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
  461. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  462. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
  463. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  464. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  465. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  466. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  467. package/src/resources/extensions/gsd/files.ts +33 -12
  468. package/src/resources/extensions/gsd/git-service.ts +1 -0
  469. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  470. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  471. package/src/resources/extensions/gsd/gsd-db.ts +176 -2375
  472. package/src/resources/extensions/gsd/guidance.ts +217 -0
  473. package/src/resources/extensions/gsd/guided-flow.ts +71 -31
  474. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  475. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  476. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  477. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  478. package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
  479. package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
  480. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  481. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  482. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  483. package/src/resources/extensions/gsd/model-router.ts +3 -0
  484. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  485. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  486. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  487. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  488. package/src/resources/extensions/gsd/paths.ts +42 -22
  489. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  490. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  491. package/src/resources/extensions/gsd/preferences.ts +18 -0
  492. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  493. package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  494. package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
  495. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  496. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  497. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  498. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  499. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  500. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  501. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  502. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  503. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  504. package/src/resources/extensions/gsd/prompts/run-uat.md +7 -5
  505. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  506. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  507. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  508. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  509. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  510. package/src/resources/extensions/gsd/publication.ts +122 -0
  511. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  512. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  513. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  514. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  515. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  516. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  517. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  518. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  519. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  520. package/src/resources/extensions/gsd/state.ts +9 -21
  521. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  522. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  523. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +123 -0
  524. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +91 -0
  525. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
  526. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
  527. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  528. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  529. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  530. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  531. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  532. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  533. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  534. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  535. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  536. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  537. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  538. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  539. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  540. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  541. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
  542. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  543. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
  544. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  545. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  546. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  547. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  548. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  549. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  550. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  551. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  552. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  553. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  554. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  555. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  556. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +2 -6
  557. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  558. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
  559. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  560. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  561. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
  562. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  563. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
  564. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  565. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  566. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  567. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  568. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  569. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
  570. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  571. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  572. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  573. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  574. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  575. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  576. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  577. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
  578. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  579. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -1
  580. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  581. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  582. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
  583. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  584. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  585. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  586. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
  587. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  588. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
  589. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  590. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  591. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  592. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  593. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  594. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  595. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  596. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  597. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  598. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  599. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  600. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
  601. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  602. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  603. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
  604. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  605. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
  606. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  607. package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
  608. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  609. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  610. package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
  611. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  612. package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
  613. package/src/resources/extensions/gsd/tools/complete-task.ts +3 -2
  614. package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
  615. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
  616. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  617. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  618. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
  619. package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
  620. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  621. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  622. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  623. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  624. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  625. package/src/resources/extensions/gsd/undo.ts +9 -8
  626. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  627. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  628. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  629. package/src/resources/extensions/gsd/unit-registry.ts +412 -0
  630. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  631. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  632. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  633. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  634. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  635. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  636. package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
  637. package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
  638. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  639. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  640. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  641. package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
  642. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  643. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  644. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  645. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  646. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  647. package/src/resources/shared/package-manager-detection.ts +1 -1
  648. package/src/resources/shared/package.json +3 -0
  649. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  650. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  651. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  652. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  653. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  654. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  655. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  656. package/src/resources/skills/gsd-browser/SKILL.md +1 -1
  657. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  658. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  659. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  660. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  661. /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → McokybTayhff1xEVc-d3T}/_buildManifest.js +0 -0
  662. /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → McokybTayhff1xEVc-d3T}/_ssgManifest.js +0 -0
@@ -0,0 +1,458 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Worktree DB reconciliation writers for the single-writer layer.
3
+ // Owns copyWorktreeDb + reconcileWorktreeDb: the ATTACH-and-merge of an
4
+ // auto-worktree's gsd.db back into the project-root DB, with conflict
5
+ // detection. Reads the shared engine handle via getDbOrNull(); opens the
6
+ // project-root DB via the engine's openDatabase().
7
+ import { existsSync, copyFileSync, mkdirSync, realpathSync } from "node:fs";
8
+ import { dirname } from "node:path";
9
+ import { createHash } from "node:crypto";
10
+ import { logError, logWarning } from "../../workflow-logger.js";
11
+ import { getDbOrNull, openDatabase } from "../engine.js";
12
+ import { TERMINAL_STATUS_SQL } from "../sql-constants.js";
13
+ export function copyWorktreeDb(srcDbPath, destDbPath) {
14
+ try {
15
+ if (!existsSync(srcDbPath))
16
+ return false;
17
+ const destDir = dirname(destDbPath);
18
+ mkdirSync(destDir, { recursive: true });
19
+ copyFileSync(srcDbPath, destDbPath);
20
+ return true;
21
+ }
22
+ catch (err) {
23
+ logError("db", "failed to copy DB to worktree", { error: err.message });
24
+ return false;
25
+ }
26
+ }
27
+ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
28
+ const zero = {
29
+ decisions: 0,
30
+ requirements: 0,
31
+ artifacts: 0,
32
+ milestones: 0,
33
+ slices: 0,
34
+ tasks: 0,
35
+ memories: 0,
36
+ replan_history: 0,
37
+ assessments: 0,
38
+ quality_gates: 0,
39
+ slice_dependencies: 0,
40
+ verification_evidence: 0,
41
+ gate_runs: 0,
42
+ milestone_commit_attributions: 0,
43
+ conflicts: [],
44
+ };
45
+ if (!existsSync(worktreeDbPath))
46
+ return zero;
47
+ // Guard: bail when both paths resolve to the same physical file.
48
+ // ATTACHing a WAL-mode DB to itself corrupts the WAL (#2823).
49
+ try {
50
+ if (realpathSync(mainDbPath) === realpathSync(worktreeDbPath))
51
+ return zero;
52
+ }
53
+ catch (e) {
54
+ logWarning("db", `realpathSync failed: ${e.message}`);
55
+ }
56
+ // Sanitize path: reject any characters that could break ATTACH syntax.
57
+ // ATTACH DATABASE doesn't support parameterized paths in all providers,
58
+ // so we use strict allowlist validation instead.
59
+ if (/['";\x00]/.test(worktreeDbPath)) {
60
+ logError("db", "worktree DB reconciliation failed: path contains unsafe characters");
61
+ return zero;
62
+ }
63
+ if (!getDbOrNull()) {
64
+ const opened = openDatabase(mainDbPath);
65
+ if (!opened) {
66
+ logError("db", "worktree DB reconciliation failed: cannot open main DB");
67
+ return zero;
68
+ }
69
+ }
70
+ const adapter = getDbOrNull();
71
+ const conflicts = [];
72
+ try {
73
+ adapter.exec(`ATTACH DATABASE '${worktreeDbPath}' AS wt`);
74
+ try {
75
+ function countChanges(result) {
76
+ return typeof result === "object" && result !== null ? (result.changes ?? 0) : 0;
77
+ }
78
+ function wtTableInfo(tableName) {
79
+ return adapter.prepare(`PRAGMA wt.table_info('${tableName}')`).all();
80
+ }
81
+ const wtInfo = wtTableInfo("decisions");
82
+ const hasWtDecisions = wtInfo.length > 0;
83
+ const hasMadeBy = wtInfo.some((col) => col["name"] === "made_by");
84
+ // ADR-011: worktree may predate schema v16/v17. For missing columns we
85
+ // fall through to the main DB's existing value (not a literal default)
86
+ // so reconcile never silently clears state the main tree has recorded.
87
+ const hasDecisionSource = wtInfo.some((col) => col["name"] === "source");
88
+ const wtRequirementInfo = wtTableInfo("requirements");
89
+ const hasWtRequirements = wtRequirementInfo.length > 0;
90
+ const wtMilestoneInfo = wtTableInfo("milestones");
91
+ const hasWtMilestones = wtMilestoneInfo.length > 0;
92
+ const hasMilestoneSequence = wtMilestoneInfo.some((col) => col["name"] === "sequence");
93
+ const wtSliceInfo = wtTableInfo("slices");
94
+ const hasWtSlices = wtSliceInfo.length > 0;
95
+ const hasIsSketch = wtSliceInfo.some((col) => col["name"] === "is_sketch");
96
+ const hasSketchScope = wtSliceInfo.some((col) => col["name"] === "sketch_scope");
97
+ const hasSliceTargetRepositories = wtSliceInfo.some((col) => col["name"] === "target_repositories");
98
+ const wtTaskInfo = wtTableInfo("tasks");
99
+ const hasWtTasks = wtTaskInfo.length > 0;
100
+ const hasTaskTargetRepositories = wtTaskInfo.some((col) => col["name"] === "target_repositories");
101
+ const hasBlockerSource = wtTaskInfo.some((col) => col["name"] === "blocker_source");
102
+ const hasEscalationPending = wtTaskInfo.some((col) => col["name"] === "escalation_pending");
103
+ const hasEscalationAwaiting = wtTaskInfo.some((col) => col["name"] === "escalation_awaiting_review");
104
+ const hasEscalationArtifact = wtTaskInfo.some((col) => col["name"] === "escalation_artifact_path");
105
+ const hasEscalationOverride = wtTaskInfo.some((col) => col["name"] === "escalation_override_applied_at");
106
+ const wtArtifactInfo = wtTableInfo("artifacts");
107
+ const hasWtArtifacts = wtArtifactInfo.length > 0;
108
+ const wtMemoryInfo = wtTableInfo("memories");
109
+ const hasWtMemories = wtMemoryInfo.length > 0;
110
+ const hasMemoryScope = wtMemoryInfo.some((col) => col["name"] === "scope");
111
+ const hasMemoryTags = wtMemoryInfo.some((col) => col["name"] === "tags");
112
+ const hasMemoryStructuredFields = wtMemoryInfo.some((col) => col["name"] === "structured_fields");
113
+ const hasMemoryLastHitAt = wtMemoryInfo.some((col) => col["name"] === "last_hit_at");
114
+ const hasWtReplanHistory = wtTableInfo("replan_history").length > 0;
115
+ const hasWtAssessments = wtTableInfo("assessments").length > 0;
116
+ const hasWtQualityGates = wtTableInfo("quality_gates").length > 0;
117
+ const hasWtSliceDependencies = wtTableInfo("slice_dependencies").length > 0;
118
+ const hasWtVerificationEvidence = wtTableInfo("verification_evidence").length > 0;
119
+ const hasWtGateRuns = wtTableInfo("gate_runs").length > 0;
120
+ const hasWtMilestoneCommitAttributions = wtTableInfo("milestone_commit_attributions").length > 0;
121
+ if (hasWtDecisions) {
122
+ const decConf = adapter.prepare(`SELECT m.id FROM decisions m INNER JOIN wt.decisions w ON m.id = w.id WHERE m.decision != w.decision OR m.choice != w.choice OR m.rationale != w.rationale OR ${hasMadeBy ? "m.made_by != w.made_by" : "'agent' != 'agent'"} OR m.superseded_by IS NOT w.superseded_by`).all();
123
+ for (const row of decConf)
124
+ conflicts.push(`decision ${row["id"]}: modified in both`);
125
+ }
126
+ if (hasWtRequirements) {
127
+ const reqConf = adapter.prepare(`SELECT m.id FROM requirements m INNER JOIN wt.requirements w ON m.id = w.id WHERE m.description != w.description OR m.status != w.status OR m.notes != w.notes OR m.superseded_by IS NOT w.superseded_by`).all();
128
+ for (const row of reqConf)
129
+ conflicts.push(`requirement ${row["id"]}: modified in both`);
130
+ }
131
+ const merged = {
132
+ decisions: 0,
133
+ requirements: 0,
134
+ artifacts: 0,
135
+ milestones: 0,
136
+ slices: 0,
137
+ tasks: 0,
138
+ memories: 0,
139
+ replan_history: 0,
140
+ assessments: 0,
141
+ quality_gates: 0,
142
+ slice_dependencies: 0,
143
+ verification_evidence: 0,
144
+ gate_runs: 0,
145
+ milestone_commit_attributions: 0,
146
+ };
147
+ const sliceTargetRepositoriesSql = hasSliceTargetRepositories
148
+ ? `CASE
149
+ WHEN w.target_repositories = '[]' AND COALESCE(m.target_repositories, '[]') <> '[]'
150
+ THEN m.target_repositories
151
+ ELSE COALESCE(w.target_repositories, m.target_repositories, '[]')
152
+ END`
153
+ : "COALESCE(m.target_repositories, '[]')";
154
+ const taskTargetRepositoriesSql = hasTaskTargetRepositories
155
+ ? `CASE
156
+ WHEN w.target_repositories = '[]' AND COALESCE(m.target_repositories, '[]') <> '[]'
157
+ THEN m.target_repositories
158
+ ELSE COALESCE(w.target_repositories, m.target_repositories, '[]')
159
+ END`
160
+ : "COALESCE(m.target_repositories, '[]')";
161
+ adapter.exec("BEGIN");
162
+ try {
163
+ // Join the target decisions so we can prefer an existing main.source
164
+ // when the worktree predates v16 — otherwise a write-through reconcile
165
+ // would clobber 'escalation'-sourced decisions with the literal default.
166
+ if (hasWtDecisions) {
167
+ merged.decisions = countChanges(adapter.prepare(`
168
+ INSERT INTO decisions (
169
+ id, when_context, scope, decision, choice, rationale, revisable, made_by, source, superseded_by
170
+ )
171
+ SELECT w.id, w.when_context, w.scope, w.decision, w.choice, w.rationale, w.revisable, ${hasMadeBy ? "w.made_by" : "COALESCE(m.made_by, 'agent')"}, ${hasDecisionSource ? "w.source" : "COALESCE(m.source, 'discussion')"}, w.superseded_by
172
+ FROM wt.decisions w
173
+ LEFT JOIN decisions m ON m.id = w.id
174
+ WHERE true
175
+ ON CONFLICT(id) DO UPDATE SET
176
+ when_context = excluded.when_context,
177
+ scope = excluded.scope,
178
+ decision = excluded.decision,
179
+ choice = excluded.choice,
180
+ rationale = excluded.rationale,
181
+ revisable = excluded.revisable,
182
+ made_by = excluded.made_by,
183
+ source = excluded.source,
184
+ superseded_by = excluded.superseded_by
185
+ `).run());
186
+ }
187
+ if (hasWtRequirements) {
188
+ merged.requirements = countChanges(adapter.prepare(`
189
+ INSERT OR REPLACE INTO requirements (
190
+ id, class, status, description, why, source, primary_owner,
191
+ supporting_slices, validation, notes, full_content, superseded_by
192
+ )
193
+ SELECT id, class, status, description, why, source, primary_owner,
194
+ supporting_slices, validation, notes, full_content, superseded_by
195
+ FROM wt.requirements
196
+ `).run());
197
+ }
198
+ // Always recompute artifact hashes from the content being merged. Older
199
+ // worktree DBs may not have content_hash at all, and migrated old DBs can
200
+ // carry stale default/null hashes after their content changed.
201
+ if (hasWtArtifacts) {
202
+ const artifactRows = adapter.prepare(`
203
+ SELECT path, artifact_type, milestone_id, slice_id, task_id, full_content, imported_at
204
+ FROM wt.artifacts
205
+ `).all();
206
+ const artifactStmt = adapter.prepare(`
207
+ INSERT OR REPLACE INTO artifacts (
208
+ path, artifact_type, milestone_id, slice_id, task_id, full_content, imported_at, content_hash
209
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
210
+ `);
211
+ for (const row of artifactRows) {
212
+ const fullContent = String(row["full_content"] ?? "");
213
+ merged.artifacts += countChanges(artifactStmt.run(row["path"], row["artifact_type"], row["milestone_id"] ?? null, row["slice_id"] ?? null, row["task_id"] ?? null, fullContent, row["imported_at"], createHash("sha256").update(fullContent).digest("hex")));
214
+ }
215
+ }
216
+ // Merge milestones — worktree may have updated status/planning fields.
217
+ // Never downgrade status: complete > active > pre-planning (#4372).
218
+ // A stale worktree may carry an older 'active' status for a milestone
219
+ // that the main DB has already marked 'complete'; preserve the higher status.
220
+ if (hasWtMilestones) {
221
+ merged.milestones = countChanges(adapter.prepare(`
222
+ INSERT OR REPLACE INTO milestones (
223
+ id, title, status, depends_on, created_at, completed_at,
224
+ vision, success_criteria, key_risks, proof_strategy,
225
+ verification_contract, verification_integration, verification_operational, verification_uat,
226
+ definition_of_done, requirement_coverage, boundary_map_markdown, sequence
227
+ )
228
+ SELECT w.id, w.title,
229
+ CASE
230
+ WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
231
+ THEN m.status ELSE w.status
232
+ END,
233
+ w.depends_on,
234
+ CASE
235
+ WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
236
+ THEN m.created_at ELSE w.created_at
237
+ END,
238
+ CASE
239
+ WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
240
+ THEN m.completed_at ELSE w.completed_at
241
+ END,
242
+ w.vision, w.success_criteria, w.key_risks, w.proof_strategy,
243
+ w.verification_contract, w.verification_integration, w.verification_operational, w.verification_uat,
244
+ w.definition_of_done, w.requirement_coverage, w.boundary_map_markdown,
245
+ ${hasMilestoneSequence ? "COALESCE(w.sequence, 0)" : "COALESCE(m.sequence, 0)"}
246
+ FROM wt.milestones w
247
+ LEFT JOIN milestones m ON m.id = w.id
248
+ `).run());
249
+ }
250
+ // Merge slices — preserve worktree progress but never downgrade completed status (#2558).
251
+ // ADR-011 Phase 1: carry is_sketch + sketch_scope so reconcile doesn't
252
+ // silently clear sketch metadata. When the worktree predates v16,
253
+ // fall back to the main DB's existing value rather than a literal 0/''.
254
+ if (hasWtSlices) {
255
+ merged.slices = countChanges(adapter.prepare(`
256
+ INSERT OR REPLACE INTO slices (
257
+ milestone_id, id, title, status, risk, depends, demo, created_at, completed_at,
258
+ full_summary_md, full_uat_md, goal, success_criteria, proof_level,
259
+ integration_closure, observability_impact, target_repositories, sequence, replan_triggered_at,
260
+ is_sketch, sketch_scope
261
+ )
262
+ SELECT w.milestone_id, w.id, w.title,
263
+ CASE
264
+ WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
265
+ THEN m.status ELSE w.status
266
+ END,
267
+ w.risk, w.depends, w.demo, w.created_at,
268
+ CASE
269
+ WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
270
+ THEN m.completed_at ELSE w.completed_at
271
+ END,
272
+ w.full_summary_md, w.full_uat_md, w.goal, w.success_criteria, w.proof_level,
273
+ w.integration_closure, w.observability_impact,
274
+ ${sliceTargetRepositoriesSql},
275
+ w.sequence, w.replan_triggered_at,
276
+ ${hasIsSketch ? "w.is_sketch" : "COALESCE(m.is_sketch, 0)"},
277
+ ${hasSketchScope ? "w.sketch_scope" : "COALESCE(m.sketch_scope, '')"}
278
+ FROM wt.slices w
279
+ LEFT JOIN slices m ON m.milestone_id = w.milestone_id AND m.id = w.id
280
+ `).run());
281
+ }
282
+ // Merge tasks — preserve execution results, never downgrade completed status (#2558).
283
+ // ADR-011 P2: carry blocker_source + escalation_* columns so worktree reconcile
284
+ // doesn't silently clear escalation state back to defaults.
285
+ if (hasWtTasks) {
286
+ merged.tasks = countChanges(adapter.prepare(`
287
+ INSERT OR REPLACE INTO tasks (
288
+ milestone_id, slice_id, id, title, status, one_liner, narrative,
289
+ verification_result, duration, completed_at, blocker_discovered,
290
+ deviations, known_issues, key_files, key_decisions, full_summary_md,
291
+ description, estimate, files, verify, inputs, expected_output,
292
+ observability_impact, full_plan_md, target_repositories, sequence,
293
+ blocker_source, escalation_pending, escalation_awaiting_review,
294
+ escalation_artifact_path, escalation_override_applied_at
295
+ )
296
+ SELECT w.milestone_id, w.slice_id, w.id, w.title,
297
+ CASE
298
+ WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
299
+ THEN m.status ELSE w.status
300
+ END,
301
+ w.one_liner, w.narrative,
302
+ w.verification_result, w.duration,
303
+ CASE
304
+ WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
305
+ THEN m.completed_at ELSE w.completed_at
306
+ END,
307
+ w.blocker_discovered,
308
+ w.deviations, w.known_issues, w.key_files, w.key_decisions, w.full_summary_md,
309
+ w.description, w.estimate, w.files, w.verify, w.inputs, w.expected_output,
310
+ w.observability_impact, w.full_plan_md,
311
+ ${taskTargetRepositoriesSql},
312
+ w.sequence,
313
+ ${hasBlockerSource ? "w.blocker_source" : "COALESCE(m.blocker_source, '')"},
314
+ ${hasEscalationPending ? "w.escalation_pending" : "COALESCE(m.escalation_pending, 0)"},
315
+ ${hasEscalationAwaiting ? "w.escalation_awaiting_review" : "COALESCE(m.escalation_awaiting_review, 0)"},
316
+ ${hasEscalationArtifact ? "w.escalation_artifact_path" : "m.escalation_artifact_path"},
317
+ ${hasEscalationOverride ? "w.escalation_override_applied_at" : "m.escalation_override_applied_at"}
318
+ FROM wt.tasks w
319
+ LEFT JOIN tasks m ON m.milestone_id = w.milestone_id AND m.slice_id = w.slice_id AND m.id = w.id
320
+ `).run());
321
+ }
322
+ // Merge memories — keep worktree-learned insights.
323
+ // V18 (scope, tags), V21 (structured_fields), V28 (last_hit_at): for each
324
+ // column the wt may not yet have (older worktree DB), fall back to the
325
+ // main DB's existing value via LEFT JOIN so reconcile never silently
326
+ // resets these fields to defaults on rows that already had them.
327
+ if (hasWtMemories) {
328
+ merged.memories = countChanges(adapter.prepare(`
329
+ INSERT OR REPLACE INTO memories (
330
+ seq, id, category, content, confidence, source_unit_type, source_unit_id,
331
+ created_at, updated_at, superseded_by, hit_count,
332
+ scope, tags, structured_fields, last_hit_at
333
+ )
334
+ SELECT w.seq, w.id, w.category, w.content, w.confidence, w.source_unit_type, w.source_unit_id,
335
+ w.created_at, w.updated_at, w.superseded_by, w.hit_count,
336
+ ${hasMemoryScope ? "w.scope" : "COALESCE(m.scope, 'project')"},
337
+ ${hasMemoryTags ? "w.tags" : "COALESCE(m.tags, '[]')"},
338
+ ${hasMemoryStructuredFields ? "w.structured_fields" : "m.structured_fields"},
339
+ ${hasMemoryLastHitAt ? "w.last_hit_at" : "m.last_hit_at"}
340
+ FROM wt.memories w
341
+ LEFT JOIN memories m ON m.id = w.id
342
+ `).run());
343
+ }
344
+ if (hasWtReplanHistory) {
345
+ merged.replan_history = countChanges(adapter.prepare(`
346
+ INSERT INTO replan_history (
347
+ milestone_id, slice_id, task_id, summary, previous_artifact_path, replacement_artifact_path, created_at
348
+ )
349
+ SELECT w.milestone_id, w.slice_id, w.task_id, w.summary, w.previous_artifact_path, w.replacement_artifact_path, w.created_at
350
+ FROM wt.replan_history w
351
+ WHERE EXISTS (SELECT 1 FROM milestones m WHERE m.id = w.milestone_id)
352
+ AND NOT EXISTS (
353
+ SELECT 1 FROM replan_history m
354
+ WHERE m.milestone_id = w.milestone_id
355
+ AND m.slice_id IS w.slice_id
356
+ AND m.task_id IS w.task_id
357
+ AND m.summary = w.summary
358
+ AND m.previous_artifact_path IS w.previous_artifact_path
359
+ AND m.replacement_artifact_path IS w.replacement_artifact_path
360
+ )
361
+ `).run());
362
+ }
363
+ if (hasWtAssessments) {
364
+ merged.assessments = countChanges(adapter.prepare(`
365
+ INSERT OR REPLACE INTO assessments (
366
+ path, milestone_id, slice_id, task_id, status, scope, full_content, created_at
367
+ )
368
+ SELECT w.path, w.milestone_id, w.slice_id, w.task_id, w.status, w.scope, w.full_content, w.created_at
369
+ FROM wt.assessments w
370
+ WHERE EXISTS (SELECT 1 FROM milestones m WHERE m.id = w.milestone_id)
371
+ `).run());
372
+ }
373
+ if (hasWtQualityGates) {
374
+ merged.quality_gates = countChanges(adapter.prepare(`
375
+ INSERT OR REPLACE INTO quality_gates (
376
+ milestone_id, slice_id, gate_id, scope, task_id, status, verdict, rationale, findings, evaluated_at
377
+ )
378
+ SELECT w.milestone_id, w.slice_id, w.gate_id, w.scope, COALESCE(w.task_id, ''), w.status, w.verdict, w.rationale, w.findings, w.evaluated_at
379
+ FROM wt.quality_gates w
380
+ WHERE EXISTS (SELECT 1 FROM slices s WHERE s.milestone_id = w.milestone_id AND s.id = w.slice_id)
381
+ `).run());
382
+ }
383
+ if (hasWtSliceDependencies) {
384
+ merged.slice_dependencies = countChanges(adapter.prepare(`
385
+ INSERT OR IGNORE INTO slice_dependencies (milestone_id, slice_id, depends_on_slice_id)
386
+ SELECT w.milestone_id, w.slice_id, w.depends_on_slice_id
387
+ FROM wt.slice_dependencies w
388
+ WHERE EXISTS (SELECT 1 FROM slices s WHERE s.milestone_id = w.milestone_id AND s.id = w.slice_id)
389
+ AND EXISTS (SELECT 1 FROM slices d WHERE d.milestone_id = w.milestone_id AND d.id = w.depends_on_slice_id)
390
+ `).run());
391
+ }
392
+ // Merge verification evidence — append-only, use INSERT OR IGNORE to avoid duplicates
393
+ if (hasWtVerificationEvidence) {
394
+ merged.verification_evidence = countChanges(adapter.prepare(`
395
+ INSERT OR IGNORE INTO verification_evidence (
396
+ task_id, slice_id, milestone_id, command, exit_code, verdict, duration_ms, created_at
397
+ )
398
+ SELECT task_id, slice_id, milestone_id, command, exit_code, verdict, duration_ms, created_at
399
+ FROM wt.verification_evidence
400
+ `).run());
401
+ }
402
+ if (hasWtGateRuns) {
403
+ merged.gate_runs = countChanges(adapter.prepare(`
404
+ INSERT INTO gate_runs (
405
+ trace_id, turn_id, gate_id, gate_type, unit_type, unit_id, milestone_id, slice_id, task_id,
406
+ outcome, failure_class, rationale, findings, attempt, max_attempts, retryable, evaluated_at
407
+ )
408
+ SELECT w.trace_id, w.turn_id, w.gate_id, w.gate_type, w.unit_type, w.unit_id, w.milestone_id, w.slice_id, w.task_id,
409
+ w.outcome, w.failure_class, w.rationale, w.findings, w.attempt, w.max_attempts, w.retryable, w.evaluated_at
410
+ FROM wt.gate_runs w
411
+ WHERE NOT EXISTS (
412
+ SELECT 1 FROM gate_runs m
413
+ WHERE m.trace_id = w.trace_id
414
+ AND m.turn_id = w.turn_id
415
+ AND m.gate_id = w.gate_id
416
+ AND m.attempt = w.attempt
417
+ AND m.evaluated_at = w.evaluated_at
418
+ )
419
+ `).run());
420
+ }
421
+ if (hasWtMilestoneCommitAttributions) {
422
+ merged.milestone_commit_attributions = countChanges(adapter.prepare(`
423
+ INSERT OR REPLACE INTO milestone_commit_attributions (
424
+ commit_sha, milestone_id, slice_id, task_id, source, confidence, files_json, created_at
425
+ )
426
+ SELECT w.commit_sha, w.milestone_id, w.slice_id, w.task_id, w.source, w.confidence, w.files_json, w.created_at
427
+ FROM wt.milestone_commit_attributions w
428
+ WHERE EXISTS (SELECT 1 FROM milestones m WHERE m.id = w.milestone_id)
429
+ `).run());
430
+ }
431
+ adapter.exec("COMMIT");
432
+ }
433
+ catch (txErr) {
434
+ try {
435
+ adapter.exec("ROLLBACK");
436
+ }
437
+ catch (e) {
438
+ logWarning("db", `rollback failed: ${e.message}`);
439
+ }
440
+ throw txErr;
441
+ }
442
+ return { ...merged, conflicts };
443
+ }
444
+ finally {
445
+ try {
446
+ adapter.exec("DETACH DATABASE wt");
447
+ }
448
+ catch (e) {
449
+ logWarning("db", `detach worktree DB failed: ${e.message}`);
450
+ }
451
+ }
452
+ }
453
+ catch (err) {
454
+ logError("db", "worktree DB reconciliation failed", { error: err.message });
455
+ return { ...zero, conflicts };
456
+ }
457
+ }
458
+ // ─── Replan & Assessment Helpers ──────────────────────────────────────────
@@ -0,0 +1,70 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Status Transition Core (ADR-030) — the single row-level
3
+ // chokepoint every generic status write funnels through. Owns the milestone
4
+ // closed→open guard and is the one place future row-level status policy lands.
5
+ // The update*Status faces in gsd-db.ts delegate here.
6
+ //
7
+ // Behavior this pass is intentionally identical to the prior per-face writes.
8
+ // Two ADR-030 responsibilities are deferred for safety and documented inline:
9
+ // - Write-normalization via toStatus(): workflow-reconcile replays journal
10
+ // events that write raw "done"/"in-progress" and tests assert those exact
11
+ // stored values, so converging on write is a separate, behavior-sensitive
12
+ // change (migrate replay/import to canonical first).
13
+ // - Generalizing the closed→open guard to task/slice: four legitimate reopen
14
+ // callers (undo, tools/reopen-task, auto-post-unit, tools/plan-slice) move
15
+ // entities to open statuses through the generic faces. Generalizing safely
16
+ // needs sanctioned reopenTaskStatus/reopenSliceStatus faces first, mirroring
17
+ // the existing milestone updateMilestoneStatus/reopenMilestoneStatus split.
18
+ import { getDbOrNull } from "../engine.js";
19
+ import { GSDError, GSD_STALE_STATE } from "../../errors.js";
20
+ import { isClosedStatus } from "../../status-guards.js";
21
+ function requireDb() {
22
+ const db = getDbOrNull();
23
+ if (!db)
24
+ throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
25
+ return db;
26
+ }
27
+ /**
28
+ * Apply a row-level status transition. The single chokepoint for generic status
29
+ * writes — the update*Status faces delegate here so the guard and (future)
30
+ * normalization/journal/cache policy live in one place rather than per face.
31
+ *
32
+ * Milestone closed→open guard: generic updates may close, park/unpark, or
33
+ * advance a milestone, but may not reopen a closed one; callers must use
34
+ * reopenMilestoneStatus() (gsd_milestone_reopen). Tasks and slices are not yet
35
+ * guarded — see the file header.
36
+ */
37
+ export function applyStatusTransition(t) {
38
+ const db = requireDb();
39
+ const completedAt = t.completedAt ?? null;
40
+ switch (t.entity) {
41
+ case "task":
42
+ db.prepare(`UPDATE tasks SET status = :status, completed_at = :completed_at
43
+ WHERE milestone_id = :milestone_id AND slice_id = :slice_id AND id = :id`).run({
44
+ ":status": t.status,
45
+ ":completed_at": completedAt,
46
+ ":milestone_id": t.milestoneId,
47
+ ":slice_id": t.sliceId,
48
+ ":id": t.taskId,
49
+ });
50
+ return;
51
+ case "slice":
52
+ db.prepare(`UPDATE slices SET status = :status, completed_at = :completed_at
53
+ WHERE milestone_id = :milestone_id AND id = :id`).run({
54
+ ":status": t.status,
55
+ ":completed_at": completedAt,
56
+ ":milestone_id": t.milestoneId,
57
+ ":id": t.sliceId,
58
+ });
59
+ return;
60
+ case "milestone": {
61
+ const row = db.prepare("SELECT status FROM milestones WHERE id = :id").get({ ":id": t.milestoneId });
62
+ const currentStatus = typeof row?.["status"] === "string" ? row["status"] : null;
63
+ if (currentStatus && isClosedStatus(currentStatus) && !isClosedStatus(t.status)) {
64
+ throw new Error(`Cannot update closed milestone ${t.milestoneId} from ${currentStatus} to ${t.status}; use gsd_milestone_reopen for an explicit reopen.`);
65
+ }
66
+ db.prepare(`UPDATE milestones SET status = :status, completed_at = :completed_at WHERE id = :id`).run({ ":status": t.status, ":completed_at": completedAt, ":id": t.milestoneId });
67
+ return;
68
+ }
69
+ }
70
+ }
@@ -2,9 +2,8 @@
2
2
  import { resolveMilestoneFile } from "./paths.js";
3
3
  import { findMilestoneIds } from "./guided-flow.js";
4
4
  import { parseUnitId } from "./unit-id.js";
5
- import { isDbAvailable, getMilestoneSlices, getMilestone } from "./gsd-db.js";
6
- import { parseRoadmap } from "./parsers-legacy.js";
7
- import { isClosedStatus, isSkippedForDispatch } from "./status-guards.js";
5
+ import { isDbAvailable, getMilestoneSliceSummaries, getMilestone } from "./gsd-db.js";
6
+ import { isSkippedForDispatch } from "./status-guards.js";
8
7
  import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
9
8
  import { readFileSync } from "node:fs";
10
9
  const SLICE_DISPATCH_TYPES = new Set([
@@ -97,38 +96,14 @@ export function getPriorSliceCompletionBlocker(base, _mainBranch, unitType, unit
97
96
  continue;
98
97
  }
99
98
  }
100
- let slices = null;
101
- if (isDbAvailable()) {
102
- const rows = getMilestoneSlices(mid);
103
- if (rows.length > 0) {
104
- slices = rows.map((r) => ({
105
- id: r.id,
106
- done: isClosedStatus(r.status),
107
- depends: r.depends ?? [],
108
- }));
109
- }
110
- }
111
- if (!slices) {
112
- // File-based fallback: parse roadmap checkboxes
113
- const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
114
- if (!roadmapPath)
115
- continue;
116
- let roadmapContent;
117
- try {
118
- roadmapContent = readFileSync(roadmapPath, "utf-8");
119
- }
120
- catch {
121
- continue;
122
- }
123
- const parsed = parseRoadmap(roadmapContent);
124
- if (parsed.slices.length === 0)
125
- continue;
126
- slices = parsed.slices.map((s) => ({
127
- id: s.id,
128
- done: s.done,
129
- depends: s.depends ?? [],
130
- }));
131
- }
99
+ // DB-authoritative eligibility list (ADR-017) — markdown projections are
100
+ // never parsed for dispatch decisions. No DB / no rows → skip this
101
+ // milestone's check (unknown is not a blocker).
102
+ if (!isDbAvailable())
103
+ continue;
104
+ const slices = getMilestoneSliceSummaries(mid);
105
+ if (slices.length === 0)
106
+ continue;
132
107
  if (mid !== targetMid) {
133
108
  const incomplete = slices.find((slice) => !slice.done);
134
109
  if (incomplete) {
@@ -5,7 +5,7 @@ import { isAfter, latestExplicitReopenAt } from "./milestone-reopen-events.js";
5
5
  import { resolveGsdPathContract, resolveMilestoneFile } from "./paths.js";
6
6
  import { deriveState } from "./state.js";
7
7
  import { readEvents } from "./workflow-events.js";
8
- import { renderAllProjections } from "./workflow-projections.js";
8
+ import { flushWorkflowProjections } from "./projection-flush.js";
9
9
  export async function checkEngineHealth(basePath, issues, fixesApplied) {
10
10
  const dbPath = resolveGsdPathContract(basePath).projectDb;
11
11
  if (!isDbAvailable() && existsSync(dbPath)) {
@@ -239,7 +239,7 @@ export async function checkEngineHealth(basePath, issues, fixesApplied) {
239
239
  const roadmapPath = resolveMilestoneFile(basePath, milestone.id, "ROADMAP");
240
240
  if (!roadmapPath || !existsSync(roadmapPath)) {
241
241
  try {
242
- await renderAllProjections(basePath, milestone.id);
242
+ await flushWorkflowProjections(basePath, { milestoneId: milestone.id });
243
243
  fixesApplied.push(`re-rendered missing projections for ${milestone.id}`);
244
244
  }
245
245
  catch {
@@ -250,7 +250,7 @@ export async function checkEngineHealth(basePath, issues, fixesApplied) {
250
250
  const projectionMtime = statSync(roadmapPath).mtimeMs;
251
251
  if (lastEventTs > projectionMtime) {
252
252
  try {
253
- await renderAllProjections(basePath, milestone.id);
253
+ await flushWorkflowProjections(basePath, { milestoneId: milestone.id });
254
254
  fixesApplied.push(`re-rendered stale projections for ${milestone.id}`);
255
255
  }
256
256
  catch {
@@ -12,6 +12,7 @@ import { existsSync, readFileSync, statSync } from "node:fs";
12
12
  import { execSync } from "node:child_process";
13
13
  import { join } from "node:path";
14
14
  import { detectPythonExecutable } from "./python-resolver.js";
15
+ import { projectRootFromWorktreePath } from "./worktree-root.js";
15
16
  // ── Constants ──────────────────────────────────────────────────────────────
16
17
  /** Default dev server ports to scan for conflicts. */
17
18
  const DEFAULT_DEV_PORTS = [3000, 3001, 4000, 5000, 5173, 8000, 8080, 8888];
@@ -20,26 +21,19 @@ const MIN_DISK_BYTES = 500 * 1024 * 1024;
20
21
  /** Timeout for external commands (ms). */
21
22
  const CMD_TIMEOUT = 5_000;
22
23
  // ── Helpers ────────────────────────────────────────────────────────────────
23
- /** Worktree sentinel — path segment that marks an auto-worktree directory. */
24
- const WORKTREE_PATH_SEGMENT = `${join(".gsd", "worktrees")}/`;
25
24
  /**
26
- * Resolve the project root when running inside a `.gsd/worktrees/<name>/`
27
- * auto-worktree. Returns `null` if not in a worktree.
25
+ * Resolve the project root when running inside a GSD auto-worktree.
26
+ * Returns `null` if not in a worktree.
28
27
  *
29
28
  * Detection order:
30
29
  * 1. `GSD_WORKTREE` env var (set by the worktree launcher)
31
- * 2. `.gsd/worktrees/` segment in basePath
30
+ * 2. worktree segment in basePath (via worktree-root's layout matching)
32
31
  */
33
32
  function resolveWorktreeProjectRoot(basePath) {
34
33
  const envRoot = process.env.GSD_WORKTREE;
35
34
  if (envRoot)
36
35
  return envRoot;
37
- const normalised = basePath.replace(/\\/g, "/");
38
- const idx = normalised.indexOf(WORKTREE_PATH_SEGMENT.replace(/\\/g, "/"));
39
- if (idx === -1)
40
- return null;
41
- // Everything before `.gsd/worktrees/` is the project root
42
- return basePath.slice(0, idx);
36
+ return projectRootFromWorktreePath(basePath);
43
37
  }
44
38
  function tryExec(cmd, cwd) {
45
39
  try {