@opengsd/gsd-pi 1.2.0-dev.4c756166 → 1.2.0-dev.822c9439

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 (688) 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.d.ts +9 -5
  10. package/dist/resource-loader.js +116 -20
  11. package/dist/resources/.managed-resources-content-hash +1 -1
  12. package/dist/resources/GSD-WORKFLOW.md +5 -4
  13. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  14. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  15. package/dist/resources/extensions/async-jobs/index.js +65 -0
  16. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  17. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  18. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  19. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  20. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  21. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  22. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  23. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  24. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  25. package/dist/resources/extensions/browser-tools/index.js +69 -12
  26. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  27. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +38 -6
  28. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  29. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  30. package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
  31. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  32. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  33. package/dist/resources/extensions/gsd/auto/orchestrator.js +122 -58
  34. package/dist/resources/extensions/gsd/auto/phases.js +54 -6
  35. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  36. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  37. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  38. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  39. package/dist/resources/extensions/gsd/auto-post-unit.js +43 -14
  40. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  41. package/dist/resources/extensions/gsd/auto-start.js +24 -26
  42. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  43. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  44. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  45. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  46. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  47. package/dist/resources/extensions/gsd/auto-worktree.js +49 -353
  48. package/dist/resources/extensions/gsd/auto.js +45 -21
  49. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  50. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  51. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -12
  52. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  53. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  54. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
  55. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
  56. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  57. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  58. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  59. package/dist/resources/extensions/gsd/captures.js +5 -15
  60. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  61. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  62. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  63. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  64. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  65. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  66. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  67. package/dist/resources/extensions/gsd/constants.js +0 -2
  68. package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
  69. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  70. package/dist/resources/extensions/gsd/db/queries.js +398 -0
  71. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  72. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  73. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  74. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  75. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  76. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  77. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  78. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  79. package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
  80. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  81. package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
  82. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  83. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  84. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  85. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  86. package/dist/resources/extensions/gsd/files.js +33 -19
  87. package/dist/resources/extensions/gsd/git-service.js +1 -0
  88. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  89. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  90. package/dist/resources/extensions/gsd/gsd-db.js +172 -2048
  91. package/dist/resources/extensions/gsd/guidance.js +158 -0
  92. package/dist/resources/extensions/gsd/guided-flow.js +57 -8
  93. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  94. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  95. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  96. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  97. package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
  98. package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
  99. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  100. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  101. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  102. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  103. package/dist/resources/extensions/gsd/model-router.js +3 -0
  104. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  105. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  106. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  107. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  108. package/dist/resources/extensions/gsd/paths.js +37 -24
  109. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  110. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  111. package/dist/resources/extensions/gsd/preferences.js +14 -0
  112. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  113. package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  114. package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
  115. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  116. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  117. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  118. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  119. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  120. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  121. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  122. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  123. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  124. package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -5
  125. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  126. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  127. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  128. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  129. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  130. package/dist/resources/extensions/gsd/publication.js +87 -0
  131. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  132. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  133. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  134. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  135. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  136. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  137. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  138. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  139. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  140. package/dist/resources/extensions/gsd/state.js +6 -20
  141. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  142. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  143. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  144. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  145. package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
  146. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  147. package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
  148. package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
  149. package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
  150. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
  151. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  152. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  153. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
  154. package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
  155. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  156. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  157. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  158. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  159. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  160. package/dist/resources/extensions/gsd/undo.js +8 -7
  161. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  162. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  163. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  164. package/dist/resources/extensions/gsd/unit-registry.js +337 -0
  165. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  166. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  167. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  168. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  169. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  170. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  171. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  172. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  173. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  174. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  175. package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
  176. package/dist/resources/extensions/gsd/worktree-manager.js +52 -29
  177. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  178. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  179. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  180. package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
  181. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  182. package/dist/resources/extensions/gsd/worktree.js +8 -1
  183. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  184. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  185. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  186. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  187. package/dist/resources/shared/package-manager-detection.js +1 -1
  188. package/dist/resources/shared/package.json +3 -0
  189. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  190. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  191. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  192. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  193. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  194. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  195. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  196. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  197. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  198. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  199. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  200. package/dist/update-check.d.ts +2 -0
  201. package/dist/update-check.js +24 -1
  202. package/dist/update-cmd.js +20 -3
  203. package/dist/web/standalone/.next/BUILD_ID +1 -1
  204. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  205. package/dist/web/standalone/.next/build-manifest.json +3 -3
  206. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  207. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  208. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  209. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  210. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  211. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  212. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  213. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  214. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  215. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  216. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  217. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  218. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  219. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  220. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  221. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  222. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  223. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  224. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  225. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  226. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  227. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  228. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  229. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  230. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  231. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  232. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  233. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  234. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  235. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  236. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  237. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  238. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  239. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  240. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  241. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  242. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  243. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  244. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  245. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  246. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  247. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  248. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  249. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  250. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  251. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  252. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  253. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  254. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  255. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  256. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  257. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  258. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  259. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  260. package/dist/web/standalone/.next/server/app/index.html +1 -1
  261. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  262. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  263. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  264. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  265. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  266. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  267. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  268. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  269. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  270. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  271. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  272. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  273. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  274. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  275. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  276. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  277. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  278. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  279. package/dist/web/standalone/package.json +1 -1
  280. package/dist/worktree-cli.js +3 -6
  281. package/dist/worktree-status-banner.js +7 -11
  282. package/package.json +1 -1
  283. package/packages/cloud-mcp-gateway/package.json +2 -2
  284. package/packages/contracts/dist/rpc.d.ts +1 -0
  285. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  286. package/packages/contracts/dist/rpc.js.map +1 -1
  287. package/packages/contracts/dist/workflow.d.ts +4 -0
  288. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  289. package/packages/contracts/dist/workflow.js.map +1 -1
  290. package/packages/contracts/package.json +1 -1
  291. package/packages/daemon/package.json +4 -4
  292. package/packages/gsd-agent-core/package.json +5 -5
  293. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
  294. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  295. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +5 -0
  296. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  297. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  298. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  299. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  300. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  301. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  302. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  303. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  304. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  305. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  306. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  307. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  308. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  309. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  310. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  311. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  312. package/packages/gsd-agent-modes/package.json +7 -7
  313. package/packages/mcp-server/dist/cli.js +9 -1
  314. package/packages/mcp-server/dist/cli.js.map +1 -1
  315. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  316. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  317. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  318. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  319. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  320. package/packages/mcp-server/dist/server.js +4 -0
  321. package/packages/mcp-server/dist/server.js.map +1 -1
  322. package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
  323. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  324. package/packages/mcp-server/dist/workflow-tools.js +145 -59
  325. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  326. package/packages/mcp-server/package.json +5 -4
  327. package/packages/native/package.json +1 -1
  328. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  329. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  330. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  331. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  332. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  333. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  334. package/packages/pi-agent-core/dist/index.js +3 -0
  335. package/packages/pi-agent-core/dist/index.js.map +1 -1
  336. package/packages/pi-agent-core/package.json +1 -1
  337. package/packages/pi-ai/README.md +1 -0
  338. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  339. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  340. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  341. package/packages/pi-ai/dist/index.d.ts +2 -0
  342. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  343. package/packages/pi-ai/dist/index.js +2 -0
  344. package/packages/pi-ai/dist/index.js.map +1 -1
  345. package/packages/pi-ai/dist/models.generated.d.ts +158 -17
  346. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  347. package/packages/pi-ai/dist/models.generated.js +132 -17
  348. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  349. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  350. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  351. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  352. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  353. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  354. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  355. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  356. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  357. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  358. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  359. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  360. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  361. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  362. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  363. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  364. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  365. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  366. package/packages/pi-ai/package.json +3 -2
  367. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  368. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  369. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  370. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  371. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  372. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  373. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  375. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  376. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  377. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  378. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  380. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  382. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  383. package/packages/pi-coding-agent/dist/index.js +1 -1
  384. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  386. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  387. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  388. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  389. package/packages/pi-coding-agent/package.json +7 -7
  390. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  391. package/packages/pi-tui/dist/tui.js +9 -0
  392. package/packages/pi-tui/dist/tui.js.map +1 -1
  393. package/packages/pi-tui/package.json +2 -2
  394. package/packages/rpc-client/package.json +2 -2
  395. package/pkg/package.json +1 -1
  396. package/src/resources/GSD-WORKFLOW.md +5 -4
  397. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  398. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  399. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  400. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  401. package/src/resources/extensions/async-jobs/index.ts +79 -0
  402. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  403. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  404. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  405. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  406. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  407. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  408. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  409. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  410. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  411. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  412. package/src/resources/extensions/browser-tools/index.ts +71 -13
  413. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  414. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  415. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  416. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  417. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +40 -4
  418. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -0
  419. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  420. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  421. package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
  422. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  423. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  424. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  425. package/src/resources/extensions/gsd/auto/orchestrator.ts +137 -61
  426. package/src/resources/extensions/gsd/auto/phases.ts +74 -26
  427. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  428. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  429. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  430. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  431. package/src/resources/extensions/gsd/auto-post-unit.ts +52 -13
  432. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  433. package/src/resources/extensions/gsd/auto-start.ts +24 -29
  434. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  435. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  436. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  437. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  438. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  439. package/src/resources/extensions/gsd/auto-worktree.ts +55 -365
  440. package/src/resources/extensions/gsd/auto.ts +64 -25
  441. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  442. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  443. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +33 -12
  444. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  445. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  446. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
  447. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
  448. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  449. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  450. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  451. package/src/resources/extensions/gsd/captures.ts +5 -16
  452. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  453. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  454. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  455. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  456. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  457. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  458. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  459. package/src/resources/extensions/gsd/constants.ts +0 -3
  460. package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
  461. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  462. package/src/resources/extensions/gsd/db/queries.ts +490 -0
  463. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  464. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  465. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  466. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  467. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  468. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  469. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  470. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  471. package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
  472. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  473. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
  474. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  475. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  476. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  477. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  478. package/src/resources/extensions/gsd/files.ts +33 -12
  479. package/src/resources/extensions/gsd/git-service.ts +1 -0
  480. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  481. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  482. package/src/resources/extensions/gsd/gsd-db.ts +176 -2375
  483. package/src/resources/extensions/gsd/guidance.ts +217 -0
  484. package/src/resources/extensions/gsd/guided-flow.ts +71 -31
  485. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  486. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  487. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  488. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  489. package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
  490. package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
  491. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  492. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  493. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  494. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  495. package/src/resources/extensions/gsd/model-router.ts +3 -0
  496. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  497. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  498. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  499. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  500. package/src/resources/extensions/gsd/paths.ts +42 -22
  501. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  502. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  503. package/src/resources/extensions/gsd/preferences.ts +18 -0
  504. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  505. package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  506. package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
  507. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  508. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  509. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  510. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  511. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  512. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  513. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  514. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  515. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  516. package/src/resources/extensions/gsd/prompts/run-uat.md +7 -5
  517. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  518. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  519. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  520. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  521. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  522. package/src/resources/extensions/gsd/publication.ts +122 -0
  523. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  524. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  525. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  526. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  527. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  528. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  529. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  530. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  531. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  532. package/src/resources/extensions/gsd/state.ts +9 -21
  533. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  534. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  535. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +123 -0
  536. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  537. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
  538. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
  539. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  540. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  541. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  542. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  543. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  544. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  545. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  546. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  547. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  548. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  549. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  550. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  551. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  552. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  553. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
  554. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  555. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  556. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
  557. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  558. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  559. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  560. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  561. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  562. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  563. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  564. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  565. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  566. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  567. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  568. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  569. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +2 -6
  570. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  571. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
  572. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  573. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  574. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
  575. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  576. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
  577. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  578. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  579. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  580. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  581. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  582. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
  583. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  584. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  585. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  586. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  587. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  588. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  589. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  590. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
  591. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  592. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -1
  593. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  594. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  595. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
  596. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  597. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  598. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  599. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  600. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
  601. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  602. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
  603. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  604. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  605. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  606. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  607. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  608. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  609. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  610. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  611. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  612. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  613. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  614. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  615. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  616. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  617. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
  618. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  619. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  620. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
  621. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  622. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +24 -2
  623. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  624. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  625. package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
  626. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  627. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  628. package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
  629. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  630. package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
  631. package/src/resources/extensions/gsd/tools/complete-task.ts +3 -2
  632. package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
  633. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
  634. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  635. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  636. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
  637. package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
  638. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  639. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  640. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  641. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  642. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  643. package/src/resources/extensions/gsd/undo.ts +9 -8
  644. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  645. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  646. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  647. package/src/resources/extensions/gsd/unit-registry.ts +412 -0
  648. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  649. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  650. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  651. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  652. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  653. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  654. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  655. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  656. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  657. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  658. package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
  659. package/src/resources/extensions/gsd/worktree-manager.ts +53 -29
  660. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  661. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  662. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  663. package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
  664. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  665. package/src/resources/extensions/gsd/worktree.ts +7 -1
  666. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  667. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  668. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  669. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  670. package/src/resources/shared/package-manager-detection.ts +1 -1
  671. package/src/resources/shared/package.json +3 -0
  672. package/src/resources/skills/create-skill/SKILL.md +3 -0
  673. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  674. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  675. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  676. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  677. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  678. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  679. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  680. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  681. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  682. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  683. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  684. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  685. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  686. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  687. /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → yWwBo-w09Y_W-nmeeWFRp}/_buildManifest.js +0 -0
  688. /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → yWwBo-w09Y_W-nmeeWFRp}/_ssgManifest.js +0 -0
