@opengsd/gsd-pi 1.3.0 → 1.4.0-dev.c18009cd

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 (1157) hide show
  1. package/README.md +11 -11
  2. package/dist/cli.js +32 -4
  3. package/dist/headless-answers.js +1 -1
  4. package/dist/headless-context.js +0 -1
  5. package/dist/headless-ui.d.ts +1 -1
  6. package/dist/headless-ui.js +1 -1
  7. package/dist/headless.js +1 -1
  8. package/dist/help-text.js +29 -0
  9. package/dist/hermes-integration-install.d.ts +17 -0
  10. package/dist/hermes-integration-install.js +199 -0
  11. package/dist/jiti-workspace-aliases.d.ts +11 -2
  12. package/dist/jiti-workspace-aliases.js +19 -3
  13. package/dist/onboarding.js +11 -0
  14. package/dist/read-cli.d.ts +23 -0
  15. package/dist/read-cli.js +90 -0
  16. package/dist/resource-loader.d.ts +3 -3
  17. package/dist/resource-loader.js +4 -13
  18. package/dist/resources/.managed-resources-content-hash +1 -1
  19. package/dist/resources/GSD-WORKFLOW.md +35 -40
  20. package/dist/resources/extensions/claude-code-cli/index.js +7 -1
  21. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  22. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +202 -75
  23. package/dist/resources/extensions/cursor-cli/index.js +16 -0
  24. package/dist/resources/extensions/cursor-cli/models.js +63 -0
  25. package/dist/resources/extensions/cursor-cli/package.json +11 -0
  26. package/dist/resources/extensions/cursor-cli/readiness.js +128 -0
  27. package/dist/resources/extensions/cursor-cli/stream-adapter.js +353 -0
  28. package/dist/resources/extensions/google-cli/stream-adapter.js +82 -15
  29. package/dist/resources/extensions/gsd/activity-log.js +4 -1
  30. package/dist/resources/extensions/gsd/artifact-verification.js +443 -0
  31. package/dist/resources/extensions/gsd/auto/closeout.js +45 -42
  32. package/dist/resources/extensions/gsd/auto/dispatch-history.js +6 -1
  33. package/dist/resources/extensions/gsd/auto/finalize.js +9 -0
  34. package/dist/resources/extensions/gsd/auto/loop.js +67 -2
  35. package/dist/resources/extensions/gsd/auto/orchestrator.js +29 -11
  36. package/dist/resources/extensions/gsd/auto/run-unit.js +5 -2
  37. package/dist/resources/extensions/gsd/auto/schedule-wakeup.js +3 -0
  38. package/dist/resources/extensions/gsd/auto/session.js +11 -0
  39. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +1 -1
  40. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +15 -1
  41. package/dist/resources/extensions/gsd/auto-artifact-paths.js +108 -19
  42. package/dist/resources/extensions/gsd/auto-budget.js +5 -1
  43. package/dist/resources/extensions/gsd/auto-dispatch.js +77 -32
  44. package/dist/resources/extensions/gsd/auto-model-selection.js +43 -22
  45. package/dist/resources/extensions/gsd/auto-post-unit.js +28 -22
  46. package/dist/resources/extensions/gsd/auto-prompts.js +144 -45
  47. package/dist/resources/extensions/gsd/auto-recovery.js +14 -483
  48. package/dist/resources/extensions/gsd/auto-runtime-state.js +17 -5
  49. package/dist/resources/extensions/gsd/auto-start.js +60 -33
  50. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +7 -3
  51. package/dist/resources/extensions/gsd/auto-verification.js +10 -4
  52. package/dist/resources/extensions/gsd/auto-worktree.js +155 -102
  53. package/dist/resources/extensions/gsd/auto.js +63 -18
  54. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +141 -65
  55. package/dist/resources/extensions/gsd/bootstrap/core-session-tools.js +39 -0
  56. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +14 -5
  57. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -0
  58. package/dist/resources/extensions/gsd/bootstrap/fallback-continuation.js +25 -0
  59. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +23 -1
  60. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +227 -28
  61. package/dist/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.js +58 -9
  62. package/dist/resources/extensions/gsd/bootstrap/system-context.js +190 -43
  63. package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +104 -10
  64. package/dist/resources/extensions/gsd/bootstrap/tool-search-shim.js +22 -3
  65. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +87 -17
  66. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +95 -5
  67. package/dist/resources/extensions/gsd/codebase-generator.js +160 -25
  68. package/dist/resources/extensions/gsd/commands/catalog.js +6 -0
  69. package/dist/resources/extensions/gsd/commands/dispatcher.js +3 -0
  70. package/dist/resources/extensions/gsd/commands/gsd-core-aliases-handler.js +39 -0
  71. package/dist/resources/extensions/gsd/commands/gsd-core-aliases.js +44 -0
  72. package/dist/resources/extensions/gsd/commands/handlers/auto.js +1 -1
  73. package/dist/resources/extensions/gsd/commands/handlers/core.js +70 -4
  74. package/dist/resources/extensions/gsd/commands/handlers/ops.js +225 -1
  75. package/dist/resources/extensions/gsd/commands-cmux.js +3 -1
  76. package/dist/resources/extensions/gsd/commands-context.js +19 -1
  77. package/dist/resources/extensions/gsd/commands-gsd-core.js +868 -0
  78. package/dist/resources/extensions/gsd/commands-handlers.js +67 -1
  79. package/dist/resources/extensions/gsd/commands-maintenance.js +79 -2
  80. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +176 -13
  81. package/dist/resources/extensions/gsd/commands-usage.js +1 -1
  82. package/dist/resources/extensions/gsd/commands-verdict.js +17 -11
  83. package/dist/resources/extensions/gsd/commands-worktree.js +23 -12
  84. package/dist/resources/extensions/gsd/compat/compat-marker.js +172 -0
  85. package/dist/resources/extensions/gsd/compat/index.js +3 -0
  86. package/dist/resources/extensions/gsd/compat/planning-compat.js +142 -0
  87. package/dist/resources/extensions/gsd/config-overlay.js +2 -2
  88. package/dist/resources/extensions/gsd/consent-question.js +12 -0
  89. package/dist/resources/extensions/gsd/consent-verdict.js +10 -0
  90. package/dist/resources/extensions/gsd/dashboard-overlay.js +71 -6
  91. package/dist/resources/extensions/gsd/db/engine.js +31 -1
  92. package/dist/resources/extensions/gsd/db/queries.js +153 -0
  93. package/dist/resources/extensions/gsd/db/unit-dispatches.js +22 -1
  94. package/dist/resources/extensions/gsd/db-memory-fts-schema.js +34 -0
  95. package/dist/resources/extensions/gsd/db-workspace.js +68 -4
  96. package/dist/resources/extensions/gsd/delegation-policy.js +1 -1
  97. package/dist/resources/extensions/gsd/discussion-handoff.js +17 -8
  98. package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -4
  99. package/dist/resources/extensions/gsd/doctor-engine-checks.js +387 -7
  100. package/dist/resources/extensions/gsd/doctor-git-checks.js +25 -3
  101. package/dist/resources/extensions/gsd/doctor-providers.js +130 -18
  102. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +5 -15
  103. package/dist/resources/extensions/gsd/doctor.js +121 -10
  104. package/dist/resources/extensions/gsd/error-classifier.js +13 -1
  105. package/dist/resources/extensions/gsd/escalation.js +11 -4
  106. package/dist/resources/extensions/gsd/exec-sandbox.js +59 -13
  107. package/dist/resources/extensions/gsd/export-html.js +10 -3
  108. package/dist/resources/extensions/gsd/export.js +73 -0
  109. package/dist/resources/extensions/gsd/file-lock.js +1 -1
  110. package/dist/resources/extensions/gsd/flat-phase-migration.js +272 -0
  111. package/dist/resources/extensions/gsd/forensics.js +4 -33
  112. package/dist/resources/extensions/gsd/git-service.js +72 -16
  113. package/dist/resources/extensions/gsd/gitignore.js +10 -3
  114. package/dist/resources/extensions/gsd/gsd-db.js +52 -0
  115. package/dist/resources/extensions/gsd/guidance.js +8 -7
  116. package/dist/resources/extensions/gsd/guided-flow-queue.js +66 -5
  117. package/dist/resources/extensions/gsd/guided-flow.js +50 -7
  118. package/dist/resources/extensions/gsd/health-widget.js +55 -29
  119. package/dist/resources/extensions/gsd/json-persistence.js +20 -0
  120. package/dist/resources/extensions/gsd/key-manager.js +1 -0
  121. package/dist/resources/extensions/gsd/knowledge-backfill.js +18 -11
  122. package/dist/resources/extensions/gsd/layout-policy.js +77 -0
  123. package/dist/resources/extensions/gsd/markdown-renderer.js +420 -129
  124. package/dist/resources/extensions/gsd/mcp-filter.js +44 -10
  125. package/dist/resources/extensions/gsd/md-importer.js +153 -51
  126. package/dist/resources/extensions/gsd/memory-backfill.js +28 -21
  127. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +44 -21
  128. package/dist/resources/extensions/gsd/metrics.js +22 -14
  129. package/dist/resources/extensions/gsd/migrate/layout-detect.js +32 -0
  130. package/dist/resources/extensions/gsd/migrate/planning-writer.js +203 -0
  131. package/dist/resources/extensions/gsd/migrate-external.js +83 -12
  132. package/dist/resources/extensions/gsd/migration-auto-check.js +27 -14
  133. package/dist/resources/extensions/gsd/milestone-actions.js +5 -3
  134. package/dist/resources/extensions/gsd/milestone-closeout.js +12 -2
  135. package/dist/resources/extensions/gsd/milestone-ids.js +79 -18
  136. package/dist/resources/extensions/gsd/milestone-implementation-evidence.js +26 -20
  137. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +3 -3
  138. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +8 -0
  139. package/dist/resources/extensions/gsd/milestone-validation-verdict.js +7 -4
  140. package/dist/resources/extensions/gsd/model-router.js +79 -20
  141. package/dist/resources/extensions/gsd/notification-store.js +22 -29
  142. package/dist/resources/extensions/gsd/notifications.js +36 -7
  143. package/dist/resources/extensions/gsd/observability-validator.js +12 -4
  144. package/dist/resources/extensions/gsd/orphan-stash-audit.js +92 -16
  145. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +133 -35
  146. package/dist/resources/extensions/gsd/parsers-legacy.js +40 -14
  147. package/dist/resources/extensions/gsd/paths.js +356 -44
  148. package/dist/resources/extensions/gsd/planning-depth.js +2 -1
  149. package/dist/resources/extensions/gsd/post-execution-checks.js +26 -3
  150. package/dist/resources/extensions/gsd/preferences-diagnostics.js +24 -1
  151. package/dist/resources/extensions/gsd/preferences-models.js +25 -11
  152. package/dist/resources/extensions/gsd/preferences-validation.js +25 -2
  153. package/dist/resources/extensions/gsd/preferences.js +91 -15
  154. package/dist/resources/extensions/gsd/prompts/ai-integration-phase.md +28 -0
  155. package/dist/resources/extensions/gsd/prompts/audit-fix.md +39 -0
  156. package/dist/resources/extensions/gsd/prompts/audit-milestone.md +26 -0
  157. package/dist/resources/extensions/gsd/prompts/audit-uat.md +24 -0
  158. package/dist/resources/extensions/gsd/prompts/autonomous.md +31 -0
  159. package/dist/resources/extensions/gsd/prompts/code-review.md +39 -0
  160. package/dist/resources/extensions/gsd/prompts/complete-slice.md +21 -16
  161. package/dist/resources/extensions/gsd/prompts/discuss-phase.md +31 -0
  162. package/dist/resources/extensions/gsd/prompts/docs-update.md +13 -0
  163. package/dist/resources/extensions/gsd/prompts/execute-phase.md +33 -0
  164. package/dist/resources/extensions/gsd/prompts/explore.md +58 -0
  165. package/dist/resources/extensions/gsd/prompts/graphify.md +27 -0
  166. package/dist/resources/extensions/gsd/prompts/health.md +37 -0
  167. package/dist/resources/extensions/gsd/prompts/import.md +30 -0
  168. package/dist/resources/extensions/gsd/prompts/inbox.md +27 -0
  169. package/dist/resources/extensions/gsd/prompts/ingest-docs.md +30 -0
  170. package/dist/resources/extensions/gsd/prompts/manager.md +21 -0
  171. package/dist/resources/extensions/gsd/prompts/map-codebase.md +42 -0
  172. package/dist/resources/extensions/gsd/prompts/milestone-summary.md +27 -0
  173. package/dist/resources/extensions/gsd/prompts/mvp-phase.md +23 -0
  174. package/dist/resources/extensions/gsd/prompts/pause-work.md +24 -0
  175. package/dist/resources/extensions/gsd/prompts/phase.md +22 -0
  176. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
  177. package/dist/resources/extensions/gsd/prompts/plan-phase.md +34 -0
  178. package/dist/resources/extensions/gsd/prompts/plan-review-convergence.md +34 -0
  179. package/dist/resources/extensions/gsd/prompts/plan-slice.md +5 -3
  180. package/dist/resources/extensions/gsd/prompts/profile-user.md +28 -0
  181. package/dist/resources/extensions/gsd/prompts/progress.md +30 -0
  182. package/dist/resources/extensions/gsd/prompts/resume-work.md +20 -0
  183. package/dist/resources/extensions/gsd/prompts/review-backlog.md +21 -0
  184. package/dist/resources/extensions/gsd/prompts/review.md +27 -0
  185. package/dist/resources/extensions/gsd/prompts/secure-phase.md +24 -0
  186. package/dist/resources/extensions/gsd/prompts/settings.md +24 -0
  187. package/dist/resources/extensions/gsd/prompts/sketch.md +59 -0
  188. package/dist/resources/extensions/gsd/prompts/spec-phase.md +29 -0
  189. package/dist/resources/extensions/gsd/prompts/spike.md +59 -0
  190. package/dist/resources/extensions/gsd/prompts/stats.md +43 -0
  191. package/dist/resources/extensions/gsd/prompts/surface.md +25 -0
  192. package/dist/resources/extensions/gsd/prompts/thread.md +24 -0
  193. package/dist/resources/extensions/gsd/prompts/ui-phase.md +29 -0
  194. package/dist/resources/extensions/gsd/prompts/ui-review.md +29 -0
  195. package/dist/resources/extensions/gsd/prompts/ultraplan-phase.md +24 -0
  196. package/dist/resources/extensions/gsd/prompts/validate-phase.md +26 -0
  197. package/dist/resources/extensions/gsd/prompts/verify-work.md +24 -0
  198. package/dist/resources/extensions/gsd/prompts/workspace.md +22 -0
  199. package/dist/resources/extensions/gsd/prompts/workstreams.md +24 -0
  200. package/dist/resources/extensions/gsd/queue-order.js +3 -2
  201. package/dist/resources/extensions/gsd/quick.js +45 -2
  202. package/dist/resources/extensions/gsd/recovery-classification.js +8 -0
  203. package/dist/resources/extensions/gsd/redact-secrets.js +37 -0
  204. package/dist/resources/extensions/gsd/repo-identity.js +16 -0
  205. package/dist/resources/extensions/gsd/repository-registry.js +6 -1
  206. package/dist/resources/extensions/gsd/roadmap-slices.js +1 -1
  207. package/dist/resources/extensions/gsd/root-write-leak-guard.js +11 -3
  208. package/dist/resources/extensions/gsd/safe-fs.js +23 -2
  209. package/dist/resources/extensions/gsd/safety/content-validator.js +2 -1
  210. package/dist/resources/extensions/gsd/safety/destructive-guard.js +8 -1
  211. package/dist/resources/extensions/gsd/safety/evidence-collector.js +16 -1
  212. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +43 -1
  213. package/dist/resources/extensions/gsd/safety/file-change-validator.js +5 -2
  214. package/dist/resources/extensions/gsd/service-tier.js +2 -1
  215. package/dist/resources/extensions/gsd/session-forensics.js +11 -1
  216. package/dist/resources/extensions/gsd/session-lock.js +7 -6
  217. package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +10 -9
  218. package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +52 -0
  219. package/dist/resources/extensions/gsd/state/derive/cache.js +28 -0
  220. package/dist/resources/extensions/gsd/state/derive/db-open.js +39 -0
  221. package/dist/resources/extensions/gsd/state/derive/from-db.js +452 -0
  222. package/dist/resources/extensions/gsd/state/derive/index.js +75 -0
  223. package/dist/resources/extensions/gsd/state/derive/interrupted-work.js +21 -0
  224. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +38 -4
  225. package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +24 -3
  226. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +82 -0
  227. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +142 -0
  228. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +19 -6
  229. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +2 -2
  230. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +138 -19
  231. package/dist/resources/extensions/gsd/state-reconciliation/index.js +84 -26
  232. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +34 -18
  233. package/dist/resources/extensions/gsd/state.js +13 -581
  234. package/dist/resources/extensions/gsd/sync-lock.js +11 -18
  235. package/dist/resources/extensions/gsd/tool-surface-readiness.js +205 -16
  236. package/dist/resources/extensions/gsd/tools/complete-milestone.js +8 -4
  237. package/dist/resources/extensions/gsd/tools/complete-slice.js +14 -4
  238. package/dist/resources/extensions/gsd/tools/complete-task.js +58 -15
  239. package/dist/resources/extensions/gsd/tools/exec-tool.js +7 -2
  240. package/dist/resources/extensions/gsd/tools/plan-slice.js +60 -47
  241. package/dist/resources/extensions/gsd/tools/plan-task.js +115 -9
  242. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +9 -3
  243. package/dist/resources/extensions/gsd/tools/validate-milestone.js +8 -3
  244. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +84 -5
  245. package/dist/resources/extensions/gsd/triage-resolution.js +14 -7
  246. package/dist/resources/extensions/gsd/undo.js +51 -15
  247. package/dist/resources/extensions/gsd/unit-context-composer.js +23 -7
  248. package/dist/resources/extensions/gsd/unit-context-manifest.js +5 -4
  249. package/dist/resources/extensions/gsd/unit-registry.js +90 -11
  250. package/dist/resources/extensions/gsd/unit-runtime.js +21 -0
  251. package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +91 -5
  252. package/dist/resources/extensions/gsd/validation-block-guard.js +54 -4
  253. package/dist/resources/extensions/gsd/verification-gate.js +7 -0
  254. package/dist/resources/extensions/gsd/visualizer-data.js +35 -0
  255. package/dist/resources/extensions/gsd/visualizer-views.js +21 -2
  256. package/dist/resources/extensions/gsd/workflow-manifest.js +126 -13
  257. package/dist/resources/extensions/gsd/workflow-mcp.js +9 -1
  258. package/dist/resources/extensions/gsd/workflow-projections.js +44 -18
  259. package/dist/resources/extensions/gsd/workspace-git-preflight.js +30 -1
  260. package/dist/resources/extensions/gsd/workspace.js +26 -8
  261. package/dist/resources/extensions/gsd/worktree-command.js +6 -6
  262. package/dist/resources/extensions/gsd/worktree-health.js +6 -3
  263. package/dist/resources/extensions/gsd/worktree-lifecycle.js +67 -5
  264. package/dist/resources/extensions/gsd/worktree-manager.js +155 -20
  265. package/dist/resources/extensions/gsd/worktree-safety.js +20 -11
  266. package/dist/resources/extensions/mcp-client/manager.js +3 -3
  267. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  268. package/dist/update-check.js +15 -4
  269. package/dist/web/standalone/.next/BUILD_ID +1 -1
  270. package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
  271. package/dist/web/standalone/.next/build-manifest.json +4 -4
  272. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  273. package/dist/web/standalone/.next/react-loadable-manifest.json +9 -9
  274. package/dist/web/standalone/.next/required-server-files.json +3 -3
  275. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  276. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  277. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  278. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  279. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  280. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  281. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  282. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  283. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  284. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  285. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  286. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  287. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  288. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  289. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  290. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  291. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  292. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  293. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  294. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  295. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  296. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  297. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  298. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  299. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  300. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  301. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  302. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  303. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  304. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  305. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  306. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  307. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  308. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  309. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  310. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  311. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  312. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  313. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  314. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  315. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  316. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  317. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  318. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  319. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  320. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  321. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  322. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  323. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  324. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  325. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  326. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  327. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  328. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  329. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  330. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  331. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  332. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  333. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js +1 -1
  334. package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +1 -1
  335. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  336. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  337. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  338. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  339. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  340. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  341. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  342. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  343. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  344. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  345. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  346. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  347. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  348. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  349. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  350. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  351. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  352. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  353. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  354. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  355. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  356. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  357. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  358. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  359. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  360. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  361. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  362. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  363. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  364. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  365. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  366. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  367. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  368. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  369. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  370. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  371. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  372. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  373. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  374. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  375. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  376. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  377. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  378. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  379. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  380. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  381. package/dist/web/standalone/.next/server/app/index.html +1 -1
  382. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  383. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  384. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  385. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  386. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  387. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  388. package/dist/web/standalone/.next/server/app/page.js +2 -2
  389. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  390. package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
  391. package/dist/web/standalone/.next/server/chunks/1128.js +1 -1
  392. package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
  393. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  394. package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
  395. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  396. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  397. package/dist/web/standalone/.next/server/middleware.js +3 -3
  398. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  399. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  400. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  401. package/dist/web/standalone/.next/static/chunks/{2659.b7b129ee6a769448.js → 2659.58e950899a9bb82f.js} +1 -1
  402. package/dist/web/standalone/.next/static/chunks/2772.a7c1fcc69a4685ef.js +1 -0
  403. package/dist/web/standalone/.next/static/chunks/{3616.3c60753b8ffcbd2e.js → 3616.61a2af74bb8833c8.js} +1 -1
  404. package/dist/web/standalone/.next/static/chunks/{4283.e4873b058df143a1.js → 4283.d0d9e0a955e441cb.js} +2 -2
  405. package/dist/web/standalone/.next/static/chunks/{5826.a46ecdd1cfe8dabc.js → 5826.5421d66c72b9f34e.js} +1 -1
  406. package/dist/web/standalone/.next/static/chunks/8785.e29b3134cab1d153.js +1 -0
  407. package/dist/web/standalone/.next/static/chunks/8937.640dc9c2aaa1dfad.js +10 -0
  408. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-a6fb1847f67f167c.js +1 -0
  409. package/dist/web/standalone/.next/static/chunks/app/{layout-b35cbfff38aaf4cf.js → layout-4ae2d68984392bbf.js} +1 -1
  410. package/dist/web/standalone/.next/static/chunks/app/page-72a856634ad14c10.js +1 -0
  411. package/dist/web/standalone/.next/static/chunks/{main-app-590a74400e35f685.js → main-app-90d1d8d5e5d2dc6b.js} +1 -1
  412. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +1 -0
  413. package/dist/web/standalone/.next/static/chunks/webpack-9c401904f87ded16.js +1 -0
  414. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  415. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  416. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  417. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  418. package/dist/web/standalone/server.js +1 -1
  419. package/dist/web-mode.d.ts +3 -1
  420. package/dist/web-mode.js +7 -5
  421. package/dist/wizard.d.ts +8 -0
  422. package/dist/wizard.js +8 -1
  423. package/integrations/hermes/CONTEXT.md +47 -0
  424. package/integrations/hermes/README.md +69 -0
  425. package/integrations/hermes/__init__.py +31 -0
  426. package/integrations/hermes/docs/issue-1162-grilling.md +197 -0
  427. package/integrations/hermes/docs/setup.md +276 -0
  428. package/integrations/hermes/docs/upstream-hermes-pr.md +40 -0
  429. package/integrations/hermes/open_gsd_hermes/__init__.py +105 -0
  430. package/integrations/hermes/open_gsd_hermes/binding.py +107 -0
  431. package/integrations/hermes/open_gsd_hermes/commands.py +327 -0
  432. package/integrations/hermes/open_gsd_hermes/config.py +61 -0
  433. package/integrations/hermes/open_gsd_hermes/credentials.py +51 -0
  434. package/integrations/hermes/open_gsd_hermes/cron.py +85 -0
  435. package/integrations/hermes/open_gsd_hermes/formatting.py +13 -0
  436. package/integrations/hermes/open_gsd_hermes/gsd_client.py +832 -0
  437. package/integrations/hermes/open_gsd_hermes/inject.py +31 -0
  438. package/integrations/hermes/open_gsd_hermes/memory.py +66 -0
  439. package/integrations/hermes/open_gsd_hermes/notifications.py +80 -0
  440. package/integrations/hermes/open_gsd_hermes/snapshot.py +42 -0
  441. package/integrations/hermes/open_gsd_hermes/supervisor.py +180 -0
  442. package/integrations/hermes/open_gsd_hermes/types.py +100 -0
  443. package/integrations/hermes/plugin.yaml +42 -0
  444. package/integrations/hermes/pyproject.toml +32 -0
  445. package/integrations/hermes/scripts/preflight.sh +92 -0
  446. package/integrations/hermes/tests/fixtures/minimal-project/.gsd/STATE.md +17 -0
  447. package/integrations/hermes/tests/golden/memory_prefetch.txt +5 -0
  448. package/integrations/hermes/tests/golden/snapshot.txt +8 -0
  449. package/integrations/hermes/tests/test_binding.py +103 -0
  450. package/integrations/hermes/tests/test_config.py +42 -0
  451. package/integrations/hermes/tests/test_cron.py +34 -0
  452. package/integrations/hermes/tests/test_directory_loader.py +37 -0
  453. package/integrations/hermes/tests/test_gsd_client_cache.py +123 -0
  454. package/integrations/hermes/tests/test_gsd_client_execute.py +35 -0
  455. package/integrations/hermes/tests/test_gsd_client_process_cwd.py +22 -0
  456. package/integrations/hermes/tests/test_gsd_client_timeout.py +98 -0
  457. package/integrations/hermes/tests/test_memory.py +59 -0
  458. package/integrations/hermes/tests/test_milestone_client.py +447 -0
  459. package/integrations/hermes/tests/test_new_milestone_command.py +313 -0
  460. package/integrations/hermes/tests/test_read_cli_contract.py +50 -0
  461. package/integrations/hermes/tests/test_register.py +56 -0
  462. package/integrations/hermes/tests/test_snapshot.py +53 -0
  463. package/integrations/hermes/tests/test_supervisor_fsm.py +621 -0
  464. package/package.json +9 -8
  465. package/packages/cloud-mcp-gateway/dist/auth-store.d.ts +1 -0
  466. package/packages/cloud-mcp-gateway/dist/auth-store.d.ts.map +1 -1
  467. package/packages/cloud-mcp-gateway/dist/auth-store.js +21 -1
  468. package/packages/cloud-mcp-gateway/dist/auth-store.js.map +1 -1
  469. package/packages/cloud-mcp-gateway/dist/auth-store.test.js +34 -0
  470. package/packages/cloud-mcp-gateway/dist/auth-store.test.js.map +1 -1
  471. package/packages/cloud-mcp-gateway/dist/runtime-registry.d.ts +8 -0
  472. package/packages/cloud-mcp-gateway/dist/runtime-registry.d.ts.map +1 -1
  473. package/packages/cloud-mcp-gateway/dist/runtime-registry.js +19 -2
  474. package/packages/cloud-mcp-gateway/dist/runtime-registry.js.map +1 -1
  475. package/packages/cloud-mcp-gateway/dist/runtime-registry.test.js +71 -2
  476. package/packages/cloud-mcp-gateway/dist/runtime-registry.test.js.map +1 -1
  477. package/packages/cloud-mcp-gateway/package.json +2 -2
  478. package/packages/contracts/dist/workflow.d.ts +1 -0
  479. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  480. package/packages/contracts/dist/workflow.js +2 -0
  481. package/packages/contracts/dist/workflow.js.map +1 -1
  482. package/packages/contracts/package.json +1 -1
  483. package/packages/daemon/dist/cloud-runtime.d.ts +2 -0
  484. package/packages/daemon/dist/cloud-runtime.d.ts.map +1 -1
  485. package/packages/daemon/dist/cloud-runtime.js +25 -1
  486. package/packages/daemon/dist/cloud-runtime.js.map +1 -1
  487. package/packages/daemon/dist/cloud-runtime.test.js +51 -0
  488. package/packages/daemon/dist/cloud-runtime.test.js.map +1 -1
  489. package/packages/daemon/dist/message-batcher.d.ts +7 -0
  490. package/packages/daemon/dist/message-batcher.d.ts.map +1 -1
  491. package/packages/daemon/dist/message-batcher.js +13 -0
  492. package/packages/daemon/dist/message-batcher.js.map +1 -1
  493. package/packages/daemon/dist/message-batcher.test.js +48 -0
  494. package/packages/daemon/dist/message-batcher.test.js.map +1 -1
  495. package/packages/daemon/dist/session-manager.js +1 -1
  496. package/packages/daemon/dist/session-manager.js.map +1 -1
  497. package/packages/daemon/package.json +5 -5
  498. package/packages/gsd-agent-core/dist/agent-session.d.ts +1 -0
  499. package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
  500. package/packages/gsd-agent-core/dist/agent-session.js +3 -0
  501. package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
  502. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts +13 -1
  503. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
  504. package/packages/gsd-agent-core/dist/compaction/compaction.js +15 -1
  505. package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
  506. package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts +41 -0
  507. package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts.map +1 -0
  508. package/packages/gsd-agent-core/dist/extension-ui-snapshot.js +62 -0
  509. package/packages/gsd-agent-core/dist/extension-ui-snapshot.js.map +1 -0
  510. package/packages/gsd-agent-core/dist/index.d.ts +2 -0
  511. package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
  512. package/packages/gsd-agent-core/dist/index.js +2 -0
  513. package/packages/gsd-agent-core/dist/index.js.map +1 -1
  514. package/packages/gsd-agent-core/dist/session/agent-session-events.js +1 -1
  515. package/packages/gsd-agent-core/dist/session/agent-session-events.js.map +1 -1
  516. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +1 -0
  517. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
  518. package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
  519. package/packages/gsd-agent-core/dist/session/agent-session-navigation.d.ts.map +1 -1
  520. package/packages/gsd-agent-core/dist/session/agent-session-navigation.js +4 -1
  521. package/packages/gsd-agent-core/dist/session/agent-session-navigation.js.map +1 -1
  522. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts +5 -0
  523. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
  524. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +60 -3
  525. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
  526. package/packages/gsd-agent-core/dist/transcript-store.d.ts +58 -0
  527. package/packages/gsd-agent-core/dist/transcript-store.d.ts.map +1 -0
  528. package/packages/gsd-agent-core/dist/transcript-store.js +132 -0
  529. package/packages/gsd-agent-core/dist/transcript-store.js.map +1 -0
  530. package/packages/gsd-agent-core/package.json +5 -5
  531. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +2 -0
  532. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  533. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +25 -11
  534. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  535. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts +4 -0
  536. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts.map +1 -0
  537. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js +7 -0
  538. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js.map +1 -0
  539. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -24
  540. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  541. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +26 -829
  542. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  543. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts +58 -0
  544. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts.map +1 -0
  545. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js +312 -0
  546. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js.map +1 -0
  547. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts +31 -0
  548. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts.map +1 -0
  549. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js +130 -0
  550. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js.map +1 -0
  551. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts +15 -0
  552. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts.map +1 -0
  553. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js +259 -0
  554. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map +1 -0
  555. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts +13 -0
  556. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts.map +1 -0
  557. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js +118 -0
  558. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js.map +1 -0
  559. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +9 -0
  560. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  561. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js +1 -1
  562. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  563. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts +54 -0
  564. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts.map +1 -0
  565. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js +20 -0
  566. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js.map +1 -0
  567. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +4 -1
  568. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  569. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +9 -0
  570. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  571. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts +56 -0
  572. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts.map +1 -0
  573. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js +44 -0
  574. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js.map +1 -0
  575. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts +5 -0
  576. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts.map +1 -0
  577. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js +77 -0
  578. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js.map +1 -0
  579. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts +2 -0
  580. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  581. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +24 -6
  582. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js.map +1 -1
  583. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  584. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +18 -0
  585. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  586. package/packages/gsd-agent-modes/package.json +7 -7
  587. package/packages/mcp-server/README.md +11 -1
  588. package/packages/mcp-server/dist/cli-errors.d.ts +11 -0
  589. package/packages/mcp-server/dist/cli-errors.d.ts.map +1 -1
  590. package/packages/mcp-server/dist/cli-errors.js +12 -0
  591. package/packages/mcp-server/dist/cli-errors.js.map +1 -1
  592. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -1
  593. package/packages/mcp-server/dist/cli-runner.js +33 -0
  594. package/packages/mcp-server/dist/cli-runner.js.map +1 -1
  595. package/packages/mcp-server/dist/cli.d.ts +1 -0
  596. package/packages/mcp-server/dist/cli.d.ts.map +1 -1
  597. package/packages/mcp-server/dist/cli.js +1 -0
  598. package/packages/mcp-server/dist/cli.js.map +1 -1
  599. package/packages/mcp-server/dist/server.d.ts +45 -3
  600. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  601. package/packages/mcp-server/dist/server.js +128 -8
  602. package/packages/mcp-server/dist/server.js.map +1 -1
  603. package/packages/mcp-server/dist/session-manager.js +1 -1
  604. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  605. package/packages/mcp-server/dist/workflow-tools.d.ts +13 -1
  606. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  607. package/packages/mcp-server/dist/workflow-tools.js +35 -21
  608. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  609. package/packages/mcp-server/package.json +21 -5
  610. package/packages/native/package.json +1 -1
  611. package/packages/pi-agent-core/dist/agent-loop.js +3 -2
  612. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  613. package/packages/pi-agent-core/package.json +1 -1
  614. package/packages/pi-ai/dist/env-api-keys.d.ts.map +1 -1
  615. package/packages/pi-ai/dist/env-api-keys.js +3 -0
  616. package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
  617. package/packages/pi-ai/dist/models.generated.d.ts +46 -0
  618. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  619. package/packages/pi-ai/dist/models.generated.js +38 -0
  620. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  621. package/packages/pi-ai/dist/types.d.ts +2 -2
  622. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  623. package/packages/pi-ai/dist/types.js.map +1 -1
  624. package/packages/pi-ai/package.json +1 -1
  625. package/packages/pi-coding-agent/README.md +3 -2
  626. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  627. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
  628. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  629. package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts +9 -0
  630. package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts.map +1 -0
  631. package/packages/pi-coding-agent/dist/core/session-manager-context.js +94 -0
  632. package/packages/pi-coding-agent/dist/core/session-manager-context.js.map +1 -0
  633. package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts +8 -0
  634. package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts.map +1 -0
  635. package/packages/pi-coding-agent/dist/core/session-manager-list.js +244 -0
  636. package/packages/pi-coding-agent/dist/core/session-manager-list.js.map +1 -0
  637. package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts +12 -0
  638. package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts.map +1 -0
  639. package/packages/pi-coding-agent/dist/core/session-manager-migration.js +84 -0
  640. package/packages/pi-coding-agent/dist/core/session-manager-migration.js.map +1 -0
  641. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +136 -0
  642. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -0
  643. package/packages/pi-coding-agent/dist/core/session-manager-types.js +2 -0
  644. package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -0
  645. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +6 -154
  646. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  647. package/packages/pi-coding-agent/dist/core/session-manager.js +25 -459
  648. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  649. package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts +75 -75
  650. package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts.map +1 -1
  651. package/packages/pi-coding-agent/dist/theme/theme-schema.js +1 -1
  652. package/packages/pi-coding-agent/dist/theme/theme-schema.js.map +1 -1
  653. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  654. package/packages/pi-coding-agent/dist/theme/theme.js +11 -7
  655. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  656. package/packages/pi-coding-agent/package.json +7 -7
  657. package/packages/pi-tui/package.json +2 -2
  658. package/packages/rpc-client/dist/rpc-client.js +1 -1
  659. package/packages/rpc-client/dist/rpc-client.js.map +1 -1
  660. package/packages/rpc-client/package.json +2 -2
  661. package/pkg/dist/theme/theme-schema.d.ts +75 -75
  662. package/pkg/dist/theme/theme-schema.d.ts.map +1 -1
  663. package/pkg/dist/theme/theme-schema.js +1 -1
  664. package/pkg/dist/theme/theme-schema.js.map +1 -1
  665. package/pkg/dist/theme/theme.d.ts.map +1 -1
  666. package/pkg/dist/theme/theme.js +11 -7
  667. package/pkg/dist/theme/theme.js.map +1 -1
  668. package/pkg/package.json +1 -1
  669. package/scripts/link-workspace-packages.cjs +14 -4
  670. package/src/resources/GSD-WORKFLOW.md +35 -40
  671. package/src/resources/extensions/claude-code-cli/index.ts +8 -1
  672. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  673. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +233 -73
  674. package/src/resources/extensions/claude-code-cli/tests/index.test.ts +61 -0
  675. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +633 -49
  676. package/src/resources/extensions/cursor-cli/index.ts +18 -0
  677. package/src/resources/extensions/cursor-cli/models.ts +65 -0
  678. package/src/resources/extensions/cursor-cli/package.json +11 -0
  679. package/src/resources/extensions/cursor-cli/readiness.ts +143 -0
  680. package/src/resources/extensions/cursor-cli/stream-adapter.ts +440 -0
  681. package/src/resources/extensions/cursor-cli/tests/index.test.ts +54 -0
  682. package/src/resources/extensions/cursor-cli/tests/readiness.test.ts +29 -0
  683. package/src/resources/extensions/cursor-cli/tests/stream-adapter.test.ts +166 -0
  684. package/src/resources/extensions/google-cli/stream-adapter.ts +106 -19
  685. package/src/resources/extensions/gsd/activity-log.ts +4 -1
  686. package/src/resources/extensions/gsd/artifact-verification.ts +480 -0
  687. package/src/resources/extensions/gsd/auto/closeout.ts +54 -56
  688. package/src/resources/extensions/gsd/auto/dispatch-history.ts +19 -1
  689. package/src/resources/extensions/gsd/auto/finalize.ts +8 -0
  690. package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -0
  691. package/src/resources/extensions/gsd/auto/loop.ts +69 -2
  692. package/src/resources/extensions/gsd/auto/orchestrator.ts +39 -14
  693. package/src/resources/extensions/gsd/auto/run-unit.ts +5 -2
  694. package/src/resources/extensions/gsd/auto/schedule-wakeup.ts +8 -0
  695. package/src/resources/extensions/gsd/auto/session.ts +14 -0
  696. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +3 -1
  697. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +25 -3
  698. package/src/resources/extensions/gsd/auto-artifact-paths.ts +129 -20
  699. package/src/resources/extensions/gsd/auto-budget.ts +12 -1
  700. package/src/resources/extensions/gsd/auto-dispatch.ts +85 -39
  701. package/src/resources/extensions/gsd/auto-model-selection.ts +56 -18
  702. package/src/resources/extensions/gsd/auto-post-unit.ts +37 -23
  703. package/src/resources/extensions/gsd/auto-prompts.ts +153 -45
  704. package/src/resources/extensions/gsd/auto-recovery.ts +21 -484
  705. package/src/resources/extensions/gsd/auto-runtime-state.ts +17 -5
  706. package/src/resources/extensions/gsd/auto-start.ts +67 -37
  707. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +7 -2
  708. package/src/resources/extensions/gsd/auto-verification.ts +10 -8
  709. package/src/resources/extensions/gsd/auto-worktree.ts +98 -26
  710. package/src/resources/extensions/gsd/auto.ts +68 -14
  711. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +164 -71
  712. package/src/resources/extensions/gsd/bootstrap/core-session-tools.ts +44 -0
  713. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +14 -5
  714. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -0
  715. package/src/resources/extensions/gsd/bootstrap/fallback-continuation.ts +31 -0
  716. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +23 -1
  717. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +263 -28
  718. package/src/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.ts +80 -12
  719. package/src/resources/extensions/gsd/bootstrap/system-context.ts +219 -46
  720. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +49 -1
  721. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +114 -10
  722. package/src/resources/extensions/gsd/bootstrap/tool-search-shim.ts +21 -3
  723. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +109 -19
  724. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +109 -4
  725. package/src/resources/extensions/gsd/codebase-generator.ts +183 -25
  726. package/src/resources/extensions/gsd/commands/catalog.ts +6 -0
  727. package/src/resources/extensions/gsd/commands/dispatcher.ts +3 -0
  728. package/src/resources/extensions/gsd/commands/gsd-core-aliases-handler.ts +48 -0
  729. package/src/resources/extensions/gsd/commands/gsd-core-aliases.ts +63 -0
  730. package/src/resources/extensions/gsd/commands/handlers/auto.ts +1 -1
  731. package/src/resources/extensions/gsd/commands/handlers/core.ts +70 -3
  732. package/src/resources/extensions/gsd/commands/handlers/ops.ts +225 -1
  733. package/src/resources/extensions/gsd/commands-cmux.ts +3 -0
  734. package/src/resources/extensions/gsd/commands-context.ts +18 -1
  735. package/src/resources/extensions/gsd/commands-gsd-core.ts +1142 -0
  736. package/src/resources/extensions/gsd/commands-handlers.ts +76 -1
  737. package/src/resources/extensions/gsd/commands-maintenance.ts +98 -2
  738. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +156 -11
  739. package/src/resources/extensions/gsd/commands-usage.ts +1 -1
  740. package/src/resources/extensions/gsd/commands-verdict.ts +16 -15
  741. package/src/resources/extensions/gsd/commands-worktree.ts +25 -12
  742. package/src/resources/extensions/gsd/compat/compat-marker.ts +210 -0
  743. package/src/resources/extensions/gsd/compat/index.ts +12 -0
  744. package/src/resources/extensions/gsd/compat/planning-compat.ts +168 -0
  745. package/src/resources/extensions/gsd/config-overlay.ts +3 -1
  746. package/src/resources/extensions/gsd/consent-question.ts +11 -1
  747. package/src/resources/extensions/gsd/consent-verdict.ts +30 -1
  748. package/src/resources/extensions/gsd/dashboard-overlay.ts +73 -7
  749. package/src/resources/extensions/gsd/db/engine.ts +34 -1
  750. package/src/resources/extensions/gsd/db/queries.ts +197 -0
  751. package/src/resources/extensions/gsd/db/unit-dispatches.ts +24 -0
  752. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +45 -0
  753. package/src/resources/extensions/gsd/db-workspace.ts +76 -3
  754. package/src/resources/extensions/gsd/delegation-policy.ts +1 -1
  755. package/src/resources/extensions/gsd/discussion-handoff.ts +19 -7
  756. package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -4
  757. package/src/resources/extensions/gsd/doctor-engine-checks.ts +486 -7
  758. package/src/resources/extensions/gsd/doctor-git-checks.ts +24 -2
  759. package/src/resources/extensions/gsd/doctor-providers.ts +142 -19
  760. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +5 -15
  761. package/src/resources/extensions/gsd/doctor-types.ts +9 -1
  762. package/src/resources/extensions/gsd/doctor.ts +125 -10
  763. package/src/resources/extensions/gsd/error-classifier.ts +14 -1
  764. package/src/resources/extensions/gsd/escalation.ts +9 -4
  765. package/src/resources/extensions/gsd/exec-sandbox.ts +62 -13
  766. package/src/resources/extensions/gsd/export-html.ts +11 -4
  767. package/src/resources/extensions/gsd/export.ts +88 -1
  768. package/src/resources/extensions/gsd/file-lock.ts +1 -1
  769. package/src/resources/extensions/gsd/flat-phase-migration.ts +325 -0
  770. package/src/resources/extensions/gsd/forensics.ts +4 -34
  771. package/src/resources/extensions/gsd/git-constants.ts +1 -1
  772. package/src/resources/extensions/gsd/git-service.ts +82 -16
  773. package/src/resources/extensions/gsd/gitignore.ts +11 -4
  774. package/src/resources/extensions/gsd/gsd-db.ts +72 -0
  775. package/src/resources/extensions/gsd/guidance.ts +9 -7
  776. package/src/resources/extensions/gsd/guided-flow-queue.ts +89 -4
  777. package/src/resources/extensions/gsd/guided-flow.ts +56 -8
  778. package/src/resources/extensions/gsd/health-widget.ts +69 -32
  779. package/src/resources/extensions/gsd/json-persistence.ts +20 -0
  780. package/src/resources/extensions/gsd/key-manager.ts +1 -0
  781. package/src/resources/extensions/gsd/knowledge-backfill.ts +16 -10
  782. package/src/resources/extensions/gsd/layout-policy.ts +86 -0
  783. package/src/resources/extensions/gsd/markdown-renderer.ts +434 -119
  784. package/src/resources/extensions/gsd/mcp-filter.ts +59 -10
  785. package/src/resources/extensions/gsd/md-importer.ts +215 -65
  786. package/src/resources/extensions/gsd/memory-backfill.ts +26 -20
  787. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +51 -19
  788. package/src/resources/extensions/gsd/metrics.ts +26 -13
  789. package/src/resources/extensions/gsd/migrate/layout-detect.ts +38 -0
  790. package/src/resources/extensions/gsd/migrate/planning-writer.ts +259 -0
  791. package/src/resources/extensions/gsd/migrate-external.ts +78 -12
  792. package/src/resources/extensions/gsd/migration-auto-check.ts +27 -13
  793. package/src/resources/extensions/gsd/milestone-actions.ts +5 -2
  794. package/src/resources/extensions/gsd/milestone-closeout.ts +13 -2
  795. package/src/resources/extensions/gsd/milestone-ids.ts +78 -19
  796. package/src/resources/extensions/gsd/milestone-implementation-evidence.ts +35 -21
  797. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +4 -4
  798. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +8 -0
  799. package/src/resources/extensions/gsd/milestone-validation-verdict.ts +7 -9
  800. package/src/resources/extensions/gsd/model-router.ts +102 -23
  801. package/src/resources/extensions/gsd/notification-store.ts +17 -28
  802. package/src/resources/extensions/gsd/notifications.ts +37 -6
  803. package/src/resources/extensions/gsd/observability-validator.ts +12 -4
  804. package/src/resources/extensions/gsd/orphan-stash-audit.ts +108 -20
  805. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +151 -31
  806. package/src/resources/extensions/gsd/parsers-legacy.ts +42 -15
  807. package/src/resources/extensions/gsd/paths.ts +348 -39
  808. package/src/resources/extensions/gsd/planning-depth.ts +2 -1
  809. package/src/resources/extensions/gsd/post-execution-checks.ts +43 -3
  810. package/src/resources/extensions/gsd/preferences-diagnostics.ts +24 -0
  811. package/src/resources/extensions/gsd/preferences-models.ts +28 -9
  812. package/src/resources/extensions/gsd/preferences-validation.ts +28 -2
  813. package/src/resources/extensions/gsd/preferences.ts +116 -14
  814. package/src/resources/extensions/gsd/prompts/ai-integration-phase.md +28 -0
  815. package/src/resources/extensions/gsd/prompts/audit-fix.md +39 -0
  816. package/src/resources/extensions/gsd/prompts/audit-milestone.md +26 -0
  817. package/src/resources/extensions/gsd/prompts/audit-uat.md +24 -0
  818. package/src/resources/extensions/gsd/prompts/autonomous.md +31 -0
  819. package/src/resources/extensions/gsd/prompts/code-review.md +39 -0
  820. package/src/resources/extensions/gsd/prompts/complete-slice.md +21 -16
  821. package/src/resources/extensions/gsd/prompts/discuss-phase.md +31 -0
  822. package/src/resources/extensions/gsd/prompts/docs-update.md +13 -0
  823. package/src/resources/extensions/gsd/prompts/execute-phase.md +33 -0
  824. package/src/resources/extensions/gsd/prompts/explore.md +58 -0
  825. package/src/resources/extensions/gsd/prompts/graphify.md +27 -0
  826. package/src/resources/extensions/gsd/prompts/health.md +37 -0
  827. package/src/resources/extensions/gsd/prompts/import.md +30 -0
  828. package/src/resources/extensions/gsd/prompts/inbox.md +27 -0
  829. package/src/resources/extensions/gsd/prompts/ingest-docs.md +30 -0
  830. package/src/resources/extensions/gsd/prompts/manager.md +21 -0
  831. package/src/resources/extensions/gsd/prompts/map-codebase.md +42 -0
  832. package/src/resources/extensions/gsd/prompts/milestone-summary.md +27 -0
  833. package/src/resources/extensions/gsd/prompts/mvp-phase.md +23 -0
  834. package/src/resources/extensions/gsd/prompts/pause-work.md +24 -0
  835. package/src/resources/extensions/gsd/prompts/phase.md +22 -0
  836. package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
  837. package/src/resources/extensions/gsd/prompts/plan-phase.md +34 -0
  838. package/src/resources/extensions/gsd/prompts/plan-review-convergence.md +34 -0
  839. package/src/resources/extensions/gsd/prompts/plan-slice.md +5 -3
  840. package/src/resources/extensions/gsd/prompts/profile-user.md +28 -0
  841. package/src/resources/extensions/gsd/prompts/progress.md +30 -0
  842. package/src/resources/extensions/gsd/prompts/resume-work.md +20 -0
  843. package/src/resources/extensions/gsd/prompts/review-backlog.md +21 -0
  844. package/src/resources/extensions/gsd/prompts/review.md +27 -0
  845. package/src/resources/extensions/gsd/prompts/secure-phase.md +24 -0
  846. package/src/resources/extensions/gsd/prompts/settings.md +24 -0
  847. package/src/resources/extensions/gsd/prompts/sketch.md +59 -0
  848. package/src/resources/extensions/gsd/prompts/spec-phase.md +29 -0
  849. package/src/resources/extensions/gsd/prompts/spike.md +59 -0
  850. package/src/resources/extensions/gsd/prompts/stats.md +43 -0
  851. package/src/resources/extensions/gsd/prompts/surface.md +25 -0
  852. package/src/resources/extensions/gsd/prompts/thread.md +24 -0
  853. package/src/resources/extensions/gsd/prompts/ui-phase.md +29 -0
  854. package/src/resources/extensions/gsd/prompts/ui-review.md +29 -0
  855. package/src/resources/extensions/gsd/prompts/ultraplan-phase.md +24 -0
  856. package/src/resources/extensions/gsd/prompts/validate-phase.md +26 -0
  857. package/src/resources/extensions/gsd/prompts/verify-work.md +24 -0
  858. package/src/resources/extensions/gsd/prompts/workspace.md +22 -0
  859. package/src/resources/extensions/gsd/prompts/workstreams.md +24 -0
  860. package/src/resources/extensions/gsd/queue-order.ts +3 -2
  861. package/src/resources/extensions/gsd/quick.ts +43 -2
  862. package/src/resources/extensions/gsd/recovery-classification.ts +7 -0
  863. package/src/resources/extensions/gsd/redact-secrets.ts +40 -0
  864. package/src/resources/extensions/gsd/repo-identity.ts +17 -0
  865. package/src/resources/extensions/gsd/repository-registry.ts +7 -1
  866. package/src/resources/extensions/gsd/roadmap-slices.ts +1 -1
  867. package/src/resources/extensions/gsd/root-write-leak-guard.ts +16 -3
  868. package/src/resources/extensions/gsd/safe-fs.ts +22 -2
  869. package/src/resources/extensions/gsd/safety/content-validator.ts +2 -1
  870. package/src/resources/extensions/gsd/safety/destructive-guard.ts +9 -1
  871. package/src/resources/extensions/gsd/safety/evidence-collector.ts +16 -1
  872. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +45 -1
  873. package/src/resources/extensions/gsd/safety/file-change-validator.ts +8 -2
  874. package/src/resources/extensions/gsd/service-tier.ts +2 -0
  875. package/src/resources/extensions/gsd/session-forensics.ts +11 -1
  876. package/src/resources/extensions/gsd/session-lock.ts +7 -6
  877. package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +10 -9
  878. package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +52 -0
  879. package/src/resources/extensions/gsd/state/derive/cache.ts +46 -0
  880. package/src/resources/extensions/gsd/state/derive/db-open.ts +45 -0
  881. package/src/resources/extensions/gsd/state/derive/from-db.ts +561 -0
  882. package/src/resources/extensions/gsd/state/derive/index.ts +104 -0
  883. package/src/resources/extensions/gsd/state/derive/interrupted-work.ts +31 -0
  884. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +35 -4
  885. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +22 -2
  886. package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +105 -0
  887. package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +180 -0
  888. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +19 -6
  889. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +2 -2
  890. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +176 -30
  891. package/src/resources/extensions/gsd/state-reconciliation/index.ts +86 -27
  892. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +45 -18
  893. package/src/resources/extensions/gsd/state-reconciliation/types.ts +19 -0
  894. package/src/resources/extensions/gsd/state.ts +37 -695
  895. package/src/resources/extensions/gsd/sync-lock.ts +11 -20
  896. package/src/resources/extensions/gsd/tests/__fixtures__/flat-phase/.gsd/phases/01-foundation/01-01-PLAN.md +13 -0
  897. package/src/resources/extensions/gsd/tests/__fixtures__/flat-phase/.gsd/phases/01-foundation/01-ROADMAP.md +8 -0
  898. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/m001-basic/.gsd/milestones/M001/M001-ROADMAP.md +13 -0
  899. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/m001-basic/.gsd/milestones/M001/slices/S01/S01-PLAN.md +5 -0
  900. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/PROJECT.md +1 -0
  901. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/ROADMAP.md +5 -0
  902. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/STATE.md +10 -0
  903. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/phases/01-foundation/01-01-PLAN.md +13 -0
  904. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +4 -3
  905. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +420 -2
  906. package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +14 -5
  907. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +235 -5
  908. package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +50 -1
  909. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +178 -0
  910. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +15 -12
  911. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +36 -0
  912. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +11 -2
  913. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +182 -4
  914. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +43 -1
  915. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +200 -1
  916. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +41 -0
  917. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +30 -0
  918. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +41 -0
  919. package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +4 -4
  920. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +3 -0
  921. package/src/resources/extensions/gsd/tests/auto-timeout-recovery-harness-abort.test.ts +55 -0
  922. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +8 -0
  923. package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +17 -0
  924. package/src/resources/extensions/gsd/tests/batch-task-query.test.ts +85 -0
  925. package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +29 -0
  926. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +377 -8
  927. package/src/resources/extensions/gsd/tests/commands-context.test.ts +26 -0
  928. package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +89 -0
  929. package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +37 -1
  930. package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +31 -30
  931. package/src/resources/extensions/gsd/tests/commands-gsd-core.test.ts +863 -0
  932. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +1 -1
  933. package/src/resources/extensions/gsd/tests/commands-worktree-clean.test.ts +80 -0
  934. package/src/resources/extensions/gsd/tests/compat-health-line.test.ts +102 -0
  935. package/src/resources/extensions/gsd/tests/compat-marker-invalidation.test.ts +51 -0
  936. package/src/resources/extensions/gsd/tests/compat-marker.test.ts +105 -0
  937. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +62 -1
  938. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +28 -0
  939. package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +151 -0
  940. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +18 -7
  941. package/src/resources/extensions/gsd/tests/complete-task-rollback-evidence.test.ts +48 -8
  942. package/src/resources/extensions/gsd/tests/complete-task.test.ts +82 -7
  943. package/src/resources/extensions/gsd/tests/consent-question.test.ts +45 -0
  944. package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +90 -0
  945. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +1 -1
  946. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +58 -3
  947. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +51 -0
  948. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +63 -1
  949. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +49 -5
  950. package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +44 -0
  951. package/src/resources/extensions/gsd/tests/discuss-cold-start-db-open.test.ts +10 -27
  952. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +20 -1
  953. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +102 -0
  954. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +175 -43
  955. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +26 -1
  956. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +7 -0
  957. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +70 -2
  958. package/src/resources/extensions/gsd/tests/doctor-git-checks-autoresolve.test.ts +149 -0
  959. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +245 -1
  960. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +631 -2
  961. package/src/resources/extensions/gsd/tests/doctor-workspace.test.ts +207 -0
  962. package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +17 -10
  963. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +95 -0
  964. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +38 -0
  965. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +16 -0
  966. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +45 -1
  967. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +25 -0
  968. package/src/resources/extensions/gsd/tests/export-memory.test.ts +179 -0
  969. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +53 -0
  970. package/src/resources/extensions/gsd/tests/external-markdown-edit.test.ts +137 -0
  971. package/src/resources/extensions/gsd/tests/external-planning-edit.test.ts +199 -0
  972. package/src/resources/extensions/gsd/tests/fallback-continuation.test.ts +36 -0
  973. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +40 -0
  974. package/src/resources/extensions/gsd/tests/file-lock.test.ts +43 -0
  975. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +186 -0
  976. package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +83 -0
  977. package/src/resources/extensions/gsd/tests/flat-phase-round-trip.test.ts +72 -0
  978. package/src/resources/extensions/gsd/tests/flat-phase-validation-integration.test.ts +120 -0
  979. package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +74 -0
  980. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +87 -19
  981. package/src/resources/extensions/gsd/tests/forensics-error-filter.test.ts +88 -0
  982. package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +89 -0
  983. package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +4 -0
  984. package/src/resources/extensions/gsd/tests/gsd-core-parity-routing.test.ts +183 -0
  985. package/src/resources/extensions/gsd/tests/guidance.test.ts +25 -0
  986. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +42 -0
  987. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +9 -0
  988. package/src/resources/extensions/gsd/tests/health-widget.test.ts +268 -3
  989. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +19 -11
  990. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +6 -2
  991. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +130 -3
  992. package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +55 -0
  993. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +4 -3
  994. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +11 -7
  995. package/src/resources/extensions/gsd/tests/integration/queue-active-milestone-context-budget.test.ts +93 -0
  996. package/src/resources/extensions/gsd/tests/integration/quick-branch-lifecycle.test.ts +56 -9
  997. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
  998. package/src/resources/extensions/gsd/tests/json-persistence-atomic.test.ts +47 -0
  999. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +35 -0
  1000. package/src/resources/extensions/gsd/tests/knowledge-cold-start.test.ts +386 -0
  1001. package/src/resources/extensions/gsd/tests/layout-policy.test.ts +59 -0
  1002. package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +1 -1
  1003. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +336 -82
  1004. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +74 -1
  1005. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +78 -0
  1006. package/src/resources/extensions/gsd/tests/memory-store.test.ts +48 -0
  1007. package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +31 -1
  1008. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +4 -4
  1009. package/src/resources/extensions/gsd/tests/metrics-ledger-cap.test.ts +239 -0
  1010. package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +6 -0
  1011. package/src/resources/extensions/gsd/tests/metrics.test.ts +1 -0
  1012. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +173 -0
  1013. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +70 -0
  1014. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +7 -2
  1015. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +152 -22
  1016. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +1 -1
  1017. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +6 -1
  1018. package/src/resources/extensions/gsd/tests/model-router.test.ts +204 -7
  1019. package/src/resources/extensions/gsd/tests/notification-store.test.ts +23 -0
  1020. package/src/resources/extensions/gsd/tests/notifications.test.ts +33 -0
  1021. package/src/resources/extensions/gsd/tests/observability-validator-boundary.test.ts +194 -0
  1022. package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +47 -1
  1023. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +91 -7
  1024. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +52 -1
  1025. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +91 -0
  1026. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +26 -0
  1027. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +4 -1
  1028. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +2 -2
  1029. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +50 -6
  1030. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +1 -1
  1031. package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +7 -2
  1032. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +7 -2
  1033. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +9 -6
  1034. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +27 -0
  1035. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +161 -27
  1036. package/src/resources/extensions/gsd/tests/plan-task.test.ts +311 -5
  1037. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +19 -0
  1038. package/src/resources/extensions/gsd/tests/planning-layout-detect.test.ts +84 -0
  1039. package/src/resources/extensions/gsd/tests/planning-marker.test.ts +107 -0
  1040. package/src/resources/extensions/gsd/tests/planning-projection-hook.test.ts +123 -0
  1041. package/src/resources/extensions/gsd/tests/planning-round-trip-property.test.ts +164 -0
  1042. package/src/resources/extensions/gsd/tests/planning-writer.test.ts +82 -0
  1043. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +48 -1
  1044. package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +4 -2
  1045. package/src/resources/extensions/gsd/tests/preferences.test.ts +197 -1
  1046. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +196 -1
  1047. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +50 -14
  1048. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +58 -0
  1049. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +23 -6
  1050. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +301 -0
  1051. package/src/resources/extensions/gsd/tests/read-uat-gate-verdict.test.ts +185 -0
  1052. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +22 -13
  1053. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +9 -8
  1054. package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +4 -4
  1055. package/src/resources/extensions/gsd/tests/redact-secrets.test.ts +56 -0
  1056. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +166 -4
  1057. package/src/resources/extensions/gsd/tests/register-hooks-flat-phase-migration.test.ts +73 -0
  1058. package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +378 -0
  1059. package/src/resources/extensions/gsd/tests/replan-handler.test.ts +4 -4
  1060. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +41 -2
  1061. package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +55 -0
  1062. package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +50 -9
  1063. package/src/resources/extensions/gsd/tests/round-trip-property.test.ts +137 -0
  1064. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +15 -3
  1065. package/src/resources/extensions/gsd/tests/schedule-wakeup-tool.test.ts +167 -0
  1066. package/src/resources/extensions/gsd/tests/session-lock-transient-read.test.ts +28 -2
  1067. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +1 -0
  1068. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +7 -1
  1069. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +105 -0
  1070. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -1
  1071. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +329 -57
  1072. package/src/resources/extensions/gsd/tests/status-per-repo.test.ts +94 -0
  1073. package/src/resources/extensions/gsd/tests/stop-backtrack.test.ts +6 -2
  1074. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +85 -0
  1075. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +23 -0
  1076. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +29 -1
  1077. package/src/resources/extensions/gsd/tests/terminal-tool-surface-classification.test.ts +80 -0
  1078. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +35 -0
  1079. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +271 -0
  1080. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +32 -3
  1081. package/src/resources/extensions/gsd/tests/tool-schema-model-fallback.test.ts +64 -0
  1082. package/src/resources/extensions/gsd/tests/tool-search-shim.test.ts +71 -0
  1083. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +26 -7
  1084. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +23 -0
  1085. package/src/resources/extensions/gsd/tests/undo.test.ts +113 -37
  1086. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +212 -11
  1087. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +66 -18
  1088. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +56 -0
  1089. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +30 -0
  1090. package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +87 -0
  1091. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +162 -1
  1092. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +9 -1
  1093. package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +130 -0
  1094. package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +34 -6
  1095. package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +53 -1
  1096. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +69 -4
  1097. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +156 -0
  1098. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +87 -0
  1099. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +27 -0
  1100. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +51 -0
  1101. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +96 -15
  1102. package/src/resources/extensions/gsd/tests/workflow-mcp-preflight.test.ts +134 -0
  1103. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +42 -12
  1104. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +3 -4
  1105. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +278 -14
  1106. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +151 -2
  1107. package/src/resources/extensions/gsd/tests/workspace.test.ts +18 -4
  1108. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +43 -3
  1109. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +4 -4
  1110. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +2 -2
  1111. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +65 -0
  1112. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +39 -18
  1113. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +31 -1
  1114. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +32 -0
  1115. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +4 -1
  1116. package/src/resources/extensions/gsd/tests/write-gate.test.ts +103 -0
  1117. package/src/resources/extensions/gsd/tool-surface-readiness.ts +226 -16
  1118. package/src/resources/extensions/gsd/tools/complete-milestone.ts +7 -9
  1119. package/src/resources/extensions/gsd/tools/complete-slice.ts +14 -11
  1120. package/src/resources/extensions/gsd/tools/complete-task.ts +68 -16
  1121. package/src/resources/extensions/gsd/tools/exec-tool.ts +7 -3
  1122. package/src/resources/extensions/gsd/tools/plan-slice.ts +61 -50
  1123. package/src/resources/extensions/gsd/tools/plan-task.ts +148 -9
  1124. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +9 -10
  1125. package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -13
  1126. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +101 -4
  1127. package/src/resources/extensions/gsd/triage-resolution.ts +14 -7
  1128. package/src/resources/extensions/gsd/undo.ts +55 -15
  1129. package/src/resources/extensions/gsd/unit-context-composer.ts +33 -7
  1130. package/src/resources/extensions/gsd/unit-context-manifest.ts +11 -5
  1131. package/src/resources/extensions/gsd/unit-registry.ts +97 -11
  1132. package/src/resources/extensions/gsd/unit-runtime.ts +42 -0
  1133. package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +101 -6
  1134. package/src/resources/extensions/gsd/validation-block-guard.ts +59 -7
  1135. package/src/resources/extensions/gsd/verification-gate.ts +8 -0
  1136. package/src/resources/extensions/gsd/visualizer-data.ts +55 -0
  1137. package/src/resources/extensions/gsd/visualizer-views.ts +27 -2
  1138. package/src/resources/extensions/gsd/workflow-manifest.ts +141 -7
  1139. package/src/resources/extensions/gsd/workflow-mcp.ts +12 -1
  1140. package/src/resources/extensions/gsd/workflow-projections.ts +44 -18
  1141. package/src/resources/extensions/gsd/workspace-git-preflight.ts +31 -0
  1142. package/src/resources/extensions/gsd/workspace.ts +42 -8
  1143. package/src/resources/extensions/gsd/worktree-command.ts +6 -6
  1144. package/src/resources/extensions/gsd/worktree-health.ts +6 -3
  1145. package/src/resources/extensions/gsd/worktree-lifecycle.ts +135 -11
  1146. package/src/resources/extensions/gsd/worktree-manager.ts +214 -20
  1147. package/src/resources/extensions/gsd/worktree-safety.ts +31 -11
  1148. package/src/resources/extensions/mcp-client/manager.ts +3 -3
  1149. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +0 -1
  1150. package/dist/web/standalone/.next/static/chunks/796.e0bdc932325d7e03.js +0 -10
  1151. package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +0 -1
  1152. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-49f565245e1e4afe.js +0 -1
  1153. package/dist/web/standalone/.next/static/chunks/app/page-a48b7c48333b31c8.js +0 -1
  1154. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +0 -1
  1155. package/dist/web/standalone/.next/static/chunks/webpack-f0285ce91d4ec9ef.js +0 -1
  1156. /package/dist/web/standalone/.next/static/{Mh74c-rhxHjKHKoRwd2ij → L2UMqXELiDH3oz-7yguXp}/_buildManifest.js +0 -0
  1157. /package/dist/web/standalone/.next/static/{Mh74c-rhxHjKHKoRwd2ij → L2UMqXELiDH3oz-7yguXp}/_ssgManifest.js +0 -0
