gsd-pi 2.82.0-dev.ed17d078d → 3.0.0-dev.8b8d129d7

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 (562) hide show
  1. package/README.md +93 -18
  2. package/dist/cli.js +20 -9
  3. package/dist/headless.js +9 -2
  4. package/dist/resources/.managed-resources-content-hash +1 -1
  5. package/dist/resources/GSD-WORKFLOW.md +10 -1
  6. package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
  7. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -6
  8. package/dist/resources/extensions/cmux/index.js +5 -0
  9. package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
  10. package/dist/resources/extensions/gsd/auto/loop.js +110 -37
  11. package/dist/resources/extensions/gsd/auto/orchestrator.js +12 -1
  12. package/dist/resources/extensions/gsd/auto/phases.js +97 -38
  13. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  14. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
  15. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  16. package/dist/resources/extensions/gsd/auto-dashboard.js +66 -1
  17. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  18. package/dist/resources/extensions/gsd/auto-dispatch.js +20 -19
  19. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  20. package/dist/resources/extensions/gsd/auto-post-unit.js +278 -137
  21. package/dist/resources/extensions/gsd/auto-prompts.js +36 -10
  22. package/dist/resources/extensions/gsd/auto-recovery.js +79 -14
  23. package/dist/resources/extensions/gsd/auto-start.js +87 -14
  24. package/dist/resources/extensions/gsd/auto-timers.js +11 -3
  25. package/dist/resources/extensions/gsd/auto-verification.js +102 -34
  26. package/dist/resources/extensions/gsd/auto-worktree.js +178 -11
  27. package/dist/resources/extensions/gsd/auto.js +98 -54
  28. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +31 -7
  29. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -9
  30. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +5 -4
  31. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  32. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
  33. package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
  34. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  35. package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -0
  36. package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
  37. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  38. package/dist/resources/extensions/gsd/commands-handlers.js +2 -0
  39. package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
  40. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +7 -2
  41. package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
  42. package/dist/resources/extensions/gsd/crash-recovery.js +43 -5
  43. package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
  44. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  45. package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
  46. package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
  47. package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
  48. package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
  49. package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -0
  50. package/dist/resources/extensions/gsd/doctor-git-checks.js +46 -1
  51. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  52. package/dist/resources/extensions/gsd/doctor.js +2 -28
  53. package/dist/resources/extensions/gsd/export-html.js +27 -425
  54. package/dist/resources/extensions/gsd/forensics.js +8 -3
  55. package/dist/resources/extensions/gsd/git-service.js +138 -10
  56. package/dist/resources/extensions/gsd/gsd-db.js +76 -33
  57. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  58. package/dist/resources/extensions/gsd/guided-flow.js +110 -117
  59. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  60. package/dist/resources/extensions/gsd/init-wizard.js +17 -2
  61. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -8
  62. package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
  63. package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
  64. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  65. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  66. package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
  67. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
  68. package/dist/resources/extensions/gsd/paths.js +4 -0
  69. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  70. package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
  71. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
  72. package/dist/resources/extensions/gsd/pre-execution-checks.js +38 -11
  73. package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
  74. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  75. package/dist/resources/extensions/gsd/preferences-validation.js +138 -0
  76. package/dist/resources/extensions/gsd/preferences.js +2 -0
  77. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  78. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  79. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  80. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  81. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  82. package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
  83. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  84. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  85. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  86. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  87. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  88. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  89. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  90. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  91. package/dist/resources/extensions/gsd/repository-registry.js +44 -0
  92. package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
  93. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
  94. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +59 -2
  95. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  96. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  97. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  98. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  99. package/dist/resources/extensions/gsd/state.js +14 -4
  100. package/dist/resources/extensions/gsd/status-guards.js +14 -2
  101. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  102. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  103. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -8
  104. package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
  105. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  106. package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
  107. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
  108. package/dist/resources/extensions/gsd/unit-context-manifest.js +36 -17
  109. package/dist/resources/extensions/gsd/validation.js +23 -1
  110. package/dist/resources/extensions/gsd/verification-gate.js +142 -7
  111. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  112. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  113. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  114. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  115. package/dist/resources/extensions/gsd/worktree-lifecycle.js +54 -10
  116. package/dist/resources/extensions/gsd/worktree-manager.js +1 -1
  117. package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
  118. package/dist/resources/extensions/shared/html-shell.js +388 -0
  119. package/dist/resources/extensions/shared/interview-ui.js +6 -4
  120. package/dist/resources/extensions/subagent/index.js +448 -78
  121. package/dist/resources/extensions/subagent/launch.js +77 -0
  122. package/dist/resources/extensions/subagent/run-store.js +148 -0
  123. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  124. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  125. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  126. package/dist/resources/extensions/visual-brief/index.js +5 -0
  127. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  128. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  129. package/dist/resources/skills/forensics/SKILL.md +1 -1
  130. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  131. package/dist/web/standalone/.next/BUILD_ID +1 -1
  132. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  133. package/dist/web/standalone/.next/build-manifest.json +3 -3
  134. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  135. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  136. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  138. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  146. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  147. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  149. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  150. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  151. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  153. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  154. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  155. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  156. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/index.html +1 -1
  159. package/dist/web/standalone/.next/server/app/index.rsc +4 -7
  160. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  161. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -7
  162. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  163. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  164. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  165. package/dist/web/standalone/.next/server/app/page.js +2 -2
  166. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  167. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  169. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  170. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  174. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  175. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  176. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  177. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  178. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  179. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  180. package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
  181. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  182. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  183. package/package.json +4 -4
  184. package/packages/contracts/dist/rpc.test.js +7 -0
  185. package/packages/contracts/dist/rpc.test.js.map +1 -1
  186. package/packages/contracts/dist/workflow.d.ts +21 -0
  187. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  188. package/packages/contracts/dist/workflow.js +24 -0
  189. package/packages/contracts/dist/workflow.js.map +1 -1
  190. package/packages/contracts/src/rpc.test.ts +8 -0
  191. package/packages/contracts/src/workflow.ts +24 -0
  192. package/packages/daemon/package.json +2 -2
  193. package/packages/mcp-server/README.md +13 -4
  194. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  195. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  196. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  197. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  198. package/packages/mcp-server/package.json +2 -2
  199. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  200. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  201. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  202. package/packages/native/package.json +1 -1
  203. package/packages/native/tsconfig.json +2 -1
  204. package/packages/native/tsconfig.tsbuildinfo +1 -1
  205. package/packages/pi-agent-core/package.json +1 -1
  206. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  207. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  208. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  209. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  210. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  211. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  212. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  213. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  214. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  215. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  216. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  217. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  218. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  219. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  220. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  221. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  222. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  223. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  224. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  225. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  226. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  227. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  228. package/packages/pi-ai/package.json +1 -1
  229. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  230. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  231. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  232. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  233. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  234. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  235. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  236. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  237. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  238. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  239. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  240. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  241. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  242. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  243. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  244. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
  245. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  246. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
  247. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  248. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
  249. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  250. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  251. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  252. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  253. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  254. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  255. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  256. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +71 -97
  257. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  258. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
  259. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  260. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
  261. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  262. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  263. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  264. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  265. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  266. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  267. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  268. package/packages/pi-coding-agent/package.json +1 -1
  269. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  270. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  271. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  272. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
  273. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
  274. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  275. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  276. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -102
  277. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
  278. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
  279. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  280. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  281. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  282. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  283. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  284. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  285. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  286. package/packages/pi-tui/dist/__tests__/tui.test.js +45 -2
  287. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  288. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  289. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  290. package/packages/pi-tui/dist/terminal.js +12 -0
  291. package/packages/pi-tui/dist/terminal.js.map +1 -1
  292. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  293. package/packages/pi-tui/dist/tui.js +106 -27
  294. package/packages/pi-tui/dist/tui.js.map +1 -1
  295. package/packages/pi-tui/package.json +1 -1
  296. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  297. package/packages/pi-tui/src/__tests__/tui.test.ts +59 -2
  298. package/packages/pi-tui/src/terminal.ts +11 -0
  299. package/packages/pi-tui/src/tui.ts +108 -27
  300. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  301. package/packages/rpc-client/package.json +1 -1
  302. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  303. package/pkg/package.json +1 -1
  304. package/src/resources/GSD-WORKFLOW.md +10 -1
  305. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  306. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
  307. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  308. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
  309. package/src/resources/extensions/cmux/index.ts +6 -0
  310. package/src/resources/extensions/gsd/auto/contracts.ts +17 -6
  311. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  312. package/src/resources/extensions/gsd/auto/loop.ts +111 -38
  313. package/src/resources/extensions/gsd/auto/orchestrator.ts +12 -1
  314. package/src/resources/extensions/gsd/auto/phases.ts +115 -49
  315. package/src/resources/extensions/gsd/auto/session.ts +16 -0
  316. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  317. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  318. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  319. package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
  320. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  321. package/src/resources/extensions/gsd/auto-dispatch.ts +21 -19
  322. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  323. package/src/resources/extensions/gsd/auto-post-unit.ts +312 -148
  324. package/src/resources/extensions/gsd/auto-prompts.ts +36 -13
  325. package/src/resources/extensions/gsd/auto-recovery.ts +83 -11
  326. package/src/resources/extensions/gsd/auto-start.ts +94 -12
  327. package/src/resources/extensions/gsd/auto-timers.ts +10 -3
  328. package/src/resources/extensions/gsd/auto-verification.ts +124 -42
  329. package/src/resources/extensions/gsd/auto-worktree.ts +195 -11
  330. package/src/resources/extensions/gsd/auto.ts +91 -42
  331. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +42 -7
  332. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -9
  333. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +5 -4
  334. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  335. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
  336. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  337. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  338. package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -0
  339. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  340. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  341. package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
  342. package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
  343. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +8 -3
  344. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  345. package/src/resources/extensions/gsd/crash-recovery.ts +44 -4
  346. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  347. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  348. package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
  349. package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
  350. package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
  351. package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
  352. package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -0
  353. package/src/resources/extensions/gsd/doctor-git-checks.ts +45 -1
  354. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  355. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  356. package/src/resources/extensions/gsd/doctor.ts +2 -27
  357. package/src/resources/extensions/gsd/export-html.ts +27 -427
  358. package/src/resources/extensions/gsd/forensics.ts +7 -3
  359. package/src/resources/extensions/gsd/git-service.ts +166 -11
  360. package/src/resources/extensions/gsd/gsd-db.ts +80 -31
  361. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  362. package/src/resources/extensions/gsd/guided-flow.ts +142 -134
  363. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  364. package/src/resources/extensions/gsd/init-wizard.ts +17 -2
  365. package/src/resources/extensions/gsd/journal.ts +8 -1
  366. package/src/resources/extensions/gsd/markdown-renderer.ts +10 -8
  367. package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
  368. package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
  369. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  370. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  371. package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
  372. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
  373. package/src/resources/extensions/gsd/paths.ts +5 -0
  374. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  375. package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
  376. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
  377. package/src/resources/extensions/gsd/pre-execution-checks.ts +49 -11
  378. package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
  379. package/src/resources/extensions/gsd/preferences-types.ts +33 -0
  380. package/src/resources/extensions/gsd/preferences-validation.ts +145 -0
  381. package/src/resources/extensions/gsd/preferences.ts +5 -0
  382. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  383. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  384. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  385. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  386. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  387. package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
  388. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  389. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  390. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  391. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  392. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  393. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  394. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  395. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  396. package/src/resources/extensions/gsd/repository-registry.ts +77 -0
  397. package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
  398. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
  399. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +52 -1
  400. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  401. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  402. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  403. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  404. package/src/resources/extensions/gsd/state.ts +15 -4
  405. package/src/resources/extensions/gsd/status-guards.ts +16 -2
  406. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  407. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  408. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  409. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  410. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +300 -1
  411. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +174 -8
  412. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  413. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  414. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  415. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +129 -6
  416. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
  417. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  418. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  419. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  420. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
  421. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  422. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  423. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  424. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
  425. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  426. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  427. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
  428. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +5 -9
  429. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  430. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +86 -2
  431. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  432. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  433. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
  434. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
  435. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +66 -0
  436. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
  437. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  438. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
  439. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
  440. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  441. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
  442. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  443. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  444. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  445. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  446. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  447. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  448. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  449. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  450. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  451. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  452. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
  453. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  454. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +199 -2
  455. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  456. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
  457. package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
  458. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
  459. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
  460. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  461. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
  462. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  463. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
  464. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  465. package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
  466. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  467. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  468. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  469. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  470. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  471. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
  472. package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
  473. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  474. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
  475. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
  476. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  477. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +59 -0
  478. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
  479. package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
  480. package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
  481. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +70 -0
  482. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  483. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  484. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  485. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  486. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  487. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
  488. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  489. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +10 -0
  490. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +72 -1
  491. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  492. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +53 -2
  493. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  494. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  495. package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
  496. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  497. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
  498. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  499. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +128 -9
  500. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
  501. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  502. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
  503. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +173 -1
  504. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  505. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  506. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  507. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  508. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1 -1
  509. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  510. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  511. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +25 -0
  512. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
  513. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
  514. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
  515. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
  516. package/src/resources/extensions/gsd/tools/complete-milestone.ts +8 -10
  517. package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
  518. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  519. package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
  520. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
  521. package/src/resources/extensions/gsd/types.ts +1 -1
  522. package/src/resources/extensions/gsd/unit-context-manifest.ts +51 -18
  523. package/src/resources/extensions/gsd/validation.ts +23 -1
  524. package/src/resources/extensions/gsd/verification-gate.ts +170 -6
  525. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  526. package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
  527. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  528. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  529. package/src/resources/extensions/gsd/worktree-lifecycle.ts +61 -10
  530. package/src/resources/extensions/gsd/worktree-manager.ts +1 -1
  531. package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
  532. package/src/resources/extensions/shared/html-shell.ts +412 -0
  533. package/src/resources/extensions/shared/interview-ui.ts +6 -4
  534. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
  535. package/src/resources/extensions/subagent/index.ts +567 -103
  536. package/src/resources/extensions/subagent/launch.ts +131 -0
  537. package/src/resources/extensions/subagent/run-store.ts +218 -0
  538. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  539. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  540. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  541. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  542. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  543. package/src/resources/extensions/visual-brief/index.ts +8 -0
  544. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  545. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  546. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  547. package/src/resources/skills/forensics/SKILL.md +1 -1
  548. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  549. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  550. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  551. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  552. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +0 -1
  553. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  554. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  555. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  556. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  557. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  558. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  559. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  560. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  561. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → _kljR-_Miq_YV1IW0wpRO}/_buildManifest.js +0 -0
  562. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → _kljR-_Miq_YV1IW0wpRO}/_ssgManifest.js +0 -0