@@ -0,0 +1,490 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Query Module — the read-only seam of the DB layer.
3
+ // SELECT-only wrappers, read through the shared engine handle (getDbOrNull()).
4
+ // Contains NO write SQL (asserted by tests/single-writer-invariant.test.ts).
5
+ // Read-only callers (forensics, dashboard, doctor) depend on this seam, not on
6
+ // the single-writer surface.
7
+ import { getDbOrNull } from "./engine.js";
8
+ import { isClosedStatus } from "../status-guards.js";
9
+ import { getGateIdsForTurn, type OwnerTurn } from "../gate-registry.js";
10
+ import type { Decision, Requirement, GateRow, GateScope } from "../types.js";
11
+ import {
12
+ emptyTaskStatusCounts,
13
+ rowToActiveTaskSummary,
14
+ rowToIdStatusSummary,
15
+ rowToTaskStatusCounts,
16
+ rowsToStringColumn,
17
+ type ActiveTaskSummary,
18
+ type IdStatusSummary,
19
+ type TaskStatusCounts,
20
+ } from "../db-lightweight-query-rows.js";
21
+ import {
22
+ rowToActiveDecision,
23
+ rowToActiveRequirement,
24
+ rowToDecision,
25
+ rowToRequirement,
26
+ rowsToRequirementCounts,
27
+ } from "../db-decision-requirement-rows.js";
28
+ import { rowToGate } from "../db-gate-rows.js";
29
+ import { rowToArtifact, rowToMilestone, type ArtifactRow, type MilestoneRow } from "../db-milestone-artifact-rows.js";
30
+ import { rowToSlice, rowToTask, type SliceRow, type TaskRow } from "../db-task-slice-rows.js";
31
+
32
+
33
+ function parseStringArrayColumn(raw: unknown): string[] {
34
+ if (Array.isArray(raw)) return raw.filter((entry): entry is string => typeof entry === "string");
35
+ if (typeof raw !== "string") return [];
36
+ const trimmed = raw.trim();
37
+ if (!trimmed) return [];
38
+ try {
39
+ const parsed = JSON.parse(trimmed);
40
+ if (Array.isArray(parsed)) return parsed.filter((entry): entry is string => typeof entry === "string");
41
+ if (typeof parsed === "string") return [parsed];
42
+ } catch {
43
+ return trimmed.split(",");
44
+ }
45
+ return [];
46
+ }
47
+
48
+ function normalizeRepoPath(file: string): string {
49
+ return file.trim().replace(/\\/g, "/").replace(/^\.\/+/, "");
50
+ }
51
+
52
+ export function getDecisionById(id: string): Decision | null {
53
+ if (!getDbOrNull()!) return null;
54
+ const row = getDbOrNull()!.prepare("SELECT * FROM decisions WHERE id = ?").get(id);
55
+ if (!row) return null;
56
+ return rowToDecision(row);
57
+ }
58
+
59
+ export function getActiveDecisions(): Decision[] {
60
+ if (!getDbOrNull()!) return [];
61
+ const rows = getDbOrNull()!.prepare("SELECT * FROM active_decisions").all();
62
+ return rows.map(rowToActiveDecision);
63
+ }
64
+
65
+ export function getRequirementById(id: string): Requirement | null {
66
+ if (!getDbOrNull()!) return null;
67
+ const row = getDbOrNull()!.prepare("SELECT * FROM requirements WHERE id = ?").get(id);
68
+ if (!row) return null;
69
+ return rowToRequirement(row);
70
+ }
71
+
72
+ export function getActiveRequirements(): Requirement[] {
73
+ if (!getDbOrNull()!) return [];
74
+ const rows = getDbOrNull()!.prepare("SELECT * FROM active_requirements").all();
75
+ return rows.map(rowToActiveRequirement);
76
+ }
77
+
78
+ export function getRequirementCounts(): {
79
+ active: number;
80
+ validated: number;
81
+ deferred: number;
82
+ outOfScope: number;
83
+ blocked: number;
84
+ total: number;
85
+ } {
86
+ if (!getDbOrNull()!) {
87
+ return { active: 0, validated: 0, deferred: 0, outOfScope: 0, blocked: 0, total: 0 };
88
+ }
89
+ const rows = getDbOrNull()!
90
+ .prepare("SELECT lower(status) as status, COUNT(*) as count FROM requirements GROUP BY lower(status)")
91
+ .all();
92
+ return rowsToRequirementCounts(rows);
93
+ }
94
+
95
+ /**
96
+ * ADR-017 raw primitive: returns slice IDs in a milestone whose is_sketch flag
97
+ * is still 1. The stale-sketch-flag drift handler at
98
+ * `state-reconciliation/drift/sketch-flag.ts` composes this with PLAN.md
99
+ * existence checks to detect drift, then writes via `setSliceSketchFlag`.
100
+ */
101
+ export function getSketchedSliceIds(milestoneId: string): string[] {
102
+ if (!getDbOrNull()!) return [];
103
+ const rows = getDbOrNull()!.prepare(
104
+ `SELECT id FROM slices WHERE milestone_id = :mid AND is_sketch = 1`,
105
+ ).all({ ":mid": milestoneId }) as Array<{ id: string }>;
106
+ return rows.map((r) => r.id);
107
+ }
108
+
109
+ export function getSlice(milestoneId: string, sliceId: string): SliceRow | null {
110
+ if (!getDbOrNull()!) return null;
111
+ const row = getDbOrNull()!.prepare("SELECT * FROM slices WHERE milestone_id = :mid AND id = :sid").get({ ":mid": milestoneId, ":sid": sliceId });
112
+ if (!row) return null;
113
+ return rowToSlice(row);
114
+ }
115
+
116
+ export function getTask(milestoneId: string, sliceId: string, taskId: string): TaskRow | null {
117
+ if (!getDbOrNull()!) return null;
118
+ const row = getDbOrNull()!.prepare(
119
+ "SELECT * FROM tasks WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid",
120
+ ).get({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
121
+ if (!row) return null;
122
+ return rowToTask(row);
123
+ }
124
+
125
+ export function getSliceTasks(milestoneId: string, sliceId: string): TaskRow[] {
126
+ if (!getDbOrNull()!) return [];
127
+ const rows = getDbOrNull()!.prepare(
128
+ "SELECT * FROM tasks WHERE milestone_id = :mid AND slice_id = :sid ORDER BY sequence, id",
129
+ ).all({ ":mid": milestoneId, ":sid": sliceId });
130
+ return rows.map(rowToTask);
131
+ }
132
+
133
+ export function getCompletedMilestoneTaskFileHints(milestoneId: string): string[] {
134
+ if (!getDbOrNull()!) return [];
135
+ const rows = getDbOrNull()!.prepare(
136
+ `SELECT files, key_files
137
+ FROM tasks
138
+ WHERE milestone_id = :mid AND status IN ('complete', 'done')`,
139
+ ).all({ ":mid": milestoneId }) as Array<Record<string, unknown>>;
140
+
141
+ const hints = new Set<string>();
142
+ for (const row of rows) {
143
+ for (const raw of [row["files"], row["key_files"]]) {
144
+ for (const file of parseStringArrayColumn(raw)) {
145
+ const normalized = normalizeRepoPath(file);
146
+ if (normalized) hints.add(normalized);
147
+ }
148
+ }
149
+ }
150
+ return [...hints];
151
+ }
152
+
153
+ /** Find the most recent resolved-but-unapplied escalation override in a slice. */
154
+ export function findUnappliedEscalationOverride(
155
+ milestoneId: string, sliceId: string,
156
+ ): { taskId: string; artifactPath: string } | null {
157
+ if (!getDbOrNull()!) return null;
158
+ // Filter BOTH flags: escalation_pending=0 AND escalation_awaiting_review=0
159
+ // ensures we only claim overrides the user has explicitly resolved.
160
+ // Without the awaiting_review filter, continueWithDefault=true artifacts
161
+ // (not yet responded to) would be prematurely claimed, causing the override
162
+ // to be lost when the user later resolves (#ADR-011 Phase 2 peer-review Bug 2).
163
+ const row = getDbOrNull()!.prepare(
164
+ `SELECT id, escalation_artifact_path AS path
165
+ FROM tasks
166
+ WHERE milestone_id = :mid AND slice_id = :sid
167
+ AND escalation_artifact_path IS NOT NULL
168
+ AND escalation_override_applied_at IS NULL
169
+ AND escalation_pending = 0
170
+ AND escalation_awaiting_review = 0
171
+ ORDER BY sequence DESC, id DESC
172
+ LIMIT 1`,
173
+ ).get({ ":mid": milestoneId, ":sid": sliceId }) as
174
+ | { id: string; path: string | null }
175
+ | undefined;
176
+ if (!row || !row.path) return null;
177
+ return { taskId: row.id, artifactPath: row.path };
178
+ }
179
+
180
+ /** List tasks with active escalation artifacts across a milestone (for /gsd escalate list). */
181
+ export function listEscalationArtifacts(milestoneId: string, includeResolved: boolean = false): TaskRow[] {
182
+ if (!getDbOrNull()!) return [];
183
+ const filter = includeResolved
184
+ ? "escalation_artifact_path IS NOT NULL"
185
+ : "(escalation_pending = 1 OR escalation_awaiting_review = 1) AND escalation_artifact_path IS NOT NULL";
186
+ const rows = getDbOrNull()!.prepare(
187
+ `SELECT * FROM tasks WHERE milestone_id = :mid AND ${filter} ORDER BY slice_id, sequence, id`,
188
+ ).all({ ":mid": milestoneId });
189
+ return rows.map(rowToTask);
190
+ }
191
+
192
+ export interface VerificationEvidenceRow {
193
+ id: number;
194
+ task_id: string;
195
+ slice_id: string;
196
+ milestone_id: string;
197
+ command: string;
198
+ exit_code: number;
199
+ verdict: string;
200
+ duration_ms: number;
201
+ created_at: string;
202
+ }
203
+
204
+ export function getVerificationEvidence(milestoneId: string, sliceId: string, taskId: string): VerificationEvidenceRow[] {
205
+ if (!getDbOrNull()!) return [];
206
+ const rows = getDbOrNull()!.prepare(
207
+ "SELECT * FROM verification_evidence WHERE milestone_id = :mid AND slice_id = :sid AND task_id = :tid ORDER BY id",
208
+ ).all({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
209
+ return rows as unknown as VerificationEvidenceRow[];
210
+ }
211
+
212
+ export function getAllMilestones(): MilestoneRow[] {
213
+ if (!getDbOrNull()!) return [];
214
+ const rows = getDbOrNull()!.prepare(
215
+ "SELECT * FROM milestones ORDER BY CASE WHEN sequence > 0 THEN 0 ELSE 1 END, sequence, id",
216
+ ).all();
217
+ return rows.map(rowToMilestone);
218
+ }
219
+
220
+ export function getMilestone(id: string): MilestoneRow | null {
221
+ if (!getDbOrNull()!) return null;
222
+ const row = getDbOrNull()!.prepare("SELECT * FROM milestones WHERE id = :id").get({ ":id": id });
223
+ if (!row) return null;
224
+ return rowToMilestone(row);
225
+ }
226
+
227
+ export function getActiveMilestoneFromDb(): MilestoneRow | null {
228
+ if (!getDbOrNull()!) return null;
229
+ const row = getDbOrNull()!.prepare(
230
+ "SELECT * FROM milestones WHERE status NOT IN ('complete', 'done', 'skipped', 'closed', 'parked') ORDER BY id LIMIT 1",
231
+ ).get();
232
+ if (!row) return null;
233
+ return rowToMilestone(row);
234
+ }
235
+
236
+ export function getActiveSliceFromDb(milestoneId: string): SliceRow | null {
237
+ if (!getDbOrNull()!) return null;
238
+
239
+ // Single query: find the first non-complete slice whose dependencies are all satisfied.
240
+ // Uses json_each() to expand the JSON depends array and checks each dep is complete.
241
+ const row = getDbOrNull()!.prepare(
242
+ `SELECT s.* FROM slices s
243
+ WHERE s.milestone_id = :mid
244
+ AND s.status NOT IN ('complete', 'done', 'skipped')
245
+ AND NOT EXISTS (
246
+ SELECT 1 FROM json_each(s.depends) AS dep
247
+ WHERE dep.value NOT IN (
248
+ SELECT id FROM slices WHERE milestone_id = :mid AND status IN ('complete', 'done', 'skipped')
249
+ )
250
+ )
251
+ ORDER BY s.sequence, s.id
252
+ LIMIT 1`,
253
+ ).get({ ":mid": milestoneId });
254
+ if (!row) return null;
255
+ return rowToSlice(row);
256
+ }
257
+
258
+ export function getActiveTaskFromDb(milestoneId: string, sliceId: string): TaskRow | null {
259
+ if (!getDbOrNull()!) return null;
260
+ const row = getDbOrNull()!.prepare(
261
+ "SELECT * FROM tasks WHERE milestone_id = :mid AND slice_id = :sid AND status NOT IN ('complete', 'done') ORDER BY sequence, id LIMIT 1",
262
+ ).get({ ":mid": milestoneId, ":sid": sliceId });
263
+ if (!row) return null;
264
+ return rowToTask(row);
265
+ }
266
+
267
+ export function getMilestoneSlices(milestoneId: string): SliceRow[] {
268
+ if (!getDbOrNull()!) return [];
269
+ const rows = getDbOrNull()!.prepare("SELECT * FROM slices WHERE milestone_id = :mid ORDER BY sequence, id").all({ ":mid": milestoneId });
270
+ return rows.map(rowToSlice);
271
+ }
272
+
273
+ /** Dispatch-eligibility shape consumed by decision-path callers (ADR-017). */
274
+ export interface MilestoneSliceSummary {
275
+ id: string;
276
+ title: string;
277
+ /** Closed per the canonical status vocabulary (complete/done/skipped/closed). */
278
+ done: boolean;
279
+ depends: string[];
280
+ }
281
+
282
+ /**
283
+ * Consolidated DB read for dispatch/gate/completion decisions (ADR-017).
284
+ * `done` uses the canonical closed-status predicate (`isClosedStatus`) — the
285
+ * same vocabulary the SQL terminal-status fragment derives from. Decision
286
+ * paths must consume this instead of parsing `.gsd/*.md` projections.
287
+ * Rows keep `getMilestoneSlices` ordering (sequence, then id).
288
+ */
289
+ export function getMilestoneSliceSummaries(milestoneId: string): MilestoneSliceSummary[] {
290
+ return getMilestoneSlices(milestoneId).map((s) => ({
291
+ id: s.id,
292
+ title: s.title,
293
+ done: isClosedStatus(s.status),
294
+ depends: s.depends ?? [],
295
+ }));
296
+ }
297
+
298
+ /**
299
+ * Ids of slices closed per the canonical status vocabulary (ADR-017), in
300
+ * milestone order. Thin wrapper over `getMilestoneSliceSummaries` for the
301
+ * common "which slices are done?" decision-path read.
302
+ */
303
+ export function getClosedSliceIds(milestoneId: string): string[] {
304
+ return getMilestoneSliceSummaries(milestoneId)
305
+ .filter((s) => s.done)
306
+ .map((s) => s.id);
307
+ }
308
+
309
+ export function getArtifact(path: string): ArtifactRow | null {
310
+ if (!getDbOrNull()!) return null;
311
+ const row = getDbOrNull()!.prepare("SELECT * FROM artifacts WHERE path = :path").get({ ":path": path });
312
+ if (!row) return null;
313
+ return rowToArtifact(row);
314
+ }
315
+
316
+ /** Fast milestone status check — avoids deserializing JSON planning fields. */
317
+ export function getActiveMilestoneIdFromDb(): IdStatusSummary | null {
318
+ if (!getDbOrNull()!) return null;
319
+ const row = getDbOrNull()!.prepare(
320
+ "SELECT id, status FROM milestones WHERE status NOT IN ('complete', 'done', 'skipped', 'closed', 'parked') ORDER BY id LIMIT 1",
321
+ ).get();
322
+ if (!row) return null;
323
+ return rowToIdStatusSummary(row);
324
+ }
325
+
326
+ /** Fast slice status check — avoids deserializing JSON depends/planning fields. */
327
+ export function getSliceStatusSummary(milestoneId: string): IdStatusSummary[] {
328
+ if (!getDbOrNull()!) return [];
329
+ return getDbOrNull()!.prepare(
330
+ "SELECT id, status FROM slices WHERE milestone_id = :mid ORDER BY sequence, id",
331
+ ).all({ ":mid": milestoneId }).map(rowToIdStatusSummary);
332
+ }
333
+
334
+ /** Fast task status check — avoids deserializing JSON arrays and large text fields. */
335
+ export function getActiveTaskIdFromDb(milestoneId: string, sliceId: string): ActiveTaskSummary | null {
336
+ if (!getDbOrNull()!) return null;
337
+ const row = getDbOrNull()!.prepare(
338
+ "SELECT id, status, title FROM tasks WHERE milestone_id = :mid AND slice_id = :sid AND status NOT IN ('complete', 'done') ORDER BY sequence, id LIMIT 1",
339
+ ).get({ ":mid": milestoneId, ":sid": sliceId });
340
+ if (!row) return null;
341
+ return rowToActiveTaskSummary(row);
342
+ }
343
+
344
+ /** Count tasks by status for a slice — useful for progress reporting without full row load. */
345
+ export function getSliceTaskCounts(milestoneId: string, sliceId: string): TaskStatusCounts {
346
+ if (!getDbOrNull()!) return emptyTaskStatusCounts();
347
+ const row = getDbOrNull()!.prepare(
348
+ `SELECT
349
+ COUNT(*) as total,
350
+ SUM(CASE WHEN status IN ('complete', 'done') THEN 1 ELSE 0 END) as done,
351
+ SUM(CASE WHEN status NOT IN ('complete', 'done') THEN 1 ELSE 0 END) as pending
352
+ FROM tasks WHERE milestone_id = :mid AND slice_id = :sid`,
353
+ ).get({ ":mid": milestoneId, ":sid": sliceId });
354
+ return rowToTaskStatusCounts(row);
355
+ }
356
+
357
+ /** Get all slices that depend on a given slice. */
358
+ export function getDependentSlices(milestoneId: string, sliceId: string): string[] {
359
+ if (!getDbOrNull()!) return [];
360
+ const rows = getDbOrNull()!.prepare(
361
+ "SELECT slice_id FROM slice_dependencies WHERE milestone_id = :mid AND depends_on_slice_id = :sid",
362
+ ).all({ ":mid": milestoneId, ":sid": sliceId });
363
+ return rowsToStringColumn(rows, "slice_id");
364
+ }
365
+
366
+ export function getReplanHistory(milestoneId: string, sliceId?: string): Array<Record<string, unknown>> {
367
+ if (!getDbOrNull()!) return [];
368
+ if (sliceId) {
369
+ return getDbOrNull()!.prepare(
370
+ `SELECT * FROM replan_history WHERE milestone_id = :mid AND slice_id = :sid ORDER BY created_at DESC`,
371
+ ).all({ ":mid": milestoneId, ":sid": sliceId });
372
+ }
373
+ return getDbOrNull()!.prepare(
374
+ `SELECT * FROM replan_history WHERE milestone_id = :mid ORDER BY created_at DESC`,
375
+ ).all({ ":mid": milestoneId });
376
+ }
377
+
378
+ export function getAssessment(path: string): Record<string, unknown> | null {
379
+ if (!getDbOrNull()!) return null;
380
+ const row = getDbOrNull()!.prepare(
381
+ `SELECT * FROM assessments WHERE path = :path`,
382
+ ).get({ ":path": path });
383
+ return row ?? null;
384
+ }
385
+
386
+ export function getLatestAssessmentByScope(
387
+ milestoneId: string,
388
+ scope: string,
389
+ ): Record<string, unknown> | null {
390
+ if (!getDbOrNull()!) return null;
391
+ const row = getDbOrNull()!.prepare(
392
+ `SELECT * FROM assessments
393
+ WHERE milestone_id = :mid AND scope = :scope
394
+ ORDER BY created_at DESC
395
+ LIMIT 1`,
396
+ ).get({ ":mid": milestoneId, ":scope": scope });
397
+ return row ?? null;
398
+ }
399
+
400
+ export function getPendingGates(milestoneId: string, sliceId: string, scope?: GateScope): GateRow[] {
401
+ if (!getDbOrNull()!) return [];
402
+ const sql = scope
403
+ ? `SELECT * FROM quality_gates WHERE milestone_id = :mid AND slice_id = :sid AND scope = :scope AND status = 'pending'`
404
+ : `SELECT * FROM quality_gates WHERE milestone_id = :mid AND slice_id = :sid AND status = 'pending'`;
405
+ const params: Record<string, unknown> = { ":mid": milestoneId, ":sid": sliceId };
406
+ if (scope) params[":scope"] = scope;
407
+ return getDbOrNull()!.prepare(sql).all(params).map(rowToGate);
408
+ }
409
+
410
+ export function getGateResults(milestoneId: string, sliceId: string, scope?: GateScope): GateRow[] {
411
+ if (!getDbOrNull()!) return [];
412
+ const sql = scope
413
+ ? `SELECT * FROM quality_gates WHERE milestone_id = :mid AND slice_id = :sid AND scope = :scope`
414
+ : `SELECT * FROM quality_gates WHERE milestone_id = :mid AND slice_id = :sid`;
415
+ const params: Record<string, unknown> = { ":mid": milestoneId, ":sid": sliceId };
416
+ if (scope) params[":scope"] = scope;
417
+ return getDbOrNull()!.prepare(sql).all(params).map(rowToGate);
418
+ }
419
+
420
+ export function getPendingSliceGateCount(milestoneId: string, sliceId: string): number {
421
+ if (!getDbOrNull()!) return 0;
422
+ const row = getDbOrNull()!.prepare(
423
+ `SELECT COUNT(*) as cnt FROM quality_gates
424
+ WHERE milestone_id = :mid AND slice_id = :sid AND scope = 'slice' AND status = 'pending'`,
425
+ ).get({ ":mid": milestoneId, ":sid": sliceId });
426
+ return row ? (row["cnt"] as number) : 0;
427
+ }
428
+
429
+ /**
430
+ * Return pending gate rows owned by a specific workflow turn.
431
+ *
432
+ * Unlike `getPendingGates(..., scope)`, this filters by the registry's
433
+ * `ownerTurn` metadata so callers can distinguish Q3/Q4 (owned by
434
+ * gate-evaluate) from Q8 (owned by complete-slice) even though both are
435
+ * scope:"slice". Pass `taskId` to narrow task-scoped results to one task.
436
+ */
437
+ export function getPendingGatesForTurn(
438
+ milestoneId: string,
439
+ sliceId: string,
440
+ turn: OwnerTurn,
441
+ taskId?: string,
442
+ ): GateRow[] {
443
+ if (!getDbOrNull()!) return [];
444
+ const ids = getGateIdsForTurn(turn);
445
+ if (ids.size === 0) return [];
446
+ const idList = [...ids];
447
+ const placeholders = idList.map((_, i) => `:gid${i}`).join(",");
448
+ const params: Record<string, unknown> = {
449
+ ":mid": milestoneId,
450
+ ":sid": sliceId,
451
+ };
452
+ idList.forEach((id, i) => {
453
+ params[`:gid${i}`] = id;
454
+ });
455
+ let sql =
456
+ `SELECT * FROM quality_gates
457
+ WHERE milestone_id = :mid AND slice_id = :sid
458
+ AND status = 'pending'
459
+ AND gate_id IN (${placeholders})`;
460
+ if (taskId !== undefined) {
461
+ sql += ` AND task_id = :tid`;
462
+ params[":tid"] = taskId;
463
+ }
464
+ return getDbOrNull()!.prepare(sql).all(params).map(rowToGate);
465
+ }
466
+
467
+ /**
468
+ * Count pending gates for a turn. Convenience wrapper used by state
469
+ * derivation to decide whether a phase transition should pause.
470
+ */
471
+ export function getPendingGateCountForTurn(
472
+ milestoneId: string,
473
+ sliceId: string,
474
+ turn: OwnerTurn,
475
+ ): number {
476
+ return getPendingGatesForTurn(milestoneId, sliceId, turn).length;
477
+ }
478
+
479
+ export function getMilestoneCommitAttributionShas(milestoneId: string): string[] {
480
+ if (!getDbOrNull()!) return [];
481
+ const rows = getDbOrNull()!.prepare(
482
+ `SELECT commit_sha
483
+ FROM milestone_commit_attributions
484
+ WHERE milestone_id = :mid
485
+ ORDER BY created_at, commit_sha`,
486
+ ).all({ ":mid": milestoneId }) as Array<Record<string, unknown>>;
487
+ return rows
488
+ .map((row) => typeof row["commit_sha"] === "string" ? row["commit_sha"] : "")
489
+ .filter(Boolean);
490
+ }
@@ -0,0 +1,12 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Shared SQL literal fragments for the single-writer layer.
3
+ // Kept out of the barrel surface (imported as values, not re-exported) so it
4
+ // stays an implementation detail of the writers.
5
+ import { RAW_CLOSED_STATUSES } from "../status-guards.js";
6
+
7
+ /** Status values that mean a unit is closed; used in ON CONFLICT guards to
8
+ * prevent an upsert from reopening a completed slice/task. Derived from the
9
+ * single source `RAW_CLOSED_STATUSES` (ADR-030) so the SQL fragment cannot
10
+ * drift from `isClosedStatus()`. Renders as `'complete', 'done', 'skipped',
11
+ * 'closed'`. */
12
+ export const TERMINAL_STATUS_SQL = RAW_CLOSED_STATUSES.map((s) => `'${s}'`).join(", ");