gsd-pi 2.82.0-dev.ed17d078d → 3.0.0-dev.04f5ccf82

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 (653) hide show
  1. package/README.md +93 -18
  2. package/dist/cli.js +20 -9
  3. package/dist/headless-ui.js +13 -6
  4. package/dist/headless.js +9 -2
  5. package/dist/resources/.managed-resources-content-hash +1 -1
  6. package/dist/resources/GSD-WORKFLOW.md +10 -1
  7. package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
  8. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -6
  9. package/dist/resources/extensions/cmux/index.js +5 -0
  10. package/dist/resources/extensions/gsd/auto/detect-stuck.js +1 -1
  11. package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
  12. package/dist/resources/extensions/gsd/auto/loop.js +122 -40
  13. package/dist/resources/extensions/gsd/auto/orchestrator.js +15 -4
  14. package/dist/resources/extensions/gsd/auto/phases.js +146 -49
  15. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  16. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -1
  17. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
  18. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  19. package/dist/resources/extensions/gsd/auto-budget.js +9 -0
  20. package/dist/resources/extensions/gsd/auto-dashboard.js +72 -5
  21. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  22. package/dist/resources/extensions/gsd/auto-dispatch.js +185 -30
  23. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  24. package/dist/resources/extensions/gsd/auto-post-unit.js +329 -137
  25. package/dist/resources/extensions/gsd/auto-prompts.js +36 -10
  26. package/dist/resources/extensions/gsd/auto-recovery.js +82 -16
  27. package/dist/resources/extensions/gsd/auto-start.js +99 -16
  28. package/dist/resources/extensions/gsd/auto-timers.js +11 -3
  29. package/dist/resources/extensions/gsd/auto-verification.js +146 -34
  30. package/dist/resources/extensions/gsd/auto-worktree.js +185 -26
  31. package/dist/resources/extensions/gsd/auto.js +135 -74
  32. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +65 -10
  33. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +13 -10
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +14 -4
  35. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  36. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
  37. package/dist/resources/extensions/gsd/clean-root-preflight.js +267 -8
  38. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  39. package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -0
  40. package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
  41. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  42. package/dist/resources/extensions/gsd/commands-handlers.js +2 -0
  43. package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
  44. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +16 -4
  45. package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
  46. package/dist/resources/extensions/gsd/crash-recovery.js +55 -7
  47. package/dist/resources/extensions/gsd/db/auto-workers.js +30 -0
  48. package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
  49. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  50. package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
  51. package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
  52. package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
  53. package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
  54. package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  55. package/dist/resources/extensions/gsd/doctor-git-checks.js +74 -3
  56. package/dist/resources/extensions/gsd/doctor-proactive.js +14 -2
  57. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  58. package/dist/resources/extensions/gsd/doctor.js +2 -28
  59. package/dist/resources/extensions/gsd/export-html.js +27 -425
  60. package/dist/resources/extensions/gsd/forensics.js +10 -3
  61. package/dist/resources/extensions/gsd/git-conflict-state.js +21 -0
  62. package/dist/resources/extensions/gsd/git-service.js +152 -15
  63. package/dist/resources/extensions/gsd/gsd-db.js +76 -33
  64. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  65. package/dist/resources/extensions/gsd/guided-flow.js +110 -117
  66. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  67. package/dist/resources/extensions/gsd/init-wizard.js +17 -2
  68. package/dist/resources/extensions/gsd/markdown-renderer.js +14 -11
  69. package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
  70. package/dist/resources/extensions/gsd/migrate/parsers.js +121 -2
  71. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  72. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  73. package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
  74. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
  75. package/dist/resources/extensions/gsd/paths.js +4 -0
  76. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  77. package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
  78. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
  79. package/dist/resources/extensions/gsd/pre-execution-checks.js +54 -19
  80. package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
  81. package/dist/resources/extensions/gsd/preferences-models.js +6 -4
  82. package/dist/resources/extensions/gsd/preferences-types.js +3 -0
  83. package/dist/resources/extensions/gsd/preferences-validation.js +147 -0
  84. package/dist/resources/extensions/gsd/preferences.js +35 -0
  85. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  86. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  87. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  88. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  89. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  90. package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
  91. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  92. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  93. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  94. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  95. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  96. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  97. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  98. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  99. package/dist/resources/extensions/gsd/repo-identity.js +39 -22
  100. package/dist/resources/extensions/gsd/repository-registry.js +44 -0
  101. package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
  102. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
  103. package/dist/resources/extensions/gsd/session-lock.js +15 -2
  104. package/dist/resources/extensions/gsd/slice-parallel-conflict.js +2 -2
  105. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +84 -5
  106. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  107. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  108. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  109. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  110. package/dist/resources/extensions/gsd/state.js +28 -7
  111. package/dist/resources/extensions/gsd/status-guards.js +14 -2
  112. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  113. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  114. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  115. package/dist/resources/extensions/gsd/tools/complete-milestone.js +15 -9
  116. package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -10
  117. package/dist/resources/extensions/gsd/tools/exec-tool.js +87 -5
  118. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  119. package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
  120. package/dist/resources/extensions/gsd/tools/validate-milestone.js +32 -1
  121. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +185 -40
  122. package/dist/resources/extensions/gsd/tui/render-kit.js +33 -0
  123. package/dist/resources/extensions/gsd/unit-context-composer.js +2 -0
  124. package/dist/resources/extensions/gsd/unit-context-manifest.js +69 -17
  125. package/dist/resources/extensions/gsd/validation.js +23 -1
  126. package/dist/resources/extensions/gsd/verification-gate.js +142 -7
  127. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  128. package/dist/resources/extensions/gsd/watch/header-renderer.js +34 -25
  129. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  130. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  131. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  132. package/dist/resources/extensions/gsd/worktree-lifecycle.js +86 -19
  133. package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
  134. package/dist/resources/extensions/gsd/worktree-safety.js +43 -4
  135. package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
  136. package/dist/resources/extensions/gsd/worktree-telemetry.js +32 -0
  137. package/dist/resources/extensions/shared/html-shell.js +388 -0
  138. package/dist/resources/extensions/shared/interview-ui.js +6 -4
  139. package/dist/resources/extensions/shared/next-action-ui.js +13 -5
  140. package/dist/resources/extensions/subagent/index.js +448 -78
  141. package/dist/resources/extensions/subagent/launch.js +77 -0
  142. package/dist/resources/extensions/subagent/run-store.js +148 -0
  143. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  144. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  145. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  146. package/dist/resources/extensions/visual-brief/index.js +5 -0
  147. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  148. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  149. package/dist/resources/skills/forensics/SKILL.md +1 -1
  150. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  151. package/dist/web/standalone/.next/BUILD_ID +1 -1
  152. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  153. package/dist/web/standalone/.next/build-manifest.json +3 -3
  154. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  155. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  156. package/dist/web/standalone/.next/required-server-files.json +1 -1
  157. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  159. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  160. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  161. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  162. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  163. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  164. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  166. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  167. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  170. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  171. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  172. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  174. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  176. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  177. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/index.html +1 -1
  180. package/dist/web/standalone/.next/server/app/index.rsc +4 -7
  181. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  182. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -7
  183. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  184. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  185. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  186. package/dist/web/standalone/.next/server/app/page.js +2 -2
  187. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  190. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  191. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  195. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  196. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  197. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  198. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  199. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  200. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  201. package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
  202. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  203. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  204. package/dist/web/standalone/server.js +1 -1
  205. package/dist/welcome-screen.js +7 -8
  206. package/package.json +4 -4
  207. package/packages/contracts/dist/rpc.test.js +7 -0
  208. package/packages/contracts/dist/rpc.test.js.map +1 -1
  209. package/packages/contracts/dist/workflow.d.ts +21 -0
  210. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  211. package/packages/contracts/dist/workflow.js +24 -0
  212. package/packages/contracts/dist/workflow.js.map +1 -1
  213. package/packages/contracts/src/rpc.test.ts +8 -0
  214. package/packages/contracts/src/workflow.ts +24 -0
  215. package/packages/daemon/package.json +2 -2
  216. package/packages/mcp-server/README.md +13 -4
  217. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  218. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  219. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  220. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  221. package/packages/mcp-server/package.json +2 -2
  222. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  223. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  224. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  225. package/packages/native/package.json +1 -1
  226. package/packages/native/src/__tests__/stream-process.test.mjs +32 -12
  227. package/packages/native/tsconfig.json +2 -1
  228. package/packages/native/tsconfig.tsbuildinfo +1 -1
  229. package/packages/pi-agent-core/package.json +1 -1
  230. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  231. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  232. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  233. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  234. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  235. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  236. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  237. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  238. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  239. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  240. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  241. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  242. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  243. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  244. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  245. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  246. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  247. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  248. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  249. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  250. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  251. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  252. package/packages/pi-ai/package.json +1 -1
  253. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  254. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  255. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  256. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  257. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  258. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  259. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  260. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  261. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  262. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  263. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  264. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  265. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  266. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  267. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  268. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
  269. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  270. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
  271. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
  273. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  275. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  276. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +8 -2
  277. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  278. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  279. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +3 -0
  280. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  281. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +16 -0
  282. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -1
  283. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  284. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  285. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  286. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  287. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  289. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +82 -97
  290. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  291. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
  292. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
  294. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  295. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  296. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  297. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  298. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  299. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  300. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  301. package/packages/pi-coding-agent/package.json +1 -1
  302. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  303. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  304. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  305. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
  306. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
  307. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  308. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +17 -1
  309. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +20 -0
  310. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +3 -0
  311. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  312. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
  313. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +91 -102
  314. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
  315. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
  316. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  317. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  318. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  319. package/packages/pi-tui/dist/__tests__/loader.test.d.ts +2 -0
  320. package/packages/pi-tui/dist/__tests__/loader.test.d.ts.map +1 -0
  321. package/packages/pi-tui/dist/__tests__/loader.test.js +24 -0
  322. package/packages/pi-tui/dist/__tests__/loader.test.js.map +1 -0
  323. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  324. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  325. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  326. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  327. package/packages/pi-tui/dist/__tests__/tui.test.js +72 -4
  328. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  329. package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
  330. package/packages/pi-tui/dist/components/loader.js +3 -0
  331. package/packages/pi-tui/dist/components/loader.js.map +1 -1
  332. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  333. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  334. package/packages/pi-tui/dist/terminal.js +12 -0
  335. package/packages/pi-tui/dist/terminal.js.map +1 -1
  336. package/packages/pi-tui/dist/tui.d.ts +1 -0
  337. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  338. package/packages/pi-tui/dist/tui.js +117 -33
  339. package/packages/pi-tui/dist/tui.js.map +1 -1
  340. package/packages/pi-tui/package.json +1 -1
  341. package/packages/pi-tui/src/__tests__/loader.test.ts +30 -0
  342. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  343. package/packages/pi-tui/src/__tests__/tui.test.ts +90 -4
  344. package/packages/pi-tui/src/components/loader.ts +3 -0
  345. package/packages/pi-tui/src/terminal.ts +11 -0
  346. package/packages/pi-tui/src/tui.ts +116 -33
  347. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  348. package/packages/rpc-client/package.json +1 -1
  349. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  350. package/pkg/package.json +1 -1
  351. package/src/resources/GSD-WORKFLOW.md +10 -1
  352. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  353. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
  354. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  355. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
  356. package/src/resources/extensions/cmux/index.ts +6 -0
  357. package/src/resources/extensions/gsd/auto/contracts.ts +19 -6
  358. package/src/resources/extensions/gsd/auto/detect-stuck.ts +1 -0
  359. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  360. package/src/resources/extensions/gsd/auto/loop.ts +123 -40
  361. package/src/resources/extensions/gsd/auto/orchestrator.ts +15 -4
  362. package/src/resources/extensions/gsd/auto/phases.ts +172 -60
  363. package/src/resources/extensions/gsd/auto/session.ts +16 -0
  364. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  365. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +6 -2
  366. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  367. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  368. package/src/resources/extensions/gsd/auto-budget.ts +11 -0
  369. package/src/resources/extensions/gsd/auto-dashboard.ts +78 -5
  370. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  371. package/src/resources/extensions/gsd/auto-dispatch.ts +208 -29
  372. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  373. package/src/resources/extensions/gsd/auto-post-unit.ts +369 -148
  374. package/src/resources/extensions/gsd/auto-prompts.ts +36 -13
  375. package/src/resources/extensions/gsd/auto-recovery.ts +86 -13
  376. package/src/resources/extensions/gsd/auto-start.ts +109 -14
  377. package/src/resources/extensions/gsd/auto-timers.ts +10 -3
  378. package/src/resources/extensions/gsd/auto-verification.ts +174 -42
  379. package/src/resources/extensions/gsd/auto-worktree.ts +202 -30
  380. package/src/resources/extensions/gsd/auto.ts +172 -81
  381. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +66 -10
  382. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +13 -10
  383. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +13 -4
  384. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  385. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
  386. package/src/resources/extensions/gsd/clean-root-preflight.ts +284 -8
  387. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  388. package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -0
  389. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  390. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  391. package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
  392. package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
  393. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +17 -4
  394. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  395. package/src/resources/extensions/gsd/crash-recovery.ts +55 -6
  396. package/src/resources/extensions/gsd/db/auto-workers.ts +37 -0
  397. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  398. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  399. package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
  400. package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
  401. package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
  402. package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
  403. package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  404. package/src/resources/extensions/gsd/doctor-git-checks.ts +73 -3
  405. package/src/resources/extensions/gsd/doctor-proactive.ts +18 -2
  406. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  407. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  408. package/src/resources/extensions/gsd/doctor.ts +2 -27
  409. package/src/resources/extensions/gsd/export-html.ts +27 -427
  410. package/src/resources/extensions/gsd/forensics.ts +9 -3
  411. package/src/resources/extensions/gsd/git-conflict-state.ts +23 -0
  412. package/src/resources/extensions/gsd/git-service.ts +182 -16
  413. package/src/resources/extensions/gsd/gsd-db.ts +80 -31
  414. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  415. package/src/resources/extensions/gsd/guided-flow.ts +142 -134
  416. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  417. package/src/resources/extensions/gsd/init-wizard.ts +17 -2
  418. package/src/resources/extensions/gsd/journal.ts +8 -1
  419. package/src/resources/extensions/gsd/markdown-renderer.ts +14 -11
  420. package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
  421. package/src/resources/extensions/gsd/migrate/parsers.ts +139 -2
  422. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  423. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  424. package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
  425. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
  426. package/src/resources/extensions/gsd/paths.ts +5 -0
  427. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  428. package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
  429. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
  430. package/src/resources/extensions/gsd/pre-execution-checks.ts +67 -19
  431. package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
  432. package/src/resources/extensions/gsd/preferences-models.ts +6 -4
  433. package/src/resources/extensions/gsd/preferences-types.ts +35 -0
  434. package/src/resources/extensions/gsd/preferences-validation.ts +154 -0
  435. package/src/resources/extensions/gsd/preferences.ts +39 -0
  436. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  437. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  438. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  439. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  440. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  441. package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
  442. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  443. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  444. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  445. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  446. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  447. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  448. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  449. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  450. package/src/resources/extensions/gsd/repo-identity.ts +45 -25
  451. package/src/resources/extensions/gsd/repository-registry.ts +77 -0
  452. package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
  453. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
  454. package/src/resources/extensions/gsd/session-lock.ts +15 -2
  455. package/src/resources/extensions/gsd/slice-parallel-conflict.ts +2 -2
  456. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +75 -3
  457. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  458. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  459. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  460. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  461. package/src/resources/extensions/gsd/state.ts +33 -7
  462. package/src/resources/extensions/gsd/status-guards.ts +16 -2
  463. package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  464. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  465. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  466. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
  467. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +10 -1
  468. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  469. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  470. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +775 -34
  471. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +245 -28
  472. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  473. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  474. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  475. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +136 -13
  476. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +64 -0
  477. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
  478. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  479. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  480. package/src/resources/extensions/gsd/tests/auto-workers.test.ts +29 -0
  481. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  482. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
  483. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  484. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  485. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +170 -3
  486. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
  487. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  488. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  489. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +55 -2
  490. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +60 -9
  491. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  492. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +104 -2
  493. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  494. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  495. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
  496. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
  497. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +139 -1
  498. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
  499. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +140 -1
  500. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  501. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
  502. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
  503. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +99 -1
  504. package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +15 -1
  505. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  506. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
  507. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  508. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  509. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  510. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  511. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  512. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  513. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  514. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  515. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  516. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  517. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
  518. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +36 -1
  519. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +33 -1
  520. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  521. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +226 -2
  522. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +5 -21
  523. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +15 -0
  524. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  525. package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +40 -0
  526. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
  527. package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
  528. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
  529. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
  530. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  531. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +21 -40
  532. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +59 -1
  533. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  534. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +60 -0
  535. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
  536. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  537. package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
  538. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  539. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  540. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  541. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  542. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  543. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
  544. package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
  545. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  546. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
  547. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +8 -1
  548. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  549. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +147 -0
  550. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
  551. package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
  552. package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
  553. package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +148 -0
  554. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +79 -0
  555. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +42 -1
  556. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  557. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  558. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  559. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  560. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  561. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +28 -1
  562. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
  563. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  564. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +35 -0
  565. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +59 -1
  566. package/src/resources/extensions/gsd/tests/slice-parallel-conflict.test.ts +2 -2
  567. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +112 -1
  568. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  569. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +94 -2
  570. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  571. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  572. package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
  573. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  574. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
  575. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  576. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +22 -0
  577. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -0
  578. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +131 -9
  579. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
  580. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  581. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +68 -0
  582. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
  583. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +188 -1
  584. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  585. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  586. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  587. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  588. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +153 -1
  589. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  590. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  591. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +73 -2
  592. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
  593. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +90 -0
  594. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
  595. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +16 -0
  596. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
  597. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
  598. package/src/resources/extensions/gsd/tools/complete-milestone.ts +18 -10
  599. package/src/resources/extensions/gsd/tools/complete-slice.ts +57 -10
  600. package/src/resources/extensions/gsd/tools/exec-tool.ts +98 -5
  601. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  602. package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
  603. package/src/resources/extensions/gsd/tools/validate-milestone.ts +31 -0
  604. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +166 -17
  605. package/src/resources/extensions/gsd/tui/render-kit.ts +44 -0
  606. package/src/resources/extensions/gsd/types.ts +1 -1
  607. package/src/resources/extensions/gsd/unit-context-composer.ts +3 -0
  608. package/src/resources/extensions/gsd/unit-context-manifest.ts +86 -19
  609. package/src/resources/extensions/gsd/validation.ts +23 -1
  610. package/src/resources/extensions/gsd/verification-gate.ts +170 -6
  611. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  612. package/src/resources/extensions/gsd/watch/header-renderer.ts +35 -24
  613. package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
  614. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  615. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  616. package/src/resources/extensions/gsd/worktree-lifecycle.ts +98 -20
  617. package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
  618. package/src/resources/extensions/gsd/worktree-safety.ts +57 -10
  619. package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
  620. package/src/resources/extensions/gsd/worktree-telemetry.ts +39 -0
  621. package/src/resources/extensions/shared/html-shell.ts +412 -0
  622. package/src/resources/extensions/shared/interview-ui.ts +6 -4
  623. package/src/resources/extensions/shared/next-action-ui.ts +11 -5
  624. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
  625. package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +32 -0
  626. package/src/resources/extensions/subagent/index.ts +567 -103
  627. package/src/resources/extensions/subagent/launch.ts +131 -0
  628. package/src/resources/extensions/subagent/run-store.ts +218 -0
  629. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  630. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  631. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  632. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  633. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  634. package/src/resources/extensions/visual-brief/index.ts +8 -0
  635. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  636. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  637. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  638. package/src/resources/skills/forensics/SKILL.md +1 -1
  639. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  640. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  641. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  642. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  643. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +0 -1
  644. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  645. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  646. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  647. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  648. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  649. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  650. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  651. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  652. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → w_ikFkx_-OHxisG9xjz4u}/_buildManifest.js +0 -0
  653. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → w_ikFkx_-OHxisG9xjz4u}/_ssgManifest.js +0 -0
