gsd-pi 2.82.0 → 3.0.0-dev.1b44e695b

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 (799) hide show
  1. package/README.md +125 -32
  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/browser-tools/tools/screenshot.js +1 -0
  8. package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
  9. package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
  10. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -6
  11. package/dist/resources/extensions/cmux/index.js +5 -0
  12. package/dist/resources/extensions/gsd/auto/detect-stuck.js +1 -1
  13. package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
  14. package/dist/resources/extensions/gsd/auto/loop.js +122 -40
  15. package/dist/resources/extensions/gsd/auto/orchestrator.js +126 -8
  16. package/dist/resources/extensions/gsd/auto/phases.js +143 -49
  17. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  18. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -1
  19. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
  20. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  21. package/dist/resources/extensions/gsd/auto-budget.js +9 -0
  22. package/dist/resources/extensions/gsd/auto-dashboard.js +66 -1
  23. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  24. package/dist/resources/extensions/gsd/auto-dispatch.js +144 -30
  25. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  26. package/dist/resources/extensions/gsd/auto-post-unit.js +329 -137
  27. package/dist/resources/extensions/gsd/auto-prompts.js +47 -13
  28. package/dist/resources/extensions/gsd/auto-recovery.js +82 -16
  29. package/dist/resources/extensions/gsd/auto-start.js +99 -16
  30. package/dist/resources/extensions/gsd/auto-timers.js +11 -3
  31. package/dist/resources/extensions/gsd/auto-verification.js +146 -34
  32. package/dist/resources/extensions/gsd/auto-worktree.js +185 -26
  33. package/dist/resources/extensions/gsd/auto.js +251 -99
  34. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +65 -10
  35. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +13 -10
  36. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +19 -4
  37. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  38. package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
  39. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
  40. package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
  41. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  42. package/dist/resources/extensions/gsd/commands/handlers/core.js +39 -1
  43. package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
  44. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  45. package/dist/resources/extensions/gsd/commands-handlers.js +17 -2
  46. package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
  47. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +10 -2
  48. package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
  49. package/dist/resources/extensions/gsd/context-store.js +112 -0
  50. package/dist/resources/extensions/gsd/crash-recovery.js +55 -7
  51. package/dist/resources/extensions/gsd/db/auto-workers.js +30 -0
  52. package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
  53. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  54. package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
  55. package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
  56. package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
  57. package/dist/resources/extensions/gsd/db-writer.js +150 -84
  58. package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
  59. package/dist/resources/extensions/gsd/docs/preferences-reference.md +11 -1
  60. package/dist/resources/extensions/gsd/doctor-git-checks.js +87 -7
  61. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  62. package/dist/resources/extensions/gsd/doctor.js +2 -28
  63. package/dist/resources/extensions/gsd/export-html.js +27 -425
  64. package/dist/resources/extensions/gsd/forensics.js +10 -3
  65. package/dist/resources/extensions/gsd/git-service.js +152 -15
  66. package/dist/resources/extensions/gsd/gsd-db.js +76 -33
  67. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  68. package/dist/resources/extensions/gsd/guided-flow.js +110 -117
  69. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  70. package/dist/resources/extensions/gsd/init-wizard.js +17 -2
  71. package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
  72. package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
  73. package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
  74. package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
  75. package/dist/resources/extensions/gsd/markdown-renderer.js +20 -12
  76. package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
  77. package/dist/resources/extensions/gsd/md-importer.js +1 -1
  78. package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
  79. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
  80. package/dist/resources/extensions/gsd/migrate/command.js +5 -0
  81. package/dist/resources/extensions/gsd/migrate/parsers.js +121 -2
  82. package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
  83. package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
  84. package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
  85. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  86. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  87. package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
  88. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
  89. package/dist/resources/extensions/gsd/paths.js +4 -0
  90. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  91. package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
  92. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
  93. package/dist/resources/extensions/gsd/pre-execution-checks.js +54 -19
  94. package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
  95. package/dist/resources/extensions/gsd/preferences-types.js +3 -0
  96. package/dist/resources/extensions/gsd/preferences-validation.js +147 -0
  97. package/dist/resources/extensions/gsd/preferences.js +6 -0
  98. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  99. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  100. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  101. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  102. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  103. package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
  104. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  105. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  106. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  107. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  108. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  109. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  110. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  111. package/dist/resources/extensions/gsd/prompts/system.md +2 -2
  112. package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
  113. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  114. package/dist/resources/extensions/gsd/repo-identity.js +39 -22
  115. package/dist/resources/extensions/gsd/repository-registry.js +44 -0
  116. package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
  117. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
  118. package/dist/resources/extensions/gsd/session-lock.js +15 -2
  119. package/dist/resources/extensions/gsd/slice-parallel-conflict.js +2 -2
  120. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +84 -5
  121. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  122. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  123. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  124. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  125. package/dist/resources/extensions/gsd/state.js +28 -7
  126. package/dist/resources/extensions/gsd/status-guards.js +14 -2
  127. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  128. package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
  129. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  130. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  131. package/dist/resources/extensions/gsd/tools/complete-milestone.js +15 -9
  132. package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -10
  133. package/dist/resources/extensions/gsd/tools/exec-tool.js +87 -5
  134. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  135. package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
  136. package/dist/resources/extensions/gsd/tools/validate-milestone.js +32 -1
  137. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +185 -40
  138. package/dist/resources/extensions/gsd/unit-context-composer.js +2 -0
  139. package/dist/resources/extensions/gsd/unit-context-manifest.js +69 -17
  140. package/dist/resources/extensions/gsd/validation.js +23 -1
  141. package/dist/resources/extensions/gsd/verification-gate.js +142 -7
  142. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  143. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  144. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  145. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  146. package/dist/resources/extensions/gsd/worktree-lifecycle.js +86 -19
  147. package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
  148. package/dist/resources/extensions/gsd/worktree-safety.js +43 -4
  149. package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
  150. package/dist/resources/extensions/gsd/worktree-telemetry.js +32 -0
  151. package/dist/resources/extensions/shared/html-shell.js +388 -0
  152. package/dist/resources/extensions/shared/interview-ui.js +6 -4
  153. package/dist/resources/extensions/shared/next-action-ui.js +13 -5
  154. package/dist/resources/extensions/subagent/index.js +448 -78
  155. package/dist/resources/extensions/subagent/launch.js +77 -0
  156. package/dist/resources/extensions/subagent/run-store.js +148 -0
  157. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  158. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  159. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  160. package/dist/resources/extensions/visual-brief/index.js +5 -0
  161. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  162. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  163. package/dist/resources/skills/forensics/SKILL.md +1 -1
  164. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  165. package/dist/web/standalone/.next/BUILD_ID +1 -1
  166. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  167. package/dist/web/standalone/.next/build-manifest.json +4 -4
  168. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  169. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  170. package/dist/web/standalone/.next/required-server-files.json +4 -4
  171. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  172. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  174. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  176. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  178. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  179. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  180. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  181. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  182. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  183. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  185. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  186. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  187. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  188. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  189. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  190. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  191. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  192. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  199. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  211. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  222. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  231. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  235. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  236. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  238. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  239. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  240. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  241. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  242. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  244. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  245. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  246. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  247. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  248. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  249. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  250. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  252. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  253. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  254. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  255. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  256. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  257. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  258. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  259. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  260. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  261. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  262. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  263. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  264. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  265. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  266. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  267. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  268. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  269. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  270. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  271. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  272. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  273. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  274. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  275. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  276. package/dist/web/standalone/.next/server/app/index.html +1 -1
  277. package/dist/web/standalone/.next/server/app/index.rsc +5 -8
  278. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  279. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -8
  280. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  281. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  282. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  283. package/dist/web/standalone/.next/server/app/page.js +2 -2
  284. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  285. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  286. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  287. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  288. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  289. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  290. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  291. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  292. package/dist/web/standalone/.next/server/middleware.js +2 -2
  293. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  294. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  295. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  296. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  297. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  298. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  299. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  300. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  301. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  302. package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
  303. package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +1 -0
  304. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  305. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  306. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  307. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  308. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  309. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  310. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  311. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  312. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  313. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  314. package/dist/web/standalone/server.js +1 -1
  315. package/package.json +6 -5
  316. package/packages/contracts/dist/rpc.test.js +7 -0
  317. package/packages/contracts/dist/rpc.test.js.map +1 -1
  318. package/packages/contracts/dist/workflow.d.ts +21 -0
  319. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  320. package/packages/contracts/dist/workflow.js +24 -0
  321. package/packages/contracts/dist/workflow.js.map +1 -1
  322. package/packages/contracts/src/rpc.test.ts +8 -0
  323. package/packages/contracts/src/workflow.ts +24 -0
  324. package/packages/daemon/package.json +2 -2
  325. package/packages/mcp-server/README.md +14 -3
  326. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  327. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  328. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  329. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  330. package/packages/mcp-server/package.json +2 -2
  331. package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
  332. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  333. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  334. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  335. package/packages/native/package.json +1 -1
  336. package/packages/native/tsconfig.json +2 -1
  337. package/packages/native/tsconfig.tsbuildinfo +1 -1
  338. package/packages/pi-agent-core/package.json +1 -1
  339. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  340. package/packages/pi-ai/dist/index.d.ts +2 -2
  341. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  342. package/packages/pi-ai/dist/index.js +1 -1
  343. package/packages/pi-ai/dist/index.js.map +1 -1
  344. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  345. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  346. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  347. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  348. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  349. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  350. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  351. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  352. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  353. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  354. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  355. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  356. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  357. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  358. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  359. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  360. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  361. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  362. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  363. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  364. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  365. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  366. package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
  367. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  368. package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
  369. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  370. package/packages/pi-ai/package.json +1 -1
  371. package/packages/pi-ai/src/index.ts +7 -2
  372. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  373. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  374. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  375. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  376. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  377. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  378. package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
  379. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  380. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  381. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  382. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  383. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  384. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  385. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  386. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  387. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  388. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
  389. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  390. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
  391. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  392. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
  393. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  394. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  395. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  396. package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
  397. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  398. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +8 -2
  399. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  400. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  401. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  402. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  403. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  404. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  405. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  406. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +82 -97
  407. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  408. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
  409. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  410. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
  411. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  412. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  413. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  414. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  415. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  416. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  417. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  418. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
  419. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
  420. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
  421. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
  422. package/packages/pi-coding-agent/package.json +1 -1
  423. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  424. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  425. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  426. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
  427. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
  428. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  429. package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
  430. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +17 -1
  431. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  432. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
  433. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +91 -102
  434. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
  435. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
  436. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  437. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  438. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
  439. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  440. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  441. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  442. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  443. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  444. package/packages/pi-tui/dist/__tests__/tui.test.js +45 -2
  445. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  446. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  447. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  448. package/packages/pi-tui/dist/terminal.js +12 -0
  449. package/packages/pi-tui/dist/terminal.js.map +1 -1
  450. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  451. package/packages/pi-tui/dist/tui.js +108 -24
  452. package/packages/pi-tui/dist/tui.js.map +1 -1
  453. package/packages/pi-tui/package.json +1 -1
  454. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  455. package/packages/pi-tui/src/__tests__/tui.test.ts +59 -2
  456. package/packages/pi-tui/src/terminal.ts +11 -0
  457. package/packages/pi-tui/src/tui.ts +111 -24
  458. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  459. package/packages/rpc-client/package.json +1 -1
  460. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  461. package/pkg/package.json +1 -1
  462. package/src/resources/GSD-WORKFLOW.md +10 -1
  463. package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
  464. package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
  465. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  466. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
  467. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  468. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
  469. package/src/resources/extensions/cmux/index.ts +6 -0
  470. package/src/resources/extensions/gsd/auto/contracts.ts +64 -16
  471. package/src/resources/extensions/gsd/auto/detect-stuck.ts +1 -0
  472. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  473. package/src/resources/extensions/gsd/auto/loop.ts +123 -40
  474. package/src/resources/extensions/gsd/auto/orchestrator.ts +131 -8
  475. package/src/resources/extensions/gsd/auto/phases.ts +174 -60
  476. package/src/resources/extensions/gsd/auto/session.ts +16 -0
  477. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  478. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +6 -2
  479. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  480. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  481. package/src/resources/extensions/gsd/auto-budget.ts +11 -0
  482. package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
  483. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  484. package/src/resources/extensions/gsd/auto-dispatch.ts +164 -29
  485. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  486. package/src/resources/extensions/gsd/auto-post-unit.ts +369 -148
  487. package/src/resources/extensions/gsd/auto-prompts.ts +47 -16
  488. package/src/resources/extensions/gsd/auto-recovery.ts +86 -13
  489. package/src/resources/extensions/gsd/auto-start.ts +109 -14
  490. package/src/resources/extensions/gsd/auto-timers.ts +10 -3
  491. package/src/resources/extensions/gsd/auto-verification.ts +174 -42
  492. package/src/resources/extensions/gsd/auto-worktree.ts +202 -30
  493. package/src/resources/extensions/gsd/auto.ts +296 -107
  494. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +66 -10
  495. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +13 -10
  496. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +19 -4
  497. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  498. package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
  499. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
  500. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  501. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  502. package/src/resources/extensions/gsd/commands/handlers/core.ts +42 -1
  503. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  504. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  505. package/src/resources/extensions/gsd/commands-handlers.ts +21 -2
  506. package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
  507. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +11 -3
  508. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  509. package/src/resources/extensions/gsd/context-store.ts +120 -1
  510. package/src/resources/extensions/gsd/crash-recovery.ts +55 -6
  511. package/src/resources/extensions/gsd/db/auto-workers.ts +37 -0
  512. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  513. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  514. package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
  515. package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
  516. package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
  517. package/src/resources/extensions/gsd/db-writer.ts +167 -84
  518. package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
  519. package/src/resources/extensions/gsd/docs/preferences-reference.md +11 -1
  520. package/src/resources/extensions/gsd/doctor-git-checks.ts +89 -7
  521. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  522. package/src/resources/extensions/gsd/doctor-types.ts +3 -0
  523. package/src/resources/extensions/gsd/doctor.ts +2 -27
  524. package/src/resources/extensions/gsd/export-html.ts +27 -427
  525. package/src/resources/extensions/gsd/forensics.ts +9 -3
  526. package/src/resources/extensions/gsd/git-service.ts +182 -16
  527. package/src/resources/extensions/gsd/gsd-db.ts +80 -31
  528. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  529. package/src/resources/extensions/gsd/guided-flow.ts +142 -134
  530. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  531. package/src/resources/extensions/gsd/init-wizard.ts +17 -2
  532. package/src/resources/extensions/gsd/journal.ts +8 -1
  533. package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
  534. package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
  535. package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
  536. package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
  537. package/src/resources/extensions/gsd/markdown-renderer.ts +20 -12
  538. package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
  539. package/src/resources/extensions/gsd/md-importer.ts +1 -1
  540. package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
  541. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
  542. package/src/resources/extensions/gsd/migrate/command.ts +5 -0
  543. package/src/resources/extensions/gsd/migrate/parsers.ts +139 -2
  544. package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
  545. package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
  546. package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
  547. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  548. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  549. package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
  550. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
  551. package/src/resources/extensions/gsd/paths.ts +5 -0
  552. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  553. package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
  554. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
  555. package/src/resources/extensions/gsd/pre-execution-checks.ts +67 -19
  556. package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
  557. package/src/resources/extensions/gsd/preferences-types.ts +35 -0
  558. package/src/resources/extensions/gsd/preferences-validation.ts +154 -0
  559. package/src/resources/extensions/gsd/preferences.ts +9 -0
  560. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  561. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  562. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  563. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  564. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  565. package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
  566. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  567. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  568. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  569. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  570. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  571. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  572. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  573. package/src/resources/extensions/gsd/prompts/system.md +2 -2
  574. package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
  575. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  576. package/src/resources/extensions/gsd/repo-identity.ts +45 -25
  577. package/src/resources/extensions/gsd/repository-registry.ts +77 -0
  578. package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
  579. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
  580. package/src/resources/extensions/gsd/session-lock.ts +15 -2
  581. package/src/resources/extensions/gsd/slice-parallel-conflict.ts +2 -2
  582. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +75 -3
  583. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  584. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  585. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  586. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  587. package/src/resources/extensions/gsd/state.ts +33 -7
  588. package/src/resources/extensions/gsd/status-guards.ts +16 -2
  589. package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  590. package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
  591. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  592. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  593. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
  594. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +10 -1
  595. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  596. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  597. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +875 -59
  598. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +637 -16
  599. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  600. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  601. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  602. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +136 -13
  603. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +64 -0
  604. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
  605. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +4 -4
  606. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  607. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  608. package/src/resources/extensions/gsd/tests/auto-workers.test.ts +29 -0
  609. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  610. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
  611. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  612. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
  613. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  614. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  615. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
  616. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  617. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  618. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +55 -2
  619. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +60 -9
  620. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  621. package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
  622. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +104 -2
  623. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  624. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  625. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
  626. package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
  627. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
  628. package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
  629. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
  630. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +111 -1
  631. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
  632. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +140 -1
  633. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  634. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
  635. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
  636. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +99 -1
  637. package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +15 -1
  638. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  639. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
  640. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
  641. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
  642. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  643. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  644. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  645. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  646. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  647. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  648. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  649. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  650. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  651. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  652. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
  653. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
  654. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  655. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +226 -2
  656. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
  657. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
  658. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +5 -21
  659. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +15 -0
  660. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  661. package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +40 -0
  662. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
  663. package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
  664. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
  665. package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
  666. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
  667. package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
  668. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
  669. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
  670. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
  671. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  672. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +21 -40
  673. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
  674. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +59 -1
  675. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
  676. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  677. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
  678. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  679. package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
  680. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  681. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  682. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  683. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
  684. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  685. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  686. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
  687. package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
  688. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  689. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
  690. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +8 -1
  691. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  692. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +147 -0
  693. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
  694. package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
  695. package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
  696. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +79 -0
  697. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +42 -1
  698. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -0
  699. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  700. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  701. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
  702. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  703. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  704. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  705. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +28 -1
  706. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
  707. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  708. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +35 -0
  709. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
  710. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +59 -1
  711. package/src/resources/extensions/gsd/tests/slice-parallel-conflict.test.ts +2 -2
  712. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +112 -1
  713. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  714. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +94 -2
  715. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  716. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  717. package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
  718. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  719. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
  720. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  721. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -0
  722. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +131 -9
  723. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
  724. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  725. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +68 -0
  726. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
  727. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +188 -1
  728. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  729. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  730. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  731. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  732. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +153 -1
  733. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  734. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  735. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +73 -2
  736. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
  737. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +90 -0
  738. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
  739. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +16 -0
  740. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
  741. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
  742. package/src/resources/extensions/gsd/tools/complete-milestone.ts +18 -10
  743. package/src/resources/extensions/gsd/tools/complete-slice.ts +57 -10
  744. package/src/resources/extensions/gsd/tools/exec-tool.ts +98 -5
  745. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  746. package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
  747. package/src/resources/extensions/gsd/tools/validate-milestone.ts +31 -0
  748. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +166 -17
  749. package/src/resources/extensions/gsd/types.ts +1 -1
  750. package/src/resources/extensions/gsd/unit-context-composer.ts +3 -0
  751. package/src/resources/extensions/gsd/unit-context-manifest.ts +86 -19
  752. package/src/resources/extensions/gsd/validation.ts +23 -1
  753. package/src/resources/extensions/gsd/verification-gate.ts +170 -6
  754. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  755. package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
  756. package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
  757. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  758. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  759. package/src/resources/extensions/gsd/worktree-lifecycle.ts +98 -20
  760. package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
  761. package/src/resources/extensions/gsd/worktree-safety.ts +57 -10
  762. package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
  763. package/src/resources/extensions/gsd/worktree-telemetry.ts +39 -0
  764. package/src/resources/extensions/shared/html-shell.ts +412 -0
  765. package/src/resources/extensions/shared/interview-ui.ts +6 -4
  766. package/src/resources/extensions/shared/next-action-ui.ts +11 -5
  767. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
  768. package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +32 -0
  769. package/src/resources/extensions/subagent/index.ts +567 -103
  770. package/src/resources/extensions/subagent/launch.ts +131 -0
  771. package/src/resources/extensions/subagent/run-store.ts +218 -0
  772. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  773. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  774. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  775. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  776. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  777. package/src/resources/extensions/visual-brief/index.ts +8 -0
  778. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  779. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  780. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  781. package/src/resources/skills/forensics/SKILL.md +1 -1
  782. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  783. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  784. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  785. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  786. package/dist/web/standalone/.next/static/chunks/app/layout-9ecfd95f343793f0.js +0 -1
  787. package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +0 -1
  788. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  789. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  790. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  791. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  792. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  793. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  794. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  795. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  796. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  797. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  798. /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → Z8H5evS-hDo0qdP22XJPA}/_buildManifest.js +0 -0
  799. /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → Z8H5evS-hDo0qdP22XJPA}/_ssgManifest.js +0 -0
