@opengsd/gsd-pi 1.9.0 → 1.10.0-dev.a5e42e99

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 (502) hide show
  1. package/README.md +10 -9
  2. package/dist/headless.js +2 -1
  3. package/dist/resources/.managed-resources-content-hash +1 -1
  4. package/dist/resources/GSD-WORKFLOW.md +2 -2
  5. package/dist/resources/extensions/gsd/artifact-verification.js +3 -4
  6. package/dist/resources/extensions/gsd/auto/loop.js +24 -4
  7. package/dist/resources/extensions/gsd/auto/run-unit.js +19 -1
  8. package/dist/resources/extensions/gsd/auto/unit-phase.js +37 -5
  9. package/dist/resources/extensions/gsd/auto-artifact-paths.js +14 -8
  10. package/dist/resources/extensions/gsd/auto-dispatch.js +2 -0
  11. package/dist/resources/extensions/gsd/auto-model-selection.js +1 -0
  12. package/dist/resources/extensions/gsd/auto-prompts.js +102 -21
  13. package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
  14. package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -5
  15. package/dist/resources/extensions/gsd/auto-start.js +30 -10
  16. package/dist/resources/extensions/gsd/auto-tool-tracking.js +40 -0
  17. package/dist/resources/extensions/gsd/auto-verification.js +25 -12
  18. package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +4 -0
  19. package/dist/resources/extensions/gsd/auto-worktree-sync.js +7 -3
  20. package/dist/resources/extensions/gsd/auto-worktree-teardown.js +1 -1
  21. package/dist/resources/extensions/gsd/auto.js +15 -5
  22. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +2 -0
  23. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +33 -7
  24. package/dist/resources/extensions/gsd/bootstrap/system-context.js +10 -3
  25. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +7 -26
  26. package/dist/resources/extensions/gsd/commands-verdict.js +10 -9
  27. package/dist/resources/extensions/gsd/compat/compat-marker.js +80 -5
  28. package/dist/resources/extensions/gsd/constants.js +12 -13
  29. package/dist/resources/extensions/gsd/context-masker.js +97 -21
  30. package/dist/resources/extensions/gsd/db/engine.js +5 -2
  31. package/dist/resources/extensions/gsd/docs/preferences-reference.md +33 -2
  32. package/dist/resources/extensions/gsd/doctor-engine-checks.js +40 -12
  33. package/dist/resources/extensions/gsd/error-classifier.js +12 -2
  34. package/dist/resources/extensions/gsd/exec-sandbox.js +1 -0
  35. package/dist/resources/extensions/gsd/flat-phase-migration.js +12 -0
  36. package/dist/resources/extensions/gsd/git-service.js +19 -7
  37. package/dist/resources/extensions/gsd/gsd-db.js +75 -31
  38. package/dist/resources/extensions/gsd/guided-flow.js +11 -5
  39. package/dist/resources/extensions/gsd/markdown-renderer.js +5 -21
  40. package/dist/resources/extensions/gsd/md-importer.js +5 -6
  41. package/dist/resources/extensions/gsd/model-cost-table.js +6 -1
  42. package/dist/resources/extensions/gsd/model-router.js +16 -0
  43. package/dist/resources/extensions/gsd/paths.js +66 -15
  44. package/dist/resources/extensions/gsd/planning-subagent-policy.js +37 -0
  45. package/dist/resources/extensions/gsd/planning-subagent-registry.js +33 -0
  46. package/dist/resources/extensions/gsd/preferences-models.js +50 -10
  47. package/dist/resources/extensions/gsd/preferences-types.js +6 -0
  48. package/dist/resources/extensions/gsd/preferences-validation.js +86 -4
  49. package/dist/resources/extensions/gsd/preferences.js +24 -0
  50. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -5
  51. package/dist/resources/extensions/gsd/provider-payload-policy.js +16 -5
  52. package/dist/resources/extensions/gsd/safety/destructive-guard.js +1 -1
  53. package/dist/resources/extensions/gsd/skill-activation.js +17 -3
  54. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +98 -2
  55. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +4 -1
  56. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +5 -2
  57. package/dist/resources/extensions/gsd/stop-notice.js +9 -0
  58. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +8 -0
  59. package/dist/resources/extensions/gsd/tools/complete-task.js +12 -5
  60. package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -1
  61. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +14 -5
  62. package/dist/resources/extensions/gsd/tools/reopen-slice.js +15 -5
  63. package/dist/resources/extensions/gsd/tools/reopen-task.js +16 -10
  64. package/dist/resources/extensions/gsd/unit-context-composer.js +28 -5
  65. package/dist/resources/extensions/gsd/verification-evidence.js +5 -3
  66. package/dist/resources/extensions/gsd/workflow-projections.js +2 -3
  67. package/dist/resources/extensions/gsd/workspace.js +2 -1
  68. package/dist/resources/extensions/gsd/worktree-state-projection.js +20 -18
  69. package/dist/resources/extensions/ollama/ollama-chat-provider.js +2 -2
  70. package/dist/resources/extensions/shared/interview-ui.js +43 -6
  71. package/dist/resources/extensions/subagent/index.js +1 -1
  72. package/dist/startup-model-validation.d.ts +1 -1
  73. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  74. package/dist/web/standalone/.next/BUILD_ID +1 -1
  75. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  76. package/dist/web/standalone/.next/build-manifest.json +3 -3
  77. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  78. package/dist/web/standalone/.next/required-server-files.json +3 -3
  79. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  80. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  81. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  82. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  83. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  90. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  92. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  93. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  94. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  96. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  106. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  118. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  140. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  150. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  156. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  172. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  176. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/index.html +1 -1
  186. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  187. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  188. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  189. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  190. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  191. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  192. package/dist/web/standalone/.next/server/app/page.js +2 -2
  193. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  195. package/dist/web/standalone/.next/server/chunks/1991.js +2 -2
  196. package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
  197. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  198. package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
  199. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/middleware.js +3 -3
  201. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  202. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  203. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  204. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-a6fb1847f67f167c.js +1 -0
  205. package/dist/web/standalone/.next/static/chunks/app/{layout-b35cbfff38aaf4cf.js → layout-4ae2d68984392bbf.js} +1 -1
  206. package/dist/web/standalone/.next/static/chunks/app/page-72a856634ad14c10.js +1 -0
  207. package/dist/web/standalone/.next/static/chunks/{main-app-590a74400e35f685.js → main-app-90d1d8d5e5d2dc6b.js} +1 -1
  208. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +1 -0
  209. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  210. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  211. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  212. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  213. package/dist/web/standalone/server.js +1 -1
  214. package/integrations/hermes/open_gsd_hermes/gsd_client.py +1 -1
  215. package/integrations/hermes/pyproject.toml +1 -1
  216. package/package.json +8 -6
  217. package/packages/cloud-mcp-gateway/package.json +2 -2
  218. package/packages/contracts/dist/rpc.d.ts +1 -1
  219. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  220. package/packages/contracts/dist/rpc.js +1 -1
  221. package/packages/contracts/dist/rpc.js.map +1 -1
  222. package/packages/contracts/dist/rpc.test.js +1 -1
  223. package/packages/contracts/dist/rpc.test.js.map +1 -1
  224. package/packages/contracts/package.json +1 -1
  225. package/packages/daemon/package.json +4 -4
  226. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
  227. package/packages/gsd-agent-core/dist/compaction/compaction.js +36 -4
  228. package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
  229. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  230. package/packages/gsd-agent-core/dist/sdk.js +1 -0
  231. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  232. package/packages/gsd-agent-core/package.json +5 -5
  233. package/packages/gsd-agent-modes/dist/cli/args.js +2 -2
  234. package/packages/gsd-agent-modes/dist/cli/args.js.map +1 -1
  235. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  236. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +1 -0
  237. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  238. package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  239. package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.js +1 -0
  240. package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  241. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
  242. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js +1 -0
  243. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  244. package/packages/gsd-agent-modes/package.json +7 -7
  245. package/packages/gsd-cloud/README.md +21 -5
  246. package/packages/gsd-cloud/dist/background-cli.test.d.ts +2 -0
  247. package/packages/gsd-cloud/dist/background-cli.test.d.ts.map +1 -0
  248. package/packages/gsd-cloud/dist/background-cli.test.js +325 -0
  249. package/packages/gsd-cloud/dist/background-cli.test.js.map +1 -0
  250. package/packages/gsd-cloud/dist/cli.d.ts.map +1 -1
  251. package/packages/gsd-cloud/dist/cli.js +146 -16
  252. package/packages/gsd-cloud/dist/cli.js.map +1 -1
  253. package/packages/gsd-cloud/dist/cloud-config.d.ts +1 -1
  254. package/packages/gsd-cloud/dist/cloud-config.d.ts.map +1 -1
  255. package/packages/gsd-cloud/dist/cloud-config.js +7 -1
  256. package/packages/gsd-cloud/dist/cloud-config.js.map +1 -1
  257. package/packages/gsd-cloud/dist/cloud-runtime.d.ts +7 -4
  258. package/packages/gsd-cloud/dist/cloud-runtime.d.ts.map +1 -1
  259. package/packages/gsd-cloud/dist/cloud-runtime.js +115 -31
  260. package/packages/gsd-cloud/dist/cloud-runtime.js.map +1 -1
  261. package/packages/gsd-cloud/dist/cloud-runtime.test.js +224 -59
  262. package/packages/gsd-cloud/dist/cloud-runtime.test.js.map +1 -1
  263. package/packages/gsd-cloud/dist/runtime-artifacts.d.ts +3 -0
  264. package/packages/gsd-cloud/dist/runtime-artifacts.d.ts.map +1 -0
  265. package/packages/gsd-cloud/dist/runtime-artifacts.js +36 -0
  266. package/packages/gsd-cloud/dist/runtime-artifacts.js.map +1 -0
  267. package/packages/gsd-cloud/dist/runtime-process.d.ts +32 -0
  268. package/packages/gsd-cloud/dist/runtime-process.d.ts.map +1 -0
  269. package/packages/gsd-cloud/dist/runtime-process.js +640 -0
  270. package/packages/gsd-cloud/dist/runtime-process.js.map +1 -0
  271. package/packages/gsd-cloud/dist/runtime-process.test.d.ts +2 -0
  272. package/packages/gsd-cloud/dist/runtime-process.test.d.ts.map +1 -0
  273. package/packages/gsd-cloud/dist/runtime-process.test.js +543 -0
  274. package/packages/gsd-cloud/dist/runtime-process.test.js.map +1 -0
  275. package/packages/gsd-cloud/dist/runtime-telemetry.d.ts +117 -0
  276. package/packages/gsd-cloud/dist/runtime-telemetry.d.ts.map +1 -0
  277. package/packages/gsd-cloud/dist/runtime-telemetry.js +291 -0
  278. package/packages/gsd-cloud/dist/runtime-telemetry.js.map +1 -0
  279. package/packages/gsd-cloud/dist/runtime-telemetry.test.d.ts +2 -0
  280. package/packages/gsd-cloud/dist/runtime-telemetry.test.d.ts.map +1 -0
  281. package/packages/gsd-cloud/dist/runtime-telemetry.test.js +434 -0
  282. package/packages/gsd-cloud/dist/runtime-telemetry.test.js.map +1 -0
  283. package/packages/gsd-cloud/package.json +2 -2
  284. package/packages/mcp-server/README.md +7 -2
  285. package/packages/mcp-server/dist/cli-runner.d.ts +3 -0
  286. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -1
  287. package/packages/mcp-server/dist/cli-runner.js +119 -33
  288. package/packages/mcp-server/dist/cli-runner.js.map +1 -1
  289. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  290. package/packages/mcp-server/dist/server.js +5 -5
  291. package/packages/mcp-server/dist/server.js.map +1 -1
  292. package/packages/mcp-server/dist/workflow-tools.d.ts +4 -3
  293. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  294. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  295. package/packages/mcp-server/package.json +4 -4
  296. package/packages/native/package.json +1 -1
  297. package/packages/pi-agent-core/dist/agent.d.ts +5 -1
  298. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  299. package/packages/pi-agent-core/dist/agent.js +2 -0
  300. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  301. package/packages/pi-agent-core/dist/types.d.ts +2 -2
  302. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  303. package/packages/pi-agent-core/dist/types.js.map +1 -1
  304. package/packages/pi-agent-core/package.json +1 -1
  305. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  306. package/packages/pi-ai/dist/models.generated.d.ts +187 -0
  307. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  308. package/packages/pi-ai/dist/models.generated.js +145 -0
  309. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  310. package/packages/pi-ai/dist/models.js +18 -6
  311. package/packages/pi-ai/dist/models.js.map +1 -1
  312. package/packages/pi-ai/dist/providers/amazon-bedrock.js +3 -2
  313. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  314. package/packages/pi-ai/dist/providers/anthropic.js +6 -1
  315. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  316. package/packages/pi-ai/dist/providers/azure-openai-responses.d.ts +1 -1
  317. package/packages/pi-ai/dist/providers/azure-openai-responses.d.ts.map +1 -1
  318. package/packages/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
  319. package/packages/pi-ai/dist/providers/google-vertex.js.map +1 -1
  320. package/packages/pi-ai/dist/providers/google.js.map +1 -1
  321. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts +1 -1
  322. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  323. package/packages/pi-ai/dist/providers/openai-codex-responses.js +1 -1
  324. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  325. package/packages/pi-ai/dist/providers/openai-completions.d.ts +1 -1
  326. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  327. package/packages/pi-ai/dist/providers/openai-completions.js +103 -0
  328. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  329. package/packages/pi-ai/dist/providers/openai-responses.d.ts +1 -1
  330. package/packages/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
  331. package/packages/pi-ai/dist/providers/openai-responses.js +1 -1
  332. package/packages/pi-ai/dist/providers/openai-responses.js.map +1 -1
  333. package/packages/pi-ai/dist/providers/simple-options.d.ts +1 -1
  334. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  335. package/packages/pi-ai/dist/providers/simple-options.js +1 -1
  336. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  337. package/packages/pi-ai/dist/types.d.ts +9 -1
  338. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  339. package/packages/pi-ai/dist/types.js.map +1 -1
  340. package/packages/pi-ai/package.json +1 -1
  341. package/packages/pi-coding-agent/dist/core/capability-patches.js +1 -1
  342. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  343. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  344. package/packages/pi-coding-agent/dist/core/model-registry.js +1 -0
  345. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  346. package/packages/pi-coding-agent/dist/core/model-resolver.js +2 -2
  347. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  348. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +14 -4
  349. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  350. package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
  351. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  352. package/packages/pi-coding-agent/dist/core/skills.d.ts +5 -0
  353. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  354. package/packages/pi-coding-agent/dist/core/skills.js +54 -0
  355. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  356. package/packages/pi-coding-agent/dist/theme/theme.d.ts +1 -1
  357. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  358. package/packages/pi-coding-agent/dist/theme/theme.js +1 -0
  359. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  360. package/packages/pi-coding-agent/package.json +7 -7
  361. package/packages/pi-tui/package.json +2 -2
  362. package/packages/rpc-client/package.json +2 -2
  363. package/pkg/dist/theme/theme.d.ts +1 -1
  364. package/pkg/dist/theme/theme.d.ts.map +1 -1
  365. package/pkg/dist/theme/theme.js +1 -0
  366. package/pkg/dist/theme/theme.js.map +1 -1
  367. package/pkg/package.json +1 -1
  368. package/src/resources/GSD-WORKFLOW.md +2 -2
  369. package/src/resources/extensions/gsd/artifact-verification.ts +3 -8
  370. package/src/resources/extensions/gsd/auto/loop.ts +48 -4
  371. package/src/resources/extensions/gsd/auto/run-unit.ts +20 -1
  372. package/src/resources/extensions/gsd/auto/unit-phase.ts +41 -5
  373. package/src/resources/extensions/gsd/auto-artifact-paths.ts +14 -7
  374. package/src/resources/extensions/gsd/auto-dispatch.ts +1 -0
  375. package/src/resources/extensions/gsd/auto-model-selection.ts +1 -0
  376. package/src/resources/extensions/gsd/auto-prompts.ts +118 -19
  377. package/src/resources/extensions/gsd/auto-recovery.ts +10 -8
  378. package/src/resources/extensions/gsd/auto-runtime-state.ts +12 -7
  379. package/src/resources/extensions/gsd/auto-start.ts +32 -9
  380. package/src/resources/extensions/gsd/auto-tool-tracking.ts +56 -0
  381. package/src/resources/extensions/gsd/auto-verification.ts +46 -12
  382. package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +4 -0
  383. package/src/resources/extensions/gsd/auto-worktree-sync.ts +10 -3
  384. package/src/resources/extensions/gsd/auto-worktree-teardown.ts +1 -1
  385. package/src/resources/extensions/gsd/auto.ts +20 -7
  386. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +1 -0
  387. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +41 -12
  388. package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -3
  389. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +10 -31
  390. package/src/resources/extensions/gsd/commands-verdict.ts +16 -9
  391. package/src/resources/extensions/gsd/compat/compat-marker.ts +99 -5
  392. package/src/resources/extensions/gsd/constants.ts +14 -13
  393. package/src/resources/extensions/gsd/context-masker.ts +98 -2
  394. package/src/resources/extensions/gsd/db/engine.ts +5 -2
  395. package/src/resources/extensions/gsd/docs/preferences-reference.md +33 -2
  396. package/src/resources/extensions/gsd/doctor-engine-checks.ts +45 -11
  397. package/src/resources/extensions/gsd/error-classifier.ts +13 -2
  398. package/src/resources/extensions/gsd/exec-sandbox.ts +1 -0
  399. package/src/resources/extensions/gsd/flat-phase-migration.ts +14 -0
  400. package/src/resources/extensions/gsd/git-service.ts +19 -6
  401. package/src/resources/extensions/gsd/gsd-db.ts +85 -33
  402. package/src/resources/extensions/gsd/guided-flow.ts +11 -4
  403. package/src/resources/extensions/gsd/markdown-renderer.ts +5 -23
  404. package/src/resources/extensions/gsd/md-importer.ts +5 -5
  405. package/src/resources/extensions/gsd/model-cost-table.ts +14 -1
  406. package/src/resources/extensions/gsd/model-router.ts +17 -0
  407. package/src/resources/extensions/gsd/paths.ts +73 -15
  408. package/src/resources/extensions/gsd/planning-subagent-policy.ts +58 -0
  409. package/src/resources/extensions/gsd/planning-subagent-registry.ts +45 -0
  410. package/src/resources/extensions/gsd/preferences-models.ts +54 -10
  411. package/src/resources/extensions/gsd/preferences-types.ts +26 -2
  412. package/src/resources/extensions/gsd/preferences-validation.ts +108 -3
  413. package/src/resources/extensions/gsd/preferences.ts +38 -0
  414. package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -5
  415. package/src/resources/extensions/gsd/provider-payload-policy.ts +18 -4
  416. package/src/resources/extensions/gsd/safety/destructive-guard.ts +1 -1
  417. package/src/resources/extensions/gsd/skill-activation.ts +17 -3
  418. package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +132 -2
  419. package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +4 -1
  420. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +4 -2
  421. package/src/resources/extensions/gsd/stop-notice.ts +11 -0
  422. package/src/resources/extensions/gsd/templates/PREFERENCES.md +8 -0
  423. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +7 -7
  424. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +264 -0
  425. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +39 -0
  426. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +21 -1
  427. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +74 -1
  428. package/src/resources/extensions/gsd/tests/before-provider-context-management.test.ts +55 -0
  429. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +10 -0
  430. package/src/resources/extensions/gsd/tests/compat-marker.test.ts +25 -0
  431. package/src/resources/extensions/gsd/tests/complete-task.test.ts +76 -1
  432. package/src/resources/extensions/gsd/tests/context-masker.test.ts +204 -8
  433. package/src/resources/extensions/gsd/tests/db-engine-cjs-compat.test.ts +12 -0
  434. package/src/resources/extensions/gsd/tests/db-tools-alias-suppression.test.ts +62 -0
  435. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +33 -0
  436. package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +14 -0
  437. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +147 -0
  438. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +33 -1
  439. package/src/resources/extensions/gsd/tests/external-markdown-edit.test.ts +38 -1
  440. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +8 -9
  441. package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +20 -1
  442. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +32 -0
  443. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +22 -0
  444. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +13 -0
  445. package/src/resources/extensions/gsd/tests/integration/paths.test.ts +22 -4
  446. package/src/resources/extensions/gsd/tests/integration-branch-meta-location.test.ts +62 -0
  447. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +5 -5
  448. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +23 -0
  449. package/src/resources/extensions/gsd/tests/model-isolation.test.ts +55 -0
  450. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  451. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +7 -5
  452. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +24 -0
  453. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +38 -1
  454. package/src/resources/extensions/gsd/tests/preferences.test.ts +151 -0
  455. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +7 -0
  456. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +87 -0
  457. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +121 -1
  458. package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +39 -0
  459. package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +105 -0
  460. package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
  461. package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +33 -7
  462. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -16
  463. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +52 -0
  464. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +21 -1
  465. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +13 -7
  466. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +14 -0
  467. package/src/resources/extensions/gsd/tests/thinking-level-resolution.test.ts +1 -1
  468. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +19 -0
  469. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -0
  470. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +39 -0
  471. package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +7 -0
  472. package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +12 -0
  473. package/src/resources/extensions/gsd/tests/workflow-authority-faults.test.ts +238 -0
  474. package/src/resources/extensions/gsd/tests/workflow-authority-fixture.test.ts +48 -0
  475. package/src/resources/extensions/gsd/tests/workflow-authority-fixture.ts +141 -0
  476. package/src/resources/extensions/gsd/tests/workflow-authority-projection-conflict.test.ts +177 -0
  477. package/src/resources/extensions/gsd/tests/workflow-fault-harness.test.ts +39 -0
  478. package/src/resources/extensions/gsd/tests/workflow-fault-harness.ts +72 -0
  479. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -4
  480. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +2 -2
  481. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +60 -0
  482. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +74 -0
  483. package/src/resources/extensions/gsd/tools/complete-task.ts +20 -5
  484. package/src/resources/extensions/gsd/tools/plan-slice.ts +5 -1
  485. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +24 -5
  486. package/src/resources/extensions/gsd/tools/reopen-slice.ts +25 -5
  487. package/src/resources/extensions/gsd/tools/reopen-task.ts +23 -9
  488. package/src/resources/extensions/gsd/unit-context-composer.ts +34 -8
  489. package/src/resources/extensions/gsd/verification-evidence.ts +5 -2
  490. package/src/resources/extensions/gsd/workflow-projections.ts +2 -3
  491. package/src/resources/extensions/gsd/workspace.ts +2 -1
  492. package/src/resources/extensions/gsd/worktree-state-projection.ts +21 -24
  493. package/src/resources/extensions/ollama/ollama-chat-provider.ts +2 -2
  494. package/src/resources/extensions/ollama/tests/ollama-chat-provider-think.test.ts +4 -0
  495. package/src/resources/extensions/shared/interview-ui.ts +47 -8
  496. package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +29 -0
  497. package/src/resources/extensions/subagent/index.ts +1 -1
  498. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-49f565245e1e4afe.js +0 -1
  499. package/dist/web/standalone/.next/static/chunks/app/page-bc4c723c6a19c6f0.js +0 -1
  500. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +0 -1
  501. /package/dist/web/standalone/.next/static/{BE5XoklToI6lZjRzpXih8 → xwUaOqui04jIIFVsIBLiL}/_buildManifest.js +0 -0
  502. /package/dist/web/standalone/.next/static/{BE5XoklToI6lZjRzpXih8 → xwUaOqui04jIIFVsIBLiL}/_ssgManifest.js +0 -0
