@opengsd/gsd-pi 1.3.0 → 1.4.0

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 (912) hide show
  1. package/README.md +10 -10
  2. package/dist/cli.js +32 -4
  3. package/dist/headless-answers.js +1 -1
  4. package/dist/headless-context.js +0 -1
  5. package/dist/headless-ui.d.ts +1 -1
  6. package/dist/headless-ui.js +1 -1
  7. package/dist/headless.js +1 -1
  8. package/dist/help-text.js +29 -0
  9. package/dist/hermes-integration-install.d.ts +17 -0
  10. package/dist/hermes-integration-install.js +199 -0
  11. package/dist/jiti-workspace-aliases.d.ts +11 -2
  12. package/dist/jiti-workspace-aliases.js +19 -3
  13. package/dist/read-cli.d.ts +23 -0
  14. package/dist/read-cli.js +90 -0
  15. package/dist/resource-loader.d.ts +3 -3
  16. package/dist/resource-loader.js +4 -13
  17. package/dist/resources/.managed-resources-content-hash +1 -1
  18. package/dist/resources/GSD-WORKFLOW.md +22 -22
  19. package/dist/resources/extensions/claude-code-cli/index.js +7 -1
  20. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  21. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +84 -22
  22. package/dist/resources/extensions/google-cli/stream-adapter.js +82 -15
  23. package/dist/resources/extensions/gsd/artifact-verification.js +427 -0
  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 +28 -10
  27. package/dist/resources/extensions/gsd/auto/session.js +11 -0
  28. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +1 -1
  29. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +15 -1
  30. package/dist/resources/extensions/gsd/auto-artifact-paths.js +108 -19
  31. package/dist/resources/extensions/gsd/auto-budget.js +5 -1
  32. package/dist/resources/extensions/gsd/auto-dispatch.js +62 -27
  33. package/dist/resources/extensions/gsd/auto-model-selection.js +8 -5
  34. package/dist/resources/extensions/gsd/auto-post-unit.js +28 -22
  35. package/dist/resources/extensions/gsd/auto-prompts.js +68 -43
  36. package/dist/resources/extensions/gsd/auto-recovery.js +14 -483
  37. package/dist/resources/extensions/gsd/auto-runtime-state.js +17 -5
  38. package/dist/resources/extensions/gsd/auto-start.js +56 -30
  39. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +3 -3
  40. package/dist/resources/extensions/gsd/auto-verification.js +10 -4
  41. package/dist/resources/extensions/gsd/auto-worktree.js +117 -91
  42. package/dist/resources/extensions/gsd/auto.js +40 -15
  43. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +141 -65
  44. package/dist/resources/extensions/gsd/bootstrap/core-session-tools.js +39 -0
  45. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +11 -5
  46. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -0
  47. package/dist/resources/extensions/gsd/bootstrap/fallback-continuation.js +25 -0
  48. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +23 -1
  49. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +117 -27
  50. package/dist/resources/extensions/gsd/bootstrap/system-context.js +190 -43
  51. package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +96 -10
  52. package/dist/resources/extensions/gsd/bootstrap/tool-search-shim.js +22 -3
  53. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +73 -16
  54. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +95 -5
  55. package/dist/resources/extensions/gsd/codebase-generator.js +5 -8
  56. package/dist/resources/extensions/gsd/commands/catalog.js +6 -0
  57. package/dist/resources/extensions/gsd/commands/dispatcher.js +3 -0
  58. package/dist/resources/extensions/gsd/commands/gsd-core-aliases-handler.js +39 -0
  59. package/dist/resources/extensions/gsd/commands/gsd-core-aliases.js +44 -0
  60. package/dist/resources/extensions/gsd/commands/handlers/auto.js +1 -1
  61. package/dist/resources/extensions/gsd/commands/handlers/core.js +30 -0
  62. package/dist/resources/extensions/gsd/commands/handlers/ops.js +225 -1
  63. package/dist/resources/extensions/gsd/commands-cmux.js +3 -1
  64. package/dist/resources/extensions/gsd/commands-context.js +19 -1
  65. package/dist/resources/extensions/gsd/commands-gsd-core.js +868 -0
  66. package/dist/resources/extensions/gsd/commands-handlers.js +67 -1
  67. package/dist/resources/extensions/gsd/commands-maintenance.js +79 -2
  68. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +23 -12
  69. package/dist/resources/extensions/gsd/commands-usage.js +1 -1
  70. package/dist/resources/extensions/gsd/commands-verdict.js +17 -11
  71. package/dist/resources/extensions/gsd/commands-worktree.js +12 -10
  72. package/dist/resources/extensions/gsd/compat/compat-marker.js +172 -0
  73. package/dist/resources/extensions/gsd/compat/index.js +3 -0
  74. package/dist/resources/extensions/gsd/compat/planning-compat.js +142 -0
  75. package/dist/resources/extensions/gsd/config-overlay.js +2 -2
  76. package/dist/resources/extensions/gsd/consent-question.js +12 -0
  77. package/dist/resources/extensions/gsd/consent-verdict.js +10 -0
  78. package/dist/resources/extensions/gsd/dashboard-overlay.js +71 -6
  79. package/dist/resources/extensions/gsd/db/engine.js +31 -1
  80. package/dist/resources/extensions/gsd/db/queries.js +114 -0
  81. package/dist/resources/extensions/gsd/db/unit-dispatches.js +22 -1
  82. package/dist/resources/extensions/gsd/db-memory-fts-schema.js +34 -0
  83. package/dist/resources/extensions/gsd/db-workspace.js +68 -4
  84. package/dist/resources/extensions/gsd/delegation-policy.js +1 -1
  85. package/dist/resources/extensions/gsd/discussion-handoff.js +9 -5
  86. package/dist/resources/extensions/gsd/docs/preferences-reference.md +2 -2
  87. package/dist/resources/extensions/gsd/doctor-engine-checks.js +192 -4
  88. package/dist/resources/extensions/gsd/doctor-git-checks.js +25 -3
  89. package/dist/resources/extensions/gsd/doctor-providers.js +92 -8
  90. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +5 -15
  91. package/dist/resources/extensions/gsd/doctor.js +28 -7
  92. package/dist/resources/extensions/gsd/error-classifier.js +13 -1
  93. package/dist/resources/extensions/gsd/escalation.js +11 -4
  94. package/dist/resources/extensions/gsd/exec-sandbox.js +53 -11
  95. package/dist/resources/extensions/gsd/export-html.js +10 -3
  96. package/dist/resources/extensions/gsd/export.js +73 -0
  97. package/dist/resources/extensions/gsd/file-lock.js +1 -1
  98. package/dist/resources/extensions/gsd/flat-phase-migration.js +221 -0
  99. package/dist/resources/extensions/gsd/forensics.js +4 -33
  100. package/dist/resources/extensions/gsd/git-service.js +68 -8
  101. package/dist/resources/extensions/gsd/gitignore.js +10 -3
  102. package/dist/resources/extensions/gsd/guidance.js +7 -7
  103. package/dist/resources/extensions/gsd/guided-flow-queue.js +66 -5
  104. package/dist/resources/extensions/gsd/guided-flow.js +11 -6
  105. package/dist/resources/extensions/gsd/health-widget.js +55 -29
  106. package/dist/resources/extensions/gsd/json-persistence.js +20 -0
  107. package/dist/resources/extensions/gsd/knowledge-backfill.js +18 -11
  108. package/dist/resources/extensions/gsd/layout-policy.js +77 -0
  109. package/dist/resources/extensions/gsd/markdown-renderer.js +396 -122
  110. package/dist/resources/extensions/gsd/mcp-filter.js +44 -10
  111. package/dist/resources/extensions/gsd/md-importer.js +153 -51
  112. package/dist/resources/extensions/gsd/memory-backfill.js +28 -21
  113. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +44 -21
  114. package/dist/resources/extensions/gsd/metrics.js +22 -14
  115. package/dist/resources/extensions/gsd/migrate/layout-detect.js +32 -0
  116. package/dist/resources/extensions/gsd/migrate/planning-writer.js +203 -0
  117. package/dist/resources/extensions/gsd/migrate-external.js +62 -8
  118. package/dist/resources/extensions/gsd/migration-auto-check.js +27 -14
  119. package/dist/resources/extensions/gsd/milestone-actions.js +5 -3
  120. package/dist/resources/extensions/gsd/milestone-closeout.js +12 -2
  121. package/dist/resources/extensions/gsd/milestone-ids.js +79 -18
  122. package/dist/resources/extensions/gsd/milestone-implementation-evidence.js +26 -20
  123. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +8 -0
  124. package/dist/resources/extensions/gsd/milestone-validation-verdict.js +7 -4
  125. package/dist/resources/extensions/gsd/model-router.js +79 -20
  126. package/dist/resources/extensions/gsd/notification-store.js +22 -29
  127. package/dist/resources/extensions/gsd/notifications.js +36 -7
  128. package/dist/resources/extensions/gsd/observability-validator.js +12 -4
  129. package/dist/resources/extensions/gsd/orphan-stash-audit.js +92 -16
  130. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +133 -35
  131. package/dist/resources/extensions/gsd/parsers-legacy.js +40 -14
  132. package/dist/resources/extensions/gsd/paths.js +356 -44
  133. package/dist/resources/extensions/gsd/planning-depth.js +2 -1
  134. package/dist/resources/extensions/gsd/post-execution-checks.js +26 -3
  135. package/dist/resources/extensions/gsd/preferences-models.js +23 -11
  136. package/dist/resources/extensions/gsd/preferences.js +62 -13
  137. package/dist/resources/extensions/gsd/prompts/ai-integration-phase.md +28 -0
  138. package/dist/resources/extensions/gsd/prompts/audit-fix.md +39 -0
  139. package/dist/resources/extensions/gsd/prompts/audit-milestone.md +26 -0
  140. package/dist/resources/extensions/gsd/prompts/audit-uat.md +24 -0
  141. package/dist/resources/extensions/gsd/prompts/autonomous.md +31 -0
  142. package/dist/resources/extensions/gsd/prompts/code-review.md +39 -0
  143. package/dist/resources/extensions/gsd/prompts/complete-slice.md +21 -16
  144. package/dist/resources/extensions/gsd/prompts/discuss-phase.md +31 -0
  145. package/dist/resources/extensions/gsd/prompts/docs-update.md +13 -0
  146. package/dist/resources/extensions/gsd/prompts/execute-phase.md +33 -0
  147. package/dist/resources/extensions/gsd/prompts/explore.md +58 -0
  148. package/dist/resources/extensions/gsd/prompts/graphify.md +27 -0
  149. package/dist/resources/extensions/gsd/prompts/health.md +37 -0
  150. package/dist/resources/extensions/gsd/prompts/import.md +30 -0
  151. package/dist/resources/extensions/gsd/prompts/inbox.md +27 -0
  152. package/dist/resources/extensions/gsd/prompts/ingest-docs.md +30 -0
  153. package/dist/resources/extensions/gsd/prompts/manager.md +21 -0
  154. package/dist/resources/extensions/gsd/prompts/map-codebase.md +42 -0
  155. package/dist/resources/extensions/gsd/prompts/milestone-summary.md +27 -0
  156. package/dist/resources/extensions/gsd/prompts/mvp-phase.md +23 -0
  157. package/dist/resources/extensions/gsd/prompts/pause-work.md +24 -0
  158. package/dist/resources/extensions/gsd/prompts/phase.md +22 -0
  159. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
  160. package/dist/resources/extensions/gsd/prompts/plan-phase.md +34 -0
  161. package/dist/resources/extensions/gsd/prompts/plan-review-convergence.md +34 -0
  162. package/dist/resources/extensions/gsd/prompts/plan-slice.md +3 -3
  163. package/dist/resources/extensions/gsd/prompts/profile-user.md +28 -0
  164. package/dist/resources/extensions/gsd/prompts/progress.md +30 -0
  165. package/dist/resources/extensions/gsd/prompts/resume-work.md +20 -0
  166. package/dist/resources/extensions/gsd/prompts/review-backlog.md +21 -0
  167. package/dist/resources/extensions/gsd/prompts/review.md +27 -0
  168. package/dist/resources/extensions/gsd/prompts/secure-phase.md +24 -0
  169. package/dist/resources/extensions/gsd/prompts/settings.md +24 -0
  170. package/dist/resources/extensions/gsd/prompts/sketch.md +59 -0
  171. package/dist/resources/extensions/gsd/prompts/spec-phase.md +29 -0
  172. package/dist/resources/extensions/gsd/prompts/spike.md +59 -0
  173. package/dist/resources/extensions/gsd/prompts/stats.md +43 -0
  174. package/dist/resources/extensions/gsd/prompts/surface.md +25 -0
  175. package/dist/resources/extensions/gsd/prompts/thread.md +24 -0
  176. package/dist/resources/extensions/gsd/prompts/ui-phase.md +29 -0
  177. package/dist/resources/extensions/gsd/prompts/ui-review.md +29 -0
  178. package/dist/resources/extensions/gsd/prompts/ultraplan-phase.md +24 -0
  179. package/dist/resources/extensions/gsd/prompts/validate-phase.md +26 -0
  180. package/dist/resources/extensions/gsd/prompts/verify-work.md +24 -0
  181. package/dist/resources/extensions/gsd/prompts/workspace.md +22 -0
  182. package/dist/resources/extensions/gsd/prompts/workstreams.md +24 -0
  183. package/dist/resources/extensions/gsd/queue-order.js +3 -2
  184. package/dist/resources/extensions/gsd/quick.js +45 -2
  185. package/dist/resources/extensions/gsd/recovery-classification.js +8 -0
  186. package/dist/resources/extensions/gsd/roadmap-slices.js +1 -1
  187. package/dist/resources/extensions/gsd/root-write-leak-guard.js +7 -1
  188. package/dist/resources/extensions/gsd/safety/content-validator.js +2 -1
  189. package/dist/resources/extensions/gsd/safety/destructive-guard.js +8 -1
  190. package/dist/resources/extensions/gsd/safety/evidence-collector.js +16 -1
  191. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +43 -1
  192. package/dist/resources/extensions/gsd/safety/file-change-validator.js +5 -2
  193. package/dist/resources/extensions/gsd/service-tier.js +2 -1
  194. package/dist/resources/extensions/gsd/session-forensics.js +11 -1
  195. package/dist/resources/extensions/gsd/session-lock.js +7 -6
  196. package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +3 -0
  197. package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +51 -0
  198. package/dist/resources/extensions/gsd/state/derive/cache.js +28 -0
  199. package/dist/resources/extensions/gsd/state/derive/db-open.js +39 -0
  200. package/dist/resources/extensions/gsd/state/derive/from-db.js +452 -0
  201. package/dist/resources/extensions/gsd/state/derive/index.js +75 -0
  202. package/dist/resources/extensions/gsd/state/derive/interrupted-work.js +21 -0
  203. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +38 -4
  204. package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +24 -3
  205. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +82 -0
  206. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +142 -0
  207. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +19 -6
  208. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +2 -2
  209. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +138 -19
  210. package/dist/resources/extensions/gsd/state-reconciliation/index.js +84 -26
  211. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +34 -18
  212. package/dist/resources/extensions/gsd/state.js +13 -581
  213. package/dist/resources/extensions/gsd/sync-lock.js +11 -18
  214. package/dist/resources/extensions/gsd/tool-surface-readiness.js +205 -16
  215. package/dist/resources/extensions/gsd/tools/complete-milestone.js +8 -4
  216. package/dist/resources/extensions/gsd/tools/complete-slice.js +14 -4
  217. package/dist/resources/extensions/gsd/tools/complete-task.js +58 -15
  218. package/dist/resources/extensions/gsd/tools/exec-tool.js +7 -2
  219. package/dist/resources/extensions/gsd/tools/plan-slice.js +60 -47
  220. package/dist/resources/extensions/gsd/tools/plan-task.js +40 -2
  221. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +9 -3
  222. package/dist/resources/extensions/gsd/tools/validate-milestone.js +8 -3
  223. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +44 -5
  224. package/dist/resources/extensions/gsd/triage-resolution.js +14 -7
  225. package/dist/resources/extensions/gsd/undo.js +51 -15
  226. package/dist/resources/extensions/gsd/unit-context-composer.js +23 -7
  227. package/dist/resources/extensions/gsd/unit-registry.js +63 -9
  228. package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +91 -5
  229. package/dist/resources/extensions/gsd/validation-block-guard.js +54 -4
  230. package/dist/resources/extensions/gsd/verification-gate.js +7 -0
  231. package/dist/resources/extensions/gsd/visualizer-data.js +35 -0
  232. package/dist/resources/extensions/gsd/visualizer-views.js +21 -2
  233. package/dist/resources/extensions/gsd/workflow-manifest.js +126 -13
  234. package/dist/resources/extensions/gsd/workflow-mcp.js +9 -1
  235. package/dist/resources/extensions/gsd/workflow-projections.js +44 -18
  236. package/dist/resources/extensions/gsd/workspace-git-preflight.js +30 -1
  237. package/dist/resources/extensions/gsd/worktree-command.js +6 -6
  238. package/dist/resources/extensions/gsd/worktree-health.js +6 -3
  239. package/dist/resources/extensions/gsd/worktree-manager.js +59 -17
  240. package/dist/resources/extensions/gsd/worktree-safety.js +20 -11
  241. package/dist/resources/extensions/mcp-client/manager.js +3 -3
  242. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  243. package/dist/update-check.js +15 -4
  244. package/dist/web/standalone/.next/BUILD_ID +1 -1
  245. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  246. package/dist/web/standalone/.next/build-manifest.json +3 -3
  247. package/dist/web/standalone/.next/react-loadable-manifest.json +9 -9
  248. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  249. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  250. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  251. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  252. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  253. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  254. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  255. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  256. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  257. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  258. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  259. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  260. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  261. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  262. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  263. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  264. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  265. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  266. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  267. package/dist/web/standalone/.next/server/app/index.html +1 -1
  268. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  269. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  270. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  271. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  272. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  273. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  274. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  275. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  276. package/dist/web/standalone/.next/server/chunks/1128.js +1 -1
  277. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  278. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  279. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  280. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  281. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  282. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  283. package/dist/web/standalone/.next/static/chunks/{2659.b7b129ee6a769448.js → 2659.58e950899a9bb82f.js} +1 -1
  284. package/dist/web/standalone/.next/static/chunks/2772.a7c1fcc69a4685ef.js +1 -0
  285. package/dist/web/standalone/.next/static/chunks/{3616.3c60753b8ffcbd2e.js → 3616.61a2af74bb8833c8.js} +1 -1
  286. package/dist/web/standalone/.next/static/chunks/{4283.e4873b058df143a1.js → 4283.d0d9e0a955e441cb.js} +2 -2
  287. package/dist/web/standalone/.next/static/chunks/{5826.a46ecdd1cfe8dabc.js → 5826.5421d66c72b9f34e.js} +1 -1
  288. package/dist/web/standalone/.next/static/chunks/8785.e29b3134cab1d153.js +1 -0
  289. package/dist/web/standalone/.next/static/chunks/8937.640dc9c2aaa1dfad.js +10 -0
  290. package/dist/web/standalone/.next/static/chunks/app/{page-a48b7c48333b31c8.js → page-bc4c723c6a19c6f0.js} +1 -1
  291. package/dist/web/standalone/.next/static/chunks/webpack-9c401904f87ded16.js +1 -0
  292. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  293. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  294. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  295. package/dist/web-mode.d.ts +3 -1
  296. package/dist/web-mode.js +7 -5
  297. package/integrations/hermes/README.md +48 -0
  298. package/integrations/hermes/docs/setup.md +272 -0
  299. package/integrations/hermes/docs/upstream-hermes-pr.md +40 -0
  300. package/integrations/hermes/open_gsd_hermes/__init__.py +105 -0
  301. package/integrations/hermes/open_gsd_hermes/binding.py +107 -0
  302. package/integrations/hermes/open_gsd_hermes/commands.py +186 -0
  303. package/integrations/hermes/open_gsd_hermes/config.py +59 -0
  304. package/integrations/hermes/open_gsd_hermes/credentials.py +51 -0
  305. package/integrations/hermes/open_gsd_hermes/cron.py +85 -0
  306. package/integrations/hermes/open_gsd_hermes/formatting.py +13 -0
  307. package/integrations/hermes/open_gsd_hermes/gsd_client.py +269 -0
  308. package/integrations/hermes/open_gsd_hermes/inject.py +31 -0
  309. package/integrations/hermes/open_gsd_hermes/memory.py +66 -0
  310. package/integrations/hermes/open_gsd_hermes/notifications.py +71 -0
  311. package/integrations/hermes/open_gsd_hermes/snapshot.py +42 -0
  312. package/integrations/hermes/open_gsd_hermes/supervisor.py +180 -0
  313. package/integrations/hermes/open_gsd_hermes/types.py +100 -0
  314. package/integrations/hermes/plugin.yaml +38 -0
  315. package/integrations/hermes/pyproject.toml +32 -0
  316. package/integrations/hermes/scripts/preflight.sh +92 -0
  317. package/integrations/hermes/tests/fixtures/minimal-project/.gsd/STATE.md +17 -0
  318. package/integrations/hermes/tests/golden/memory_prefetch.txt +5 -0
  319. package/integrations/hermes/tests/golden/snapshot.txt +8 -0
  320. package/integrations/hermes/tests/test_binding.py +103 -0
  321. package/integrations/hermes/tests/test_config.py +36 -0
  322. package/integrations/hermes/tests/test_cron.py +34 -0
  323. package/integrations/hermes/tests/test_gsd_client_cache.py +120 -0
  324. package/integrations/hermes/tests/test_memory.py +59 -0
  325. package/integrations/hermes/tests/test_read_cli_contract.py +50 -0
  326. package/integrations/hermes/tests/test_register.py +56 -0
  327. package/integrations/hermes/tests/test_snapshot.py +53 -0
  328. package/integrations/hermes/tests/test_supervisor_fsm.py +581 -0
  329. package/package.json +7 -6
  330. package/packages/cloud-mcp-gateway/dist/runtime-registry.d.ts +8 -0
  331. package/packages/cloud-mcp-gateway/dist/runtime-registry.d.ts.map +1 -1
  332. package/packages/cloud-mcp-gateway/dist/runtime-registry.js +19 -2
  333. package/packages/cloud-mcp-gateway/dist/runtime-registry.js.map +1 -1
  334. package/packages/cloud-mcp-gateway/dist/runtime-registry.test.js +71 -2
  335. package/packages/cloud-mcp-gateway/dist/runtime-registry.test.js.map +1 -1
  336. package/packages/cloud-mcp-gateway/package.json +2 -2
  337. package/packages/contracts/dist/workflow.d.ts +1 -0
  338. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  339. package/packages/contracts/dist/workflow.js +2 -0
  340. package/packages/contracts/dist/workflow.js.map +1 -1
  341. package/packages/contracts/package.json +1 -1
  342. package/packages/daemon/package.json +4 -4
  343. package/packages/gsd-agent-core/dist/agent-session.d.ts +1 -0
  344. package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
  345. package/packages/gsd-agent-core/dist/agent-session.js +3 -0
  346. package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
  347. package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts +41 -0
  348. package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts.map +1 -0
  349. package/packages/gsd-agent-core/dist/extension-ui-snapshot.js +62 -0
  350. package/packages/gsd-agent-core/dist/extension-ui-snapshot.js.map +1 -0
  351. package/packages/gsd-agent-core/dist/index.d.ts +2 -0
  352. package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
  353. package/packages/gsd-agent-core/dist/index.js +2 -0
  354. package/packages/gsd-agent-core/dist/index.js.map +1 -1
  355. package/packages/gsd-agent-core/dist/session/agent-session-events.js +1 -1
  356. package/packages/gsd-agent-core/dist/session/agent-session-events.js.map +1 -1
  357. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +1 -0
  358. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
  359. package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
  360. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts +5 -0
  361. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
  362. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +60 -3
  363. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
  364. package/packages/gsd-agent-core/dist/transcript-store.d.ts +58 -0
  365. package/packages/gsd-agent-core/dist/transcript-store.d.ts.map +1 -0
  366. package/packages/gsd-agent-core/dist/transcript-store.js +132 -0
  367. package/packages/gsd-agent-core/dist/transcript-store.js.map +1 -0
  368. package/packages/gsd-agent-core/package.json +5 -5
  369. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +2 -0
  370. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  371. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +25 -11
  372. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  373. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts +4 -0
  374. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts.map +1 -0
  375. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js +7 -0
  376. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js.map +1 -0
  377. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -24
  378. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  379. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +26 -829
  380. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  381. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts +58 -0
  382. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts.map +1 -0
  383. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js +312 -0
  384. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js.map +1 -0
  385. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts +31 -0
  386. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts.map +1 -0
  387. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js +130 -0
  388. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js.map +1 -0
  389. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts +15 -0
  390. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts.map +1 -0
  391. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js +258 -0
  392. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map +1 -0
  393. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts +13 -0
  394. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts.map +1 -0
  395. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js +118 -0
  396. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js.map +1 -0
  397. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +9 -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 +1 -1
  400. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  401. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts +54 -0
  402. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts.map +1 -0
  403. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js +20 -0
  404. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js.map +1 -0
  405. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +4 -1
  406. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  407. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +9 -0
  408. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  409. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts +56 -0
  410. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts.map +1 -0
  411. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js +44 -0
  412. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js.map +1 -0
  413. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts +5 -0
  414. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts.map +1 -0
  415. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js +77 -0
  416. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js.map +1 -0
  417. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts +2 -0
  418. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  419. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +23 -5
  420. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js.map +1 -1
  421. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  422. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +18 -0
  423. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  424. package/packages/gsd-agent-modes/package.json +7 -7
  425. package/packages/mcp-server/README.md +11 -1
  426. package/packages/mcp-server/dist/cli-errors.d.ts +11 -0
  427. package/packages/mcp-server/dist/cli-errors.d.ts.map +1 -1
  428. package/packages/mcp-server/dist/cli-errors.js +12 -0
  429. package/packages/mcp-server/dist/cli-errors.js.map +1 -1
  430. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -1
  431. package/packages/mcp-server/dist/cli-runner.js +33 -0
  432. package/packages/mcp-server/dist/cli-runner.js.map +1 -1
  433. package/packages/mcp-server/dist/cli.d.ts +1 -0
  434. package/packages/mcp-server/dist/cli.d.ts.map +1 -1
  435. package/packages/mcp-server/dist/cli.js +1 -0
  436. package/packages/mcp-server/dist/cli.js.map +1 -1
  437. package/packages/mcp-server/dist/server.d.ts +30 -1
  438. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  439. package/packages/mcp-server/dist/server.js +85 -6
  440. package/packages/mcp-server/dist/server.js.map +1 -1
  441. package/packages/mcp-server/dist/workflow-tools.d.ts +13 -1
  442. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  443. package/packages/mcp-server/dist/workflow-tools.js +35 -21
  444. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  445. package/packages/mcp-server/package.json +21 -5
  446. package/packages/native/package.json +1 -1
  447. package/packages/pi-agent-core/dist/agent-loop.js +3 -2
  448. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  449. package/packages/pi-agent-core/package.json +1 -1
  450. package/packages/pi-ai/dist/models.generated.d.ts +46 -0
  451. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  452. package/packages/pi-ai/dist/models.generated.js +38 -0
  453. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  454. package/packages/pi-ai/package.json +1 -1
  455. package/packages/pi-coding-agent/README.md +3 -2
  456. package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts +9 -0
  457. package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts.map +1 -0
  458. package/packages/pi-coding-agent/dist/core/session-manager-context.js +94 -0
  459. package/packages/pi-coding-agent/dist/core/session-manager-context.js.map +1 -0
  460. package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts +8 -0
  461. package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts.map +1 -0
  462. package/packages/pi-coding-agent/dist/core/session-manager-list.js +244 -0
  463. package/packages/pi-coding-agent/dist/core/session-manager-list.js.map +1 -0
  464. package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts +12 -0
  465. package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts.map +1 -0
  466. package/packages/pi-coding-agent/dist/core/session-manager-migration.js +84 -0
  467. package/packages/pi-coding-agent/dist/core/session-manager-migration.js.map +1 -0
  468. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +135 -0
  469. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -0
  470. package/packages/pi-coding-agent/dist/core/session-manager-types.js +2 -0
  471. package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -0
  472. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +6 -154
  473. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  474. package/packages/pi-coding-agent/dist/core/session-manager.js +22 -459
  475. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  476. package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts +75 -75
  477. package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts.map +1 -1
  478. package/packages/pi-coding-agent/dist/theme/theme-schema.js +1 -1
  479. package/packages/pi-coding-agent/dist/theme/theme-schema.js.map +1 -1
  480. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  481. package/packages/pi-coding-agent/dist/theme/theme.js +11 -7
  482. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  483. package/packages/pi-coding-agent/package.json +7 -7
  484. package/packages/pi-tui/package.json +2 -2
  485. package/packages/rpc-client/package.json +2 -2
  486. package/pkg/dist/theme/theme-schema.d.ts +75 -75
  487. package/pkg/dist/theme/theme-schema.d.ts.map +1 -1
  488. package/pkg/dist/theme/theme-schema.js +1 -1
  489. package/pkg/dist/theme/theme-schema.js.map +1 -1
  490. package/pkg/dist/theme/theme.d.ts.map +1 -1
  491. package/pkg/dist/theme/theme.js +11 -7
  492. package/pkg/dist/theme/theme.js.map +1 -1
  493. package/pkg/package.json +1 -1
  494. package/src/resources/GSD-WORKFLOW.md +22 -22
  495. package/src/resources/extensions/claude-code-cli/index.ts +8 -1
  496. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  497. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +103 -22
  498. package/src/resources/extensions/claude-code-cli/tests/index.test.ts +61 -0
  499. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +262 -10
  500. package/src/resources/extensions/google-cli/stream-adapter.ts +106 -19
  501. package/src/resources/extensions/gsd/artifact-verification.ts +464 -0
  502. package/src/resources/extensions/gsd/auto/dispatch-history.ts +19 -1
  503. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  504. package/src/resources/extensions/gsd/auto/loop.ts +69 -2
  505. package/src/resources/extensions/gsd/auto/orchestrator.ts +38 -13
  506. package/src/resources/extensions/gsd/auto/session.ts +14 -0
  507. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +3 -1
  508. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +25 -3
  509. package/src/resources/extensions/gsd/auto-artifact-paths.ts +129 -20
  510. package/src/resources/extensions/gsd/auto-budget.ts +12 -1
  511. package/src/resources/extensions/gsd/auto-dispatch.ts +68 -34
  512. package/src/resources/extensions/gsd/auto-model-selection.ts +8 -1
  513. package/src/resources/extensions/gsd/auto-post-unit.ts +37 -23
  514. package/src/resources/extensions/gsd/auto-prompts.ts +81 -44
  515. package/src/resources/extensions/gsd/auto-recovery.ts +21 -484
  516. package/src/resources/extensions/gsd/auto-runtime-state.ts +17 -5
  517. package/src/resources/extensions/gsd/auto-start.ts +63 -34
  518. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +3 -2
  519. package/src/resources/extensions/gsd/auto-verification.ts +10 -8
  520. package/src/resources/extensions/gsd/auto-worktree.ts +48 -15
  521. package/src/resources/extensions/gsd/auto.ts +46 -11
  522. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +164 -71
  523. package/src/resources/extensions/gsd/bootstrap/core-session-tools.ts +44 -0
  524. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -5
  525. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -0
  526. package/src/resources/extensions/gsd/bootstrap/fallback-continuation.ts +31 -0
  527. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +23 -1
  528. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +139 -27
  529. package/src/resources/extensions/gsd/bootstrap/system-context.ts +219 -46
  530. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +49 -1
  531. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +104 -10
  532. package/src/resources/extensions/gsd/bootstrap/tool-search-shim.ts +21 -3
  533. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +86 -18
  534. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +109 -4
  535. package/src/resources/extensions/gsd/codebase-generator.ts +6 -9
  536. package/src/resources/extensions/gsd/commands/catalog.ts +6 -0
  537. package/src/resources/extensions/gsd/commands/dispatcher.ts +3 -0
  538. package/src/resources/extensions/gsd/commands/gsd-core-aliases-handler.ts +48 -0
  539. package/src/resources/extensions/gsd/commands/gsd-core-aliases.ts +63 -0
  540. package/src/resources/extensions/gsd/commands/handlers/auto.ts +1 -1
  541. package/src/resources/extensions/gsd/commands/handlers/core.ts +31 -0
  542. package/src/resources/extensions/gsd/commands/handlers/ops.ts +225 -1
  543. package/src/resources/extensions/gsd/commands-cmux.ts +3 -0
  544. package/src/resources/extensions/gsd/commands-context.ts +18 -1
  545. package/src/resources/extensions/gsd/commands-gsd-core.ts +1142 -0
  546. package/src/resources/extensions/gsd/commands-handlers.ts +76 -1
  547. package/src/resources/extensions/gsd/commands-maintenance.ts +98 -2
  548. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +21 -10
  549. package/src/resources/extensions/gsd/commands-usage.ts +1 -1
  550. package/src/resources/extensions/gsd/commands-verdict.ts +16 -15
  551. package/src/resources/extensions/gsd/commands-worktree.ts +12 -10
  552. package/src/resources/extensions/gsd/compat/compat-marker.ts +210 -0
  553. package/src/resources/extensions/gsd/compat/index.ts +12 -0
  554. package/src/resources/extensions/gsd/compat/planning-compat.ts +168 -0
  555. package/src/resources/extensions/gsd/config-overlay.ts +3 -1
  556. package/src/resources/extensions/gsd/consent-question.ts +11 -1
  557. package/src/resources/extensions/gsd/consent-verdict.ts +30 -1
  558. package/src/resources/extensions/gsd/dashboard-overlay.ts +73 -7
  559. package/src/resources/extensions/gsd/db/engine.ts +34 -1
  560. package/src/resources/extensions/gsd/db/queries.ts +157 -0
  561. package/src/resources/extensions/gsd/db/unit-dispatches.ts +24 -0
  562. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +45 -0
  563. package/src/resources/extensions/gsd/db-workspace.ts +76 -3
  564. package/src/resources/extensions/gsd/delegation-policy.ts +1 -1
  565. package/src/resources/extensions/gsd/discussion-handoff.ts +9 -5
  566. package/src/resources/extensions/gsd/docs/preferences-reference.md +2 -2
  567. package/src/resources/extensions/gsd/doctor-engine-checks.ts +233 -5
  568. package/src/resources/extensions/gsd/doctor-git-checks.ts +24 -2
  569. package/src/resources/extensions/gsd/doctor-providers.ts +103 -9
  570. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +5 -15
  571. package/src/resources/extensions/gsd/doctor-types.ts +4 -0
  572. package/src/resources/extensions/gsd/doctor.ts +30 -7
  573. package/src/resources/extensions/gsd/error-classifier.ts +14 -1
  574. package/src/resources/extensions/gsd/escalation.ts +9 -4
  575. package/src/resources/extensions/gsd/exec-sandbox.ts +56 -11
  576. package/src/resources/extensions/gsd/export-html.ts +11 -4
  577. package/src/resources/extensions/gsd/export.ts +88 -1
  578. package/src/resources/extensions/gsd/file-lock.ts +1 -1
  579. package/src/resources/extensions/gsd/flat-phase-migration.ts +249 -0
  580. package/src/resources/extensions/gsd/forensics.ts +4 -34
  581. package/src/resources/extensions/gsd/git-constants.ts +1 -1
  582. package/src/resources/extensions/gsd/git-service.ts +76 -7
  583. package/src/resources/extensions/gsd/gitignore.ts +11 -4
  584. package/src/resources/extensions/gsd/guidance.ts +7 -7
  585. package/src/resources/extensions/gsd/guided-flow-queue.ts +89 -4
  586. package/src/resources/extensions/gsd/guided-flow.ts +11 -6
  587. package/src/resources/extensions/gsd/health-widget.ts +69 -32
  588. package/src/resources/extensions/gsd/json-persistence.ts +20 -0
  589. package/src/resources/extensions/gsd/knowledge-backfill.ts +16 -10
  590. package/src/resources/extensions/gsd/layout-policy.ts +86 -0
  591. package/src/resources/extensions/gsd/markdown-renderer.ts +409 -112
  592. package/src/resources/extensions/gsd/mcp-filter.ts +59 -10
  593. package/src/resources/extensions/gsd/md-importer.ts +215 -65
  594. package/src/resources/extensions/gsd/memory-backfill.ts +26 -20
  595. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +51 -19
  596. package/src/resources/extensions/gsd/metrics.ts +26 -13
  597. package/src/resources/extensions/gsd/migrate/layout-detect.ts +38 -0
  598. package/src/resources/extensions/gsd/migrate/planning-writer.ts +259 -0
  599. package/src/resources/extensions/gsd/migrate-external.ts +57 -8
  600. package/src/resources/extensions/gsd/migration-auto-check.ts +27 -13
  601. package/src/resources/extensions/gsd/milestone-actions.ts +5 -2
  602. package/src/resources/extensions/gsd/milestone-closeout.ts +13 -2
  603. package/src/resources/extensions/gsd/milestone-ids.ts +78 -19
  604. package/src/resources/extensions/gsd/milestone-implementation-evidence.ts +35 -21
  605. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +8 -0
  606. package/src/resources/extensions/gsd/milestone-validation-verdict.ts +7 -9
  607. package/src/resources/extensions/gsd/model-router.ts +98 -18
  608. package/src/resources/extensions/gsd/notification-store.ts +17 -28
  609. package/src/resources/extensions/gsd/notifications.ts +37 -6
  610. package/src/resources/extensions/gsd/observability-validator.ts +12 -4
  611. package/src/resources/extensions/gsd/orphan-stash-audit.ts +108 -20
  612. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +151 -31
  613. package/src/resources/extensions/gsd/parsers-legacy.ts +42 -15
  614. package/src/resources/extensions/gsd/paths.ts +348 -39
  615. package/src/resources/extensions/gsd/planning-depth.ts +2 -1
  616. package/src/resources/extensions/gsd/post-execution-checks.ts +43 -3
  617. package/src/resources/extensions/gsd/preferences-models.ts +25 -9
  618. package/src/resources/extensions/gsd/preferences.ts +80 -12
  619. package/src/resources/extensions/gsd/prompts/ai-integration-phase.md +28 -0
  620. package/src/resources/extensions/gsd/prompts/audit-fix.md +39 -0
  621. package/src/resources/extensions/gsd/prompts/audit-milestone.md +26 -0
  622. package/src/resources/extensions/gsd/prompts/audit-uat.md +24 -0
  623. package/src/resources/extensions/gsd/prompts/autonomous.md +31 -0
  624. package/src/resources/extensions/gsd/prompts/code-review.md +39 -0
  625. package/src/resources/extensions/gsd/prompts/complete-slice.md +21 -16
  626. package/src/resources/extensions/gsd/prompts/discuss-phase.md +31 -0
  627. package/src/resources/extensions/gsd/prompts/docs-update.md +13 -0
  628. package/src/resources/extensions/gsd/prompts/execute-phase.md +33 -0
  629. package/src/resources/extensions/gsd/prompts/explore.md +58 -0
  630. package/src/resources/extensions/gsd/prompts/graphify.md +27 -0
  631. package/src/resources/extensions/gsd/prompts/health.md +37 -0
  632. package/src/resources/extensions/gsd/prompts/import.md +30 -0
  633. package/src/resources/extensions/gsd/prompts/inbox.md +27 -0
  634. package/src/resources/extensions/gsd/prompts/ingest-docs.md +30 -0
  635. package/src/resources/extensions/gsd/prompts/manager.md +21 -0
  636. package/src/resources/extensions/gsd/prompts/map-codebase.md +42 -0
  637. package/src/resources/extensions/gsd/prompts/milestone-summary.md +27 -0
  638. package/src/resources/extensions/gsd/prompts/mvp-phase.md +23 -0
  639. package/src/resources/extensions/gsd/prompts/pause-work.md +24 -0
  640. package/src/resources/extensions/gsd/prompts/phase.md +22 -0
  641. package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
  642. package/src/resources/extensions/gsd/prompts/plan-phase.md +34 -0
  643. package/src/resources/extensions/gsd/prompts/plan-review-convergence.md +34 -0
  644. package/src/resources/extensions/gsd/prompts/plan-slice.md +3 -3
  645. package/src/resources/extensions/gsd/prompts/profile-user.md +28 -0
  646. package/src/resources/extensions/gsd/prompts/progress.md +30 -0
  647. package/src/resources/extensions/gsd/prompts/resume-work.md +20 -0
  648. package/src/resources/extensions/gsd/prompts/review-backlog.md +21 -0
  649. package/src/resources/extensions/gsd/prompts/review.md +27 -0
  650. package/src/resources/extensions/gsd/prompts/secure-phase.md +24 -0
  651. package/src/resources/extensions/gsd/prompts/settings.md +24 -0
  652. package/src/resources/extensions/gsd/prompts/sketch.md +59 -0
  653. package/src/resources/extensions/gsd/prompts/spec-phase.md +29 -0
  654. package/src/resources/extensions/gsd/prompts/spike.md +59 -0
  655. package/src/resources/extensions/gsd/prompts/stats.md +43 -0
  656. package/src/resources/extensions/gsd/prompts/surface.md +25 -0
  657. package/src/resources/extensions/gsd/prompts/thread.md +24 -0
  658. package/src/resources/extensions/gsd/prompts/ui-phase.md +29 -0
  659. package/src/resources/extensions/gsd/prompts/ui-review.md +29 -0
  660. package/src/resources/extensions/gsd/prompts/ultraplan-phase.md +24 -0
  661. package/src/resources/extensions/gsd/prompts/validate-phase.md +26 -0
  662. package/src/resources/extensions/gsd/prompts/verify-work.md +24 -0
  663. package/src/resources/extensions/gsd/prompts/workspace.md +22 -0
  664. package/src/resources/extensions/gsd/prompts/workstreams.md +24 -0
  665. package/src/resources/extensions/gsd/queue-order.ts +3 -2
  666. package/src/resources/extensions/gsd/quick.ts +43 -2
  667. package/src/resources/extensions/gsd/recovery-classification.ts +7 -0
  668. package/src/resources/extensions/gsd/roadmap-slices.ts +1 -1
  669. package/src/resources/extensions/gsd/root-write-leak-guard.ts +13 -1
  670. package/src/resources/extensions/gsd/safety/content-validator.ts +2 -1
  671. package/src/resources/extensions/gsd/safety/destructive-guard.ts +9 -1
  672. package/src/resources/extensions/gsd/safety/evidence-collector.ts +16 -1
  673. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +45 -1
  674. package/src/resources/extensions/gsd/safety/file-change-validator.ts +8 -2
  675. package/src/resources/extensions/gsd/service-tier.ts +2 -0
  676. package/src/resources/extensions/gsd/session-forensics.ts +11 -1
  677. package/src/resources/extensions/gsd/session-lock.ts +7 -6
  678. package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +3 -0
  679. package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +51 -0
  680. package/src/resources/extensions/gsd/state/derive/cache.ts +46 -0
  681. package/src/resources/extensions/gsd/state/derive/db-open.ts +45 -0
  682. package/src/resources/extensions/gsd/state/derive/from-db.ts +561 -0
  683. package/src/resources/extensions/gsd/state/derive/index.ts +104 -0
  684. package/src/resources/extensions/gsd/state/derive/interrupted-work.ts +31 -0
  685. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +35 -4
  686. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +22 -2
  687. package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +105 -0
  688. package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +180 -0
  689. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +19 -6
  690. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +2 -2
  691. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +176 -30
  692. package/src/resources/extensions/gsd/state-reconciliation/index.ts +86 -27
  693. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +45 -18
  694. package/src/resources/extensions/gsd/state-reconciliation/types.ts +19 -0
  695. package/src/resources/extensions/gsd/state.ts +37 -695
  696. package/src/resources/extensions/gsd/sync-lock.ts +11 -20
  697. package/src/resources/extensions/gsd/tests/__fixtures__/flat-phase/.gsd/phases/01-foundation/01-01-PLAN.md +13 -0
  698. package/src/resources/extensions/gsd/tests/__fixtures__/flat-phase/.gsd/phases/01-foundation/01-ROADMAP.md +8 -0
  699. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/m001-basic/.gsd/milestones/M001/M001-ROADMAP.md +13 -0
  700. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/m001-basic/.gsd/milestones/M001/slices/S01/S01-PLAN.md +5 -0
  701. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/PROJECT.md +1 -0
  702. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/ROADMAP.md +5 -0
  703. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/STATE.md +10 -0
  704. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/phases/01-foundation/01-01-PLAN.md +13 -0
  705. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +4 -3
  706. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +420 -2
  707. package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +14 -5
  708. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +104 -0
  709. package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +32 -1
  710. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +15 -12
  711. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +36 -0
  712. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +11 -2
  713. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +182 -4
  714. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +146 -1
  715. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +30 -0
  716. package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +17 -0
  717. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +15 -11
  718. package/src/resources/extensions/gsd/tests/commands-context.test.ts +26 -0
  719. package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +89 -0
  720. package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +37 -1
  721. package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +31 -30
  722. package/src/resources/extensions/gsd/tests/commands-gsd-core.test.ts +863 -0
  723. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +1 -1
  724. package/src/resources/extensions/gsd/tests/commands-worktree-clean.test.ts +80 -0
  725. package/src/resources/extensions/gsd/tests/compat-health-line.test.ts +102 -0
  726. package/src/resources/extensions/gsd/tests/compat-marker-invalidation.test.ts +51 -0
  727. package/src/resources/extensions/gsd/tests/compat-marker.test.ts +105 -0
  728. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +28 -0
  729. package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +151 -0
  730. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +18 -7
  731. package/src/resources/extensions/gsd/tests/complete-task-rollback-evidence.test.ts +48 -8
  732. package/src/resources/extensions/gsd/tests/complete-task.test.ts +82 -7
  733. package/src/resources/extensions/gsd/tests/consent-question.test.ts +45 -0
  734. package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +90 -0
  735. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +1 -1
  736. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +58 -3
  737. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +51 -0
  738. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +63 -1
  739. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +49 -5
  740. package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +44 -0
  741. package/src/resources/extensions/gsd/tests/discuss-cold-start-db-open.test.ts +10 -27
  742. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +20 -1
  743. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +102 -0
  744. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +175 -43
  745. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +26 -1
  746. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +7 -0
  747. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +70 -2
  748. package/src/resources/extensions/gsd/tests/doctor-git-checks-autoresolve.test.ts +149 -0
  749. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +107 -0
  750. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +239 -2
  751. package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +17 -10
  752. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +95 -0
  753. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +38 -0
  754. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +16 -0
  755. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +45 -1
  756. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +25 -0
  757. package/src/resources/extensions/gsd/tests/export-memory.test.ts +179 -0
  758. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +53 -0
  759. package/src/resources/extensions/gsd/tests/external-markdown-edit.test.ts +137 -0
  760. package/src/resources/extensions/gsd/tests/external-planning-edit.test.ts +199 -0
  761. package/src/resources/extensions/gsd/tests/fallback-continuation.test.ts +36 -0
  762. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +40 -0
  763. package/src/resources/extensions/gsd/tests/file-lock.test.ts +43 -0
  764. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +149 -0
  765. package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +83 -0
  766. package/src/resources/extensions/gsd/tests/flat-phase-round-trip.test.ts +72 -0
  767. package/src/resources/extensions/gsd/tests/flat-phase-validation-integration.test.ts +120 -0
  768. package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +74 -0
  769. package/src/resources/extensions/gsd/tests/forensics-error-filter.test.ts +88 -0
  770. package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +4 -0
  771. package/src/resources/extensions/gsd/tests/gsd-core-parity-routing.test.ts +183 -0
  772. package/src/resources/extensions/gsd/tests/guidance.test.ts +25 -0
  773. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +42 -0
  774. package/src/resources/extensions/gsd/tests/health-widget.test.ts +268 -3
  775. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +19 -11
  776. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +6 -2
  777. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +130 -3
  778. package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +55 -0
  779. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +4 -3
  780. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +11 -7
  781. package/src/resources/extensions/gsd/tests/integration/queue-active-milestone-context-budget.test.ts +93 -0
  782. package/src/resources/extensions/gsd/tests/integration/quick-branch-lifecycle.test.ts +56 -9
  783. package/src/resources/extensions/gsd/tests/json-persistence-atomic.test.ts +47 -0
  784. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +35 -0
  785. package/src/resources/extensions/gsd/tests/knowledge-cold-start.test.ts +386 -0
  786. package/src/resources/extensions/gsd/tests/layout-policy.test.ts +59 -0
  787. package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +1 -1
  788. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +214 -82
  789. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +74 -1
  790. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +78 -0
  791. package/src/resources/extensions/gsd/tests/memory-store.test.ts +48 -0
  792. package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +31 -1
  793. package/src/resources/extensions/gsd/tests/metrics-ledger-cap.test.ts +239 -0
  794. package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +6 -0
  795. package/src/resources/extensions/gsd/tests/metrics.test.ts +1 -0
  796. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +57 -0
  797. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +70 -0
  798. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +7 -2
  799. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +6 -1
  800. package/src/resources/extensions/gsd/tests/model-router.test.ts +204 -7
  801. package/src/resources/extensions/gsd/tests/notification-store.test.ts +23 -0
  802. package/src/resources/extensions/gsd/tests/notifications.test.ts +33 -0
  803. package/src/resources/extensions/gsd/tests/observability-validator-boundary.test.ts +194 -0
  804. package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +47 -1
  805. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +91 -7
  806. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +52 -1
  807. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +91 -0
  808. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +26 -0
  809. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +4 -1
  810. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +1 -1
  811. package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +7 -2
  812. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +7 -2
  813. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +9 -6
  814. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +10 -0
  815. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +161 -27
  816. package/src/resources/extensions/gsd/tests/plan-task.test.ts +48 -5
  817. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +19 -0
  818. package/src/resources/extensions/gsd/tests/planning-layout-detect.test.ts +84 -0
  819. package/src/resources/extensions/gsd/tests/planning-marker.test.ts +107 -0
  820. package/src/resources/extensions/gsd/tests/planning-projection-hook.test.ts +123 -0
  821. package/src/resources/extensions/gsd/tests/planning-round-trip-property.test.ts +164 -0
  822. package/src/resources/extensions/gsd/tests/planning-writer.test.ts +82 -0
  823. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +48 -1
  824. package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +4 -2
  825. package/src/resources/extensions/gsd/tests/preferences.test.ts +47 -1
  826. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +54 -1
  827. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +50 -14
  828. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +58 -0
  829. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +23 -6
  830. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +301 -0
  831. package/src/resources/extensions/gsd/tests/read-uat-gate-verdict.test.ts +185 -0
  832. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +22 -13
  833. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +9 -8
  834. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +166 -4
  835. package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +103 -0
  836. package/src/resources/extensions/gsd/tests/replan-handler.test.ts +4 -4
  837. package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +20 -1
  838. package/src/resources/extensions/gsd/tests/round-trip-property.test.ts +137 -0
  839. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +15 -3
  840. package/src/resources/extensions/gsd/tests/session-lock-transient-read.test.ts +28 -2
  841. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +1 -0
  842. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +7 -1
  843. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +56 -0
  844. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +329 -57
  845. package/src/resources/extensions/gsd/tests/stop-backtrack.test.ts +6 -2
  846. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +85 -0
  847. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +23 -0
  848. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +29 -1
  849. package/src/resources/extensions/gsd/tests/terminal-tool-surface-classification.test.ts +80 -0
  850. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +208 -0
  851. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +32 -3
  852. package/src/resources/extensions/gsd/tests/tool-schema-model-fallback.test.ts +64 -0
  853. package/src/resources/extensions/gsd/tests/tool-search-shim.test.ts +71 -0
  854. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +26 -7
  855. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +23 -0
  856. package/src/resources/extensions/gsd/tests/undo.test.ts +113 -37
  857. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +212 -11
  858. package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +87 -0
  859. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +110 -1
  860. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +9 -1
  861. package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +130 -0
  862. package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +34 -6
  863. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +69 -4
  864. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +156 -0
  865. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +87 -0
  866. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +27 -0
  867. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +51 -0
  868. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +96 -15
  869. package/src/resources/extensions/gsd/tests/workflow-mcp-preflight.test.ts +134 -0
  870. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +42 -12
  871. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +3 -4
  872. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +70 -13
  873. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +151 -2
  874. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +43 -3
  875. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +65 -0
  876. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +39 -18
  877. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +4 -1
  878. package/src/resources/extensions/gsd/tests/write-gate.test.ts +103 -0
  879. package/src/resources/extensions/gsd/tool-surface-readiness.ts +226 -16
  880. package/src/resources/extensions/gsd/tools/complete-milestone.ts +7 -9
  881. package/src/resources/extensions/gsd/tools/complete-slice.ts +14 -11
  882. package/src/resources/extensions/gsd/tools/complete-task.ts +68 -16
  883. package/src/resources/extensions/gsd/tools/exec-tool.ts +7 -3
  884. package/src/resources/extensions/gsd/tools/plan-slice.ts +61 -50
  885. package/src/resources/extensions/gsd/tools/plan-task.ts +43 -2
  886. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +9 -10
  887. package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -13
  888. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +43 -4
  889. package/src/resources/extensions/gsd/triage-resolution.ts +14 -7
  890. package/src/resources/extensions/gsd/undo.ts +55 -15
  891. package/src/resources/extensions/gsd/unit-context-composer.ts +33 -7
  892. package/src/resources/extensions/gsd/unit-registry.ts +63 -9
  893. package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +101 -6
  894. package/src/resources/extensions/gsd/validation-block-guard.ts +59 -7
  895. package/src/resources/extensions/gsd/verification-gate.ts +8 -0
  896. package/src/resources/extensions/gsd/visualizer-data.ts +55 -0
  897. package/src/resources/extensions/gsd/visualizer-views.ts +27 -2
  898. package/src/resources/extensions/gsd/workflow-manifest.ts +141 -7
  899. package/src/resources/extensions/gsd/workflow-mcp.ts +12 -1
  900. package/src/resources/extensions/gsd/workflow-projections.ts +44 -18
  901. package/src/resources/extensions/gsd/workspace-git-preflight.ts +31 -0
  902. package/src/resources/extensions/gsd/worktree-command.ts +6 -6
  903. package/src/resources/extensions/gsd/worktree-health.ts +6 -3
  904. package/src/resources/extensions/gsd/worktree-manager.ts +72 -16
  905. package/src/resources/extensions/gsd/worktree-safety.ts +31 -11
  906. package/src/resources/extensions/mcp-client/manager.ts +3 -3
  907. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +0 -1
  908. package/dist/web/standalone/.next/static/chunks/796.e0bdc932325d7e03.js +0 -10
  909. package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +0 -1
  910. package/dist/web/standalone/.next/static/chunks/webpack-f0285ce91d4ec9ef.js +0 -1
  911. /package/dist/web/standalone/.next/static/{Mh74c-rhxHjKHKoRwd2ij → zQLcXm0Za8lexoXtgDpMG}/_buildManifest.js +0 -0
  912. /package/dist/web/standalone/.next/static/{Mh74c-rhxHjKHKoRwd2ij → zQLcXm0Za8lexoXtgDpMG}/_ssgManifest.js +0 -0