@@ -2,10 +2,10 @@
2
2
  // File Purpose: Git service integration and commit-message tests.
3
3
  import { describe, test } from 'node:test';
4
4
  import assert from 'node:assert/strict';
5
- import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync, symlinkSync, readFileSync } from "node:fs";
5
+ import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync, symlinkSync, readFileSync, chmodSync } from "node:fs";
6
6
  import { join, dirname } from "node:path";
7
7
  import { tmpdir } from "node:os";
8
- import { execSync } from "node:child_process";
8
+ import { execFileSync, execSync } from "node:child_process";
9
9
 
10
10
  import {
11
11
  inferCommitType,
@@ -371,6 +371,18 @@ describe('git-service', async () => {
371
371
  return dir;
372
372
  }
373
373
 
374
+ function gitRun(args: string[], cwd: string): string {
375
+ return execFileSync("git", args, {
376
+ cwd,
377
+ stdio: ["ignore", "pipe", "pipe"],
378
+ encoding: "utf-8",
379
+ env: {
380
+ ...process.env,
381
+ GIT_ALLOW_PROTOCOL: "file",
382
+ },
383
+ }).trim();
384
+ }
385
+
374
386
  // ─── GitServiceImpl: smart staging ─────────────────────────────────────
375
387
 
376
388
  test('GitServiceImpl: smart staging', () => {
@@ -413,6 +425,96 @@ describe('git-service', async () => {
413
425
  rmSync(repo, { recursive: true, force: true });
414
426
  });
415
427
 
428
+ test('GitServiceImpl: task autoCommit skips keyFiles inside submodules', () => {
429
+ const repo = initTempRepo();
430
+ const subSrc = mkdtempSync(join(tmpdir(), "gsd-git-submodule-src-"));
431
+
432
+ try {
433
+ gitRun(["init", "-b", "main"], subSrc);
434
+ gitRun(["config", "user.name", "Pi Test"], subSrc);
435
+ gitRun(["config", "user.email", "pi@example.com"], subSrc);
436
+ createFile(subSrc, "tracked.txt", "initial\n");
437
+ gitRun(["add", "-A"], subSrc);
438
+ gitRun(["commit", "-m", "init submodule"], subSrc);
439
+
440
+ gitRun(["-c", "protocol.file.allow=always", "submodule", "add", `file://${subSrc}`, "sub"], repo);
441
+ gitRun(["commit", "-m", "add submodule"], repo);
442
+
443
+ createFile(repo, "sub/copied.txt", "copied from source\n");
444
+ createFile(repo, "src/feature.ts", "export const feature = true;\n");
445
+ createFile(repo, "src/unrelated.ts", "export const unrelated = true;\n");
446
+
447
+ const svc = new GitServiceImpl(repo);
448
+ const taskContext: TaskCommitContext = {
449
+ taskId: "S01/T01",
450
+ taskDisplayId: "T01",
451
+ taskTitle: "fix submodule staging",
452
+ milestoneId: "M001",
453
+ milestoneTitle: "Submodule auto commit",
454
+ sliceId: "S01",
455
+ sliceTitle: "Commit scoped files",
456
+ oneLiner: "Fixed auto commit when key files include submodule paths",
457
+ keyFiles: ["sub/copied.txt", "src/feature.ts"],
458
+ };
459
+
460
+ const result = svc.autoCommit("execute-task", "M001/S01/T01", [], taskContext);
461
+
462
+ assert.ok(result !== null, "autoCommit should commit non-submodule changes");
463
+ const committed = gitRun(["show", "--name-only", "--format=", "HEAD"], repo);
464
+ assert.ok(committed.includes("src/feature.ts"), "non-submodule keyFile is committed");
465
+ assert.ok(!committed.includes("sub/copied.txt"), "submodule inner keyFile is not pathspec-staged");
466
+ assert.ok(!committed.includes("src/unrelated.ts"), "scoped staging does not fall back to smartStage");
467
+ } finally {
468
+ rmSync(repo, { recursive: true, force: true });
469
+ rmSync(subSrc, { recursive: true, force: true });
470
+ }
471
+ });
472
+
473
+ test('GitServiceImpl: all keyFiles inside submodules falls back to smartStage', () => {
474
+ const repo = initTempRepo();
475
+ const subSrc = mkdtempSync(join(tmpdir(), "gsd-git-all-submodule-src-"));
476
+
477
+ try {
478
+ gitRun(["init", "-b", "main"], subSrc);
479
+ gitRun(["config", "user.name", "Pi Test"], subSrc);
480
+ gitRun(["config", "user.email", "pi@example.com"], subSrc);
481
+ createFile(subSrc, "tracked.txt", "initial\n");
482
+ gitRun(["add", "-A"], subSrc);
483
+ gitRun(["commit", "-m", "init submodule"], subSrc);
484
+
485
+ gitRun(["-c", "protocol.file.allow=always", "submodule", "add", `file://${subSrc}`, "sub"], repo);
486
+ gitRun(["commit", "-m", "add submodule"], repo);
487
+
488
+ createFile(repo, "sub/file1.txt", "inside submodule\n");
489
+ createFile(repo, "sub/file2.txt", "also inside\n");
490
+ createFile(repo, "src/real.ts", "export const real = true;\n");
491
+
492
+ const svc = new GitServiceImpl(repo);
493
+ const taskContext: TaskCommitContext = {
494
+ taskId: "S01/T02",
495
+ taskDisplayId: "T02",
496
+ taskTitle: "all keyFiles inside submodule",
497
+ milestoneId: "M001",
498
+ milestoneTitle: "Submodule auto commit",
499
+ sliceId: "S01",
500
+ sliceTitle: "Commit scoped files",
501
+ oneLiner: "Fell back when all key files are inside submodules",
502
+ keyFiles: ["sub", "sub/file1.txt", "sub/file2.txt"],
503
+ };
504
+
505
+ const result = svc.autoCommit("execute-task", "M001/S01/T02", [], taskContext);
506
+
507
+ assert.ok(result !== null, "autoCommit falls back to smartStage when all keyFiles are filtered");
508
+ const committed = gitRun(["show", "--name-only", "--format=", "HEAD"], repo);
509
+ assert.ok(!committed.includes("sub/file1.txt"), "submodule keyFile is not committed");
510
+ assert.ok(!committed.includes("sub/file2.txt"), "submodule keyFile is not committed");
511
+ assert.ok(committed.includes("src/real.ts"), "smartStage fallback commits other dirty files");
512
+ } finally {
513
+ rmSync(repo, { recursive: true, force: true });
514
+ rmSync(subSrc, { recursive: true, force: true });
515
+ }
516
+ });
517
+
416
518
  // ─── GitServiceImpl: smart staging excludes tracked runtime files ──────
417
519
 
418
520
  test('GitServiceImpl: smart staging excludes tracked runtime files', () => {
@@ -529,6 +631,92 @@ describe('git-service', async () => {
529
631
  rmSync(repo, { recursive: true, force: true });
530
632
  });
531
633
 
634
+ test('GitServiceImpl: autoCommit retries once when pre-commit rewrites files', () => {
635
+ const repo = initTempRepo();
636
+ const svc = new GitServiceImpl(repo);
637
+
638
+ const hookPath = join(repo, ".git", "hooks", "pre-commit");
639
+ const countFile = join(repo, ".git", "pre-commit-count");
640
+ writeFileSync(
641
+ hookPath,
642
+ [
643
+ "#!/bin/sh",
644
+ `count_file="${countFile}"`,
645
+ "count=0",
646
+ "[ -f \"$count_file\" ] && count=$(cat \"$count_file\")",
647
+ "count=$((count + 1))",
648
+ "echo \"$count\" > \"$count_file\"",
649
+ "if [ \"$count\" -eq 1 ]; then",
650
+ " printf 'export const fixed = true;\\n' > src/fix-me.ts",
651
+ " exit 1",
652
+ "fi",
653
+ "exit 0",
654
+ "",
655
+ ].join("\n"),
656
+ "utf-8",
657
+ );
658
+ chmodSync(hookPath, 0o755);
659
+
660
+ createFile(repo, "src/fix-me.ts", "export const fixed = false;\n");
661
+ const msg = svc.autoCommit("execute-task", "M001/S01/T04");
662
+
663
+ assert.ok(msg !== null, "autoCommit succeeds after one retry for hook rewrites");
664
+ assert.equal(run("git rev-list --count HEAD", repo), "2", "exactly one new commit created");
665
+ assert.equal(readFileSync(join(repo, "src/fix-me.ts"), "utf-8"), "export const fixed = true;\n"); // allow-source-grep: verifies pre-commit output inside the temp repo fixture, not product source.
666
+ assert.equal(readFileSync(countFile, "utf-8").trim(), "2", "pre-commit hook ran twice");
667
+
668
+ rmSync(repo, { recursive: true, force: true });
669
+ });
670
+
671
+ test('GitServiceImpl: autoCommit retry preserves task-scoped staging', () => {
672
+ const repo = initTempRepo();
673
+ const svc = new GitServiceImpl(repo);
674
+
675
+ const hookPath = join(repo, ".git", "hooks", "pre-commit");
676
+ const countFile = join(repo, ".git", "pre-commit-count");
677
+ writeFileSync(
678
+ hookPath,
679
+ [
680
+ "#!/bin/sh",
681
+ `count_file="${countFile}"`,
682
+ "count=0",
683
+ "[ -f \"$count_file\" ] && count=$(cat \"$count_file\")",
684
+ "count=$((count + 1))",
685
+ "echo \"$count\" > \"$count_file\"",
686
+ "if [ \"$count\" -eq 1 ]; then",
687
+ " printf 'export const fixed = true;\\n' > src/task.ts",
688
+ " exit 1",
689
+ "fi",
690
+ "exit 0",
691
+ "",
692
+ ].join("\n"),
693
+ "utf-8",
694
+ );
695
+ chmodSync(hookPath, 0o755);
696
+
697
+ createFile(repo, "src/task.ts", "export const fixed = false;\n");
698
+ createFile(repo, "src/unrelated.ts", "export const unrelated = true;\n");
699
+
700
+ const msg = svc.autoCommit("execute-task", "M001/S01/T05", [], {
701
+ taskId: "S01/T05",
702
+ taskTitle: "update task file",
703
+ oneLiner: "Updated task file after hook rewrite",
704
+ keyFiles: ["src/task.ts"],
705
+ });
706
+
707
+ assert.ok(msg !== null, "autoCommit succeeds after retry with task-scoped staging");
708
+ assert.equal(readFileSync(countFile, "utf-8").trim(), "2", "pre-commit hook ran twice");
709
+
710
+ const committed = run("git show --name-only --format= HEAD", repo);
711
+ assert.ok(committed.includes("src/task.ts"), "task file is committed after retry");
712
+ assert.ok(!committed.includes("src/unrelated.ts"), "retry does not widen staging to unrelated dirty files");
713
+
714
+ const status = run("git status --porcelain", repo);
715
+ assert.ok(status.includes("src/unrelated.ts"), "unrelated dirty file remains in working tree");
716
+
717
+ rmSync(repo, { recursive: true, force: true });
718
+ });
719
+
532
720
  test('GitServiceImpl: task context keyFiles scope autoCommit staging', () => {
533
721
  const repo = initTempRepo();
534
722
  const svc = new GitServiceImpl(repo);
@@ -608,6 +796,33 @@ describe('git-service', async () => {
608
796
  rmSync(repo, { recursive: true, force: true });
609
797
  });
610
798
 
799
+ // Regression: #5529. Some executors emit keyFiles relative to a monorepo
800
+ // subproject root (e.g. `src/...`) instead of the repo root
801
+ // (`frontend/src/...`). When none of those keyFiles exist at repo root,
802
+ // scoped staging must fall back to smartStage instead of failing the turn.
803
+ test('GitServiceImpl: repo-relative keyFiles mismatch falls back to smartStage', () => {
804
+ const repo = initTempRepo();
805
+ const svc = new GitServiceImpl(repo);
806
+
807
+ createFile(repo, "frontend/src/lib/onboarding-contract.ts", "export const contract = true;");
808
+
809
+ const msg = svc.autoCommit("execute-task", "M001/S01/T04", [], {
810
+ taskId: "S01/T04",
811
+ taskTitle: "fix scoped keyFiles path handling",
812
+ oneLiner: "Handled repo-relative keyFiles mismatch",
813
+ keyFiles: ["src/lib/onboarding-contract.ts"],
814
+ });
815
+ assert.ok(msg !== null, "autoCommit falls back to smartStage when scoped keyFiles are invalid at repo root");
816
+
817
+ const committed = run("git show --name-only --format= HEAD", repo);
818
+ assert.ok(
819
+ committed.includes("frontend/src/lib/onboarding-contract.ts"),
820
+ "smartStage fallback stages real dirty files when keyFiles are scoped to a subproject root",
821
+ );
822
+
823
+ rmSync(repo, { recursive: true, force: true });
824
+ });
825
+
611
826
  test('GitServiceImpl: task context keyFiles ignores gitignored build outputs', () => {
612
827
  const repo = initTempRepo();
613
828
  const svc = new GitServiceImpl(repo);
@@ -1066,6 +1281,15 @@ describe('git-service', async () => {
1066
1281
  rmSync(repo, { recursive: true, force: true });
1067
1282
  });
1068
1283
 
1284
+ test('Integration branch: rejects milestone branches', () => {
1285
+ const repo = initBranchTestRepo();
1286
+
1287
+ writeIntegrationBranch(repo, "M001", "milestone/M001");
1288
+ assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), null, "milestone branches are not recorded as integration branch");
1289
+
1290
+ rmSync(repo, { recursive: true, force: true });
1291
+ });
1292
+
1069
1293
  // ─── writeIntegrationBranch: still records legitimate branches ────────
1070
1294
 
1071
1295
  test('Integration branch: records non-ephemeral gsd branches', () => {
@@ -17,10 +17,12 @@ import { migrateFromMarkdown, parseDecisionsTable } from '../../md-importer.ts';
17
17
  import {
18
18
  queryDecisions,
19
19
  queryRequirements,
20
+ getAllDecisionsFromMemories,
20
21
  formatDecisionsForPrompt,
21
22
  formatRequirementsForPrompt,
22
23
  } from '../../context-store.ts';
23
24
  import { saveDecisionToDb, generateDecisionsMd } from '../../db-writer.ts';
25
+ import { backfillDecisionsToMemories } from '../../memory-backfill.ts';
24
26
  import { describe, test, beforeEach, afterEach } from 'node:test';
25
27
  import assert from 'node:assert/strict';
26
28
 
@@ -233,8 +235,8 @@ test('integration-lifecycle: full pipeline', async () => {
233
235
  assert.ok(typeof saved.id === 'string', 'lifecycle: saveDecisionToDb returned an id');
234
236
  assert.match(saved.id, /^D\d+$/, 'lifecycle: saved ID matches D### pattern');
235
237
 
236
- // Query back from DB
237
- const allAfterSave = queryDecisions();
238
+ // Query back from DB (memories — Stage 3 of ADR-013 stopped legacy decisions-table writes)
239
+ const allAfterSave = getAllDecisionsFromMemories();
238
240
  const savedDecision = allAfterSave.find(d => d.id === saved.id);
239
241
  assert.ok(savedDecision !== null && savedDecision !== undefined, `lifecycle: saved decision ${saved.id} found in DB`);
240
242
  assert.deepStrictEqual(savedDecision?.decision, 'integration test write-back decision', 'lifecycle: saved decision text matches');
@@ -253,9 +255,15 @@ test('integration-lifecycle: full pipeline', async () => {
253
255
  assert.deepStrictEqual(reparsedSaved?.rationale, 'proves round-trip fidelity', 'lifecycle: round-trip rationale preserved');
254
256
 
255
257
  // ── Step 8: DB consistency — total count sanity ─────────────────────
256
- const finalCount = queryDecisions().length;
257
- // Original 14 + 1 re-import + 1 saveDecisionToDb = 16
258
- assert.ok(finalCount === DECISIONS_COUNT + 2, `lifecycle: final DB count = ${DECISIONS_COUNT + 2} (got ${finalCount})`);
258
+ // ADR-013 Stage 3 split the write paths: migrateFromMarkdown still
259
+ // populates the legacy decisions table, but saveDecisionToDb now writes
260
+ // only to memories. The unified projection (and the post-#5756 cutover
261
+ // end-state) lives in memories, so simulate what bootstrap does and
262
+ // backfill the table rows into memories before counting.
263
+ backfillDecisionsToMemories();
264
+ const finalCount = getAllDecisionsFromMemories().length;
265
+ // Original 14 + 1 re-import (decisions table → memories via backfill) + 1 saveDecisionToDb = 16
266
+ assert.ok(finalCount === DECISIONS_COUNT + 2, `lifecycle: final memory-store count = ${DECISIONS_COUNT + 2} (got ${finalCount})`);
259
267
 
260
268
  closeDatabase();
261
269
  } finally {
@@ -14,7 +14,9 @@ import {
14
14
  generatePreview,
15
15
  writeGSDDirectory,
16
16
  } from '../../migrate/index.ts';
17
+ import { importWrittenMigrationToDb } from '../../migrate/command.ts';
17
18
  import { deriveState } from '../../state.ts';
19
+ import { closeDatabase, getDecisionById, getRequirementCounts } from '../../gsd-db.ts';
18
20
  import { describe, test, beforeEach, afterEach } from 'node:test';
19
21
  import assert from 'node:assert/strict';
20
22
 
@@ -52,6 +54,16 @@ const SAMPLE_REQUIREMENTS = `# Requirements
52
54
  - Description: Output matches GSD format.
53
55
  `;
54
56
 
57
+ const SAMPLE_REQUIREMENTS_LEGACY_IDS = `# Requirements
58
+
59
+ ## Active
60
+
61
+ - [ ] **CORE-PIPELINE**: Pipeline must work end-to-end.
62
+ - [ ] **OUTPUT-FORMAT**: Output matches GSD format.
63
+ - [ ] **IMPORT-DB**: Migration imports requirements into the DB.
64
+ - [ ] **STATUS-WIDGET**: Status can query migrated requirements.
65
+ `;
66
+
55
67
  const SAMPLE_STATE = `# State
56
68
 
57
69
  **Current Phase:** 20-features
@@ -166,14 +178,14 @@ Depends on foundation work.
166
178
  </context>
167
179
  `;
168
180
 
169
- function createCompleteFixture(): string {
181
+ function createCompleteFixture(requirementsContent: string = SAMPLE_REQUIREMENTS): string {
170
182
  const base = mkdtempSync(join(tmpdir(), 'gsd-cmd-test-'));
171
183
  const planning = join(base, '.planning');
172
184
  mkdirSync(planning, { recursive: true });
173
185
 
174
186
  writeFileSync(join(planning, 'PROJECT.md'), SAMPLE_PROJECT);
175
187
  writeFileSync(join(planning, 'ROADMAP.md'), SAMPLE_ROADMAP);
176
- writeFileSync(join(planning, 'REQUIREMENTS.md'), SAMPLE_REQUIREMENTS);
188
+ writeFileSync(join(planning, 'REQUIREMENTS.md'), requirementsContent);
177
189
  writeFileSync(join(planning, 'STATE.md'), SAMPLE_STATE);
178
190
  writeFileSync(join(planning, 'config.json'), SAMPLE_CONFIG);
179
191
 
@@ -303,6 +315,7 @@ test('Full pipeline: parse → transform → preview → write → deriveState',
303
315
  const expectedTaskPct = totalTasks > 0 ? Math.round((doneTasks / totalTasks) * 100) : 0;
304
316
  assert.deepStrictEqual(preview.sliceCompletionPct, expectedSlicePct, 'pipeline: preview sliceCompletionPct');
305
317
  assert.deepStrictEqual(preview.taskCompletionPct, expectedTaskPct, 'pipeline: preview taskCompletionPct');
318
+ assert.deepStrictEqual(preview.decisions.total, 1, 'pipeline: preview decisions total');
306
319
 
307
320
  // Requirements in preview
308
321
  assert.deepStrictEqual(preview.requirements.active, 1, 'pipeline: preview requirements active');
@@ -342,6 +355,39 @@ test('Full pipeline: parse → transform → preview → write → deriveState',
342
355
  }
343
356
  });
344
357
 
358
+ test('Full pipeline: legacy requirement IDs import into DB with canonical IDs', async () => {
359
+ const base = createCompleteFixture(SAMPLE_REQUIREMENTS_LEGACY_IDS);
360
+ const writeTarget = mkdtempSync(join(tmpdir(), 'gsd-cmd-legacy-reqs-'));
361
+ try {
362
+ const parsed = await parsePlanningDirectory(join(base, '.planning'));
363
+ const project = transformToGSD(parsed);
364
+ const preview = generatePreview(project);
365
+
366
+ assert.deepStrictEqual(
367
+ project.requirements.map((req) => req.id),
368
+ ['R001', 'R002', 'R003', 'R004'],
369
+ 'legacy-reqs: transform assigns canonical R IDs',
370
+ );
371
+ assert.ok(
372
+ project.requirements[0]?.description.includes('Legacy ID: CORE-PIPELINE'),
373
+ 'legacy-reqs: original ID survives in migrated requirement content',
374
+ );
375
+
376
+ await writeGSDDirectory(project, writeTarget);
377
+ const imported = await importWrittenMigrationToDb(writeTarget, preview);
378
+ const counts = getRequirementCounts();
379
+
380
+ assert.deepStrictEqual(imported.decisions, 1, 'legacy-reqs: DB import includes migrated decisions');
381
+ assert.deepStrictEqual(imported.requirements, 4, 'legacy-reqs: DB import count matches preview');
382
+ assert.ok(getDecisionById('D001') !== null, 'legacy-reqs: migrated decision is queryable');
383
+ assert.deepStrictEqual(counts.total, 4, 'legacy-reqs: DB stores all migrated requirements');
384
+ } finally {
385
+ closeDatabase();
386
+ rmSync(base, { recursive: true, force: true });
387
+ rmSync(writeTarget, { recursive: true, force: true });
388
+ }
389
+ });
390
+
345
391
  // ─── Test 6: .gsd/ exists detection ────────────────────────────────────
346
392
 
347
393
  test('.gsd/ exists detection', () => {
@@ -357,4 +403,3 @@ test('.gsd/ exists detection', () => {
357
403
  rmSync(base, { recursive: true, force: true });
358
404
  }
359
405
  });
360
-
@@ -883,7 +883,7 @@ describe("dispatch failure modes", () => {
883
883
  assert.ok(runUatIdx < uatGateIdx, "run-uat should precede uat-verdict-gate");
884
884
  });
885
885
 
886
- test("UAT verdict gate: ASSESSMENT FAIL blocks closed slice progression", async () => {
886
+ test("UAT verdict gate: ASSESSMENT FAIL does not hard-stop progression", async () => {
887
887
  base = createFullFixture();
888
888
  openDatabase(join(base, ".gsd", "gsd.db"));
889
889
  insertMilestone({ id: "M001", title: "Active", status: "active" });
@@ -908,11 +908,7 @@ describe("dispatch failure modes", () => {
908
908
  ctx.prefs = { uat_dispatch: true } as any;
909
909
 
910
910
  const result = await getUatVerdictGate().match(ctx);
911
- assert.equal(result?.action, "stop", "ASSESSMENT FAIL should block progression");
912
- assert.ok(
913
- (result as any).reason?.includes('UAT verdict for S01 is "fail"'),
914
- "stop reason should report normalized ASSESSMENT verdict",
915
- );
911
+ assert.equal(result, null, "ASSESSMENT FAIL should not hard-stop progression");
916
912
  });
917
913
 
918
914
  test("UAT verdict gate: ROADMAP fallback gates done slices when DB is unavailable", async () => {
@@ -964,15 +960,11 @@ describe("dispatch failure modes", () => {
964
960
  ctx.prefs = { uat_dispatch: true } as any;
965
961
 
966
962
  const result = await getUatVerdictGate().match(ctx);
967
- assert.equal(result?.action, "stop", "ROADMAP done slices should be gated without DB");
968
- assert.ok(
969
- (result as any).reason?.includes('UAT verdict for S01 is "needs-remediation"'),
970
- "stop reason should report normalized ASSESSMENT verdict from disk fallback",
971
- );
963
+ assert.equal(result, null, "ROADMAP done slices should not hard-stop progression without DB");
972
964
  });
973
965
 
974
966
  for (const status of ["done", "skipped"]) {
975
- test(`UAT verdict gate: legacy closed status "${status}" is gated`, async () => {
967
+ test(`UAT verdict gate: legacy closed status "${status}" does not hard-stop progression`, async () => {
976
968
  base = createFullFixture();
977
969
  openDatabase(join(base, ".gsd", "gsd.db"));
978
970
  insertMilestone({ id: "M001", title: "Active", status: "active" });
@@ -997,15 +989,7 @@ describe("dispatch failure modes", () => {
997
989
  ctx.prefs = { uat_dispatch: true } as any;
998
990
 
999
991
  const result = await getUatVerdictGate().match(ctx);
1000
- assert.equal(
1001
- result?.action,
1002
- "stop",
1003
- `${status} slices should be treated as closed for UAT verdict gating`,
1004
- );
1005
- assert.ok(
1006
- (result as any).reason?.includes('UAT verdict for S01 is "needs-remediation"'),
1007
- "stop reason should report normalized ASSESSMENT verdict",
1008
- );
992
+ assert.equal(result, null, `${status} slices should not hard-stop progression`);
1009
993
  });
1010
994
  }
1011
995
  });
@@ -31,6 +31,7 @@ import {
31
31
  openDatabase,
32
32
  closeDatabase,
33
33
  insertMilestone,
34
+ insertAssessment,
34
35
  insertSlice,
35
36
  insertTask,
36
37
  getTask,
@@ -280,6 +281,16 @@ function makeMilestoneParams(milestoneId: string): Record<string, unknown> {
280
281
  };
281
282
  }
282
283
 
284
+ function insertPassingMilestoneValidation(milestoneId: string): void {
285
+ insertAssessment({
286
+ path: `.gsd/milestones/${milestoneId}/${milestoneId}-VALIDATION.md`,
287
+ milestoneId,
288
+ status: "pass",
289
+ scope: "milestone-validation",
290
+ fullContent: "# Validation\n\nverdict: PASS",
291
+ });
292
+ }
293
+
283
294
  // ═══════════════════════════════════════════════════════════════════════════
284
295
  // Test Suite
285
296
  // ═══════════════════════════════════════════════════════════════════════════
@@ -424,6 +435,7 @@ describe("state-machine-live-validation", () => {
424
435
  insertTask({ id: "T01", sliceId: "S01", milestoneId: "M001", title: "Impl", status: "complete" });
425
436
  insertTask({ id: "T02", sliceId: "S01", milestoneId: "M001", title: "Test", status: "complete" });
426
437
  insertTask({ id: "T01", sliceId: "S02", milestoneId: "M001", title: "Impl", status: "complete" });
438
+ insertPassingMilestoneValidation("M001");
427
439
 
428
440
  const result = await handleCompleteMilestone(makeMilestoneParams("M001") as any, base);
429
441
  assert.ok(!("error" in result), `expected success, got: ${JSON.stringify(result)}`);
@@ -528,6 +540,7 @@ describe("state-machine-live-validation", () => {
528
540
  base = createFullFixture();
529
541
  openDatabase(join(base, ".gsd", "gsd.db"));
530
542
  insertMilestone({ id: "M001", title: "Active", status: "active" });
543
+ insertPassingMilestoneValidation("M001");
531
544
 
532
545
  const result = await handleCompleteMilestone(makeMilestoneParams("M001") as any, base);
533
546
  assert.ok("error" in result);
@@ -542,6 +555,7 @@ describe("state-machine-live-validation", () => {
542
555
  insertSlice({ id: "S02", milestoneId: "M001", status: "in_progress" });
543
556
  insertTask({ id: "T01", sliceId: "S01", milestoneId: "M001", status: "complete" });
544
557
  insertTask({ id: "T01", sliceId: "S02", milestoneId: "M001", status: "pending" });
558
+ insertPassingMilestoneValidation("M001");
545
559
 
546
560
  const result = await handleCompleteMilestone(makeMilestoneParams("M001") as any, base);
547
561
  assert.ok("error" in result);
@@ -555,6 +569,7 @@ describe("state-machine-live-validation", () => {
555
569
  // Slice marked complete but task is still pending — simulates inconsistent state
556
570
  insertSlice({ id: "S01", milestoneId: "M001", status: "complete" });
557
571
  insertTask({ id: "T01", sliceId: "S01", milestoneId: "M001", status: "pending" });
572
+ insertPassingMilestoneValidation("M001");
558
573
 
559
574
  const result = await handleCompleteMilestone(makeMilestoneParams("M001") as any, base);
560
575
  assert.ok("error" in result);
@@ -195,6 +195,11 @@ describe("infrastructure error detection", () => {
195
195
  assert.equal(isInfrastructureError(err), "EAGAIN");
196
196
  });
197
197
 
198
+ test("ENOBUFS (no buffer space available) is detected", () => {
199
+ const err = Object.assign(new Error("spawnSync git ENOBUFS"), { code: "ENOBUFS" });
200
+ assert.equal(isInfrastructureError(err), "ENOBUFS");
201
+ });
202
+
198
203
  test("SQLite WAL corruption is detected via message scan", () => {
199
204
  const err = new Error("database disk image is malformed");
200
205
  assert.equal(isInfrastructureError(err), "SQLITE_CORRUPT");
@@ -223,7 +228,7 @@ describe("infrastructure error detection", () => {
223
228
  test("all INFRA_ERROR_CODES are covered", () => {
224
229
  const expectedCodes = [
225
230
  "ENOSPC", "ENOMEM", "EROFS", "EDQUOT", "EMFILE",
226
- "ENFILE", "EAGAIN", "ECONNREFUSED", "ENOTFOUND", "ENETUNREACH",
231
+ "ENFILE", "EAGAIN", "ENOBUFS", "ECONNREFUSED", "ENOTFOUND", "ENETUNREACH",
227
232
  ];
228
233
  for (const code of expectedCodes) {
229
234
  assert.ok(INFRA_ERROR_CODES.has(code), `${code} should be in INFRA_ERROR_CODES`);
@@ -5,6 +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 { _handlePausedSessionResumeRecoveryForTest } from "../auto.ts";
8
9
  import { assessInterruptedSession } from "../interrupted-session.ts";
9
10
  import {
10
11
  openDatabase,
@@ -186,6 +187,45 @@ test("direct /gsd auto source only resumes paused-session metadata for recoverab
186
187
  assert.ok(source.includes('|| !!freshStartAssessment.lock'));
187
188
  });
188
189
 
190
+ test("direct /gsd auto skips paused-session replay when recovered unit already completed", async () => {
191
+ const base = makeTmpBase();
192
+ try {
193
+ writeRoadmap(base, false);
194
+ const sliceDir = join(base, ".gsd", "milestones", "M001", "slices", "S01");
195
+ const tasksDir = join(sliceDir, "tasks");
196
+ mkdirSync(tasksDir, { recursive: true });
197
+ writeFileSync(
198
+ join(sliceDir, "S01-PLAN.md"),
199
+ [
200
+ "# S01: Test Slice",
201
+ "",
202
+ "## Tasks",
203
+ "",
204
+ "- [ ] **T01: First task** `est:1h`",
205
+ ].join("\n"),
206
+ "utf-8",
207
+ );
208
+ writeFileSync(join(tasksDir, "T01-PLAN.md"), "# T01 Plan\n\nDo the thing.\n", "utf-8");
209
+
210
+ const state = {
211
+ pausedSessionFile: join(base, ".gsd", "activity", "paused-session.jsonl"),
212
+ currentUnit: null,
213
+ pausedUnitType: "plan-slice",
214
+ pausedUnitId: "M001/S01",
215
+ pendingCrashRecovery: "stale-recovery-prompt",
216
+ };
217
+
218
+ const result = _handlePausedSessionResumeRecoveryForTest(base, state);
219
+ assert.equal(result.skippedReplay, true);
220
+ assert.equal(state.pausedSessionFile, null);
221
+ assert.equal(state.pendingCrashRecovery, null);
222
+ assert.equal(state.pausedUnitType, null);
223
+ assert.equal(state.pausedUnitId, null);
224
+ } finally {
225
+ cleanup(base);
226
+ }
227
+ });
228
+
189
229
  test("auto module imports successfully after interrupted-session changes", async () => {
190
230
  const mod = await import(`../auto.ts?ts=${Date.now()}-${Math.random()}`);
191
231
  assert.equal(typeof mod.startAuto, "function");