@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
@@ -3,9 +3,14 @@
3
3
 
4
4
  import { describe, it } from "node:test";
5
5
  import assert from "node:assert/strict";
6
+ import { createRequire } from "node:module";
7
+ import { appendFileSync, mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
8
+ import { join } from "node:path";
9
+ import { tmpdir } from "node:os";
6
10
 
7
11
  import { visibleWidth } from "@gsd/pi-tui";
8
12
  import { assertFullOuterBorder } from "./tui-border-assertions.ts";
13
+ import { closeDatabase, insertMilestone, insertSlice, insertTask, openDatabase } from "../gsd-db.ts";
9
14
 
10
15
  function assertLinesFit(lines: string[], width: number): void {
11
16
  for (const line of lines) {
@@ -17,6 +22,92 @@ function assertLinesFit(lines: string[], width: number): void {
17
22
  }
18
23
 
19
24
  describe("parallel-monitor-overlay", () => {
25
+ it("reads worker DB progress and appended NDJSON cost without sqlite CLI or full stdout reads", async () => {
26
+ const base = mkdtempSync(join(tmpdir(), "gsd-parallel-overlay-"));
27
+ const stdoutPath = join(base, ".gsd", "parallel", "M001.stdout.log");
28
+ const cjsRequire = createRequire(import.meta.url);
29
+ const fsBuiltin = cjsRequire("node:fs") as typeof import("node:fs");
30
+ const childProcessBuiltin = cjsRequire("node:child_process") as typeof import("node:child_process");
31
+ const originalReadFileSync = fsBuiltin.readFileSync;
32
+ const originalSpawnSync = childProcessBuiltin.spawnSync;
33
+
34
+ try {
35
+ mkdirSync(join(base, ".gsd", "parallel"), { recursive: true });
36
+ assert.equal(openDatabase(join(base, ".gsd", "gsd.db")), true);
37
+ insertMilestone({ id: "M001", title: "Monitor Fixture" });
38
+ insertSlice({ milestoneId: "M001", id: "S01", title: "Build overlay", status: "pending", sequence: 1 });
39
+ insertTask({
40
+ milestoneId: "M001",
41
+ sliceId: "S01",
42
+ id: "T01",
43
+ status: "complete",
44
+ oneLiner: "render progress",
45
+ sequence: 1,
46
+ });
47
+ insertTask({ milestoneId: "M001", sliceId: "S01", id: "T02", status: "pending", sequence: 2 });
48
+ closeDatabase();
49
+
50
+ writeFileSync(
51
+ join(base, ".gsd", "parallel", "M001.status.json"),
52
+ JSON.stringify({
53
+ milestoneId: "M001",
54
+ pid: process.pid,
55
+ state: "running",
56
+ cost: 0,
57
+ lastHeartbeat: Date.now(),
58
+ startedAt: Date.now() - 30_000,
59
+ worktreePath: join(base, ".gsd-worktrees", "M001"),
60
+ }),
61
+ "utf-8",
62
+ );
63
+ writeFileSync(
64
+ stdoutPath,
65
+ JSON.stringify({ type: "message_end", message: { usage: { cost: { total: 1.25 } } } }) + "\n",
66
+ "utf-8",
67
+ );
68
+
69
+ fsBuiltin.readFileSync = ((filePath: Parameters<typeof originalReadFileSync>[0], ...args: unknown[]) => {
70
+ if (String(filePath) === stdoutPath) throw new Error("full stdout log reads are disabled in this test");
71
+ return (originalReadFileSync as (...readArgs: unknown[]) => unknown)(filePath, ...args);
72
+ }) as typeof fsBuiltin.readFileSync;
73
+ childProcessBuiltin.spawnSync = ((command: Parameters<typeof originalSpawnSync>[0], ...args: unknown[]) => {
74
+ if (command === "sqlite3") throw new Error("sqlite3 CLI is disabled in this test");
75
+ return (originalSpawnSync as (...spawnArgs: unknown[]) => unknown)(command, ...args);
76
+ }) as typeof childProcessBuiltin.spawnSync;
77
+
78
+ const mod = await import("../parallel-monitor-overlay.js");
79
+ const mockTui = { requestRender: () => {} };
80
+ const mockTheme = {
81
+ fg: (_color: string, text: string) => text,
82
+ bold: (text: string) => text,
83
+ };
84
+ const overlay = new mod.ParallelMonitorOverlay(mockTui, mockTheme as any, () => {}, base);
85
+
86
+ try {
87
+ const joined = overlay.render(100).join("\n");
88
+ assert.match(joined, /S01:1\/2/, "slice progress should come from the in-process DB reader");
89
+ assert.match(joined, /S01\/T01: render progress/, "recent completions should come from the in-process DB reader");
90
+ assert.match(joined, /\$1\.25/, "cost should come from bounded NDJSON reads");
91
+
92
+ appendFileSync(
93
+ stdoutPath,
94
+ JSON.stringify({ type: "message_end", message: { usage: { cost: { total: 2.00 } } } }) + "\n",
95
+ "utf-8",
96
+ );
97
+ (overlay as any).refresh();
98
+ const refreshed = overlay.render(100).join("\n");
99
+ assert.match(refreshed, /\$3\.25/, "cost should include only newly appended NDJSON events");
100
+ } finally {
101
+ overlay.dispose();
102
+ }
103
+ } finally {
104
+ fsBuiltin.readFileSync = originalReadFileSync;
105
+ childProcessBuiltin.spawnSync = originalSpawnSync;
106
+ try { closeDatabase(); } catch { /* already closed */ }
107
+ rmSync(base, { recursive: true, force: true });
108
+ }
109
+ });
110
+
20
111
  it("progressBar generates correct width", async () => {
21
112
  // Dynamic import to test the module loads cleanly
22
113
  const mod = await import("../parallel-monitor-overlay.js");
@@ -1,6 +1,6 @@
1
1
  import test from 'node:test';
2
2
  import assert from 'node:assert/strict';
3
- import { mkdtempSync, mkdirSync, rmSync, readFileSync, existsSync } from 'node:fs';
3
+ import { mkdtempSync, mkdirSync, writeFileSync, rmSync, readFileSync, existsSync } from 'node:fs';
4
4
  import { join } from 'node:path';
5
5
  import { tmpdir } from 'node:os';
6
6
 
@@ -86,7 +86,12 @@ function planParams() {
86
86
 
87
87
  test('#4402 plan-milestone preserves ## Boundary Map after post-mutation projections', async (t) => {
88
88
  const base = mkdtempSync(join(tmpdir(), 'gsd-4402-'));
89
- mkdirSync(join(base, '.gsd', 'milestones', 'M001'), { recursive: true });
89
+ const mDir = join(base, '.gsd', 'milestones', 'M001');
90
+ mkdirSync(mDir, { recursive: true });
91
+ // A content-bearing legacy milestone dir requires at least one non-META file
92
+ // (dirIsContentBearingLegacyMilestone) so the layout sniffer treats it as a
93
+ // real legacy milestone rather than a metadata-only placeholder.
94
+ writeFileSync(join(mDir, 'M001-CONTEXT.md'), '# M001\n');
90
95
  openDatabase(join(base, '.gsd', 'gsd.db'));
91
96
 
92
97
  t.after(() => {
@@ -7,7 +7,7 @@
7
7
 
8
8
  import test from "node:test";
9
9
  import assert from "node:assert/strict";
10
- import { mkdtempSync, mkdirSync, rmSync, readFileSync } from "node:fs";
10
+ import { mkdtempSync, mkdirSync, writeFileSync, rmSync, readFileSync } from "node:fs";
11
11
  import { join } from "node:path";
12
12
  import { tmpdir } from "node:os";
13
13
 
@@ -16,7 +16,12 @@ import { handlePlanMilestone, type PlanMilestoneParams } from "../tools/plan-mil
16
16
 
17
17
  function makeTmpBase(): string {
18
18
  const base = mkdtempSync(join(tmpdir(), "gsd-plan-sketch-render-"));
19
- mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
19
+ const mDir = join(base, ".gsd", "milestones", "M001");
20
+ mkdirSync(mDir, { recursive: true });
21
+ // A content-bearing legacy milestone dir requires at least one non-META file
22
+ // (dirIsContentBearingLegacyMilestone) so the layout sniffer treats it as a
23
+ // real legacy milestone rather than a metadata-only placeholder.
24
+ writeFileSync(join(mDir, "M001-CONTEXT.md"), "# M001\n");
20
25
  openDatabase(join(base, ".gsd", "gsd.db"));
21
26
  return base;
22
27
  }
@@ -13,7 +13,7 @@ import { parseRoadmap } from '../parsers-legacy.ts';
13
13
 
14
14
  function makeTmpBase(): string {
15
15
  const base = mkdtempSync(join(tmpdir(), 'gsd-plan-milestone-'));
16
- mkdirSync(join(base, '.gsd', 'milestones', 'M001'), { recursive: true });
16
+ mkdirSync(join(base, '.gsd', 'phases', '01-test'), { recursive: true });
17
17
  return base;
18
18
  }
19
19
 
@@ -91,7 +91,7 @@ test('handlePlanMilestone writes milestone and slice planning state and renders
91
91
  assert.equal(slices[0]?.goal, 'Wire the handler.');
92
92
  assert.equal(slices[1]?.depends[0], 'S01');
93
93
 
94
- const roadmapPath = join(base, '.gsd', 'milestones', 'M001', 'M001-ROADMAP.md');
94
+ const roadmapPath = join(base, '.gsd', 'phases', '01-test', '01-ROADMAP.md');
95
95
  assert.ok(existsSync(roadmapPath), 'roadmap should be rendered to disk');
96
96
  const roadmap = readFileSync(roadmapPath, 'utf-8');
97
97
  assert.match(roadmap, /# M001: DB-backed planning/);
@@ -151,14 +151,17 @@ test('handlePlanMilestone surfaces render failures and does not clear parse-visi
151
151
  openDatabase(dbPath);
152
152
 
153
153
  try {
154
- const fallbackRoadmapPath = join(base, '.gsd', 'milestones', 'MISSING', 'MISSING-ROADMAP.md');
154
+ // Block the rendered roadmap path: M999 → phaseNum=999, slug='db-backed-planning'
155
+ // → renderer targets phases/999-db-backed-planning/999-ROADMAP.md.
156
+ // Creating that path as a directory causes EISDIR → render fails.
157
+ const fallbackRoadmapPath = join(base, '.gsd', 'phases', '999-db-backed-planning', '999-ROADMAP.md');
155
158
  mkdirSync(fallbackRoadmapPath, { recursive: true });
156
159
 
157
- const result = await handlePlanMilestone({ ...validParams(), milestoneId: 'MISSING' }, base);
160
+ const result = await handlePlanMilestone({ ...validParams(), milestoneId: 'M999' }, base);
158
161
  assert.ok('error' in result);
159
162
  assert.match(result.error, /render failed:/);
160
163
 
161
- const existingRoadmapPath = join(base, '.gsd', 'milestones', 'M001', 'M001-ROADMAP.md');
164
+ const existingRoadmapPath = join(base, '.gsd', 'phases', '01-test', '01-ROADMAP.md');
162
165
  writeFileSync(existingRoadmapPath, '# M001: Cached roadmap\n\n**Vision:** old value\n\n## Slices\n\n', 'utf-8');
163
166
  const cachedAfter = parseRoadmap(readFileSync(existingRoadmapPath, 'utf-8'));
164
167
  assert.equal(cachedAfter.vision, 'old value');
@@ -173,7 +176,7 @@ test('handlePlanMilestone clears parse-visible roadmap state after successful re
173
176
  openDatabase(dbPath);
174
177
 
175
178
  try {
176
- const roadmapPath = join(base, '.gsd', 'milestones', 'M001', 'M001-ROADMAP.md');
179
+ const roadmapPath = join(base, '.gsd', 'phases', '01-test', '01-ROADMAP.md');
177
180
  writeFileSync(roadmapPath, '# M001: Cached roadmap\n\n**Vision:** old value\n\n## Slices\n\n', 'utf-8');
178
181
 
179
182
  const cachedBefore = parseRoadmap(readFileSync(roadmapPath, 'utf-8'));
@@ -9,12 +9,11 @@ import { tmpdir } from 'node:os';
9
9
  import { openDatabase, closeDatabase, insertMilestone, insertSlice, insertTask, getSlice, getSliceTasks, getTask, getGateResults, updateTaskStatus } from '../gsd-db.ts';
10
10
  import { handlePlanSlice } from '../tools/plan-slice.ts';
11
11
  import { parsePlan } from '../parsers-legacy.ts';
12
- import { parseTaskPlanFile } from '../files.ts';
13
12
  import { deriveState, invalidateStateCache } from '../state.ts';
14
13
 
15
14
  function makeTmpBase(): string {
16
15
  const base = mkdtempSync(join(tmpdir(), 'gsd-plan-slice-'));
17
- mkdirSync(join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'tasks'), { recursive: true });
16
+ mkdirSync(join(base, '.gsd', 'phases', '01-test'), { recursive: true });
18
17
  mkdirSync(join(base, 'src', 'resources', 'extensions', 'gsd', 'tools'), { recursive: true });
19
18
  writeFileSync(join(base, 'src', 'resources', 'extensions', 'gsd', 'tools', 'plan-milestone.ts'), '// fixture\n', 'utf-8');
20
19
  writeFileSync(join(base, 'src', 'resources', 'extensions', 'gsd', 'tools', 'plan-task.ts'), '// fixture\n', 'utf-8');
@@ -91,17 +90,14 @@ test('handlePlanSlice writes slice/task planning state and renders plan artifact
91
90
  assert.deepEqual(slice?.target_repositories, ['project']);
92
91
  assert.deepEqual(tasks[0]?.target_repositories, ['project']);
93
92
 
94
- const planPath = join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'S02-PLAN.md');
93
+ const planPath = join(base, '.gsd', 'phases', '01-test', '01-02-PLAN.md');
95
94
  assert.ok(existsSync(planPath), 'slice plan should be rendered to disk');
96
95
  const parsedPlan = parsePlan(readFileSync(planPath, 'utf-8'));
97
96
  assert.equal(parsedPlan.goal, 'Persist slice planning through the DB.');
98
97
  assert.equal(parsedPlan.tasks.length, 2);
99
98
  assert.equal(parsedPlan.tasks[0]?.id, 'T01');
100
99
 
101
- const taskPlanPath = join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'tasks', 'T01-PLAN.md');
102
- assert.ok(existsSync(taskPlanPath), 'task plan should be rendered to disk');
103
- const taskPlan = parseTaskPlanFile(readFileSync(taskPlanPath, 'utf-8'));
104
- assert.deepEqual(taskPlan.frontmatter.skills_used, []);
100
+ // Flat-phase: no per-task plan files tasks are checkboxes inside the slice plan.
105
101
  } finally {
106
102
  cleanup(base);
107
103
  }
@@ -318,6 +314,9 @@ test('handlePlanSlice renders plan artifacts under worktree-local .gsd while usi
318
314
  const base = makeTmpBase();
319
315
  const worktree = join(base, '.gsd', 'worktrees', 'M001');
320
316
  mkdirSync(join(worktree, '.gsd'), { recursive: true });
317
+ // Mirror the project's phase dir into the worktree so resolveMilestonePath
318
+ // finds it and the renderer targets the correct flat-phase location.
319
+ mkdirSync(join(worktree, '.gsd', 'phases', '01-test'), { recursive: true });
321
320
  mkdirSync(join(worktree, 'src', 'resources', 'extensions', 'gsd', 'tools'), { recursive: true });
322
321
  writeFileSync(join(worktree, 'src', 'resources', 'extensions', 'gsd', 'tools', 'plan-milestone.ts'), '// fixture\n', 'utf-8');
323
322
  writeFileSync(join(worktree, 'src', 'resources', 'extensions', 'gsd', 'tools', 'plan-task.ts'), '// fixture\n', 'utf-8');
@@ -329,8 +328,8 @@ test('handlePlanSlice renders plan artifacts under worktree-local .gsd while usi
329
328
  const result = await handlePlanSlice(validParams(), worktree);
330
329
  assert.ok(!('error' in result), `unexpected error: ${'error' in result ? result.error : ''}`);
331
330
 
332
- const worktreePlan = join(worktree, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'S02-PLAN.md');
333
- const projectPlan = join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'S02-PLAN.md');
331
+ const worktreePlan = join(worktree, '.gsd', 'phases', '01-test', '01-02-PLAN.md');
332
+ const projectPlan = join(base, '.gsd', 'phases', '01-test', '01-02-PLAN.md');
334
333
  assert.ok(existsSync(worktreePlan), 'slice plan should be rendered to worktree-local .gsd');
335
334
  assert.ok(!existsSync(projectPlan), 'slice plan should not be rendered to project .gsd');
336
335
  assert.equal(result.planPath, realpathSync(worktreePlan));
@@ -339,6 +338,36 @@ test('handlePlanSlice renders plan artifacts under worktree-local .gsd while usi
339
338
  }
340
339
  });
341
340
 
341
+ test('handlePlanSlice does not regenerate unrelated completed-task summaries during planning', async () => {
342
+ const base = makeTmpBase();
343
+ openDatabase(join(base, '.gsd', 'gsd.db'));
344
+
345
+ try {
346
+ insertMilestone({ id: 'M001', title: 'Milestone', status: 'active' });
347
+ insertSlice({ id: 'S01', milestoneId: 'M001', title: 'Finished slice', status: 'complete', demo: 'Existing work.' });
348
+ insertSlice({ id: 'S02', milestoneId: 'M001', title: 'Planning slice', status: 'pending', demo: 'Rendered plans exist.' });
349
+ insertTask({
350
+ id: 'T99',
351
+ sliceId: 'S01',
352
+ milestoneId: 'M001',
353
+ title: 'Already complete',
354
+ status: 'complete',
355
+ fullSummaryMd: '# T99 Summary\n\nAlready done.\n',
356
+ });
357
+
358
+ const unrelatedSummaryPath = join(base, '.gsd', 'phases', '01-test', 'T99-SUMMARY.md');
359
+ assert.equal(existsSync(unrelatedSummaryPath), false, 'fixture should start without unrelated summary projection');
360
+
361
+ const result = await handlePlanSlice(validParams(), base);
362
+ assert.ok(!('error' in result), `unexpected error: ${'error' in result ? result.error : ''}`);
363
+
364
+ assert.equal(existsSync(unrelatedSummaryPath), false, 'plan-slice should not flush all milestone summaries');
365
+ assert.ok(existsSync(join(base, '.gsd', 'phases', '01-test', '01-02-PLAN.md')), 'current slice plan still renders');
366
+ } finally {
367
+ cleanup(base);
368
+ }
369
+ });
370
+
342
371
  test('handlePlanSlice preserves completed task closeout state when replanning the same task', async () => {
343
372
  const base = makeTmpBase();
344
373
  openDatabase(join(base, '.gsd', 'gsd.db'));
@@ -435,9 +464,10 @@ test('handlePlanSlice preserves sketch flag when render fails before artifacts e
435
464
  insertMilestone({ id: 'M001', title: 'Milestone', status: 'active' });
436
465
  insertSlice({ id: 'S02', milestoneId: 'M001', title: 'Planning slice', status: 'pending', demo: 'Rendered plans exist.', isSketch: true });
437
466
 
438
- const sliceDir = join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02');
439
- rmSync(sliceDir, { recursive: true, force: true });
440
- writeFileSync(sliceDir, 'not a directory', 'utf-8');
467
+ // Block the rendered plan path by creating a directory where the file would go.
468
+ // The renderer resolves M001/S02 phases/01-test/01-02-PLAN.md; creating that
469
+ // path as a directory causes EISDIR on write → render fails → sketch flag preserved.
470
+ mkdirSync(join(base, '.gsd', 'phases', '01-test', '01-02-PLAN.md'), { recursive: true });
441
471
 
442
472
  const result = await handlePlanSlice(validParams(), base);
443
473
  assert.ok('error' in result);
@@ -470,7 +500,7 @@ test('handlePlanSlice leaves omitted enrichment fields empty instead of renderin
470
500
  assert.equal(slice?.integration_closure, '');
471
501
  assert.equal(slice?.observability_impact, '');
472
502
 
473
- const planPath = join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'S02-PLAN.md');
503
+ const planPath = join(base, '.gsd', 'phases', '01-test', '01-02-PLAN.md');
474
504
  const content = readFileSync(planPath, 'utf-8');
475
505
  assert.doesNotMatch(content, /Not provided/i);
476
506
  assert.doesNotMatch(content, /^## Proof Level$/m);
@@ -644,8 +674,9 @@ test('handlePlanSlice surfaces render failures without changing parse-visible ta
644
674
 
645
675
  try {
646
676
  seedParentSlice();
647
- const failingTaskPlanPath = join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'tasks', 'T01-PLAN.md');
648
- writeFileSync(failingTaskPlanPath, '---\nestimated_steps: 1\nestimated_files: 1\nskills_used: []\n---\n\n# T01: Cached task\n', 'utf-8');
677
+ // Flat-phase: per-task plan files don't exist; simulate a write failure on the slice plan
678
+ const failingTaskPlanPath = join(base, '.gsd', 'phases', '01-test', '01-02-PLAN.md');
679
+ writeFileSync(failingTaskPlanPath, '---\nestimated_steps: 1\nestimated_files: 1\nskills_used: []\n---\n\n# Cached plan\n', 'utf-8');
649
680
  rmSync(failingTaskPlanPath, { force: true });
650
681
  mkdirSync(failingTaskPlanPath, { recursive: true });
651
682
 
@@ -683,7 +714,7 @@ test('handlePlanSlice reruns idempotently and refreshes parse-visible state', as
683
714
 
684
715
  try {
685
716
  seedParentSlice();
686
- writeFileSync(join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'S02-PLAN.md'), '# S02: Cached\n\n**Goal:** old value\n\n## Tasks\n\n- [ ] **T01: Cached task**\n', 'utf-8');
717
+ writeFileSync(join(base, '.gsd', 'phases', '01-test', '01-02-PLAN.md'), '# S02: Cached\n\n**Goal:** old value\n\n## Tasks\n\n- [ ] **T01: Cached task**\n', 'utf-8');
687
718
 
688
719
  const first = await handlePlanSlice(validParams(), base);
689
720
  assert.ok(!('error' in first));
@@ -698,7 +729,7 @@ test('handlePlanSlice reruns idempotently and refreshes parse-visible state', as
698
729
  }, base);
699
730
  assert.ok(!('error' in second));
700
731
 
701
- const parsedAfter = parsePlan(readFileSync(join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'S02-PLAN.md'), 'utf-8'));
732
+ const parsedAfter = parsePlan(readFileSync(join(base, '.gsd', 'phases', '01-test', '01-02-PLAN.md'), 'utf-8'));
702
733
  assert.equal(parsedAfter.goal, 'Updated goal from rerun.');
703
734
  const task = getTask('M001', 'S02', 'T01');
704
735
  assert.equal(task?.description, 'Updated slice handler description.');
@@ -724,8 +755,10 @@ test('handlePlanSlice removes omitted pending tasks when replanning a smaller ta
724
755
 
725
756
  const first = await handlePlanSlice(fourTaskPlan, base);
726
757
  assert.ok(!('error' in first), `unexpected error: ${'error' in first ? first.error : ''}`);
727
- const staleTaskPlanPath = join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'tasks', 'T04-PLAN.md');
728
- assert.ok(existsSync(staleTaskPlanPath), 'initial plan should render T04');
758
+ // In flat-phase mode tasks are checkboxes in the slice plan; no per-task plan files.
759
+ const slicePlanPath = join(base, '.gsd', 'phases', '01-test', '01-02-PLAN.md');
760
+ assert.ok(existsSync(slicePlanPath), 'initial plan should exist');
761
+ assert.match(readFileSync(slicePlanPath, 'utf-8'), /T04/, 'initial plan should contain T04');
729
762
 
730
763
  const second = await handlePlanSlice({
731
764
  ...validParams(),
@@ -735,7 +768,7 @@ test('handlePlanSlice removes omitted pending tasks when replanning a smaller ta
735
768
 
736
769
  assert.deepEqual(getSliceTasks('M001', 'S02').map((task) => task.id), ['T01', 'T02', 'T03']);
737
770
  assert.equal(getGateResults('M001', 'S02', 'task').some((gate) => gate.task_id === 'T04'), false);
738
- assert.equal(existsSync(staleTaskPlanPath), false, 'omitted task plan artifact should be removed');
771
+ assert.doesNotMatch(readFileSync(slicePlanPath, 'utf-8'), /T04/, 'omitted T04 should be removed from plan');
739
772
  } finally {
740
773
  cleanup(base);
741
774
  }
@@ -758,8 +791,10 @@ test('handlePlanSlice rejects omitted completed tasks without changing slice or
758
791
 
759
792
  const first = await handlePlanSlice(fourTaskPlan, base);
760
793
  assert.ok(!('error' in first), `unexpected error: ${'error' in first ? first.error : ''}`);
761
- const staleTaskPlanPath = join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'tasks', 'T04-PLAN.md');
762
- assert.ok(existsSync(staleTaskPlanPath), 'initial plan should render T04');
794
+ // In flat-phase mode tasks are checkboxes in the slice plan; no per-task plan files.
795
+ const slicePlanPathR = join(base, '.gsd', 'phases', '01-test', '01-02-PLAN.md');
796
+ assert.ok(existsSync(slicePlanPathR), 'initial plan should exist');
797
+ assert.match(readFileSync(slicePlanPathR, 'utf-8'), /T04/, 'initial plan should contain T04');
763
798
 
764
799
  updateTaskStatus('M001', 'S02', 'T04', 'complete', '2026-05-12T00:00:00.000Z');
765
800
  const tasksBefore = getSliceTasks('M001', 'S02');
@@ -775,7 +810,7 @@ test('handlePlanSlice rejects omitted completed tasks without changing slice or
775
810
  assert.equal(getSlice('M001', 'S02')?.goal, 'Persist slice planning through the DB.');
776
811
  assert.deepEqual(getSliceTasks('M001', 'S02'), tasksBefore);
777
812
  assert.deepEqual(getGateResults('M001', 'S02', 'task'), gatesBefore);
778
- assert.ok(existsSync(staleTaskPlanPath), 'completed task plan artifact should remain after rejected replan');
813
+ assert.match(readFileSync(slicePlanPathR, 'utf-8'), /T04/, 'completed task T04 should remain in plan after rejected replan');
779
814
  } finally {
780
815
  cleanup(base);
781
816
  }
@@ -10,7 +10,7 @@ import { parseTaskPlanFile } from '../files.ts';
10
10
 
11
11
  function makeTmpBase(): string {
12
12
  const base = mkdtempSync(join(tmpdir(), 'gsd-plan-task-'));
13
- mkdirSync(join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'tasks'), { recursive: true });
13
+ mkdirSync(join(base, '.gsd', 'phases', '01-test'), { recursive: true });
14
14
  return base;
15
15
  }
16
16
 
@@ -55,7 +55,7 @@ test('handlePlanTask writes planning state and renders task plan', async () => {
55
55
  assert.equal(task?.description, 'Implement the DB-backed task planning handler.');
56
56
  assert.equal(task?.estimate, '30m');
57
57
 
58
- const taskPlanPath = join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'tasks', 'T02-PLAN.md');
58
+ const taskPlanPath = join(base, '.gsd', 'phases', '01-test', 'T02-PLAN.md');
59
59
  assert.ok(existsSync(taskPlanPath), 'task plan should be rendered to disk');
60
60
  const taskPlan = parseTaskPlanFile(readFileSync(taskPlanPath, 'utf-8'));
61
61
  assert.equal(taskPlan.frontmatter.estimated_files, 1);
@@ -157,7 +157,7 @@ test('handlePlanTask surfaces render failures without changing parse-visible tas
157
157
  try {
158
158
  seedParent();
159
159
  insertTask({ id: 'T02', sliceId: 'S02', milestoneId: 'M001', title: 'Cached task', status: 'pending' });
160
- const taskPlanPath = join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'tasks', 'T02-PLAN.md');
160
+ const taskPlanPath = join(base, '.gsd', 'phases', '01-test', 'T02-PLAN.md');
161
161
  writeFileSync(taskPlanPath, '---\nestimated_steps: 1\nestimated_files: 1\nskills_used: []\n---\n\n# T02: Cached task\n', 'utf-8');
162
162
  rmSync(taskPlanPath, { force: true });
163
163
  mkdirSync(taskPlanPath, { recursive: true });
@@ -176,7 +176,7 @@ test('handlePlanTask reruns idempotently and refreshes parse-visible state', asy
176
176
 
177
177
  try {
178
178
  seedParent();
179
- const taskPlanPath = join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'tasks', 'T02-PLAN.md');
179
+ const taskPlanPath = join(base, '.gsd', 'phases', '01-test', 'T02-PLAN.md');
180
180
  writeFileSync(taskPlanPath, '---\nestimated_steps: 1\nestimated_files: 1\nskills_used: []\n---\n\n# T02: Cached task\n', 'utf-8');
181
181
 
182
182
  const first = await handlePlanTask(validParams(), base);
@@ -90,6 +90,8 @@ console.log('\n=== planning-crossval Test 1: ROADMAP round-trip parity ===');
90
90
 
91
91
  // Render ROADMAP.md from DB
92
92
  const rendered = await renderRoadmapFromDb(base, 'M001');
93
+ // Milestone has planned slices — skipped variant is unreachable here.
94
+ if ('skipped' in rendered) throw new Error('unexpected: milestone has planned slices');
93
95
  const content = readFileSync(rendered.roadmapPath, 'utf-8');
94
96
 
95
97
  // Parse back
@@ -279,6 +281,8 @@ console.log('\n=== planning-crossval Test 3: Sequence ordering parity ===');
279
281
 
280
282
  // Render ROADMAP from DB — should produce slices in sequence order
281
283
  const rendered = await renderRoadmapFromDb(base, 'M001');
284
+ // Milestone has planned slices — skipped variant is unreachable here.
285
+ if ('skipped' in rendered) throw new Error('unexpected: milestone has planned slices');
282
286
  const content = readFileSync(rendered.roadmapPath, 'utf-8');
283
287
 
284
288
  // Parse back
@@ -312,6 +316,7 @@ console.log('\n=== planning-crossval Test 4: ROADMAP worktree projection path ==
312
316
  const base = createFixtureBase();
313
317
  const worktreeBase = join(base, '.gsd', 'worktrees', 'M001');
314
318
  const worktreeGsd = join(worktreeBase, '.gsd');
319
+ // Both base and worktree use the legacy milestones/ layout (no phases/ dir).
315
320
  const projectRoadmapPath = join(base, '.gsd', 'milestones', 'M001', 'M001-ROADMAP.md');
316
321
  const worktreeRoadmapPath = join(worktreeGsd, 'milestones', 'M001', 'M001-ROADMAP.md');
317
322
  const dbPath = join(base, '.gsd', 'gsd.db');
@@ -320,6 +325,10 @@ console.log('\n=== planning-crossval Test 4: ROADMAP worktree projection path ==
320
325
  try {
321
326
  scaffoldDirs(base, 'M001', []);
322
327
  mkdirSync(join(worktreeGsd, 'milestones', 'M001'), { recursive: true });
328
+ // Add a content file so the worktree M001 dir passes dirIsContentBearingLegacyMilestone.
329
+ // Without this, an empty dir is treated as a metadata-only dir (post-#852 guard) and
330
+ // resolveMilestonePath returns null, causing the renderer to write to a flat-phase path.
331
+ writeFileSync(join(worktreeGsd, 'milestones', 'M001', 'M001-CONTEXT.md'), '# M001\n');
323
332
  writeFileSync(projectRoadmapPath, '# stale project roadmap\n');
324
333
 
325
334
  insertMilestone({
@@ -340,6 +349,8 @@ console.log('\n=== planning-crossval Test 4: ROADMAP worktree projection path ==
340
349
  });
341
350
 
342
351
  const rendered = await renderRoadmapFromDb(worktreeBase, 'M001');
352
+ // Milestone has a planned slice — skipped variant is unreachable here.
353
+ if ('skipped' in rendered) throw new Error('unexpected: milestone has planned slices');
343
354
 
344
355
  assertEq(rendered.roadmapPath, worktreeRoadmapPath, 'T4: roadmap path uses worktree projection');
345
356
  assertTrue(existsSync(worktreeRoadmapPath), 'T4: worktree roadmap exists');
@@ -359,6 +370,7 @@ console.log('\n=== planning-crossval Test 5: ROADMAP existing projection file pa
359
370
  const base = createFixtureBase();
360
371
  const worktreeBase = join(base, '.gsd', 'worktrees', 'M001');
361
372
  const worktreeGsd = join(worktreeBase, '.gsd');
373
+ // Legacy milestones/ layout: roadmap filename is M001-ROADMAP.md (not NN-ROADMAP.md).
362
374
  const worktreeRoadmapPath = join(worktreeGsd, 'milestones', 'M001', 'M001-ROADMAP.md');
363
375
  const dbPath = join(base, '.gsd', 'gsd.db');
364
376
  const originalCwd = process.cwd();
@@ -377,6 +389,8 @@ console.log('\n=== planning-crossval Test 5: ROADMAP existing projection file pa
377
389
  });
378
390
 
379
391
  const rendered = await renderRoadmapFromDb(worktreeBase, 'M001');
392
+ // Milestone has a non-empty vision — skipped variant is unreachable here.
393
+ if ('skipped' in rendered) throw new Error('unexpected: milestone has non-empty vision');
380
394
 
381
395
  assertEq(rendered.roadmapPath, worktreeRoadmapPath, 'T5: existing roadmap path remains absolute');
382
396
  assertTrue(existsSync(worktreeRoadmapPath), 'T5: worktree roadmap still exists');
@@ -397,6 +411,7 @@ console.log('\n=== planning-crossval Test 6: ROADMAP descriptor projection dir =
397
411
  const worktreeBase = join(base, '.gsd', 'worktrees', 'M001');
398
412
  const worktreeGsd = join(worktreeBase, '.gsd');
399
413
  const descriptorMilestoneDir = join(worktreeGsd, 'milestones', 'M001-DESCRIPTOR');
414
+ // Legacy milestones/ layout: roadmap filename is M001-ROADMAP.md (not NN-ROADMAP.md).
400
415
  const descriptorRoadmapPath = join(descriptorMilestoneDir, 'M001-ROADMAP.md');
401
416
  const bareMilestoneDir = join(worktreeGsd, 'milestones', 'M001');
402
417
  const dbPath = join(base, '.gsd', 'gsd.db');
@@ -414,6 +429,8 @@ console.log('\n=== planning-crossval Test 6: ROADMAP descriptor projection dir =
414
429
  });
415
430
 
416
431
  const rendered = await renderRoadmapFromDb(worktreeBase, 'M001');
432
+ // Milestone has a non-empty vision — skipped variant is unreachable here.
433
+ if ('skipped' in rendered) throw new Error('unexpected: milestone has non-empty vision');
417
434
 
418
435
  assertEq(rendered.roadmapPath, descriptorRoadmapPath, 'T6: roadmap path uses descriptor milestone dir');
419
436
  assertTrue(existsSync(descriptorRoadmapPath), 'T6: descriptor roadmap exists');
@@ -455,6 +472,8 @@ console.log('\n=== planning-crossval Test 7: renderer recovers bracket-wrapped d
455
472
  .run('["[S01]"]', 'S02', 'M001');
456
473
 
457
474
  const rendered = await renderRoadmapFromDb(base, 'M001');
475
+ // Milestone has planned slices — skipped variant is unreachable here.
476
+ if ('skipped' in rendered) throw new Error('unexpected: milestone has planned slices');
458
477
  const content = readFileSync(rendered.roadmapPath, 'utf-8');
459
478
  const parsed = parseRoadmapSlices(content);
460
479
 
@@ -0,0 +1,84 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Tests for .planning/ layout classification.
3
+ import test from "node:test";
4
+ import assert from "node:assert/strict";
5
+
6
+ import { detectPlanningLayout } from "../migrate/layout-detect.ts";
7
+ import type { PlanningProject } from "../migrate/types.ts";
8
+
9
+ function emptyProject(over: Partial<PlanningProject> = {}): PlanningProject {
10
+ return {
11
+ path: "", project: null, roadmap: null, requirements: [], state: null,
12
+ config: null, phases: {}, quickTasks: [], milestones: [], research: [],
13
+ decisions: [], seeds: [], validation: { valid: true, issues: [] },
14
+ ...over,
15
+ } as PlanningProject;
16
+ }
17
+
18
+ test("detectPlanningLayout returns legacy-milestone-dir when milestones/ has phases", () => {
19
+ const p = emptyProject({
20
+ milestones: [{
21
+ id: "v1.0",
22
+ requirements: null,
23
+ roadmap: null,
24
+ phases: { "01-foo": {} as never },
25
+ extraFiles: [],
26
+ }],
27
+ });
28
+ assert.equal(detectPlanningLayout(p), "legacy-milestone-dir");
29
+ });
30
+
31
+ test("detectPlanningLayout returns multi-milestone when roadmap.milestones non-empty", () => {
32
+ const p = emptyProject({
33
+ roadmap: {
34
+ raw: "",
35
+ milestones: [{ id: "v1", title: "V1", collapsed: false, phases: [] }],
36
+ phases: [],
37
+ },
38
+ });
39
+ assert.equal(detectPlanningLayout(p), "multi-milestone");
40
+ });
41
+
42
+ test("detectPlanningLayout returns flat-phases when roadmap.phases non-empty and no milestone dirs", () => {
43
+ const p = emptyProject({
44
+ roadmap: {
45
+ raw: "",
46
+ milestones: [],
47
+ phases: [{ number: 1, title: "Foo", done: false, raw: "" }],
48
+ },
49
+ });
50
+ assert.equal(detectPlanningLayout(p), "flat-phases");
51
+ });
52
+
53
+ test("detectPlanningLayout returns null when nothing recognizable", () => {
54
+ assert.equal(detectPlanningLayout(emptyProject()), null);
55
+ });
56
+
57
+ test("priority: legacy-milestone-dir wins over multi-milestone", () => {
58
+ const p = emptyProject({
59
+ milestones: [{
60
+ id: "v1.0",
61
+ requirements: null,
62
+ roadmap: null,
63
+ phases: { "01-foo": {} as never },
64
+ extraFiles: [],
65
+ }],
66
+ roadmap: {
67
+ raw: "",
68
+ milestones: [{ id: "v1", title: "V1", collapsed: false, phases: [] }],
69
+ phases: [],
70
+ },
71
+ });
72
+ assert.equal(detectPlanningLayout(p), "legacy-milestone-dir");
73
+ });
74
+
75
+ test("priority: multi-milestone wins over flat-phases when both roadmap arrays non-empty", () => {
76
+ const p = emptyProject({
77
+ roadmap: {
78
+ raw: "",
79
+ milestones: [{ id: "v1", title: "V1", collapsed: false, phases: [] }],
80
+ phases: [{ number: 1, title: "Foo", done: false, raw: "" }],
81
+ },
82
+ });
83
+ assert.equal(detectPlanningLayout(p), "multi-milestone");
84
+ });