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

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 (551) 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/models-resolver.d.ts +3 -13
  7. package/dist/models-resolver.js +3 -22
  8. package/dist/resource-loader.js +2 -14
  9. package/dist/resources/.managed-resources-content-hash +1 -1
  10. package/dist/resources/GSD-WORKFLOW.md +5 -4
  11. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  12. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  13. package/dist/resources/extensions/async-jobs/index.js +65 -0
  14. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  15. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  16. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  17. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  18. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  19. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  20. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  21. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  22. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  23. package/dist/resources/extensions/browser-tools/index.js +69 -12
  24. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  25. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +38 -6
  26. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  27. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  28. package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
  29. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  30. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  31. package/dist/resources/extensions/gsd/auto/orchestrator.js +94 -48
  32. package/dist/resources/extensions/gsd/auto/phases.js +8 -3
  33. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +8 -32
  34. package/dist/resources/extensions/gsd/auto-dispatch.js +40 -57
  35. package/dist/resources/extensions/gsd/auto-model-selection.js +25 -6
  36. package/dist/resources/extensions/gsd/auto-post-unit.js +31 -14
  37. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  38. package/dist/resources/extensions/gsd/auto-start.js +24 -26
  39. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  40. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  41. package/dist/resources/extensions/gsd/auto-verification.js +9 -28
  42. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  43. package/dist/resources/extensions/gsd/auto-worktree.js +35 -352
  44. package/dist/resources/extensions/gsd/auto.js +8 -20
  45. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +3 -2
  46. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -12
  47. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  48. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
  49. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
  50. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  51. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  52. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  53. package/dist/resources/extensions/gsd/captures.js +5 -15
  54. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  55. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  56. package/dist/resources/extensions/gsd/consent-question.js +337 -0
  57. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  58. package/dist/resources/extensions/gsd/constants.js +0 -2
  59. package/dist/resources/extensions/gsd/crash-recovery.js +4 -12
  60. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  61. package/dist/resources/extensions/gsd/db/queries.js +398 -0
  62. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  63. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  64. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  65. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  66. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  67. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  68. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  69. package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
  70. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  71. package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -3
  72. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  73. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  74. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  75. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  76. package/dist/resources/extensions/gsd/files.js +33 -19
  77. package/dist/resources/extensions/gsd/git-service.js +1 -0
  78. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  79. package/dist/resources/extensions/gsd/gsd-db.js +171 -2048
  80. package/dist/resources/extensions/gsd/guidance.js +158 -0
  81. package/dist/resources/extensions/gsd/guided-flow.js +51 -5
  82. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  83. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  84. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  85. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  86. package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
  87. package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
  88. package/dist/resources/extensions/gsd/milestone-closeout.js +13 -23
  89. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  90. package/dist/resources/extensions/gsd/model-router.js +3 -0
  91. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  92. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  93. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  94. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  95. package/dist/resources/extensions/gsd/paths.js +37 -24
  96. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  97. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  98. package/dist/resources/extensions/gsd/preferences.js +14 -0
  99. package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  100. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  101. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  102. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  103. package/dist/resources/extensions/gsd/prompts/run-uat.md +6 -4
  104. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  105. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  106. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  107. package/dist/resources/extensions/gsd/publication.js +87 -0
  108. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  109. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  110. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  111. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  112. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  113. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  114. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  115. package/dist/resources/extensions/gsd/state.js +6 -20
  116. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  117. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  118. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  119. package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
  120. package/dist/resources/extensions/gsd/tools/complete-slice.js +44 -53
  121. package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
  122. package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
  123. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
  124. package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
  125. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  126. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  127. package/dist/resources/extensions/gsd/undo.js +8 -7
  128. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  129. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  130. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  131. package/dist/resources/extensions/gsd/unit-registry.js +337 -0
  132. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  133. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  134. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  135. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  136. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  137. package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
  138. package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
  139. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  140. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  141. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  142. package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
  143. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  144. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  145. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  146. package/dist/resources/extensions/shared/gsd-browser-cli.js +96 -5
  147. package/dist/resources/shared/package.json +3 -0
  148. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  149. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  150. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  151. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  152. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  153. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  154. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  155. package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
  156. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  157. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  158. package/dist/web/standalone/.next/BUILD_ID +1 -1
  159. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  160. package/dist/web/standalone/.next/build-manifest.json +3 -3
  161. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  162. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  163. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  164. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  166. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  167. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  169. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  171. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  172. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  174. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  176. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  178. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  179. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  183. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  184. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  185. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  186. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  187. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  189. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  191. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  195. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  197. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  201. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  202. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  203. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  204. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  205. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  207. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  208. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  209. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  210. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  211. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  212. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  214. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  215. package/dist/web/standalone/.next/server/app/index.html +1 -1
  216. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  217. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  218. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  219. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  220. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  221. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  222. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  223. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  224. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  225. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  226. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  227. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  228. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  229. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  230. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  231. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  232. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  233. package/dist/web/standalone/package.json +1 -1
  234. package/dist/worktree-cli.js +3 -6
  235. package/dist/worktree-status-banner.js +7 -11
  236. package/package.json +1 -1
  237. package/packages/cloud-mcp-gateway/package.json +2 -2
  238. package/packages/contracts/dist/rpc.d.ts +1 -0
  239. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  240. package/packages/contracts/dist/rpc.js.map +1 -1
  241. package/packages/contracts/dist/workflow.d.ts +4 -0
  242. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  243. package/packages/contracts/dist/workflow.js.map +1 -1
  244. package/packages/contracts/package.json +1 -1
  245. package/packages/daemon/package.json +4 -4
  246. package/packages/gsd-agent-core/package.json +5 -5
  247. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
  248. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  249. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +8 -0
  250. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  251. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  252. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  253. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  254. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  255. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  256. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  257. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  258. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  259. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  260. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  261. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  262. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  263. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  264. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  265. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  266. package/packages/gsd-agent-modes/package.json +7 -7
  267. package/packages/mcp-server/dist/cli.js +6 -3
  268. package/packages/mcp-server/dist/cli.js.map +1 -1
  269. package/packages/mcp-server/dist/workflow-tools.d.ts +8 -0
  270. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  271. package/packages/mcp-server/dist/workflow-tools.js +46 -21
  272. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  273. package/packages/mcp-server/package.json +3 -3
  274. package/packages/native/package.json +1 -1
  275. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  276. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  277. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  278. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  279. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  280. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  281. package/packages/pi-agent-core/dist/index.js +3 -0
  282. package/packages/pi-agent-core/dist/index.js.map +1 -1
  283. package/packages/pi-agent-core/package.json +1 -1
  284. package/packages/pi-ai/README.md +1 -0
  285. package/packages/pi-ai/dist/models.generated.d.ts +192 -0
  286. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  287. package/packages/pi-ai/dist/models.generated.js +166 -0
  288. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  289. package/packages/pi-ai/package.json +3 -2
  290. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  291. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  293. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  294. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  296. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  297. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  298. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  299. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  300. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  301. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  303. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  304. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  305. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  306. package/packages/pi-coding-agent/dist/index.js +1 -1
  307. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  308. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  309. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  310. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  311. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  312. package/packages/pi-coding-agent/package.json +7 -7
  313. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  314. package/packages/pi-tui/dist/tui.js +9 -0
  315. package/packages/pi-tui/dist/tui.js.map +1 -1
  316. package/packages/pi-tui/package.json +2 -2
  317. package/packages/rpc-client/package.json +2 -2
  318. package/pkg/package.json +1 -1
  319. package/src/resources/GSD-WORKFLOW.md +5 -4
  320. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  321. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  322. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  323. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  324. package/src/resources/extensions/async-jobs/index.ts +79 -0
  325. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  326. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  327. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  328. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  329. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  330. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  331. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  332. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  333. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  334. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  335. package/src/resources/extensions/browser-tools/index.ts +71 -13
  336. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  337. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +29 -1
  338. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  339. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  340. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +40 -4
  341. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -0
  342. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  343. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  344. package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
  345. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  346. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  347. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  348. package/src/resources/extensions/gsd/auto/orchestrator.ts +109 -51
  349. package/src/resources/extensions/gsd/auto/phases.ts +12 -3
  350. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -32
  351. package/src/resources/extensions/gsd/auto-dispatch.ts +38 -52
  352. package/src/resources/extensions/gsd/auto-model-selection.ts +25 -5
  353. package/src/resources/extensions/gsd/auto-post-unit.ts +37 -13
  354. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  355. package/src/resources/extensions/gsd/auto-start.ts +24 -29
  356. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  357. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  358. package/src/resources/extensions/gsd/auto-verification.ts +8 -26
  359. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  360. package/src/resources/extensions/gsd/auto-worktree.ts +41 -364
  361. package/src/resources/extensions/gsd/auto.ts +20 -24
  362. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +3 -5
  363. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +33 -12
  364. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  365. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
  366. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
  367. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  368. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  369. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  370. package/src/resources/extensions/gsd/captures.ts +5 -16
  371. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  372. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  373. package/src/resources/extensions/gsd/consent-question.ts +416 -0
  374. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  375. package/src/resources/extensions/gsd/constants.ts +0 -3
  376. package/src/resources/extensions/gsd/crash-recovery.ts +3 -9
  377. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  378. package/src/resources/extensions/gsd/db/queries.ts +490 -0
  379. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  380. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  381. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  382. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  383. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  384. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  385. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  386. package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
  387. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  388. package/src/resources/extensions/gsd/doctor-git-checks.ts +3 -3
  389. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  390. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  391. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  392. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  393. package/src/resources/extensions/gsd/files.ts +33 -12
  394. package/src/resources/extensions/gsd/git-service.ts +1 -0
  395. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  396. package/src/resources/extensions/gsd/gsd-db.ts +173 -2373
  397. package/src/resources/extensions/gsd/guidance.ts +217 -0
  398. package/src/resources/extensions/gsd/guided-flow.ts +50 -5
  399. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  400. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  401. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  402. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  403. package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
  404. package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
  405. package/src/resources/extensions/gsd/milestone-closeout.ts +13 -23
  406. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  407. package/src/resources/extensions/gsd/model-router.ts +3 -0
  408. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  409. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  410. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  411. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  412. package/src/resources/extensions/gsd/paths.ts +42 -22
  413. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  414. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  415. package/src/resources/extensions/gsd/preferences.ts +18 -0
  416. package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  417. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  418. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  419. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  420. package/src/resources/extensions/gsd/prompts/run-uat.md +6 -4
  421. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  422. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  423. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  424. package/src/resources/extensions/gsd/publication.ts +122 -0
  425. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  426. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  427. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  428. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  429. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  430. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  431. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  432. package/src/resources/extensions/gsd/state.ts +9 -21
  433. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  434. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  435. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +123 -0
  436. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +22 -0
  437. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +101 -26
  438. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
  439. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  440. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  441. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  442. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  443. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  444. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  445. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  446. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  447. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  448. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  449. package/src/resources/extensions/gsd/tests/consent-question.test.ts +336 -0
  450. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  451. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
  452. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  453. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
  454. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  455. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  456. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  457. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  458. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  459. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  460. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  461. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  462. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  463. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  464. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  465. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
  466. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  467. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  468. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
  469. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  470. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
  471. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  472. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  473. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  474. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  475. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +139 -0
  476. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  477. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  478. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  479. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  480. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  481. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
  482. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +1 -0
  483. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  484. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  485. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
  486. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  487. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  488. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  489. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
  490. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  491. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
  492. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  493. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  494. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  495. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  496. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  497. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  498. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +2 -2
  499. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  500. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
  501. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  502. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  503. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
  504. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  505. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
  506. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  507. package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
  508. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  509. package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
  510. package/src/resources/extensions/gsd/tools/complete-slice.ts +43 -68
  511. package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
  512. package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
  513. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
  514. package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
  515. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  516. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  517. package/src/resources/extensions/gsd/undo.ts +9 -8
  518. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  519. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  520. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  521. package/src/resources/extensions/gsd/unit-registry.ts +412 -0
  522. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  523. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  524. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  525. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  526. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  527. package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
  528. package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
  529. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  530. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  531. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  532. package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
  533. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  534. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  535. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  536. package/src/resources/extensions/shared/gsd-browser-cli.ts +119 -5
  537. package/src/resources/shared/package.json +3 -0
  538. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  539. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  540. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  541. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  542. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  543. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  544. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  545. package/src/resources/skills/gsd-browser/SKILL.md +1 -1
  546. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  547. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  548. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  549. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  550. /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → jmTLg6xZmAuq_LIqKOxrH}/_buildManifest.js +0 -0
  551. /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → jmTLg6xZmAuq_LIqKOxrH}/_ssgManifest.js +0 -0
