@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
@@ -8,16 +8,63 @@
8
8
  //
9
9
  // Critical invariant: rendered markdown must round-trip through
10
10
  // parseRoadmap(), parsePlan(), parseSummary() in files.ts.
11
- import { readFileSync, existsSync, mkdirSync, statSync } from "node:fs";
11
+ import { readFileSync, existsSync, mkdirSync, statSync, unlinkSync } from "node:fs";
12
12
  import { logWarning } from "./workflow-logger.js";
13
13
  import { isClosedStatus } from "./status-guards.js";
14
14
  import { dirname, join, relative } from "node:path";
15
- import { getAllMilestones, getMilestone, getMilestoneSlices, getSliceTasks, getTask, getSlice, insertArtifact, getGateResults, } from "./gsd-db.js";
16
- import { resolveDir, resolveFile, resolveSliceFile, resolveSlicePath, gsdProjectionRoot, gsdRoot, buildMilestoneFileName, buildTaskFileName, buildSliceFileName, } from "./paths.js";
15
+ import { getAllMilestones, getMilestone, getMilestoneScopedArtifacts, getSliceScopedArtifacts, getMilestoneSlices, getSliceTasks, getTask, getSlice, insertArtifact, deleteArtifactByPath, getGateResults, } from "./gsd-db.js";
16
+ import { resolveSliceFile, resolveSlicePath, resolveTaskFile, resolveTasksDir, gsdProjectionRoot, gsdRoot, buildMilestoneFileName, buildTaskFileName, } from "./paths.js";
17
17
  import { saveFile, clearParseCache, registerCacheClearCallback } from "./files.js";
18
18
  import { parseRoadmap, parsePlan } from "./parsers-legacy.js";
19
19
  import { invalidateStateCache } from "./state.js";
20
- import { clearPathCache } from "./paths.js";
20
+ import { clearPathCache, milestonesDir, legacyMilestonesDir, isLegacyMilestonesLayout, resolveMilestonePath, relSliceFile, canonicalPhaseDirName } from "./paths.js";
21
+ import { readCompatMarker, writeCompatMarker, computeProjectionSha } from "./compat/compat-marker.js";
22
+ import { planFileName, milestoneIdToPhaseNum, sliceIdToPlanNum, } from "./layout-policy.js";
23
+ // ─── Compat marker invalidation ───────────────────────────────────────────
24
+ // Every successful projection write pushes its (basePath, projectionPath,
25
+ // entities) here; invalidateCaches() drains it and refreshes .gsd/.compat.json
26
+ // so the next reconcile pass sees gsd-pi's own writes as expected. This is the
27
+ // feedback-loop-prevention mechanism for cross-tool compatibility.
28
+ const _pendingProjectionWrites = [];
29
+ function recordProjectionWrite(basePath, projectionPath, entities) {
30
+ _pendingProjectionWrites.push({ basePath, projectionPath, entities });
31
+ }
32
+ function flushProjectionWritesToMarker() {
33
+ if (_pendingProjectionWrites.length === 0)
34
+ return;
35
+ // Group by basePath (defensive — multiple projects are unusual but possible).
36
+ const byBase = new Map();
37
+ for (const w of _pendingProjectionWrites) {
38
+ let bucket = byBase.get(w.basePath);
39
+ if (!bucket) {
40
+ bucket = new Map();
41
+ byBase.set(w.basePath, bucket);
42
+ }
43
+ bucket.set(w.projectionPath, w.entities);
44
+ }
45
+ _pendingProjectionWrites.length = 0;
46
+ for (const [basePath, writes] of byBase) {
47
+ try {
48
+ const marker = readCompatMarker(basePath);
49
+ for (const [projectionPath, entities] of writes) {
50
+ const abs = join(basePath, ".gsd", projectionPath);
51
+ if (existsSync(abs)) {
52
+ marker.projections[projectionPath] = {
53
+ sha: computeProjectionSha(readFileSync(abs, "utf-8")),
54
+ entities,
55
+ };
56
+ }
57
+ }
58
+ marker.lastWriter = "gsd-pi";
59
+ marker.lastProjectedAt = new Date().toISOString();
60
+ writeCompatMarker(basePath, marker);
61
+ }
62
+ catch (e) {
63
+ // Marker I/O must never break projection. Reconcile will heal on next run.
64
+ logWarning("renderer", `compat marker flush failed: ${e.message}`);
65
+ }
66
+ }
67
+ }
21
68
  // ─── Helpers ──────────────────────────────────────────────────────────────
22
69
  /**
23
70
  * Convert an absolute file path to a .gsd-relative artifact path.
@@ -37,6 +84,7 @@ function toArtifactPath(absPath, basePath) {
37
84
  * Invalidate all caches after a disk write.
38
85
  */