@@ -17,6 +17,20 @@ test("#2309: 'terminated' errors should be classified as transient", () => {
17
17
  assert.equal("retryAfterMs" in result && result.retryAfterMs, 15_000, "'terminated' should use 15s backoff");
18
18
  });
19
19
 
20
+ test("#1364: provider abort stop reasons should be classified as transient", () => {
21
+ const result = classifyError("Unhandled stop reason: abort");
22
+ assert.equal(isTransient(result), true, "'abort' provider errors should be transient");
23
+ assert.equal(result.kind, "connection", "'abort' matches connection");
24
+ assert.equal("retryAfterMs" in result && result.retryAfterMs, 15_000, "'abort' should use 15s backoff");
25
+ });
26
+
27
+ test("#1364: provider unknown stop reasons should be classified as transient", () => {
28
+ const result = classifyError("Unhandled stop reason: unknown");
29
+ assert.equal(isTransient(result), true, "'unknown' provider stop reasons should be transient");
30
+ assert.equal(result.kind, "connection", "'unknown' stop reasons match connection");
31
+ assert.equal("retryAfterMs" in result && result.retryAfterMs, 15_000, "'unknown' should use 15s backoff");
32
+ });
33
+
20
34
  test("#2309: 'connection reset by peer' errors should be classified as transient (network)", () => {
21
35
  const result = classifyError("connection reset by peer");
22
36
  assert.equal(isTransient(result), true, "'connection reset by peer' should be transient");
@@ -150,7 +150,7 @@ test("validation warns on an unknown phase key in the block", () => {
150
150
 
151
151
  test("validation warns on AND strips an illegal inline models thinking level", () => {
152
152
  const result = validatePreferences({
153
- models: { planning: { model: "m", thinking: "max" } },
153
+ models: { planning: { model: "m", thinking: "ultra" } },
154
154
  } as never);
155
155
  assert.ok(result.warnings.some((w) => w.includes("models.planning.thinking") && w.includes("not a valid thinking level")));
156
156
  // The bad thinking field must be stripped so it can't reach the resolver,
@@ -47,6 +47,7 @@ describe("#2883: tool invocation error tracking on AutoSession", () => {
47
47
  import {
48
48
  isDeterministicPolicyError,
49
49
  isPendingUserApprovalGateError,
50
+ isScheduleWakeupContinuationError,
50
51
  isToolInvocationError,
51
52
  isToolUnavailableError,
52
53
  isQueuedUserMessageSkip,
@@ -118,6 +119,24 @@ describe("#2883: isToolInvocationError classification", () => {
118
119
  assert.equal(isToolInvocationError("Invalid arguments for tool gsd_slice_complete"), true);
119
120
  });
120
121
 
122
+ test("scopes conditional required-field validation to ScheduleWakeup", () => {
123
+ const error = "`prompt` is required when `stop` is not true";
124
+
125
+ assert.equal(isToolInvocationError(error), false);
126
+ assert.equal(
127
+ isScheduleWakeupContinuationError("ScheduleWakeup", error),
128
+ true,
129
+ );
130
+ assert.equal(isScheduleWakeupContinuationError("read", error), false);
131
+ assert.equal(
132
+ isScheduleWakeupContinuationError(
133
+ "ScheduleWakeup",
134
+ "`evidence` is required when `status` is blocking",
135
+ ),
136
+ false,
137
+ );
138
+ });
139
+
121
140
  test("detects 'No such tool available' error", () => {
122
141
  assert.equal(isToolInvocationError("No such tool available: mcp__gsd-workflow__memory_query"), true);
123
142
  });
@@ -25,8 +25,16 @@ function makeMockPi() {
25
25
 
26
26
  console.log('\n── Tool naming: registration count ──');
27
27
 
28
+ // Aliases are hidden from the model-facing surface by default (plan 035);
29
+ // opt in here so this file can keep exercising alias-registration behavior.
30
+ const previousAdvertiseAliases = process.env.GSD_ADVERTISE_TOOL_ALIASES;
31
+ process.env.GSD_ADVERTISE_TOOL_ALIASES = "1";
32
+
28
33
  const pi = makeMockPi();
29
34
  registerDbTools(pi);
35
+
36
+ if (previousAdvertiseAliases === undefined) delete process.env.GSD_ADVERTISE_TOOL_ALIASES;
37
+ else process.env.GSD_ADVERTISE_TOOL_ALIASES = previousAdvertiseAliases;
30
38
  const toolByName = new Map<string, any>(pi.tools.map((tool: any) => [tool.name, tool]));
31
39
  const registeredCanonicalNames = new Set<string>(
32
40
  WORKFLOW_TOOL_CONTRACTS
@@ -46,6 +46,7 @@ import {
46
46
  insertTask,
47
47
  saveReworkBrief,
48
48
  } from "../gsd-db.ts";
49
+ import { clearGSDPreferencesCache, getProjectGSDPreferencesPath } from "../preferences.ts";
49
50
 
50
51
  // ─── Pure composer tests ──────────────────────────────────────────────────
51
52
 
@@ -418,6 +419,44 @@ test("Tool Surface composer: planning-dispatch lists allowed subagents", () => {
418
419
  assert.match(out, /\*\*planner\*\*/);
419
420
  });
420
421
 
422
+ test("Tool Surface composer: planning_subagents updates plan-milestone dispatch guidance", (t) => {
423
+ const originalGsdHome = process.env.GSD_HOME;
424
+ const tempProject = mkdtempSync(join(tmpdir(), "gsd-tool-surface-planning-subagents-"));
425
+ const tempGsdHome = mkdtempSync(join(tmpdir(), "gsd-tool-surface-planning-subagents-home-"));
426
+
427
+ t.after(() => {
428
+ clearGSDPreferencesCache();
429
+ if (originalGsdHome === undefined) delete process.env.GSD_HOME;
430
+ else process.env.GSD_HOME = originalGsdHome;
431
+ rmSync(tempProject, { recursive: true, force: true });
432
+ rmSync(tempGsdHome, { recursive: true, force: true });
433
+ });
434
+
435
+ process.env.GSD_HOME = tempGsdHome;
436
+ mkdirSync(join(tempProject, ".gsd"), { recursive: true });
437
+ clearGSDPreferencesCache();
438
+ writeFileSync(
439
+ getProjectGSDPreferencesPath(tempProject),
440
+ [
441
+ "---",
442
+ "version: 1",
443
+ "planning_subagents:",
444
+ " plan-milestone:",
445
+ " allowed: [security]",
446
+ "---",
447
+ "",
448
+ ].join("\n"),
449
+ "utf-8",
450
+ );
451
+
452
+ const out = composeToolSurfaceInstructions("plan-milestone", {
453
+ renderMode: "standalone",
454
+ basePath: tempProject,
455
+ });
456
+ assert.match(out, /Dispatch subagents only to \*\*security\*\*/);
457
+ assert.doesNotMatch(out, /Do not dispatch subagents/);
458
+ });
459
+
421
460
  test("Tool Surface composer: execute-task warns against slice/milestone closeout tools", () => {
422
461
  const out = composeToolSurfaceInstructions("execute-task", { renderMode: "nested" });
423
462
  assert.match(out, /^Tool surface: /);
@@ -22,3 +22,10 @@ test("validate-milestone prompt routes verification class analysis into verifica
22
22
  assert.match(prompt, /If Reviewer C omitted a planned class, reconstruct the missing row/i);
23
23
  assert.match(prompt, /Do not call `gsd_validate_milestone` with a partial `verificationClasses` table/i);
24
24
  });
25
+
26
+ test("validate-milestone prompt forbids reading phase directories as files", () => {
27
+ assert.match(prompt, /find \.gsd -type f/i);
28
+ assert.match(prompt, /\.gsd\/phases\/<NN>-<slug>\/` is a directory, not an artifact/i);
29
+ assert.match(prompt, /never pass a phase, slice, `tasks\/`, or `slices\/` directory/i);
30
+ assert.doesNotMatch(prompt, /Read a full SUMMARY under `\.gsd\/milestones\/\{\{milestoneId\}\}\/slices\/`/i);
31
+ });
@@ -99,6 +99,18 @@ test("verification-evidence: writeVerificationJSON creates directory if it doesn
99
99
  }
100
100
  });
101
101
 
102
+ test("verification-evidence: writeVerificationJSON can write flat-phase slice-task filename", () => {
103
+ const tmp = makeTempDir("ve-flat-name");
104
+ try {
105
+ writeVerificationJSON(makeResult(), tmp, "T02", "M001/S03/T02", undefined, undefined, "S03");
106
+
107
+ assert.ok(existsSync(join(tmp, "S03-T02-VERIFY.json")), "flat-phase JSON file should exist");
108
+ assert.equal(existsSync(join(tmp, "T02-VERIFY.json")), false, "legacy JSON file should not be written");
109
+ } finally {
110
+ rmSync(tmp, { recursive: true, force: true });
111
+ }
112
+ });
113
+
102
114
  test("verification-evidence: writeVerificationJSON maps exitCode to verdict correctly", () => {
103
115
  const tmp = makeTempDir("ve-verdict");
104
116
  try {
@@ -0,0 +1,238 @@
1
+ import assert from "node:assert/strict";
2
+ import { spawnSync, type SpawnSyncReturns } from "node:child_process";
3
+ import { mkdirSync, writeFileSync } from "node:fs";
4
+ import { dirname, join } from "node:path";
5
+ import { pathToFileURL } from "node:url";
6
+ import test from "node:test";
7
+
8
+ import type { CompleteSliceParams } from "../types.js";
9
+ import {
10
+ closeDatabase,
11
+ getSlice,
12
+ getTask,
13
+ insertSlice,
14
+ insertTask,
15
+ updateTaskStatus,
16
+ } from "../gsd-db.js";
17
+ import { relSliceFile } from "../paths.js";
18
+ import { handleCompleteSlice } from "../tools/complete-slice.js";
19
+ import { createWorkflowAuthorityFixture } from "./workflow-authority-fixture.js";
20
+ import {
21
+ createWorkflowFaultHarness,
22
+ type WorkflowFaultHarness,
23
+ type WorkflowFaultPoint,
24
+ } from "./workflow-fault-harness.js";
25
+
26
+ interface FaultScenario {
27
+ point: WorkflowFaultPoint;
28
+ committed: boolean;
29
+ }
30
+
31
+ interface AuthoritySnapshot {
32
+ pid: number;
33
+ taskStatus: string | null;
34
+ sliceStatus: string | null;
35
+ activeSlice: string | null;
36
+ }
37
+
38
+ const SCENARIOS: FaultScenario[] = [
39
+ { point: "before-transaction-commit", committed: false },
40
+ { point: "after-db-commit-before-render", committed: true },
41
+ { point: "during-projection-write", committed: true },
42
+ { point: "before-independent-reopen", committed: true },
43
+ { point: "after-independent-reopen", committed: true },
44
+ ];
45
+
46
+ const COMPLETE_SLICE_PARAMS: CompleteSliceParams = {
47
+ milestoneId: "M001",
48
+ sliceId: "S02",
49
+ sliceTitle: "Ready dependent slice",
50
+ oneLiner: "Complete the dependent slice",
51
+ narrative: "The database records the completed slice before projections are refreshed.",
52
+ verification: "The focused authority matrix passed.",
53
+ uatContent: "## UAT Type\n\n- UAT mode: runtime-executable\n\n## Result\n\nPassed.",
54
+ };
55
+
56
+ function seedCompletionBoundary(): void {
57
+ updateTaskStatus("M001", "S02", "T01", "complete", "2026-07-11T00:00:00.000Z");
58
+ insertSlice({
59
+ id: "S03",
60
+ milestoneId: "M001",
61
+ title: "Blocked dependent slice",
62
+ status: "pending",
63
+ depends: ["S02"],
64
+ sequence: 3,
65
+ });
66
+ insertTask({
67
+ id: "T01",
68
+ milestoneId: "M001",
69
+ sliceId: "S03",
70
+ title: "Blocked task",
71
+ status: "pending",
72
+ sequence: 1,
73
+ });
74
+ }
75
+
76
+ function writeProjection(root: string, relativePath: string, content: string): void {
77
+ const path = join(root, ".gsd", relativePath);
78
+ mkdirSync(dirname(path), { recursive: true });
79
+ writeFileSync(path, content, "utf8");
80
+ }
81
+
82
+ function writeContradictoryProjection(root: string, committed: boolean): void {
83
+ const s02Checked = committed ? " " : "x";
84
+ const s03Checked = committed ? "x" : " ";
85
+ writeProjection(
86
+ root,
87
+ "milestones/M001/M001-ROADMAP.md",
88
+ [
89
+ "# M001: Contradictory projection",
90
+ "",
91
+ "## Slices",
92
+ "- [x] **S01: Completed prerequisite** `risk:low` `depends:[]`",
93
+ `- [${s02Checked}] **S02: Ready dependent slice** \`risk:medium\` \`depends:[S01]\``,
94
+ `- [${s03Checked}] **S03: Blocked dependent slice** \`risk:low\` \`depends:[S02]\``,
95
+ ].join("\n"),
96
+ );
97
+ writeProjection(
98
+ root,
99
+ "STATE.md",
100
+ [
101
+ "# GSD State",
102
+ "",
103
+ `**Active Slice:** ${committed ? "S02" : "S03"}`,
104
+ "**Phase:** executing",
105
+ ].join("\n"),
106
+ );
107
+ }
108
+
109
+ function armProductionFault(
110
+ point: WorkflowFaultPoint,
111
+ harness: WorkflowFaultHarness,
112
+ root: string,
113
+ ): void {
114
+ if (point === "before-transaction-commit") {
115
+ harness.armDatabaseAbort("status", "NEW.status = 'complete' AND OLD.status <> 'complete'");
116
+ } else if (point === "after-db-commit-before-render") {
117
+ harness.armDatabaseAbort("full_summary_md", "NEW.full_summary_md IS NOT OLD.full_summary_md");
118
+ } else if (point === "during-projection-write") {
119
+ const summaryPath = join(root, relSliceFile(root, "M001", "S02", "SUMMARY"));
120
+ harness.obstructProjection(summaryPath);
121
+ }
122
+ }
123
+
124
+ function runAuthorityProcess(
125
+ root: string,
126
+ dbPath: string,
127
+ faultPoint?: WorkflowFaultPoint,
128
+ ): SpawnSyncReturns<string> {
129
+ const resolver = join(process.cwd(), "src/resources/extensions/gsd/tests/resolve-ts.mjs");
130
+ const databaseModule = pathToFileURL(join(process.cwd(), "src/resources/extensions/gsd/gsd-db.ts")).href;
131
+ const stateModule = pathToFileURL(join(process.cwd(), "src/resources/extensions/gsd/state.ts")).href;
132
+ const faultHarnessModule = pathToFileURL(join(
133
+ process.cwd(),
134
+ "src/resources/extensions/gsd/tests/workflow-fault-harness.ts",
135
+ )).href;
136
+ const script = `
137
+ const [
138
+ { openDatabase, closeDatabase, getSlice, getTask },
139
+ { deriveStateFromDb },
140
+ { createWorkflowFaultHarness },
141
+ ] = await Promise.all([
142
+ import(${JSON.stringify(databaseModule)}),
143
+ import(${JSON.stringify(stateModule)}),
144
+ import(${JSON.stringify(faultHarnessModule)}),
145
+ ]);
146
+ const [root, dbPath, faultPoint] = process.argv.slice(-3);
147
+ if (!openDatabase(dbPath)) throw new Error("fresh process could not open workflow database");
148
+ if (faultPoint) {
149
+ process.stderr.write("DATABASE_OPENED_BEFORE_FAULT=" + process.pid + "\\n");
150
+ createWorkflowFaultHarness(faultPoint).hit(faultPoint, "fresh-process-reopen");
151
+ }
152
+ const state = await deriveStateFromDb(root);
153
+ const snapshot = {
154
+ pid: process.pid,
155
+ taskStatus: getTask("M001", "S02", "T01")?.status ?? null,
156
+ sliceStatus: getSlice("M001", "S02")?.status ?? null,
157
+ activeSlice: state.activeSlice?.id ?? null,
158
+ };
159
+ closeDatabase();
160
+ process.stdout.write("AUTHORITY_SNAPSHOT=" + JSON.stringify(snapshot) + "\\n");
161
+ `;
162
+ return spawnSync(
163
+ process.execPath,
164
+ [
165
+ "--import",
166
+ resolver,
167
+ "--experimental-strip-types",
168
+ "--input-type=module",
169
+ "--eval",
170
+ script,
171
+ root,
172
+ dbPath,
173
+ faultPoint ?? "",
174
+ ],
175
+ { cwd: process.cwd(), encoding: "utf8" },
176
+ );
177
+ }
178
+
179
+ function readAuthorityInFreshProcess(root: string, dbPath: string): AuthoritySnapshot {
180
+ const child = runAuthorityProcess(root, dbPath);
181
+
182
+ assert.equal(child.status, 0, child.stderr || child.stdout);
183
+ const line = child.stdout.split("\n").find((entry) => entry.startsWith("AUTHORITY_SNAPSHOT="));
184
+ assert.ok(line, `fresh process did not return an authority snapshot: ${child.stdout}`);
185
+ return JSON.parse(line.slice("AUTHORITY_SNAPSHOT=".length)) as AuthoritySnapshot;
186
+ }
187
+
188
+ for (const scenario of SCENARIOS) {
189
+ test(`database authority remains coherent at ${scenario.point}`, async (t) => {
190
+ const fixture = await createWorkflowAuthorityFixture();
191
+ t.after(() => fixture.cleanup());
192
+ seedCompletionBoundary();
193
+ const harness = createWorkflowFaultHarness(scenario.point);
194
+ armProductionFault(scenario.point, harness, fixture.root);
195
+
196
+ let completionError: unknown;
197
+ let completionStale = false;
198
+ try {
199
+ const result = await handleCompleteSlice(COMPLETE_SLICE_PARAMS, fixture.root);
200
+ assert.ok(!("error" in result), "production completion must reach its mutation boundary");
201
+ completionStale = result.stale === true;
202
+ harness.hit("before-independent-reopen", "complete-dependent-slice");
203
+ } catch (error) {
204
+ completionError = error;
205
+ }
206
+
207
+ if (scenario.point === "during-projection-write") {
208
+ assert.equal(completionStale, true, "the production renderer must surface a stale projection");
209
+ } else if (scenario.point === "after-independent-reopen") {
210
+ assert.equal(completionError, undefined, "completion must succeed before the reopen fault");
211
+ assert.equal(completionStale, false, "completion must not be stale before the reopen fault");
212
+ } else {
213
+ assert.match(String(completionError), new RegExp(scenario.point));
214
+ }
215
+
216
+ writeContradictoryProjection(fixture.root, scenario.committed);
217
+ closeDatabase();
218
+ if (scenario.point === "after-independent-reopen") {
219
+ const faultedChild = runAuthorityProcess(fixture.root, fixture.dbPath, scenario.point);
220
+ assert.notEqual(faultedChild.status, 0, "fresh process must fault after opening the database");
221
+ assert.match(faultedChild.stderr, /DATABASE_OPENED_BEFORE_FAULT=/);
222
+ assert.match(faultedChild.stderr, /after-independent-reopen/);
223
+ }
224
+ const snapshot = readAuthorityInFreshProcess(fixture.root, fixture.dbPath);
225
+ fixture.reopen();
226
+
227
+ const expectedStatus = scenario.committed ? "complete" : "pending";
228
+ const { pid, ...authority } = snapshot;
229
+ assert.notEqual(pid, process.pid, "authority must be verified by another process");
230
+ assert.deepEqual(authority, {
231
+ taskStatus: "complete",
232
+ sliceStatus: expectedStatus,
233
+ activeSlice: scenario.committed ? "S03" : "S02",
234
+ });
235
+ assert.equal(getTask("M001", "S02", "T01")?.status, "complete");
236
+ assert.equal(getSlice("M001", "S02")?.status, expectedStatus);
237
+ });
238
+ }
@@ -0,0 +1,48 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+
4
+ import { getMilestoneSlices, getSliceTasks } from "../gsd-db.ts";
5
+ import { queryDecisionsFromMemories, queryRequirements } from "../context-store.ts";
6
+ import { deriveStateFromDb } from "../state.ts";
7
+ import { createWorkflowAuthorityFixture } from "./workflow-authority-fixture.ts";
8
+
9
+ test("workflow authority fixture seeds a reopenable DB-backed workflow", async (t) => {
10
+ const fixture = await createWorkflowAuthorityFixture();
11
+ t.after(() => fixture.cleanup());
12
+ fixture.reopen();
13
+
14
+ const state = await deriveStateFromDb(fixture.root);
15
+ const slices = getMilestoneSlices(fixture.ids.milestone);
16
+ const completedTasks = getSliceTasks(fixture.ids.milestone, fixture.ids.completedSlice);
17
+ const readyTasks = getSliceTasks(fixture.ids.milestone, fixture.ids.readySlice);
18
+ const requirements = queryRequirements({
19
+ milestoneId: fixture.ids.milestone,
20
+ sliceId: fixture.ids.readySlice,
21
+ });
22
+ const decisions = queryDecisionsFromMemories({ milestoneId: fixture.ids.milestone });
23
+
24
+ assert.equal(state.phase, "executing");
25
+ assert.equal(state.activeMilestone?.id, fixture.ids.milestone);
26
+ assert.equal(state.activeSlice?.id, fixture.ids.readySlice);
27
+ assert.equal(state.activeTask?.id, fixture.ids.readyTask);
28
+ assert.deepEqual(
29
+ slices.map((slice) => ({ id: slice.id, status: slice.status, depends: slice.depends })),
30
+ [
31
+ { id: fixture.ids.completedSlice, status: "complete", depends: [] },
32
+ { id: fixture.ids.readySlice, status: "pending", depends: [fixture.ids.completedSlice] },
33
+ ],
34
+ );
35
+ assert.deepEqual(
36
+ completedTasks.map((task) => ({ id: task.id, status: task.status })),
37
+ [{ id: fixture.ids.completedTask, status: "complete" }],
38
+ );
39
+ assert.deepEqual(
40
+ readyTasks.map((task) => ({ id: task.id, status: task.status })),
41
+ [{ id: fixture.ids.readyTask, status: "pending" }],
42
+ );
43
+ assert.ok(state.requirements);
44
+ assert.equal(state.requirements.active, 1);
45
+ assert.equal(state.requirements.total, 1);
46
+ assert.deepEqual(requirements.map((requirement) => requirement.id), [fixture.ids.requirement]);
47
+ assert.deepEqual(decisions.map((decision) => decision.id), [fixture.ids.decision]);
48
+ });
@@ -0,0 +1,141 @@
1
+ import { mkdirSync, mkdtempSync, realpathSync, rmSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+
5
+ import {
6
+ closeDatabase,
7
+ insertMilestone,
8
+ insertSlice,
9
+ insertTask,
10
+ openDatabase,
11
+ transaction,
12
+ } from "../gsd-db.ts";
13
+ import { saveDecisionToDb, saveRequirementToDb } from "../db-writer.ts";
14
+ import { invalidateStateCache } from "../state.ts";
15
+
16
+ export interface WorkflowAuthorityFixture {
17
+ root: string;
18
+ dbPath: string;
19
+ ids: {
20
+ milestone: string;
21
+ completedSlice: string;
22
+ readySlice: string;
23
+ completedTask: string;
24
+ readyTask: string;
25
+ requirement: string;
26
+ decision: string;
27
+ };
28
+ reopen(): void;
29
+ cleanup(): void;
30
+ }
31
+
32
+ function openFixtureDatabase(dbPath: string): void {
33
+ if (!openDatabase(dbPath)) {
34
+ throw new Error(`Could not open workflow authority fixture database: ${dbPath}`);
35
+ }
36
+ }
37
+
38
+ export async function createWorkflowAuthorityFixture(): Promise<WorkflowAuthorityFixture> {
39
+ const root = realpathSync(mkdtempSync(join(tmpdir(), "gsd-workflow-authority-")));
40
+ const dbPath = join(root, ".gsd", "gsd.db");
41
+ let cleanedUp = false;
42
+
43
+ mkdirSync(join(root, ".gsd"), { recursive: true });
44
+ openFixtureDatabase(dbPath);
45
+
46
+ try {
47
+ transaction(() => {
48
+ insertMilestone({ id: "M001", title: "Authority Fixture", status: "active" });
49
+ insertSlice({
50
+ id: "S01",
51
+ milestoneId: "M001",
52
+ title: "Completed prerequisite",
53
+ status: "complete",
54
+ risk: "low",
55
+ depends: [],
56
+ sequence: 1,
57
+ });
58
+ insertSlice({
59
+ id: "S02",
60
+ milestoneId: "M001",
61
+ title: "Ready dependent slice",
62
+ status: "pending",
63
+ risk: "medium",
64
+ depends: ["S01"],
65
+ sequence: 2,
66
+ });
67
+ insertTask({
68
+ id: "T01",
69
+ milestoneId: "M001",
70
+ sliceId: "S01",
71
+ title: "Completed task",
72
+ status: "complete",
73
+ sequence: 1,
74
+ });
75
+ insertTask({
76
+ id: "T01",
77
+ milestoneId: "M001",
78
+ sliceId: "S02",
79
+ title: "Ready task",
80
+ status: "pending",
81
+ sequence: 1,
82
+ });
83
+ });
84
+
85
+ const requirement = await saveRequirementToDb(
86
+ {
87
+ class: "core-capability",
88
+ status: "active",
89
+ description: "SQLite is authoritative",
90
+ why: "Readable projections must not control workflow state.",
91
+ source: "workflow-authority-fixture",
92
+ primary_owner: "M001/S02",
93
+ validation: "DB-derived state remains canonical",
94
+ },
95
+ root,
96
+ );
97
+ const decision = await saveDecisionToDb(
98
+ {
99
+ when_context: "M001/S02",
100
+ scope: "architecture",
101
+ decision: "Choose the workflow authority",
102
+ choice: "SQLite is authoritative",
103
+ rationale: "Projections may lag without losing saved intent.",
104
+ revisable: "No",
105
+ made_by: "human",
106
+ source: "discussion",
107
+ },
108
+ root,
109
+ );
110
+
111
+ return {
112
+ root,
113
+ dbPath,
114
+ ids: {
115
+ milestone: "M001",
116
+ completedSlice: "S01",
117
+ readySlice: "S02",
118
+ completedTask: "T01",
119
+ readyTask: "T01",
120
+ requirement: requirement.id,
121
+ decision: decision.id,
122
+ },
123
+ reopen() {
124
+ closeDatabase();
125
+ openFixtureDatabase(dbPath);
126
+ invalidateStateCache();
127
+ },
128
+ cleanup() {
129
+ if (cleanedUp) return;
130
+ cleanedUp = true;
131
+ closeDatabase();
132
+ invalidateStateCache();
133
+ rmSync(root, { recursive: true, force: true });
134
+ },
135
+ };
136
+ } catch (error) {
137
+ closeDatabase();
138
+ rmSync(root, { recursive: true, force: true });
139
+ throw error;
140
+ }
141
+ }