gsd-pi 2.82.0 → 3.0.0-dev.2e8b124f7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (760) 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/infra-errors.js +9 -3
  13. package/dist/resources/extensions/gsd/auto/loop.js +110 -37
  14. package/dist/resources/extensions/gsd/auto/orchestrator.js +124 -6
  15. package/dist/resources/extensions/gsd/auto/phases.js +113 -38
  16. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  17. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -1
  18. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
  19. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  20. package/dist/resources/extensions/gsd/auto-dashboard.js +66 -1
  21. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  22. package/dist/resources/extensions/gsd/auto-dispatch.js +71 -20
  23. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  24. package/dist/resources/extensions/gsd/auto-post-unit.js +278 -137
  25. package/dist/resources/extensions/gsd/auto-prompts.js +47 -13
  26. package/dist/resources/extensions/gsd/auto-recovery.js +79 -14
  27. package/dist/resources/extensions/gsd/auto-start.js +90 -14
  28. package/dist/resources/extensions/gsd/auto-timers.js +11 -3
  29. package/dist/resources/extensions/gsd/auto-verification.js +102 -34
  30. package/dist/resources/extensions/gsd/auto-worktree.js +178 -11
  31. package/dist/resources/extensions/gsd/auto.js +225 -81
  32. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +31 -7
  33. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -9
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +10 -4
  35. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  36. package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
  37. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
  38. package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
  39. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  40. package/dist/resources/extensions/gsd/commands/handlers/core.js +39 -1
  41. package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
  42. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  43. package/dist/resources/extensions/gsd/commands-handlers.js +17 -2
  44. package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
  45. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +10 -2
  46. package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
  47. package/dist/resources/extensions/gsd/context-store.js +112 -0
  48. package/dist/resources/extensions/gsd/crash-recovery.js +52 -7
  49. package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
  50. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  51. package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
  52. package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
  53. package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
  54. package/dist/resources/extensions/gsd/db-writer.js +150 -84
  55. package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
  56. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -1
  57. package/dist/resources/extensions/gsd/doctor-git-checks.js +87 -7
  58. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  59. package/dist/resources/extensions/gsd/doctor.js +2 -28
  60. package/dist/resources/extensions/gsd/export-html.js +27 -425
  61. package/dist/resources/extensions/gsd/forensics.js +10 -3
  62. package/dist/resources/extensions/gsd/git-service.js +138 -10
  63. package/dist/resources/extensions/gsd/gsd-db.js +76 -33
  64. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  65. package/dist/resources/extensions/gsd/guided-flow.js +110 -117
  66. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  67. package/dist/resources/extensions/gsd/init-wizard.js +17 -2
  68. package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
  69. package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
  70. package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
  71. package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
  72. package/dist/resources/extensions/gsd/markdown-renderer.js +20 -12
  73. package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
  74. package/dist/resources/extensions/gsd/md-importer.js +1 -1
  75. package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
  76. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
  77. package/dist/resources/extensions/gsd/migrate/command.js +5 -0
  78. package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
  79. package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
  80. package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
  81. package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
  82. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  83. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  84. package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
  85. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
  86. package/dist/resources/extensions/gsd/paths.js +4 -0
  87. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  88. package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
  89. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
  90. package/dist/resources/extensions/gsd/pre-execution-checks.js +38 -11
  91. package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
  92. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  93. package/dist/resources/extensions/gsd/preferences-validation.js +138 -0
  94. package/dist/resources/extensions/gsd/preferences.js +2 -0
  95. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  96. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  97. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  98. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  99. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  100. package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
  101. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  102. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  103. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  104. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  105. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  106. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  107. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  108. package/dist/resources/extensions/gsd/prompts/system.md +2 -2
  109. package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
  110. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  111. package/dist/resources/extensions/gsd/repository-registry.js +44 -0
  112. package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
  113. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
  114. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +59 -2
  115. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  116. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  117. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  118. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  119. package/dist/resources/extensions/gsd/state.js +14 -4
  120. package/dist/resources/extensions/gsd/status-guards.js +14 -2
  121. package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
  122. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  123. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  124. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -8
  125. package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
  126. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  127. package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
  128. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
  129. package/dist/resources/extensions/gsd/unit-context-composer.js +2 -0
  130. package/dist/resources/extensions/gsd/unit-context-manifest.js +69 -17
  131. package/dist/resources/extensions/gsd/validation.js +23 -1
  132. package/dist/resources/extensions/gsd/verification-gate.js +142 -7
  133. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  134. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  135. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  136. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  137. package/dist/resources/extensions/gsd/worktree-lifecycle.js +83 -19
  138. package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
  139. package/dist/resources/extensions/gsd/worktree-safety.js +33 -1
  140. package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
  141. package/dist/resources/extensions/shared/html-shell.js +388 -0
  142. package/dist/resources/extensions/shared/interview-ui.js +6 -4
  143. package/dist/resources/extensions/subagent/index.js +448 -78
  144. package/dist/resources/extensions/subagent/launch.js +77 -0
  145. package/dist/resources/extensions/subagent/run-store.js +148 -0
  146. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  147. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  148. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  149. package/dist/resources/extensions/visual-brief/index.js +5 -0
  150. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  151. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  152. package/dist/resources/skills/forensics/SKILL.md +1 -1
  153. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  154. package/dist/web/standalone/.next/BUILD_ID +1 -1
  155. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  156. package/dist/web/standalone/.next/build-manifest.json +4 -4
  157. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  158. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  159. package/dist/web/standalone/.next/required-server-files.json +4 -4
  160. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  161. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  163. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  164. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  166. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  167. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  169. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  171. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  174. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  175. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  176. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  178. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  179. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  180. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  181. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  188. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  200. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  220. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  222. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  230. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  235. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  236. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  238. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  239. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  240. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  241. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  242. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  244. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  245. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  246. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  247. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  248. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  249. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  250. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  252. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  253. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  254. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  255. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  256. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  257. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  258. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  259. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  260. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  261. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  262. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  263. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  264. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  265. package/dist/web/standalone/.next/server/app/index.html +1 -1
  266. package/dist/web/standalone/.next/server/app/index.rsc +5 -8
  267. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  268. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -8
  269. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  270. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  271. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  272. package/dist/web/standalone/.next/server/app/page.js +2 -2
  273. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  274. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  275. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  276. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  277. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  278. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  279. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  280. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  281. package/dist/web/standalone/.next/server/middleware.js +2 -2
  282. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  283. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  284. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  285. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  286. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  287. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  288. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  289. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  290. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  291. package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
  292. package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +1 -0
  293. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  294. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  295. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  296. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  297. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  298. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  299. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  300. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  301. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  302. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  303. package/dist/web/standalone/server.js +1 -1
  304. package/package.json +6 -5
  305. package/packages/contracts/dist/rpc.test.js +7 -0
  306. package/packages/contracts/dist/rpc.test.js.map +1 -1
  307. package/packages/contracts/dist/workflow.d.ts +21 -0
  308. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  309. package/packages/contracts/dist/workflow.js +24 -0
  310. package/packages/contracts/dist/workflow.js.map +1 -1
  311. package/packages/contracts/src/rpc.test.ts +8 -0
  312. package/packages/contracts/src/workflow.ts +24 -0
  313. package/packages/daemon/package.json +2 -2
  314. package/packages/mcp-server/README.md +14 -3
  315. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  316. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  317. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  318. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  319. package/packages/mcp-server/package.json +2 -2
  320. package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
  321. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  322. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  323. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  324. package/packages/native/package.json +1 -1
  325. package/packages/native/tsconfig.json +2 -1
  326. package/packages/native/tsconfig.tsbuildinfo +1 -1
  327. package/packages/pi-agent-core/package.json +1 -1
  328. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  329. package/packages/pi-ai/dist/index.d.ts +2 -2
  330. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  331. package/packages/pi-ai/dist/index.js +1 -1
  332. package/packages/pi-ai/dist/index.js.map +1 -1
  333. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  334. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  335. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  336. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  337. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  338. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  339. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  340. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  341. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  342. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  343. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  344. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  345. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  346. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  347. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  348. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  349. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  350. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  351. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  352. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  353. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  354. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  355. package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
  356. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  357. package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
  358. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  359. package/packages/pi-ai/package.json +1 -1
  360. package/packages/pi-ai/src/index.ts +7 -2
  361. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  362. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  363. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  364. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  365. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  366. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  367. package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
  368. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  369. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  370. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  371. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  372. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  373. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  374. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  375. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  376. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  377. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
  378. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
  380. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
  382. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  383. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  384. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
  386. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  387. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +8 -2
  388. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  389. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  390. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  391. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  392. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  393. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  394. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  395. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +71 -97
  396. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  397. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
  398. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  399. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
  400. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  401. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  402. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  403. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  404. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  405. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  406. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  407. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
  408. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
  409. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
  410. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
  411. package/packages/pi-coding-agent/package.json +1 -1
  412. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  413. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  414. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  415. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
  416. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
  417. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  418. package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
  419. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +17 -1
  420. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  421. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
  422. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -102
  423. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
  424. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
  425. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  426. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  427. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
  428. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  429. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  430. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  431. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  432. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  433. package/packages/pi-tui/dist/__tests__/tui.test.js +45 -2
  434. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  435. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  436. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  437. package/packages/pi-tui/dist/terminal.js +12 -0
  438. package/packages/pi-tui/dist/terminal.js.map +1 -1
  439. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  440. package/packages/pi-tui/dist/tui.js +108 -24
  441. package/packages/pi-tui/dist/tui.js.map +1 -1
  442. package/packages/pi-tui/package.json +1 -1
  443. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  444. package/packages/pi-tui/src/__tests__/tui.test.ts +59 -2
  445. package/packages/pi-tui/src/terminal.ts +11 -0
  446. package/packages/pi-tui/src/tui.ts +111 -24
  447. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  448. package/packages/rpc-client/package.json +1 -1
  449. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  450. package/pkg/package.json +1 -1
  451. package/src/resources/GSD-WORKFLOW.md +10 -1
  452. package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
  453. package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
  454. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  455. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
  456. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  457. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
  458. package/src/resources/extensions/cmux/index.ts +6 -0
  459. package/src/resources/extensions/gsd/auto/contracts.ts +62 -16
  460. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  461. package/src/resources/extensions/gsd/auto/loop.ts +111 -38
  462. package/src/resources/extensions/gsd/auto/orchestrator.ts +129 -6
  463. package/src/resources/extensions/gsd/auto/phases.ts +141 -49
  464. package/src/resources/extensions/gsd/auto/session.ts +16 -0
  465. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  466. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +6 -2
  467. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  468. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  469. package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
  470. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  471. package/src/resources/extensions/gsd/auto-dispatch.ts +74 -20
  472. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  473. package/src/resources/extensions/gsd/auto-post-unit.ts +312 -148
  474. package/src/resources/extensions/gsd/auto-prompts.ts +47 -16
  475. package/src/resources/extensions/gsd/auto-recovery.ts +83 -11
  476. package/src/resources/extensions/gsd/auto-start.ts +99 -12
  477. package/src/resources/extensions/gsd/auto-timers.ts +10 -3
  478. package/src/resources/extensions/gsd/auto-verification.ts +124 -42
  479. package/src/resources/extensions/gsd/auto-worktree.ts +195 -11
  480. package/src/resources/extensions/gsd/auto.ts +226 -70
  481. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +42 -7
  482. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -9
  483. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +11 -4
  484. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  485. package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
  486. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
  487. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  488. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  489. package/src/resources/extensions/gsd/commands/handlers/core.ts +42 -1
  490. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  491. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  492. package/src/resources/extensions/gsd/commands-handlers.ts +21 -2
  493. package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
  494. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +11 -3
  495. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  496. package/src/resources/extensions/gsd/context-store.ts +120 -1
  497. package/src/resources/extensions/gsd/crash-recovery.ts +52 -6
  498. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  499. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  500. package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
  501. package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
  502. package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
  503. package/src/resources/extensions/gsd/db-writer.ts +167 -84
  504. package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
  505. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -1
  506. package/src/resources/extensions/gsd/doctor-git-checks.ts +89 -7
  507. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  508. package/src/resources/extensions/gsd/doctor-types.ts +3 -0
  509. package/src/resources/extensions/gsd/doctor.ts +2 -27
  510. package/src/resources/extensions/gsd/export-html.ts +27 -427
  511. package/src/resources/extensions/gsd/forensics.ts +9 -3
  512. package/src/resources/extensions/gsd/git-service.ts +166 -11
  513. package/src/resources/extensions/gsd/gsd-db.ts +80 -31
  514. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  515. package/src/resources/extensions/gsd/guided-flow.ts +142 -134
  516. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  517. package/src/resources/extensions/gsd/init-wizard.ts +17 -2
  518. package/src/resources/extensions/gsd/journal.ts +8 -1
  519. package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
  520. package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
  521. package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
  522. package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
  523. package/src/resources/extensions/gsd/markdown-renderer.ts +20 -12
  524. package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
  525. package/src/resources/extensions/gsd/md-importer.ts +1 -1
  526. package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
  527. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
  528. package/src/resources/extensions/gsd/migrate/command.ts +5 -0
  529. package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
  530. package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
  531. package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
  532. package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
  533. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  534. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  535. package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
  536. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
  537. package/src/resources/extensions/gsd/paths.ts +5 -0
  538. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  539. package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
  540. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
  541. package/src/resources/extensions/gsd/pre-execution-checks.ts +49 -11
  542. package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
  543. package/src/resources/extensions/gsd/preferences-types.ts +33 -0
  544. package/src/resources/extensions/gsd/preferences-validation.ts +145 -0
  545. package/src/resources/extensions/gsd/preferences.ts +5 -0
  546. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  547. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  548. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  549. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  550. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  551. package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
  552. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  553. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  554. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  555. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  556. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  557. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  558. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  559. package/src/resources/extensions/gsd/prompts/system.md +2 -2
  560. package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
  561. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  562. package/src/resources/extensions/gsd/repository-registry.ts +77 -0
  563. package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
  564. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
  565. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +52 -1
  566. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  567. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  568. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  569. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  570. package/src/resources/extensions/gsd/state.ts +15 -4
  571. package/src/resources/extensions/gsd/status-guards.ts +16 -2
  572. package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
  573. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  574. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  575. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +10 -1
  576. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  577. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  578. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +375 -1
  579. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +598 -8
  580. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  581. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  582. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  583. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +129 -6
  584. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
  585. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +4 -4
  586. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  587. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  588. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  589. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
  590. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  591. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
  592. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  593. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  594. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
  595. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  596. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  597. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
  598. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +5 -9
  599. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  600. package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
  601. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +104 -2
  602. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  603. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  604. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
  605. package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
  606. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
  607. package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
  608. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
  609. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +111 -1
  610. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
  611. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  612. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
  613. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
  614. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  615. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
  616. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
  617. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
  618. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  619. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  620. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  621. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  622. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  623. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  624. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  625. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  626. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  627. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  628. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
  629. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
  630. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  631. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +199 -2
  632. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
  633. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
  634. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  635. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
  636. package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
  637. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
  638. package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
  639. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
  640. package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
  641. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
  642. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
  643. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
  644. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  645. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
  646. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
  647. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
  648. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  649. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
  650. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  651. package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
  652. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  653. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  654. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  655. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
  656. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  657. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  658. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
  659. package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
  660. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  661. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
  662. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
  663. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  664. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +59 -0
  665. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
  666. package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
  667. package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
  668. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +78 -0
  669. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -0
  670. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  671. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  672. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
  673. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  674. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  675. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  676. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
  677. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  678. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
  679. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +21 -1
  680. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +72 -1
  681. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  682. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +86 -2
  683. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  684. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  685. package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
  686. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  687. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
  688. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  689. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -0
  690. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +131 -9
  691. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
  692. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  693. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
  694. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +173 -1
  695. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  696. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  697. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  698. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  699. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1 -1
  700. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  701. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  702. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +57 -2
  703. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
  704. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +46 -0
  705. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
  706. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
  707. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
  708. package/src/resources/extensions/gsd/tools/complete-milestone.ts +8 -10
  709. package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
  710. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  711. package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
  712. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
  713. package/src/resources/extensions/gsd/types.ts +1 -1
  714. package/src/resources/extensions/gsd/unit-context-composer.ts +3 -0
  715. package/src/resources/extensions/gsd/unit-context-manifest.ts +86 -19
  716. package/src/resources/extensions/gsd/validation.ts +23 -1
  717. package/src/resources/extensions/gsd/verification-gate.ts +170 -6
  718. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  719. package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
  720. package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
  721. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  722. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  723. package/src/resources/extensions/gsd/worktree-lifecycle.ts +93 -20
  724. package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
  725. package/src/resources/extensions/gsd/worktree-safety.ts +45 -6
  726. package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
  727. package/src/resources/extensions/shared/html-shell.ts +412 -0
  728. package/src/resources/extensions/shared/interview-ui.ts +6 -4
  729. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
  730. package/src/resources/extensions/subagent/index.ts +567 -103
  731. package/src/resources/extensions/subagent/launch.ts +131 -0
  732. package/src/resources/extensions/subagent/run-store.ts +218 -0
  733. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  734. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  735. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  736. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  737. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  738. package/src/resources/extensions/visual-brief/index.ts +8 -0
  739. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  740. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  741. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  742. package/src/resources/skills/forensics/SKILL.md +1 -1
  743. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  744. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  745. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  746. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  747. package/dist/web/standalone/.next/static/chunks/app/layout-9ecfd95f343793f0.js +0 -1
  748. package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +0 -1
  749. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  750. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  751. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  752. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  753. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  754. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  755. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  756. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  757. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  758. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  759. /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → zCegwxH2e6vLp1vEZLLuZ}/_buildManifest.js +0 -0
  760. /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → zCegwxH2e6vLp1vEZLLuZ}/_ssgManifest.js +0 -0