@@ -41,6 +41,7 @@ after(() => {
41
41
 
42
42
  const { resolveDispatch } = await import("../auto-dispatch.ts");
43
43
  const { buildParallelResearchSlicesPrompt } = await import("../auto-prompts.ts");
44
+ const { openDatabase, closeDatabase, insertMilestone, insertSlice } = await import("../gsd-db.ts");
44
45
 
45
46
  type DispatchState = Parameters<typeof resolveDispatch>[0]["state"];
46
47
 
@@ -51,6 +52,20 @@ function writeRoadmap(
51
52
  ): void {
52
53
  const milestoneDir = join(base, ".gsd", "milestones", mid);
53
54
  mkdirSync(milestoneDir, { recursive: true });
55
+ // The dispatch rule reads slices from the DB (ADR-017), not the ROADMAP
56
+ // projection — seed both so disk-based artifact checks still resolve.
57
+ insertMilestone({ id: mid, title: "Parallel Research Milestone" });
58
+ let sequence = 1;
59
+ for (const s of slices) {
60
+ insertSlice({
61
+ id: s.id,
62
+ milestoneId: mid,
63
+ title: s.title,
64
+ status: s.done ? "complete" : "pending",
65
+ depends: s.depends ?? [],
66
+ sequence: sequence++,
67
+ });
68
+ }
54
69
  const lines = [
55
70
  `# ${mid}: Parallel Research Milestone`,
56
71
  "",
@@ -100,9 +115,12 @@ describe("parallel-research-slices dispatch rule", () => {
100
115
 
101
116
  beforeEach(() => {
102
117
  base = mkdtempSync(join(tmpdir(), "parallel-research-"));
118
+ mkdirSync(join(base, ".gsd"), { recursive: true });
119
+ openDatabase(join(base, ".gsd", "gsd.db"));
103
120
  });
104
121
 
105
122
  afterEach(() => {
123
+ closeDatabase();
106
124
  rmSync(base, { recursive: true, force: true });
107
125
  });
108
126
 
@@ -0,0 +1,139 @@
1
+ // Structural invariant: parsers-legacy is banned from decision paths (ADR-017).
2
+ //
3
+ // The DB is the single source of truth; `.gsd/*.md` files are projections.
4
+ // Dispatch/gate/completion code must read state via gsd-db queries (e.g.
5
+ // getMilestoneSliceSummaries), never by parsing markdown projections.
6
+ //
7
+ // Two assertions:
8
+ // 1. Decision-path modules must NOT import parsers-legacy (hard ban).
9
+ // 2. Every other importer must be on the explicit allowlist below, each with
10
+ // a one-line justification. When this test fails, do not extend the
11
+ // allowlist for a decision path — add/extend a query in db/queries.ts and
12
+ // read the DB instead.
13
+
14
+ import test from "node:test";
15
+ import assert from "node:assert/strict";
16
+ import { readFileSync, readdirSync } from "node:fs";
17
+ import { join, relative } from "node:path";
18
+
19
+ const extensionsDir = join(process.cwd(), "src/resources/extensions");
20
+
21
+ // Modules that make dispatch/gate/completion decisions. Importing
22
+ // parsers-legacy here is always a violation, allowlist or not.
23
+ const BANNED_DECISION_PATHS = new Set([
24
+ "gsd/auto-direct-dispatch.ts",
25
+ "gsd/dispatch-guard.ts",
26
+ "gsd/auto-verification.ts",
27
+ "gsd/auto-dispatch.ts",
28
+ "gsd/auto-post-unit.ts",
29
+ "gsd/milestone-closeout.ts",
30
+ "gsd/auto/phases.ts",
31
+ "gsd/auto/orchestrator.ts",
32
+ "gsd/auto/loop.ts",
33
+ "gsd/tools/complete-slice.ts",
34
+ ]);
35
+
36
+ // Legitimate importers. Each entry carries its justification; anything not
37
+ // listed here (and not under a tests/ directory) fails the test.
38
+ const ALLOWED_IMPORTERS = new Set([
39
+ // migration/import: parses markdown to populate the DB
40
+ "gsd/md-importer.ts",
41
+ "gsd/workflow-migration.ts",
42
+ "gsd/migration-auto-check.ts",
43
+ // drift detection: compares markdown projection against DB by design
44
+ "gsd/state-reconciliation/drift/roadmap.ts",
45
+ // stale-render detection + render verification helpers over rendered output
46
+ "gsd/markdown-renderer.ts",
47
+ // pre-migration fallback: deriveState must work before the DB exists
48
+ "gsd/state.ts",
49
+ // explicit degraded-mode fallback when DB has no task rows (warns on use)
50
+ "gsd/reactive-graph.ts",
51
+ // recovery path: explicit pre-migration/DB-unavailable fallback branches
52
+ "gsd/auto-recovery.ts",
53
+ // diagnostics-only surfaces: report on projections, make no dispatch decisions
54
+ "gsd/doctor.ts",
55
+ "gsd/doctor-git-checks.ts",
56
+ // display/telemetry-only surfaces
57
+ "gsd/workspace-index.ts",
58
+ "gsd/visualizer-data.ts",
59
+ // prompt context text (display strings injected into unit prompts)
60
+ "gsd/auto-prompts.ts",
61
+ // cold-path maintenance command (branch cleanup messaging)
62
+ "gsd/commands-maintenance.ts",
63
+ // display-only GitHub issue/PR body sync
64
+ "github-sync/sync.ts",
65
+ ]);
66
+
67
+ const IMPORT_RE = /from\s+["'][^"']*parsers-legacy(?:\.js)?["']|import\(\s*["'][^"']*parsers-legacy(?:\.js)?["']\s*\)|require\(\s*["'][^"']*parsers-legacy(?:\.js)?["']\s*\)/;
68
+
69
+ function walkTsFiles(root: string): string[] {
70
+ const out: string[] = [];
71
+ const stack: string[] = [root];
72
+
73
+ while (stack.length > 0) {
74
+ const dir = stack.pop()!;
75
+ let entries;
76
+ try {
77
+ entries = readdirSync(dir, { withFileTypes: true });
78
+ } catch {
79
+ continue;
80
+ }
81
+ for (const ent of entries) {
82
+ const full = join(dir, ent.name);
83
+ if (ent.isDirectory()) {
84
+ if (ent.name === "tests" || ent.name === "node_modules") continue;
85
+ stack.push(full);
86
+ continue;
87
+ }
88
+ if (!ent.isFile()) continue;
89
+ if (!ent.name.endsWith(".ts")) continue;
90
+ if (ent.name.startsWith(".")) continue;
91
+ if (ent.name.endsWith(".test.ts")) continue;
92
+ out.push(full);
93
+ }
94
+ }
95
+ return out;
96
+ }
97
+
98
+ function findImporters(): string[] {
99
+ const importers: string[] = [];
100
+ for (const file of walkTsFiles(extensionsDir)) {
101
+ const rel = relative(extensionsDir, file).split("\\").join("/");
102
+ if (rel === "gsd/parsers-legacy.ts") continue; // the module itself
103
+ const content = readFileSync(file, "utf-8");
104
+ if (IMPORT_RE.test(content)) importers.push(rel);
105
+ }
106
+ return importers.sort();
107
+ }
108
+
109
+ test("decision-path modules do not import parsers-legacy (ADR-017)", () => {
110
+ const violations = findImporters().filter((rel) => BANNED_DECISION_PATHS.has(rel));
111
+ assert.deepEqual(
112
+ violations,
113
+ [],
114
+ `Decision-path modules must read the DB (db/queries.ts, e.g. getMilestoneSliceSummaries), ` +
115
+ `not parse .gsd/*.md projections. Violations:\n ${violations.join("\n ")}`,
116
+ );
117
+ });
118
+
119
+ test("every parsers-legacy importer is on the explicit allowlist", () => {
120
+ const unexpected = findImporters().filter((rel) => !ALLOWED_IMPORTERS.has(rel));
121
+ assert.deepEqual(
122
+ unexpected,
123
+ [],
124
+ `New parsers-legacy importer(s) detected:\n ${unexpected.join("\n ")}\n` +
125
+ `If this is migration/drift/display-only code, add it to ALLOWED_IMPORTERS ` +
126
+ `with a one-line justification. If it makes dispatch/gate/completion ` +
127
+ `decisions, read the DB instead (db/queries.ts).`,
128
+ );
129
+ });
130
+
131
+ test("allowlist has no stale entries", () => {
132
+ const importers = new Set(findImporters());
133
+ const stale = [...ALLOWED_IMPORTERS].filter((rel) => !importers.has(rel));
134
+ assert.deepEqual(
135
+ stale,
136
+ [],
137
+ `Allowlist entries no longer import parsers-legacy — remove them:\n ${stale.join("\n ")}`,
138
+ );
139
+ });
@@ -21,6 +21,7 @@ import { join } from "node:path";
21
21
  import {
22
22
  extractPackageReferences,
23
23
  checkFilePathConsistency,
24
+ checkPlanningArtifactReferences,
24
25
  checkTaskOrdering,
25
26
  checkInterfaceContracts,
26
27
  checkVerificationCommands,
@@ -973,7 +974,12 @@ describe("runPreExecutionChecks", () => {
973
974
  }
974
975
  });
975
976
 
976
- test("resolves .gsd metadata inputs from canonical project root in worktree mode (#5492)", async () => {
977
+ // Supersedes #5492: .gsd metadata inputs used to be accepted in worktree mode
978
+ // by resolving from the canonical project root. Task inputs are source files
979
+ // only (CONTEXT.md "Task Input") — planning artifacts are now blocked with a
980
+ // removal message regardless of where they resolve. The canonical-root
981
+ // resolution itself remains for merged-but-unsynced source files.
982
+ test("blocks .gsd metadata inputs even when resolvable from canonical project root in worktree mode", async () => {
977
983
  const projectRoot = join(tmpdir(), `pre-exec-project-root-${Date.now()}`);
978
984
  const worktreeRoot = join(tmpdir(), `pre-exec-worktree-root-${Date.now()}`);
979
985
  mkdirSync(join(projectRoot, ".gsd"), { recursive: true });
@@ -990,6 +996,35 @@ describe("runPreExecutionChecks", () => {
990
996
  }),
991
997
  ];
992
998
 
999
+ const result = await runPreExecutionChecks(tasks, worktreeRoot, {
1000
+ canonicalProjectRoot: projectRoot,
1001
+ });
1002
+ assert.equal(result.status, "fail");
1003
+ assert.equal(result.checks.length, 1);
1004
+ assert.ok(result.checks[0].message.includes("preloaded as context"));
1005
+ } finally {
1006
+ rmSync(projectRoot, { recursive: true, force: true });
1007
+ rmSync(worktreeRoot, { recursive: true, force: true });
1008
+ }
1009
+ });
1010
+
1011
+ test("resolves source-file inputs from canonical project root in worktree mode (#5492)", async () => {
1012
+ const projectRoot = join(tmpdir(), `pre-exec-project-root-src-${Date.now()}`);
1013
+ const worktreeRoot = join(tmpdir(), `pre-exec-worktree-root-src-${Date.now()}`);
1014
+ mkdirSync(join(projectRoot, "src"), { recursive: true });
1015
+ mkdirSync(worktreeRoot, { recursive: true });
1016
+ writeFileSync(join(projectRoot, "src", "merged.ts"), "// merged upstream");
1017
+
1018
+ try {
1019
+ const tasks = [
1020
+ createTask({
1021
+ id: "T01",
1022
+ files: [],
1023
+ inputs: ["src/merged.ts"],
1024
+ expected_output: [],
1025
+ }),
1026
+ ];
1027
+
993
1028
  const result = await runPreExecutionChecks(tasks, worktreeRoot, {
994
1029
  canonicalProjectRoot: projectRoot,
995
1030
  });
@@ -2263,3 +2298,160 @@ describe("checkFilePathConsistency quote-wrapped annotation (#3747)", () => {
2263
2298
  );
2264
2299
  });
2265
2300
  });
2301
+
2302
+ // ─── Planning Artifact Reference Tests ───────────────────────────────────────
2303
+
2304
+ describe("checkPlanningArtifactReferences", () => {
2305
+ function withTempDir(run: (tempDir: string) => void): void {
2306
+ const tempDir = join(tmpdir(), `pre-exec-artifact-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
2307
+ mkdirSync(tempDir, { recursive: true });
2308
+ try {
2309
+ run(tempDir);
2310
+ } finally {
2311
+ rmSync(tempDir, { recursive: true, force: true });
2312
+ }
2313
+ }
2314
+
2315
+ test("blocks .gsd/ paths in inputs even when the file exists", () => {
2316
+ withTempDir((tempDir) => {
2317
+ const artifactDir = join(tempDir, ".gsd", "milestones", "M001");
2318
+ mkdirSync(artifactDir, { recursive: true });
2319
+ writeFileSync(join(artifactDir, "M001-CONTEXT.md"), "# context");
2320
+
2321
+ const tasks = [
2322
+ createTask({ id: "T01", inputs: [".gsd/milestones/M001/M001-CONTEXT.md"] }),
2323
+ ];
2324
+
2325
+ const results = checkPlanningArtifactReferences(tasks, tempDir);
2326
+ assert.equal(results.length, 1);
2327
+ assert.equal(results[0].blocking, true);
2328
+ assert.ok(results[0].message.includes("preloaded as context"));
2329
+ });
2330
+ });
2331
+
2332
+ test("blocks bare artifact names that do not resolve to a real file, with the truthful message", () => {
2333
+ withTempDir((tempDir) => {
2334
+ const tasks = [createTask({ id: "T01", inputs: ["M001-CONTEXT.md"] })];
2335
+
2336
+ const results = checkPlanningArtifactReferences(tasks, tempDir);
2337
+ assert.equal(results.length, 1);
2338
+ assert.ok(results[0].message.includes("preloaded as context"));
2339
+ assert.ok(!results[0].message.includes("doesn't exist"));
2340
+
2341
+ // The consistency check must not double-report the same entry with the
2342
+ // misleading "doesn't exist" message.
2343
+ const consistency = checkFilePathConsistency(tasks, tempDir);
2344
+ assert.deepEqual(consistency, []);
2345
+ });
2346
+ });
2347
+
2348
+ test("allows a bare artifact-style name that exists as a real source file", () => {
2349
+ withTempDir((tempDir) => {
2350
+ writeFileSync(join(tempDir, "M001-CONTEXT.md"), "# tracked source file");
2351
+
2352
+ const tasks = [createTask({ id: "T01", inputs: ["M001-CONTEXT.md"] })];
2353
+ assert.deepEqual(checkPlanningArtifactReferences(tasks, tempDir), []);
2354
+ });
2355
+ });
2356
+
2357
+ test("leaves artifact-style names with directory components to the existence checks", () => {
2358
+ withTempDir((tempDir) => {
2359
+ const tasks = [createTask({ id: "T01", inputs: ["tests/fixtures/M001-CONTEXT.md"] })];
2360
+
2361
+ assert.deepEqual(checkPlanningArtifactReferences(tasks, tempDir), []);
2362
+ const consistency = checkFilePathConsistency(tasks, tempDir);
2363
+ assert.equal(consistency.length, 1);
2364
+ assert.ok(consistency[0].message.includes("doesn't exist"));
2365
+ });
2366
+ });
2367
+
2368
+ test("blocks .planning/ and .audits/ paths in files", () => {
2369
+ withTempDir((tempDir) => {
2370
+ const tasks = [
2371
+ createTask({ id: "T01", files: [".planning/codebase/STACK.md", ".audits/security.md"] }),
2372
+ ];
2373
+
2374
+ const results = checkPlanningArtifactReferences(tasks, tempDir);
2375
+ assert.equal(results.length, 2);
2376
+ assert.ok(results.every((r) => r.blocking && r.message.includes("never task files")));
2377
+ });
2378
+ });
2379
+
2380
+ test("blocks .gsd/ paths in expectedOutput with the workflow-tools message and no ordering duplicate", () => {
2381
+ withTempDir((tempDir) => {
2382
+ const tasks = [
2383
+ createTask({
2384
+ id: "T01",
2385
+ sequence: 0,
2386
+ expected_output: [".gsd/milestones/M001/M001-SUMMARY.md"],
2387
+ }),
2388
+ createTask({
2389
+ id: "T02",
2390
+ sequence: 1,
2391
+ inputs: [".gsd/milestones/M001/M001-SUMMARY.md"],
2392
+ }),
2393
+ ];
2394
+
2395
+ const results = checkPlanningArtifactReferences(tasks, tempDir);
2396
+ assert.equal(results.length, 2);
2397
+ const outputFinding = results.find((r) => r.message.includes("expectedOutput"));
2398
+ assert.ok(outputFinding);
2399
+ assert.ok(outputFinding.message.includes("written by workflow tools"));
2400
+
2401
+ assert.deepEqual(checkTaskOrdering(tasks, tempDir), []);
2402
+ });
2403
+ });
2404
+
2405
+ test("skips prose, sentinels, and runtime-only entries", () => {
2406
+ withTempDir((tempDir) => {
2407
+ const tasks = [
2408
+ createTask({
2409
+ id: "T01",
2410
+ inputs: ["none", "Current enum shape", "server logs (runtime)"],
2411
+ }),
2412
+ ];
2413
+
2414
+ assert.deepEqual(checkPlanningArtifactReferences(tasks, tempDir), []);
2415
+ });
2416
+ });
2417
+
2418
+ test("runPreExecutionChecks surfaces artifact findings as blocking failures", async () => {
2419
+ const tempDir = join(tmpdir(), `pre-exec-artifact-run-${Date.now()}`);
2420
+ mkdirSync(tempDir, { recursive: true });
2421
+ try {
2422
+ const tasks = [createTask({ id: "T01", inputs: ["M001-CONTEXT.md"] })];
2423
+ const result: PreExecutionResult = await runPreExecutionChecks(tasks, tempDir);
2424
+ assert.equal(result.status, "fail");
2425
+ assert.ok(
2426
+ result.checks.some((c) => !c.passed && c.blocking && c.message.includes("preloaded as context")),
2427
+ );
2428
+ } finally {
2429
+ rmSync(tempDir, { recursive: true, force: true });
2430
+ }
2431
+ });
2432
+
2433
+ test("allows a bare artifact-style name that exists only at canonicalProjectRoot (not at worktree basePath)", () => {
2434
+ withTempDir((canonicalRoot) => {
2435
+ withTempDir((worktreeRoot) => {
2436
+ writeFileSync(join(canonicalRoot, "M001-CONTEXT.md"), "# tracked source file");
2437
+ const tasks = [createTask({ id: "T01", inputs: ["M001-CONTEXT.md"] })];
2438
+ assert.deepEqual(
2439
+ checkPlanningArtifactReferences(tasks, worktreeRoot, { canonicalProjectRoot: canonicalRoot }),
2440
+ [],
2441
+ );
2442
+ });
2443
+ });
2444
+ });
2445
+
2446
+ test("blocks .GSD/ paths with mixed casing (case-insensitive metadata dir match)", () => {
2447
+ withTempDir((tempDir) => {
2448
+ const tasks = [
2449
+ createTask({ id: "T01", inputs: [".GSD/milestones/M001/M001-CONTEXT.md"] }),
2450
+ ];
2451
+ const results = checkPlanningArtifactReferences(tasks, tempDir);
2452
+ assert.equal(results.length, 1);
2453
+ assert.equal(results[0].blocking, true);
2454
+ assert.ok(results[0].message.includes("preloaded as context"));
2455
+ });
2456
+ });
2457
+ });
@@ -7,6 +7,9 @@
7
7
 
8
8
  import { describe, test } from 'node:test';
9
9
  import assert from 'node:assert/strict';
10
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
11
+ import { join } from 'node:path';
12
+ import { tmpdir } from 'node:os';
10
13
  import {
11
14
  openDatabase,
12
15
  closeDatabase,
@@ -22,6 +25,17 @@ import {
22
25
  formatDecisionsForPrompt,
23
26
  formatRequirementsForPrompt,
24
27
  } from '../context-store.ts';
28
+ import { inlineRequirementsFromDb } from '../auto-prompts.ts';
29
+ import { migrateFromMarkdown } from '../md-importer.ts';
30
+
31
+ function createDbProjectWithRequirements(content: string): { tmpDir: string; gsdDir: string } {
32
+ const tmpDir = mkdtempSync(join(tmpdir(), 'prompt-db-requirements-'));
33
+ const gsdDir = join(tmpDir, '.gsd');
34
+ mkdirSync(gsdDir, { recursive: true });
35
+ writeFileSync(join(gsdDir, 'REQUIREMENTS.md'), content);
36
+ openDatabase(join(gsdDir, 'gsd.db'));
37
+ return { tmpDir, gsdDir };
38
+ }
25
39
 
26
40
  // ═══════════════════════════════════════════════════════════════════════════
27
41
  // prompt-db: DB-aware decisions helper returns scoped content
@@ -182,6 +196,116 @@ console.log('\n=== prompt-db: fallback when DB unavailable ===');
182
196
  assert.deepStrictEqual(formattedReqs, '', 'formatRequirementsForPrompt returns empty for empty input');
183
197
  }
184
198
 
199
+ // ═══════════════════════════════════════════════════════════════════════════
200
+ // prompt-db: DB-aware requirements helper does not fall back on empty DB rows
201
+ // ═══════════════════════════════════════════════════════════════════════════
202
+
203
+ test('prompt-db: inlineRequirementsFromDb returns null instead of full file when DB query is empty', async () => {
204
+ const { tmpDir } = createDbProjectWithRequirements(
205
+ `# Requirements\n\nFULL FILE SHOULD NOT BE INLINED\n\n${'large requirement body\n'.repeat(500)}`,
206
+ );
207
+ try {
208
+ const inlined = await inlineRequirementsFromDb(tmpDir, 'M999', undefined, 'full');
209
+
210
+ assert.equal(inlined, null);
211
+ } finally {
212
+ closeDatabase();
213
+ rmSync(tmpDir, { recursive: true, force: true });
214
+ }
215
+ });
216
+
217
+ test('prompt-db: inlineRequirementsFromDb cascades from empty milestone query to active requirements', async () => {
218
+ const { tmpDir } = createDbProjectWithRequirements(
219
+ '# Requirements\n\nFULL FILE SHOULD NOT BE INLINED\n',
220
+ );
221
+ try {
222
+ insertRequirement({
223
+ id: 'R001',
224
+ class: 'functional',
225
+ status: 'active',
226
+ description: 'active requirement for another milestone',
227
+ why: 'needed',
228
+ source: 'M001',
229
+ primary_owner: 'M001/S01',
230
+ supporting_slices: '',
231
+ validation: 'test',
232
+ notes: '',
233
+ full_content: '',
234
+ superseded_by: null,
235
+ });
236
+ insertRequirement({
237
+ id: 'R002',
238
+ class: 'functional',
239
+ status: 'validated',
240
+ description: 'validated requirement should not be active fallback',
241
+ why: 'already done',
242
+ source: 'M001',
243
+ primary_owner: 'M001/S02',
244
+ supporting_slices: '',
245
+ validation: 'done',
246
+ notes: '',
247
+ full_content: '',
248
+ superseded_by: null,
249
+ });
250
+
251
+ const inlined = await inlineRequirementsFromDb(tmpDir, 'M999', undefined, 'full');
252
+
253
+ assert.ok(inlined);
254
+ assert.match(inlined, /### Requirements/);
255
+ assert.match(inlined, /# Requirements \(compact\)/);
256
+ assert.match(inlined, /R001/);
257
+ assert.match(inlined, /active requirement for another milestone/);
258
+ assert.doesNotMatch(inlined, /R002/);
259
+ assert.doesNotMatch(inlined, /FULL FILE SHOULD NOT BE INLINED/);
260
+ } finally {
261
+ closeDatabase();
262
+ rmSync(tmpDir, { recursive: true, force: true });
263
+ }
264
+ });
265
+
266
+ test('prompt-db: inlineRequirementsFromDb keeps active fallback compact for slice-scoped full calls', async () => {
267
+ const { tmpDir } = createDbProjectWithRequirements(
268
+ '# Requirements\n\nFULL FILE SHOULD NOT BE INLINED\n',
269
+ );
270
+ try {
271
+ insertRequirement({
272
+ id: 'R001',
273
+ class: 'functional',
274
+ status: 'active',
275
+ description: 'active requirement for another milestone',
276
+ why: 'needed',
277
+ source: 'M001',
278
+ primary_owner: 'M001/S01',
279
+ supporting_slices: '',
280
+ validation: 'test',
281
+ notes: '',
282
+ full_content: '',
283
+ superseded_by: null,
284
+ });
285
+
286
+ // Slice-scoped call at inlineLevel "full" with no matching rows for the
287
+ // milestone+slice or milestone-only queries. The cascade should land on
288
+ // status: "active" rows from another milestone, and those project-wide
289
+ // active rows must be formatted compactly even though sliceId is set —
290
+ // otherwise the full per-requirement markdown would be inlined for every
291
+ // active row across the project.
292
+ const inlined = await inlineRequirementsFromDb(tmpDir, 'M999', 'S99', 'full');
293
+
294
+ assert.ok(inlined);
295
+ assert.match(inlined, /### Requirements/);
296
+ assert.match(inlined, /# Requirements \(compact\)/);
297
+ assert.match(inlined, /R001/);
298
+ // Full per-requirement markdown is forbidden here — its hallmark fields
299
+ // (Class:/Status:/Why: as bolded list items) are emitted only by
300
+ // formatRequirementsForPrompt, never by formatRequirementsCompact.
301
+ assert.doesNotMatch(inlined, /\*\*Class:\*\*/);
302
+ assert.doesNotMatch(inlined, /FULL FILE SHOULD NOT BE INLINED/);
303
+ } finally {
304
+ closeDatabase();
305
+ rmSync(tmpDir, { recursive: true, force: true });
306
+ }
307
+ });
308
+
185
309
  // ═══════════════════════════════════════════════════════════════════════════
186
310
  // prompt-db: scoped filtering reduces content vs unscoped
187
311
  // ═══════════════════════════════════════════════════════════════════════════
@@ -316,12 +440,6 @@ console.log('\n=== prompt-db: DB helpers wrapper format matches expected pattern
316
440
  // prompt-db: re-import updates DB when source markdown changes
317
441
  // ═══════════════════════════════════════════════════════════════════════════
318
442
 
319
- import { mkdtempSync, writeFileSync, mkdirSync } from 'node:fs';
320
- import { join } from 'node:path';
321
- import { tmpdir } from 'node:os';
322
- import { migrateFromMarkdown } from '../md-importer.ts';
323
-
324
-
325
443
  describe('prompt-db', () => {
326
444
  test('prompt-db: re-import updates DB when source markdown changes', () => {
327
445
  // Create a temp dir simulating a project with .gsd/DECISIONS.md
@@ -3,10 +3,10 @@ import assert from "node:assert/strict";
3
3
 
4
4
  import { classifyError, isTransient } from "../error-classifier.ts";
5
5
  import {
6
- formatProviderErrorGuidance,
7
6
  resolveProviderErrorGuidance,
8
7
  unitTypeToPrefsPhaseKey,
9
8
  } from "../provider-error-guidance.ts";
9
+ import { formatGuidance } from "../guidance.ts";
10
10
 
11
11
  test("classifyError: Cloud Code Assist 400 invalid argument is model-error", () => {
12
12
  const result = classifyError(
@@ -75,8 +75,8 @@ test("resolveProviderErrorGuidance suggests gemini-3-flash for antigravity pro-h
75
75
  assert.ok(guidance.steps.some((step) => step.includes("fallbacks")));
76
76
  });
77
77
 
78
- test("formatProviderErrorGuidance numbers steps", () => {
79
- const text = formatProviderErrorGuidance({
78
+ test("formatGuidance numbers steps", () => {
79
+ const text = formatGuidance({
80
80
  summary: "Provider error on test/model.",
81
81
  steps: ["Change model", "Run /gsd next"],
82
82
  });