gsd-pi 2.82.0 → 3.0.0-dev.8b8d129d7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (744) hide show
  1. package/README.md +125 -32
  2. package/dist/cli.js +20 -9
  3. package/dist/headless.js +9 -2
  4. package/dist/resources/.managed-resources-content-hash +1 -1
  5. package/dist/resources/GSD-WORKFLOW.md +10 -1
  6. package/dist/resources/extensions/browser-tools/tools/screenshot.js +1 -0
  7. package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
  8. package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
  9. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -6
  10. package/dist/resources/extensions/cmux/index.js +5 -0
  11. package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
  12. package/dist/resources/extensions/gsd/auto/loop.js +110 -37
  13. package/dist/resources/extensions/gsd/auto/orchestrator.js +124 -6
  14. package/dist/resources/extensions/gsd/auto/phases.js +106 -38
  15. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  16. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
  17. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  18. package/dist/resources/extensions/gsd/auto-dashboard.js +66 -1
  19. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  20. package/dist/resources/extensions/gsd/auto-dispatch.js +20 -19
  21. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  22. package/dist/resources/extensions/gsd/auto-post-unit.js +278 -137
  23. package/dist/resources/extensions/gsd/auto-prompts.js +47 -13
  24. package/dist/resources/extensions/gsd/auto-recovery.js +79 -14
  25. package/dist/resources/extensions/gsd/auto-start.js +87 -14
  26. package/dist/resources/extensions/gsd/auto-timers.js +11 -3
  27. package/dist/resources/extensions/gsd/auto-verification.js +102 -34
  28. package/dist/resources/extensions/gsd/auto-worktree.js +178 -11
  29. package/dist/resources/extensions/gsd/auto.js +216 -81
  30. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +31 -7
  31. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -9
  32. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +10 -4
  33. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  34. package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
  35. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
  36. package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
  37. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  38. package/dist/resources/extensions/gsd/commands/handlers/core.js +39 -1
  39. package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
  40. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  41. package/dist/resources/extensions/gsd/commands-handlers.js +17 -2
  42. package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
  43. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +7 -2
  44. package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
  45. package/dist/resources/extensions/gsd/context-store.js +112 -0
  46. package/dist/resources/extensions/gsd/crash-recovery.js +43 -5
  47. package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
  48. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  49. package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
  50. package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
  51. package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
  52. package/dist/resources/extensions/gsd/db-writer.js +150 -84
  53. package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
  54. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -1
  55. package/dist/resources/extensions/gsd/doctor-git-checks.js +87 -7
  56. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  57. package/dist/resources/extensions/gsd/doctor.js +2 -28
  58. package/dist/resources/extensions/gsd/export-html.js +27 -425
  59. package/dist/resources/extensions/gsd/forensics.js +8 -3
  60. package/dist/resources/extensions/gsd/git-service.js +138 -10
  61. package/dist/resources/extensions/gsd/gsd-db.js +76 -33
  62. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  63. package/dist/resources/extensions/gsd/guided-flow.js +110 -117
  64. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  65. package/dist/resources/extensions/gsd/init-wizard.js +17 -2
  66. package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
  67. package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
  68. package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
  69. package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
  70. package/dist/resources/extensions/gsd/markdown-renderer.js +16 -9
  71. package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
  72. package/dist/resources/extensions/gsd/md-importer.js +1 -1
  73. package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
  74. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
  75. package/dist/resources/extensions/gsd/migrate/command.js +5 -0
  76. package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
  77. package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
  78. package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
  79. package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
  80. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  81. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  82. package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
  83. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
  84. package/dist/resources/extensions/gsd/paths.js +4 -0
  85. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  86. package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
  87. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
  88. package/dist/resources/extensions/gsd/pre-execution-checks.js +38 -11
  89. package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
  90. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  91. package/dist/resources/extensions/gsd/preferences-validation.js +138 -0
  92. package/dist/resources/extensions/gsd/preferences.js +2 -0
  93. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  94. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  95. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  96. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  97. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  98. package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
  99. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  100. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  101. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  102. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  103. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  104. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  105. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  106. package/dist/resources/extensions/gsd/prompts/system.md +2 -2
  107. package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
  108. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  109. package/dist/resources/extensions/gsd/repository-registry.js +44 -0
  110. package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
  111. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
  112. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +59 -2
  113. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  114. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  115. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  116. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  117. package/dist/resources/extensions/gsd/state.js +14 -4
  118. package/dist/resources/extensions/gsd/status-guards.js +14 -2
  119. package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
  120. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  121. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  122. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -8
  123. package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
  124. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  125. package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
  126. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
  127. package/dist/resources/extensions/gsd/unit-context-manifest.js +36 -17
  128. package/dist/resources/extensions/gsd/validation.js +23 -1
  129. package/dist/resources/extensions/gsd/verification-gate.js +142 -7
  130. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  131. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  132. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  133. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  134. package/dist/resources/extensions/gsd/worktree-lifecycle.js +54 -10
  135. package/dist/resources/extensions/gsd/worktree-manager.js +1 -1
  136. package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
  137. package/dist/resources/extensions/shared/html-shell.js +388 -0
  138. package/dist/resources/extensions/shared/interview-ui.js +6 -4
  139. package/dist/resources/extensions/subagent/index.js +448 -78
  140. package/dist/resources/extensions/subagent/launch.js +77 -0
  141. package/dist/resources/extensions/subagent/run-store.js +148 -0
  142. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  143. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  144. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  145. package/dist/resources/extensions/visual-brief/index.js +5 -0
  146. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  147. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  148. package/dist/resources/skills/forensics/SKILL.md +1 -1
  149. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  150. package/dist/web/standalone/.next/BUILD_ID +1 -1
  151. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  152. package/dist/web/standalone/.next/build-manifest.json +4 -4
  153. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  154. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  155. package/dist/web/standalone/.next/required-server-files.json +3 -3
  156. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  157. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  159. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  160. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  161. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  162. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  163. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  164. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  166. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  167. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  170. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  171. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  172. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  174. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  176. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  177. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  184. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  196. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  216. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  222. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  226. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  232. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  235. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  236. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  238. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  239. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  240. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  241. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  242. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  244. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  245. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  246. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  247. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  248. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  249. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  250. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  252. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  253. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  254. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  255. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  256. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  257. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  258. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  259. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  260. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  261. package/dist/web/standalone/.next/server/app/index.html +1 -1
  262. package/dist/web/standalone/.next/server/app/index.rsc +5 -8
  263. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  264. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -8
  265. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  266. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  267. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  268. package/dist/web/standalone/.next/server/app/page.js +2 -2
  269. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  270. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  271. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  272. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  273. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  274. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  275. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  276. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  277. package/dist/web/standalone/.next/server/middleware.js +2 -2
  278. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  279. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  280. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  281. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  282. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  283. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  284. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  285. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  286. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  287. package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
  288. package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +1 -0
  289. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  290. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  291. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  292. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  293. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  294. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  295. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  296. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  297. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  298. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  299. package/dist/web/standalone/server.js +1 -1
  300. package/package.json +6 -5
  301. package/packages/contracts/dist/rpc.test.js +7 -0
  302. package/packages/contracts/dist/rpc.test.js.map +1 -1
  303. package/packages/contracts/dist/workflow.d.ts +21 -0
  304. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  305. package/packages/contracts/dist/workflow.js +24 -0
  306. package/packages/contracts/dist/workflow.js.map +1 -1
  307. package/packages/contracts/src/rpc.test.ts +8 -0
  308. package/packages/contracts/src/workflow.ts +24 -0
  309. package/packages/daemon/package.json +2 -2
  310. package/packages/mcp-server/README.md +14 -3
  311. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  312. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  313. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  314. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  315. package/packages/mcp-server/package.json +2 -2
  316. package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
  317. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  318. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  319. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  320. package/packages/native/package.json +1 -1
  321. package/packages/native/tsconfig.json +2 -1
  322. package/packages/native/tsconfig.tsbuildinfo +1 -1
  323. package/packages/pi-agent-core/package.json +1 -1
  324. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  325. package/packages/pi-ai/dist/index.d.ts +2 -2
  326. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  327. package/packages/pi-ai/dist/index.js +1 -1
  328. package/packages/pi-ai/dist/index.js.map +1 -1
  329. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  330. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  331. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  332. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  333. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  334. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  335. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  336. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  337. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  338. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  339. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  340. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  341. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  342. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  343. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  344. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  345. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  346. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  347. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  348. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  349. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  350. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  351. package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
  352. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  353. package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
  354. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  355. package/packages/pi-ai/package.json +1 -1
  356. package/packages/pi-ai/src/index.ts +7 -2
  357. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  358. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  359. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  360. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  361. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  362. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  363. package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
  364. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  365. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  366. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  367. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  368. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  369. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  370. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  371. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  372. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  373. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
  374. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  375. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
  376. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  377. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
  378. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  380. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
  382. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  383. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  384. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  385. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  386. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  387. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +71 -97
  388. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  389. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
  390. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  391. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
  392. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  393. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  394. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  395. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  396. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  397. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  398. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  399. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
  400. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
  401. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
  402. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
  403. package/packages/pi-coding-agent/package.json +1 -1
  404. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  405. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  406. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  407. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
  408. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
  409. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  410. package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
  411. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  412. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -102
  413. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
  414. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
  415. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  416. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  417. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
  418. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  419. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  420. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  421. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  422. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  423. package/packages/pi-tui/dist/__tests__/tui.test.js +45 -2
  424. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  425. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  426. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  427. package/packages/pi-tui/dist/terminal.js +12 -0
  428. package/packages/pi-tui/dist/terminal.js.map +1 -1
  429. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  430. package/packages/pi-tui/dist/tui.js +108 -24
  431. package/packages/pi-tui/dist/tui.js.map +1 -1
  432. package/packages/pi-tui/package.json +1 -1
  433. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  434. package/packages/pi-tui/src/__tests__/tui.test.ts +59 -2
  435. package/packages/pi-tui/src/terminal.ts +11 -0
  436. package/packages/pi-tui/src/tui.ts +111 -24
  437. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  438. package/packages/rpc-client/package.json +1 -1
  439. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  440. package/pkg/package.json +1 -1
  441. package/src/resources/GSD-WORKFLOW.md +10 -1
  442. package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
  443. package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
  444. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  445. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
  446. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  447. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
  448. package/src/resources/extensions/cmux/index.ts +6 -0
  449. package/src/resources/extensions/gsd/auto/contracts.ts +62 -16
  450. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  451. package/src/resources/extensions/gsd/auto/loop.ts +111 -38
  452. package/src/resources/extensions/gsd/auto/orchestrator.ts +129 -6
  453. package/src/resources/extensions/gsd/auto/phases.ts +129 -49
  454. package/src/resources/extensions/gsd/auto/session.ts +16 -0
  455. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  456. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  457. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  458. package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
  459. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  460. package/src/resources/extensions/gsd/auto-dispatch.ts +21 -19
  461. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  462. package/src/resources/extensions/gsd/auto-post-unit.ts +312 -148
  463. package/src/resources/extensions/gsd/auto-prompts.ts +47 -16
  464. package/src/resources/extensions/gsd/auto-recovery.ts +83 -11
  465. package/src/resources/extensions/gsd/auto-start.ts +94 -12
  466. package/src/resources/extensions/gsd/auto-timers.ts +10 -3
  467. package/src/resources/extensions/gsd/auto-verification.ts +124 -42
  468. package/src/resources/extensions/gsd/auto-worktree.ts +195 -11
  469. package/src/resources/extensions/gsd/auto.ts +217 -70
  470. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +42 -7
  471. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -9
  472. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +11 -4
  473. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  474. package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
  475. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
  476. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  477. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  478. package/src/resources/extensions/gsd/commands/handlers/core.ts +42 -1
  479. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  480. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  481. package/src/resources/extensions/gsd/commands-handlers.ts +21 -2
  482. package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
  483. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +8 -3
  484. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  485. package/src/resources/extensions/gsd/context-store.ts +120 -1
  486. package/src/resources/extensions/gsd/crash-recovery.ts +44 -4
  487. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  488. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  489. package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
  490. package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
  491. package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
  492. package/src/resources/extensions/gsd/db-writer.ts +167 -84
  493. package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
  494. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -1
  495. package/src/resources/extensions/gsd/doctor-git-checks.ts +89 -7
  496. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  497. package/src/resources/extensions/gsd/doctor-types.ts +3 -0
  498. package/src/resources/extensions/gsd/doctor.ts +2 -27
  499. package/src/resources/extensions/gsd/export-html.ts +27 -427
  500. package/src/resources/extensions/gsd/forensics.ts +7 -3
  501. package/src/resources/extensions/gsd/git-service.ts +166 -11
  502. package/src/resources/extensions/gsd/gsd-db.ts +80 -31
  503. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  504. package/src/resources/extensions/gsd/guided-flow.ts +142 -134
  505. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  506. package/src/resources/extensions/gsd/init-wizard.ts +17 -2
  507. package/src/resources/extensions/gsd/journal.ts +8 -1
  508. package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
  509. package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
  510. package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
  511. package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
  512. package/src/resources/extensions/gsd/markdown-renderer.ts +16 -9
  513. package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
  514. package/src/resources/extensions/gsd/md-importer.ts +1 -1
  515. package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
  516. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
  517. package/src/resources/extensions/gsd/migrate/command.ts +5 -0
  518. package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
  519. package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
  520. package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
  521. package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
  522. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  523. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  524. package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
  525. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
  526. package/src/resources/extensions/gsd/paths.ts +5 -0
  527. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  528. package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
  529. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
  530. package/src/resources/extensions/gsd/pre-execution-checks.ts +49 -11
  531. package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
  532. package/src/resources/extensions/gsd/preferences-types.ts +33 -0
  533. package/src/resources/extensions/gsd/preferences-validation.ts +145 -0
  534. package/src/resources/extensions/gsd/preferences.ts +5 -0
  535. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  536. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  537. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  538. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  539. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  540. package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
  541. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  542. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  543. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  544. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  545. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  546. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  547. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  548. package/src/resources/extensions/gsd/prompts/system.md +2 -2
  549. package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
  550. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  551. package/src/resources/extensions/gsd/repository-registry.ts +77 -0
  552. package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
  553. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
  554. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +52 -1
  555. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  556. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  557. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  558. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  559. package/src/resources/extensions/gsd/state.ts +15 -4
  560. package/src/resources/extensions/gsd/status-guards.ts +16 -2
  561. package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
  562. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  563. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  564. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  565. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  566. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +375 -1
  567. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +578 -8
  568. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  569. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  570. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  571. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +129 -6
  572. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
  573. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +4 -4
  574. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  575. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  576. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  577. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
  578. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  579. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
  580. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  581. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  582. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
  583. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  584. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  585. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
  586. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +5 -9
  587. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  588. package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
  589. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +86 -2
  590. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  591. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  592. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
  593. package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
  594. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
  595. package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
  596. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
  597. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +66 -0
  598. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
  599. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  600. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
  601. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
  602. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  603. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
  604. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
  605. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
  606. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  607. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  608. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  609. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  610. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  611. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  612. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  613. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  614. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  615. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  616. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
  617. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
  618. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  619. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +199 -2
  620. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
  621. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
  622. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  623. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
  624. package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
  625. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
  626. package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
  627. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
  628. package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
  629. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
  630. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
  631. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
  632. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  633. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
  634. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
  635. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
  636. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  637. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
  638. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  639. package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
  640. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  641. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  642. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  643. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
  644. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  645. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  646. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
  647. package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
  648. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  649. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
  650. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
  651. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  652. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +59 -0
  653. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
  654. package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
  655. package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
  656. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +70 -0
  657. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -0
  658. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  659. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  660. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
  661. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  662. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  663. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  664. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
  665. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  666. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
  667. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +10 -0
  668. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +72 -1
  669. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  670. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +53 -2
  671. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  672. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  673. package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
  674. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  675. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
  676. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  677. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +128 -9
  678. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
  679. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  680. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
  681. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +173 -1
  682. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  683. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  684. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  685. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  686. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1 -1
  687. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  688. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  689. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +25 -0
  690. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
  691. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
  692. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
  693. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
  694. package/src/resources/extensions/gsd/tools/complete-milestone.ts +8 -10
  695. package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
  696. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  697. package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
  698. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
  699. package/src/resources/extensions/gsd/types.ts +1 -1
  700. package/src/resources/extensions/gsd/unit-context-manifest.ts +51 -18
  701. package/src/resources/extensions/gsd/validation.ts +23 -1
  702. package/src/resources/extensions/gsd/verification-gate.ts +170 -6
  703. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  704. package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
  705. package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
  706. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  707. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  708. package/src/resources/extensions/gsd/worktree-lifecycle.ts +61 -10
  709. package/src/resources/extensions/gsd/worktree-manager.ts +1 -1
  710. package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
  711. package/src/resources/extensions/shared/html-shell.ts +412 -0
  712. package/src/resources/extensions/shared/interview-ui.ts +6 -4
  713. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
  714. package/src/resources/extensions/subagent/index.ts +567 -103
  715. package/src/resources/extensions/subagent/launch.ts +131 -0
  716. package/src/resources/extensions/subagent/run-store.ts +218 -0
  717. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  718. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  719. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  720. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  721. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  722. package/src/resources/extensions/visual-brief/index.ts +8 -0
  723. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  724. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  725. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  726. package/src/resources/skills/forensics/SKILL.md +1 -1
  727. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  728. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  729. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  730. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  731. package/dist/web/standalone/.next/static/chunks/app/layout-9ecfd95f343793f0.js +0 -1
  732. package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +0 -1
  733. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  734. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  735. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  736. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  737. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  738. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  739. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  740. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  741. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  742. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  743. /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → _kljR-_Miq_YV1IW0wpRO}/_buildManifest.js +0 -0
  744. /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → _kljR-_Miq_YV1IW0wpRO}/_ssgManifest.js +0 -0