@@ -0,0 +1,97 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Tests for verification evidence cross-reference mismatch policy.
3
+
4
+ import test from "node:test";
5
+ import assert from "node:assert/strict";
6
+
7
+ import { crossReferenceEvidence } from "../safety/evidence-cross-ref.ts";
8
+ import type { EvidenceEntry } from "../safety/evidence-collector.ts";
9
+
10
+ test("claims of passing verification become errors when recorded bash evidence failed", () => {
11
+ const mismatches = crossReferenceEvidence(
12
+ [{ command: "npm test", exitCode: 0, verdict: "passed" }],
13
+ [
14
+ {
15
+ kind: "bash",
16
+ toolCallId: "call-1",
17
+ command: "npm test",
18
+ exitCode: 1,
19
+ outputSnippet: "failed",
20
+ timestamp: Date.now(),
21
+ },
22
+ ] as EvidenceEntry[],
23
+ );
24
+
25
+ assert.equal(mismatches.length, 1);
26
+ assert.equal(mismatches[0].severity, "error");
27
+ assert.match(mismatches[0].reason, /Claimed exitCode=0/);
28
+ });
29
+
30
+ test("passing retry evidence is not invalidated by an earlier failed run of the same command", () => {
31
+ const command = "node todo.js add 'Task A' && node todo.js add 'Task B' && node todo.js done 1";
32
+ const mismatches = crossReferenceEvidence(
33
+ [{ command, exitCode: 0, verdict: "passed after retry" }],
34
+ [
35
+ {
36
+ kind: "bash",
37
+ toolCallId: "call-1",
38
+ command,
39
+ exitCode: 1,
40
+ outputSnippet: "Task #1 not found",
41
+ timestamp: 1,
42
+ },
43
+ {
44
+ kind: "bash",
45
+ toolCallId: "call-2",
46
+ command,
47
+ exitCode: 0,
48
+ outputSnippet: "Marked #1 done.",
49
+ timestamp: 2,
50
+ },
51
+ ] as EvidenceEntry[],
52
+ );
53
+
54
+ assert.deepEqual(mismatches, []);
55
+ });
56
+
57
+ test("stale verification evidence batches are ignored when a newer completion batch exists", () => {
58
+ const command = "node todo.js add 'Task A' && node todo.js add 'Task B' && node todo.js done 1";
59
+ const resetCommand = `rm -f "$HOME/.config/todo/data.json" && ${command}`;
60
+ const mismatches = crossReferenceEvidence(
61
+ [
62
+ { command, exitCode: 0, verdict: "pass", createdAt: "2026-05-14T11:16:48.588Z" },
63
+ { command, exitCode: 1, verdict: "fail before reset", createdAt: "2026-05-14T11:28:36.952Z" },
64
+ { command: resetCommand, exitCode: 0, verdict: "pass after reset", createdAt: "2026-05-14T11:28:36.952Z" },
65
+ ],
66
+ [
67
+ {
68
+ kind: "bash",
69
+ toolCallId: "call-1",
70
+ command,
71
+ exitCode: 1,
72
+ outputSnippet: "Task #1 not found",
73
+ timestamp: 1,
74
+ },
75
+ {
76
+ kind: "bash",
77
+ toolCallId: "call-2",
78
+ command: resetCommand,
79
+ exitCode: 0,
80
+ outputSnippet: "Marked #1 done.",
81
+ timestamp: 2,
82
+ },
83
+ ] as EvidenceEntry[],
84
+ );
85
+
86
+ assert.deepEqual(mismatches, []);
87
+ });
88
+
89
+ test("missing recorded bash evidence remains a warning", () => {
90
+ const mismatches = crossReferenceEvidence(
91
+ [{ command: "npm test", exitCode: 0, verdict: "passed" }],
92
+ [],
93
+ );
94
+
95
+ assert.equal(mismatches.length, 1);
96
+ assert.equal(mismatches[0].severity, "warning");
97
+ });
@@ -141,6 +141,14 @@ test("Feature 1: executive summary paragraph is rendered", () => {
141
141
  assert.ok(html.includes("$2.50 spent"), "should contain cost");
142
142
  });