@@ -7,7 +7,6 @@ import { getGateIdsForTurn } from "../gate-registry.js";
7
7
  import { transaction, getMilestone, getSlice, getSliceTasks, insertTask, upsertSlicePlanning, upsertTaskPlanning, insertGateRow, updateSliceStatus, setSliceSketchFlag, deleteTask, deleteArtifactByPath, } from "../gsd-db.js";
8
8
  import { invalidateStateCache } from "../state.js";
9
9
  import { renderPlanFromDb } from "../markdown-renderer.js";
10
- import { flushWorkflowProjections } from "../projection-flush.js";
11
10
  import { writeManifest } from "../workflow-manifest.js";
12
11
  import { appendEvent } from "../workflow-events.js";
13
12
  import { logWarning } from "../workflow-logger.js";
@@ -29,9 +28,13 @@ function validateRepositoryTargetIds(field, value) {
29
28
  return deduped;
30
29
  }
31
30
  function validateTasks(value) {
32
- if (!Array.isArray(value) || value.length === 0) {
33
- throw new Error("tasks must be a non-empty array");
31
+ if (value === undefined)
32
+ return undefined;
33
+ if (!Array.isArray(value)) {
34
+ throw new Error("tasks must be an array");
34
35
  }
36
+ if (value.length === 0)
37
+ return undefined;
35
38
  const seen = new Set();
36
39
  return value.map((entry, index) => {
37
40
  if (!entry || typeof entry !== "object") {
@@ -130,7 +133,7 @@ function validateReferencedRepositories(params, registry, defaultTargets) {
130
133
  };
131
134
  for (const id of params.targetRepositories ?? defaultTargets)
132
135
  noteMissing(id);
133
- for (const task of params.tasks) {
136
+ for (const task of params.tasks ?? []) {
134
137
  for (const id of task.targetRepositories ?? params.targetRepositories ?? defaultTargets)
135
138
  noteMissing(id);
136
139
  }
@@ -142,7 +145,7 @@ function resolveAllowedRootsForPathScope(params, registry, defaultTargets) {
142
145
  const requested = new Set();
143
146
  for (const id of params.targetRepositories ?? defaultTargets)
144
147
  requested.add(id);
145
- for (const task of params.tasks) {
148
+ for (const task of params.tasks ?? []) {
146
149
  for (const id of task.targetRepositories ?? params.targetRepositories ?? defaultTargets)
147
150
  requested.add(id);
148
151
  }
@@ -154,7 +157,7 @@ function resolveAllowedRootsForPathScope(params, registry, defaultTargets) {
154
157
  return roots.length > 0 ? roots : [registry.projectRoot];
155
158
  }
156
159
  function toTaskRows(params, defaultTargets) {
157
- return params.tasks.map((task, index) => ({
160
+ return (params.tasks ?? []).map((task, index) => ({
158
161
  milestone_id: params.milestoneId,
159
162
  slice_id: params.sliceId,
160
163
  id: task.taskId,
@@ -231,19 +234,21 @@ export async function handlePlanSlice(rawParams, basePath) {
231
234
  return { error: `validation failed: ${message}` };
232
235
  }
233
236
  const defaultTargets = defaultRepositoryTargets(repositoryRegistry);
237
+ const taskPayload = params.tasks ?? [];
238
+ const hasTaskPayload = taskPayload.length > 0;
234
239
  const repoValidationError = validateReferencedRepositories(params, repositoryRegistry, defaultTargets);
235
240
  if (repoValidationError) {
236
241
  return { error: `validation failed: ${repoValidationError}` };
237
242
  }
238
243
  const allowedAbsoluteRoots = resolveAllowedRootsForPathScope(params, repositoryRegistry, defaultTargets);
239
- const pathOnlyError = validatePathOnlyPlanningFields(params.tasks.map((task, index) => ({
244
+ const pathOnlyError = validatePathOnlyPlanningFields(taskPayload.map((task, index) => ({
240
245
  field: `tasks[${index}].expectedOutput`,
241
246
  values: task.expectedOutput,
242
247
  })));
243
248
  if (pathOnlyError) {
244
249
  return { error: `validation failed: ${pathOnlyError}` };
245
250
  }
246
- const pathScopeError = validatePlanningPathScope(basePath, params.tasks.flatMap((task, index) => [
251
+ const pathScopeError = validatePlanningPathScope(basePath, taskPayload.flatMap((task, index) => [
247
252
  { field: `tasks[${index}].files`, values: task.files },
248
253
  { field: `tasks[${index}].inputs`, values: task.inputs },
249
254
  { field: `tasks[${index}].expectedOutput`, values: task.expectedOutput },
@@ -280,15 +285,17 @@ export async function handlePlanSlice(rawParams, basePath) {
280
285
  guardError = `cannot re-plan slice ${params.sliceId}: it is already complete — use gsd_slice_reopen first`;
281
286
  return;
282
287
  }
283
- const newTaskIds = new Set(params.tasks.map((task) => task.taskId));
288
+ const newTaskIds = new Set(taskPayload.map((task) => task.taskId));
284
289
  const existingTasks = getSliceTasks(params.milestoneId, params.sliceId);
285
- omittedTaskIds = existingTasks
286
- .filter((task) => !newTaskIds.has(task.id))
287
- .map((task) => task.id);
288
- for (const task of existingTasks) {
289
- if (!newTaskIds.has(task.id) && isClosedStatus(task.status)) {
290
- guardError = `cannot remove completed task ${task.id}`;
291
- return;
290
+ if (hasTaskPayload) {
291
+ omittedTaskIds = existingTasks
292
+ .filter((task) => !newTaskIds.has(task.id))
293
+ .map((task) => task.id);
294
+ for (const task of existingTasks) {
295
+ if (!newTaskIds.has(task.id) && isClosedStatus(task.status)) {
296
+ guardError = `cannot remove completed task ${task.id}`;
297
+ return;
298
+ }
292
299
  }
293
300
  }
294
301
  if (isDeferredStatus(parentSlice.status)) {
@@ -302,34 +309,36 @@ export async function handlePlanSlice(rawParams, basePath) {
302
309
  observabilityImpact: params.observabilityImpact,
303
310
  targetRepositories: params.targetRepositories ?? defaultTargets,
304
311
  });
305
- for (const taskId of omittedTaskIds) {
306
- deleteTask(params.milestoneId, params.sliceId, taskId);
307
- }
308
- const existingTaskById = new Map(existingTasks.map((task) => [task.id, task]));
309
- for (const task of params.tasks) {
310
- const planning = {
311
- title: task.title,
312
- description: task.description,
313
- estimate: task.estimate,
314
- files: task.files,
315
- verify: task.verify,
316
- inputs: task.inputs,
317
- expectedOutput: task.expectedOutput,
318
- observabilityImpact: task.observabilityImpact ?? "",
319
- fullPlanMd: task.fullPlanMd,
320
- targetRepositories: task.targetRepositories ?? params.targetRepositories ?? defaultTargets,
321
- };
322
- const existingTask = existingTaskById.get(task.taskId);
323
- if (!existingTask || !isClosedStatus(existingTask.status)) {
324
- insertTask({
325
- id: task.taskId,
326
- sliceId: params.sliceId,
327
- milestoneId: params.milestoneId,
312
+ if (hasTaskPayload) {
313
+ for (const taskId of omittedTaskIds) {
314
+ deleteTask(params.milestoneId, params.sliceId, taskId);
315
+ }
316
+ const existingTaskById = new Map(existingTasks.map((task) => [task.id, task]));
317
+ for (const task of taskPayload) {
318
+ const planning = {
328
319
  title: task.title,
329
- status: "pending",
330
- });
320
+ description: task.description,
321
+ estimate: task.estimate,
322
+ files: task.files,
323
+ verify: task.verify,
324
+ inputs: task.inputs,
325
+ expectedOutput: task.expectedOutput,
326
+ observabilityImpact: task.observabilityImpact ?? "",
327
+ fullPlanMd: task.fullPlanMd,
328
+ targetRepositories: task.targetRepositories ?? params.targetRepositories ?? defaultTargets,
329
+ };
330
+ const existingTask = existingTaskById.get(task.taskId);
331
+ if (!existingTask || !isClosedStatus(existingTask.status)) {
332
+ insertTask({
333
+ id: task.taskId,
334
+ sliceId: params.sliceId,
335
+ milestoneId: params.milestoneId,
336
+ title: task.title,
337
+ status: "pending",
338
+ });
339
+ }
340
+ upsertTaskPlanning(params.milestoneId, params.sliceId, task.taskId, planning);
331
341
  }
332
- upsertTaskPlanning(params.milestoneId, params.sliceId, task.taskId, planning);
333
342
  }
334
343
  // Seed quality gate rows inside the transaction — all-or-nothing with
335
344
  // the plan data so a crash can't leave orphaned gates without tasks.
@@ -338,7 +347,7 @@ export async function handlePlanSlice(rawParams, basePath) {
338
347
  insertGateRow({ milestoneId: params.milestoneId, sliceId: params.sliceId, gateId: gid, scope: "slice" });
339
348
  }
340
349
  const taskGates = resolveTaskGates(gateEvaluation);
341
- for (const task of params.tasks) {
350
+ for (const task of taskPayload) {
342
351
  for (const gid of taskGates) {
343
352
  insertGateRow({ milestoneId: params.milestoneId, sliceId: params.sliceId, gateId: gid, scope: "task", taskId: task.taskId });
344
353
  }
@@ -361,13 +370,17 @@ export async function handlePlanSlice(rawParams, basePath) {
361
370
  const artifactPath = relative(gsdProjectionRoot(basePath), taskPlanPath).replace(/\\/g, "/");
362
371
  deleteArtifactByPath(artifactPath);
363
372
  }
364
- const renderResult = await renderPlanFromDb(basePath, params.milestoneId, params.sliceId);
365
- setSliceSketchFlag(params.milestoneId, params.sliceId, false);
373
+ const sliceTasks = getSliceTasks(params.milestoneId, params.sliceId);
374
+ const renderResult = sliceTasks.length === 0
375
+ ? { planPath: "", taskPlanPaths: [] }
376
+ : await renderPlanFromDb(basePath, params.milestoneId, params.sliceId);
377
+ if (sliceTasks.length > 0) {
378
+ setSliceSketchFlag(params.milestoneId, params.sliceId, false);
379
+ }
366
380
  invalidateStateCache();
367
381
  clearParseCache();
368
- // ── Post-mutation hook: projections, manifest, event log ─────────────
382
+ // ── Post-mutation hook: manifest, event log ─────────────────────────
369
383
  try {
370
- await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
371
384
  writeManifest(basePath);
372
385
  appendEvent(basePath, {
373
386
  cmd: "plan-slice",
@@ -1,13 +1,16 @@
1
1
  import { clearParseCache } from "../files.js";
2
2
  import { isClosedStatus } from "../status-guards.js";
3
3
  import { isNonEmptyString, validateStringArray } from "../validation.js";
4
- import { transaction, getSlice, getTask, insertTask, upsertTaskPlanning } from "../gsd-db.js";
4
+ import { getGateIdsForTurn } from "../gate-registry.js";
5
+ import { transaction, getSlice, getTask, insertTask, upsertTaskPlanning, insertGateRow, setSliceSketchFlag } from "../gsd-db.js";
5
6
  import { invalidateStateCache } from "../state.js";
6
- import { renderTaskPlanFromDb } from "../markdown-renderer.js";
7
+ import { renderTaskPlanFromDb, renderPlanFromDb } from "../markdown-renderer.js";
8
+ import { resolveTasksDir } from "../paths.js";
7
9
  import { flushWorkflowProjections } from "../projection-flush.js";
8
10
  import { writeManifest } from "../workflow-manifest.js";
9
11
  import { appendEvent } from "../workflow-events.js";
10
12
  import { logWarning } from "../workflow-logger.js";
13
+ import { loadEffectiveGSDPreferences } from "../preferences.js";
11
14
  import { validatePathOnlyPlanningFields, validatePlanningPathScope } from "../planning-path-scope.js";
12
15
  function validateParams(params) {
13
16
  if (!isNonEmptyString(params?.milestoneId))
@@ -34,6 +37,12 @@ function validateParams(params) {
34
37
  expectedOutput: validateStringArray(params.expectedOutput, "expectedOutput"),
35
38
  };
36
39
  }
40
+ function resolveTaskGates(basePath) {
41
+ const loaded = loadEffectiveGSDPreferences(basePath);
42
+ if (loaded?.preferences?.gate_evaluation?.task_gates === false)
43
+ return [];
44
+ return [...getGateIdsForTurn("execute-task")];
45
+ }
37
46
  export async function handlePlanTask(rawParams, basePath) {
38
47
  let params;
39
48
  try {
@@ -56,6 +65,14 @@ export async function handlePlanTask(rawParams, basePath) {
56
65
  if (pathScopeError) {
57
66
  return { error: `validation failed: ${pathScopeError}` };
58
67
  }
68
+ let taskGates;
69
+ try {
70
+ taskGates = resolveTaskGates(basePath);
71
+ }
72
+ catch (err) {
73
+ const message = err instanceof Error ? err.message : String(err);
74
+ return { error: `validation failed: ${message}` };
75
+ }
59
76
  // ── Guards + DB writes inside a single transaction (prevents TOCTOU) ───
60
77
  // Guards must be inside the transaction so the state they check cannot
61
78
  // change between the read and the write (#2723).
@@ -96,6 +113,9 @@ export async function handlePlanTask(rawParams, basePath) {
96
113
  observabilityImpact: params.observabilityImpact ?? "",
97
114
  fullPlanMd: params.fullPlanMd,
98
115
  });
116
+ for (const gid of taskGates) {
117
+ insertGateRow({ milestoneId: params.milestoneId, sliceId: params.sliceId, gateId: gid, scope: "task", taskId: params.taskId });
118
+ }
99
119
  });
100
120
  }
101
121
  catch (err) {
@@ -106,6 +126,24 @@ export async function handlePlanTask(rawParams, basePath) {
106
126
  }
107
127
  try {
108
128
  const renderResult = await renderTaskPlanFromDb(basePath, params.milestoneId, params.sliceId, params.taskId);
129
+ // Flat-phase: tasks live as checkboxes in the slice plan's <tasks> block,
130
+ // not as standalone TID-PLAN.md files. Re-render the slice plan so the
131
+ // new/updated task appears in the plan file that gsd-core reads.
132
+ // Guard: resolveTasksDir is null in flat-phase (no tasks/ subdir exists).
133
+ let slicePlanSynced = false;
134
+ try {
135
+ const tDir = resolveTasksDir(basePath, params.milestoneId, params.sliceId);
136
+ if (!tDir) {
137
+ await renderPlanFromDb(basePath, params.milestoneId, params.sliceId);
138
+ slicePlanSynced = true;
139
+ }
140
+ }
141
+ catch (syncErr) {
142
+ logWarning("tool", `plan-task: slice-plan sync failed: ${syncErr.message}`);
143
+ }
144
+ if (slicePlanSynced) {
145
+ setSliceSketchFlag(params.milestoneId, params.sliceId, false);
146
+ }
109
147
  invalidateStateCache();
110
148
  clearParseCache();
111
149
  // ── Post-mutation hook: projections, manifest, event log ─────────────
@@ -1,5 +1,6 @@
1
1
  import { join } from "node:path";
2
2
  import { existsSync, unlinkSync } from "node:fs";
3
+ import { relSliceFile, relMilestoneFile } from "../paths.js";
3
4
  import { clearParseCache } from "../files.js";
4
5
  import { isClosedStatus } from "../status-guards.js";
5
6
  import { isNonEmptyString } from "../validation.js";
@@ -74,8 +75,9 @@ export async function handleReassessRoadmap(rawParams, basePath) {
74
75
  return { error: `validation failed: ${err.message}` };
75
76
  }
76
77
  // ── Compute assessment artifact path ──────────────────────────────
77
- // Assessment lives in the completed slice's directory
78
- const assessmentRelPath = join(".gsd", "milestones", params.milestoneId, "slices", params.completedSliceId, `${params.completedSliceId}-ASSESSMENT.md`);
78
+ // Assessment lives in the completed slice's directory.
79
+ // Use relSliceFile so the path is layout-aware (flat-phase or legacy).
80
+ const assessmentRelPath = relSliceFile(basePath, params.milestoneId, params.completedSliceId, "ASSESSMENT");
79
81
  // ── Guards + DB writes inside a single transaction (prevents TOCTOU) ───
80
82
  // Guards must be inside the transaction so the state they check cannot
81
83
  // change between the read and the write (#2723).
@@ -210,6 +212,9 @@ export async function handleReassessRoadmap(rawParams, basePath) {
210
212
  // ── Render artifacts ──────────────────────────────────────────────
211
213
  try {
212
214
  const roadmapResult = await renderRoadmapFromDb(basePath, params.milestoneId);
215
+ if ("skipped" in roadmapResult) {
216
+ return { error: `roadmap render skipped: milestone ${params.milestoneId} has no planned slices` };
217
+ }
213
218
  const assessmentResult = await renderAssessmentFromDb(basePath, params.milestoneId, params.completedSliceId, {
214
219
  verdict: params.verdict,
215
220
  assessment: params.assessment,
@@ -220,7 +225,8 @@ export async function handleReassessRoadmap(rawParams, basePath) {
220
225
  params.sliceChanges.modified.length > 0 ||
221
226
  params.sliceChanges.removed.length > 0;
222
227
  if (hasStructuralChanges) {
223
- const validationFile = join(basePath, ".gsd", "milestones", params.milestoneId, `${params.milestoneId}-VALIDATION.md`);
228
+ // Layout-aware: flat-phase phases/NN-slug/NN-VALIDATION.md; legacy milestones/MID/MID-VALIDATION.md
229
+ const validationFile = join(basePath, relMilestoneFile(basePath, params.milestoneId, "VALIDATION"));
224
230
  try {
225
231
  if (existsSync(validationFile))
226
232
  unlinkSync(validationFile);
@@ -12,7 +12,7 @@
12
12
  */
13
13
  import { join } from "node:path";
14
14
  import { transaction, insertAssessment, getMilestoneSlices, getMilestone, } from "../gsd-db.js";
15
- import { gsdProjectionRoot, clearPathCache } from "../paths.js";
15
+ import { clearPathCache, relMilestoneFile } from "../paths.js";
16
16
  import { resolveCanonicalMilestoneRoot } from "../worktree-manager.js";
17
17
  import { resolveWorktreeProjectRoot } from "../worktree-root.js";
18
18
  import { saveFile, clearParseCache } from "../files.js";
@@ -113,7 +113,11 @@ export async function handleValidateMilestone(params, basePath, opts) {
113
113
  // worktree exists for this milestone, validation reads/writes the
114
114
  // worktree's artifacts instead of stale project-root state.
115
115
  const validationMd = renderValidationMarkdown(effectiveParams);
116
- const validationPath = join(gsdProjectionRoot(artifactBasePath), "milestones", effectiveParams.milestoneId, `${effectiveParams.milestoneId}-VALIDATION.md`);
116
+ // Layout-aware: flat-phase phases/NN-slug/NN-VALIDATION.md;
117
+ // legacy → milestones/MID/MID-VALIDATION.md.
118
+ // join(artifactBasePath, relMilestoneFile) gives the absolute path; relMilestoneFile
119
+ // returns ".gsd/..."-relative so joining with basePath (project/worktree root) is correct.
120
+ const validationPath = join(artifactBasePath, relMilestoneFile(artifactBasePath, effectiveParams.milestoneId, "VALIDATION"));
117
121
  // ── DB write first — matches complete-task/complete-slice pattern ───
118
122
  // Write DB before disk so a crash between the two leaves a recoverable
119
123
  // state: the DB row exists but the file is missing, which projection
@@ -143,7 +147,8 @@ export async function handleValidateMilestone(params, basePath, opts) {
143
147
  await saveFile(validationPath, validationMd);
144
148
  const projectRoot = resolveWorktreeProjectRoot(basePath);
145
149
  if (projectRoot !== artifactBasePath) {
146
- const projectValidationPath = join(gsdProjectionRoot(projectRoot), "milestones", effectiveParams.milestoneId, `${effectiveParams.milestoneId}-VALIDATION.md`);
150
+ // Mirror to project root using the project root's layout (same logic as above).
151
+ const projectValidationPath = join(projectRoot, relMilestoneFile(projectRoot, effectiveParams.milestoneId, "VALIDATION"));
147
152
  try {
148
153
  await saveFile(projectValidationPath, validationMd);
149
154
  }
@@ -3,10 +3,11 @@
3
3
  import { ensureDbOpen } from "../bootstrap/dynamic-tools.js";
4
4
  import { sanitizeCompleteMilestoneParams } from "../bootstrap/sanitize-complete-milestone.js";
5
5
  import { loadWriteGateSnapshot, shouldBlockContextArtifactSaveInSnapshot, shouldBlockRootArtifactSaveInSnapshot } from "../bootstrap/write-gate.js";
6
- import { getActiveRequirements, getAllMilestones, getMilestone, getSliceStatusSummary, getSliceTaskCounts, insertMilestone, insertAssessment, insertGateRun, readTransaction, saveGateResult, upsertQualityGate, } from "../gsd-db.js";
6
+ import { getActiveRequirements, getAllMilestones, getMilestone, getSliceStatusSummary, getSliceTaskCounts, insertMilestone, insertAssessment, insertGateRun, readTransaction, saveGateResult, upsertMilestonePlanning, upsertQualityGate, } from "../gsd-db.js";
7
+ import { extractMilestoneSeq } from "../milestone-ids.js";
7
8
  import { GATE_REGISTRY } from "../gate-registry.js";
8
9
  import { generateRequirementsMd, saveArtifactToDb } from "../db-writer.js";
9
- import { clearPathCache, normalizeRealPath, relSliceFile, resolveGsdPathContract, resolveMilestoneFile, resolveSliceFile } from "../paths.js";
10
+ import { clearPathCache, normalizeRealPath, relMilestoneFile, relSliceFile, relSlicePath, resolveGsdPathContract, resolveMilestoneFile, resolveSliceFile } from "../paths.js";
10
11
  import { saveFile, clearParseCache } from "../files.js";
11
12
  import { unlinkSync } from "node:fs";
12
13
  import { hostname } from "node:os";
@@ -80,7 +81,35 @@ function milestoneLeaseConflictResult(milestoneId, byWorker, expiresAt) {
80
81
  function registerProjectMilestoneSequence(content) {
81
82
  const parsed = parseProject(content);
82
83
  const registered = [];
84
+ // Reconcile parsed IDs against existing DB milestones before inserting (#807).
85
+ // Under unique_milestone_ids the planner mints suffixed IDs (e.g. "M001-b1nole"),
86
+ // while PROJECT.md's template uses bare sequence IDs (e.g. "M001"). Inserting the
87
+ // bare ID verbatim mints a phantom milestone row that collides with the planner's
88
+ // canonical one: the bare row gets its own git worktree, and at dispatch time the
89
+ // worktree/session scope ("M001") disagrees with ctx.mid ("M001-b1nole"), pausing
90
+ // auto-mode with "Dispatch milestone mismatch". A project DB holds at most one
91
+ // milestone per sequence number, so map each parsed line onto the existing row
92
+ // that shares its sequence number instead of minting a duplicate bare-ID row.
93
+ const existingBySeq = new Map();
94
+ for (const existing of getAllMilestones()) {
95
+ const seq = extractMilestoneSeq(existing.id);
96
+ if (seq > 0 && !existingBySeq.has(seq))
97
+ existingBySeq.set(seq, existing.id);
98
+ }
83
99
  for (const milestone of parsed.milestones) {
100
+ const canonicalId = existingBySeq.get(extractMilestoneSeq(milestone.id));
101
+ if (canonicalId && canonicalId !== milestone.id) {
102
+ // An existing milestone already owns this sequence number. Treat the markdown
103
+ // line as referring to it: refresh the human title, and promote to complete
104
+ // when the line is checked — but never demote an in-flight milestone back to
105
+ // "queued" (the planner's row stays the single source of truth).
106
+ upsertMilestonePlanning(canonicalId, {
107
+ title: milestone.title,
108
+ ...(milestone.done ? { status: "complete" } : {}),
109
+ });
110
+ registered.push(canonicalId);
111
+ continue;
112
+ }
84
113
  insertMilestone({
85
114
  id: milestone.id,
86
115
  title: milestone.title,
@@ -270,13 +299,23 @@ export async function executeSummarySave(params, basePath = process.cwd()) {
270
299
  relativePath = "REQUIREMENTS-DRAFT.md";
271
300
  }
272
301
  else if (params.task_id && params.slice_id) {
273
- relativePath = `milestones/${params.milestone_id}/slices/${params.slice_id}/tasks/${params.task_id}-${params.artifact_type}.md`;
302
+ // Layout-aware path for task-scoped artifacts.
303
+ // Flat-phase: <phaseDir>/TID-TYPE.md Legacy: milestones/MID/slices/SID/tasks/TID-TYPE.md
304
+ // relSlicePath returns ".gsd/phases/NN-slug" (flat) or ".gsd/milestones/MID/slices/SID" (legacy).
305
+ const sRel = relSlicePath(basePath, params.milestone_id, params.slice_id).replace(/^\.gsd\//, "");
306
+ relativePath = sRel.startsWith("milestones/")
307
+ ? `${sRel}/tasks/${params.task_id}-${params.artifact_type}.md`
308
+ : `${sRel}/${params.task_id}-${params.artifact_type}.md`;
274
309
  }
275
310
  else if (params.slice_id) {
276
- relativePath = `milestones/${params.milestone_id}/slices/${params.slice_id}/${params.slice_id}-${params.artifact_type}.md`;
311
+ // Layout-aware path for slice-scoped artifacts.
312
+ // relSliceFile returns ".gsd/..." prefix — strip it to get the DB-relative path.
313
+ relativePath = relSliceFile(basePath, params.milestone_id, params.slice_id, params.artifact_type).replace(/^\.gsd\//, "");
277
314
  }
278
315
  else {
279
- relativePath = `milestones/${params.milestone_id}/${params.milestone_id}-${params.artifact_type}.md`;
316
+ // Layout-aware path for milestone-scoped artifacts.
317
+ // relMilestoneFile returns ".gsd/..." prefix — strip it to get the DB-relative path.
318
+ relativePath = relMilestoneFile(basePath, params.milestone_id, params.artifact_type).replace(/^\.gsd\//, "");
280
319
  }
281
320
  const activeRequirements = params.artifact_type === "REQUIREMENTS"
282
321
  ? getActiveRequirements()
@@ -13,7 +13,7 @@ import { existsSync, mkdirSync, readFileSync, unlinkSync } from "node:fs";
13
13
  import { atomicWriteSync } from "./atomic-write.js";
14
14
  import { join } from "node:path";
15
15
  import { createRequire } from "node:module";
16
- import { gsdRoot, milestonesDir } from "./paths.js";
16
+ import { gsdRoot, milestonesDir, legacyMilestonesDir, resolveMilestonePath } from "./paths.js";
17
17
  import { MILESTONE_ID_RE } from "./milestone-ids.js";
18
18
  import { loadAllCaptures, loadActionableCaptures, markCaptureExecuted, stampCaptureMilestone, } from "./captures.js";
19
19
  // ─── Resolution Executors ─────────────────────────────────────────────────────
@@ -149,8 +149,9 @@ export function executeBacktrack(basePath, currentMilestoneId, capture) {
149
149
  // so deriveState() will re-enter it as the active milestone.
150
150
  if (targetMilestoneId) {
151
151
  try {
152
- const targetDir = join(milestonesDir(basePath), targetMilestoneId);
153
- if (existsSync(targetDir)) {
152
+ // Use resolveMilestonePath to locate the dir in either legacy or flat-phase layout.
153
+ const targetDir = resolveMilestonePath(basePath, targetMilestoneId);
154
+ if (targetDir && existsSync(targetDir)) {
154
155
  // Write a regression marker so the state machine knows this milestone
155
156
  // needs re-discussion, not just re-execution
156
157
  const regressionPath = join(targetDir, `${targetMilestoneId}-REGRESSION.md`);
@@ -270,9 +271,14 @@ export function detectFileOverlap(affectedFiles, planContent) {
270
271
  export function ensureDeferMilestoneDir(basePath, targetMilestone, captures) {
271
272
  if (!MILESTONE_ID_RE.test(targetMilestone))
272
273
  return false;
273
- const msDir = join(milestonesDir(basePath), targetMilestone);
274
- if (existsSync(msDir))
274
+ // Check if the milestone dir already exists in either layout.
275
+ const existingDir = resolveMilestonePath(basePath, targetMilestone);
276
+ if (existingDir && existsSync(existingDir))
275
277
  return true;
278
+ // Create new dir in the layout-appropriate location.
279
+ const legacyBase = legacyMilestonesDir(basePath);
280
+ const msBase = existsSync(legacyBase) ? legacyBase : milestonesDir(basePath);
281
+ const msDir = join(msBase, targetMilestone);
276
282
  try {
277
283
  mkdirSync(msDir, { recursive: true });
278
284
  // Seed CONTEXT-DRAFT.md with deferred capture context
@@ -389,8 +395,9 @@ export function executeTriageResolutions(basePath, mid, sid) {
389
395
  }
390
396
  }
391
397
  for (const [milestoneId, captures] of byMilestone) {
392
- const msDir = join(milestonesDir(basePath), milestoneId);
393
- if (!existsSync(msDir)) {
398
+ // Use resolveMilestonePath to check existence in either layout.
399
+ const existingMs = resolveMilestonePath(basePath, milestoneId);
400
+ if (!existingMs || !existsSync(existingMs)) {
394
401
  const created = ensureDeferMilestoneDir(basePath, milestoneId, captures);
395
402
  if (created) {
396
403
  result.deferredMilestones++;
@@ -9,10 +9,11 @@ import { atomicWriteSync } from "./atomic-write.js";
9
9
  import { parseUnitId } from "./unit-id.js";
10
10
  import { deriveState } from "./state.js";
11
11
  import { invalidateAllCaches } from "./cache.js";
12
- import { gsdRoot, resolveTasksDir, resolveSlicePath, resolveTaskFile, buildTaskFileName, buildSliceFileName } from "./paths.js";
12
+ import { gsdRoot, resolveTasksDir, resolveSlicePath, resolveSliceFile, resolveTaskFile, buildTaskFileName } from "./paths.js";
13
13
  import { sendDesktopNotification } from "./notifications.js";
14
14
  import { getTask, getSlice, getSliceTasks, updateTaskStatus, resetSliceCascade } from "./gsd-db.js";
15
15
  import { renderPlanCheckboxes, renderRoadmapCheckboxes } from "./markdown-renderer.js";
16
+ import { UNIT_REGISTRY } from "./unit-registry.js";
16
17
  /**
17
18
  * Undo the last completed unit: revert git commits,
18
19
  * delete summary artifacts, and uncheck the task in PLAN.
@@ -35,15 +36,19 @@ export async function handleUndo(args, ctx, _pi, basePath) {
35
36
  ctx.ui.notify("Nothing to undo — no activity logs found.", "info");
36
37
  return;
37
38
  }
38
- // Extract unit type and ID from the most recent activity log filename
39
- // Format: <seq>-<unitType>-<unitId>.jsonl
40
- const match = files[0].match(/^\d+-(.+?)-(.+)\.jsonl$/);
41
- if (!match) {
39
+ // Extract unit type and ID from the most recent activity log filename.
40
+ // Both the unit type and the unit ID may contain hyphens, so anchor on the
41
+ // known unit-type vocabulary instead of guessing the unit-ID shape: a regex
42
+ // tuned to milestone-shaped IDs rejects project-level units whose IDs are
43
+ // symbolic (e.g. discuss-project uses PROJECT, workflow-preferences uses
44
+ // WORKFLOW-PREFS).
45
+ const parsed = parseActivityLogFilename(files[0]);
46
+ if (!parsed) {
42
47
  ctx.ui.notify("Nothing to undo — could not parse latest activity log.", "warning");
43
48
  return;
44
49
  }
45
- const unitType = match[1];
46
- const unitId = match[2].replace(/-/g, "/");
50
+ const unitType = parsed.unitType;
51
+ const unitId = parsed.unitId.replace(/-/g, "/");
47
52
  if (!force) {
48
53
  ctx.ui.notify(`Will undo: ${unitType} (${unitId})\n` +
49
54
  `This will:\n` +
@@ -87,6 +92,11 @@ export async function handleUndo(args, ctx, _pi, basePath) {
87
92
  if (unitType === "execute-task" && task !== undefined && slice !== undefined) {
88
93
  const [mid, sid, tid] = [milestone, slice, task];
89
94
  planUpdated = uncheckTaskInPlan(basePath, mid, sid, tid);
95
+ if (getTask(mid, sid, tid)) {
96
+ updateTaskStatus(mid, sid, tid, "pending");
97
+ await renderPlanCheckboxes(basePath, mid, sid);
98
+ planUpdated = true;
99
+ }
90
100
  }
91
101
  // 3. Try to revert git commits from activity log
92
102
  let commitsReverted = 0;
@@ -291,15 +301,14 @@ export async function handleResetSlice(args, ctx, _pi, basePath) {
291
301
  }
292
302
  }
293
303
  // Delete slice summary and UAT files
304
+ // Use resolveSliceFile so the legacy S01-SUMMARY.md filename is found even
305
+ // when buildSliceFileName now returns the flat-phase 01-SUMMARY.md format.
294
306
  let sliceFilesDeleted = 0;
295
- const slicePath = resolveSlicePath(basePath, mid, sid);
296
- if (slicePath) {
297
- for (const suffix of ["SUMMARY", "UAT"]) {
298
- const filePath = join(slicePath, buildSliceFileName(sid, suffix));
299
- if (existsSync(filePath)) {
300
- unlinkSync(filePath);
301
- sliceFilesDeleted++;
302
- }
307
+ for (const suffix of ["SUMMARY", "UAT"]) {
308
+ const filePath = resolveSliceFile(basePath, mid, sid, suffix);
309
+ if (filePath && existsSync(filePath)) {
310
+ unlinkSync(filePath);
311
+ sliceFilesDeleted++;
303
312
  }
304
313
  }
305
314
  // Re-render plan + roadmap checkboxes
@@ -319,6 +328,33 @@ export async function handleResetSlice(args, ctx, _pi, basePath) {
319
328
  ctx.ui.notify(results.join("\n"), "success");
320
329
  }
321
330
  // ─── Helpers ──────────────────────────────────────────────────────────────────
331
+ // Known unit types sorted longest-first so a more specific type (e.g.
332
+ // "execute-task-simple") matches before a prefix of it ("execute-task") when
333
+ // splitting "<seq>-<unitType>-<unitId>.jsonl".
334
+ const UNIT_TYPES_BY_LENGTH_DESC = Object.keys(UNIT_REGISTRY).sort((a, b) => b.length - a.length);
335
+ /**
336
+ * Parse an activity-log filename of the form `<seq>-<unitType>-<unitId>.jsonl`
337
+ * (the format written by activity-log.ts). Both the unit type and the unit ID
338
+ * may contain hyphens, so we anchor on the known unit-type vocabulary rather
339
+ * than guessing the ID shape. This keeps non-milestone IDs (e.g. PROJECT,
340
+ * WORKFLOW-PREFS) parseable. Returns null when the name has no sequence prefix
341
+ * or does not start with a recognised unit type.
342
+ */
343
+ export function parseActivityLogFilename(filename) {
344
+ const seqMatch = filename.match(/^\d+-(.+)\.jsonl$/);
345
+ if (!seqMatch)
346
+ return null;
347
+ const rest = seqMatch[1];
348
+ for (const unitType of UNIT_TYPES_BY_LENGTH_DESC) {
349
+ const prefix = `${unitType}-`;
350
+ if (rest.startsWith(prefix)) {
351
+ const unitId = rest.slice(prefix.length);
352
+ if (unitId.length > 0)
353
+ return { unitType, unitId };
354
+ }
355
+ }
356
+ return null;
357
+ }
322
358
  export function uncheckTaskInPlan(basePath, mid, sid, tid) {
323
359
  const slicePath = resolveSlicePath(basePath, mid, sid);
324
360
  if (!slicePath)
@@ -92,13 +92,27 @@ const CONTEXT_MODE_GUIDANCE_BY_LANE = {
92
92
  orchestration: "Use `gsd_resume` before resuming orchestration, `gsd_exec_search` to reuse prior runs, and `gsd_exec` for noisy coordination checks.",
93
93
  docs: "Use `gsd_resume` for prior context, `gsd_exec_search` for saved evidence, and `gsd_exec` for noisy doc validation commands.",
94
94
  };
95
- // Per-unit overrides win over the lane default. run-uat's tool contract
96
- // forbids `gsd_exec`/`gsd_exec_search` (acceptance evidence must flow through
97
- // `gsd_uat_exec`) and Claude Code dispatch strips the tools entirely, so the
98
- // shared verification-lane guidance would steer the agent into calling an
99
- // unavailable tool.
100
- const CONTEXT_MODE_GUIDANCE_BY_UNIT = {
95
+ // Per-unit overrides win over the lane default. Some units intentionally run
96
+ // with narrower tool contracts than their shared Context Mode lane, so their
97
+ // guidance must name only tools the unit can actually call.
98
+ export const CONTEXT_MODE_GUIDANCE_BY_UNIT = {
99
+ "discuss-milestone": "Use `ask_user_questions` to continue the milestone interview, then persist outcomes with `gsd_summary_save`, `gsd_decision_save`, `gsd_requirement_save`, `gsd_requirement_update`, `gsd_plan_milestone`, or `gsd_milestone_generate_id` as appropriate.",
100
+ "discuss-slice": "Use `ask_user_questions` to continue the slice interview, then persist outcomes with `gsd_summary_save` or `gsd_decision_save` as appropriate.",
101
+ "discuss-project": "Use `ask_user_questions` to continue the project interview, then persist outcomes with `gsd_summary_save`, `gsd_decision_save`, or `gsd_requirement_save` as appropriate.",
102
+ "discuss-requirements": "Use `ask_user_questions` to continue the requirements interview, then persist outcomes with `gsd_requirement_save` or `gsd_summary_save` as appropriate.",
103
+ "replan-slice": "Use `gsd_replan_slice` to persist the revised slice plan, and `gsd_decision_save` for planning decisions that need durable rationale.",
104
+ "reassess-roadmap": "Use `gsd_milestone_status` to inspect current milestone state, then `gsd_reassess_roadmap` to persist the roadmap reassessment.",
101
105
  "run-uat": "Use `gsd_uat_exec` for acceptance checks so evidence is typed as UAT-owned, and `gsd_resume` after compaction or resume.",
106
+ "research-project": "Dispatch parallel scout subagents for stack, features, architecture, and pitfalls research; each writes one file under `.gsd/research/` (`STACK.md`, `FEATURES.md`, `ARCHITECTURE.md`, `PITFALLS.md`).",
107
+ "gate-evaluate": "Use `subagent` to dispatch tester agents, then persist each gate with `gsd_save_gate_result`; rely on testers for verification evidence.",
108
+ };
109
+ // Per-unit guidance for the nested render mode (renderMode: "nested"), used when this
110
+ // unit's Context Mode line is embedded into a subagent prompt — e.g. the tester prompts
111
+ // dispatched by gate-evaluate. Must instruct the subagent on what IT should do, not
112
+ // re-state the parent coordinator's dispatch instructions. Falls back to
113
+ // CONTEXT_MODE_GUIDANCE_BY_UNIT then the lane default when no nested entry exists.
114
+ export const CONTEXT_MODE_NESTED_GUIDANCE_BY_UNIT = {
115
+ "gate-evaluate": "Run verification checks to answer the gate question, then persist the verdict with `gsd_save_gate_result`.",
102
116
  };
103
117
  /**
104
118
  * Render the Context Mode instruction lane for a unit type. Unknown unit
@@ -112,7 +126,9 @@ export function composeContextModeInstructions(unitType, opts) {
112
126
  if (!manifest || manifest.contextMode === "none")
113
127
  return "";
114
128
  const lane = CONTEXT_MODE_LANE_LABELS[manifest.contextMode];
115
- const guidance = CONTEXT_MODE_GUIDANCE_BY_UNIT[unitType] ?? CONTEXT_MODE_GUIDANCE_BY_LANE[manifest.contextMode];
129
+ const guidance = (opts.renderMode === "nested" ? CONTEXT_MODE_NESTED_GUIDANCE_BY_UNIT[unitType] : undefined)
130
+ ?? CONTEXT_MODE_GUIDANCE_BY_UNIT[unitType]
131
+ ?? CONTEXT_MODE_GUIDANCE_BY_LANE[manifest.contextMode];
116
132
  if (opts.renderMode === "nested") {
117
133
  return `Context Mode (${lane} lane): ${guidance}`;
118
134
  }