@@ -1,6 +1,7 @@
1
1
  import type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from "@gsd/pi-coding-agent";
2
2
  import type { Model } from "@gsd/pi-ai";
3
3
  import type { GSDState } from "../../types.js";
4
+ import { createRequire } from "node:module";
4
5
 
5
6
  import { computeProgressScore, formatProgressLine } from "../../progress-score.js";
6
7
  import { loadEffectiveGSDPreferences, getGlobalGSDPreferencesPath, getProjectGSDPreferencesPath } from "../../preferences.js";
@@ -11,6 +12,8 @@ import { handleCmux } from "../../commands-cmux.js";
11
12
  import { setSessionModelOverride } from "../../session-model-override.js";
12
13
  import { projectRoot } from "../context.js";
13
14
  import { formattedShortcutPair } from "../../shortcut-defs.js";
15
+ import { getVisualBriefOutputDir } from "../../../visual-brief/artifact-policy.js";
16
+ import { buildVisualBriefPrompt, parseVisualBriefArgs, VISUAL_BRIEF_USAGE } from "../../../visual-brief/prompts.js";
14
17
 
15
18
  export function showHelp(ctx: ExtensionCommandContext, args = ""): void {
16
19
  const summaryLines = [
@@ -27,6 +30,7 @@ export function showHelp(ctx: ExtensionCommandContext, args = ""): void {
27
30
  ` /gsd parallel watch Parallel monitor (${formattedShortcutPair("parallel")})`,
28
31
  ` /gsd notifications Notification history (${formattedShortcutPair("notifications")})`,
29
32
  " /gsd visualize Interactive 10-tab TUI",
33
+ " /gsd brief <mode> Visual HTML brief (diagram, plan, diff, recap, table, slides)",
30
34
  " /gsd queue Show queued/dispatched units",
31
35
  "",
32
36
  "COURSE CORRECTION",
@@ -67,6 +71,7 @@ export function showHelp(ctx: ExtensionCommandContext, args = ""): void {
67
71
  " /gsd new-project Bootstrap a new project (use --deep for staged project-level discovery)",
68
72
  " /gsd quick Execute a quick task without full planning overhead",
69
73
  " /gsd dispatch Dispatch a specific phase directly [research|plan|execute|complete|uat|replan]",
74
+ " /gsd verdict <v> Override milestone validation verdict [pass|needs-attention|needs-remediation] [--milestone Mxxx] [--rationale \"...\"]",
70
75
  " /gsd parallel Parallel milestone orchestration [start|status|stop|pause|resume|merge|watch]",
71
76
  " /gsd workflow Custom workflow lifecycle [new|run|list|validate|pause|resume]",
72
77
  "",
@@ -75,6 +80,7 @@ export function showHelp(ctx: ExtensionCommandContext, args = ""): void {
75
80
  ` /gsd parallel watch Open parallel worker monitor (${formattedShortcutPair("parallel")})`,
76
81
  " /gsd widget Cycle status widget [full|small|min|off]",
77
82
  " /gsd visualize Interactive 10-tab TUI (progress, timeline, deps, metrics, health, agent, changes, knowledge, captures, export)",
83
+ " /gsd brief <mode> Generate a visual HTML brief [diagram|plan|diff|recap|table|slides] [topic] [--slides]",
78
84
  " /gsd queue Show queued/dispatched units and execution order",
79
85
  " /gsd history View execution history [--cost] [--phase] [--model] [N]",
80
86
  " /gsd changelog Show categorized release notes [version]",
@@ -96,7 +102,7 @@ export function showHelp(ctx: ExtensionCommandContext, args = ""): void {
96
102
  " /gsd unpark [id] Reactivate a parked milestone",
97
103
  "",
98
104
  "PROJECT KNOWLEDGE",
99
- " /gsd knowledge <type> <text> Add rule, pattern, or lesson to KNOWLEDGE.md",
105
+ " /gsd knowledge <type> <text> Add a rule to KNOWLEDGE.md or capture a pattern/lesson to memories",
100
106
  " /gsd codebase [generate|update|stats] Manage the CODEBASE.md cache used in prompt context",
101
107
  "",
102
108
  "SHIPPING & BACKLOG",
@@ -203,6 +209,37 @@ export async function handleVisualize(ctx: ExtensionCommandContext): Promise<voi
203
209
  }
204
210
  }
205
211
 
212
+ export async function handleBrief(args: string, ctx: ExtensionCommandContext, pi?: ExtensionAPI): Promise<void> {
213
+ const request = parseVisualBriefArgs(args);
214
+ if (!request) {
215
+ ctx.ui.notify(VISUAL_BRIEF_USAGE, "info");
216
+ return;
217
+ }
218
+
219
+ if (!pi?.sendUserMessage) {
220
+ ctx.ui.notify("Visual brief generation is unavailable in this context.", "warning");
221
+ return;
222
+ }
223
+
224
+ const outputDir = getVisualBriefOutputDir();
225
+ const version = resolveGsdVersion();
226
+ pi.sendUserMessage(buildVisualBriefPrompt(request, { outputDir, version }));
227
+ }
228
+
229
+ const briefRequire = createRequire(import.meta.url);
230
+
231
+ function resolveGsdVersion(): string | undefined {
232
+ const envVersion = process.env.GSD_VERSION?.trim();
233
+ if (envVersion) return envVersion;
234
+ try {
235
+ const pkg = briefRequire("../../../../../../package.json") as { version?: unknown };
236
+ const fromPkg = typeof pkg.version === "string" ? pkg.version.trim() : "";
237
+ return fromPkg || undefined;
238
+ } catch {
239
+ return undefined;
240
+ }
241
+ }
242
+
206
243
  export async function handleSetup(args: string, ctx: ExtensionCommandContext, pi?: ExtensionAPI): Promise<void> {
207
244
  const { detectProjectState, hasGlobalSetup } = await import("../../detection.js");
208
245
  const { isOnboardingComplete, readOnboardingRecord } = await import("../../onboarding-state.js");
@@ -429,6 +466,10 @@ export async function handleCoreCommand(
429
466
  await handleVisualize(ctx);
430
467
  return true;
431
468
  }
469
+ if (trimmed === "brief" || trimmed.startsWith("brief ")) {
470
+ await handleBrief(trimmed.replace(/^brief\s*/, "").trim(), ctx, pi);
471
+ return true;
472
+ }
432
473
  if (trimmed === "widget" || trimmed.startsWith("widget ")) {
433
474
  const { cycleWidgetMode, setWidgetMode, getWidgetMode } = await import("../../auto-dashboard.js");
434
475
  const arg = trimmed.replace(/^widget\s*/, "").trim();
@@ -20,6 +20,22 @@ import { handlePrBranch } from "../../commands-pr-branch.js";
20
20
  import { currentDirectoryRoot, projectRoot } from "../context.js";
21
21
 
22
22
  export async function handleOpsCommand(trimmed: string, ctx: ExtensionCommandContext, pi: ExtensionAPI): Promise<boolean> {
23
+ const directDispatchAlias = new Map<string, string>([
24
+ ["research-milestone", "research"],
25
+ ["research-slice", "research"],
26
+ ["plan-milestone", "plan"],
27
+ ["plan-slice", "plan"],
28
+ ["execute-task", "execute"],
29
+ ["complete-slice", "complete"],
30
+ ["validate-milestone", "uat"],
31
+ ["complete-milestone", "complete"],
32
+ ]);
33
+ const aliasPhase = directDispatchAlias.get(trimmed);
34
+ if (aliasPhase) {
35
+ await dispatchDirectPhase(ctx, pi, aliasPhase, projectRoot());
36
+ return true;
37
+ }
38
+
23
39
  if (trimmed === "init") {
24
40
  const { detectProjectState } = await import("../../detection.js");
25
41
  const { handleReinit, showProjectInit } = await import("../../init-wizard.js");
@@ -188,6 +204,11 @@ Examples:
188
204
  await dispatchDirectPhase(ctx, pi, phase, projectRoot());
189
205
  return true;
190
206
  }
207
+ if (trimmed === "verdict" || trimmed.startsWith("verdict ")) {
208
+ const { handleVerdict } = await import("../../commands-verdict.js");
209
+ await handleVerdict(trimmed.replace(/^verdict\s*/, "").trim(), ctx, projectRoot());
210
+ return true;
211
+ }
191
212
  if (trimmed === "notifications" || trimmed.startsWith("notifications ")) {
192
213
  const { handleNotificationsCommand } = await import("./notifications-handler.js");
193
214
  await handleNotificationsCommand(trimmed.replace(/^notifications\s*/, "").trim(), ctx, pi);
@@ -1,4 +1,5 @@
1
1
  import { importExtensionModule, type ExtensionAPI, type ExtensionCommandContext } from "@gsd/pi-coding-agent";
2
+ import { VISUAL_BRIEF_MODES } from "../visual-brief/prompts.js";
2
3
 
3
4
  const TOP_LEVEL_SUBCOMMANDS = [
4
5
  { cmd: "help", desc: "Categorized command reference with descriptions" },
@@ -8,6 +9,7 @@ const TOP_LEVEL_SUBCOMMANDS = [
8
9
  { cmd: "pause", desc: "Pause auto-mode (preserves state, /gsd auto to resume)" },
9
10
  { cmd: "status", desc: "Progress dashboard" },
10
11
  { cmd: "visualize", desc: "Open workflow visualizer" },
12
+ { cmd: "brief", desc: "Generate a visual HTML brief" },
11
13
  { cmd: "queue", desc: "Queue and reorder future milestones" },
12
14
  { cmd: "quick", desc: "Execute a quick task without full planning overhead" },
13
15
  { cmd: "discuss", desc: "Discuss architecture and decisions" },
@@ -87,6 +89,14 @@ function getGsdArgumentCompletions(prefix: string) {
87
89
  ], "next");
88
90
  }
89
91
 
92
+ if (parts[0] === "brief" && parts.length <= 2) {
93
+ return filterStartsWith(
94
+ partial,
95
+ VISUAL_BRIEF_MODES.map((mode) => ({ cmd: mode.mode, desc: mode.description })),
96
+ "brief",
97
+ );
98
+ }
99
+
90
100
  if ((parts[0] === "new-project" || parts[0] === "new-milestone") && parts.length <= 2) {
91
101
  return filterStartsWith(partial, [
92
102
  { cmd: "--deep", desc: "Enable deep planning mode (staged project-level discovery)" },
@@ -123,6 +123,8 @@ export async function handleDoctor(args: string, ctx: ExtensionCommandContext, p
123
123
  const { jsonMode, dryRun, fixFlag, includeBuild, includeTests, mode, requestedScope } = parseDoctorArgs(args);
124
124
  const scope = await selectDoctorScope(projectRoot(), requestedScope);
125
125
  const effectiveScope = mode === "audit" ? requestedScope : scope;
126
+ const { ensureDbOpen } = await import("./bootstrap/dynamic-tools.js");
127
+ await ensureDbOpen(projectRoot());
126
128
  const report = await runGSDDoctor(projectRoot(), {
127
129
  fix: mode === "fix" || mode === "heal" || dryRun || fixFlag,
128
130
  dryRun,
@@ -368,8 +370,25 @@ export async function handleKnowledge(args: string, ctx: ExtensionCommandContext
368
370
  ? `${state.activeMilestone.id}${state.activeSlice ? `/${state.activeSlice.id}` : ""}`
369
371
  : "global";
370
372
 
371
- await appendKnowledge(basePath, type, entryText, scope);
372
- ctx.ui.notify(`Added ${type} to KNOWLEDGE.md: "${entryText}"`, "success");
373
+ // ADR-013 Stage 2c: Patterns and Lessons land in the memories table; the
374
+ // next session-start projection render emits them back into KNOWLEDGE.md.
375
+ // Rules stay file-canonical per ADR-013 line 39 — Rules are not migrated.
376
+ if (type === "rule") {
377
+ await appendKnowledge(basePath, type, entryText, scope);
378
+ ctx.ui.notify(`Added rule to KNOWLEDGE.md: "${entryText}"`, "success");
379
+ return;
380
+ }
381
+
382
+ const { captureKnowledgeEntry } = await import("./knowledge-capture.js");
383
+ const { id, written } = captureKnowledgeEntry(basePath, type, entryText, scope);
384
+ if (!written) {
385
+ ctx.ui.notify(`Could not persist ${type} — see logs for details.`, "error");
386
+ return;
387
+ }
388
+ ctx.ui.notify(
389
+ `Captured ${type} ${id} to memories; KNOWLEDGE.md will render it on next session start.`,
390
+ "success",
391
+ );
373
392
  }
374
393
 
375
394
  export async function handleRunHook(args: string, ctx: ExtensionCommandContext, pi: ExtensionAPI): Promise<void> {
@@ -32,6 +32,11 @@ export interface McpServerDetail extends McpServerStatus {
32
32
  tools: string[];
33
33
  }
34
34
 
35
+ export function hasHostMcpTool(systemPrompt: string, serverName: string): boolean {
36
+ const marker = `mcp__${serverName}__`;
37
+ return systemPrompt.includes(marker);
38
+ }
39
+
35
40
  export function formatMcpInitResult(
36
41
  status: "created" | "updated" | "unchanged",
37
42
  configPath: string,
@@ -184,6 +189,7 @@ export async function handleMcpStatus(
184
189
  const trimmed = args.trim();
185
190
  const lowered = trimmed.toLowerCase();
186
191
  const configs = readMcpConfigs();
192
+ const systemPrompt = ctx.getSystemPrompt();
187
193
 
188
194
  // /gsd mcp init [dir]
189
195
  if (!lowered || lowered === "status") {
@@ -233,6 +239,7 @@ export async function handleMcpStatus(
233
239
  } catch {
234
240
  // mcp-client may not expose status helpers — that's fine
235
241
  }
242
+ if (!connected && !error && hasHostMcpTool(systemPrompt, serverName)) connected = true;
236
243
 
237
244
  ctx.ui.notify(
238
245
  formatMcpServerDetail({
@@ -270,6 +277,7 @@ export async function handleMcpStatus(
270
277
  } catch {
271
278
  // Fall back to unknown state
272
279
  }
280
+ if (!connected && !error && hasHostMcpTool(systemPrompt, config.name)) connected = true;
273
281
 
274
282
  statuses.push({
275
283
  name: config.name,
@@ -587,10 +587,15 @@ async function configureModels(ctx: ExtensionCommandContext, prefs: Record<strin
587
587
  const models: Record<string, unknown> = (prefs.models as Record<string, unknown>) ?? {};
588
588
 
589
589
  const availableModels = ctx.modelRegistry.getAvailable();
590
- if (availableModels.length > 0) {
590
+ const getAllWithDiscovered = (ctx.modelRegistry as { getAllWithDiscovered?: () => typeof availableModels }).getAllWithDiscovered;
591
+ const availableProviders = new Set(availableModels.map((m) => m.provider));
592
+ const selectableModels = typeof getAllWithDiscovered === "function"
593
+ ? getAllWithDiscovered().filter((m) => availableProviders.has(m.provider))
594
+ : availableModels;
595
+ if (selectableModels.length > 0) {
591
596
  // Group models by provider, sorted alphabetically
592
- const byProvider = new Map<string, typeof availableModels>();
593
- for (const m of availableModels) {
597
+ const byProvider = new Map<string, typeof selectableModels>();
598
+ for (const m of selectableModels) {
594
599
  let group = byProvider.get(m.provider);
595
600
  if (!group) {
596
601
  group = [];
@@ -0,0 +1,202 @@
1
+ import type { ExtensionCommandContext } from "@gsd/pi-coding-agent";
2
+
3
+ import { loadFile } from "./files.js";
4
+ import { resolveMilestoneFile } from "./paths.js";
5
+ import { deriveState } from "./state.js";
6
+ import { executeValidateMilestone } from "./tools/workflow-tool-executors.js";
7
+ import {
8
+ VALIDATION_VERDICTS,
9
+ extractVerdict,
10
+ isValidMilestoneVerdict,
11
+ type ValidationVerdict,
12
+ } from "./verdict-parser.js";
13
+
14
+ const USAGE =
15
+ 'Usage: /gsd verdict <pass|needs-attention|needs-remediation> [--milestone Mxxx] [--rationale "..."]';
16
+
17
+ interface ParsedArgs {
18
+ verdict?: ValidationVerdict;
19
+ milestoneId?: string;
20
+ rationale?: string;
21
+ }
22
+
23
+ interface ParsedValidation {
24
+ verdict: string | undefined;
25
+ remediationRound: number;
26
+ successCriteriaChecklist: string;
27
+ sliceDeliveryAudit: string;
28
+ crossSliceIntegration: string;
29
+ requirementCoverage: string;
30
+ verificationClasses?: string;
31
+ verdictRationale: string;
32
+ remediationPlan?: string;
33
+ }
34
+
35
+ function tokenize(raw: string): string[] {
36
+ const tokens: string[] = [];
37
+ const re = /"([^"]*)"|(\S+)/g;
38
+ let match: RegExpExecArray | null;
39
+ while ((match = re.exec(raw)) !== null) {
40
+ tokens.push(match[1] ?? match[2]);
41
+ }
42
+ return tokens;
43
+ }
44
+
45
+ function parseArgs(raw: string): ParsedArgs | { error: string } {
46
+ const tokens = tokenize(raw);
47
+ const out: ParsedArgs = {};
48
+ for (let i = 0; i < tokens.length; i++) {
49
+ const t = tokens[i];
50
+ if (t === "--milestone") {
51
+ const next = tokens[++i];
52
+ if (!next) return { error: "--milestone requires a milestone ID" };
53
+ out.milestoneId = next;
54
+ } else if (t === "--rationale") {
55
+ const next = tokens[++i];
56
+ if (next == null) return { error: "--rationale requires a value" };
57
+ out.rationale = next;
58
+ } else if (!out.verdict) {
59
+ if (!isValidMilestoneVerdict(t)) {
60
+ return {
61
+ error: `Invalid verdict "${t}". Must be one of: ${VALIDATION_VERDICTS.join(", ")}`,
62
+ };
63
+ }
64
+ out.verdict = t;
65
+ } else {
66
+ return { error: `Unexpected argument: ${t}` };
67
+ }
68
+ }
69
+ return out;
70
+ }
71
+
72
+ function extractRemediationRound(content: string): number {
73
+ const fm = content.match(/^---\n([\s\S]*?)\n---/);
74
+ if (!fm) return 0;
75
+ const m = fm[1].match(/^remediation_round:\s*(\d+)/im);
76
+ return m ? Number.parseInt(m[1], 10) : 0;
77
+ }
78
+
79
+ function extractSection(content: string, heading: string): string | undefined {
80
+ const escaped = heading.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
81
+ // Match section bodies bounded by the next "## " heading or end-of-string.
82
+ // Leading "\n" prefix lets a single pattern handle first-line headings too.
83
+ // No /m flag — we want `$` to mean end-of-string, not end-of-line.
84
+ const re = new RegExp(`\\n## ${escaped}\\s*\\n([\\s\\S]*?)(?=\\n## |$)`);
85
+ const m = ("\n" + content).match(re);
86
+ if (!m) return undefined;
87
+ return m[1].replace(/\s+$/, "");
88
+ }
89
+
90
+ export function parseValidationFile(content: string): ParsedValidation {
91
+ return {
92
+ verdict: extractVerdict(content),
93
+ remediationRound: extractRemediationRound(content),
94
+ successCriteriaChecklist: extractSection(content, "Success Criteria Checklist") ?? "",
95
+ sliceDeliveryAudit: extractSection(content, "Slice Delivery Audit") ?? "",
96
+ crossSliceIntegration: extractSection(content, "Cross-Slice Integration") ?? "",
97
+ requirementCoverage: extractSection(content, "Requirement Coverage") ?? "",
98
+ verificationClasses: extractSection(content, "Verification Class Compliance"),
99
+ verdictRationale: extractSection(content, "Verdict Rationale") ?? "",
100
+ remediationPlan: extractSection(content, "Remediation Plan"),
101
+ };
102
+ }
103
+
104
+ export async function handleVerdict(
105
+ rawArgs: string,
106
+ ctx: ExtensionCommandContext,
107
+ basePath: string,
108
+ ): Promise<void> {
109
+ if (!rawArgs.trim()) {
110
+ ctx.ui.notify(USAGE, "warning");
111
+ return;
112
+ }
113
+
114
+ const parsed = parseArgs(rawArgs);
115
+ if ("error" in parsed) {
116
+ ctx.ui.notify(`${parsed.error}\n${USAGE}`, "warning");
117
+ return;
118
+ }
119
+ if (!parsed.verdict) {
120
+ ctx.ui.notify(USAGE, "warning");
121
+ return;
122
+ }
123
+
124
+ let milestoneId = parsed.milestoneId;
125
+ if (!milestoneId) {
126
+ const state = await deriveState(basePath);
127
+ if (!state.activeMilestone) {
128
+ ctx.ui.notify(
129
+ "No active milestone — pass --milestone Mxxx to target a specific milestone.",
130
+ "warning",
131
+ );
132
+ return;
133
+ }
134
+ milestoneId = state.activeMilestone.id;
135
+ }
136
+
137
+ const validationPath = resolveMilestoneFile(basePath, milestoneId, "VALIDATION");
138
+ if (!validationPath) {
139
+ ctx.ui.notify(
140
+ `No VALIDATION file found for ${milestoneId}. Run gsd_validate_milestone first to produce one.`,
141
+ "warning",
142
+ );
143
+ return;
144
+ }
145
+ const existing = await loadFile(validationPath);
146
+ if (!existing) {
147
+ ctx.ui.notify(
148
+ `Could not read VALIDATION file for ${milestoneId} (${validationPath}).`,
149
+ "warning",
150
+ );
151
+ return;
152
+ }
153
+
154
+ const current = parseValidationFile(existing);
155
+
156
+ if (parsed.verdict !== "pass" && !parsed.rationale) {
157
+ ctx.ui.notify(
158
+ `--rationale is required when overriding to ${parsed.verdict}.`,
159
+ "warning",
160
+ );
161
+ return;
162
+ }
163
+
164
+ const verdictRationale =
165
+ parsed.rationale ?? "Manually overridden via /gsd verdict";
166
+
167
+ const result = await executeValidateMilestone(
168
+ {
169
+ milestoneId,
170
+ verdict: parsed.verdict,
171
+ remediationRound: current.remediationRound,
172
+ successCriteriaChecklist: current.successCriteriaChecklist,
173
+ sliceDeliveryAudit: current.sliceDeliveryAudit,
174
+ crossSliceIntegration: current.crossSliceIntegration,
175
+ requirementCoverage: current.requirementCoverage,
176
+ verificationClasses: current.verificationClasses,
177
+ verdictRationale,
178
+ remediationPlan: current.remediationPlan,
179
+ },
180
+ basePath,
181
+ );
182
+
183
+ if (result.isError) {
184
+ const msg =
185
+ result.content[0]?.type === "text" ? result.content[0].text : "Unknown error";
186
+ ctx.ui.notify(msg, "error");
187
+ return;
188
+ }
189
+
190
+ const prevVerdict = current.verdict ?? "unknown";
191
+ ctx.ui.notify(
192
+ `Milestone ${milestoneId} verdict: ${prevVerdict} -> ${parsed.verdict}`,
193
+ "success",
194
+ );
195
+
196
+ if (parsed.verdict === "needs-remediation") {
197
+ ctx.ui.notify(
198
+ "Follow up with gsd_reassess_roadmap to add remediation slices, then re-run /gsd auto.",
199
+ "info",
200
+ );
201
+ }
202
+ }
@@ -5,7 +5,7 @@
5
5
  // All functions degrade gracefully: return empty results when DB unavailable, never throw.
6
6
 
7
7
  import { isDbAvailable, _getAdapter } from './gsd-db.js';
8
- import type { Decision, Requirement } from './types.js';
8
+ import type { Decision, DecisionMadeBy, Requirement } from './types.js';
9
9
 
10
10
  // ─── Query Functions ───────────────────────────────────────────────────────
11
11
 
@@ -66,6 +66,125 @@ export function queryDecisions(opts?: DecisionQueryOpts): Decision[] {
66
66
  }
67
67
  }
68
68
 
69
+ /**
70
+ * Internal: shared core for the two memory-sourced decision queries. Reads
71
+ * memory rows tagged with `sourceDecisionId` and reconstructs `Decision[]`
72
+ * from their `structured_fields` JSON.
73
+ *
74
+ * @param includeSuperseded — when false, drops rows whose
75
+ * `structured_fields.superseded_by` is non-null. The supersedes-chain is
76
+ * captured by the backfill (`memory-backfill.ts`) and kept in sync by
77
+ * the backfill's drift auto-heal pass.
78
+ */
79
+ function readDecisionsFromMemories(
80
+ opts: DecisionQueryOpts | undefined,
81
+ includeSuperseded: boolean,
82
+ ): Decision[] {
83
+ if (!isDbAvailable()) return [];
84
+ const adapter = _getAdapter();
85
+ if (!adapter) return [];
86
+
87
+ try {
88
+ const clauses: string[] = [
89
+ "category = 'architecture'",
90
+ "structured_fields LIKE '%\"sourceDecisionId\":\"%'",
91
+ ];
92
+ const params: Record<string, unknown> = {};
93
+
94
+ if (opts?.milestoneId) {
95
+ // when_context is a free-text JSON value; substring match preserves the
96
+ // semantics of `when_context LIKE '%milestoneId%'` on the legacy table.
97
+ clauses.push("json_extract(structured_fields, '$.when_context') LIKE :milestone_pattern");
98
+ params[':milestone_pattern'] = `%${opts.milestoneId}%`;
99
+ }
100
+
101
+ if (opts?.scope) {
102
+ // Stage 1 used `json_extract` in main (post-merge); preserve that
103
+ // style here. Exact equality on the JSON value avoids the prefix
104
+ // collision risk LIKE patterns had (scope=M001 vs scope=M001-S01).
105
+ clauses.push("json_extract(structured_fields, '$.scope') = :scope");
106
+ params[':scope'] = opts.scope;
107
+ }
108
+
109
+ const sql = `SELECT seq, structured_fields FROM memories WHERE ${clauses.join(' AND ')} ORDER BY seq`;
110
+ const rows = adapter.prepare(sql).all(params) as Array<Record<string, unknown>>;
111
+
112
+ const decisions: Decision[] = [];
113
+ for (const row of rows) {
114
+ const seq = row['seq'] as number;
115
+ const sfRaw = row['structured_fields'] as string | null;
116
+ if (!sfRaw) continue;
117
+ let sf: Record<string, unknown>;
118
+ try {
119
+ sf = JSON.parse(sfRaw) as Record<string, unknown>;
120
+ } catch {
121
+ continue;
122
+ }
123
+ const sourceId = sf['sourceDecisionId'];
124
+ if (typeof sourceId !== 'string' || sourceId.length === 0) continue;
125
+
126
+ // Decision-level superseded status lives in structured_fields.superseded_by
127
+ // (written by mirrorDecisionToMemory / memory-backfill.ts). The top-level
128
+ // memories.superseded_by column is intentionally never set for decision mirrors,
129
+ // so active-only filtering must be done here in the JS loop.
130
+ const supersededBy = typeof sf['superseded_by'] === 'string' ? (sf['superseded_by'] as string) : null;
131
+ if (!includeSuperseded && supersededBy) continue;
132
+
133
+ decisions.push({
134
+ seq,
135
+ id: sourceId,
136
+ when_context: typeof sf['when_context'] === 'string' ? (sf['when_context'] as string) : '',
137
+ scope: typeof sf['scope'] === 'string' ? (sf['scope'] as string) : '',
138
+ decision: typeof sf['decision'] === 'string' ? (sf['decision'] as string) : '',
139
+ choice: typeof sf['choice'] === 'string' ? (sf['choice'] as string) : '',
140
+ rationale: typeof sf['rationale'] === 'string' ? (sf['rationale'] as string) : '',
141
+ revisable: typeof sf['revisable'] === 'string' ? (sf['revisable'] as string) : '',
142
+ made_by: ((typeof sf['made_by'] === 'string' ? sf['made_by'] : 'agent') as DecisionMadeBy),
143
+ superseded_by: supersededBy,
144
+ });
145
+ }
146
+
147
+ return decisions;
148
+ } catch {
149
+ return [];
150
+ }
151
+ }
152
+
153
+ /**
154
+ * ADR-013 Phase 6 cutover (Stage 1): read **active** decisions from the
155
+ * `memories` table instead of the legacy `decisions` table. Returns the
156
+ * same `Decision[]` shape as `queryDecisions` so downstream formatters
157
+ * work unchanged.
158
+ *
159
+ * Filter semantics match `queryDecisions` exactly:
160
+ * - active only (skips rows where `structured_fields.superseded_by` is set)
161
+ * - `milestoneId`: substring match on `structured_fields.when_context`
162
+ * - `scope`: exact match on `structured_fields.scope`
163
+ *
164
+ * Used by the prompt-inline path (`inlineDecisionsFromDb` in
165
+ * `auto-prompts.ts`). For the projection regen (which renders superseded
166
+ * rows too), see `getAllDecisionsFromMemories`.
167
+ */
168
+ export function queryDecisionsFromMemories(opts?: DecisionQueryOpts): Decision[] {
169
+ return readDecisionsFromMemories(opts, /* includeSuperseded */ false);
170
+ }
171
+
172
+ /**
173
+ * ADR-013 Phase 6 cutover (Stage 2a): read **all** decisions (active +
174
+ * superseded) from the `memories` table. Used by the DECISIONS.md
175
+ * projection regen in `saveDecisionToDb`, which must render the full
176
+ * supersedes-chain for the canonical register format.
177
+ *
178
+ * Equivalent to `SELECT * FROM decisions ORDER BY seq` over the legacy
179
+ * table — but sourced from memories so the legacy table can be retired
180
+ * in Stage 3. Includes `superseded_by` reconstructed from
181
+ * `structured_fields.superseded_by` (populated by the backfill's drift
182
+ * auto-heal pass).
183
+ */
184
+ export function getAllDecisionsFromMemories(): Decision[] {
185
+ return readDecisionsFromMemories(undefined, /* includeSuperseded */ true);
186
+ }
187
+
69
188
  /**
70
189
  * Query active (non-superseded) requirements with optional filters.
71
190
  * - milestoneId: combined with sliceId for precise filtering (e.g. %M005/S01%)
@@ -30,9 +30,12 @@ import { join } from "node:path";
30
30
  import {
31
31
  findStaleWorkerForProject,
32
32
  getAllAutoWorkers,
33
+ markWorkerCrashed,
34
+ markWorkerStopping,
33
35
  type AutoWorkerRow,
34
36
  } from "./db/auto-workers.js";
35
- import { getLatestForUnit, type DispatchStatus } from "./db/unit-dispatches.js";
37
+ import { forceReleaseLeasesForWorker } from "./db/milestone-leases.js";
38
+ import { markLatestActiveForWorkerCanceled, type DispatchStatus } from "./db/unit-dispatches.js";
36
39
  import { getRuntimeKv, setRuntimeKv, deleteRuntimeKv } from "./db/runtime-kv.js";
37
40
  import { _getAdapter, isDbAvailable } from "./gsd-db.js";
38
41
  import { gsdRoot, normalizeRealPath } from "./paths.js";
@@ -56,6 +59,15 @@ function lockPath(basePath: string): string {
56
59
  return join(gsdRoot(basePath), effectiveLockFile());
57
60
  }
58
61
 
62
+ function clearLegacyLockFile(basePath: string): void {
63
+ try {
64
+ const p = lockPath(basePath);
65
+ if (existsSync(p)) unlinkSync(p);
66
+ } catch {
67
+ // Best-effort.
68
+ }
69
+ }
70
+
59
71
  function readLegacyLock(basePath: string): LockData | null {
60
72
  try {
61
73
  const p = lockPath(basePath);
@@ -204,18 +216,46 @@ export function writeLock(
204
216
  * stale session-file pointer.
205
217
  */
206
218
  export function clearLock(basePath: string): void {
219
+ clearLegacyLockFile(basePath);
220
+
221
+ if (!isDbAvailable()) return;
207
222
  try {
208
- const p = lockPath(basePath);
209
- if (existsSync(p)) unlinkSync(p);
223
+ const projectRoot = normalizeRealPath(basePath);
224
+ const staleWorker = findStaleWorkerForProject(projectRoot);
225
+ if (staleWorker) {
226
+ markWorkerCrashed(staleWorker.worker_id);
227
+ forceReleaseLeasesForWorker(staleWorker.worker_id);
228
+ deleteRuntimeKv("worker", staleWorker.worker_id, SESSION_FILE_KV_KEY);
229
+ return;
230
+ }
231
+ const worker = findActiveWorkerForCurrentProcess(projectRoot);
232
+ if (worker) deleteRuntimeKv("worker", worker.worker_id, SESSION_FILE_KV_KEY);
233
+
234
+ const stale = findStaleWorkerForProject(projectRoot);
235
+ if (stale) {
236
+ markWorkerStopping(stale.worker_id);
237
+ deleteRuntimeKv("worker", stale.worker_id, SESSION_FILE_KV_KEY);
238
+ }
210
239
  } catch {
211
240
  // Best-effort.
212
241
  }
242
+ }
243
+
244
+ /**
245
+ * Clear a stale DB-backed worker lock after readCrashLock/findStaleWorkerForProject
246
+ * has identified a dead worker. Unlike clearLock(), this targets the stale
247
+ * worker row instead of the current process's active worker.
248
+ */
249
+ export function clearStaleWorkerLock(basePath: string): void {
250
+ clearLegacyLockFile(basePath);
213
251
 
214
252
  if (!isDbAvailable()) return;
215
253
  try {
216
254
  const projectRoot = normalizeRealPath(basePath);
217
- const worker = findActiveWorkerForCurrentProcess(projectRoot);
255
+ const worker = findStaleWorkerForProject(projectRoot);
218
256
  if (!worker) return;
257
+ markLatestActiveForWorkerCanceled(worker.worker_id, "crash-recovered");
258
+ markWorkerCrashed(worker.worker_id);
219
259
  deleteRuntimeKv("worker", worker.worker_id, SESSION_FILE_KV_KEY);
220
260
  } catch {
221
261
  // Best-effort.