@@ -14,7 +14,7 @@ import { isClosedStatus } from "./status-guards.js";
14
14
  import { join, relative } from "node:path";
15
15
  import { createRequire } from "node:module";
16
16
  import { getAllMilestones, getMilestone, getMilestoneSlices, getSliceTasks, getTask, getSlice, getArtifact, insertArtifact, getGateResults, } from "./gsd-db.js";
17
- import { resolveMilestoneFile, resolveSliceFile, resolveSlicePath, resolveTasksDir, gsdRoot, buildTaskFileName, buildSliceFileName, } from "./paths.js";
17
+ import { resolveMilestoneFile, resolveSliceFile, resolveSlicePath, gsdProjectionRoot, gsdRoot, buildTaskFileName, buildSliceFileName, } from "./paths.js";
18
18
  import { saveFile, clearParseCache } from "./files.js";
19
19
  import { invalidateStateCache } from "./state.js";
20
20
  import { clearPathCache } from "./paths.js";
@@ -24,7 +24,11 @@ import { clearPathCache } from "./paths.js";
24
24
  * E.g. "/project/.gsd/milestones/M001/M001-ROADMAP.md" → "milestones/M001/M001-ROADMAP.md"
25
25
  */
26
26
  function toArtifactPath(absPath, basePath) {
27
- const root = gsdRoot(basePath);
27
+ const projectionRoot = gsdProjectionRoot(basePath);
28
+ const projectionRel = relative(projectionRoot, absPath);
29
+ const root = projectionRel && !projectionRel.startsWith("..") && !projectionRel.startsWith("/")
30
+ ? projectionRoot
31
+ : gsdRoot(basePath);
28
32
  const rel = relative(root, absPath);
29
33
  // Normalize to forward slashes for consistent DB keys
30
34
  return rel.replace(/\\/g, "/");
@@ -112,7 +116,12 @@ function renderRoadmapMarkdown(milestone, slices) {
112
116
  for (const slice of slices) {
113
117
  const done = isClosedStatus(slice.status) ? "x" : " ";
114
118
  const depends = `[${(slice.depends ?? []).join(",")}]`;
115
- lines.push(`- [${done}] **${slice.id}: ${slice.title}** \`risk:${slice.risk}\` \`depends:${depends}\``);
119
+ // ADR-011: sketch slices get a `[sketch]` badge so the roadmap shows at a
120
+ // glance which slices are still pending refine-slice expansion. The badge
121
+ // sits in front of `risk:` so it's visible in narrow terminals that may
122
+ // truncate the line.
123
+ const sketchBadge = slice.is_sketch === 1 ? "`[sketch]` " : "";
124
+ lines.push(`- [${done}] **${slice.id}: ${slice.title}** ${sketchBadge}\`risk:${slice.risk}\` \`depends:${depends}\``);
116
125
  lines.push(` > After this: ${slice.demo}`);
117
126
  lines.push("");
118
127
  }
@@ -300,10 +309,9 @@ export async function renderPlanFromDb(basePath, milestoneId, sliceId) {
300
309
  if (tasks.length === 0) {
301
310
  throw new Error(`no tasks found for ${milestoneId}/${sliceId}`);
302
311
  }
303
- const slicePath = resolveSlicePath(basePath, milestoneId, sliceId)
304
- ?? join(gsdRoot(basePath), "milestones", milestoneId, "slices", sliceId);
305
- const absPath = resolveSliceFile(basePath, milestoneId, sliceId, "PLAN")
306
- ?? join(slicePath, `${sliceId}-PLAN.md`);
312
+ const slicePath = join(gsdProjectionRoot(basePath), "milestones", milestoneId, "slices", sliceId);
313
+ mkdirSync(slicePath, { recursive: true });
314
+ const absPath = join(slicePath, `${sliceId}-PLAN.md`);
307
315
  const artifactPath = toArtifactPath(absPath, basePath);
308
316
  const sliceGates = getGateResults(milestoneId, sliceId, "slice");
309
317
  const content = renderSlicePlanMarkdown(slice, tasks, sliceGates);
@@ -324,8 +332,7 @@ export async function renderTaskPlanFromDb(basePath, milestoneId, sliceId, taskI
324
332
  if (!task) {
325
333
  throw new Error(`task ${milestoneId}/${sliceId}/${taskId} not found`);
326
334
  }
327
- const tasksDir = resolveTasksDir(basePath, milestoneId, sliceId)
328
- ?? join(gsdRoot(basePath), "milestones", milestoneId, "slices", sliceId, "tasks");
335
+ const tasksDir = join(gsdProjectionRoot(basePath), "milestones", milestoneId, "slices", sliceId, "tasks");
329
336
  mkdirSync(tasksDir, { recursive: true });
330
337
  const absPath = join(tasksDir, buildTaskFileName(taskId, "PLAN"));
331
338
  const artifactPath = toArtifactPath(absPath, basePath);
@@ -605,13 +612,14 @@ export function detectStaleRenders(basePath) {
605
612
  const _require = createRequire(import.meta.url);
606
613
  let parseRoadmap, parsePlan;
607
614
  try {
608
- const m = _require("./parsers-legacy.ts");
615
+ // Prefer compiled JS for packaged/runtime installs; TS exists only in source/dev contexts.
616
+ const m = _require("./parsers-legacy.js");
609
617
  parseRoadmap = m.parseRoadmap;
610
618
  parsePlan = m.parsePlan;
611
619
  }
612
620
  catch (e) {
613
- logWarning("renderer", `parsers-legacy.ts require failed, falling back to .js: ${e.message}`);
614
- const m = _require("./parsers-legacy.js");
621
+ logWarning("renderer", `parsers-legacy.js require failed, falling back to .ts: ${e.message}`);
622
+ const m = _require("./parsers-legacy.ts");
615
623
  parseRoadmap = m.parseRoadmap;
616
624
  parsePlan = m.parsePlan;
617
625
  }
@@ -0,0 +1,58 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { resolveModelMcpConfig } from "./preferences-mcp.js";
4
+ export function discoverMcpServerNames(projectDir) {
5
+ const mcpJsonPath = resolve(projectDir, ".mcp.json");
6
+ const settingsPath = resolve(projectDir, ".claude", "settings.json");
7
+ let mcpJsonServers = [];
8
+ if (existsSync(mcpJsonPath)) {
9
+ const raw = readFileSync(mcpJsonPath, "utf-8");
10
+ const parsed = JSON.parse(raw);
11
+ mcpJsonServers = Object.keys(parsed.mcpServers ?? {});
12
+ }
13
+ let settingsServers = [];
14
+ if (existsSync(settingsPath)) {
15
+ try {
16
+ const raw = readFileSync(settingsPath, "utf-8");
17
+ const parsed = JSON.parse(raw);
18
+ if (parsed.mcpServers) {
19
+ settingsServers = Object.keys(parsed.mcpServers);
20
+ }
21
+ }
22
+ catch {
23
+ // settings.json parse errors are silently ignored
24
+ }
25
+ }
26
+ return [...new Set([...mcpJsonServers, ...settingsServers])];
27
+ }
28
+ export function computeMcpDisallowedTools(modelId, mcpConfig, discoveredServers, workflowServerName) {
29
+ if (!mcpConfig)
30
+ return [];
31
+ const entry = resolveModelMcpConfig(modelId, mcpConfig);
32
+ if (!entry)
33
+ return [];
34
+ const allServers = [...discoveredServers, ...(workflowServerName ? [workflowServerName] : [])];
35
+ const blocked = new Set();
36
+ // Allowlist phase: block every server NOT in the allowlist (except workflowServerName)
37
+ if (entry.allowed_servers !== undefined) {
38
+ const allowSet = new Set(entry.allowed_servers);
39
+ for (const server of allServers) {
40
+ if (server === workflowServerName)
41
+ continue;
42
+ if (!allowSet.has(server)) {
43
+ blocked.add(server);
44
+ }
45
+ }
46
+ }
47
+ // Blocklist phase: explicitly blocked servers are added
48
+ if (entry.blocked_servers !== undefined) {
49
+ for (const server of entry.blocked_servers) {
50
+ blocked.add(server);
51
+ }
52
+ }
53
+ // gsd-workflow implicit allow: remove unless explicitly in blocked_servers
54
+ if (workflowServerName && !(entry.blocked_servers ?? []).includes(workflowServerName)) {
55
+ blocked.delete(workflowServerName);
56
+ }
57
+ return [...blocked].map((name) => `mcp__${name}__*`);
58
+ }
@@ -256,7 +256,7 @@ function importRequirements(gsdDir) {
256
256
  }
257
257
  // ─── Hierarchy Artifact Walker ─────────────────────────────────────────────
258
258
  /** Artifact suffixes to look for at each hierarchy level */
259
- const MILESTONE_SUFFIXES = ['ROADMAP', 'CONTEXT', 'RESEARCH', 'ASSESSMENT'];
259
+ const MILESTONE_SUFFIXES = ['ROADMAP', 'CONTEXT', 'RESEARCH', 'ASSESSMENT', 'SUMMARY', 'VALIDATION'];
260
260
  const SLICE_SUFFIXES = ['PLAN', 'SUMMARY', 'RESEARCH', 'CONTEXT', 'ASSESSMENT', 'UAT'];
261
261
  const TASK_SUFFIXES = ['PLAN', 'SUMMARY', 'CONTINUE', 'CONTEXT', 'RESEARCH'];
262
262
  /**
@@ -1,9 +1,10 @@
1
1
  // GSD2 — Decisions -> memories backfill (ADR-013 step 5)
2
2
  //
3
- // Idempotent one-shot migration that copies every active decisions row into
4
- // the memories table with category="architecture" and a structured_fields
5
- // payload preserving the original gsd_save_decision schema (when_context,
6
- // scope, decision, choice, rationale, made_by, revisable, sourceDecisionId).
3
+ // Idempotent migration that copies every decisions row (active and
4
+ // superseded — see Stage 2a note below) into the memories table with
5
+ // category="architecture" and a structured_fields payload preserving the
6
+ // original gsd_save_decision schema (when_context, scope, decision, choice,
7
+ // rationale, made_by, revisable, superseded_by, sourceDecisionId).
7
8
  //
8
9
  // The backfill exists so the cutover in ADR-013 step 6 can drop the
9
10
  // decisions table without losing schema fidelity. Idempotency is enforced
@@ -14,11 +15,18 @@
14
15
  // only ever fires once per project. Costs O(N) inserts on first run where
15
16
  // N is the active-decisions count; subsequent runs are an O(N) lookup that
16
17
  // finds existing markers and exits.
18
+ //
19
+ // ADR-013 Stage 2a (PR #5755): backfill now includes superseded rows so the
20
+ // DECISIONS.md projection regen can source from memories without losing
21
+ // historical entries. An auto-heal pass runs after the initial migration to
22
+ // pick up superseded_by changes that occurred after the source decision was
23
+ // already migrated (e.g. a fresh md-importer run that introduced a new
24
+ // supersedes-chain).
17
25
  import { isDbAvailable, _getAdapter } from "./gsd-db.js";
18
26
  import { createMemory } from "./memory-store.js";
19
27
  import { logWarning } from "./workflow-logger.js";
20
28
  /**
21
- * Backfill active decisions rows into the memories table.
29
+ * Backfill decisions rows into the memories table.
22
30
  *
23
31
  * - Idempotent (per-row): every row written carries
24
32
  * `structured_fields.sourceDecisionId = "<decisionId>"`. Each candidate
@@ -27,13 +35,18 @@ import { logWarning } from "./workflow-logger.js";
27
35
  * their own `sourceDecisionId` does NOT abort the backfill.
28
36
  * - Best-effort: never throws. Logs and returns 0 on failure so a broken
29
37
  * backfill cannot block agent startup.
30
- * - Active-only: skips rows where `superseded_by IS NOT NULL`. Superseded
31
- * decisions are historical record; the memory store is for active
32
- * knowledge.
38
+ * - Full migration (ADR-013 Stage 2a): both active and superseded rows are
39
+ * migrated. `structured_fields.superseded_by` preserves the supersedes
40
+ * chain so the DECISIONS.md projection regen can source from memories
41
+ * without losing historical entries.
42
+ * - Drift auto-heal: after the initial insert pass, the function updates
43
+ * any pre-existing memory whose `structured_fields.superseded_by` drifted
44
+ * from the source decision (e.g. a fresh md-importer run introduced a
45
+ * new supersedes annotation after the initial migration).
33
46
  *
34
47
  * Returns the number of memories written (0 when already backfilled or
35
- * when the DB has no decisions). Callers can log the result or surface it
36
- * to the user.
48
+ * when the DB has no decisions). Drift-heal updates are not counted in
49
+ * this return — they are logged separately.
37
50
  */
38
51
  export function backfillDecisionsToMemories() {
39
52
  if (!isDbAvailable())
@@ -43,7 +56,7 @@ export function backfillDecisionsToMemories() {
43
56
  return 0;
44
57
  try {
45
58
  const decisions = adapter
46
- .prepare("SELECT id, when_context, scope, decision, choice, rationale, made_by, revisable, superseded_by FROM decisions WHERE superseded_by IS NULL")
59
+ .prepare("SELECT id, when_context, scope, decision, choice, rationale, made_by, revisable, superseded_by FROM decisions ORDER BY seq")
47
60
  .all();
48
61
  if (decisions.length === 0)
49
62
  return 0;
@@ -52,8 +65,10 @@ export function backfillDecisionsToMemories() {
52
65
  // per row by matching that exact id, NOT by a global sentinel — a global
53
66
  // sentinel would silently abort the backfill if a user manually called
54
67
  // capture_thought with their own structuredFields.sourceDecisionId.
55
- const checkExisting = adapter.prepare("SELECT 1 FROM memories WHERE structured_fields LIKE :pattern LIMIT 1");
68
+ const checkExisting = adapter.prepare("SELECT id, structured_fields FROM memories WHERE structured_fields LIKE :pattern LIMIT 1");
69
+ const updateStructuredFields = adapter.prepare("UPDATE memories SET structured_fields = :sf, updated_at = :ts WHERE id = :id");
56
70
  let written = 0;
71
+ let healed = 0;
57
72
  for (const raw of decisions) {
58
73
  const row = {
59
74
  id: String(raw["id"] ?? ""),
@@ -68,11 +83,40 @@ export function backfillDecisionsToMemories() {
68
83
  };
69
84
  if (!row.id)
70
85
  continue;
71
- // Pattern is anchored to the JSON-stringified shape and the exact
72
- // decision id to avoid prefix collisions (e.g. "D1" vs "D10").
73
- if (checkExisting.get({ ":pattern": `%"sourceDecisionId":"${row.id}"%` }))
86
+ const pattern = `%"sourceDecisionId":"${row.id}"%`;
87
+ const existing = checkExisting.get({ ":pattern": pattern });
88
+ if (existing) {
89
+ // Drift auto-heal: if the source decision's superseded_by has changed
90
+ // since the original migration, update the memory in place. Read-side
91
+ // queries reconstruct Decision.superseded_by from this field, so the
92
+ // DECISIONS.md projection stays accurate without us having to track
93
+ // supersedes events at the write site.
94
+ const parsedSf = existing.structured_fields
95
+ ? safeParse(existing.structured_fields)
96
+ : {};
97
+ if (existing.structured_fields && !parsedSf) {
98
+ logWarning("memory-backfill", `decisions->memories drift heal skipped for ${row.id}: invalid structured_fields JSON`);
99
+ continue;
100
+ }
101
+ const currentSf = parsedSf ?? {};
102
+ const memorySuperseded = typeof currentSf["superseded_by"] === "string" || currentSf["superseded_by"] === null
103
+ ? currentSf["superseded_by"]
104
+ : null;
105
+ if (memorySuperseded !== row.superseded_by) {
106
+ const merged = {
107
+ ...currentSf,
108
+ superseded_by: row.superseded_by,
109
+ };
110
+ updateStructuredFields.run({
111
+ ":id": existing.id,
112
+ ":sf": JSON.stringify(merged),
113
+ ":ts": new Date().toISOString(),
114
+ });
115
+ healed += 1;
116
+ }
74
117
  continue;
75
- const content = synthesizeContent(row);
118
+ }
119
+ const content = synthesizeDecisionMemoryContent(row);
76
120
  const id = createMemory({
77
121
  category: "architecture",
78
122
  content,
@@ -87,11 +131,15 @@ export function backfillDecisionsToMemories() {
87
131
  rationale: row.rationale,
88
132
  made_by: row.made_by,
89
133
  revisable: row.revisable,
134
+ superseded_by: row.superseded_by,
90
135
  },
91
136
  });
92
137
  if (id)
93
138
  written += 1;
94
139
  }
140
+ if (healed > 0) {
141
+ logWarning("memory-backfill", `decisions->memories drift healed: ${healed} row${healed === 1 ? "" : "s"} updated superseded_by`);
142
+ }
95
143
  return written;
96
144
  }
97
145
  catch (e) {
@@ -99,6 +147,14 @@ export function backfillDecisionsToMemories() {
99
147
  return 0;
100
148
  }
101
149
  }
150
+ function safeParse(raw) {
151
+ try {
152
+ return JSON.parse(raw);
153
+ }
154
+ catch {
155
+ return null;
156
+ }
157
+ }
102
158
  /**
103
159
  * Combine the decision's structured fields into a 1-3 sentence content
104
160
  * string suitable for keyword retrieval and human review.
@@ -107,7 +163,7 @@ export function backfillDecisionsToMemories() {
107
163
  * Truncates each field to keep the synthesized line under ~600 chars so
108
164
  * memory_query rendering stays readable.
109
165
  */
110
- function synthesizeContent(row) {
166
+ export function synthesizeDecisionMemoryContent(row) {
111
167
  const trim = (value, max) => {
112
168
  const cleaned = value.replace(/\s+/g, " ").trim();
113
169
  return cleaned.length > max ? cleaned.slice(0, max - 1) + "\u2026" : cleaned;
@@ -0,0 +1,222 @@
1
+ // GSD-2 — ADR-013 Phase 6 preflight scanner.
2
+ //
3
+ // Read-only detection of rows in the legacy knowledge surfaces (decisions
4
+ // table, `.gsd/KNOWLEDGE.md`) that lack a corresponding `memories` row.
5
+ // Runs on session start (and on demand via doctor); never mutates state.
6
+ //
7
+ // The scanner exists so the destructive Phase 6 cutover (#5755) can prove
8
+ // the migration is complete before any tables are dropped. Today's
9
+ // `backfillDecisionsToMemories` writes a `structured_fields.sourceDecisionId`
10
+ // marker on each migrated row; the scanner uses that marker for decisions
11
+ // detection. A `sourceKnowledgeId` marker is reserved for the parallel
12
+ // KNOWLEDGE.md backfill that Phase 6 will introduce — until that ships,
13
+ // every KNOWLEDGE.md row is reported as unmigrated, which is the honest
14
+ // state of the consolidation.
15
+ import { existsSync, readFileSync } from "node:fs";
16
+ import { _getAdapter, isDbAvailable } from "./gsd-db.js";
17
+ import { appendNotification } from "./notification-store.js";
18
+ import { resolveGsdRootFile } from "./paths.js";
19
+ import { logWarning } from "./workflow-logger.js";
20
+ // ─── KNOWLEDGE.md parsing ────────────────────────────────────────────────────
21
+ const KNOWLEDGE_SECTIONS = [
22
+ { table: "rules", heading: "## Rules", idPrefix: "K" },
23
+ { table: "patterns", heading: "## Patterns", idPrefix: "P" },
24
+ { table: "lessons", heading: "## Lessons Learned", idPrefix: "L" },
25
+ ];
26
+ /**
27
+ * Parse `.gsd/KNOWLEDGE.md` into rows, one per table entry. Skips the table
28
+ * header and separator lines; ignores rows from unrecognized sections.
29
+ *
30
+ * The format is locked in `files.ts:appendKnowledge` — three `## ` sections
31
+ * (Rules, Patterns, Lessons Learned), each a Markdown table. Row IDs are
32
+ * `K###` / `P###` / `L###`.
33
+ */
34
+ export function parseKnowledgeRows(content) {
35
+ const rows = [];
36
+ if (!content.trim())
37
+ return rows;
38
+ // Slice the content into sections by heading. The leading text before the
39
+ // first ## heading is intro prose — ignored.
40
+ const lines = content.split("\n");
41
+ let activeSection;
42
+ for (const line of lines) {
43
+ const trimmed = line.trim();
44
+ if (trimmed.startsWith("## ")) {
45
+ activeSection = KNOWLEDGE_SECTIONS.find((s) => s.heading === trimmed);
46
+ continue;
47
+ }
48
+ if (!activeSection)
49
+ continue;
50
+ if (!trimmed.startsWith("|"))
51
+ continue;
52
+ // Skip the table header rows: the column-titles line and the |---|---| separator.
53
+ // Real data rows start with `| <prefix>### |`.
54
+ const idMatch = new RegExp(`^\\|\\s*(${activeSection.idPrefix}\\d+)\\s*\\|`).exec(trimmed);
55
+ if (!idMatch)
56
+ continue;
57
+ rows.push({
58
+ table: activeSection.table,
59
+ id: idMatch[1] ?? "",
60
+ row: trimmed,
61
+ });
62
+ }
63
+ return rows;
64
+ }
65
+ function knowledgeMdContent(basePath) {
66
+ const path = resolveGsdRootFile(basePath, "KNOWLEDGE");
67
+ if (!existsSync(path))
68
+ return "";
69
+ try {
70
+ return readFileSync(path, "utf-8");
71
+ }
72
+ catch {
73
+ return "";
74
+ }
75
+ }
76
+ function getActiveDecisions() {
77
+ if (!isDbAvailable())
78
+ return [];
79
+ const adapter = _getAdapter();
80
+ if (!adapter)
81
+ return [];
82
+ try {
83
+ const rows = adapter
84
+ .prepare("SELECT id, decision FROM decisions WHERE superseded_by IS NULL")
85
+ .all();
86
+ return rows
87
+ .map((row) => ({
88
+ id: String(row["id"] ?? ""),
89
+ decision: String(row["decision"] ?? ""),
90
+ }))
91
+ .filter((row) => row.id.length > 0);
92
+ }
93
+ catch {
94
+ return [];
95
+ }
96
+ }
97
+ /**
98
+ * True when a memory row has a `structured_fields` JSON payload containing
99
+ * the given `markerKey: "value"` pair. Matches the LIKE pattern used by
100
+ * `backfillDecisionsToMemories` so the scanner is consistent with the
101
+ * backfill's idempotency check.
102
+ */
103
+ function memoryHasSourceMarker(markerKey, value) {
104
+ if (!isDbAvailable())
105
+ return false;
106
+ const adapter = _getAdapter();
107
+ if (!adapter)
108
+ return false;
109
+ try {
110
+ const pattern = `%"${markerKey}":"${value}"%`;
111
+ const row = adapter
112
+ .prepare("SELECT 1 FROM memories WHERE structured_fields LIKE :pattern LIMIT 1")
113
+ .get({ ":pattern": pattern });
114
+ return row !== undefined;
115
+ }
116
+ catch {
117
+ return false;
118
+ }
119
+ }
120
+ // ─── Public API ──────────────────────────────────────────────────────────────
121
+ const SAMPLE_LIMIT = 5;
122
+ /**
123
+ * Scan the legacy knowledge surfaces and return a structured report of what's
124
+ * already in the `memories` table vs what's still unmigrated. Pure detection
125
+ * — no DB writes, no file writes, no notifications.
126
+ */
127
+ export function scanConsolidationGaps(basePath) {
128
+ // ── Decisions ────────────────────────────────────────────────────────
129
+ const decisions = getActiveDecisions();
130
+ const decisionSamples = [];
131
+ let decisionMigrated = 0;
132
+ for (const decision of decisions) {
133
+ if (memoryHasSourceMarker("sourceDecisionId", decision.id)) {
134
+ decisionMigrated += 1;
135
+ continue;
136
+ }
137
+ if (decisionSamples.length < SAMPLE_LIMIT) {
138
+ decisionSamples.push({
139
+ id: decision.id,
140
+ decision: decision.decision.length > 80 ? decision.decision.slice(0, 79) + "…" : decision.decision,
141
+ });
142
+ }
143
+ }
144
+ // ── KNOWLEDGE.md ─────────────────────────────────────────────────────
145
+ const knowledgeRows = parseKnowledgeRows(knowledgeMdContent(basePath));
146
+ const knowledgeByTable = { rules: 0, patterns: 0, lessons: 0 };
147
+ const knowledgeSamples = [];
148
+ let knowledgeMigrated = 0;
149
+ for (const row of knowledgeRows) {
150
+ knowledgeByTable[row.table] += 1;
151
+ // Phase 6 will introduce a `sourceKnowledgeId` marker as part of the
152
+ // KNOWLEDGE.md backfill. Until that path ships, this check returns
153
+ // false for every row, which is the honest state of the consolidation.
154
+ if (memoryHasSourceMarker("sourceKnowledgeId", row.id)) {
155
+ knowledgeMigrated += 1;
156
+ continue;
157
+ }
158
+ if (knowledgeSamples.length < SAMPLE_LIMIT) {
159
+ knowledgeSamples.push({
160
+ table: row.table,
161
+ id: row.id,
162
+ row: row.row.length > 100 ? row.row.slice(0, 99) + "…" : row.row,
163
+ });
164
+ }
165
+ }
166
+ const decisionsReport = {
167
+ total: decisions.length,
168
+ migrated: decisionMigrated,
169
+ unmigrated: decisions.length - decisionMigrated,
170
+ samples: decisionSamples,
171
+ };
172
+ const knowledgeReport = {
173
+ total: knowledgeRows.length,
174
+ migrated: knowledgeMigrated,
175
+ unmigrated: knowledgeRows.length - knowledgeMigrated,
176
+ byTable: knowledgeByTable,
177
+ samples: knowledgeSamples,
178
+ };
179
+ const totalGaps = decisionsReport.unmigrated + knowledgeReport.unmigrated;
180
+ // Summary line is intentionally short so it fits in a single notification
181
+ // (notification-store truncates messages over 500 chars). Detail is
182
+ // accessible via getProviderSwitchStats-style callers, not embedded here.
183
+ const parts = [];
184
+ if (decisionsReport.unmigrated > 0) {
185
+ parts.push(`${decisionsReport.unmigrated} of ${decisionsReport.total} active decisions`);
186
+ }
187
+ if (knowledgeReport.unmigrated > 0) {
188
+ parts.push(`${knowledgeReport.unmigrated} of ${knowledgeReport.total} KNOWLEDGE.md rows`);
189
+ }
190
+ const summary = parts.length === 0
191
+ ? "Memory consolidation: all decisions and KNOWLEDGE.md rows are in memories."
192
+ : `Memory consolidation: ${parts.join(" and ")} not yet in memories table. Run /doctor for details.`;
193
+ return { decisions: decisionsReport, knowledge: knowledgeReport, totalGaps, summary };
194
+ }
195
+ /**
196
+ * Run the scanner and emit a persistent notification + workflow-logger
197
+ * warning when gaps exist. Best-effort: never throws; a broken scanner
198
+ * cannot block agent startup.
199
+ *
200
+ * Returns the full {@link ConsolidationGapReport} regardless of whether gaps
201
+ * exist (including when `totalGaps === 0`). Returns `null` only when
202
+ * `scanConsolidationGaps` itself throws. `appendNotification` and
203
+ * `logWarning` are called only when `report.totalGaps > 0`.
204
+ *
205
+ * Idempotent at the surface: the notification store applies its own
206
+ * 30-second dedup window keyed on (severity, source, message), so repeated
207
+ * boots with identical gaps produce one notification, not a flood.
208
+ */
209
+ export function reportConsolidationGaps(basePath) {
210
+ try {
211
+ const report = scanConsolidationGaps(basePath);
212
+ if (report.totalGaps === 0)
213
+ return report;
214
+ appendNotification(report.summary, "warning", "workflow-logger");
215
+ logWarning("memory-consolidation", report.summary);
216
+ return report;
217
+ }
218
+ catch (e) {
219
+ logWarning("memory-consolidation", `scanner failed: ${e.message}`);
220
+ return null;
221
+ }
222
+ }
@@ -21,6 +21,9 @@ import { migrateFromMarkdown } from "../md-importer.js";
21
21
  import { invalidateStateCache } from "../state.js";
22
22
  function assertMigrationImportMatchesPreview(imported, preview) {
23
23
  const mismatches = [];
24
+ if (imported.decisions !== preview.decisions.total) {
25
+ mismatches.push(`decisions ${imported.decisions}/${preview.decisions.total}`);
26
+ }
24
27
  if (imported.hierarchy.milestones !== preview.milestoneCount) {
25
28
  mismatches.push(`milestones ${imported.hierarchy.milestones}/${preview.milestoneCount}`);
26
29
  }
@@ -55,6 +58,7 @@ export async function importWrittenMigrationToDb(basePath, preview) {
55
58
  /** Format preview stats for embedding in the review prompt. */
56
59
  function formatPreviewStats(preview) {
57
60
  const lines = [
61
+ `- Decisions: ${preview.decisions.total}`,
58
62
  `- Milestones: ${preview.milestoneCount}`,
59
63
  `- Slices: ${preview.totalSlices} (${preview.doneSlices} done — ${preview.sliceCompletionPct}%)`,
60
64
  `- Tasks: ${preview.totalTasks} (${preview.doneTasks} done — ${preview.taskCompletionPct}%)`,
@@ -124,6 +128,7 @@ export async function handleMigrate(args, ctx, pi) {
124
128
  const preview = generatePreview(project);
125
129
  // ── Build preview text ─────────────────────────────────────────────────────
126
130
  const lines = [
131
+ `Decisions: ${preview.decisions.total}`,
127
132
  `Milestones: ${preview.milestoneCount}`,
128
133
  `Slices: ${preview.totalSlices} (${preview.doneSlices} done — ${preview.sliceCompletionPct}%)`,
129
134
  `Tasks: ${preview.totalTasks} (${preview.doneTasks} done — ${preview.taskCompletionPct}%)`,
@@ -71,6 +71,16 @@ function parsePhaseEntry(line) {
71
71
  raw: line,
72
72
  };
73
73
  }
74
+ // Format 3: - ✅ v1.0 MVP — Phases 1-6
75
+ const fmtVersionPhases = stripped.match(/^-\s+([✅🚧])\s+v\d+(?:\.\d+)*\s+(.+?)\s*[—–]\s*Phases?\s+(\d+(?:\.\d+)?)(?:\s*-\s*\d+(?:\.\d+)?)?(?:\s+\(.*\))?\s*$/iu);
76
+ if (fmtVersionPhases) {
77
+ return {
78
+ number: parseFloat(fmtVersionPhases[3]),
79
+ title: fmtVersionPhases[2].trim(),
80
+ done: fmtVersionPhases[1] === '✅',
81
+ raw: line,
82
+ };
83
+ }
74
84
  return null;
75
85
  }
76
86
  /**
@@ -1,5 +1,11 @@
1
1
  // GSD Migration Preview — Pre-write statistics
2
2
  // Pure function, no I/O. Computes counts from a GSDProject.
3
+ function countCanonicalDecisionRows(content) {
4
+ return content
5
+ .split('\n')
6
+ .filter((line) => /^\|\s*D\d+\s*\|/.test(line.trim()))
7
+ .length;
8
+ }
3
9
  /**
4
10
  * Compute pre-write statistics from a GSDProject without performing I/O.
5
11
  * Used to show the user what a migration will produce before writing anything.
@@ -35,6 +41,9 @@ export function generatePreview(project) {
35
41
  reqCounts.total++;
36
42
  }
37
43
  return {
44
+ decisions: {
45
+ total: countCanonicalDecisionRows(project.decisionsContent),
46
+ },
38
47
  milestoneCount: project.milestones.length,
39
48
  totalSlices,
40
49
  totalTasks,