39
86
  function invalidateCaches() {
87
+ flushProjectionWritesToMarker();
40
88
  invalidateStateCache();
41
89
  clearPathCache();
42
90
  clearParseCache();
@@ -60,7 +108,9 @@ function taskSummaryForSlicePlan(description) {
60
108
  const meaningful = meaningfulSection(description);
61
109
  if (!meaningful)
62
110
  return "";
63
- const beforeHeading = meaningful.split(/\n#{1,6}\s+/)[0]?.trim() ?? "";
111
+ // Strip XML tags (flat-phase <tasks> format) so they don't leak into summaries
112
+ const cleaned = meaningful.replace(/<\/?tasks>/g, "").trim();
113
+ const beforeHeading = cleaned.split(/\n#{1,6}\s+/)[0]?.trim() ?? "";
64
114
  const firstBlock = beforeHeading.split(/\n\s*\n/)[0]?.trim() ?? "";
65
115
  return firstBlock || beforeHeading;
66
116
  }
@@ -79,17 +129,29 @@ function sanitizeInlineRoadmapText(value) {
79
129
  .trim();
80
130
  }
81
131
  function resolveRoadmapProjectionPath(basePath, milestoneId) {
82
- const projectionMilestonesDir = join(gsdProjectionRoot(basePath), "milestones");
83
- const milestoneDirName = resolveDir(projectionMilestonesDir, milestoneId) ?? milestoneId;
84
- const milestoneDir = join(projectionMilestonesDir, milestoneDirName);
85
- const roadmapFileName = resolveFile(milestoneDir, milestoneId, "ROADMAP") ??
86
- buildMilestoneFileName(milestoneId, "ROADMAP");
87
- return join(milestoneDir, roadmapFileName);
132
+ const phaseNum = milestoneIdToPhaseNum(milestoneId);
133
+ const existing = resolveMilestonePath(basePath, milestoneId);
134
+ const legacyBase = legacyMilestonesDir(basePath);
135
+ const isLegacyLayout = existing
136
+ ? existing.startsWith(legacyBase + "/") || existing.startsWith(legacyBase + "\\")
137
+ : isLegacyMilestonesLayout(basePath);
138
+ const phaseDir = existing ?? join(isLegacyLayout ? legacyBase : milestonesDir(basePath), isLegacyLayout ? milestoneId : canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title));
139
+ const roadmapFileName = isLegacyLayout
140
+ ? `${milestoneId}-ROADMAP.md`
141
+ : `${String(phaseNum).padStart(2, "0")}-ROADMAP.md`;
142
+ return join(phaseDir, roadmapFileName);
143
+ }
144
+ function isMilestoneFlatPhaseLayout(basePath, milestoneId) {
145
+ const existing = resolveMilestonePath(basePath, milestoneId);
146
+ const legacyBase = legacyMilestonesDir(basePath);
147
+ return existing
148
+ ? !(existing.startsWith(legacyBase + "/") || existing.startsWith(legacyBase + "\\"))
149
+ : !isLegacyMilestonesLayout(basePath);
88
150
  }
89
151
  /**
90
152
  * Write rendered content to disk and update the artifacts table.
91
153
  */
92
- async function writeAndStore(absPath, artifactPath, content, opts) {
154
+ async function writeAndStore(absPath, artifactPath, content, opts, basePath) {
93
155
  await saveFile(absPath, content);
94
156
  try {
95
157
  insertArtifact({
@@ -105,6 +167,19 @@ async function writeAndStore(absPath, artifactPath, content, opts) {
105
167
  // Non-fatal: file is on disk, DB is best-effort
106
168
  logWarning("renderer", `failed to update artifact in DB: ${artifactPath}`);
107
169
  }
170
+ // Record the projection write so invalidateCaches() can refresh the compat
171
+ // marker. basePath is optional only to avoid forcing every caller; when
172
+ // present, the marker gets updated. artifactPath is already .gsd/-relative.
173
+ if (basePath) {
174
+ const entities = [];
175
+ if (opts.milestone_id)
176
+ entities.push(opts.milestone_id);
177
+ if (opts.milestone_id && opts.slice_id)
178
+ entities.push(`${opts.milestone_id}/${opts.slice_id}`);
179
+ if (opts.milestone_id && opts.slice_id && opts.task_id)
180
+ entities.push(`${opts.milestone_id}/${opts.slice_id}/${opts.task_id}`);
181
+ recordProjectionWrite(basePath, artifactPath, entities);
182
+ }
108
183
  invalidateCaches();
109
184
  }
110
185
  function renderRoadmapMarkdown(milestone, slices) {
@@ -284,12 +359,14 @@ function renderSlicePlanMarkdown(slice, tasks, gates = []) {
284
359
  lines.push("- Run the task and slice verification checks for this slice.");
285
360
  }
286
361
  lines.push("");
287
- lines.push("## Tasks");
288
- lines.push("");
362
+ // Flat-phase: tasks render as a <tasks> XML block (gsd-core native format)
363
+ // instead of a ## Tasks markdown section. This makes the plan file compatible
364
+ // with gsd-core's parseOldPlan which extracts <tasks> blocks.
365
+ lines.push("<tasks>");
289
366
  for (const task of tasks) {
290
367
  const done = isClosedStatus(task.status) ? "x" : " ";
291
- const estimate = task.estimate.trim() ? ` \`est:${task.estimate.trim()}\`` : "";
292
- lines.push(`- [${done}] **${task.id}: ${task.title || task.id}**${estimate}`);
368
+ const estimate = task.estimate.trim() ? ` _(${task.estimate.trim()})_` : "";
369
+ lines.push(`- [${done}] **${task.id}**: ${task.title || task.id}${estimate}`);
293
370
  const summary = taskSummaryForSlicePlan(task.description);
294
371
  if (summary) {
295
372
  pushIndented(lines, summary);
@@ -300,8 +377,9 @@ function renderSlicePlanMarkdown(slice, tasks, gates = []) {
300
377
  if (task.verify.trim()) {
301
378
  lines.push(` - Verify: ${task.verify.trim()}`);
302
379
  }
303
- lines.push("");
304
380
  }
381
+ lines.push("</tasks>");
382
+ lines.push("");
305
383
  const filesLikelyTouched = Array.from(new Set(tasks.flatMap((task) => task.files)));
306
384
  if (filesLikelyTouched.length > 0) {
307
385
  lines.push("## Files Likely Touched");
@@ -322,7 +400,14 @@ export async function renderPlanFromDb(basePath, milestoneId, sliceId, outputPat
322
400
  if (tasks.length === 0) {
323
401
  throw new Error(`no tasks found for ${milestoneId}/${sliceId}`);
324
402
  }
325
- const defaultPlanPath = join(gsdProjectionRoot(basePath), "milestones", milestoneId, "slices", sliceId, `${sliceId}-PLAN.md`);
403
+ // Layout-aware path: prefer an existing plan file's location so re-renders
404
+ // stay in place (legacy: milestones/MID/slices/SID/SID-PLAN.md;
405
+ // flat-phase: phases/NN-slug/NN-MM-PLAN.md).
406
+ // Pass the milestone title so the fallback flat-phase dir uses the human-readable
407
+ // slug ("05-milestone-five") rather than the bare ID slug ("05-m005").
408
+ const milestoneTitle = getMilestone(milestoneId)?.title;
409
+ const existingPlanPath = resolveSliceFile(basePath, milestoneId, sliceId, "PLAN");
410
+ const defaultPlanPath = existingPlanPath ?? join(basePath, relSliceFile(basePath, milestoneId, sliceId, "PLAN", milestoneTitle));
326
411
  const absPath = outputPath ?? defaultPlanPath;
327
412
  mkdirSync(dirname(absPath), { recursive: true });
328
413
  const artifactPath = toArtifactPath(absPath, basePath);
@@ -332,12 +417,10 @@ export async function renderPlanFromDb(basePath, milestoneId, sliceId, outputPat
332
417
  artifact_type: "PLAN",
333
418
  milestone_id: milestoneId,
334
419
  slice_id: sliceId,
335
- });
420
+ }, basePath);
421
+ // Flat-phase: tasks are checkboxes inside the plan file, not separate files.
422
+ // No per-task render loop — task state is in the <tasks> block above.
336
423
  const taskPlanPaths = [];
337
- for (const task of tasks) {
338
- const rendered = await renderTaskPlanFromDb(basePath, milestoneId, sliceId, task.id);
339
- taskPlanPaths.push(rendered.taskPlanPath);
340
- }
341
424
  return { planPath: absPath, taskPlanPaths, content };
342
425
  }
343
426
  export async function renderTaskPlanFromDb(basePath, milestoneId, sliceId, taskId) {
@@ -345,9 +428,35 @@ export async function renderTaskPlanFromDb(basePath, milestoneId, sliceId, taskI
345
428
  if (!task) {
346
429
  throw new Error(`task ${milestoneId}/${sliceId}/${taskId} not found`);
347
430
  }
348
- const tasksDir = join(gsdProjectionRoot(basePath), "milestones", milestoneId, "slices", sliceId, "tasks");
349
- mkdirSync(tasksDir, { recursive: true });
350
- const absPath = join(tasksDir, buildTaskFileName(taskId, "PLAN"));
431
+ // Flat-phase: task plans live inside the phase dir, not a tasks/ subdir.
432
+ // This function is legacy — tasks are now checkboxes inside the plan file.
433
+ const existingPlanPath = resolveTaskFile(basePath, milestoneId, sliceId, taskId, "PLAN");
434
+ let absPath;
435
+ if (existingPlanPath) {
436
+ absPath = existingPlanPath;
437
+ }
438
+ else {
439
+ const slicePath = resolveSlicePath(basePath, milestoneId, sliceId);
440
+ if (slicePath) {
441
+ const tasksDir = resolveTasksDir(basePath, milestoneId, sliceId) ?? slicePath;
442
+ mkdirSync(tasksDir, { recursive: true });
443
+ absPath = join(tasksDir, buildTaskFileName(taskId, "PLAN"));
444
+ }
445
+ else {
446
+ const existing = resolveMilestonePath(basePath, milestoneId);
447
+ const legacyBase = legacyMilestonesDir(basePath);
448
+ const isLegacyLayout = existing
449
+ ? existing.startsWith(legacyBase + "/") || existing.startsWith(legacyBase + "\\")
450
+ : isLegacyMilestonesLayout(basePath);
451
+ const phaseDir = existing ?? join(isLegacyLayout ? legacyBase : milestonesDir(basePath), isLegacyLayout ? milestoneId : canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title));
452
+ mkdirSync(phaseDir, { recursive: true });
453
+ const tasksDir = isLegacyLayout
454
+ ? join(phaseDir, "slices", sliceId, "tasks")
455
+ : phaseDir;
456
+ mkdirSync(tasksDir, { recursive: true });
457
+ absPath = join(tasksDir, buildTaskFileName(taskId, "PLAN"));
458
+ }
459
+ }
351
460
  const artifactPath = toArtifactPath(absPath, basePath);
352
461
  const taskGates = getGateResults(milestoneId, sliceId, "task").filter(g => g.task_id === taskId);
353
462
  const content = task.full_plan_md.trim() ? task.full_plan_md : renderTaskPlanMarkdown(task, taskGates);
@@ -356,7 +465,7 @@ export async function renderTaskPlanFromDb(basePath, milestoneId, sliceId, taskI
356
465
  milestone_id: milestoneId,
357
466
  slice_id: sliceId,
358
467
  task_id: taskId,
359
- });
468
+ }, basePath);
360
469
  return { taskPlanPath: absPath, content };
361
470
  }
362
471
  export async function renderRoadmapFromDb(basePath, milestoneId) {
@@ -365,13 +474,39 @@ export async function renderRoadmapFromDb(basePath, milestoneId) {
365
474
  throw new Error(`milestone ${milestoneId} not found`);
366
475
  }
367
476
  const slices = getMilestoneSlices(milestoneId);
477
+ // Refuse to render a stub ROADMAP for an unplanned milestone (#852).
478
+ // A milestone row created by gsd_milestone_generate_id / ensureMilestoneDbRow
479
+ // starts with title="" / vision="" and zero slices. Rendering that produces a
480
+ // 38-byte stub (`# M015: M015\n\n**Vision:** \n\n## Slices`) which passes
481
+ // existsSync but fails the plan-milestone "zero slices" content check —
482
+ // trapping auto-mode in a finalize-retry loop. A real plan (written by
483
+ // gsd_plan_milestone via writePlanRows) always sets a non-empty vision AND at
484
+ // least one slice, so zero-slice + empty-vision is a reliable "never planned"
485
+ // signal. Skip the write so verification sees a genuinely missing file (a
486
+ // clear "write the ROADMAP" failure) instead of a misleading stub.
487
+ if (slices.length === 0 && !milestone.vision.trim()) {
488
+ logWarning("projection", `renderRoadmapFromDb skipped unplanned milestone ${milestoneId} (zero slices, empty vision) — refusing to write a stub ROADMAP`);
489
+ const absPath = resolveRoadmapProjectionPath(basePath, milestoneId);
490
+ if (existsSync(absPath)) {
491
+ const artifactPath = toArtifactPath(absPath, basePath);
492
+ unlinkSync(absPath);
493
+ try {
494
+ deleteArtifactByPath(artifactPath);
495
+ }
496
+ catch {
497
+ logWarning("renderer", `failed to remove artifact from DB: ${artifactPath}`);
498
+ }
499
+ invalidateCaches();
500
+ }
501
+ return { skipped: "unplanned-milestone" };
502
+ }
368
503
  const absPath = resolveRoadmapProjectionPath(basePath, milestoneId);
369
504
  const artifactPath = toArtifactPath(absPath, basePath);
370
505
  const content = renderRoadmapMarkdown(milestone, slices);
371
506
  await writeAndStore(absPath, artifactPath, content, {
372
507
  artifact_type: "ROADMAP",
373
508
  milestone_id: milestoneId,
374
- });
509
+ }, basePath);
375
510
  return { roadmapPath: absPath, content };
376
511
  }
377
512
  // ─── Roadmap Checkbox Rendering ───────────────────────────────────────────
@@ -391,6 +526,71 @@ export async function renderRoadmapCheckboxes(basePath, milestoneId) {
391
526
  await renderRoadmapFromDb(basePath, milestoneId);
392
527
  return true;
393
528
  }
529
+ /**
530
+ * Project milestone-level artifacts (CONTEXT, RESEARCH, VALIDATION, etc.) from
531
+ * the artifacts table into the flat-phase phase directory. ROADMAP is skipped
532
+ * because renderRoadmapFromDb regenerates it from hierarchy rows.
533
+ */
534
+ export async function renderMilestoneArtifactsFromDb(basePath, milestoneId) {
535
+ const artifacts = getMilestoneScopedArtifacts(milestoneId);
536
+ if (artifacts.length === 0)
537
+ return false;
538
+ const phaseDir = resolveMilestonePath(basePath, milestoneId) ??
539
+ join(milestonesDir(basePath), canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title));
540
+ mkdirSync(phaseDir, { recursive: true });
541
+ const legacyBase = legacyMilestonesDir(basePath);
542
+ const isLegacy = phaseDir.startsWith(legacyBase + "/") || phaseDir.startsWith(legacyBase + "\\");
543
+ let wrote = false;
544
+ for (const artifact of artifacts) {
545
+ if (artifact.artifact_type === "ROADMAP")
546
+ continue;
547
+ if (!artifact.full_content.trim())
548
+ continue;
549
+ const fileName = isLegacy
550
+ ? `${milestoneId}-${artifact.artifact_type}.md`
551
+ : buildMilestoneFileName(milestoneId, artifact.artifact_type);
552
+ const absPath = join(phaseDir, fileName);
553
+ const artifactPath = toArtifactPath(absPath, basePath);
554
+ await writeAndStore(absPath, artifactPath, artifact.full_content, {
555
+ artifact_type: artifact.artifact_type,
556
+ milestone_id: milestoneId,
557
+ });
558
+ wrote = true;
559
+ }
560
+ return wrote;
561
+ }
562
+ /**
563
+ * Slice-scoped artifacts (CONTEXT, RESEARCH, CONTINUE, etc.) must survive
564
+ * layout migration. PLAN is normally regenerated from task rows, but a real
565
+ * imported PLAN can still be replayed as a fallback; known recovery stubs are
566
+ * treated as missing.
567
+ */
568
+ export async function renderSliceArtifactsFromDb(basePath, milestoneId, sliceId) {
569
+ const artifacts = getSliceScopedArtifacts(milestoneId, sliceId);
570
+ if (artifacts.length === 0)
571
+ return false;
572
+ let wrote = false;
573
+ for (const artifact of artifacts) {
574
+ const artifactType = artifact.artifact_type.toUpperCase();
575
+ if (!artifact.full_content.trim())
576
+ continue;
577
+ if (artifactType === "PLAN" && isAutoRecoveryPlaceholderPlan(artifact.full_content))
578
+ continue;
579
+ const absPath = join(basePath, relSliceFile(basePath, milestoneId, sliceId, artifactType));
580
+ mkdirSync(dirname(absPath), { recursive: true });
581
+ const artifactPath = toArtifactPath(absPath, basePath);
582
+ await writeAndStore(absPath, artifactPath, artifact.full_content, {
583
+ artifact_type: artifactType,
584
+ milestone_id: milestoneId,
585
+ slice_id: sliceId,
586
+ }, basePath);
587
+ wrote = true;
588
+ }
589
+ return wrote;
590
+ }
591
+ function isAutoRecoveryPlaceholderPlan(content) {
592
+ return /(?:^|\n)\s*#\s*BLOCKER\b/i.test(content) && /auto-mode recovery failed/i.test(content);
593
+ }
394
594
  // ─── Plan Checkbox Rendering ──────────────────────────────────────────────
395
595
  /**
396
596
  * Render plan checkbox states from DB.
@@ -433,7 +633,9 @@ export async function renderTaskSummary(basePath, milestoneId, sliceId, taskId)
433
633
  process.stderr.write(`markdown-renderer: cannot resolve slice path for ${milestoneId}/${sliceId}\n`);
434
634
  return false;
435
635
  }
436
- const tasksDir = join(slicePath, "tasks");
636
+ // Use the tasks/ subdir when it exists (legacy layout), otherwise use the
637
+ // slice path directly (flat-phase: task summaries live alongside plan files).
638
+ const tasksDir = resolveTasksDir(basePath, milestoneId, sliceId) ?? slicePath;
437
639
  const fileName = buildTaskFileName(taskId, "SUMMARY");
438
640
  const absPath = join(tasksDir, fileName);
439
641
  const artifactPath = toArtifactPath(absPath, basePath);
@@ -442,7 +644,7 @@ export async function renderTaskSummary(basePath, milestoneId, sliceId, taskId)
442
644
  milestone_id: milestoneId,
443
645
  slice_id: sliceId,
444
646
  task_id: taskId,
445
- });
647
+ }, basePath);
446
648
  return true;
447
649
  }
448
650
  // ─── Slice Summary Rendering ──────────────────────────────────────────────
@@ -457,34 +659,38 @@ export async function renderSliceSummary(basePath, milestoneId, sliceId) {
457
659
  if (!slice) {
458
660
  return false; // No slice data — skip silently
459
661
  }
460
- const slicePath = resolveSlicePath(basePath, milestoneId, sliceId);
662
+ // Flat-phase: resolve or create the phase dir, since resolveSlicePath only
663
+ // finds existing dirs. In flat-phase the slice "path" is the phase dir.
664
+ let slicePath = resolveSlicePath(basePath, milestoneId, sliceId);
461
665
  if (!slicePath) {
462
- process.stderr.write(`markdown-renderer: cannot resolve slice path for ${milestoneId}/${sliceId}\n`);
463
- return false;
666
+ const mDir = milestonesDir(basePath);
667
+ const dirName = canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title);
668
+ slicePath = join(mDir, dirName);
669
+ mkdirSync(slicePath, { recursive: true });
464
670
  }
465
671
  let wrote = false;
466
- // Write SUMMARY
672
+ // Write SUMMARY — flat-phase: NN-MM-SUMMARY.md inside phase dir
467
673
  if (slice.full_summary_md) {
468
- const summaryName = buildSliceFileName(sliceId, "SUMMARY");
674
+ const summaryName = planFileName(milestoneIdToPhaseNum(milestoneId), sliceIdToPlanNum(sliceId), "SUMMARY");
469
675
  const summaryAbs = join(slicePath, summaryName);
470
676
  const summaryArtifact = toArtifactPath(summaryAbs, basePath);
471
677
  await writeAndStore(summaryAbs, summaryArtifact, slice.full_summary_md, {
472
678
  artifact_type: "SUMMARY",
473
679
  milestone_id: milestoneId,
474
680
  slice_id: sliceId,
475
- });
681
+ }, basePath);
476
682
  wrote = true;
477
683
  }
478
- // Write UAT
684
+ // Write UAT — flat-phase: NN-MM-UAT.md inside phase dir
479
685
  if (slice.full_uat_md) {
480
- const uatName = buildSliceFileName(sliceId, "UAT");
686
+ const uatName = planFileName(milestoneIdToPhaseNum(milestoneId), sliceIdToPlanNum(sliceId), "UAT");
481
687
  const uatAbs = join(slicePath, uatName);
482
688
  const uatArtifact = toArtifactPath(uatAbs, basePath);
483
689
  await writeAndStore(uatAbs, uatArtifact, slice.full_uat_md, {
484
690
  artifact_type: "UAT",
485
691
  milestone_id: milestoneId,
486
692
  slice_id: sliceId,
487
- });
693
+ }, basePath);
488
694
  wrote = true;
489
695
  }
490
696
  return wrote;
@@ -508,9 +714,31 @@ export async function renderAllFromDb(basePath) {
508
714
  catch (err) {
509
715
  result.errors.push(`roadmap ${milestone.id}: ${err.message}`);
510
716
  }
717
+ try {
718
+ const ok = await renderMilestoneArtifactsFromDb(basePath, milestone.id);
719
+ if (ok)
720
+ result.rendered++;
721
+ else
722
+ result.skipped++;
723
+ }
724
+ catch (err) {
725
+ result.errors.push(`milestone artifacts ${milestone.id}: ${err.message}`);
726
+ }
511
727
  // Iterate slices
512
728
  const slices = getMilestoneSlices(milestone.id);
513
729
  for (const slice of slices) {
730
+ // Preserve slice-scoped artifacts imported from disk, including real PLAN
731
+ // fallback content when task rows cannot regenerate it.
732
+ try {
733
+ const ok = await renderSliceArtifactsFromDb(basePath, milestone.id, slice.id);
734
+ if (ok)
735
+ result.rendered++;
736
+ else
737
+ result.skipped++;
738
+ }
739
+ catch (err) {
740
+ result.errors.push(`slice artifacts ${milestone.id}/${slice.id}: ${err.message}`);
741
+ }
514
742
  // Render plan checkboxes
515
743
  try {
516
744
  const ok = await renderPlanCheckboxes(basePath, milestone.id, slice.id);
@@ -561,6 +789,25 @@ export async function renderAllFromDb(basePath) {
561
789
  catch (err) {
562
790
  result.errors.push(`decisions: ${err.message}`);
563
791
  }
792
+ // Project to .planning/ if the compat marker says it's active. Dynamic
793
+ // import for writePlanningDirectory avoids a static-import cycle. Gated on
794
+ // planning.active so the double-write cost only hits projects that use
795
+ // .planning/. writePlanningDirectory records per-file SHAs via
796
+ // applyPlanningProjectionWrites so the reconcile detector has a baseline.
797
+ // capturePlanningCompatIfNeeded seeds the layout and SHAs on first encounter.
798
+ try {
799
+ const { capturePlanningCompatIfNeeded } = await import("./compat/planning-compat.js");
800
+ await capturePlanningCompatIfNeeded(basePath);
801
+ const marker = readCompatMarker(basePath);
802
+ if (marker.planning?.active && marker.planning.layout) {
803
+ const { writePlanningDirectory } = await import("./migrate/planning-writer.js");
804
+ await writePlanningDirectory(basePath, marker.planning.layout);
805
+ result.rendered++;
806
+ }
807
+ }
808
+ catch (err) {
809
+ result.errors.push(`planning projection: ${err.message}`);
810
+ }
564
811
  return result;
565
812
  }
566
813
  const _projectionParseCache = new Map();
@@ -587,7 +834,17 @@ function parseProjectionByIdentity(path, parse) {
587
834
  return parse(readFileSync(path, "utf-8"));
588
835
  }
589
836
  export function detectStaleRenders(basePath) {
590
- // parseRoadmap/parsePlan are statically imported (#442 Phase 1.4): the
837
+ // TODO(flat-phase): stale-render detection is temporarily fully disabled.
838
+ // The isLegacyMilestonesLayout gate is unreliable: git-service.ts creates
839
+ // milestones/<mid>/ directories for integration-branch metadata even in
840
+ // flat-phase projects, making the gate fire true and then producing false
841
+ // stale-render drift in the second reconcile cycle → ReconciliationFailedError
842
+ // → auto-mode blocked (exit 10) for multi-slice/remediation e2e scenarios.
843
+ // Re-enable after path construction is unified and the metadata dir is
844
+ // decoupled from the layout-detection signal.
845
+ return [];
846
+ }
847
+ function detectStaleRendersImpl(basePath) {
591
848
  // per-call createRequire("./parsers-legacy") that used to live here ran on
592
849
  // every dispatch. The static `./parsers-legacy.js` specifier resolves in
593
850
  // both packaged (.js) and source (.ts via the strip-types loader) contexts —
@@ -596,86 +853,94 @@ export function detectStaleRenders(basePath) {
596
853
  const milestones = getAllMilestones();
597
854
  for (const milestone of milestones) {
598
855
  const slices = getMilestoneSlices(milestone.id);
856
+ const isFlatPhase = isMilestoneFlatPhaseLayout(basePath, milestone.id);
599
857
  // ── Check roadmap checkbox state ──────────────────────────────────
858
+ // TODO(flat-phase): roadmap checkbox parsing may not match flat-phase
859
+ // roadmap format, causing false-positive drift loops. Skip during transition.
860
+ /*
600
861
  const roadmapPath = resolveRoadmapProjectionPath(basePath, milestone.id);
601
862
  if (existsSync(roadmapPath)) {
602
- try {
603
- const parsed = parseProjectionByIdentity(roadmapPath, parseRoadmap);
604
- for (const slice of slices) {
605
- const isCompleteInDb = isClosedStatus(slice.status);
606
- const roadmapSlice = parsed.slices.find((s) => s.id === slice.id);
607
- if (!roadmapSlice)
608
- continue;
609
- if (isCompleteInDb && !roadmapSlice.done) {
610
- stale.push({
611
- path: roadmapPath,
612
- reason: `${slice.id} is closed in DB but unchecked in roadmap`,
613
- });
614
- }
615
- else if (!isCompleteInDb && roadmapSlice.done) {
616
- stale.push({
617
- path: roadmapPath,
618
- reason: `${slice.id} is not closed in DB but checked in roadmap`,
619
- });
620
- }
621
- }
622
- }
623
- catch (e) {
624
- logWarning("renderer", `roadmap parse failed: ${e.message}`);
863
+ try {
864
+ const parsed = parseProjectionByIdentity(roadmapPath, parseRoadmap) as ReturnType<typeof parseRoadmap>;
865
+
866
+ for (const slice of slices) {
867
+ const isCompleteInDb = isClosedStatus(slice.status);
868
+ const roadmapSlice = parsed.slices.find((s: { id: string }) => s.id === slice.id);
869
+ if (!roadmapSlice) continue;
870
+
871
+ if (isCompleteInDb && !roadmapSlice!.done) {
872
+ stale.push({
873
+ path: roadmapPath,
874
+ reason: `${slice.id} is closed in DB but unchecked in roadmap`,
875
+ });
876
+ } else if (!isCompleteInDb && roadmapSlice!.done) {
877
+ stale.push({
878
+ path: roadmapPath,
879
+ reason: `${slice.id} is not closed in DB but checked in roadmap`,
880
+ });
881
+ }
625
882
  }
883
+ } catch (e) {
884
+ logWarning("renderer", `roadmap parse failed: ${(e as Error).message}`);
885
+ }
626
886
  }
887
+ */
627
888
  // ── Check plan checkbox state and summaries for each slice ────────
628
889
  for (const slice of slices) {
629
890
  const tasks = getSliceTasks(milestone.id, slice.id);
630
- // Check plan checkboxes
631
- const planPath = resolveSliceFile(basePath, milestone.id, slice.id, "PLAN");
632
- if (planPath && existsSync(planPath)) {
633
- try {
634
- const parsed = parseProjectionByIdentity(planPath, parsePlan);
635
- for (const task of tasks) {
636
- const isDoneInDb = isClosedStatus(task.status);
637
- const planTask = parsed.tasks.find((t) => t.id === task.id);
638
- if (!planTask) {
639
- // DB has a task the plan markdown lacks: the projection is
640
- // lossy (e.g. tasks added after the PLAN artifact was first
641
- // written). Flag it so the plan is re-rendered from DB rows.
642
- stale.push({
643
- path: planPath,
644
- reason: `${task.id} exists in DB but is missing in plan`,
645
- });
646
- continue;
647
- }
648
- if (isDoneInDb && !planTask.done) {
649
- stale.push({
650
- path: planPath,
651
- reason: `${task.id} is done in DB but unchecked in plan`,
652
- });
653
- }
654
- else if (!isDoneInDb && planTask.done) {
655
- stale.push({
656
- path: planPath,
657
- reason: `${task.id} is not done in DB but checked in plan`,
658
- });
891
+ if (!isFlatPhase) {
892
+ // Check plan checkboxes
893
+ const planPath = resolveSliceFile(basePath, milestone.id, slice.id, "PLAN");
894
+ if (planPath && existsSync(planPath)) {
895
+ try {
896
+ const parsed = parseProjectionByIdentity(planPath, parsePlan);
897
+ for (const task of tasks) {
898
+ const isDoneInDb = isClosedStatus(task.status);
899
+ const planTask = parsed.tasks.find((t) => t.id === task.id);
900
+ if (!planTask) {
901
+ // DB has a task the plan markdown lacks: the projection is
902
+ // lossy (e.g. tasks added after the PLAN artifact was first
903
+ // written). Flag it so the plan is re-rendered from DB rows.
904
+ stale.push({
905
+ path: planPath,
906
+ reason: `${task.id} exists in DB but is missing in plan`,
907
+ });
908
+ continue;
909
+ }
910
+ if (isDoneInDb && !planTask.done) {
911
+ stale.push({
912
+ path: planPath,
913
+ reason: `${task.id} is done in DB but unchecked in plan`,
914
+ });
915
+ }
916
+ else if (!isDoneInDb && planTask.done) {
917
+ stale.push({
918
+ path: planPath,
919
+ reason: `${task.id} is not done in DB but checked in plan`,
920
+ });
921
+ }
659
922
  }
660
923
  }
661
- }
662
- catch (e) {
663
- logWarning("renderer", `plan parse failed: ${e.message}`);
924
+ catch (e) {
925
+ logWarning("renderer", `plan parse failed: ${e.message}`);
926
+ }
664
927
  }
665
928
  }
666
- // Check missing task summary files
667
- for (const task of tasks) {
668
- if (isClosedStatus(task.status) && task.full_summary_md) {
669
- const slicePath = resolveSlicePath(basePath, milestone.id, slice.id);
670
- if (slicePath) {
671
- const tasksDir = join(slicePath, "tasks");
672
- const fileName = buildTaskFileName(task.id, "SUMMARY");
673
- const summaryAbsPath = join(tasksDir, fileName);
674
- if (!existsSync(summaryAbsPath)) {
675
- stale.push({
676
- path: summaryAbsPath,
677
- reason: `${task.id} is complete with summary in DB but SUMMARY.md missing on disk`,
678
- });
929
+ // Check missing task summary files (legacy layout only — flat-phase keeps
930
+ // task state in plan <tasks> blocks and does not project Txx-SUMMARY.md)
931
+ if (!isFlatPhase) {
932
+ for (const task of tasks) {
933
+ if (isClosedStatus(task.status) && task.full_summary_md) {
934
+ const slicePath = resolveSlicePath(basePath, milestone.id, slice.id);
935
+ if (slicePath) {
936
+ const fileName = buildTaskFileName(task.id, "SUMMARY");
937
+ const summaryAbsPath = join(slicePath, fileName);
938
+ if (!existsSync(summaryAbsPath)) {
939
+ stale.push({
940
+ path: summaryAbsPath,
941
+ reason: `${task.id} is complete with summary in DB but SUMMARY.md missing on disk`,
942
+ });
943
+ }
679
944
  }
680
945
  }
681
946
  }
@@ -683,10 +948,14 @@ export function detectStaleRenders(basePath) {
683
948
  // Check missing slice summary/UAT files
684
949
  const sliceRow = getSlice(milestone.id, slice.id);
685
950
  if (sliceRow && sliceRow.status === "complete") {
951
+ // Use the SAME path construction as renderSliceSummary (planFileName format)
952
+ // so the detector and repair always agree on the file location.
686
953
  const slicePath = resolveSlicePath(basePath, milestone.id, slice.id);
687
954
  if (slicePath) {
955
+ const phaseNum = milestoneIdToPhaseNum(milestone.id);
956
+ const planNum = sliceIdToPlanNum(slice.id);
688
957
  if (sliceRow.full_summary_md) {
689
- const summaryName = buildSliceFileName(slice.id, "SUMMARY");
958
+ const summaryName = planFileName(phaseNum, planNum, "SUMMARY");
690
959
  const summaryAbsPath = join(slicePath, summaryName);
691
960
  if (!existsSync(summaryAbsPath)) {
692
961
  stale.push({
@@ -696,7 +965,7 @@ export function detectStaleRenders(basePath) {
696
965
  }
697
966
  }
698
967
  if (sliceRow.full_uat_md) {
699
- const uatName = buildSliceFileName(slice.id, "UAT");
968
+ const uatName = planFileName(phaseNum, planNum, "UAT");
700
969
  const uatAbsPath = join(slicePath, uatName);
701
970
  if (!existsSync(uatAbsPath)) {
702
971
  stale.push({
@@ -728,9 +997,12 @@ export function roadmapRenderMarksSliceDone(roadmapContent, sliceId) {
728
997
  return parseRoadmap(roadmapContent).slices.some((slice) => slice.id === sliceId && slice.done);
729
998
  }
730
999
  export async function renderReplanFromDb(basePath, milestoneId, sliceId, replanData) {
1000
+ // Flat-phase: replan file lives in the phase dir
731
1001
  const slicePath = resolveSlicePath(basePath, milestoneId, sliceId)
732
- ?? join(gsdRoot(basePath), "milestones", milestoneId, "slices", sliceId);
733
- const absPath = join(slicePath, `${sliceId}-REPLAN.md`);
1002
+ ?? join(milestonesDir(basePath), canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title));
1003
+ const phaseNum = milestoneIdToPhaseNum(milestoneId);
1004
+ const planNum = sliceIdToPlanNum(sliceId);
1005
+ const absPath = join(slicePath, planFileName(phaseNum, planNum, "REPLAN"));
734
1006
  const artifactPath = toArtifactPath(absPath, basePath);
735
1007
  const lines = [];
736
1008
  lines.push(`# ${sliceId} Replan`);
@@ -753,13 +1025,16 @@ export async function renderReplanFromDb(basePath, milestoneId, sliceId, replanD
753
1025
  artifact_type: "REPLAN",
754
1026
  milestone_id: milestoneId,
755
1027
  slice_id: sliceId,
756
- });
1028
+ }, basePath);
757
1029
  return { replanPath: absPath, content };
758
1030
  }
759
1031
  export async function renderAssessmentFromDb(basePath, milestoneId, sliceId, assessmentData) {
1032
+ // Flat-phase: assessment file lives in the phase dir
760
1033
  const slicePath = resolveSlicePath(basePath, milestoneId, sliceId)
761
- ?? join(gsdRoot(basePath), "milestones", milestoneId, "slices", sliceId);
762
- const absPath = join(slicePath, `${sliceId}-ASSESSMENT.md`);
1034
+ ?? join(milestonesDir(basePath), canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title));
1035
+ const phaseNum = milestoneIdToPhaseNum(milestoneId);
1036
+ const planNum = sliceIdToPlanNum(sliceId);
1037
+ const absPath = join(slicePath, planFileName(phaseNum, planNum, "ASSESSMENT"));
763
1038
  const artifactPath = toArtifactPath(absPath, basePath);
764
1039
  const lines = [];
765
1040
  lines.push(`# ${sliceId} Assessment`);
@@ -781,6 +1056,6 @@ export async function renderAssessmentFromDb(basePath, milestoneId, sliceId, ass
781
1056
  artifact_type: "ASSESSMENT",
782
1057
  milestone_id: milestoneId,
783
1058
  slice_id: sliceId,
784
- });
1059
+ }, basePath);
785
1060
  return { assessmentPath: absPath, content };
786
1061
  }