@opengsd/gsd-pi 1.2.0-dev.fbdca60b → 1.3.0-dev.65546769

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