143
143
 
144
+ test("report uses the shared GSD HTML shell", () => {
145
+ const html = generateHtmlReport(mockData(), mockOpts());
146
+ assert.ok(html.includes('<span class="logo">GSD</span>'), "should render shared shell logo");
147
+ assert.ok(html.includes('<span class="kind-chip">Report</span>'), "should render report kind chip");
148
+ assert.ok(html.includes('<nav class="toc" aria-label="Report sections">'), "should render shared shell TOC");
149
+ assert.ok(html.includes('<main>'), "should render content inside shared shell main");
150
+ });
151
+
144
152
  test("Feature 1: executive summary includes budget context when set", () => {
145
153
  const data = mockData({ health: { ...mockData().health, budgetCeiling: 10.00 } });
146
154
  const html = generateHtmlReport(data, mockOpts());
@@ -30,6 +30,7 @@ import {
30
30
  insertTask,
31
31
  getTask,
32
32
  getSliceTasks,
33
+ getActiveMilestoneFromDb,
33
34
  deleteMilestone,
34
35
  clearEngineHierarchy,
35
36
  recordMilestoneCommitAttribution,
@@ -37,6 +38,7 @@ import {
37
38
  checkpointDatabase,
38
39
  refreshOpenDatabaseFromDisk,
39
40
  tryCreateMemoriesFts,
41
+ _isLikelyWslDrvFsPathForTest,
40
42
  } from '../gsd-db.ts';
41
43
  import { _resetLogs, peekLogs, setStderrLoggingEnabled } from '../workflow-logger.ts';
42
44
 
@@ -218,6 +220,22 @@ describe('gsd-db', () => {
218
220
  closeDatabase();
219
221
  });
220
222
 
223
+ test("gsd-db: getActiveMilestoneFromDb excludes closed statuses", () => {
224
+ openDatabase(":memory:");
225
+
226
+ insertMilestone({ id: "M001", title: "Done", status: "complete" });
227
+ insertMilestone({ id: "M002", title: "Legacy done", status: "done" });
228
+ insertMilestone({ id: "M003", title: "Skipped", status: "skipped" });
229
+ insertMilestone({ id: "M004", title: "Closed", status: "closed" });
230
+ insertMilestone({ id: "M005", title: "Parked", status: "parked" });
231
+ insertMilestone({ id: "M006", title: "Active", status: "active" });
232
+
233
+ const active = getActiveMilestoneFromDb();
234
+ assert.equal(active?.id, "M006", "closed/complete/done/skipped/parked should be excluded from active milestone selection");
235
+
236
+ closeDatabase();
237
+ });
238
+
221
239
  test('gsd-db: active_decisions view excludes superseded', () => {
222
240
  openDatabase(':memory:');
223
241
 
@@ -345,6 +363,16 @@ describe('gsd-db', () => {
345
363
  });
346
364
  });
347
365
 
366
+ test('gsd-db: detects WSL DrvFs mount paths for conservative pragmas', () => {
367
+ withPlatform('linux', () => {
368
+ assert.equal(_isLikelyWslDrvFsPathForTest('/mnt/d/code/project/.gsd/gsd.db'), true);
369
+ assert.equal(_isLikelyWslDrvFsPathForTest('/tmp/gsd.db'), false);
370
+ });
371
+ withPlatform('darwin', () => {
372
+ assert.equal(_isLikelyWslDrvFsPathForTest('/mnt/d/code/project/.gsd/gsd.db'), false);
373
+ });
374
+ });
375
+
348
376
  test('gsd-db: transaction rollback on error', () => {
349
377
  openDatabase(':memory:');
350
378
 
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * gsdRoot() must return the canonical project .gsd directory when basePath
5
5
  * is inside a .gsd/worktrees/<name>/ structure. Worktree-local .gsd folders
6
- * are legacy projection roots only; runtime state is DB-authoritative at the
6
+ * are projection roots; runtime/control state stays DB-authoritative at the
7
7
  * project .gsd.
8
8
  *
9
9
  * The bug: when a git worktree lives at /project/.gsd/worktrees/M008/,
@@ -21,7 +21,7 @@ import { mkdtempSync, realpathSync } from "node:fs";
21
21
  import { tmpdir } from "node:os";
22
22
  import { spawnSync } from "node:child_process";
23
23
 
24
- import { gsdRoot, resolveGsdPathContract, _clearGsdRootCache } from "../paths.ts";
24
+ import { gsdProjectionRoot, gsdRoot, resolveGsdPathContract, _clearGsdRootCache } from "../paths.ts";
25
25
 
26
26
  describe("gsdRoot() worktree detection (#2594)", () => {
27
27
  let projectRoot: string;
@@ -76,6 +76,7 @@ describe("gsdRoot() worktree detection (#2594)", () => {
76
76
  `Expected canonical project .gsd (${projectGsd}), got ${result}.`,
77
77
  );
78
78
  assert.equal(resolveGsdPathContract(worktreeBase).worktreeGsd, worktreeGsd);
79
+ assert.equal(gsdProjectionRoot(worktreeBase), worktreeGsd);
79
80
  });
80
81
 
81
82
  test("returns project .gsd when worktree .gsd does not exist yet", () => {
@@ -89,6 +90,7 @@ describe("gsdRoot() worktree detection (#2594)", () => {
89
90
  projectGsd,
90
91
  `Expected canonical project .gsd (${projectGsd}), got ${result}.`,
91
92
  );
93
+ assert.equal(gsdProjectionRoot(worktreeBase), join(worktreeBase, ".gsd"));
92
94
  });
93
95
 
94
96
  test("returns project .gsd when basePath is a real git worktree inside .gsd/worktrees/", () => {
@@ -116,6 +118,7 @@ describe("gsdRoot() worktree detection (#2594)", () => {
116
118
  projectGsd,
117
119
  `Expected canonical project .gsd (${projectGsd}), got ${gsdResult}`,
118
120
  );
121
+ assert.equal(gsdProjectionRoot(worktreeBase), join(worktreeBase, ".gsd"));
119
122
 
120
123
  // Cleanup worktree
121
124
  spawnSync("git", ["worktree", "remove", "--force", worktreeBase], {
@@ -34,6 +34,8 @@ test("guided project prompt renders compact interview and artifact guidance", as
34
34
  assert.match(prompt, /depth_verification_project_confirm/);
35
35
  assert.match(prompt, /artifact_type: "PROJECT"/);
36
36
  assert.match(prompt, /omit `milestone_id`/);
37
+ assert.match(prompt, /do not write the projection directly/i);
38
+ assert.doesNotMatch(prompt, /then write `.gsd\/PROJECT\.md`/);
37
39
  assert.match(prompt, /Do NOT use `artifact_type: "CONTEXT"` and do NOT pass `milestone_id: "PROJECT"`/);
38
40
  assert.match(prompt, /\*\*Complexity:\*\* simple/);
39
41
  assert.match(prompt, /\*\*Complexity:\*\* complex/);
@@ -0,0 +1,106 @@
1
+ // GSD-2 — Guided workflow dispatch project-root tests.
2
+ // Verifies smart entry dispatch uses the explicit project root instead of cwd.
3
+
4
+ import test from "node:test";
5
+ import assert from "node:assert/strict";
6
+ import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
7
+ import { tmpdir } from "node:os";
8
+ import { join } from "node:path";
9
+
10
+ import {
11
+ _dispatchWorkflowForTest,
12
+ resolveGuidedDispatchProjectRoot,
13
+ } from "../guided-flow.ts";
14
+
15
+ test("guided dispatch falls back to cwd only when no project root is supplied", () => {
16
+ const cwd = process.cwd();
17
+ assert.equal(resolveGuidedDispatchProjectRoot(), cwd);
18
+ assert.equal(resolveGuidedDispatchProjectRoot("/tmp/explicit-root"), "/tmp/explicit-root");
19
+ });
20
+
21
+ test("guided dispatch passes the explicit project root through model and compatibility checks", async () => {
22
+ const explicitRoot = mkdtempSync(join(tmpdir(), "gsd-guided-root-explicit-"));
23
+ const otherRoot = mkdtempSync(join(tmpdir(), "gsd-guided-root-cwd-"));
24
+ const workflowPath = join(explicitRoot, "GSD-WORKFLOW.md");
25
+ const originalWorkflowPath = process.env.GSD_WORKFLOW_PATH;
26
+ const originalCwd = process.cwd();
27
+ const seen = {
28
+ prefsRoot: "",
29
+ modelRoot: "",
30
+ compatibilityRoot: "",
31
+ sent: false,
32
+ };
33
+
34
+ const ctx = {
35
+ model: { provider: "local-provider" },
36
+ modelRegistry: {
37
+ getProviderAuthMode: () => "apiKey",
38
+ },
39
+ ui: {
40
+ notify: () => {},
41
+ },
42
+ };
43
+
44
+ const pi = {
45
+ getActiveTools: () => ["gsd_plan_slice"],
46
+ setActiveTools: () => {},
47
+ sendMessage: () => {
48
+ seen.sent = true;
49
+ },
50
+ };
51
+
52
+ try {
53
+ writeFileSync(workflowPath, "# Workflow\n", "utf-8");
54
+ process.env.GSD_WORKFLOW_PATH = workflowPath;
55
+ process.chdir(otherRoot);
56
+
57
+ await _dispatchWorkflowForTest(
58
+ pi as any,
59
+ "Plan the slice.",
60
+ "gsd-run",
61
+ ctx as any,
62
+ "plan-slice",
63
+ {
64
+ basePath: explicitRoot,
65
+ deps: {
66
+ loadPreferences: (projectRoot?: string) => {
67
+ seen.prefsRoot = projectRoot ?? "";
68
+ return { preferences: {} } as any;
69
+ },
70
+ selectModel: async (
71
+ _ctx: unknown,
72
+ _pi: unknown,
73
+ _unitType: string,
74
+ _unitId: string,
75
+ projectRoot: string,
76
+ ) => {
77
+ seen.modelRoot = projectRoot;
78
+ return { routing: null, appliedModel: null };
79
+ },
80
+ getTransportSupportError: (
81
+ _provider: string | undefined,
82
+ _requiredTools: string[],
83
+ options?: { projectRoot?: string },
84
+ ) => {
85
+ seen.compatibilityRoot = options?.projectRoot ?? "";
86
+ return null;
87
+ },
88
+ },
89
+ },
90
+ );
91
+
92
+ assert.equal(seen.prefsRoot, explicitRoot);
93
+ assert.equal(seen.modelRoot, explicitRoot);
94
+ assert.equal(seen.compatibilityRoot, explicitRoot);
95
+ assert.equal(seen.sent, true);
96
+ } finally {
97
+ process.chdir(originalCwd);
98
+ if (originalWorkflowPath === undefined) {
99
+ delete process.env.GSD_WORKFLOW_PATH;
100
+ } else {
101
+ process.env.GSD_WORKFLOW_PATH = originalWorkflowPath;
102
+ }
103
+ rmSync(explicitRoot, { recursive: true, force: true });
104
+ rmSync(otherRoot, { recursive: true, force: true });
105
+ }
106
+ });
@@ -21,6 +21,15 @@ import {
21
21
  checkAutoStartAfterDiscuss,
22
22
  } from "../guided-flow.ts";
23
23
 
24
+ function pendingInput(basePath: string, milestoneId: string) {
25
+ return {
26
+ basePath,
27
+ milestoneId,
28
+ ctx: { ui: { notify: () => undefined } } as any,
29
+ pi: { setActiveTools: () => undefined, getActiveTools: () => [] } as any,
30
+ };
31
+ }
32
+
24
33
  // ─── Tests ─────────────────────────────────────────────────────────────────
25
34
 
26
35
  describe("#2985 Bug 3 — concurrent discuss sessions must be independent", () => {
@@ -34,13 +43,11 @@ describe("#2985 Bug 3 — concurrent discuss sessions must be independent", () =
34
43
  const projectB = "/projects/beta";
35
44
 
36
45
  setPendingAutoStart(projectA, {
37
- basePath: projectA,
38
- milestoneId: "M001-aaa111",
46
+ ...pendingInput(projectA, "M001-aaa111"),
39
47
  });
40
48
 
41
49
  setPendingAutoStart(projectB, {
42
- basePath: projectB,
43
- milestoneId: "M002-bbb222",
50
+ ...pendingInput(projectB, "M002-bbb222"),
44
51
  });
45
52
 
46
53
  // Both sessions should be retrievable
@@ -55,8 +62,8 @@ describe("#2985 Bug 3 — concurrent discuss sessions must be independent", () =
55
62
  const projectA = "/projects/alpha";
56
63
  const projectB = "/projects/beta";
57
64
 
58
- setPendingAutoStart(projectA, { basePath: projectA, milestoneId: "M001-aaa111" });
59
- setPendingAutoStart(projectB, { basePath: projectB, milestoneId: "M002-bbb222" });
65
+ setPendingAutoStart(projectA, pendingInput(projectA, "M001-aaa111"));
66
+ setPendingAutoStart(projectB, pendingInput(projectB, "M002-bbb222"));
60
67
 
61
68
  // Clear only projectA
62
69
  clearPendingAutoStart(projectA);
@@ -72,8 +79,8 @@ describe("#2985 Bug 4 — getDiscussionMilestoneId must be keyed by basePath", (
72
79
  });
73
80
 
74
81
  test("getDiscussionMilestoneId(basePath) returns correct milestone for each project", () => {
75
- setPendingAutoStart("/proj/a", { basePath: "/proj/a", milestoneId: "M001" });
76
- setPendingAutoStart("/proj/b", { basePath: "/proj/b", milestoneId: "M002" });
82
+ setPendingAutoStart("/proj/a", pendingInput("/proj/a", "M001"));
83
+ setPendingAutoStart("/proj/b", pendingInput("/proj/b", "M002"));
77
84
 
78
85
  assert.equal(getDiscussionMilestoneId("/proj/a"), "M001");
79
86
  assert.equal(getDiscussionMilestoneId("/proj/b"), "M002");
@@ -81,8 +88,8 @@ describe("#2985 Bug 4 — getDiscussionMilestoneId must be keyed by basePath", (
81
88
  });
82
89
 
83
90
  test("getDiscussionMilestoneId() without basePath returns null when multiple sessions exist", () => {
84
- setPendingAutoStart("/proj/a", { basePath: "/proj/a", milestoneId: "M001" });
85
- setPendingAutoStart("/proj/b", { basePath: "/proj/b", milestoneId: "M002" });
91
+ setPendingAutoStart("/proj/a", pendingInput("/proj/a", "M001"));
92
+ setPendingAutoStart("/proj/b", pendingInput("/proj/b", "M002"));
86
93
 
87
94
  // Without a key, the function should not blindly return the first entry
88
95
  const result = getDiscussionMilestoneId();
@@ -92,7 +99,7 @@ describe("#2985 Bug 4 — getDiscussionMilestoneId must be keyed by basePath", (
92
99
  });
93
100
 
94
101
  test("getDiscussionMilestoneId() without basePath returns the milestone when only one session", () => {
95
- setPendingAutoStart("/proj/a", { basePath: "/proj/a", milestoneId: "M001" });
102
+ setPendingAutoStart("/proj/a", pendingInput("/proj/a", "M001"));
96
103
 
97
104
  // With only one session, backward compat — return it
98
105
  const result = getDiscussionMilestoneId();
@@ -129,3 +136,44 @@ test("checkAutoStartAfterDiscuss ignores missing manifest for single-milestone d
129
136
  rmSync(base, { recursive: true, force: true });
130
137
  }
131
138
  });
139
+
140
+ test("checkAutoStartAfterDiscuss(basePath) selects the matching pending entry when multiple sessions exist", () => {
141
+ const projectA = mkdtempSync(join(tmpdir(), "gsd-auto-start-project-a-"));
142
+ const projectB = mkdtempSync(join(tmpdir(), "gsd-auto-start-project-b-"));
143
+
144
+ function writeReadyArtifacts(base: string, milestoneId: string): void {
145
+ const gsdDir = join(base, ".gsd");
146
+ const milestoneDir = join(gsdDir, "milestones", milestoneId);
147
+ mkdirSync(milestoneDir, { recursive: true });
148
+ writeFileSync(join(gsdDir, "PROJECT.md"), `# Project\n\n| ${milestoneId} | Milestone | active |\n`);
149
+ writeFileSync(join(gsdDir, "STATE.md"), "# State\n");
150
+ writeFileSync(join(milestoneDir, `${milestoneId}-CONTEXT.md`), "# Context\n");
151
+ }
152
+
153
+ try {
154
+ clearPendingAutoStart();
155
+ writeReadyArtifacts(projectA, "M001");
156
+ writeReadyArtifacts(projectB, "M002");
157
+ setPendingAutoStart(projectA, {
158
+ basePath: projectA,
159
+ milestoneId: "M001",
160
+ ctx: { ui: { notify: () => undefined } } as any,
161
+ pi: { setActiveTools: () => undefined, getActiveTools: () => [] } as any,
162
+ });
163
+ setPendingAutoStart(projectB, {
164
+ basePath: projectB,
165
+ milestoneId: "M002",
166
+ ctx: { ui: { notify: () => undefined } } as any,
167
+ pi: { setActiveTools: () => undefined, getActiveTools: () => [] } as any,
168
+ });
169
+
170
+ assert.equal(checkAutoStartAfterDiscuss(), false, "ambiguous pending sessions should not auto-start");
171
+ assert.equal(checkAutoStartAfterDiscuss(projectB), true, "explicit basePath should select projectB");
172
+ assert.equal(getDiscussionMilestoneId(projectA), "M001", "projectA should remain pending");
173
+ assert.equal(getDiscussionMilestoneId(projectB), null, "projectB should be cleared after start");
174
+ } finally {
175
+ clearPendingAutoStart();
176
+ rmSync(projectA, { recursive: true, force: true });
177
+ rmSync(projectB, { recursive: true, force: true });
178
+ }
179
+ });
@@ -0,0 +1,21 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { readFileSync } from "node:fs";
4
+ import { dirname, join } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+
7
+ const __dirname = dirname(fileURLToPath(import.meta.url));
8
+
9
+ test("guided milestone discussion callsites pass workingDirectory to loadPrompt", () => {
10
+ const source = readFileSync(join(__dirname, "..", "guided-flow.ts"), "utf-8");
11
+ const calls = [...source.matchAll(/loadPrompt\("guided-discuss-milestone",\s*\{([\s\S]*?)\}\)/g)];
12
+
13
+ assert.equal(calls.length, 6, "all guided-flow guided-discuss-milestone callsites should be covered");
14
+ for (const call of calls) {
15
+ assert.match(
16
+ call[1] ?? "",
17
+ /\bworkingDirectory:\s*basePath\b/,
18
+ "guided-discuss-milestone prompts need workingDirectory so template validation does not crash",
19
+ );
20
+ }
21
+ });
@@ -0,0 +1,65 @@
1
+ // GSD-2 — Guided Unit Tool Contract tests.
2
+ // Verifies guided workflow turns use manifest tool policy without auto-mode state.
3
+
4
+ import test from "node:test";
5
+ import assert from "node:assert/strict";
6
+ import { mkdtempSync, rmSync } from "node:fs";
7
+ import { tmpdir } from "node:os";
8
+ import { join } from "node:path";
9
+
10
+ import { registerHooks } from "../bootstrap/register-hooks.ts";
11
+ import {
12
+ clearGuidedUnitContext,
13
+ getGuidedUnitContext,
14
+ setGuidedUnitContext,
15
+ } from "../guided-unit-context.ts";
16
+
17
+ test("guided Unit context applies Tool Contract policy when auto-mode has no current Unit", async () => {
18
+ const basePath = mkdtempSync(join(tmpdir(), "gsd-guided-tool-contract-"));
19
+ const handlers = new Map<string, Array<(event: any, ctx?: any) => Promise<any> | any>>();
20
+ const pi = {
21
+ on(event: string, handler: (event: any, ctx?: any) => Promise<any> | any) {
22
+ const existing = handlers.get(event) ?? [];
23
+ existing.push(handler);
24
+ handlers.set(event, existing);
25
+ },
26
+ };
27
+
28
+ try {
29
+ clearGuidedUnitContext();
30
+ registerHooks(pi as any, []);
31
+ setGuidedUnitContext(basePath, "plan-slice");
32
+
33
+ let blockResult: { block?: boolean; reason?: string } | undefined;
34
+ for (const handler of handlers.get("tool_call") ?? []) {
35
+ const result = await handler({
36
+ toolName: "edit",
37
+ input: {
38
+ path: join(basePath, "src", "main.ts"),
39
+ },
40
+ }, { cwd: basePath });
41
+ if (result?.block) {
42
+ blockResult = result;
43
+ break;
44
+ }
45
+ }
46
+
47
+ assert.equal(blockResult?.block, true);
48
+ assert.match(blockResult?.reason ?? "", /plan-slice|ToolsPolicy|not allowed|blocked/i);
49
+ } finally {
50
+ clearGuidedUnitContext();
51
+ rmSync(basePath, { recursive: true, force: true });
52
+ }
53
+ });
54
+
55
+ test("guided Unit context can be cleared by project root", () => {
56
+ clearGuidedUnitContext();
57
+ setGuidedUnitContext("/project/a", "plan-slice");
58
+ setGuidedUnitContext("/project/b", "complete-slice");
59
+
60
+ clearGuidedUnitContext("/project/a");
61
+
62
+ assert.equal(getGuidedUnitContext("/project/a"), null);
63
+ assert.equal(getGuidedUnitContext("/project/b")?.unitType, "complete-slice");
64
+ clearGuidedUnitContext();
65
+ });
@@ -45,7 +45,7 @@ describe("headless milestone bootstrap — parity with interactive flow", () =>
45
45
 
46
46
  // Match only the actual dispatchWorkflow call — comments in the body
47
47
  // may mention "plan-milestone" as part of the fix rationale.
48
- const dispatchMatches = [...fnBody.matchAll(/dispatchWorkflow\([^)]*,\s*"([^"]+)"\s*\)/g)];
48
+ const dispatchMatches = [...fnBody.matchAll(/dispatchWorkflow\([\s\S]*?,\s*"([^"]+)"\s*,\s*\{\s*basePath\s*\}\s*\)/g)];
49
49
  assert.strictEqual(
50
50
  dispatchMatches.length,
51
51
  1,
@@ -65,15 +65,15 @@ describe("headless milestone bootstrap — parity with interactive flow", () =>
65
65
  /### Ready-phrase pre-condition \(NON-BYPASSABLE\)/.test(section),
66
66
  "single-milestone ready-phrase section must be present",
67
67
  );
68
- // All four required artifacts must appear as checkboxes, not a prose list.
68
+ // All four required outcomes must appear as checkboxes, not a prose list.
69
69
  for (const artifact of [
70
- "`.gsd/PROJECT.md`",
71
- "`.gsd/REQUIREMENTS.md`",
70
+ "PROJECT artifact",
71
+ "REQUIREMENTS artifact",
72
72
  "`{{contextPath}}`",
73
73
  "`gsd_plan_milestone`",
74
74
  ]) {
75
75
  assert.ok(
76
- new RegExp(`- \\[ \\] [A-Za-z]+ ${artifact.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}`).test(section),
76
+ new RegExp(`- \\[ \\] [^\\n]*${artifact.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}`).test(section),
77
77
  `single-milestone pre-condition must include a checkbox for ${artifact}`,
78
78
  );
79
79
  }
@@ -103,8 +103,8 @@ describe("headless milestone bootstrap — parity with interactive flow", () =>
103
103
  "multi-milestone ready-phrase section must be present",
104
104
  );
105
105
  for (const artifact of [
106
- "`.gsd/PROJECT.md`",
107
- "`.gsd/REQUIREMENTS.md`",
106
+ "PROJECT artifact",
107
+ "REQUIREMENTS artifact",
108
108
  "`gsd_plan_milestone`",
109
109
  "`.gsd/DISCUSSION-MANIFEST.json`",
110
110
  ]) {
@@ -92,6 +92,11 @@ test("resolveModelId: returns undefined for unknown model", () => {
92
92
  assert.equal(match, undefined);
93
93
  });
94
94
 
95
+ test("resolveModelId: returns undefined for missing model ID", () => {
96
+ const match = resolveModelId(undefined, AVAILABLE_MODELS, "anthropic");
97
+ assert.equal(match, undefined);
98
+ });
99
+
95
100
  test("resolveModelId: returns undefined for unknown provider/model combo", () => {
96
101
  const match = resolveModelId("fakeprovider/fake-model", AVAILABLE_MODELS, undefined);
97
102
  assert.equal(match, undefined);
@@ -9,11 +9,11 @@ import { isInfrastructureError, INFRA_ERROR_CODES } from "../auto/infra-errors.j
9
9
  test("INFRA_ERROR_CODES contains the expected codes", () => {
10
10
  for (const code of [
11
11
  "ENOSPC", "ENOMEM", "EROFS", "EDQUOT", "EMFILE", "ENFILE",
12
- "EAGAIN", "ECONNREFUSED", "ENOTFOUND", "ENETUNREACH",
12
+ "EAGAIN", "ENOBUFS", "ECONNREFUSED", "ENOTFOUND", "ENETUNREACH",
13
13
  ]) {
14
14
  assert.ok(INFRA_ERROR_CODES.has(code), `missing ${code}`);
15
15
  }
16
- assert.equal(INFRA_ERROR_CODES.size, 10, "unexpected extra codes");
16
+ assert.equal(INFRA_ERROR_CODES.size, 11, "unexpected extra codes");
17
17
  });
18
18
 
19
19
  // ── isInfrastructureError: code property detection ───────────────────────────
@@ -5,6 +5,8 @@ import test, { describe } from "node:test";
5
5
  import assert from "node:assert/strict";
6
6
 
7
7
  import {
8
+ INFRA_ERROR_CODES,
9
+ isInfrastructureError,
8
10
  isTransientCooldownError,
9
11
  getCooldownRetryAfterMs,
10
12
  MAX_COOLDOWN_RETRIES,
@@ -13,6 +15,13 @@ import {
13
15
 
14
16
  // ─── Constants ────────────────────────────────────────────────────────────────
15
17
 
18
+ describe("infra error classification", () => {
19
+ test("ENOBUFS is treated as infrastructure exhaustion", () => {
20
+ assert.equal(INFRA_ERROR_CODES.has("ENOBUFS"), true);
21
+ assert.equal(isInfrastructureError(Object.assign(new Error("spawnSync git ENOBUFS"), { code: "ENOBUFS" })), "ENOBUFS");
22
+ });
23
+ });
24
+
16
25
  describe("infra-errors cooldown constants", () => {
17
26
  test("COOLDOWN_FALLBACK_WAIT_MS is a positive number greater than the 30s rate-limit backoff", () => {
18
27
  assert.ok(typeof COOLDOWN_FALLBACK_WAIT_MS === "number");
@@ -251,3 +251,25 @@ test("handlePrefsWizard — accepts pathOverride to target a non-cwd location",
251
251
  "handlePrefsWizard must honor opts.pathOverride before falling back to scope-derived path",
252
252
  );
253
253
  });
254
+
255
+ test("handleReinit — exposes skills flow and runs prefs wizard directly (#5173)", () => {
256
+ const src = readFileSync(
257
+ new URL("../init-wizard.ts", import.meta.url),
258
+ "utf-8",
259
+ );
260
+ assert.match(
261
+ src,
262
+ /id:\s*"skills"[\s\S]*?label:\s*"Suggest & install skills"/,
263
+ "handleReinit should offer Suggest & install skills",
264
+ );
265
+ assert.match(
266
+ src,
267
+ /if \(choice === "skills"\)\s*\{[\s\S]*?await runSkillInstallStep\(ctx,\s*.*\)/,
268
+ "handleReinit skills branch should invoke runSkillInstallStep",
269
+ );
270
+ assert.match(
271
+ src,
272
+ /if \(choice === "prefs"\)\s*\{[\s\S]*?await handlePrefsWizard\(ctx,\s*"project"\)/,
273
+ "handleReinit prefs branch should launch prefs wizard directly",
274
+ );
275
+ });