@@ -9,19 +9,24 @@
9
9
  // Critical invariant: rendered markdown must round-trip through
10
10
  // parseRoadmap(), parsePlan(), parseSummary() in files.ts.
11
11
 
12
- import { readFileSync, existsSync, mkdirSync, statSync } from "node:fs";
12
+ import { readFileSync, existsSync, mkdirSync, statSync, unlinkSync } from "node:fs";
13
13
  import { logWarning } from "./workflow-logger.js";
14
14
  import { isClosedStatus } from "./status-guards.js";
15
15
  import { dirname, join, relative } from "node:path";
16
16
  import {
17
17
  getAllMilestones,
18
18
  getMilestone,
19
+ getMilestoneScopedArtifacts,
20
+ getSliceScopedArtifacts,
19
21
  getMilestoneSlices,
20
22
  getSliceTasks,
23
+ getTasksBySliceIds,
21
24
  getTask,
22
25
  getSlice,
23
26
  insertArtifact,
27
+ deleteArtifactByPath,
24
28
  getGateResults,
29
+ isDbAvailable,
25
30
  } from "./gsd-db.js";
26
31
  import type { MilestoneRow, ArtifactRow } from "./db-milestone-artifact-rows.js";
27
32
  import type { SliceRow, TaskRow } from "./db-task-slice-rows.js";
@@ -31,6 +36,8 @@ import {
31
36
  resolveFile,
32
37
  resolveSliceFile,
33
38
  resolveSlicePath,
39
+ resolveTaskFile,
40
+ resolveTasksDir,
34
41
  gsdProjectionRoot,
35
42
  gsdRoot,
36
43
  buildMilestoneFileName,
@@ -40,8 +47,60 @@ import {
40
47
  import { saveFile, clearParseCache, registerCacheClearCallback } from "./files.js";
41
48
  import { parseRoadmap, parsePlan } from "./parsers-legacy.js";
42
49
  import { invalidateStateCache } from "./state.js";
43
- import { clearPathCache } from "./paths.js";
50
+ import { clearPathCache, milestonesDir, legacyMilestonesDir, isLegacyMilestonesLayout, resolveMilestonePath, relSliceFile, canonicalPhaseDirName } from "./paths.js";
51
+ import { readCompatMarker, writeCompatMarker, computeProjectionSha } from "./compat/compat-marker.js";
44
52
  import type { RiskLevel } from "./types.js";
53
+ import {
54
+ phaseDirName,
55
+ planFileName,
56
+ milestoneIdToPhaseNum,
57
+ sliceIdToPlanNum,
58
+ derivePhaseSlug,
59
+ } from "./layout-policy.js";
60
+
61
+ // ─── Compat marker invalidation ───────────────────────────────────────────
62
+ // Every successful projection write pushes its (basePath, projectionPath,
63
+ // entities) here; invalidateCaches() drains it and refreshes .gsd/.compat.json
64
+ // so the next reconcile pass sees gsd-pi's own writes as expected. This is the
65
+ // feedback-loop-prevention mechanism for cross-tool compatibility.
66
+ const _pendingProjectionWrites: Array<{ basePath: string; projectionPath: string; entities: string[] }> = [];
67
+
68
+ function recordProjectionWrite(basePath: string, projectionPath: string, entities: string[]): void {
69
+ _pendingProjectionWrites.push({ basePath, projectionPath, entities });
70
+ }
71
+
72
+ function flushProjectionWritesToMarker(): void {
73
+ if (_pendingProjectionWrites.length === 0) return;
74
+ // Group by basePath (defensive — multiple projects are unusual but possible).
75
+ const byBase = new Map<string, Map<string, string[]>>();
76
+ for (const w of _pendingProjectionWrites) {
77
+ let bucket = byBase.get(w.basePath);
78
+ if (!bucket) { bucket = new Map(); byBase.set(w.basePath, bucket); }
79
+ bucket.set(w.projectionPath, w.entities);
80
+ }
81
+ _pendingProjectionWrites.length = 0;
82
+
83
+ for (const [basePath, writes] of byBase) {
84
+ try {
85
+ const marker = readCompatMarker(basePath);
86
+ for (const [projectionPath, entities] of writes) {
87
+ const abs = join(basePath, ".gsd", projectionPath);
88
+ if (existsSync(abs)) {
89
+ marker.projections[projectionPath] = {
90
+ sha: computeProjectionSha(readFileSync(abs, "utf-8")),
91
+ entities,
92
+ };
93
+ }
94
+ }
95
+ marker.lastWriter = "gsd-pi";
96
+ marker.lastProjectedAt = new Date().toISOString();
97
+ writeCompatMarker(basePath, marker);
98
+ } catch (e) {
99
+ // Marker I/O must never break projection. Reconcile will heal on next run.
100
+ logWarning("renderer", `compat marker flush failed: ${(e as Error).message}`);
101
+ }
102
+ }
103
+ }
45
104
 
46
105
  // ─── Helpers ──────────────────────────────────────────────────────────────
47
106
 
@@ -64,6 +123,7 @@ function toArtifactPath(absPath: string, basePath: string): string {
64
123
  * Invalidate all caches after a disk write.
65
124
  */
66
125
  function invalidateCaches(): void {
126
+ flushProjectionWritesToMarker();
67
127
  invalidateStateCache();
68
128
  clearPathCache();
69
129
  clearParseCache();
@@ -77,6 +137,12 @@ function meaningfulSection(value: string | null | undefined): string {
77
137
  return trimmed;
78
138
  }
79
139
 
140
+ function renderGateFindings(gate: GateRow): string {
141
+ const findings = gate.findings.trim() || `- **Verdict:** ${gate.verdict}\n- **Rationale:** ${gate.rationale}`;
142
+ if (gate.verdict !== "flag") return findings;
143
+ return `> **Warning:** Verdict: flag - concerns recorded below\n\n${findings}`;
144
+ }
145
+
80
146
  function pushIndented(lines: string[], value: string, indent = " "): void {
81
147
  for (const line of value.split("\n")) {
82
148
  lines.push(`${indent}${line}`);
@@ -87,7 +153,9 @@ function taskSummaryForSlicePlan(description: string): string {
87
153
  const meaningful = meaningfulSection(description);
88
154
  if (!meaningful) return "";
89
155
 
90
- const beforeHeading = meaningful.split(/\n#{1,6}\s+/)[0]?.trim() ?? "";
156
+ // Strip XML tags (flat-phase <tasks> format) so they don't leak into summaries
157
+ const cleaned = meaningful.replace(/<\/?tasks>/g, "").trim();
158
+ const beforeHeading = cleaned.split(/\n#{1,6}\s+/)[0]?.trim() ?? "";
91
159
  const firstBlock = beforeHeading.split(/\n\s*\n/)[0]?.trim() ?? "";
92
160
  return firstBlock || beforeHeading;
93
161
  }
@@ -109,12 +177,28 @@ function sanitizeInlineRoadmapText(value: string | null | undefined): string {
109
177
  }
110
178
 
111
179
  function resolveRoadmapProjectionPath(basePath: string, milestoneId: string): string {
112
- const projectionMilestonesDir = join(gsdProjectionRoot(basePath), "milestones");
113
- const milestoneDirName = resolveDir(projectionMilestonesDir, milestoneId) ?? milestoneId;
114
- const milestoneDir = join(projectionMilestonesDir, milestoneDirName);
115
- const roadmapFileName = resolveFile(milestoneDir, milestoneId, "ROADMAP") ??
116
- buildMilestoneFileName(milestoneId, "ROADMAP");
117
- return join(milestoneDir, roadmapFileName);
180
+ const phaseNum = milestoneIdToPhaseNum(milestoneId);
181
+ const existing = resolveMilestonePath(basePath, milestoneId);
182
+ const legacyBase = legacyMilestonesDir(basePath);
183
+ const isLegacyLayout = existing
184
+ ? existing.startsWith(legacyBase + "/") || existing.startsWith(legacyBase + "\\")
185
+ : isLegacyMilestonesLayout(basePath);
186
+ const phaseDir = existing ?? join(
187
+ isLegacyLayout ? legacyBase : milestonesDir(basePath),
188
+ isLegacyLayout ? milestoneId : canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title),
189
+ );
190
+ const roadmapFileName = isLegacyLayout
191
+ ? `${milestoneId}-ROADMAP.md`
192
+ : `${String(phaseNum).padStart(2, "0")}-ROADMAP.md`;
193
+ return join(phaseDir, roadmapFileName);
194
+ }
195
+
196
+ function isMilestoneFlatPhaseLayout(basePath: string, milestoneId: string): boolean {
197
+ const existing = resolveMilestonePath(basePath, milestoneId);
198
+ const legacyBase = legacyMilestonesDir(basePath);
199
+ return existing
200
+ ? !(existing.startsWith(legacyBase + "/") || existing.startsWith(legacyBase + "\\"))
201
+ : !isLegacyMilestonesLayout(basePath);
118
202
  }
119
203
 
120
204
  /**
@@ -130,6 +214,7 @@ async function writeAndStore(
130
214
  slice_id?: string;
131
215
  task_id?: string;
132
216
  },
217
+ basePath?: string,
133
218
  ): Promise<void> {
134
219
  await saveFile(absPath, content);
135
220
 
@@ -147,6 +232,17 @@ async function writeAndStore(
147
232
  logWarning("renderer", `failed to update artifact in DB: ${artifactPath}`);
148
233
  }
149
234
 
235
+ // Record the projection write so invalidateCaches() can refresh the compat
236
+ // marker. basePath is optional only to avoid forcing every caller; when
237
+ // present, the marker gets updated. artifactPath is already .gsd/-relative.
238
+ if (basePath) {
239
+ const entities: string[] = [];
240
+ if (opts.milestone_id) entities.push(opts.milestone_id);
241
+ if (opts.milestone_id && opts.slice_id) entities.push(`${opts.milestone_id}/${opts.slice_id}`);
242
+ if (opts.milestone_id && opts.slice_id && opts.task_id) entities.push(`${opts.milestone_id}/${opts.slice_id}/${opts.task_id}`);
243
+ recordProjectionWrite(basePath, artifactPath, entities);
244
+ }
245
+
150
246
  invalidateCaches();
151
247
  }
152
248
 
@@ -267,7 +363,7 @@ function renderTaskPlanMarkdown(task: TaskRow, taskGates: GateRow[] = []): strin
267
363
  if (gate && gate.verdict !== "omitted") {
268
364
  lines.push(`## ${label}`);
269
365
  lines.push("");
270
- lines.push(gate.findings.trim() || `- **Verdict:** ${gate.verdict}\n- **Rationale:** ${gate.rationale}`);
366
+ lines.push(renderGateFindings(gate));
271
367
  lines.push("");
272
368
  }
273
369
  }
@@ -301,7 +397,7 @@ function renderSlicePlanMarkdown(slice: SliceRow, tasks: TaskRow[], gates: GateR
301
397
  if (q3 && q3.verdict !== "omitted") {
302
398
  lines.push("## Threat Surface");
303
399
  lines.push("");
304
- lines.push(q3.findings.trim() || `- **Verdict:** ${q3.verdict}\n- **Rationale:** ${q3.rationale}`);
400
+ lines.push(renderGateFindings(q3));
305
401
  lines.push("");
306
402
  }
307
403
 
@@ -309,7 +405,7 @@ function renderSlicePlanMarkdown(slice: SliceRow, tasks: TaskRow[], gates: GateR
309
405
  if (q4 && q4.verdict !== "omitted") {
310
406
  lines.push("## Requirement Impact");
311
407
  lines.push("");
312
- lines.push(q4.findings.trim() || `- **Verdict:** ${q4.verdict}\n- **Rationale:** ${q4.rationale}`);
408
+ lines.push(renderGateFindings(q4));
313
409
  lines.push("");
314
410
  }
315
411
 
@@ -345,12 +441,14 @@ function renderSlicePlanMarkdown(slice: SliceRow, tasks: TaskRow[], gates: GateR
345
441
  }
346
442
  lines.push("");
347
443
 
348
- lines.push("## Tasks");
349
- lines.push("");
444
+ // Flat-phase: tasks render as a <tasks> XML block (gsd-core native format)
445
+ // instead of a ## Tasks markdown section. This makes the plan file compatible
446
+ // with gsd-core's parseOldPlan which extracts <tasks> blocks.
447
+ lines.push("<tasks>");
350
448
  for (const task of tasks) {
351
449
  const done = isClosedStatus(task.status) ? "x" : " ";
352
- const estimate = task.estimate.trim() ? ` \`est:${task.estimate.trim()}\`` : "";
353
- lines.push(`- [${done}] **${task.id}: ${task.title || task.id}**${estimate}`);
450
+ const estimate = task.estimate.trim() ? ` _(${task.estimate.trim()})_` : "";
451
+ lines.push(`- [${done}] **${task.id}**: ${task.title || task.id}${estimate}`);
354
452
  const summary = taskSummaryForSlicePlan(task.description);
355
453
  if (summary) {
356
454
  pushIndented(lines, summary);
@@ -361,8 +459,9 @@ function renderSlicePlanMarkdown(slice: SliceRow, tasks: TaskRow[], gates: GateR
361
459
  if (task.verify.trim()) {
362
460
  lines.push(` - Verify: ${task.verify.trim()}`);
363
461
  }
364
- lines.push("");
365
462
  }
463
+ lines.push("</tasks>");
464
+ lines.push("");
366
465
 
367
466
  const filesLikelyTouched = Array.from(new Set(tasks.flatMap((task) => task.files)));
368
467
  if (filesLikelyTouched.length > 0) {
@@ -393,14 +492,14 @@ export async function renderPlanFromDb(
393
492
  throw new Error(`no tasks found for ${milestoneId}/${sliceId}`);
394
493
  }
395
494
 
396
- const defaultPlanPath = join(
397
- gsdProjectionRoot(basePath),
398
- "milestones",
399
- milestoneId,
400
- "slices",
401
- sliceId,
402
- `${sliceId}-PLAN.md`,
403
- );
495
+ // Layout-aware path: prefer an existing plan file's location so re-renders
496
+ // stay in place (legacy: milestones/MID/slices/SID/SID-PLAN.md;
497
+ // flat-phase: phases/NN-slug/NN-MM-PLAN.md).
498
+ // Pass the milestone title so the fallback flat-phase dir uses the human-readable
499
+ // slug ("05-milestone-five") rather than the bare ID slug ("05-m005").
500
+ const milestoneTitle = getMilestone(milestoneId)?.title;
501
+ const existingPlanPath = resolveSliceFile(basePath, milestoneId, sliceId, "PLAN");
502
+ const defaultPlanPath = existingPlanPath ?? join(basePath, relSliceFile(basePath, milestoneId, sliceId, "PLAN", milestoneTitle));
404
503
  const absPath = outputPath ?? defaultPlanPath;
405
504
  mkdirSync(dirname(absPath), { recursive: true });
406
505
  const artifactPath = toArtifactPath(absPath, basePath);
@@ -411,13 +510,11 @@ export async function renderPlanFromDb(
411
510
  artifact_type: "PLAN",
412
511
  milestone_id: milestoneId,
413
512
  slice_id: sliceId,
414
- });
513
+ }, basePath);
415
514
 
515
+ // Flat-phase: tasks are checkboxes inside the plan file, not separate files.
516
+ // No per-task render loop — task state is in the <tasks> block above.
416
517
  const taskPlanPaths: string[] = [];
417
- for (const task of tasks) {
418
- const rendered = await renderTaskPlanFromDb(basePath, milestoneId, sliceId, task.id);
419
- taskPlanPaths.push(rendered.taskPlanPath);
420
- }
421
518
 
422
519
  return { planPath: absPath, taskPlanPaths, content };
423
520
  }
@@ -433,9 +530,36 @@ export async function renderTaskPlanFromDb(
433
530
  throw new Error(`task ${milestoneId}/${sliceId}/${taskId} not found`);
434
531
  }
435
532
 
436
- const tasksDir = join(gsdProjectionRoot(basePath), "milestones", milestoneId, "slices", sliceId, "tasks");
437
- mkdirSync(tasksDir, { recursive: true });
438
- const absPath = join(tasksDir, buildTaskFileName(taskId, "PLAN"));
533
+ // Flat-phase: task plans live inside the phase dir, not a tasks/ subdir.
534
+ // This function is legacy — tasks are now checkboxes inside the plan file.
535
+ const existingPlanPath = resolveTaskFile(basePath, milestoneId, sliceId, taskId, "PLAN");
536
+ let absPath: string;
537
+ if (existingPlanPath) {
538
+ absPath = existingPlanPath;
539
+ } else {
540
+ const slicePath = resolveSlicePath(basePath, milestoneId, sliceId);
541
+ if (slicePath) {
542
+ const tasksDir = resolveTasksDir(basePath, milestoneId, sliceId) ?? slicePath;
543
+ mkdirSync(tasksDir, { recursive: true });
544
+ absPath = join(tasksDir, buildTaskFileName(taskId, "PLAN"));
545
+ } else {
546
+ const existing = resolveMilestonePath(basePath, milestoneId);
547
+ const legacyBase = legacyMilestonesDir(basePath);
548
+ const isLegacyLayout = existing
549
+ ? existing.startsWith(legacyBase + "/") || existing.startsWith(legacyBase + "\\")
550
+ : isLegacyMilestonesLayout(basePath);
551
+ const phaseDir = existing ?? join(
552
+ isLegacyLayout ? legacyBase : milestonesDir(basePath),
553
+ isLegacyLayout ? milestoneId : canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title),
554
+ );
555
+ mkdirSync(phaseDir, { recursive: true });
556
+ const tasksDir = isLegacyLayout
557
+ ? join(phaseDir, "slices", sliceId, "tasks")
558
+ : phaseDir;
559
+ mkdirSync(tasksDir, { recursive: true });
560
+ absPath = join(tasksDir, buildTaskFileName(taskId, "PLAN"));
561
+ }
562
+ }
439
563
  const artifactPath = toArtifactPath(absPath, basePath);
440
564
  const taskGates = getGateResults(milestoneId, sliceId, "task").filter(g => g.task_id === taskId);
441
565
  const content = task.full_plan_md.trim() ? task.full_plan_md : renderTaskPlanMarkdown(task, taskGates);
@@ -445,7 +569,7 @@ export async function renderTaskPlanFromDb(
445
569
  milestone_id: milestoneId,
446
570
  slice_id: sliceId,
447
571
  task_id: taskId,
448
- });
572
+ }, basePath);
449
573
 
450
574
  return { taskPlanPath: absPath, content };
451
575
  }
@@ -453,13 +577,43 @@ export async function renderTaskPlanFromDb(
453
577
  export async function renderRoadmapFromDb(
454
578
  basePath: string,
455
579
  milestoneId: string,
456
- ): Promise<{ roadmapPath: string; content: string }> {
580
+ ): Promise<{ roadmapPath: string; content: string } | { skipped: "unplanned-milestone" }> {
457
581
  const milestone = getMilestone(milestoneId);
458
582
  if (!milestone) {
459
583
  throw new Error(`milestone ${milestoneId} not found`);
460
584
  }
461
585
 
462
586
  const slices = getMilestoneSlices(milestoneId);
587
+
588
+ // Refuse to render a stub ROADMAP for an unplanned milestone (#852).
589
+ // A milestone row created by gsd_milestone_generate_id / ensureMilestoneDbRow
590
+ // starts with title="" / vision="" and zero slices. Rendering that produces a
591
+ // 38-byte stub (`# M015: M015\n\n**Vision:** \n\n## Slices`) which passes
592
+ // existsSync but fails the plan-milestone "zero slices" content check —
593
+ // trapping auto-mode in a finalize-retry loop. A real plan (written by
594
+ // gsd_plan_milestone via writePlanRows) always sets a non-empty vision AND at
595
+ // least one slice, so zero-slice + empty-vision is a reliable "never planned"
596
+ // signal. Skip the write so verification sees a genuinely missing file (a
597
+ // clear "write the ROADMAP" failure) instead of a misleading stub.
598
+ if (slices.length === 0 && !milestone.vision.trim()) {
599
+ logWarning(
600
+ "projection",
601
+ `renderRoadmapFromDb skipped unplanned milestone ${milestoneId} (zero slices, empty vision) — refusing to write a stub ROADMAP`,
602
+ );
603
+ const absPath = resolveRoadmapProjectionPath(basePath, milestoneId);
604
+ if (existsSync(absPath)) {
605
+ const artifactPath = toArtifactPath(absPath, basePath);
606
+ unlinkSync(absPath);
607
+ try {
608
+ deleteArtifactByPath(artifactPath);
609
+ } catch {
610
+ logWarning("renderer", `failed to remove artifact from DB: ${artifactPath}`);
611
+ }
612
+ invalidateCaches();
613
+ }
614
+ return { skipped: "unplanned-milestone" };
615
+ }
616
+
463
617
  const absPath = resolveRoadmapProjectionPath(basePath, milestoneId);
464
618
  const artifactPath = toArtifactPath(absPath, basePath);
465
619
  const content = renderRoadmapMarkdown(milestone, slices);
@@ -467,7 +621,7 @@ export async function renderRoadmapFromDb(
467
621
  await writeAndStore(absPath, artifactPath, content, {
468
622
  artifact_type: "ROADMAP",
469
623
  milestone_id: milestoneId,
470
- });
624
+ }, basePath);
471
625
 
472
626
  return { roadmapPath: absPath, content };
473
627
  }
@@ -485,16 +639,88 @@ export async function renderRoadmapCheckboxes(
485
639
  basePath: string,
486
640
  milestoneId: string,
487
641
  ): Promise<boolean> {
488
- const slices = getMilestoneSlices(milestoneId);
489
- if (slices.length === 0) {
490
- process.stderr.write(
491
- `markdown-renderer: no slices found for milestone ${milestoneId}\n`,
642
+ const rendered = await renderRoadmapFromDb(basePath, milestoneId);
643
+ return !("skipped" in rendered);
644
+ }
645
+
646
+ /**
647
+ * Project milestone-level artifacts (CONTEXT, RESEARCH, VALIDATION, etc.) from
648
+ * the artifacts table into the flat-phase phase directory. ROADMAP is skipped
649
+ * because renderRoadmapFromDb regenerates it from hierarchy rows.
650
+ */
651
+ export async function renderMilestoneArtifactsFromDb(
652
+ basePath: string,
653
+ milestoneId: string,
654
+ ): Promise<boolean> {
655
+ const artifacts = getMilestoneScopedArtifacts(milestoneId);
656
+ if (artifacts.length === 0) return false;
657
+
658
+ const phaseDir = resolveMilestonePath(basePath, milestoneId) ??
659
+ join(
660
+ milestonesDir(basePath),
661
+ canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title),
492
662
  );
493
- return false;
663
+ mkdirSync(phaseDir, { recursive: true });
664
+
665
+ const legacyBase = legacyMilestonesDir(basePath);
666
+ const isLegacy = phaseDir.startsWith(legacyBase + "/") || phaseDir.startsWith(legacyBase + "\\");
667
+
668
+ let wrote = false;
669
+ for (const artifact of artifacts) {
670
+ if (artifact.artifact_type === "ROADMAP") continue;
671
+ if (!artifact.full_content.trim()) continue;
672
+
673
+ const fileName = isLegacy
674
+ ? `${milestoneId}-${artifact.artifact_type}.md`
675
+ : buildMilestoneFileName(milestoneId, artifact.artifact_type);
676
+ const absPath = join(phaseDir, fileName);
677
+ const artifactPath = toArtifactPath(absPath, basePath);
678
+ await writeAndStore(absPath, artifactPath, artifact.full_content, {
679
+ artifact_type: artifact.artifact_type,
680
+ milestone_id: milestoneId,
681
+ });
682
+ wrote = true;
494
683
  }
495
684
 
496
- await renderRoadmapFromDb(basePath, milestoneId);
497
- return true;
685
+ return wrote;
686
+ }
687
+
688
+ /**
689
+ * Slice-scoped artifacts (CONTEXT, RESEARCH, CONTINUE, etc.) must survive
690
+ * layout migration. PLAN is normally regenerated from task rows, but a real
691
+ * imported PLAN can still be replayed as a fallback; known recovery stubs are
692
+ * treated as missing.
693
+ */
694
+ export async function renderSliceArtifactsFromDb(
695
+ basePath: string,
696
+ milestoneId: string,
697
+ sliceId: string,
698
+ ): Promise<boolean> {
699
+ const artifacts = getSliceScopedArtifacts(milestoneId, sliceId);
700
+ if (artifacts.length === 0) return false;
701
+
702
+ let wrote = false;
703
+ for (const artifact of artifacts) {
704
+ const artifactType = artifact.artifact_type.toUpperCase();
705
+ if (!artifact.full_content.trim()) continue;
706
+ if (artifactType === "PLAN" && isAutoRecoveryPlaceholderPlan(artifact.full_content)) continue;
707
+
708
+ const absPath = join(basePath, relSliceFile(basePath, milestoneId, sliceId, artifactType));
709
+ mkdirSync(dirname(absPath), { recursive: true });
710
+ const artifactPath = toArtifactPath(absPath, basePath);
711
+ await writeAndStore(absPath, artifactPath, artifact.full_content, {
712
+ artifact_type: artifactType,
713
+ milestone_id: milestoneId,
714
+ slice_id: sliceId,
715
+ }, basePath);
716
+ wrote = true;
717
+ }
718
+
719
+ return wrote;
720
+ }
721
+
722
+ function isAutoRecoveryPlaceholderPlan(content: string): boolean {
723
+ return /(?:^|\n)\s*#\s*BLOCKER\b/i.test(content) && /auto-mode recovery failed/i.test(content);
498
724
  }
499
725
 
500
726
  // ─── Plan Checkbox Rendering ──────────────────────────────────────────────
@@ -511,7 +737,8 @@ export async function renderRoadmapCheckboxes(
511
737
  * projection (the 4S/0T-vs-5S/13T drift class). The artifacts table is an
512
738
  * output sink, never a render input.
513
739
  *
514
- * @returns true if the plan was written, false on skip/error
740
+ * @returns true if the plan was written, false when the DB slice has no tasks
741
+ * @throws when the DB connection is unavailable or the render write fails
515
742
  */
516
743
  export async function renderPlanCheckboxes(
517
744
  basePath: string,
@@ -521,6 +748,9 @@ export async function renderPlanCheckboxes(
521
748
  ): Promise<boolean> {
522
749
  const tasks = getSliceTasks(milestoneId, sliceId);
523
750
  if (tasks.length === 0) {
751
+ if (!isDbAvailable()) {
752
+ throw new Error(`database unavailable while rendering plan checkboxes for ${milestoneId}/${sliceId}`);
753
+ }
524
754
  process.stderr.write(
525
755
  `markdown-renderer: no tasks found for ${milestoneId}/${sliceId}\n`,
526
756
  );
@@ -559,7 +789,9 @@ export async function renderTaskSummary(
559
789
  return false;
560
790
  }
561
791
 
562
- const tasksDir = join(slicePath, "tasks");
792
+ // Use the tasks/ subdir when it exists (legacy layout), otherwise use the
793
+ // slice path directly (flat-phase: task summaries live alongside plan files).
794
+ const tasksDir = resolveTasksDir(basePath, milestoneId, sliceId) ?? slicePath;
563
795
  const fileName = buildTaskFileName(taskId, "SUMMARY");
564
796
  const absPath = join(tasksDir, fileName);
565
797
  const artifactPath = toArtifactPath(absPath, basePath);
@@ -569,7 +801,7 @@ export async function renderTaskSummary(
569
801
  milestone_id: milestoneId,
570
802
  slice_id: sliceId,
571
803
  task_id: taskId,
572
- });
804
+ }, basePath);
573
805
 
574
806
  return true;
575
807
  }
@@ -592,19 +824,21 @@ export async function renderSliceSummary(
592
824
  return false; // No slice data — skip silently
593
825
  }
594
826
 
595
- const slicePath = resolveSlicePath(basePath, milestoneId, sliceId);
827
+ // Flat-phase: resolve or create the phase dir, since resolveSlicePath only
828
+ // finds existing dirs. In flat-phase the slice "path" is the phase dir.
829
+ let slicePath = resolveSlicePath(basePath, milestoneId, sliceId);
596
830
  if (!slicePath) {
597
- process.stderr.write(
598
- `markdown-renderer: cannot resolve slice path for ${milestoneId}/${sliceId}\n`,
599
- );
600
- return false;
831
+ const mDir = milestonesDir(basePath);
832
+ const dirName = canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title);
833
+ slicePath = join(mDir, dirName);
834
+ mkdirSync(slicePath, { recursive: true });
601
835
  }
602
836
 
603
837
  let wrote = false;
604
838
 
605
- // Write SUMMARY
839
+ // Write SUMMARY — flat-phase: NN-MM-SUMMARY.md inside phase dir
606
840
  if (slice.full_summary_md) {
607
- const summaryName = buildSliceFileName(sliceId, "SUMMARY");
841
+ const summaryName = planFileName(milestoneIdToPhaseNum(milestoneId), sliceIdToPlanNum(sliceId), "SUMMARY");
608
842
  const summaryAbs = join(slicePath, summaryName);
609
843
  const summaryArtifact = toArtifactPath(summaryAbs, basePath);
610
844
 
@@ -612,13 +846,13 @@ export async function renderSliceSummary(
612
846
  artifact_type: "SUMMARY",
613
847
  milestone_id: milestoneId,
614
848
  slice_id: sliceId,
615
- });
849
+ }, basePath);
616
850
  wrote = true;
617
851
  }
618
852
 
619
- // Write UAT
853
+ // Write UAT — flat-phase: NN-MM-UAT.md inside phase dir
620
854
  if (slice.full_uat_md) {
621
- const uatName = buildSliceFileName(sliceId, "UAT");
855
+ const uatName = planFileName(milestoneIdToPhaseNum(milestoneId), sliceIdToPlanNum(sliceId), "UAT");
622
856
  const uatAbs = join(slicePath, uatName);
623
857
  const uatArtifact = toArtifactPath(uatAbs, basePath);
624
858
 
@@ -626,7 +860,7 @@ export async function renderSliceSummary(
626
860
  artifact_type: "UAT",
627
861
  milestone_id: milestoneId,
628
862
  slice_id: sliceId,
629
- });
863
+ }, basePath);
630
864
  wrote = true;
631
865
  }
632
866
 
@@ -649,6 +883,17 @@ export async function renderAllFromDb(basePath: string): Promise<RenderAllResult
649
883
  const result: RenderAllResult = { rendered: 0, skipped: 0, errors: [] };
650
884
  const milestones = getAllMilestones();
651
885
 
886
+ // Pre-fetch slices once per milestone and batch-load all tasks in one query
887
+ // family, avoiding an N+1 (previously one task query per slice).
888
+ const slicesByMilestone = new Map<string, SliceRow[]>();
889
+ const slicePairs: Array<{ milestoneId: string; sliceId: string }> = [];
890
+ for (const milestone of milestones) {
891
+ const slices = getMilestoneSlices(milestone.id);
892
+ slicesByMilestone.set(milestone.id, slices);
893
+ for (const slice of slices) slicePairs.push({ milestoneId: milestone.id, sliceId: slice.id });
894
+ }
895
+ const tasksBySlice = getTasksBySliceIds(slicePairs);
896
+
652
897
  for (const milestone of milestones) {
653
898
  // Render roadmap checkboxes
654
899
  try {
@@ -659,9 +904,29 @@ export async function renderAllFromDb(basePath: string): Promise<RenderAllResult
659
904
  result.errors.push(`roadmap ${milestone.id}: ${(err as Error).message}`);
660
905
  }
661
906
 
662
- // Iterate slices
663
- const slices = getMilestoneSlices(milestone.id);
907
+ try {
908
+ const ok = await renderMilestoneArtifactsFromDb(basePath, milestone.id);
909
+ if (ok) result.rendered++;
910
+ else result.skipped++;
911
+ } catch (err) {
912
+ result.errors.push(`milestone artifacts ${milestone.id}: ${(err as Error).message}`);
913
+ }
914
+
915
+ // Iterate slices (pre-fetched above)
916
+ const slices = slicesByMilestone.get(milestone.id) ?? [];
664
917
  for (const slice of slices) {
918
+ // Preserve slice-scoped artifacts imported from disk, including real PLAN
919
+ // fallback content when task rows cannot regenerate it.
920
+ try {
921
+ const ok = await renderSliceArtifactsFromDb(basePath, milestone.id, slice.id);
922
+ if (ok) result.rendered++;
923
+ else result.skipped++;
924
+ } catch (err) {
925
+ result.errors.push(
926
+ `slice artifacts ${milestone.id}/${slice.id}: ${(err as Error).message}`,
927
+ );
928
+ }
929
+
665
930
  // Render plan checkboxes
666
931
  try {
667
932
  const ok = await renderPlanCheckboxes(basePath, milestone.id, slice.id);
@@ -684,8 +949,8 @@ export async function renderAllFromDb(basePath: string): Promise<RenderAllResult
684
949
  );
685
950
  }
686
951
 
687
- // Iterate tasks
688
- const tasks = getSliceTasks(milestone.id, slice.id);
952
+ // Iterate tasks (batched above)
953
+ const tasks = tasksBySlice.get(`${milestone.id}\0${slice.id}`) ?? [];
689
954
  for (const task of tasks) {
690
955
  try {
691
956
  const ok = await renderTaskSummary(
@@ -717,6 +982,25 @@ export async function renderAllFromDb(basePath: string): Promise<RenderAllResult
717
982
  result.errors.push(`decisions: ${(err as Error).message}`);
718
983
  }
719
984
 
985
+ // Project to .planning/ if the compat marker says it's active. Dynamic
986
+ // import for writePlanningDirectory avoids a static-import cycle. Gated on
987
+ // planning.active so the double-write cost only hits projects that use
988
+ // .planning/. writePlanningDirectory records per-file SHAs via
989
+ // applyPlanningProjectionWrites so the reconcile detector has a baseline.
990
+ // capturePlanningCompatIfNeeded seeds the layout and SHAs on first encounter.
991
+ try {
992
+ const { capturePlanningCompatIfNeeded } = await import("./compat/planning-compat.js");
993
+ await capturePlanningCompatIfNeeded(basePath);
994
+ const marker = readCompatMarker(basePath);
995
+ if (marker.planning?.active && marker.planning.layout) {
996
+ const { writePlanningDirectory } = await import("./migrate/planning-writer.js");
997
+ await writePlanningDirectory(basePath, marker.planning.layout);
998
+ result.rendered++;
999
+ }
1000
+ } catch (err) {
1001
+ result.errors.push(`planning projection: ${(err as Error).message}`);
1002
+ }
1003
+
720
1004
  return result;
721
1005
  }
722
1006
 
@@ -733,7 +1017,7 @@ export interface StaleEntry {
733
1017
  * Checks:
734
1018
  * 1. Roadmap checkbox states vs DB slice statuses
735
1019
  * 2. Plan checkbox states vs DB task statuses
736
- * 3. Missing SUMMARY.md files for complete tasks with full_summary_md
1020
+ * 3. Missing SUMMARY.md files for complete tasks with full_summary_md (legacy only)
737
1021
  * 4. Missing SUMMARY.md/UAT.md files for complete slices with content
738
1022
  *
739
1023
  * Returns a list of stale entries with file path and reason.
@@ -769,7 +1053,18 @@ function parseProjectionByIdentity(path: string, parse: (content: string) => unk
769
1053
  }
770
1054
 
771
1055
  export function detectStaleRenders(basePath: string): StaleEntry[] {
772
- // parseRoadmap/parsePlan are statically imported (#442 Phase 1.4): the
1056
+ // TODO(flat-phase): stale-render detection is temporarily fully disabled.
1057
+ // The isLegacyMilestonesLayout gate is unreliable: git-service.ts creates
1058
+ // milestones/<mid>/ directories for integration-branch metadata even in
1059
+ // flat-phase projects, making the gate fire true and then producing false
1060
+ // stale-render drift in the second reconcile cycle → ReconciliationFailedError
1061
+ // → auto-mode blocked (exit 10) for multi-slice/remediation e2e scenarios.
1062
+ // Re-enable after path construction is unified and the metadata dir is
1063
+ // decoupled from the layout-detection signal.
1064
+ return [];
1065
+ }
1066
+
1067
+ function detectStaleRendersImpl(basePath: string): StaleEntry[] {
773
1068
  // per-call createRequire("./parsers-legacy") that used to live here ran on
774
1069
  // every dispatch. The static `./parsers-legacy.js` specifier resolves in
775
1070
  // both packaged (.js) and source (.ts via the strip-types loader) contexts —
@@ -779,8 +1074,12 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
779
1074
 
780
1075
  for (const milestone of milestones) {
781
1076
  const slices = getMilestoneSlices(milestone.id);
1077
+ const isFlatPhase = isMilestoneFlatPhaseLayout(basePath, milestone.id);
782
1078
 
783
1079
  // ── Check roadmap checkbox state ──────────────────────────────────
1080
+ // TODO(flat-phase): roadmap checkbox parsing may not match flat-phase
1081
+ // roadmap format, causing false-positive drift loops. Skip during transition.
1082
+ /*
784
1083
  const roadmapPath = resolveRoadmapProjectionPath(basePath, milestone.id);
785
1084
  if (existsSync(roadmapPath)) {
786
1085
  try {
@@ -791,12 +1090,12 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
791
1090
  const roadmapSlice = parsed.slices.find((s: { id: string }) => s.id === slice.id);
792
1091
  if (!roadmapSlice) continue;
793
1092
 
794
- if (isCompleteInDb && !roadmapSlice.done) {
1093
+ if (isCompleteInDb && !roadmapSlice!.done) {
795
1094
  stale.push({
796
1095
  path: roadmapPath,
797
1096
  reason: `${slice.id} is closed in DB but unchecked in roadmap`,
798
1097
  });
799
- } else if (!isCompleteInDb && roadmapSlice.done) {
1098
+ } else if (!isCompleteInDb && roadmapSlice!.done) {
800
1099
  stale.push({
801
1100
  path: roadmapPath,
802
1101
  reason: `${slice.id} is not closed in DB but checked in roadmap`,
@@ -807,62 +1106,67 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
807
1106
  logWarning("renderer", `roadmap parse failed: ${(e as Error).message}`);
808
1107
  }
809
1108
  }
1109
+ */
810
1110
 
811
1111
  // ── Check plan checkbox state and summaries for each slice ────────
812
1112
  for (const slice of slices) {
813
1113
  const tasks = getSliceTasks(milestone.id, slice.id);
814
1114
 
815
- // Check plan checkboxes
816
- const planPath = resolveSliceFile(basePath, milestone.id, slice.id, "PLAN");
817
- if (planPath && existsSync(planPath)) {
818
- try {
819
- const parsed = parseProjectionByIdentity(planPath, parsePlan) as ReturnType<typeof parsePlan>;
820
-
821
- for (const task of tasks) {
822
- const isDoneInDb = isClosedStatus(task.status);
823
- const planTask = parsed.tasks.find((t: { id: string }) => t.id === task.id);
824
- if (!planTask) {
825
- // DB has a task the plan markdown lacks: the projection is
826
- // lossy (e.g. tasks added after the PLAN artifact was first
827
- // written). Flag it so the plan is re-rendered from DB rows.
828
- stale.push({
829
- path: planPath,
830
- reason: `${task.id} exists in DB but is missing in plan`,
831
- });
832
- continue;
833
- }
834
-
835
- if (isDoneInDb && !planTask.done) {
836
- stale.push({
837
- path: planPath,
838
- reason: `${task.id} is done in DB but unchecked in plan`,
839
- });
840
- } else if (!isDoneInDb && planTask.done) {
841
- stale.push({
842
- path: planPath,
843
- reason: `${task.id} is not done in DB but checked in plan`,
844
- });
1115
+ if (!isFlatPhase) {
1116
+ // Check plan checkboxes
1117
+ const planPath = resolveSliceFile(basePath, milestone.id, slice.id, "PLAN");
1118
+ if (planPath && existsSync(planPath!)) {
1119
+ try {
1120
+ const parsed = parseProjectionByIdentity(planPath!, parsePlan) as ReturnType<typeof parsePlan>;
1121
+
1122
+ for (const task of tasks) {
1123
+ const isDoneInDb = isClosedStatus(task.status);
1124
+ const planTask = parsed.tasks.find((t: { id: string }) => t.id === task.id);
1125
+ if (!planTask) {
1126
+ // DB has a task the plan markdown lacks: the projection is
1127
+ // lossy (e.g. tasks added after the PLAN artifact was first
1128
+ // written). Flag it so the plan is re-rendered from DB rows.
1129
+ stale.push({
1130
+ path: planPath!,
1131
+ reason: `${task.id} exists in DB but is missing in plan`,
1132
+ });
1133
+ continue;
1134
+ }
1135
+
1136
+ if (isDoneInDb && !planTask!.done) {
1137
+ stale.push({
1138
+ path: planPath!,
1139
+ reason: `${task.id} is done in DB but unchecked in plan`,
1140
+ });
1141
+ } else if (!isDoneInDb && planTask!.done) {
1142
+ stale.push({
1143
+ path: planPath!,
1144
+ reason: `${task.id} is not done in DB but checked in plan`,
1145
+ });
1146
+ }
845
1147
  }
1148
+ } catch (e) {
1149
+ logWarning("renderer", `plan parse failed: ${(e as Error).message}`);
846
1150
  }
847
- } catch (e) {
848
- logWarning("renderer", `plan parse failed: ${(e as Error).message}`);
849
1151
  }
850
1152
  }
851
1153
 
852
- // Check missing task summary files
853
- for (const task of tasks) {
854
- if (isClosedStatus(task.status) && task.full_summary_md) {
855
- const slicePath = resolveSlicePath(basePath, milestone.id, slice.id);
856
- if (slicePath) {
857
- const tasksDir = join(slicePath, "tasks");
858
- const fileName = buildTaskFileName(task.id, "SUMMARY");
859
- const summaryAbsPath = join(tasksDir, fileName);
860
-
861
- if (!existsSync(summaryAbsPath)) {
862
- stale.push({
863
- path: summaryAbsPath,
864
- reason: `${task.id} is complete with summary in DB but SUMMARY.md missing on disk`,
865
- });
1154
+ // Check missing task summary files (legacy layout only — flat-phase keeps
1155
+ // task state in plan <tasks> blocks and does not project Txx-SUMMARY.md)
1156
+ if (!isFlatPhase) {
1157
+ for (const task of tasks) {
1158
+ if (isClosedStatus(task.status) && task.full_summary_md) {
1159
+ const slicePath = resolveSlicePath(basePath, milestone.id, slice.id);
1160
+ if (slicePath) {
1161
+ const fileName = buildTaskFileName(task.id, "SUMMARY");
1162
+ const summaryAbsPath = join(slicePath, fileName);
1163
+
1164
+ if (!existsSync(summaryAbsPath)) {
1165
+ stale.push({
1166
+ path: summaryAbsPath,
1167
+ reason: `${task.id} is complete with summary in DB but SUMMARY.md missing on disk`,
1168
+ });
1169
+ }
866
1170
  }
867
1171
  }
868
1172
  }
@@ -871,10 +1175,15 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
871
1175
  // Check missing slice summary/UAT files
872
1176
  const sliceRow = getSlice(milestone.id, slice.id);
873
1177
  if (sliceRow && sliceRow.status === "complete") {
1178
+ // Use the SAME path construction as renderSliceSummary (planFileName format)
1179
+ // so the detector and repair always agree on the file location.
874
1180
  const slicePath = resolveSlicePath(basePath, milestone.id, slice.id);
875
1181
  if (slicePath) {
1182
+ const phaseNum = milestoneIdToPhaseNum(milestone.id);
1183
+ const planNum = sliceIdToPlanNum(slice.id);
1184
+
876
1185
  if (sliceRow.full_summary_md) {
877
- const summaryName = buildSliceFileName(slice.id, "SUMMARY");
1186
+ const summaryName = planFileName(phaseNum, planNum, "SUMMARY");
878
1187
  const summaryAbsPath = join(slicePath, summaryName);
879
1188
  if (!existsSync(summaryAbsPath)) {
880
1189
  stale.push({
@@ -885,7 +1194,7 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
885
1194
  }
886
1195
 
887
1196
  if (sliceRow.full_uat_md) {
888
- const uatName = buildSliceFileName(slice.id, "UAT");
1197
+ const uatName = planFileName(phaseNum, planNum, "UAT");
889
1198
  const uatAbsPath = join(slicePath, uatName);
890
1199
  if (!existsSync(uatAbsPath)) {
891
1200
  stale.push({
@@ -948,9 +1257,12 @@ export async function renderReplanFromDb(
948
1257
  sliceId: string,
949
1258
  replanData: ReplanData,
950
1259
  ): Promise<{ replanPath: string; content: string }> {
1260
+ // Flat-phase: replan file lives in the phase dir
951
1261
  const slicePath = resolveSlicePath(basePath, milestoneId, sliceId)
952
- ?? join(gsdRoot(basePath), "milestones", milestoneId, "slices", sliceId);
953
- const absPath = join(slicePath, `${sliceId}-REPLAN.md`);
1262
+ ?? join(milestonesDir(basePath), canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title));
1263
+ const phaseNum = milestoneIdToPhaseNum(milestoneId);
1264
+ const planNum = sliceIdToPlanNum(sliceId);
1265
+ const absPath = join(slicePath, planFileName(phaseNum, planNum, "REPLAN"));
954
1266
  const artifactPath = toArtifactPath(absPath, basePath);
955
1267
 
956
1268
  const lines: string[] = [];
@@ -976,7 +1288,7 @@ export async function renderReplanFromDb(
976
1288
  artifact_type: "REPLAN",
977
1289
  milestone_id: milestoneId,
978
1290
  slice_id: sliceId,
979
- });
1291
+ }, basePath);
980
1292
 
981
1293
  return { replanPath: absPath, content };
982
1294
  }
@@ -987,9 +1299,12 @@ export async function renderAssessmentFromDb(
987
1299
  sliceId: string,
988
1300
  assessmentData: AssessmentData,
989
1301
  ): Promise<{ assessmentPath: string; content: string }> {
1302
+ // Flat-phase: assessment file lives in the phase dir
990
1303
  const slicePath = resolveSlicePath(basePath, milestoneId, sliceId)
991
- ?? join(gsdRoot(basePath), "milestones", milestoneId, "slices", sliceId);
992
- const absPath = join(slicePath, `${sliceId}-ASSESSMENT.md`);
1304
+ ?? join(milestonesDir(basePath), canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title));
1305
+ const phaseNum = milestoneIdToPhaseNum(milestoneId);
1306
+ const planNum = sliceIdToPlanNum(sliceId);
1307
+ const absPath = join(slicePath, planFileName(phaseNum, planNum, "ASSESSMENT"));
993
1308
  const artifactPath = toArtifactPath(absPath, basePath);
994
1309
 
995
1310
  const lines: string[] = [];
@@ -1014,7 +1329,7 @@ export async function renderAssessmentFromDb(
1014
1329
  artifact_type: "ASSESSMENT",
1015
1330
  milestone_id: milestoneId,
1016
1331
  slice_id: sliceId,
1017
- });
1332
+ }, basePath);
1018
1333
 
1019
1334
  return { assessmentPath: absPath, content };
1020
1335
  }