@@ -15,7 +15,7 @@
15
15
  export function crossReferenceEvidence(claimedEvidence, actualEvidence) {
16
16
  const bashCalls = actualEvidence.filter((e) => e.kind === "bash");
17
17
  const mismatches = [];
18
- for (const claimed of claimedEvidence) {
18
+ for (const claimed of latestClaimBatch(claimedEvidence)) {
19
19
  // Skip coerced entries — they're already flagged with exitCode: -1
20
20
  // and verdict: "unknown (coerced from string)" by db-tools.ts
21
21
  if (claimed.verdict?.includes("coerced from string"))
@@ -25,9 +25,11 @@ export function crossReferenceEvidence(claimedEvidence, actualEvidence) {
25
25
  // Skip entries with empty or generic commands
26
26
  if (!claimed.command || claimed.command.length < 3)
27
27
  continue;
28
- // Find matching bash call by command substring match
29
- const match = findBestMatch(claimed.command, bashCalls);
30
- if (!match) {
28
+ // Find matching bash calls by command similarity. A command may be retried
29
+ // after a failed first run; the newest matching execution is the one that
30
+ // supports or rejects a claimed pass.
31
+ const matches = findMatches(claimed.command, bashCalls);
32
+ if (matches.length === 0) {
31
33
  mismatches.push({
32
34
  severity: "warning",
33
35
  claimed,
@@ -37,6 +39,7 @@ export function crossReferenceEvidence(claimedEvidence, actualEvidence) {
37
39
  continue;
38
40
  }
39
41
  // Exit code mismatch: LLM claims success but actual command failed
42
+ const match = latestMatch(matches);
40
43
  if (claimed.exitCode === 0 && match.exitCode !== 0) {
41
44
  mismatches.push({
42
45
  severity: "error",
@@ -50,34 +53,55 @@ export function crossReferenceEvidence(claimedEvidence, actualEvidence) {
50
53
  }
51
54
  // ─── Internals ──────────────────────────────────────────────────────────────
52
55
  /**
53
- * Find the best matching bash evidence entry for a claimed command.
56
+ * Verification evidence rows are append-only across retries, but a task
57
+ * completion inserts one batch at a single created_at timestamp. When that
58
+ * timestamp is present, safety should judge the newest completion claim only.
59
+ */
60
+ function latestClaimBatch(claimedEvidence) {
61
+ const dated = claimedEvidence
62
+ .map((claim) => ({
63
+ claim,
64
+ time: typeof claim.createdAt === "string" ? Date.parse(claim.createdAt) : Number.NaN,
65
+ }))
66
+ .filter((entry) => Number.isFinite(entry.time));
67
+ if (dated.length === 0)
68
+ return claimedEvidence;
69
+ const latestTime = Math.max(...dated.map((entry) => entry.time));
70
+ return claimedEvidence.filter((claim) => (typeof claim.createdAt === "string" && Date.parse(claim.createdAt) === latestTime));
71
+ }
72
+ /**
73
+ * Find bash evidence entries matching a claimed command.
54
74
  * Uses substring matching — the claimed command may be a shortened version
55
75
  * of the actual command, or vice versa.
56
76
  */
57
- function findBestMatch(claimedCommand, bashCalls) {
77
+ function findMatches(claimedCommand, bashCalls) {
58
78
  const normalized = claimedCommand.trim();
59
- // Exact match first
60
- const exact = bashCalls.find(b => b.command.trim() === normalized);
61
- if (exact)
79
+ // Exact matches first
80
+ const exact = bashCalls.filter(b => b.command.trim() === normalized);
81
+ if (exact.length > 0)
62
82
  return exact;
63
83
  // Substring match: claimed is contained in actual or actual in claimed
64
- const substring = bashCalls.find(b => b.command.includes(normalized) || normalized.includes(b.command));
65
- if (substring)
84
+ const substring = bashCalls.filter(b => b.command.includes(normalized) || normalized.includes(b.command));
85
+ if (substring.length > 0)
66
86
  return substring;
67
87
  // Token match: split on whitespace and check significant overlap
68
88
  const claimedTokens = normalized.split(/\s+/).filter(t => t.length > 2);
69
89
  if (claimedTokens.length === 0)
70
- return null;
71
- let bestMatch = null;
72
- let bestScore = 0;
90
+ return [];
91
+ const scoredMatches = [];
73
92
  for (const call of bashCalls) {
74
93
  const callTokens = new Set(call.command.split(/\s+/));
75
94
  const matchCount = claimedTokens.filter(t => callTokens.has(t)).length;
76
95
  const score = matchCount / claimedTokens.length;
77
- if (score > bestScore && score >= 0.5) {
78
- bestScore = score;
79
- bestMatch = call;
96
+ if (score >= 0.5) {
97
+ scoredMatches.push({ call, score });
80
98
  }
81
99
  }
82
- return bestMatch;
100
+ const bestScore = Math.max(0, ...scoredMatches.map((match) => match.score));
101
+ return scoredMatches
102
+ .filter((match) => match.score === bestScore)
103
+ .map((match) => match.call);
104
+ }
105
+ function latestMatch(matches) {
106
+ return matches.reduce((latest, match) => (match.timestamp > latest.timestamp ? match : latest));
83
107
  }
@@ -18,8 +18,9 @@
18
18
  import { createRequire } from "node:module";
19
19
  import { existsSync, readFileSync, readdirSync, mkdirSync, unlinkSync, rmSync, statSync } from "node:fs";
20
20
  import { join, dirname } from "node:path";
21
- import { gsdRoot } from "./paths.js";
21
+ import { gsdRoot, normalizeRealPath } from "./paths.js";
22
22
  import { atomicWriteSync } from "./atomic-write.js";
23
+ import { markWorkerStoppingByPid } from "./db/auto-workers.js";
23
24
  const _require = createRequire(import.meta.url);
24
25
  // ─── Module State ───────────────────────────────────────────────────────────
25
26
  /** Release function from proper-lockfile — calling it releases the OS lock. */
@@ -225,6 +226,12 @@ export function acquireSessionLock(basePath) {
225
226
  mkdirSync(dirname(lp), { recursive: true });
226
227
  // Clean up numbered lock file variants from cloud sync conflicts (#1315)
227
228
  cleanupStrayLockFiles(basePath);
229
+ // If lock metadata points to a dead PID, mark that worker row stopping so
230
+ // crash diagnostics do not keep surfacing it as active.
231
+ const existingPreflight = readExistingLockData(lp);
232
+ if (existingPreflight?.pid && !isPidAlive(existingPreflight.pid)) {
233
+ markWorkerStoppingByPid(normalizeRealPath(basePath), existingPreflight.pid);
234
+ }
228
235
  // Write our lock data first (the content is informational; the OS lock is the real guard)
229
236
  const lockData = {
230
237
  pid: process.pid,
@@ -250,7 +257,10 @@ export function acquireSessionLock(basePath) {
250
257
  const lockDir = lockTarget + ".lock";
251
258
  if (existsSync(lockDir)) {
252
259
  const existingData = readExistingLockData(lp);
253
- const isOrphan = !existingData || (existingData.pid && !isPidAlive(existingData.pid));
260
+ const deadPid = existingData?.pid && !isPidAlive(existingData.pid) ? existingData.pid : null;
261
+ if (deadPid)
262
+ markWorkerStoppingByPid(normalizeRealPath(basePath), deadPid);
263
+ const isOrphan = !existingData || !!deadPid;
254
264
  if (isOrphan) {
255
265
  try {
256
266
  rmSync(lockDir, { recursive: true, force: true });
@@ -288,6 +298,9 @@ export function acquireSessionLock(basePath) {
288
298
  // Check: if auto.lock is gone and no process is alive, the lock dir is stale.
289
299
  const existingData = readExistingLockData(lp);
290
300
  const existingPid = existingData?.pid;
301
+ if (existingPid && !isPidAlive(existingPid)) {
302
+ markWorkerStoppingByPid(normalizeRealPath(basePath), existingPid);
303
+ }
291
304
  // If no lock file or no alive process, try to clean up and re-acquire (#1245)
292
305
  if (!existingData || (existingPid && !isPidAlive(existingPid))) {
293
306
  try {
@@ -42,8 +42,8 @@ function extractFilePaths(content) {
42
42
  * @returns true if parallel is unsafe (>5 shared files or missing plan).
43
43
  */
44
44
  export function hasFileConflict(basePath, mid, sliceA, sliceB) {
45
- const planPathA = join(basePath, ".gsd", "milestones", mid, sliceA, "PLAN.md");
46
- const planPathB = join(basePath, ".gsd", "milestones", mid, sliceB, "PLAN.md");
45
+ const planPathA = join(basePath, ".gsd", "milestones", mid, "slices", sliceA, `${sliceA}-PLAN.md`);
46
+ const planPathB = join(basePath, ".gsd", "milestones", mid, "slices", sliceB, `${sliceB}-PLAN.md`);
47
47
  // Conservative: missing PLAN = block
48
48
  if (!existsSync(planPathA) || !existsSync(planPathB)) {
49
49
  return true;
@@ -14,8 +14,8 @@
14
14
  */
15
15
  import { execFileSync, spawn } from "node:child_process";
16
16
  import { randomUUID } from "node:crypto";
17
- import { appendFileSync, existsSync, writeFileSync, readFileSync, mkdirSync, renameSync, unlinkSync, } from "node:fs";
18
- import { join, dirname } from "node:path";
17
+ import { appendFileSync, existsSync, lstatSync, rmSync, writeFileSync, readFileSync, mkdirSync, renameSync, unlinkSync, } from "node:fs";
18
+ import { isAbsolute, join, dirname, resolve } from "node:path";
19
19
  import { fileURLToPath } from "node:url";
20
20
  import { gsdRoot } from "./paths.js";
21
21
  import { createWorktree, worktreePath, removeWorktree } from "./worktree-manager.js";
@@ -46,6 +46,44 @@ export function _buildSliceWorkerEnvForTest(basePath, milestoneId, sliceId, work
46
46
  GSD_SLICE_WORKER_TOKEN: workerToken,
47
47
  };
48
48
  }
49
+ function isValidSliceWorktreePath(basePath, wtPath) {
50
+ if (!existsSync(wtPath))
51
+ return false;
52
+ const gitPath = join(wtPath, ".git");
53
+ if (!existsSync(gitPath))
54
+ return false;
55
+ try {
56
+ if (!lstatSync(gitPath).isFile())
57
+ return false;
58
+ const content = readFileSync(gitPath, "utf8").trim();
59
+ if (!content.startsWith("gitdir: "))
60
+ return false;
61
+ const rawGitdir = content.slice("gitdir: ".length).trim();
62
+ if (!rawGitdir)
63
+ return false;
64
+ const resolvedGitdir = isAbsolute(rawGitdir) ? rawGitdir : resolve(wtPath, rawGitdir);
65
+ const expectedPrefix = join(basePath, ".git", "worktrees").replaceAll("\\", "/");
66
+ const normalized = resolvedGitdir.replaceAll("\\", "/");
67
+ return normalized === expectedPrefix || normalized.startsWith(`${expectedPrefix}/`);
68
+ }
69
+ catch {
70
+ return false;
71
+ }
72
+ }
73
+ function isWorkerPidAlive(pid) {
74
+ if (!Number.isFinite(pid) || pid <= 0)
75
+ return false;
76
+ try {
77
+ process.kill(pid, 0);
78
+ return true;
79
+ }
80
+ catch (err) {
81
+ const code = err?.code;
82
+ if (code === "ESRCH")
83
+ return false;
84
+ return true;
85
+ }
86
+ }
49
87
  function sliceStateFilePath(basePath) {
50
88
  return join(gsdRoot(basePath), SLICE_ORCHESTRATOR_STATE_FILE);
51
89
  }
@@ -242,8 +280,26 @@ export function restoreSliceState(basePath) {
242
280
  * crash followed by a fresh process is detectable. (Issue #4980 HIGH-8)
243
281
  */
244
282
  export function isSliceParallelActive(basePath) {
245
- if (sliceState?.active === true)
246
- return true;
283
+ const hasRunningWorkers = () => {
284
+ if (!sliceState)
285
+ return false;
286
+ for (const worker of sliceState.workers.values()) {
287
+ if (worker.state === "running") {
288
+ if (worker.process)
289
+ return true;
290
+ if (isRecoveredSliceWorkerAlive(worker))
291
+ return true;
292
+ }
293
+ }
294
+ return false;
295
+ };
296
+ if (sliceState?.active === true) {
297
+ if (hasRunningWorkers())
298
+ return true;
299
+ sliceState.active = false;
300
+ removeSliceStateFile(sliceState.basePath);
301
+ return false;
302
+ }
247
303
  if (!basePath)
248
304
  return false;
249
305
  const restored = restoreSliceState(basePath);
@@ -275,7 +331,11 @@ export function isSliceParallelActive(basePath) {
275
331
  cost: w.cost,
276
332
  });
277
333
  }
278
- return true;
334
+ if (hasRunningWorkers())
335
+ return true;
336
+ sliceState.active = false;
337
+ removeSliceStateFile(sliceState.basePath);
338
+ return false;
279
339
  }
280
340
  /**
281
341
  * Get current slice orchestrator state (read-only snapshot).
@@ -318,6 +378,9 @@ export async function startSliceParallel(basePath, milestoneId, eligibleSlices,
318
378
  const wtBranch = `slice/${milestoneId}/${slice.id}`;
319
379
  const wtName = `${milestoneId}-${slice.id}`;
320
380
  const wtPath = worktreePath(basePath, wtName);
381
+ if (existsSync(wtPath) && !isValidSliceWorktreePath(basePath, wtPath)) {
382
+ rmSync(wtPath, { recursive: true, force: true });
383
+ }
321
384
  if (!existsSync(wtPath)) {
322
385
  createWorktree(basePath, wtName, { branch: wtBranch });
323
386
  }
@@ -361,6 +424,22 @@ export async function startSliceParallel(basePath, milestoneId, eligibleSlices,
361
424
  catch { /* ignore cleanup failures */ }
362
425
  }
363
426
  }
427
+ // Guard: if workers died immediately, treat as failed start so callers
428
+ // don't exit auto-mode and re-dispatch in a rapid loop.
429
+ for (let i = started.length - 1; i >= 0; i--) {
430
+ const sid = started[i];
431
+ const worker = sliceState.workers.get(sid);
432
+ if (worker && isWorkerPidAlive(worker.pid))
433
+ continue;
434
+ started.splice(i, 1);
435
+ errors.push({ sid, error: "Worker exited immediately after spawn" });
436
+ sliceState.workers.delete(sid);
437
+ const wtName = `${milestoneId}-${sid}`;
438
+ try {
439
+ removeWorktree(basePath, wtName, { deleteBranch: true, force: true });
440
+ }
441
+ catch { /* ignore cleanup failures */ }
442
+ }
364
443
  // If nothing started, deactivate
365
444
  if (started.length === 0) {
366
445
  sliceState.active = false;
@@ -0,0 +1,36 @@
1
+ // GSD-2 — Smart entry routing decisions.
2
+ // Pure route selection for /gsd guided wizard choices.
3
+ export function resolveGuidedExecuteLaunchMode(isolationMode) {
4
+ return isolationMode === "worktree" ? "auto-step" : "guided-dispatch";
5
+ }
6
+ export function resolveActiveTaskChoiceRoute(input) {
7
+ if (input.choice === "auto") {
8
+ return {
9
+ kind: "auto-bootstrap",
10
+ verboseMode: false,
11
+ };
12
+ }
13
+ if (input.choice === "execute") {
14
+ if (resolveGuidedExecuteLaunchMode(input.isolationMode) === "auto-step") {
15
+ return {
16
+ kind: "auto-bootstrap",
17
+ verboseMode: false,
18
+ options: {
19
+ step: true,
20
+ milestoneLock: input.milestoneId,
21
+ },
22
+ };
23
+ }
24
+ return {
25
+ kind: "guided-dispatch",
26
+ unitType: "execute-task",
27
+ };
28
+ }
29
+ if (input.choice === "status") {
30
+ return { kind: "status" };
31
+ }
32
+ if (input.choice === "milestone_actions") {
33
+ return { kind: "milestone-actions" };
34
+ }
35
+ throw new Error(`Invalid ActiveTaskChoice: ${input.choice}`);
36
+ }
@@ -10,6 +10,7 @@ import { isAbsolute, join, resolve } from "node:path";
10
10
  import { getErrorMessage } from "../../error-utils.js";
11
11
  import { nativeAddPaths, nativeCheckoutTheirs, nativeCommit, nativeConflictFiles, nativeMergeAbort, nativeRebaseAbort, nativeResetHard, } from "../../native-git-bridge.js";
12
12
  import { logError, logWarning } from "../../workflow-logger.js";
13
+ import { isGsdWorktreePath } from "../../worktree-root.js";
13
14
  const SILENT_NOTIFY = () => { };
14
15
  function resolveGitDir(basePath) {
15
16
  try {
@@ -23,7 +24,11 @@ function resolveGitDir(basePath) {
23
24
  }
24
25
  }
25
26
  catch (err) {
26
- logWarning("recovery", `gitdir resolution failed: ${getErrorMessage(err)}`);
27
+ const message = getErrorMessage(err);
28
+ logWarning("recovery", `gitdir resolution failed: ${message}`);
29
+ if (isGsdWorktreePath(basePath)) {
30
+ throw new Error(`Worktree integrity failure: ${basePath} is not a valid git worktree (git rev-parse failed: ${message.split("\n")[0]}). Repair or recreate the worktree before retrying.`);
31
+ }
27
32
  }
28
33
  return join(basePath, ".git");
29
34
  }
@@ -1,12 +1,11 @@
1
1
  // Project/App: GSD-2
2
2
  // File Purpose: ADR-017 unregistered-milestone drift handler. Detects
3
3
  // milestones whose on-disk directory has meaningful content (ROADMAP/
4
- // CONTEXT/SUMMARY) but no DB row, then runs the markdown importer to
5
- // reconcile. PROJECT.md is the human-facing index the importer's source
6
- // of truth is the .gsd/milestones/ directory tree.
4
+ // CONTEXT/SUMMARY) but no DB row, then fails closed with an explicit recovery
5
+ // instruction. Markdown hierarchy import is reserved for operator-controlled
6
+ // migration/recovery commands, not automatic runtime reconciliation.
7
7
  import { existsSync } from "node:fs";
8
8
  import { getMilestone, isDbAvailable } from "../../gsd-db.js";
9
- import { migrateHierarchyToDb } from "../../md-importer.js";
10
9
  import { findMilestoneIds } from "../../milestone-ids.js";
11
10
  import { resolveMilestoneFile } from "../../paths.js";
12
11
  function milestoneHasContent(basePath, milestoneId) {
@@ -31,17 +30,13 @@ export function detectUnregisteredMilestoneDrift(_state, ctx) {
31
30
  return drifts;
32
31
  }
33
32
  /**
34
- * Repair: invoke the markdown importer. migrateHierarchyToDb walks the same
35
- * findMilestoneIds list the detector uses and INSERTs OR IGNOREs every
36
- * missing milestone (and its slices/tasks) idempotent under cap=2 retry.
37
- *
38
- * Note: even though we receive one record at a time, the importer is a
39
- * project-wide operation. Repeated invocation across multiple drift records
40
- * in the same pass is wasteful but safe; a future optimization could
41
- * coalesce by checking whether the importer has already run this pass.
33
+ * Repair intentionally fails closed. The project-root DB is authoritative at
34
+ * runtime; markdown-only milestones must be imported through an explicit
35
+ * migration/recovery command so operators opt into changing canonical state.
42
36
  */
43
- export function repairUnregisteredMilestone(_record, ctx) {
44
- migrateHierarchyToDb(ctx.basePath);
37
+ export function repairUnregisteredMilestone(record, _ctx) {
38
+ throw new Error(`Milestone ${record.milestoneId} exists only as markdown projection. ` +
39
+ "Runtime reconciliation will not import markdown into the authoritative DB; run explicit GSD recovery/migration if this markdown should repopulate the database.");
45
40
  }
46
41
  export const unregisteredMilestoneHandler = {
47
42
  kind: "unregistered-milestone",
@@ -1,14 +1,15 @@
1
1
  // Project/App: GSD-2
2
2
  // File Purpose: ADR-017 roadmap-divergence drift handler. Detects mismatches
3
- // between ROADMAP.md (parsed slice sequence + depends declarations) and the
4
- // DB slice rows for that milestone, then reconciles via the markdown
5
- // importer plus an explicit junction-table sync.
3
+ // between ROADMAP.md (parsed slice sequence, depends declarations, and
4
+ // checkboxes) and the DB slice rows for that milestone, then re-renders the
5
+ // ROADMAP projection from the authoritative DB rows.
6
6
  import { existsSync, readFileSync } from "node:fs";
7
- import { getMilestone, getMilestoneSlices, isDbAvailable, syncSliceDependencies, } from "../../gsd-db.js";
8
- import { migrateHierarchyToDb } from "../../md-importer.js";
7
+ import { getMilestone, getMilestoneSlices, isDbAvailable, } from "../../gsd-db.js";
8
+ import { renderRoadmapFromDb } from "../../markdown-renderer.js";
9
9
  import { findMilestoneIds } from "../../milestone-ids.js";
10
10
  import { parseRoadmap } from "../../parsers-legacy.js";
11
11
  import { resolveMilestoneFile } from "../../paths.js";
12
+ import { isClosedStatus } from "../../status-guards.js";
12
13
  function arraysEqual(a, b) {
13
14
  if (a.length !== b.length)
14
15
  return false;
@@ -30,8 +31,10 @@ function milestoneHasDivergence(basePath, milestoneId) {
30
31
  }
31
32
  const dbSlices = getMilestoneSlices(milestoneId);
32
33
  const dbSliceMap = new Map(dbSlices.map((s) => [s.id, s]));
34
+ const roadmapSliceIds = new Set();
33
35
  for (let i = 0; i < roadmap.slices.length; i++) {
34
36
  const roadmapSlice = roadmap.slices[i];
37
+ roadmapSliceIds.add(roadmapSlice.id);
35
38
  const expectedSequence = i + 1;
36
39
  const dbSlice = dbSliceMap.get(roadmapSlice.id);
37
40
  if (!dbSlice)
@@ -40,6 +43,12 @@ function milestoneHasDivergence(basePath, milestoneId) {
40
43
  return true;
41
44
  if (!arraysEqual(dbSlice.depends, roadmapSlice.depends))
42
45
  return true;
46
+ if (isClosedStatus(dbSlice.status) !== roadmapSlice.done)
47
+ return true;
48
+ }
49
+ for (const dbSlice of dbSlices) {
50
+ if (!roadmapSliceIds.has(dbSlice.id))
51
+ return true;
43
52
  }
44
53
  return false;
45
54
  }
@@ -59,26 +68,12 @@ export function detectRoadmapDivergenceDrift(_state, ctx) {
59
68
  return drifts;
60
69
  }
61
70
  /**
62
- * Repair a milestone's roadmap divergence:
63
- * 1. migrateHierarchyToDb upserts slice rows (sequence + depends JSON
64
- * update via ON CONFLICT DO UPDATE).
65
- * 2. syncSliceDependencies updates the junction table per slice — the
66
- * importer only writes the JSON column, not the relational view.
71
+ * Repair a milestone's roadmap divergence by regenerating the projection from
72
+ * DB rows. ROADMAP.md is a projection; runtime reconciliation must not import
73
+ * slice presence, sequence, dependencies, or checkbox state from markdown.
67
74
  */
68
- export function repairRoadmapDivergence(record, ctx) {
69
- migrateHierarchyToDb(ctx.basePath);
70
- const roadmapPath = resolveMilestoneFile(ctx.basePath, record.milestoneId, "ROADMAP");
71
- if (!roadmapPath || !existsSync(roadmapPath))
72
- return;
73
- try {
74
- const roadmap = parseRoadmap(readFileSync(roadmapPath, "utf-8"));
75
- for (const slice of roadmap.slices) {
76
- syncSliceDependencies(record.milestoneId, slice.id, slice.depends);
77
- }
78
- }
79
- catch {
80
- /* parse failure: detector will fire again next pass */
81
- }
75
+ export async function repairRoadmapDivergence(record, ctx) {
76
+ await renderRoadmapFromDb(ctx.basePath, record.milestoneId);
82
77
  }
83
78
  export const roadmapDivergenceHandler = {
84
79
  kind: "roadmap-divergence",
@@ -10,6 +10,7 @@ import { findMilestoneIds } from './milestone-ids.js';
10
10
  import { loadQueueOrder, sortByQueueOrder } from './queue-order.js';
11
11
  import { isClosedStatus, isDeferredStatus } from './status-guards.js';
12
12
  import { nativeBatchParseGsdFiles } from './native-parser-bridge.js';
13
+ import { autoHealSketchFlags } from './state-reconciliation/drift/sketch-flag.js';
13
14
  import { join, resolve } from 'path';
14
15
  import { existsSync, readdirSync } from 'node:fs';
15
16
  import { debugCount, debugTime } from './debug-logger.js';
@@ -232,7 +233,7 @@ export async function deriveState(basePath, opts) {
232
233
  // from ROADMAP.md, PLAN.md, SUMMARY.md, REQUIREMENTS.md, or flag files.
233
234
  if (isDbAvailable()) {
234
235
  const stopDbTimer = debugTime("derive-state-db");
235
- result = await deriveStateFromDb(basePath);
236
+ result = await deriveStateFromDb(basePath, opts?.projectRootForReads ?? basePath);
236
237
  stopDbTimer({ phase: result.phase, milestone: result.activeMilestone?.id });
237
238
  _telemetry.dbDeriveCount++;
238
239
  }
@@ -352,6 +353,12 @@ async function buildRegistryAndFindActive(basePath, milestones, completeMileston
352
353
  continue;
353
354
  }
354
355
  if (allSlicesDone) {
356
+ const validation = getLatestAssessmentByScope(m.id, "milestone-validation");
357
+ const verdict = typeof validation?.status === "string" ? validation.status : undefined;
358
+ if (verdict === "needs-attention") {
359
+ registry.push({ id: m.id, title, status: "parked", ...(deps.length > 0 ? { dependsOn: deps } : {}) });
360
+ continue;
361
+ }
355
362
  activeMilestone = { id: m.id, title };
356
363
  activeMilestoneSlices = slices;
357
364
  activeMilestoneFound = true;
@@ -460,7 +467,7 @@ async function handleAllSlicesDone(basePath, activeMilestone, registry, requirem
460
467
  recentDecisions: [],
461
468
  blockers: [
462
469
  `Milestone ${activeMilestone.id} validation verdict is needs-remediation but all slices are complete. ` +
463
- `Add remediation slices via gsd_reassess_roadmap or override the verdict manually.`,
470
+ `Add remediation slices via gsd_reassess_roadmap, or run \`/gsd verdict pass --rationale "..."\` to override.`,
464
471
  ],
465
472
  nextAction: `Resolve ${activeMilestone.id} remediation before proceeding.`,
466
473
  registry, requirements,
@@ -513,7 +520,7 @@ function checkReplanTrigger(basePath, milestoneId, sliceId) {
513
520
  const sliceRow = getSlice(milestoneId, sliceId);
514
521
  return !!sliceRow?.replan_triggered_at;
515
522
  }
516
- export async function deriveStateFromDb(basePath) {
523
+ export async function deriveStateFromDb(basePath, artifactReadRoot = basePath) {
517
524
  const requirements = getRequirementCounts();
518
525
  const allMilestones = getAllMilestones();
519
526
  const milestoneLock = process.env.GSD_PARALLEL_WORKER ? process.env.GSD_MILESTONE_LOCK : undefined;
@@ -580,7 +587,17 @@ export async function deriveStateFromDb(basePath) {
580
587
  progress: { milestones: milestoneProgress, slices: sliceProgress },
581
588
  };
582
589
  }
583
- const { activeSlice, activeSliceRow } = activeSliceContext;
590
+ const { activeSlice } = activeSliceContext;
591
+ let activeSliceRow = activeSliceContext.activeSliceRow;
592
+ // Heal stale sketch flags before honoring the DB-authoritative sketch gate.
593
+ // This recovers if PLAN.md exists but is_sketch was never flipped to 0.
594
+ if (activeMilestone?.id) {
595
+ autoHealSketchFlags(activeMilestone.id, (sid) => {
596
+ const planPath = resolveSliceFile(artifactReadRoot, activeMilestone.id, sid, "PLAN");
597
+ return planPath !== null && existsSync(planPath);
598
+ });
599
+ activeSliceRow = getSlice(activeMilestone.id, activeSlice.id);
600
+ }
584
601
  // ADR-011: DB slice metadata is authoritative for sketch refinement.
585
602
  // PLAN.md and preference flags are projections/configuration and are
586
603
  // deliberately not used to infer whether the slice itself is a sketch.
@@ -892,6 +909,10 @@ export async function _deriveStateImpl(basePath, opts) {
892
909
  const validationContent = validationFile ? await cachedLoadFile(validationFile) : null;
893
910
  const validationTerminal = validationContent ? isValidationTerminal(validationContent) : false;
894
911
  const verdict = validationContent ? extractVerdict(validationContent) : undefined;
912
+ if (verdict === "needs-attention") {
913
+ registry.push({ id: mid, title, status: "parked" });
914
+ continue;
915
+ }
895
916
  // needs-remediation is terminal but requires re-validation (#3596)
896
917
  const needsRevalidation = !validationTerminal || verdict === 'needs-remediation';
897
918
  if (summaryFile && await isTerminalMilestoneSummaryFile(summaryFile, cachedLoadFile)) {
@@ -911,7 +932,7 @@ export async function _deriveStateImpl(basePath, opts) {
911
932
  registry.push({ id: mid, title, status: 'pending' });
912
933
  }
913
934
  else if (!activeMilestoneFound) {
914
- // Terminal validation (pass/needs-attention) but no summary → completing-milestone
935
+ // Terminal passing validation but no summary → completing-milestone
915
936
  activeMilestone = { id: mid, title };
916
937
  activeRoadmap = roadmap;
917
938
  activeMilestoneFound = true;
@@ -1132,7 +1153,7 @@ export async function _deriveStateImpl(basePath, opts) {
1132
1153
  recentDecisions: [],
1133
1154
  blockers: [
1134
1155
  `Milestone ${activeMilestone.id} validation verdict is needs-remediation but all slices are complete. ` +
1135
- `Add remediation slices via gsd_reassess_roadmap or override the verdict manually.`,
1156
+ `Add remediation slices via gsd_reassess_roadmap, or run \`/gsd verdict pass --rationale "..."\` to override.`,
1136
1157
  ],
1137
1158
  nextAction: `Resolve ${activeMilestone.id} remediation before proceeding.`,
1138
1159
  registry,
@@ -1253,7 +1274,7 @@ export async function _deriveStateImpl(basePath, opts) {
1253
1274
  const summaryPath = resolveTaskFile(basePath, activeMilestone.id, activeSlice.id, t.id, "SUMMARY");
1254
1275
  if (summaryPath && existsSync(summaryPath)) {
1255
1276
  t.done = true;
1256
- logWarning("reconcile", `task ${activeMilestone.id}/${activeSlice.id}/${t.id} reconciled via SUMMARY on disk (#2514)`, { mid: activeMilestone.id, sid: activeSlice.id, tid: t.id });
1277
+ logWarning("reconcile", `task ${activeMilestone.id}/${activeSlice.id}/${t.id} reconciled via SUMMARY on disk`, { mid: activeMilestone.id, sid: activeSlice.id, tid: t.id });
1257
1278
  }
1258
1279
  }
1259
1280
  const taskProgress = {
@@ -2,14 +2,15 @@
2
2
  * Status predicates for GSD state-machine guards.
3
3
  *
4
4
  * The DB stores status as free-form strings. Three values indicate
5
- * "closed": "complete" (canonical), "done" (legacy / alias), and
5
+ * "closed": "complete" (canonical), "done" (legacy / alias),
6
+ * "closed" (legacy/imported), and
6
7
  * "skipped" (user-directed skip via rethink or backtrack).
7
8
  * Every inline `status === "complete" || status === "done"` should
8
9
  * use isClosedStatus() instead.
9
10
  */
10
11
  /** Returns true when a milestone, slice, or task status indicates closure. */
11
12
  export function isClosedStatus(status) {
12
- return status === "complete" || status === "done" || status === "skipped";
13
+ return status === "complete" || status === "done" || status === "skipped" || status === "closed";
13
14
  }
14
15
  /** Returns true when a slice status indicates it was deferred by a decision. */
15
16
  export function isDeferredStatus(status) {
@@ -22,3 +23,14 @@ export function isDeferredStatus(status) {
22
23
  export function isInactiveStatus(status) {
23
24
  return isClosedStatus(status) || isDeferredStatus(status);
24
25
  }
26
+ /** Returns true when a prior milestone should not block dispatch ordering. */
27
+ export function isSkippedForDispatch(status) {
28
+ return isClosedStatus(status) || status === "parked" || isDeferredStatus(status);
29
+ }
30
+ /**
31
+ * Returns true when a milestone is future/backlog work (not currently executing).
32
+ * Includes legacy/project-specific alias "planned" for compatibility.
33
+ */
34
+ export function isFutureMilestoneStatus(status) {
35
+ return status === "pending" || status === "queued" || status === "planned";
36
+ }
@@ -69,6 +69,7 @@ parallel:
69
69
  verification_commands: []
70
70
  verification_auto_fix:
71
71
  verification_max_retries:
72
+ per_unit_cost_cap_usd:
72
73
  notifications:
73
74
  enabled:
74
75
  on_complete:
@@ -99,11 +99,11 @@
99
99
  - "Improve UI"
100
100
 
101
101
  Each task should usually include:
102
- - Why: why this task exists / what part of the slice it closes
103
- - Files: the main files likely touched
104
- - Do: concrete implementation steps and important constraints
105
- - Verify: the command, test, or runtime check that proves it worked
106
- - Done when: a measurable acceptance condition
102
+ - description: why this task exists, concrete steps, and done-when acceptance
103
+ - files: JSON array of likely touched paths
104
+ - verify: the command, test, or runtime check that proves it worked
105
+ - inputs: JSON array of existing paths or prior task outputs this task consumes
106
+ - expectedOutput: JSON array of paths this task creates or overwrites
107
107
 
108
108
  Keep the checkbox line format exactly:
109
109
  - [ ] **T01: Title** `est:30m`
@@ -131,10 +131,14 @@
131
131
 
132
132
  Verify field rules:
133
133
  - MUST be a mechanically executable command: `npm test`, `grep -q "pattern" file`, `test -f path`
134
+ - MUST NOT use shell pipes, redirects, semicolons, backticks, command substitution, or output trimming
135
+ - MUST NOT use inline `node -e` assertions for verification; put assertions in a real test file and run it with `node --test` or a package test script
134
136
  - For content/document tasks: verify file existence, section count, YAML validity, or word count
135
137
  NOT exact phrasing, specific formulas, or "zero TBD" aspirational criteria
136
138
  - If no command can verify the output, write: "Manual review — file exists and is non-empty"
139
+ - BAD: `python3 -m pytest tests/ -q --tb=short 2>&1 | tail -5`
137
140
  - BAD: "Sections 3.1 and 3.2 exist with exact formulas. Zero TBD/TODO."
141
+ - GOOD: `python3 -m pytest tests/ -q --tb=short`
138
142
  - GOOD: `grep -c "^## " doc.md` returns >= 4 (4+ sections), `! grep -q "TBD\|TODO" doc.md`
139
143
 
140
144
  Integration closure rule: