gsd-pi 2.82.0-dev.ed17d078d → 3.0.0-dev.2e8b124f7

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 (580) 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/infra-errors.js +9 -3
  11. package/dist/resources/extensions/gsd/auto/loop.js +110 -37
  12. package/dist/resources/extensions/gsd/auto/orchestrator.js +13 -2
  13. package/dist/resources/extensions/gsd/auto/phases.js +104 -38
  14. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  15. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -1
  16. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
  17. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  18. package/dist/resources/extensions/gsd/auto-dashboard.js +66 -1
  19. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  20. package/dist/resources/extensions/gsd/auto-dispatch.js +71 -20
  21. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  22. package/dist/resources/extensions/gsd/auto-post-unit.js +278 -137
  23. package/dist/resources/extensions/gsd/auto-prompts.js +36 -10
  24. package/dist/resources/extensions/gsd/auto-recovery.js +79 -14
  25. package/dist/resources/extensions/gsd/auto-start.js +90 -14
  26. package/dist/resources/extensions/gsd/auto-timers.js +11 -3
  27. package/dist/resources/extensions/gsd/auto-verification.js +102 -34
  28. package/dist/resources/extensions/gsd/auto-worktree.js +178 -11
  29. package/dist/resources/extensions/gsd/auto.js +107 -54
  30. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +31 -7
  31. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -9
  32. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +5 -4
  33. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  34. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
  35. package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
  36. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  37. package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -0
  38. package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
  39. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  40. package/dist/resources/extensions/gsd/commands-handlers.js +2 -0
  41. package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
  42. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +10 -2
  43. package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
  44. package/dist/resources/extensions/gsd/crash-recovery.js +52 -7
  45. package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
  46. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  47. package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
  48. package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
  49. package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
  50. package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
  51. package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -0
  52. package/dist/resources/extensions/gsd/doctor-git-checks.js +46 -1
  53. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  54. package/dist/resources/extensions/gsd/doctor.js +2 -28
  55. package/dist/resources/extensions/gsd/export-html.js +27 -425
  56. package/dist/resources/extensions/gsd/forensics.js +10 -3
  57. package/dist/resources/extensions/gsd/git-service.js +138 -10
  58. package/dist/resources/extensions/gsd/gsd-db.js +76 -33
  59. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  60. package/dist/resources/extensions/gsd/guided-flow.js +110 -117
  61. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  62. package/dist/resources/extensions/gsd/init-wizard.js +17 -2
  63. package/dist/resources/extensions/gsd/markdown-renderer.js +14 -11
  64. package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
  65. package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
  66. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  67. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  68. package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
  69. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
  70. package/dist/resources/extensions/gsd/paths.js +4 -0
  71. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  72. package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
  73. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
  74. package/dist/resources/extensions/gsd/pre-execution-checks.js +38 -11
  75. package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
  76. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  77. package/dist/resources/extensions/gsd/preferences-validation.js +138 -0
  78. package/dist/resources/extensions/gsd/preferences.js +2 -0
  79. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  80. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  81. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  83. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  84. package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
  85. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  86. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  87. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  88. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  89. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  90. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  91. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  92. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  93. package/dist/resources/extensions/gsd/repository-registry.js +44 -0
  94. package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
  95. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
  96. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +59 -2
  97. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  98. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  99. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  100. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  101. package/dist/resources/extensions/gsd/state.js +14 -4
  102. package/dist/resources/extensions/gsd/status-guards.js +14 -2
  103. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  104. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  105. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -8
  106. package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
  107. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  108. package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
  109. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
  110. package/dist/resources/extensions/gsd/unit-context-composer.js +2 -0
  111. package/dist/resources/extensions/gsd/unit-context-manifest.js +69 -17
  112. package/dist/resources/extensions/gsd/validation.js +23 -1
  113. package/dist/resources/extensions/gsd/verification-gate.js +142 -7
  114. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  115. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  116. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  117. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  118. package/dist/resources/extensions/gsd/worktree-lifecycle.js +83 -19
  119. package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
  120. package/dist/resources/extensions/gsd/worktree-safety.js +33 -1
  121. package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
  122. package/dist/resources/extensions/shared/html-shell.js +388 -0
  123. package/dist/resources/extensions/shared/interview-ui.js +6 -4
  124. package/dist/resources/extensions/subagent/index.js +448 -78
  125. package/dist/resources/extensions/subagent/launch.js +77 -0
  126. package/dist/resources/extensions/subagent/run-store.js +148 -0
  127. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  128. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  129. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  130. package/dist/resources/extensions/visual-brief/index.js +5 -0
  131. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  132. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  133. package/dist/resources/skills/forensics/SKILL.md +1 -1
  134. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  135. package/dist/web/standalone/.next/BUILD_ID +1 -1
  136. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  137. package/dist/web/standalone/.next/build-manifest.json +3 -3
  138. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  139. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  140. package/dist/web/standalone/.next/required-server-files.json +1 -1
  141. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  143. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  151. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  154. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  155. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  156. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  157. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  158. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  159. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  160. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  161. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/index.html +1 -1
  164. package/dist/web/standalone/.next/server/app/index.rsc +4 -7
  165. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  166. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -7
  167. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  169. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  170. package/dist/web/standalone/.next/server/app/page.js +2 -2
  171. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  174. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  175. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  179. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  180. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  181. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  182. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  183. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  184. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  185. package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
  186. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  187. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  188. package/dist/web/standalone/server.js +1 -1
  189. package/package.json +4 -4
  190. package/packages/contracts/dist/rpc.test.js +7 -0
  191. package/packages/contracts/dist/rpc.test.js.map +1 -1
  192. package/packages/contracts/dist/workflow.d.ts +21 -0
  193. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  194. package/packages/contracts/dist/workflow.js +24 -0
  195. package/packages/contracts/dist/workflow.js.map +1 -1
  196. package/packages/contracts/src/rpc.test.ts +8 -0
  197. package/packages/contracts/src/workflow.ts +24 -0
  198. package/packages/daemon/package.json +2 -2
  199. package/packages/mcp-server/README.md +13 -4
  200. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  201. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  202. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  203. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  204. package/packages/mcp-server/package.json +2 -2
  205. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  206. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  207. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  208. package/packages/native/package.json +1 -1
  209. package/packages/native/tsconfig.json +2 -1
  210. package/packages/native/tsconfig.tsbuildinfo +1 -1
  211. package/packages/pi-agent-core/package.json +1 -1
  212. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  213. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  214. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  215. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  216. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  217. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  218. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  219. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  220. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  221. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  222. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  223. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  224. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  225. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  226. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  227. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  228. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  229. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  230. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  231. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  232. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  233. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  234. package/packages/pi-ai/package.json +1 -1
  235. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  236. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  237. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  238. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  239. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  240. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  241. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  242. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  243. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  244. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  245. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  246. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  247. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  248. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  249. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  250. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
  251. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  252. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
  253. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  254. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
  255. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  256. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  257. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  258. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +8 -2
  259. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  260. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  261. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  262. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  263. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  264. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  265. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  266. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +71 -97
  267. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  268. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
  269. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  270. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
  271. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  273. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  275. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  276. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  277. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  278. package/packages/pi-coding-agent/package.json +1 -1
  279. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  280. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  281. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  282. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
  283. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
  284. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  285. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +17 -1
  286. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  287. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
  288. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -102
  289. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
  290. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
  291. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  292. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  293. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  294. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  295. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  296. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  297. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  298. package/packages/pi-tui/dist/__tests__/tui.test.js +45 -2
  299. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  300. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  301. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  302. package/packages/pi-tui/dist/terminal.js +12 -0
  303. package/packages/pi-tui/dist/terminal.js.map +1 -1
  304. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  305. package/packages/pi-tui/dist/tui.js +106 -27
  306. package/packages/pi-tui/dist/tui.js.map +1 -1
  307. package/packages/pi-tui/package.json +1 -1
  308. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  309. package/packages/pi-tui/src/__tests__/tui.test.ts +59 -2
  310. package/packages/pi-tui/src/terminal.ts +11 -0
  311. package/packages/pi-tui/src/tui.ts +108 -27
  312. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  313. package/packages/rpc-client/package.json +1 -1
  314. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  315. package/pkg/package.json +1 -1
  316. package/src/resources/GSD-WORKFLOW.md +10 -1
  317. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  318. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
  319. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  320. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
  321. package/src/resources/extensions/cmux/index.ts +6 -0
  322. package/src/resources/extensions/gsd/auto/contracts.ts +17 -6
  323. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  324. package/src/resources/extensions/gsd/auto/loop.ts +111 -38
  325. package/src/resources/extensions/gsd/auto/orchestrator.ts +13 -2
  326. package/src/resources/extensions/gsd/auto/phases.ts +127 -49
  327. package/src/resources/extensions/gsd/auto/session.ts +16 -0
  328. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  329. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +6 -2
  330. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  331. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  332. package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
  333. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  334. package/src/resources/extensions/gsd/auto-dispatch.ts +74 -20
  335. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  336. package/src/resources/extensions/gsd/auto-post-unit.ts +312 -148
  337. package/src/resources/extensions/gsd/auto-prompts.ts +36 -13
  338. package/src/resources/extensions/gsd/auto-recovery.ts +83 -11
  339. package/src/resources/extensions/gsd/auto-start.ts +99 -12
  340. package/src/resources/extensions/gsd/auto-timers.ts +10 -3
  341. package/src/resources/extensions/gsd/auto-verification.ts +124 -42
  342. package/src/resources/extensions/gsd/auto-worktree.ts +195 -11
  343. package/src/resources/extensions/gsd/auto.ts +100 -42
  344. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +42 -7
  345. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -9
  346. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +5 -4
  347. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  348. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
  349. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  350. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  351. package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -0
  352. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  353. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  354. package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
  355. package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
  356. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +11 -3
  357. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  358. package/src/resources/extensions/gsd/crash-recovery.ts +52 -6
  359. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  360. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  361. package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
  362. package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
  363. package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
  364. package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
  365. package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -0
  366. package/src/resources/extensions/gsd/doctor-git-checks.ts +45 -1
  367. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  368. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  369. package/src/resources/extensions/gsd/doctor.ts +2 -27
  370. package/src/resources/extensions/gsd/export-html.ts +27 -427
  371. package/src/resources/extensions/gsd/forensics.ts +9 -3
  372. package/src/resources/extensions/gsd/git-service.ts +166 -11
  373. package/src/resources/extensions/gsd/gsd-db.ts +80 -31
  374. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  375. package/src/resources/extensions/gsd/guided-flow.ts +142 -134
  376. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  377. package/src/resources/extensions/gsd/init-wizard.ts +17 -2
  378. package/src/resources/extensions/gsd/journal.ts +8 -1
  379. package/src/resources/extensions/gsd/markdown-renderer.ts +14 -11
  380. package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
  381. package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
  382. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  383. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  384. package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
  385. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
  386. package/src/resources/extensions/gsd/paths.ts +5 -0
  387. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  388. package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
  389. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
  390. package/src/resources/extensions/gsd/pre-execution-checks.ts +49 -11
  391. package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
  392. package/src/resources/extensions/gsd/preferences-types.ts +33 -0
  393. package/src/resources/extensions/gsd/preferences-validation.ts +145 -0
  394. package/src/resources/extensions/gsd/preferences.ts +5 -0
  395. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  396. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  397. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  398. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  399. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  400. package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
  401. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  402. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  403. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  404. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  405. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  406. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  407. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  408. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  409. package/src/resources/extensions/gsd/repository-registry.ts +77 -0
  410. package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
  411. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
  412. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +52 -1
  413. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  414. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  415. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  416. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  417. package/src/resources/extensions/gsd/state.ts +15 -4
  418. package/src/resources/extensions/gsd/status-guards.ts +16 -2
  419. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  420. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  421. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +10 -1
  422. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  423. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  424. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +300 -1
  425. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +197 -11
  426. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  427. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  428. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  429. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +129 -6
  430. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
  431. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  432. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  433. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  434. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
  435. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  436. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  437. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  438. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
  439. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  440. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  441. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
  442. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +5 -9
  443. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  444. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +104 -2
  445. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  446. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  447. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
  448. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
  449. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +111 -1
  450. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
  451. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  452. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
  453. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
  454. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  455. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
  456. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  457. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  458. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  459. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  460. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  461. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  462. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  463. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  464. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  465. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  466. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
  467. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  468. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +199 -2
  469. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  470. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
  471. package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
  472. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
  473. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
  474. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  475. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
  476. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  477. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
  478. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  479. package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
  480. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  481. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  482. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  483. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  484. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  485. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
  486. package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
  487. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  488. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
  489. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
  490. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  491. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +59 -0
  492. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
  493. package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
  494. package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
  495. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +78 -0
  496. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  497. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  498. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  499. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  500. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  501. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
  502. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  503. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +21 -1
  504. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +72 -1
  505. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  506. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +86 -2
  507. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  508. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  509. package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
  510. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  511. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
  512. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  513. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -0
  514. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +131 -9
  515. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
  516. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  517. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
  518. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +173 -1
  519. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  520. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  521. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  522. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  523. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1 -1
  524. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  525. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  526. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +57 -2
  527. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
  528. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +46 -0
  529. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
  530. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
  531. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
  532. package/src/resources/extensions/gsd/tools/complete-milestone.ts +8 -10
  533. package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
  534. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  535. package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
  536. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
  537. package/src/resources/extensions/gsd/types.ts +1 -1
  538. package/src/resources/extensions/gsd/unit-context-composer.ts +3 -0
  539. package/src/resources/extensions/gsd/unit-context-manifest.ts +86 -19
  540. package/src/resources/extensions/gsd/validation.ts +23 -1
  541. package/src/resources/extensions/gsd/verification-gate.ts +170 -6
  542. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  543. package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
  544. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  545. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  546. package/src/resources/extensions/gsd/worktree-lifecycle.ts +93 -20
  547. package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
  548. package/src/resources/extensions/gsd/worktree-safety.ts +45 -6
  549. package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
  550. package/src/resources/extensions/shared/html-shell.ts +412 -0
  551. package/src/resources/extensions/shared/interview-ui.ts +6 -4
  552. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
  553. package/src/resources/extensions/subagent/index.ts +567 -103
  554. package/src/resources/extensions/subagent/launch.ts +131 -0
  555. package/src/resources/extensions/subagent/run-store.ts +218 -0
  556. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  557. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  558. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  559. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  560. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  561. package/src/resources/extensions/visual-brief/index.ts +8 -0
  562. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  563. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  564. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  565. package/src/resources/skills/forensics/SKILL.md +1 -1
  566. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  567. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  568. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  569. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  570. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +0 -1
  571. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  572. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  573. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  574. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  575. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  576. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  577. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  578. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  579. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → zCegwxH2e6vLp1vEZLLuZ}/_buildManifest.js +0 -0
  580. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → zCegwxH2e6vLp1vEZLLuZ}/_ssgManifest.js +0 -0
@@ -6,7 +6,7 @@ import { mkdirSync, mkdtempSync, realpathSync, rmSync, writeFileSync } from "nod
6
6
  import { tmpdir } from "node:os";
7
7
  import { join } from "node:path";
8
8
 
9
- import { cleanupAfterLoopExit, rerootCommandSession, stopAuto } from "../auto.ts";
9
+ import { cleanupAfterLoopExit, pauseAuto, rerootCommandSession, stopAuto } from "../auto.ts";
10
10
  import { autoSession } from "../auto-runtime-state.ts";
11
11
  import { closeDatabase, insertMilestone, insertSlice, openDatabase } from "../gsd-db.ts";
12
12
  import { WorktreeLifecycle } from "../worktree-lifecycle.ts";
@@ -43,7 +43,53 @@ test("cleanupAfterLoopExit preserves paused auto badge after provider pause", as
43
43
  }
44
44
  });
45
45
 
46
- test("cleanupAfterLoopExit clears status without replacing the last auto surface", async () => {
46
+ test("cleanupAfterLoopExit preserves paused worktree session and visible failure output", async (t) => {
47
+ const base = mkdtempSync(join(tmpdir(), "gsd-paused-session-preserve-"));
48
+ const worktree = join(base, ".gsd", "worktrees", "M001");
49
+ const previousCwd = process.cwd();
50
+ const newSessionWorkspaces: string[] = [];
51
+ let restoreCalls = 0;
52
+
53
+ t.mock.method(WorktreeLifecycle.prototype, "restoreToProjectRoot", function () {
54
+ restoreCalls += 1;
55
+ });
56
+
57
+ mkdirSync(worktree, { recursive: true });
58
+ process.chdir(worktree);
59
+ autoSession.reset();
60
+ autoSession.active = true;
61
+ autoSession.paused = true;
62
+ autoSession.basePath = worktree;
63
+ autoSession.originalBasePath = base;
64
+ autoSession.cmdCtx = {
65
+ newSession: async ({ workspaceRoot }: { workspaceRoot: string }) => {
66
+ newSessionWorkspaces.push(workspaceRoot);
67
+ return { cancelled: false };
68
+ },
69
+ } as any;
70
+
71
+ try {
72
+ await cleanupAfterLoopExit({
73
+ ui: {
74
+ setStatus: () => {},
75
+ setWidget: () => {},
76
+ notify: () => {},
77
+ },
78
+ } as any);
79
+
80
+ assert.equal(restoreCalls, 0, "paused cleanup must not restore out of the active worktree");
81
+ assert.deepEqual(newSessionWorkspaces, [], "paused cleanup must not start a blank rerooted session");
82
+ assert.equal(autoSession.basePath, worktree);
83
+ assert.equal(realpathSync(process.cwd()), realpathSync(worktree));
84
+ assert.equal(autoSession.paused, true);
85
+ } finally {
86
+ autoSession.reset();
87
+ process.chdir(previousCwd);
88
+ rmSync(base, { recursive: true, force: true });
89
+ }
90
+ });
91
+
92
+ test("cleanupAfterLoopExit clears status and progress widget without replacing outcome surface", async () => {
47
93
  const statusCalls: unknown[] = [];
48
94
  const widgetCalls: unknown[] = [];
49
95
 
@@ -64,8 +110,8 @@ test("cleanupAfterLoopExit clears status without replacing the last auto surface
64
110
  assert.deepEqual(statusCalls, [["gsd-auto", undefined]]);
65
111
  assert.equal(
66
112
  widgetCalls.some((args) => Array.isArray(args) && args[0] === "gsd-progress" && args[1] === undefined),
67
- false,
68
- "cleanup must not clear the last meaningful auto progress surface",
113
+ true,
114
+ "cleanup must clear the stale auto progress widget",
69
115
  );
70
116
  assert.equal(
71
117
  widgetCalls.some((args) => Array.isArray(args) && args[0] === "gsd-outcome"),
@@ -79,7 +125,7 @@ test("cleanupAfterLoopExit clears status without replacing the last auto surface
79
125
  }
80
126
  });
81
127
 
82
- test("cleanupAfterLoopExit preserves completion roll-up after stopAuto reset", async () => {
128
+ test("cleanupAfterLoopExit clears progress widget after stopAuto reset", async () => {
83
129
  const statusCalls: unknown[] = [];
84
130
  const widgetCalls: unknown[] = [];
85
131
 
@@ -103,8 +149,8 @@ test("cleanupAfterLoopExit preserves completion roll-up after stopAuto reset", a
103
149
  assert.deepEqual(statusCalls, [["gsd-auto", undefined]]);
104
150
  assert.equal(
105
151
  widgetCalls.some((args) => Array.isArray(args) && args[0] === "gsd-progress" && args[1] === undefined),
106
- false,
107
- "completion cleanup must not clear the roll-up progress widget",
152
+ true,
153
+ "completion cleanup must clear the stale progress widget",
108
154
  );
109
155
  assert.equal(
110
156
  widgetCalls.some((args) => Array.isArray(args) && args[0] === "gsd-outcome"),
@@ -117,6 +163,98 @@ test("cleanupAfterLoopExit preserves completion roll-up after stopAuto reset", a
117
163
  }
118
164
  });
119
165
 
166
+ test("pauseAuto preserves artifact retry counts across pause/resume", async () => {
167
+ const base = mkdtempSync(join(tmpdir(), "gsd-pause-retry-count-"));
168
+ const previousCwd = process.cwd();
169
+ const retryKey = "execute-task:M001/S01/T01";
170
+
171
+ autoSession.reset();
172
+ autoSession.active = true;
173
+ autoSession.verificationRetryCount.set(retryKey, 2);
174
+ autoSession.pendingVerificationRetry = {
175
+ unitId: "M001/S01/T01",
176
+ failureContext: "Missing expected artifact (attempt 2/3).",
177
+ attempt: 2,
178
+ };
179
+
180
+ try {
181
+ process.chdir(base);
182
+ await pauseAuto();
183
+
184
+ assert.equal(autoSession.paused, true);
185
+ assert.equal(autoSession.pendingVerificationRetry, null);
186
+ assert.equal(autoSession.verificationRetryCount.get(retryKey), 2);
187
+ } finally {
188
+ autoSession.reset();
189
+ process.chdir(previousCwd);
190
+ rmSync(base, { recursive: true, force: true });
191
+ }
192
+ });
193
+
194
+ test("cleanupAfterLoopExit preserves step-mode surface and worktree session after completed step", async (t) => {
195
+ const base = mkdtempSync(join(tmpdir(), "gsd-step-surface-"));
196
+ const worktree = join(base, ".gsd", "worktrees", "M001");
197
+ const previousCwd = process.cwd();
198
+ const statusCalls: unknown[] = [];
199
+ const widgetCalls: unknown[] = [];
200
+ const newSessionWorkspaces: string[] = [];
201
+ let restoreCalls = 0;
202
+
203
+ t.mock.method(WorktreeLifecycle.prototype, "restoreToProjectRoot", function () {
204
+ restoreCalls += 1;
205
+ });
206
+
207
+ mkdirSync(worktree, { recursive: true });
208
+ process.chdir(worktree);
209
+ autoSession.reset();
210
+ autoSession.active = true;
211
+ autoSession.paused = false;
212
+ autoSession.stepMode = true;
213
+ autoSession.preserveStepSurfaceAfterLoopExit = true;
214
+ autoSession.basePath = worktree;
215
+ autoSession.originalBasePath = base;
216
+ autoSession.cmdCtx = {
217
+ newSession: async ({ workspaceRoot }: { workspaceRoot: string }) => {
218
+ newSessionWorkspaces.push(workspaceRoot);
219
+ return { cancelled: false };
220
+ },
221
+ } as any;
222
+
223
+ try {
224
+ await cleanupAfterLoopExit({
225
+ hasUI: true,
226
+ ui: {
227
+ setStatus: (...args: unknown[]) => statusCalls.push(args),
228
+ setWidget: (...args: unknown[]) => widgetCalls.push(args),
229
+ setHeader: () => {},
230
+ notify: () => {},
231
+ },
232
+ } as any);
233
+
234
+ assert.deepEqual(statusCalls, [], "step-mode cleanup must leave the NEXT badge visible");
235
+ assert.equal(
236
+ widgetCalls.some((args) => Array.isArray(args) && args[0] === "gsd-progress" && args[1] === undefined),
237
+ false,
238
+ "step-mode cleanup must not clear the completed step progress surface",
239
+ );
240
+ assert.equal(
241
+ widgetCalls.some((args) => Array.isArray(args) && args[0] === "gsd-health"),
242
+ false,
243
+ "step-mode cleanup must not replace the progress surface with idle health",
244
+ );
245
+ assert.deepEqual(newSessionWorkspaces, [], "step-mode cleanup must not re-root the visible command session");
246
+ assert.equal(restoreCalls, 0, "step-mode cleanup must not restore out of the active worktree");
247
+ assert.equal(autoSession.active, false);
248
+ assert.equal(autoSession.preserveStepSurfaceAfterLoopExit, false);
249
+ assert.equal(autoSession.basePath, worktree);
250
+ assert.equal(realpathSync(process.cwd()), realpathSync(worktree));
251
+ } finally {
252
+ autoSession.reset();
253
+ process.chdir(previousCwd);
254
+ rmSync(base, { recursive: true, force: true });
255
+ }
256
+ });
257
+
120
258
  test("cleanupAfterLoopExit restores project root through lifecycle and preserves chdir", async (t) => {
121
259
  const base = mkdtempSync(join(tmpdir(), "gsd-cleanup-lifecycle-"));
122
260
  const worktree = join(base, ".gsd", "worktrees", "M001");
@@ -159,14 +297,15 @@ test("cleanupAfterLoopExit keeps cleanup best-effort when lifecycle restore thro
159
297
  const previousCwd = process.cwd();
160
298
  let restoreCalls = 0;
161
299
  // ADR-016 phase 3 (#5693): the real `restoreToProjectRoot` assigns
162
- // `s.basePath = s.originalBasePath` BEFORE any throwable work
300
+ // `s.basePath = s.originalBasePath` AND chdir's BEFORE any throwable work
163
301
  // (rebuildGitService, cache invalidation). Mirror that ordering in the
164
- // mock so the throw scenario reflects production: basePath is restored
165
- // even when the verb throws partway through.
302
+ // mock so the throw scenario reflects production: basePath and cwd are
303
+ // restored even when the verb throws partway through.
166
304
  t.mock.method(WorktreeLifecycle.prototype, "restoreToProjectRoot", function (this: WorktreeLifecycle) {
167
305
  restoreCalls += 1;
168
- (this as unknown as { s: { basePath: string; originalBasePath: string } })
169
- .s.basePath = (this as unknown as { s: { originalBasePath: string } }).s.originalBasePath;
306
+ const sRef = this as unknown as { s: { basePath: string; originalBasePath: string } };
307
+ sRef.s.basePath = sRef.s.originalBasePath;
308
+ try { process.chdir(sRef.s.basePath); } catch { /* mirror real verb's best-effort */ }
170
309
  throw new Error("restore failed");
171
310
  });
172
311
 
@@ -62,7 +62,11 @@ async function runSuccessfulFinalize(s: AutoSession) {
62
62
  );
63
63
  }
64
64
 
65
- async function runFinalizeWithDeps(s: AutoSession, depsOverrides: Record<string, unknown>) {
65
+ async function runFinalizeWithDeps(
66
+ s: AutoSession,
67
+ depsOverrides: Record<string, unknown>,
68
+ ctxOverride?: Record<string, unknown>,
69
+ ) {
66
70
  const unit = s.currentUnit;
67
71
  assert.ok(unit, "test setup must provide currentUnit");
68
72
 
@@ -86,7 +90,7 @@ async function runFinalizeWithDeps(s: AutoSession, depsOverrides: Record<string,
86
90
 
87
91
  return runFinalize(
88
92
  {
89
- ctx: { ui: { notify() {} } },
93
+ ctx: ctxOverride ?? { ui: { notify() {} } },
90
94
  pi: {},
91
95
  s,
92
96
  deps,
@@ -223,3 +227,50 @@ test("runFinalize merges a verified complete-milestone immediately and only once
223
227
  assert.equal(lifecycleMergeCalls, 1);
224
228
  assert.equal(resolverMergeCalls, 0);
225
229
  });
230
+
231
+ test("runFinalize does not render next-phase handoff for complete-milestone", async (t) => {
232
+ const base = mkdtempSync(join(tmpdir(), "gsd-finalize-complete-handoff-"));
233
+ t.after(() => {
234
+ rmSync(base, { recursive: true, force: true });
235
+ });
236
+
237
+ const s = new AutoSession();
238
+ const widgetCalls: Array<[string, unknown]> = [];
239
+ s.basePath = base;
240
+ s.originalBasePath = base;
241
+ s.currentMilestoneId = "M001";
242
+ s.currentUnit = {
243
+ type: "complete-milestone",
244
+ id: "M001",
245
+ startedAt: Date.now(),
246
+ };
247
+
248
+ const result = await runFinalizeWithDeps(
249
+ s,
250
+ {
251
+ preflightCleanRoot: () => ({ stashPushed: false }),
252
+ postflightPopStash: () => ({ needsManualRecovery: false }),
253
+ lifecycle: {
254
+ exitMilestone() {
255
+ return { ok: true, merged: true, codeFilesChanged: false };
256
+ },
257
+ },
258
+ },
259
+ {
260
+ hasUI: true,
261
+ ui: {
262
+ notify() {},
263
+ setWidget(key: string, value: unknown) {
264
+ widgetCalls.push([key, value]);
265
+ },
266
+ },
267
+ },
268
+ );
269
+
270
+ assert.equal(result.action, "next");
271
+ assert.equal(
272
+ widgetCalls.some(([key]) => key === "gsd-outcome"),
273
+ false,
274
+ "complete-milestone finalize should leave terminal completion UI to stopAuto",
275
+ );
276
+ });
@@ -1,9 +1,14 @@
1
- // GSD-2 — Tests for step-mode completion messages in auto-post-unit
1
+ // Project/App: GSD-2
2
+ // File Purpose: Tests for step-mode completion messages in auto-post-unit.
2
3
 
3
4
  import test from "node:test";
4
5
  import assert from "node:assert/strict";
5
6
 
6
- import { buildStepCompleteMessage, STEP_COMPLETE_FALLBACK_MESSAGE } from "../auto-post-unit.ts";
7
+ import {
8
+ buildStepCompleteMessage,
9
+ shouldReturnStepWizardAfterUnit,
10
+ STEP_COMPLETE_FALLBACK_MESSAGE,
11
+ } from "../auto-post-unit.ts";
7
12
  import type { GSDState } from "../types.ts";
8
13
 
9
14
  function makeState(overrides: Partial<GSDState>): GSDState {
@@ -27,7 +32,7 @@ test("buildStepCompleteMessage: milestone complete surfaces review guidance", ()
27
32
  assert.doesNotMatch(msg, /Next:/);
28
33
  });
29
34
 
30
- test("buildStepCompleteMessage: mid-flight step includes next unit label and /clear hint", () => {
35
+ test("buildStepCompleteMessage: mid-flight step includes next unit label and /gsd next hint", () => {
31
36
  const state = makeState({
32
37
  phase: "executing",
33
38
  activeSlice: { id: "S01", title: "Core" },
@@ -36,7 +41,7 @@ test("buildStepCompleteMessage: mid-flight step includes next unit label and /cl
36
41
  const msg = buildStepCompleteMessage(state);
37
42
  assert.match(msg, /Next: Execute T03: Wire notify/);
38
43
  assert.match(msg, /\/clear/);
39
- assert.match(msg, /\/gsd to continue/);
44
+ assert.match(msg, /\/gsd next to continue one step/);
40
45
  });
41
46
 
42
47
  test("buildStepCompleteMessage: unknown phase falls back to generic continue label", () => {
@@ -47,7 +52,14 @@ test("buildStepCompleteMessage: unknown phase falls back to generic continue lab
47
52
  assert.match(msg, /\/clear/);
48
53
  });
49
54
 
50
- test("STEP_COMPLETE_FALLBACK_MESSAGE: used when deriveState throws, still points users at /clear + /gsd", () => {
55
+ test("STEP_COMPLETE_FALLBACK_MESSAGE: used when deriveState throws, still points users at /clear + /gsd next", () => {
51
56
  assert.match(STEP_COMPLETE_FALLBACK_MESSAGE, /\/clear/);
52
- assert.match(STEP_COMPLETE_FALLBACK_MESSAGE, /\/gsd/);
57
+ assert.match(STEP_COMPLETE_FALLBACK_MESSAGE, /\/gsd next/);
58
+ });
59
+
60
+ test("shouldReturnStepWizardAfterUnit: terminal milestone completion continues to merge-back path", () => {
61
+ assert.equal(shouldReturnStepWizardAfterUnit("complete-milestone", "complete"), false);
62
+ assert.equal(shouldReturnStepWizardAfterUnit("complete-milestone", null), false);
63
+ assert.equal(shouldReturnStepWizardAfterUnit("execute-task", "complete"), false);
64
+ assert.equal(shouldReturnStepWizardAfterUnit("execute-task", "executing"), true);
53
65
  });
@@ -5,7 +5,7 @@ import { join } from "node:path";
5
5
  import { tmpdir } from "node:os";
6
6
  import { randomUUID } from "node:crypto";
7
7
 
8
- import { verifyExpectedArtifact, hasImplementationArtifacts, resolveExpectedArtifactPath, diagnoseExpectedArtifact, buildLoopRemediationSteps, writeBlockerPlaceholder, refreshRecoveryDbForArtifact } from "../auto-recovery.ts";
8
+ import { verifyExpectedArtifact, hasImplementationArtifacts, resolveExpectedArtifactPath, diagnoseExpectedArtifact, diagnoseWorktreeIntegrityFailure, buildLoopRemediationSteps, writeBlockerPlaceholder, refreshRecoveryDbForArtifact } from "../auto-recovery.ts";
9
9
  import { resolveMilestoneFile } from "../paths.ts";
10
10
  import { openDatabase, closeDatabase, insertMilestone, insertSlice, insertGateRow, insertTask, getMilestoneCommitAttributionShas } from "../gsd-db.ts";
11
11
  import { clearParseCache } from "../files.ts";
@@ -141,6 +141,20 @@ test("resolveExpectedArtifactPath returns null for unknown type", () => {
141
141
  }
142
142
  });
143
143
 
144
+ test("diagnoseWorktreeIntegrityFailure reports missing GSD worktree paths only", () => {
145
+ const missingWorktreePath = join(tmpdir(), `gsd-test-${randomUUID()}`, ".gsd", "worktrees", "M001-S01");
146
+ assert.equal(
147
+ diagnoseWorktreeIntegrityFailure(join(tmpdir(), `gsd-test-${randomUUID()}`)),
148
+ null,
149
+ "non-GSD paths should keep falling through to artifact recovery",
150
+ );
151
+ assert.equal(
152
+ diagnoseWorktreeIntegrityFailure(missingWorktreePath),
153
+ `Worktree integrity failure: ${missingWorktreePath} does not exist. Repair or recreate the worktree before retrying.`,
154
+ "missing GSD worktree paths should fail terminally before artifact retry",
155
+ );
156
+ });
157
+
144
158
  test("resolveExpectedArtifactPath returns correct path for all milestone-level types", () => {
145
159
  const base = makeTmpBase();
146
160
  try {
@@ -447,6 +461,44 @@ test("verifyExpectedArtifact rejects complete-slice when roadmap checkbox is sti
447
461
  }
448
462
  });
449
463
 
464
+ test("verifyExpectedArtifact rejects run-uat when ASSESSMENT has no verdict", () => {
465
+ const base = makeTmpBase();
466
+ try {
467
+ const sliceDir = join(base, ".gsd", "milestones", "M001", "slices", "S01");
468
+ writeFileSync(join(sliceDir, "S01-ASSESSMENT.md"), "# Reassessment\n\nNo canonical verdict field.\n");
469
+
470
+ assert.equal(
471
+ verifyExpectedArtifact("run-uat", "M001/S01", base),
472
+ false,
473
+ "run-uat should not verify from a pre-existing ASSESSMENT without verdict",
474
+ );
475
+ } finally {
476
+ cleanup(base);
477
+ }
478
+ });
479
+
480
+ test("verifyExpectedArtifact accepts run-uat when ASSESSMENT has verdict", () => {
481
+ const base = makeTmpBase();
482
+ try {
483
+ const sliceDir = join(base, ".gsd", "milestones", "M001", "slices", "S01");
484
+ writeFileSync(join(sliceDir, "S01-ASSESSMENT.md"), [
485
+ "---",
486
+ "verdict: pass",
487
+ "---",
488
+ "",
489
+ "# UAT Assessment",
490
+ ].join("\n"));
491
+
492
+ assert.equal(
493
+ verifyExpectedArtifact("run-uat", "M001/S01", base),
494
+ true,
495
+ "run-uat should verify when ASSESSMENT contains a canonical verdict",
496
+ );
497
+ } finally {
498
+ cleanup(base);
499
+ }
500
+ });
501
+
450
502
 
451
503
  // ─── verifyExpectedArtifact: plan-slice task plan check (#739) ────────────
452
504
 
@@ -793,6 +845,51 @@ test("hasImplementationArtifacts finds integration implementation-only commits w
793
845
  }
794
846
  });
795
847
 
848
+ test("hasImplementationArtifacts ignores corrupted milestone/* integration metadata", () => {
849
+ const base = makeGitBase();
850
+ try {
851
+ mkdirSync(join(base, "src"), { recursive: true });
852
+ writeFileSync(join(base, "src", "feature.ts"), "export function feature() {}\n");
853
+ execFileSync("git", ["add", "src/feature.ts"], { cwd: base, stdio: "ignore" });
854
+ execFileSync("git", ["commit", "-m", "feat: add milestone feature\n\nGSD-Task: S01/T01"], { cwd: base, stdio: "ignore" });
855
+
856
+ mkdirSync(join(base, ".gsd"), { recursive: true });
857
+ openDatabase(join(base, ".gsd", "gsd.db"));
858
+ insertMilestone({ id: "M001", title: "Milestone One", status: "active" });
859
+ insertSlice({
860
+ id: "S01",
861
+ milestoneId: "M001",
862
+ title: "Slice One",
863
+ status: "complete",
864
+ risk: "low",
865
+ depends: [],
866
+ });
867
+ insertTask({
868
+ id: "T01",
869
+ sliceId: "S01",
870
+ milestoneId: "M001",
871
+ title: "Task One",
872
+ status: "complete",
873
+ });
874
+
875
+ execFileSync("git", ["checkout", "-b", "milestone/M001"], { cwd: base, stdio: "ignore" });
876
+ mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
877
+ writeFileSync(join(base, ".gsd", "milestones", "M001", "M001-SUMMARY.md"), "# Milestone Summary\nDone.");
878
+ execFileSync("git", ["add", "."], { cwd: base, stdio: "ignore" });
879
+ execFileSync("git", ["commit", "-m", "chore: auto-commit after complete-milestone\n\nGSD-Unit: M001"], { cwd: base, stdio: "ignore" });
880
+
881
+ writeFileSync(
882
+ join(base, ".gsd", "milestones", "M001", "M001-META.json"),
883
+ JSON.stringify({ integrationBranch: "milestone/M001" }, null, 2) + "\n",
884
+ );
885
+
886
+ const result = hasImplementationArtifacts(base, "M001");
887
+ assert.equal(result, "present", "corrupted milestone integration metadata should fall back to main branch for artifact detection");
888
+ } finally {
889
+ cleanup(base);
890
+ }
891
+ });
892
+
796
893
  test("hasImplementationArtifacts backfills untagged main implementation commits from completed task file hints", () => {
797
894
  const base = makeGitBase();
798
895
  try {
@@ -1029,24 +1126,50 @@ test("hasImplementationArtifacts binds GSD-Task trailer to milestone via DB stat
1029
1126
  }
1030
1127
  });
1031
1128
 
1032
- test("hasImplementationArtifacts does not bind GSD-Task trailer without milestone ownership evidence", () => {
1129
+ test("hasImplementationArtifacts does not claim Sxx/Tyy commit trailers across milestones when ownership points elsewhere", () => {
1033
1130
  const base = makeGitBase();
1034
1131
  try {
1035
1132
  writeFileSync(join(base, ".git", "info", "exclude"), ".gsd/\n");
1133
+ mkdirSync(join(base, ".gsd"), { recursive: true });
1134
+ openDatabase(join(base, ".gsd", "gsd.db"));
1135
+ insertMilestone({ id: "M001", title: "Milestone One", status: "active" });
1136
+ insertMilestone({ id: "M002", title: "Milestone Two", status: "active" });
1137
+ insertSlice({
1138
+ id: "S01",
1139
+ milestoneId: "M002",
1140
+ title: "Slice One",
1141
+ status: "complete",
1142
+ risk: "low",
1143
+ depends: [],
1144
+ });
1145
+ insertTask({
1146
+ id: "T01",
1147
+ sliceId: "S01",
1148
+ milestoneId: "M002",
1149
+ title: "Task One",
1150
+ status: "complete",
1151
+ });
1152
+
1036
1153
  mkdirSync(join(base, "src"), { recursive: true });
1037
1154
  writeFileSync(join(base, "src", "feature.ts"), "export function feature() {}\n");
1038
1155
  execFileSync("git", ["add", "."], { cwd: base, stdio: "ignore" });
1039
1156
  execFileSync(
1040
1157
  "git",
1041
- ["commit", "-m", "feat: add feature\n\nGSD-Task: S01/T01"],
1158
+ ["commit", "-m", "feat: add sibling feature\n\nGSD-Task: S01/T01"],
1042
1159
  { cwd: base, stdio: "ignore" },
1043
1160
  );
1044
1161
 
1045
- const result = hasImplementationArtifacts(base, "M001");
1162
+ const m001Result = hasImplementationArtifacts(base, "M001");
1163
+ const m002Result = hasImplementationArtifacts(base, "M002");
1046
1164
  assert.equal(
1047
- result,
1165
+ m001Result,
1048
1166
  "absent",
1049
- "S01/T01 shape alone must not bind an implementation commit to M001",
1167
+ "Sxx/Tyy commit trailers owned by M002 must not be attributed to M001",
1168
+ );
1169
+ assert.equal(
1170
+ m002Result,
1171
+ "present",
1172
+ "the owning milestone should still claim the implementation-bearing commit",
1050
1173
  );
1051
1174
  } finally {
1052
1175
  cleanup(base);
@@ -83,4 +83,16 @@ describe("evidence-collector: toolCallId-based matching (A-3)", () => {
83
83
  assert.equal(entries[1].kind, "edit");
84
84
  assert.equal(entries[1].toolCallId, "tc-edit");
85
85
  });
86
+
87
+ it("treats PowerShell and async_bash as execution evidence", () => {
88
+ recordToolCall("tc-ps", "PowerShell", { command: "Get-ChildItem" });
89
+ recordToolCall("tc-async", "async_bash", { command: "npm run build" });
90
+
91
+ const entries = getEvidence() as readonly BashEvidence[];
92
+ assert.equal(entries.length, 2);
93
+ assert.equal(entries[0].kind, "bash");
94
+ assert.equal(entries[0].command, "Get-ChildItem");
95
+ assert.equal(entries[1].kind, "bash");
96
+ assert.equal(entries[1].command, "npm run build");
97
+ });
86
98
  });
@@ -98,6 +98,7 @@ test("bootstrap aborts before starting next milestone when completed orphan merg
98
98
  {
99
99
  shouldUseWorktreeIsolation: () => true,
100
100
  registerSigtermHandler: () => {},
101
+ registerAutoWorkerForSession: () => {},
101
102
  lockBase: () => base,
102
103
  buildLifecycle: () => ({
103
104
  adoptSessionRoot: (sessionBase: string, originalBase?: string) => {
@@ -0,0 +1,20 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Regression tests for auto-mode stop notification formatting.
3
+
4
+ import test from "node:test";
5
+ import assert from "node:assert/strict";
6
+
7
+ import { formatAutoStopNotification } from "../auto.ts";
8
+
9
+ test("auto stop notification keeps session totals on a separate line", () => {
10
+ const message = formatAutoStopNotification(
11
+ "Auto-mode stopped",
12
+ { cost: 0.652, tokens: { total: 87000 } },
13
+ 2,
14
+ );
15
+
16
+ assert.equal(
17
+ message,
18
+ "Auto-mode stopped.\nSession: $0.652 · 87.0k tokens · 2 units",
19
+ );
20
+ });
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { describe, test, beforeEach } from "node:test";
4
4
  import assert from "node:assert/strict";
5
- import { mkdtempSync, mkdirSync, writeFileSync, rmSync, realpathSync } from "node:fs";
5
+ import { existsSync, mkdtempSync, mkdirSync, writeFileSync, rmSync, realpathSync } from "node:fs";
6
6
  import { join } from "node:path";
7
7
  import { tmpdir } from "node:os";
8
8
  import { execFileSync } from "node:child_process";
@@ -13,6 +13,7 @@ import {
13
13
  _resetAutoWorktreeOriginalBaseForTests,
14
14
  createAutoWorktree,
15
15
  enterAutoWorktree,
16
+ mergeMilestoneToMain,
16
17
  teardownAutoWorktree,
17
18
  } from "../auto-worktree.ts";
18
19
 
@@ -173,4 +174,71 @@ describe("auto-worktree workspace registry", () => {
173
174
  teardownAutoWorktree(dir2, "M020");
174
175
  try { process.chdir(savedCwd); } catch { /* ignore */ }
175
176
  });
177
+
178
+ test("mergeMilestoneToMain cleans up when milestone branch was already regular-merged", (t) => {
179
+ const tempDir = createTempRepo(t);
180
+ const msDir = join(tempDir, ".gsd", "milestones", "M003");
181
+ mkdirSync(msDir, { recursive: true });
182
+ writeFileSync(join(msDir, "CONTEXT.md"), "# M003 Context\n");
183
+ git(["add", "."], tempDir);
184
+ git(["commit", "-m", "add milestone"], tempDir);
185
+
186
+ createAutoWorktree(tempDir, "M003");
187
+ const wtDir = join(tempDir, ".gsd", "worktrees", "M003");
188
+ writeFileSync(join(wtDir, "feature.txt"), "implemented\n");
189
+ git(["add", "feature.txt"], wtDir);
190
+ git(["commit", "-m", "feat: implement M003"], wtDir);
191
+
192
+ process.chdir(tempDir);
193
+ git(["merge", "--no-ff", "milestone/M003", "-m", "merge M003"], tempDir);
194
+
195
+ process.chdir(wtDir);
196
+ const result = mergeMilestoneToMain(tempDir, "M003", "# M003\n- [x] **S01: Done**\n");
197
+
198
+ assert.equal(result.codeFilesChanged, true);
199
+ assert.equal(result.pushed, false);
200
+ assert.equal(result.prCreated, false);
201
+ assert.equal(existsSync(wtDir), false, "worktree directory is removed");
202
+ assert.throws(
203
+ () => git(["rev-parse", "--verify", "milestone/M003"], tempDir),
204
+ /Command failed/,
205
+ "already-merged milestone branch is deleted",
206
+ );
207
+ try { process.chdir(savedCwd); } catch { /* ignore */ }
208
+ });
209
+
210
+ test("mergeMilestoneToMain cleans up already-merged milestone after main advances", (t) => {
211
+ const tempDir = createTempRepo(t);
212
+ const msDir = join(tempDir, ".gsd", "milestones", "M004");
213
+ mkdirSync(msDir, { recursive: true });
214
+ writeFileSync(join(msDir, "CONTEXT.md"), "# M004 Context\n");
215
+ git(["add", "."], tempDir);
216
+ git(["commit", "-m", "add milestone"], tempDir);
217
+
218
+ createAutoWorktree(tempDir, "M004");
219
+ const wtDir = join(tempDir, ".gsd", "worktrees", "M004");
220
+ writeFileSync(join(wtDir, "feature.txt"), "implemented\n");
221
+ git(["add", "feature.txt"], wtDir);
222
+ git(["commit", "-m", "feat: implement M004"], wtDir);
223
+
224
+ process.chdir(tempDir);
225
+ git(["merge", "--no-ff", "milestone/M004", "-m", "merge M004"], tempDir);
226
+ writeFileSync(join(tempDir, "hotfix.txt"), "later main work\n");
227
+ git(["add", "hotfix.txt"], tempDir);
228
+ git(["commit", "-m", "fix: advance main"], tempDir);
229
+
230
+ process.chdir(wtDir);
231
+ const result = mergeMilestoneToMain(tempDir, "M004", "# M004\n- [x] **S01: Done**\n");
232
+
233
+ assert.equal(result.codeFilesChanged, true);
234
+ assert.equal(result.pushed, false);
235
+ assert.equal(result.prCreated, false);
236
+ assert.equal(existsSync(wtDir), false, "worktree directory is removed");
237
+ assert.throws(
238
+ () => git(["rev-parse", "--verify", "milestone/M004"], tempDir),
239
+ /Command failed/,
240
+ "already-merged milestone branch is deleted",
241
+ );
242
+ try { process.chdir(savedCwd); } catch { /* ignore */ }
243
+ });
176
244
  });