@opengsd/gsd-pi 1.3.0-dev.eed73bea → 1.4.0-dev.5fc22c6f

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 (550) hide show
  1. package/README.md +11 -11
  2. package/dist/cli.js +17 -4
  3. package/dist/headless-answers.js +1 -1
  4. package/dist/headless-ui.d.ts +1 -1
  5. package/dist/headless-ui.js +1 -1
  6. package/dist/headless.js +1 -1
  7. package/dist/onboarding.js +11 -0
  8. package/dist/resources/.managed-resources-content-hash +1 -1
  9. package/dist/resources/GSD-WORKFLOW.md +20 -25
  10. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  11. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +61 -50
  12. package/dist/resources/extensions/cursor-cli/index.js +16 -0
  13. package/dist/resources/extensions/cursor-cli/models.js +63 -0
  14. package/dist/resources/extensions/cursor-cli/package.json +11 -0
  15. package/dist/resources/extensions/cursor-cli/readiness.js +128 -0
  16. package/dist/resources/extensions/cursor-cli/stream-adapter.js +353 -0
  17. package/dist/resources/extensions/gsd/activity-log.js +4 -1
  18. package/dist/resources/extensions/gsd/artifact-verification.js +431 -0
  19. package/dist/resources/extensions/gsd/auto/session.js +11 -0
  20. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +1 -1
  21. package/dist/resources/extensions/gsd/auto-artifact-paths.js +28 -1
  22. package/dist/resources/extensions/gsd/auto-budget.js +5 -1
  23. package/dist/resources/extensions/gsd/auto-dispatch.js +32 -11
  24. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -18
  25. package/dist/resources/extensions/gsd/auto-post-unit.js +1 -1
  26. package/dist/resources/extensions/gsd/auto-prompts.js +83 -25
  27. package/dist/resources/extensions/gsd/auto-recovery.js +9 -517
  28. package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -5
  29. package/dist/resources/extensions/gsd/auto-start.js +4 -3
  30. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +7 -3
  31. package/dist/resources/extensions/gsd/auto-verification.js +5 -2
  32. package/dist/resources/extensions/gsd/auto-worktree.js +38 -11
  33. package/dist/resources/extensions/gsd/auto.js +32 -10
  34. package/dist/resources/extensions/gsd/bootstrap/core-session-tools.js +39 -0
  35. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +8 -4
  36. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
  37. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +147 -23
  38. package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +56 -36
  39. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +29 -5
  40. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +3 -1
  41. package/dist/resources/extensions/gsd/codebase-generator.js +157 -19
  42. package/dist/resources/extensions/gsd/commands/handlers/auto.js +1 -1
  43. package/dist/resources/extensions/gsd/commands/handlers/core.js +40 -4
  44. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +154 -2
  45. package/dist/resources/extensions/gsd/commands-usage.js +1 -1
  46. package/dist/resources/extensions/gsd/commands-worktree.js +11 -2
  47. package/dist/resources/extensions/gsd/db/engine.js +4 -1
  48. package/dist/resources/extensions/gsd/db/queries.js +39 -0
  49. package/dist/resources/extensions/gsd/db-memory-fts-schema.js +34 -0
  50. package/dist/resources/extensions/gsd/db-workspace.js +55 -3
  51. package/dist/resources/extensions/gsd/delegation-policy.js +1 -1
  52. package/dist/resources/extensions/gsd/discussion-handoff.js +8 -3
  53. package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -4
  54. package/dist/resources/extensions/gsd/doctor-engine-checks.js +227 -5
  55. package/dist/resources/extensions/gsd/doctor-providers.js +38 -10
  56. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +3 -0
  57. package/dist/resources/extensions/gsd/doctor.js +93 -3
  58. package/dist/resources/extensions/gsd/exec-sandbox.js +14 -4
  59. package/dist/resources/extensions/gsd/flat-phase-migration.js +119 -23
  60. package/dist/resources/extensions/gsd/git-service.js +61 -8
  61. package/dist/resources/extensions/gsd/gitignore.js +4 -1
  62. package/dist/resources/extensions/gsd/guidance.js +1 -0
  63. package/dist/resources/extensions/gsd/guided-flow-queue.js +20 -13
  64. package/dist/resources/extensions/gsd/guided-flow.js +40 -2
  65. package/dist/resources/extensions/gsd/json-persistence.js +20 -0
  66. package/dist/resources/extensions/gsd/key-manager.js +1 -0
  67. package/dist/resources/extensions/gsd/knowledge-backfill.js +18 -11
  68. package/dist/resources/extensions/gsd/layout-policy.js +3 -1
  69. package/dist/resources/extensions/gsd/markdown-renderer.js +27 -15
  70. package/dist/resources/extensions/gsd/memory-backfill.js +28 -21
  71. package/dist/resources/extensions/gsd/metrics.js +4 -4
  72. package/dist/resources/extensions/gsd/migrate-external.js +22 -5
  73. package/dist/resources/extensions/gsd/migration-auto-check.js +22 -0
  74. package/dist/resources/extensions/gsd/milestone-ids.js +32 -2
  75. package/dist/resources/extensions/gsd/orphan-stash-audit.js +92 -16
  76. package/dist/resources/extensions/gsd/preferences-diagnostics.js +24 -1
  77. package/dist/resources/extensions/gsd/preferences-models.js +6 -4
  78. package/dist/resources/extensions/gsd/preferences-validation.js +25 -2
  79. package/dist/resources/extensions/gsd/preferences.js +29 -2
  80. package/dist/resources/extensions/gsd/prompts/code-review.md +6 -4
  81. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
  82. package/dist/resources/extensions/gsd/prompts/plan-slice.md +5 -3
  83. package/dist/resources/extensions/gsd/redact-secrets.js +37 -0
  84. package/dist/resources/extensions/gsd/repository-registry.js +6 -1
  85. package/dist/resources/extensions/gsd/root-write-leak-guard.js +7 -1
  86. package/dist/resources/extensions/gsd/safe-fs.js +23 -2
  87. package/dist/resources/extensions/gsd/safety/destructive-guard.js +8 -1
  88. package/dist/resources/extensions/gsd/safety/evidence-collector.js +16 -1
  89. package/dist/resources/extensions/gsd/safety/file-change-validator.js +5 -2
  90. package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +7 -9
  91. package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +2 -1
  92. package/dist/resources/extensions/gsd/state/derive/cache.js +28 -0
  93. package/dist/resources/extensions/gsd/state/derive/db-open.js +39 -0
  94. package/dist/resources/extensions/gsd/state/derive/from-db.js +452 -0
  95. package/dist/resources/extensions/gsd/state/derive/index.js +75 -0
  96. package/dist/resources/extensions/gsd/state/derive/interrupted-work.js +21 -0
  97. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +27 -33
  98. package/dist/resources/extensions/gsd/state-reconciliation/index.js +48 -23
  99. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +32 -28
  100. package/dist/resources/extensions/gsd/state.js +12 -611
  101. package/dist/resources/extensions/gsd/tools/complete-milestone.js +4 -2
  102. package/dist/resources/extensions/gsd/tools/complete-slice.js +3 -34
  103. package/dist/resources/extensions/gsd/tools/complete-task.js +8 -41
  104. package/dist/resources/extensions/gsd/tools/plan-slice.js +59 -44
  105. package/dist/resources/extensions/gsd/tools/plan-task.js +103 -12
  106. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +40 -0
  107. package/dist/resources/extensions/gsd/undo.js +43 -6
  108. package/dist/resources/extensions/gsd/unit-context-manifest.js +5 -4
  109. package/dist/resources/extensions/gsd/unit-registry.js +11 -3
  110. package/dist/resources/extensions/gsd/unit-runtime.js +21 -0
  111. package/dist/resources/extensions/gsd/verification-gate.js +7 -0
  112. package/dist/resources/extensions/gsd/workflow-manifest.js +126 -13
  113. package/dist/resources/extensions/gsd/workflow-projections.js +19 -14
  114. package/dist/resources/extensions/gsd/workspace.js +26 -8
  115. package/dist/resources/extensions/gsd/worktree-manager.js +140 -5
  116. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  117. package/dist/web/standalone/.next/BUILD_ID +1 -1
  118. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  119. package/dist/web/standalone/.next/build-manifest.json +3 -3
  120. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  121. package/dist/web/standalone/.next/react-loadable-manifest.json +9 -9
  122. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  124. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  133. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/index.html +1 -1
  142. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  143. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  144. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  145. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  150. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  151. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  154. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  155. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  156. package/dist/web/standalone/.next/static/chunks/{2659.b7b129ee6a769448.js → 2659.58e950899a9bb82f.js} +1 -1
  157. package/dist/web/standalone/.next/static/chunks/2772.a7c1fcc69a4685ef.js +1 -0
  158. package/dist/web/standalone/.next/static/chunks/{3616.3c60753b8ffcbd2e.js → 3616.61a2af74bb8833c8.js} +1 -1
  159. package/dist/web/standalone/.next/static/chunks/{4283.8e446784528ed9dc.js → 4283.d0d9e0a955e441cb.js} +1 -1
  160. package/dist/web/standalone/.next/static/chunks/{5826.a46ecdd1cfe8dabc.js → 5826.5421d66c72b9f34e.js} +1 -1
  161. package/dist/web/standalone/.next/static/chunks/{8785.481aa5869991b760.js → 8785.e29b3134cab1d153.js} +1 -1
  162. package/dist/web/standalone/.next/static/chunks/8937.640dc9c2aaa1dfad.js +10 -0
  163. package/dist/web/standalone/.next/static/chunks/app/{page-6644fc6ee8ca1247.js → page-72a856634ad14c10.js} +1 -1
  164. package/dist/web/standalone/.next/static/chunks/webpack-9c401904f87ded16.js +1 -0
  165. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  166. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  167. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  168. package/dist/wizard.d.ts +8 -0
  169. package/dist/wizard.js +8 -1
  170. package/integrations/hermes/__init__.py +31 -0
  171. package/integrations/hermes/tests/test_directory_loader.py +37 -0
  172. package/package.json +8 -8
  173. package/packages/cloud-mcp-gateway/dist/auth-store.d.ts +1 -0
  174. package/packages/cloud-mcp-gateway/dist/auth-store.d.ts.map +1 -1
  175. package/packages/cloud-mcp-gateway/dist/auth-store.js +21 -1
  176. package/packages/cloud-mcp-gateway/dist/auth-store.js.map +1 -1
  177. package/packages/cloud-mcp-gateway/dist/auth-store.test.js +34 -0
  178. package/packages/cloud-mcp-gateway/dist/auth-store.test.js.map +1 -1
  179. package/packages/cloud-mcp-gateway/package.json +2 -2
  180. package/packages/contracts/package.json +1 -1
  181. package/packages/daemon/dist/cloud-runtime.d.ts +2 -0
  182. package/packages/daemon/dist/cloud-runtime.d.ts.map +1 -1
  183. package/packages/daemon/dist/cloud-runtime.js +25 -1
  184. package/packages/daemon/dist/cloud-runtime.js.map +1 -1
  185. package/packages/daemon/dist/cloud-runtime.test.js +51 -0
  186. package/packages/daemon/dist/cloud-runtime.test.js.map +1 -1
  187. package/packages/daemon/dist/message-batcher.d.ts +7 -0
  188. package/packages/daemon/dist/message-batcher.d.ts.map +1 -1
  189. package/packages/daemon/dist/message-batcher.js +13 -0
  190. package/packages/daemon/dist/message-batcher.js.map +1 -1
  191. package/packages/daemon/dist/message-batcher.test.js +48 -0
  192. package/packages/daemon/dist/message-batcher.test.js.map +1 -1
  193. package/packages/daemon/package.json +5 -5
  194. package/packages/gsd-agent-core/dist/agent-session.d.ts +1 -0
  195. package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
  196. package/packages/gsd-agent-core/dist/agent-session.js +3 -0
  197. package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
  198. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts +13 -1
  199. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
  200. package/packages/gsd-agent-core/dist/compaction/compaction.js +15 -1
  201. package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
  202. package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts +41 -0
  203. package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts.map +1 -0
  204. package/packages/gsd-agent-core/dist/extension-ui-snapshot.js +62 -0
  205. package/packages/gsd-agent-core/dist/extension-ui-snapshot.js.map +1 -0
  206. package/packages/gsd-agent-core/dist/index.d.ts +2 -0
  207. package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
  208. package/packages/gsd-agent-core/dist/index.js +2 -0
  209. package/packages/gsd-agent-core/dist/index.js.map +1 -1
  210. package/packages/gsd-agent-core/dist/session/agent-session-events.js +1 -1
  211. package/packages/gsd-agent-core/dist/session/agent-session-events.js.map +1 -1
  212. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +1 -0
  213. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
  214. package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
  215. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts +5 -0
  216. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
  217. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +60 -3
  218. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
  219. package/packages/gsd-agent-core/dist/transcript-store.d.ts +58 -0
  220. package/packages/gsd-agent-core/dist/transcript-store.d.ts.map +1 -0
  221. package/packages/gsd-agent-core/dist/transcript-store.js +132 -0
  222. package/packages/gsd-agent-core/dist/transcript-store.js.map +1 -0
  223. package/packages/gsd-agent-core/package.json +5 -5
  224. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +2 -0
  225. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  226. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +25 -11
  227. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  228. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts +4 -0
  229. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts.map +1 -0
  230. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js +7 -0
  231. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js.map +1 -0
  232. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -24
  233. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  234. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +26 -841
  235. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  236. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts +58 -0
  237. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts.map +1 -0
  238. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js +312 -0
  239. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js.map +1 -0
  240. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts +31 -0
  241. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts.map +1 -0
  242. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js +130 -0
  243. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js.map +1 -0
  244. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts +15 -0
  245. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts.map +1 -0
  246. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js +259 -0
  247. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map +1 -0
  248. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts +13 -0
  249. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts.map +1 -0
  250. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js +118 -0
  251. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js.map +1 -0
  252. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +9 -0
  253. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  254. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js +1 -1
  255. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  256. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts +54 -0
  257. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts.map +1 -0
  258. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js +20 -0
  259. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js.map +1 -0
  260. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +4 -1
  261. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  262. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +9 -0
  263. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  264. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts +56 -0
  265. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts.map +1 -0
  266. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js +44 -0
  267. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js.map +1 -0
  268. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts +5 -0
  269. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts.map +1 -0
  270. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js +77 -0
  271. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js.map +1 -0
  272. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts +2 -0
  273. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  274. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +24 -6
  275. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js.map +1 -1
  276. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  277. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +18 -0
  278. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  279. package/packages/gsd-agent-modes/package.json +7 -7
  280. package/packages/mcp-server/dist/workflow-tools.js +1 -1
  281. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  282. package/packages/mcp-server/package.json +4 -4
  283. package/packages/native/package.json +1 -1
  284. package/packages/pi-agent-core/dist/agent-loop.js +3 -2
  285. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  286. package/packages/pi-agent-core/package.json +1 -1
  287. package/packages/pi-ai/dist/env-api-keys.d.ts.map +1 -1
  288. package/packages/pi-ai/dist/env-api-keys.js +3 -0
  289. package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
  290. package/packages/pi-ai/dist/models.generated.d.ts +46 -0
  291. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  292. package/packages/pi-ai/dist/models.generated.js +38 -0
  293. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  294. package/packages/pi-ai/dist/types.d.ts +2 -2
  295. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  296. package/packages/pi-ai/dist/types.js.map +1 -1
  297. package/packages/pi-ai/package.json +1 -1
  298. package/packages/pi-coding-agent/README.md +3 -2
  299. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  300. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
  301. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts +9 -0
  303. package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts.map +1 -0
  304. package/packages/pi-coding-agent/dist/core/session-manager-context.js +94 -0
  305. package/packages/pi-coding-agent/dist/core/session-manager-context.js.map +1 -0
  306. package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts +8 -0
  307. package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts.map +1 -0
  308. package/packages/pi-coding-agent/dist/core/session-manager-list.js +244 -0
  309. package/packages/pi-coding-agent/dist/core/session-manager-list.js.map +1 -0
  310. package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts +12 -0
  311. package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts.map +1 -0
  312. package/packages/pi-coding-agent/dist/core/session-manager-migration.js +84 -0
  313. package/packages/pi-coding-agent/dist/core/session-manager-migration.js.map +1 -0
  314. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +135 -0
  315. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -0
  316. package/packages/pi-coding-agent/dist/core/session-manager-types.js +2 -0
  317. package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -0
  318. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +6 -154
  319. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  320. package/packages/pi-coding-agent/dist/core/session-manager.js +22 -459
  321. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  322. package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts +75 -75
  323. package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts.map +1 -1
  324. package/packages/pi-coding-agent/dist/theme/theme-schema.js +1 -1
  325. package/packages/pi-coding-agent/dist/theme/theme-schema.js.map +1 -1
  326. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  327. package/packages/pi-coding-agent/dist/theme/theme.js +11 -7
  328. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  329. package/packages/pi-coding-agent/package.json +7 -7
  330. package/packages/pi-tui/package.json +2 -2
  331. package/packages/rpc-client/dist/rpc-client.js +1 -1
  332. package/packages/rpc-client/dist/rpc-client.js.map +1 -1
  333. package/packages/rpc-client/package.json +2 -2
  334. package/pkg/dist/theme/theme-schema.d.ts +75 -75
  335. package/pkg/dist/theme/theme-schema.d.ts.map +1 -1
  336. package/pkg/dist/theme/theme-schema.js +1 -1
  337. package/pkg/dist/theme/theme-schema.js.map +1 -1
  338. package/pkg/dist/theme/theme.d.ts.map +1 -1
  339. package/pkg/dist/theme/theme.js +11 -7
  340. package/pkg/dist/theme/theme.js.map +1 -1
  341. package/pkg/package.json +1 -1
  342. package/scripts/link-workspace-packages.cjs +14 -4
  343. package/src/resources/GSD-WORKFLOW.md +20 -25
  344. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  345. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +67 -49
  346. package/src/resources/extensions/claude-code-cli/tests/index.test.ts +14 -0
  347. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +159 -0
  348. package/src/resources/extensions/cursor-cli/index.ts +18 -0
  349. package/src/resources/extensions/cursor-cli/models.ts +65 -0
  350. package/src/resources/extensions/cursor-cli/package.json +11 -0
  351. package/src/resources/extensions/cursor-cli/readiness.ts +143 -0
  352. package/src/resources/extensions/cursor-cli/stream-adapter.ts +440 -0
  353. package/src/resources/extensions/cursor-cli/tests/index.test.ts +54 -0
  354. package/src/resources/extensions/cursor-cli/tests/readiness.test.ts +29 -0
  355. package/src/resources/extensions/cursor-cli/tests/stream-adapter.test.ts +166 -0
  356. package/src/resources/extensions/gsd/activity-log.ts +4 -1
  357. package/src/resources/extensions/gsd/artifact-verification.ts +468 -0
  358. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  359. package/src/resources/extensions/gsd/auto/session.ts +14 -0
  360. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +3 -1
  361. package/src/resources/extensions/gsd/auto-artifact-paths.ts +47 -1
  362. package/src/resources/extensions/gsd/auto-budget.ts +12 -1
  363. package/src/resources/extensions/gsd/auto-dispatch.ts +34 -12
  364. package/src/resources/extensions/gsd/auto-model-selection.ts +49 -18
  365. package/src/resources/extensions/gsd/auto-post-unit.ts +1 -1
  366. package/src/resources/extensions/gsd/auto-prompts.ts +80 -25
  367. package/src/resources/extensions/gsd/auto-recovery.ts +13 -518
  368. package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -5
  369. package/src/resources/extensions/gsd/auto-start.ts +4 -3
  370. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +7 -2
  371. package/src/resources/extensions/gsd/auto-verification.ts +5 -1
  372. package/src/resources/extensions/gsd/auto-worktree.ts +50 -11
  373. package/src/resources/extensions/gsd/auto.ts +36 -8
  374. package/src/resources/extensions/gsd/bootstrap/core-session-tools.ts +44 -0
  375. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +8 -4
  376. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
  377. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +171 -23
  378. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +49 -1
  379. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +60 -37
  380. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +39 -5
  381. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +2 -1
  382. package/src/resources/extensions/gsd/codebase-generator.ts +179 -18
  383. package/src/resources/extensions/gsd/commands/handlers/auto.ts +1 -1
  384. package/src/resources/extensions/gsd/commands/handlers/core.ts +39 -3
  385. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +136 -2
  386. package/src/resources/extensions/gsd/commands-usage.ts +1 -1
  387. package/src/resources/extensions/gsd/commands-worktree.ts +13 -2
  388. package/src/resources/extensions/gsd/db/engine.ts +8 -1
  389. package/src/resources/extensions/gsd/db/queries.ts +40 -0
  390. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +45 -0
  391. package/src/resources/extensions/gsd/db-workspace.ts +61 -3
  392. package/src/resources/extensions/gsd/delegation-policy.ts +1 -1
  393. package/src/resources/extensions/gsd/discussion-handoff.ts +10 -2
  394. package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -4
  395. package/src/resources/extensions/gsd/doctor-engine-checks.ts +275 -5
  396. package/src/resources/extensions/gsd/doctor-providers.ts +39 -10
  397. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +3 -0
  398. package/src/resources/extensions/gsd/doctor-types.ts +8 -1
  399. package/src/resources/extensions/gsd/doctor.ts +95 -3
  400. package/src/resources/extensions/gsd/exec-sandbox.ts +13 -4
  401. package/src/resources/extensions/gsd/flat-phase-migration.ts +142 -22
  402. package/src/resources/extensions/gsd/git-service.ts +70 -9
  403. package/src/resources/extensions/gsd/gitignore.ts +4 -1
  404. package/src/resources/extensions/gsd/guidance.ts +2 -0
  405. package/src/resources/extensions/gsd/guided-flow-queue.ts +20 -13
  406. package/src/resources/extensions/gsd/guided-flow.ts +45 -2
  407. package/src/resources/extensions/gsd/json-persistence.ts +20 -0
  408. package/src/resources/extensions/gsd/key-manager.ts +1 -0
  409. package/src/resources/extensions/gsd/knowledge-backfill.ts +16 -10
  410. package/src/resources/extensions/gsd/layout-policy.ts +2 -1
  411. package/src/resources/extensions/gsd/markdown-renderer.ts +27 -17
  412. package/src/resources/extensions/gsd/memory-backfill.ts +26 -20
  413. package/src/resources/extensions/gsd/metrics.ts +4 -4
  414. package/src/resources/extensions/gsd/migrate-external.ts +17 -4
  415. package/src/resources/extensions/gsd/migration-auto-check.ts +23 -0
  416. package/src/resources/extensions/gsd/milestone-ids.ts +31 -2
  417. package/src/resources/extensions/gsd/model-router.ts +4 -5
  418. package/src/resources/extensions/gsd/orphan-stash-audit.ts +108 -20
  419. package/src/resources/extensions/gsd/preferences-diagnostics.ts +24 -0
  420. package/src/resources/extensions/gsd/preferences-models.ts +6 -3
  421. package/src/resources/extensions/gsd/preferences-validation.ts +28 -2
  422. package/src/resources/extensions/gsd/preferences.ts +38 -4
  423. package/src/resources/extensions/gsd/prompts/code-review.md +6 -4
  424. package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
  425. package/src/resources/extensions/gsd/prompts/plan-slice.md +5 -3
  426. package/src/resources/extensions/gsd/redact-secrets.ts +40 -0
  427. package/src/resources/extensions/gsd/repository-registry.ts +7 -1
  428. package/src/resources/extensions/gsd/root-write-leak-guard.ts +13 -1
  429. package/src/resources/extensions/gsd/safe-fs.ts +22 -2
  430. package/src/resources/extensions/gsd/safety/destructive-guard.ts +9 -1
  431. package/src/resources/extensions/gsd/safety/evidence-collector.ts +16 -1
  432. package/src/resources/extensions/gsd/safety/file-change-validator.ts +8 -2
  433. package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +7 -9
  434. package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +2 -1
  435. package/src/resources/extensions/gsd/state/derive/cache.ts +46 -0
  436. package/src/resources/extensions/gsd/state/derive/db-open.ts +45 -0
  437. package/src/resources/extensions/gsd/state/derive/from-db.ts +561 -0
  438. package/src/resources/extensions/gsd/state/derive/index.ts +104 -0
  439. package/src/resources/extensions/gsd/state/derive/interrupted-work.ts +31 -0
  440. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +36 -30
  441. package/src/resources/extensions/gsd/state-reconciliation/index.ts +50 -24
  442. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +43 -28
  443. package/src/resources/extensions/gsd/state.ts +32 -732
  444. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +4 -3
  445. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +98 -1
  446. package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +14 -5
  447. package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +18 -0
  448. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +178 -0
  449. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +36 -0
  450. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +182 -4
  451. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +35 -0
  452. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +41 -0
  453. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +30 -0
  454. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +41 -0
  455. package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +4 -4
  456. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +3 -0
  457. package/src/resources/extensions/gsd/tests/auto-timeout-recovery-harness-abort.test.ts +55 -0
  458. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +8 -0
  459. package/src/resources/extensions/gsd/tests/batch-task-query.test.ts +85 -0
  460. package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +29 -0
  461. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +365 -0
  462. package/src/resources/extensions/gsd/tests/commands-gsd-core.test.ts +1 -0
  463. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +62 -1
  464. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +28 -0
  465. package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +69 -0
  466. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +58 -3
  467. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +51 -0
  468. package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +44 -0
  469. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +143 -0
  470. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +138 -1
  471. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +296 -2
  472. package/src/resources/extensions/gsd/tests/doctor-workspace.test.ts +207 -0
  473. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +16 -0
  474. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +40 -0
  475. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +74 -2
  476. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +87 -19
  477. package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +89 -0
  478. package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +4 -0
  479. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +9 -0
  480. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +11 -2
  481. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
  482. package/src/resources/extensions/gsd/tests/json-persistence-atomic.test.ts +47 -0
  483. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +35 -0
  484. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +122 -0
  485. package/src/resources/extensions/gsd/tests/memory-store.test.ts +48 -0
  486. package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +31 -1
  487. package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +6 -0
  488. package/src/resources/extensions/gsd/tests/metrics.test.ts +1 -0
  489. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +57 -0
  490. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +70 -0
  491. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +91 -7
  492. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +4 -1
  493. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +2 -2
  494. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +27 -0
  495. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +103 -4
  496. package/src/resources/extensions/gsd/tests/plan-task.test.ts +307 -1
  497. package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +4 -2
  498. package/src/resources/extensions/gsd/tests/preferences.test.ts +150 -0
  499. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +142 -0
  500. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +50 -14
  501. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +58 -0
  502. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -6
  503. package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +4 -4
  504. package/src/resources/extensions/gsd/tests/redact-secrets.test.ts +56 -0
  505. package/src/resources/extensions/gsd/tests/register-hooks-flat-phase-migration.test.ts +73 -0
  506. package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +378 -0
  507. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +41 -2
  508. package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +55 -0
  509. package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +20 -1
  510. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +15 -3
  511. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +105 -0
  512. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +115 -0
  513. package/src/resources/extensions/gsd/tests/status-per-repo.test.ts +94 -0
  514. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +35 -0
  515. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +203 -0
  516. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +6 -3
  517. package/src/resources/extensions/gsd/tests/undo.test.ts +74 -0
  518. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +66 -18
  519. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +30 -0
  520. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +90 -0
  521. package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +53 -1
  522. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +69 -4
  523. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +96 -15
  524. package/src/resources/extensions/gsd/tests/workflow-mcp-preflight.test.ts +1 -0
  525. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +8 -4
  526. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +214 -6
  527. package/src/resources/extensions/gsd/tests/workspace.test.ts +18 -4
  528. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +39 -0
  529. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +31 -1
  530. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +32 -0
  531. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  532. package/src/resources/extensions/gsd/tools/complete-slice.ts +3 -30
  533. package/src/resources/extensions/gsd/tools/complete-task.ts +7 -39
  534. package/src/resources/extensions/gsd/tools/plan-slice.ts +60 -47
  535. package/src/resources/extensions/gsd/tools/plan-task.ts +135 -12
  536. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +58 -0
  537. package/src/resources/extensions/gsd/undo.ts +47 -6
  538. package/src/resources/extensions/gsd/unit-context-manifest.ts +11 -5
  539. package/src/resources/extensions/gsd/unit-registry.ts +11 -3
  540. package/src/resources/extensions/gsd/unit-runtime.ts +42 -0
  541. package/src/resources/extensions/gsd/verification-gate.ts +8 -0
  542. package/src/resources/extensions/gsd/workflow-manifest.ts +141 -7
  543. package/src/resources/extensions/gsd/workflow-projections.ts +20 -14
  544. package/src/resources/extensions/gsd/workspace.ts +42 -8
  545. package/src/resources/extensions/gsd/worktree-manager.ts +183 -5
  546. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +0 -1
  547. package/dist/web/standalone/.next/static/chunks/796.3976108148518f7d.js +0 -10
  548. package/dist/web/standalone/.next/static/chunks/webpack-7c1d97e39be2da11.js +0 -1
  549. /package/dist/web/standalone/.next/static/{SzEuqWX37DR9MEpEuQjP1 → kIEFsCryyGy6RzifULbJl}/_buildManifest.js +0 -0
  550. /package/dist/web/standalone/.next/static/{SzEuqWX37DR9MEpEuQjP1 → kIEFsCryyGy6RzifULbJl}/_ssgManifest.js +0 -0
@@ -12,7 +12,7 @@ import { readFileSync, existsSync, mkdirSync, statSync, unlinkSync } from "node:
12
12
  import { logWarning } from "./workflow-logger.js";
13
13
  import { isClosedStatus } from "./status-guards.js";
14
14
  import { dirname, join, relative } from "node:path";
15
- import { getAllMilestones, getMilestone, getMilestoneScopedArtifacts, getSliceScopedArtifacts, getMilestoneSlices, getSliceTasks, getTask, getSlice, insertArtifact, deleteArtifactByPath, getGateResults, isDbAvailable, } from "./gsd-db.js";
15
+ import { getAllMilestones, getMilestone, getMilestoneScopedArtifacts, getSliceScopedArtifacts, getMilestoneSlices, getSliceTasks, getTasksBySliceIds, getTask, getSlice, insertArtifact, deleteArtifactByPath, getGateResults, isDbAvailable, } from "./gsd-db.js";
16
16
  import { resolveSliceFile, resolveSlicePath, resolveTaskFile, resolveTasksDir, gsdProjectionRoot, gsdRoot, buildMilestoneFileName, buildTaskFileName, } from "./paths.js";
17
17
  import { saveFile, clearParseCache, registerCacheClearCallback } from "./files.js";
18
18
  import { parseRoadmap, parsePlan } from "./parsers-legacy.js";
@@ -99,6 +99,12 @@ function meaningfulSection(value) {
99
99
  return "";
100
100
  return trimmed;
101
101
  }
102
+ function renderGateFindings(gate) {
103
+ const findings = gate.findings.trim() || `- **Verdict:** ${gate.verdict}\n- **Rationale:** ${gate.rationale}`;
104
+ if (gate.verdict !== "flag")
105
+ return findings;
106
+ return `> **Warning:** Verdict: flag - concerns recorded below\n\n${findings}`;
107
+ }
102
108
  function pushIndented(lines, value, indent = " ") {
103
109
  for (const line of value.split("\n")) {
104
110
  lines.push(`${indent}${line}`);
@@ -289,7 +295,7 @@ function renderTaskPlanMarkdown(task, taskGates = []) {
289
295
  if (gate && gate.verdict !== "omitted") {
290
296
  lines.push(`## ${label}`);
291
297
  lines.push("");
292
- lines.push(gate.findings.trim() || `- **Verdict:** ${gate.verdict}\n- **Rationale:** ${gate.rationale}`);
298
+ lines.push(renderGateFindings(gate));
293
299
  lines.push("");
294
300
  }
295
301
  }
@@ -319,14 +325,14 @@ function renderSlicePlanMarkdown(slice, tasks, gates = []) {
319
325
  if (q3 && q3.verdict !== "omitted") {
320
326
  lines.push("## Threat Surface");
321
327
  lines.push("");
322
- lines.push(q3.findings.trim() || `- **Verdict:** ${q3.verdict}\n- **Rationale:** ${q3.rationale}`);
328
+ lines.push(renderGateFindings(q3));
323
329
  lines.push("");
324
330
  }
325
331
  const q4 = gates.find(g => g.gate_id === "Q4" && g.status === "complete");
326
332
  if (q4 && q4.verdict !== "omitted") {
327
333
  lines.push("## Requirement Impact");
328
334
  lines.push("");
329
- lines.push(q4.findings.trim() || `- **Verdict:** ${q4.verdict}\n- **Rationale:** ${q4.rationale}`);
335
+ lines.push(renderGateFindings(q4));
330
336
  lines.push("");
331
337
  }
332
338
  const proofLevel = meaningfulSection(slice.proof_level);
@@ -518,13 +524,8 @@ export async function renderRoadmapFromDb(basePath, milestoneId) {
518
524
  * @returns true if the roadmap was written, false on skip/error
519
525
  */
520
526
  export async function renderRoadmapCheckboxes(basePath, milestoneId) {
521
- const slices = getMilestoneSlices(milestoneId);
522
- if (slices.length === 0) {
523
- process.stderr.write(`markdown-renderer: no slices found for milestone ${milestoneId}\n`);
524
- return false;
525
- }
526
- await renderRoadmapFromDb(basePath, milestoneId);
527
- return true;
527
+ const rendered = await renderRoadmapFromDb(basePath, milestoneId);
528
+ return !("skipped" in rendered);
528
529
  }
529
530
  /**
530
531
  * Project milestone-level artifacts (CONTEXT, RESEARCH, VALIDATION, etc.) from
@@ -706,6 +707,17 @@ export async function renderSliceSummary(basePath, milestoneId, sliceId) {
706
707
  export async function renderAllFromDb(basePath) {
707
708
  const result = { rendered: 0, skipped: 0, errors: [] };
708
709
  const milestones = getAllMilestones();
710
+ // Pre-fetch slices once per milestone and batch-load all tasks in one query
711
+ // family, avoiding an N+1 (previously one task query per slice).
712
+ const slicesByMilestone = new Map();
713
+ const slicePairs = [];
714
+ for (const milestone of milestones) {
715
+ const slices = getMilestoneSlices(milestone.id);
716
+ slicesByMilestone.set(milestone.id, slices);
717
+ for (const slice of slices)
718
+ slicePairs.push({ milestoneId: milestone.id, sliceId: slice.id });
719
+ }
720
+ const tasksBySlice = getTasksBySliceIds(slicePairs);
709
721
  for (const milestone of milestones) {
710
722
  // Render roadmap checkboxes
711
723
  try {
@@ -728,8 +740,8 @@ export async function renderAllFromDb(basePath) {
728
740
  catch (err) {
729
741
  result.errors.push(`milestone artifacts ${milestone.id}: ${err.message}`);
730
742
  }
731
- // Iterate slices
732
- const slices = getMilestoneSlices(milestone.id);
743
+ // Iterate slices (pre-fetched above)
744
+ const slices = slicesByMilestone.get(milestone.id) ?? [];
733
745
  for (const slice of slices) {
734
746
  // Preserve slice-scoped artifacts imported from disk, including real PLAN
735
747
  // fallback content when task rows cannot regenerate it.
@@ -765,8 +777,8 @@ export async function renderAllFromDb(basePath) {
765
777
  catch (err) {
766
778
  result.errors.push(`slice summary ${milestone.id}/${slice.id}: ${err.message}`);
767
779
  }
768
- // Iterate tasks
769
- const tasks = getSliceTasks(milestone.id, slice.id);
780
+ // Iterate tasks (batched above)
781
+ const tasks = tasksBySlice.get(`${milestone.id}\0${slice.id}`) ?? [];
770
782
  for (const task of tasks) {
771
783
  try {
772
784
  const ok = await renderTaskSummary(basePath, milestone.id, slice.id, task.id);
@@ -33,8 +33,8 @@ import { logWarning } from "./workflow-logger.js";
33
33
  * decision is checked individually; only decisions whose id is already
34
34
  * present in the memory store are skipped. A user-authored memory with
35
35
  * their own `sourceDecisionId` does NOT abort the backfill.
36
- * - Best-effort: never throws. Logs and returns 0 on failure so a broken
37
- * backfill cannot block agent startup.
36
+ * - Best-effort: never throws. Failed memory inserts are logged and skipped;
37
+ * setup/read failures log and return 0 so backfill cannot block startup.
38
38
  * - Full migration (ADR-013 Stage 2a): both active and superseded rows are
39
39
  * migrated. `structured_fields.superseded_by` preserves the supersedes
40
40
  * chain so the DECISIONS.md projection regen can source from memories
@@ -117,25 +117,32 @@ export function backfillDecisionsToMemories() {
117
117
  continue;
118
118
  }
119
119
  const content = synthesizeDecisionMemoryContent(row);
120
- const id = createMemory({
121
- category: "architecture",
122
- content,
123
- scope: row.scope || "project",
124
- confidence: 0.85,
125
- structuredFields: {
126
- sourceDecisionId: row.id,
127
- when_context: row.when_context,
128
- scope: row.scope,
129
- decision: row.decision,
130
- choice: row.choice,
131
- rationale: row.rationale,
132
- made_by: row.made_by,
133
- revisable: row.revisable,
134
- superseded_by: row.superseded_by,
135
- },
136
- });
137
- if (id)
138
- written += 1;
120
+ try {
121
+ const id = createMemory({
122
+ category: "architecture",
123
+ content,
124
+ scope: row.scope || "project",
125
+ confidence: 0.85,
126
+ structuredFields: {
127
+ sourceDecisionId: row.id,
128
+ when_context: row.when_context,
129
+ scope: row.scope,
130
+ decision: row.decision,
131
+ choice: row.choice,
132
+ rationale: row.rationale,
133
+ made_by: row.made_by,
134
+ revisable: row.revisable,
135
+ superseded_by: row.superseded_by,
136
+ },
137
+ });
138
+ if (id)
139
+ written += 1;
140
+ }
141
+ catch (rowErr) {
142
+ const message = rowErr instanceof Error ? rowErr.message : String(rowErr);
143
+ logWarning("memory-backfill", `decisions->memories backfill skipped ${row.id}: ${message}`);
144
+ continue;
145
+ }
139
146
  }
140
147
  if (healed > 0) {
141
148
  logWarning("memory-backfill", `decisions->memories drift healed: ${healed} row${healed === 1 ? "" : "s"} updated superseded_by`);
@@ -17,7 +17,7 @@ import { join } from "node:path";
17
17
  import { openSync, closeSync, unlinkSync, statSync, writeFileSync } from "node:fs";
18
18
  import { gsdRoot } from "./paths.js";
19
19
  import { getAndClearSkills } from "./skill-telemetry.js";
20
- import { loadJsonFile, loadJsonFileOrNull, saveJsonFile } from "./json-persistence.js";
20
+ import { loadJsonFile, loadJsonFileOrNull, saveJsonFileCompact } from "./json-persistence.js";
21
21
  import { parseUnitId } from "./unit-id.js";
22
22
  import { buildAuditEnvelope, emitUokAuditEvent } from "./uok/audit.js";
23
23
  import { isUnifiedAuditEnabled } from "./uok/audit-toggle.js";
@@ -636,7 +636,7 @@ export function pruneMetricsLedger(base, keepCount) {
636
636
  return 0;
637
637
  const removed = disk.units.length - keepCount;
638
638
  disk.units = keepNewestUnits(disk.units, keepCount);
639
- saveJsonFile(metricsPath(base), disk);
639
+ saveJsonFileCompact(metricsPath(base), disk);
640
640
  // Keep the in-memory ledger in sync if it is loaded for this session.
641
641
  if (ledger) {
642
642
  ledger.units = keepNewestUnits(ledger.units, keepCount);
@@ -799,7 +799,7 @@ function saveLedger(base, data) {
799
799
  : dataUnits;
800
800
  merged.sort(compareUnitsByTime);
801
801
  data.units = keepNewestUnits(merged);
802
- saveJsonFile(path, data);
802
+ saveJsonFileCompact(path, data);
803
803
  }
804
804
  finally {
805
805
  releaseLock(lockPath);
@@ -813,6 +813,6 @@ function saveLedger(base, data) {
813
813
  // read-merge-write sequence without mutual exclusion.
814
814
  logWarning("fs", "saveLedger: lock not acquired — falling back to direct write (no merge)");
815
815
  data.units = keepNewestUnits(data.units);
816
- saveJsonFile(path, data);
816
+ saveJsonFileCompact(path, data);
817
817
  }
818
818
  }
@@ -110,6 +110,7 @@ export function migrateToExternalState(basePath) {
110
110
  }
111
111
  // Copy contents to external dir, skipping worktrees/
112
112
  const entries = readdirSync(migratingPath, { withFileTypes: true });
113
+ const copyFailures = [];
113
114
  for (const entry of entries) {
114
115
  if (entry.name === "worktrees")
115
116
  continue; // worktrees stay local
@@ -123,9 +124,17 @@ export function migrateToExternalState(basePath) {
123
124
  cpSync(src, dst, { force: true });
124
125
  }
125
126
  }
126
- catch {
127
- // Non-fatal: continue with other files
127
+ catch (copyErr) {
128
+ copyFailures.push(`${entry.name}: ${getErrorMessage(copyErr)}`);
129
+ }
130
+ }
131
+ if (copyFailures.length > 0) {
132
+ try {
133
+ rmSync(localGsd, { force: true });
128
134
  }
135
+ catch { /* may not exist */ }
136
+ renameSync(migratingPath, localGsd);
137
+ return { migrated: false, error: `Migration copy failed: ${copyFailures.join("; ")}` };
129
138
  }
130
139
  // Create symlink .gsd -> external path
131
140
  symlinkSync(externalPath, localGsd, "junction");
@@ -230,7 +239,7 @@ function isLocalGsdExternalStateJunction(basePath, localGsd) {
230
239
  * Recover from a failed migration (`.gsd.migrating` exists).
231
240
  * Moves `.gsd.migrating` back to `.gsd` if `.gsd` doesn't exist, or removes an
232
241
  * orphaned staging directory when `.gsd` is already a verified external state
233
- * junction with intact current state.
242
+ * junction, or an intact real directory, with intact current state.
234
243
  */
235
244
  export function recoverFailedMigration(basePath) {
236
245
  const localGsd = join(basePath, ".gsd");
@@ -238,10 +247,18 @@ export function recoverFailedMigration(basePath) {
238
247
  if (!existsSync(migratingPath))
239
248
  return false;
240
249
  if (existsSync(localGsd)) {
241
- if (!isLocalGsdExternalStateJunction(basePath, localGsd))
242
- return false;
243
250
  if (!isCurrentGsdStateIntactForMigratingCleanup(basePath))
244
251
  return false;
252
+ if (!isLocalGsdExternalStateJunction(basePath, localGsd)) {
253
+ try {
254
+ const stat = lstatSync(localGsd);
255
+ if (!stat.isDirectory())
256
+ return false;
257
+ }
258
+ catch {
259
+ return false;
260
+ }
261
+ }
245
262
  try {
246
263
  rmSync(migratingPath, { recursive: true, force: true });
247
264
  return true;
@@ -45,6 +45,27 @@ function scanHasExtraIdentities(a, b) {
45
45
  hasExtra(a.slices, b.slices) ||
46
46
  hasExtra(a.tasks, b.tasks));
47
47
  }
48
+ function paddedMilestoneId(id) {
49
+ return /^\d+$/.test(id) ? `M${id.padStart(3, "0")}` : null;
50
+ }
51
+ function replaceSetPrefix(values, from, to) {
52
+ for (const value of [...values]) {
53
+ if (value !== from && !value.startsWith(`${from}/`))
54
+ continue;
55
+ values.delete(value);
56
+ values.add(`${to}${value.slice(from.length)}`);
57
+ }
58
+ }
59
+ function alignNumericMarkdownIdsWithDb(markdownScan, dbScan) {
60
+ for (const dbId of dbScan.milestones) {
61
+ const paddedId = paddedMilestoneId(dbId);
62
+ if (!paddedId || dbScan.milestones.has(paddedId) || !markdownScan.milestones.has(paddedId))
63
+ continue;
64
+ replaceSetPrefix(markdownScan.milestones, paddedId, dbId);
65
+ replaceSetPrefix(markdownScan.slices, paddedId, dbId);
66
+ replaceSetPrefix(markdownScan.tasks, paddedId, dbId);
67
+ }
68
+ }
48
69
  /**
49
70
  * True when the DB holds any milestone/slice/task identity the markdown lacks —
50
71
  * i.e. a `/gsd recover --confirm` (markdown → DB) would DELETE authoritative DB
@@ -126,6 +147,7 @@ export async function checkMarkdownHierarchyAgainstDb(basePath) {
126
147
  refreshWorkflowDatabaseFromDisk();
127
148
  const dbScan = scanDbHierarchy();
128
149
  const beforeDb = dbScan.counts;
150
+ alignNumericMarkdownIdsWithDb(markdownScan, dbScan);
129
151
  // Discussion-phase scratch: a milestone dir with no ROADMAP and no DB row is
130
152
  // a pre-registration discussion artifact (CONTEXT/CONTEXT-DRAFT only — the
131
153
  // queued DB row is inserted only at discussion handoff). Treating it as
@@ -123,7 +123,8 @@ export function clearReservedMilestoneIds() {
123
123
  reservedMilestoneIds.clear();
124
124
  }
125
125
  // ─── Discovery ──────────────────────────────────────────────────────────────
126
- function scanMilestoneIdsFromDir(dir) {
126
+ function scanMilestoneIdsFromDir(basePath, dir) {
127
+ const legacyNumericIds = idsWithLegacyNumericDirs(basePath);
127
128
  return readdirSync(dir, { withFileTypes: true })
128
129
  .filter((d) => d.isDirectory())
129
130
  .map((d) => {
@@ -131,6 +132,12 @@ function scanMilestoneIdsFromDir(dir) {
131
132
  if (MILESTONE_ID_RE.test(d.name)) {
132
133
  return d.name;
133
134
  }
135
+ // Legacy recovery/imports may contain bare numeric milestone directories
136
+ // (for example `milestones/15/15-ROADMAP.md`). The DB can preserve that
137
+ // id, and rebuild renders it, so drift scans must see it too.
138
+ if (/^\d+$/.test(d.name)) {
139
+ return d.name;
140
+ }
134
141
  // Legacy layout: M001-abcdef-slug descriptor directories
135
142
  const legacyMatch = d.name.match(/^(M\d{3}(?:-[a-z0-9]{6})?)-/);
136
143
  if (legacyMatch) {
@@ -144,12 +151,35 @@ function scanMilestoneIdsFromDir(dir) {
144
151
  if (MILESTONE_ID_RE.test(fromSlug)) {
145
152
  return fromSlug;
146
153
  }
154
+ const numericId = String(phaseNum);
155
+ if (legacyNumericIds.has(numericId)) {
156
+ return numericId;
157
+ }
147
158
  return `M${String(phaseNum).padStart(3, "0")}`;
148
159
  }
149
160
  return null;
150
161
  })
151
162
  .filter((id) => id !== null);
152
163
  }
164
+ function idsWithLegacyNumericDirs(basePath) {
165
+ const legacyDir = join(gsdProjectionRoot(basePath), "milestones");
166
+ const ids = new Set();
167
+ try {
168
+ for (const entry of readdirSync(legacyDir, { withFileTypes: true })) {
169
+ if (entry.isDirectory() && /^\d+$/.test(entry.name))
170
+ ids.add(entry.name);
171
+ }
172
+ }
173
+ catch (err) {
174
+ // A missing legacy directory is the common, benign case (nothing to
175
+ // consult). Only surface a real failure when the directory exists but
176
+ // could not be read.
177
+ if (existsSync(legacyDir)) {
178
+ logWarning("engine", `idsWithLegacyNumericDirs: ${legacyDir} exists but readdirSync failed — ${getErrorMessage(err)}`);
179
+ }
180
+ }
181
+ return ids;
182
+ }
153
183
  /** Scan the milestones directory and return IDs sorted by queue order (or numeric fallback). */
154
184
  export function findMilestoneIds(basePath) {
155
185
  const root = gsdProjectionRoot(basePath);
@@ -163,7 +193,7 @@ export function findMilestoneIds(basePath) {
163
193
  const ids = new Set();
164
194
  for (const dir of dirs) {
165
195
  try {
166
- for (const id of scanMilestoneIdsFromDir(dir))
196
+ for (const id of scanMilestoneIdsFromDir(basePath, dir))
167
197
  ids.add(id);
168
198
  }
169
199
  catch (err) {
@@ -26,16 +26,78 @@ function _isAlreadyRestoredApplyError(err) {
26
26
  return /already exists, no checkout/i.test(message);
27
27
  }
28
28
  export { _isAlreadyRestoredApplyError };
29
+ function gitOutput(basePath, args) {
30
+ return execFileSync("git", args, {
31
+ cwd: basePath,
32
+ stdio: ["ignore", "pipe", "pipe"],
33
+ encoding: "utf-8",
34
+ env: GIT_NO_PROMPT_ENV,
35
+ });
36
+ }
37
+ function listStashUntrackedPaths(basePath, stashRef) {
38
+ try {
39
+ return gitOutput(basePath, ["ls-tree", "-r", "-z", "--name-only", `${stashRef}^3`]).split("\0").filter(Boolean);
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ }
45
+ function listStashTrackedPaths(basePath, stashRef) {
46
+ try {
47
+ return gitOutput(basePath, ["diff", "--name-only", "-z", `${stashRef}^1`, stashRef]).split("\0").filter(Boolean);
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ function readWorkingTreeStatus(basePath) {
54
+ try {
55
+ return gitOutput(basePath, ["status", "--porcelain", "-z", "--untracked-files=all"])
56
+ .split("\0")
57
+ .filter(Boolean)
58
+ .map((entry) => ({ code: entry.slice(0, 2), path: entry.slice(3) }));
59
+ }
60
+ catch {
61
+ return null;
62
+ }
63
+ }
64
+ function isAlreadyRestoredUntrackedStatus(basePath, stashRef, statusEntries) {
65
+ if (statusEntries.length === 0 || statusEntries.some((entry) => entry.code !== "??"))
66
+ return false;
67
+ const stashTrackedPaths = listStashTrackedPaths(basePath, stashRef);
68
+ if (!stashTrackedPaths || stashTrackedPaths.length > 0)
69
+ return false;
70
+ const stashUntrackedPaths = listStashUntrackedPaths(basePath, stashRef);
71
+ if (!stashUntrackedPaths || stashUntrackedPaths.length === 0)
72
+ return false;
73
+ const stashUntrackedPathSet = new Set(stashUntrackedPaths);
74
+ const workingTreeUntrackedPathSet = new Set(statusEntries.map((entry) => entry.path));
75
+ // "Already restored" requires the working tree's untracked paths to match the
76
+ // stash's untracked paths exactly, in BOTH directions:
77
+ // 1. every current untracked path comes from the stash (no unexplained user
78
+ // work that an apply would clobber), AND
79
+ // 2. every stash untracked path is already present in the working tree.
80
+ // Without (2), a partial restore (where only some stash files were recovered)
81
+ // would be misread as fully restored: the audit would no-op without applying
82
+ // or warning, leaving the remaining pre-merge files missing.
83
+ return (statusEntries.every((entry) => stashUntrackedPathSet.has(entry.path)) &&
84
+ stashUntrackedPaths.every((path) => workingTreeUntrackedPathSet.has(path)));
85
+ }
86
+ function manualApplyWarning(stashRef, milestoneId, reason) {
87
+ return (`Pre-merge stash ${stashRef} for milestone ${milestoneId} not auto-applied: ${reason}; ` +
88
+ `run \`git stash apply ${stashRef}\` manually to restore your pre-merge changes.`);
89
+ }
29
90
  /**
30
91
  * Audit `git stash list` for orphaned `gsd-preflight-stash:M00x:*` entries.
31
92
  *
32
93
  * The matching merge code in `phases.ts` previously skipped the postflight
33
94
  * pop whenever `mergeAndExit` threw, leaking the user's pre-merge working
34
- * tree into the stash list. For every preflight-stash entry whose milestone
35
- * is now complete (per the supplied callback), `git stash apply` is invoked
95
+ * tree into the stash list. Completed-milestone stashes are only auto-applied
96
+ * when the working tree is clean and the stash does not modify tracked files.
97
+ * Dirty trees and tracked-file stashes are left untouched with a manual
98
+ * recovery warning. When auto-apply is safe, `git stash apply` is invoked —
36
99
  * NOT `pop`. The stash entry stays in the list so the user retains a backup
37
- * if the apply produces unexpected merge results. Idempotent across repeated
38
- * startup runs.
100
+ * if the apply produces unexpected merge results.
39
101
  *
40
102
  * Failures are best-effort: a list error (no repo, git unavailable) returns
41
103
  * an empty result. An apply error becomes a warning the user sees alongside
@@ -45,12 +107,7 @@ export function auditOrphanedPreflightStashes(basePath, isMilestoneComplete) {
45
107
  const result = { applied: [], warnings: [] };
46
108
  let listOutput;
47
109
  try {
48
- listOutput = execFileSync("git", ["stash", "list", "--format=%gd%x00%s"], {
49
- cwd: basePath,
50
- stdio: ["ignore", "pipe", "pipe"],
51
- encoding: "utf-8",
52
- env: GIT_NO_PROMPT_ENV,
53
- });
110
+ listOutput = gitOutput(basePath, ["stash", "list", "--format=%gd%x00%s"]);
54
111
  }
55
112
  catch {
56
113
  return result;
@@ -78,13 +135,32 @@ export function auditOrphanedPreflightStashes(basePath, isMilestoneComplete) {
78
135
  }
79
136
  if (!complete)
80
137
  continue;
138
+ const statusEntries = readWorkingTreeStatus(basePath);
139
+ if (!statusEntries) {
140
+ result.warnings.push(manualApplyWarning(ref, milestoneId, "could not verify working tree status"));
141
+ continue;
142
+ }
143
+ if (statusEntries.length > 0) {
144
+ if (isAlreadyRestoredUntrackedStatus(basePath, ref, statusEntries))
145
+ continue;
146
+ result.warnings.push(manualApplyWarning(ref, milestoneId, "working tree not clean"));
147
+ continue;
148
+ }
149
+ const trackedPaths = listStashTrackedPaths(basePath, ref);
150
+ if (trackedPaths === null) {
151
+ result.warnings.push(manualApplyWarning(ref, milestoneId, "could not inspect tracked paths in stash"));
152
+ continue;
153
+ }
154
+ if (trackedPaths.length > 0) {
155
+ // A retained tracked-file stash has no durable marker showing whether a
156
+ // clean tree needs first recovery or would be re-mutated by an old backup.
157
+ const preview = trackedPaths.slice(0, 5).join(", ");
158
+ const suffix = trackedPaths.length > 5 ? `, and ${trackedPaths.length - 5} more` : "";
159
+ result.warnings.push(manualApplyWarning(ref, milestoneId, `stash modifies tracked files (${preview}${suffix})`));
160
+ continue;
161
+ }
81
162
  try {
82
- execFileSync("git", ["stash", "apply", "--quiet", ref], {
83
- cwd: basePath,
84
- stdio: ["ignore", "pipe", "pipe"],
85
- encoding: "utf-8",
86
- env: GIT_NO_PROMPT_ENV,
87
- });
163
+ gitOutput(basePath, ["stash", "apply", "--quiet", ref]);
88
164
  result.applied.push({ milestoneId, stashRef: ref });
89
165
  }
90
166
  catch (err) {
@@ -1,4 +1,5 @@
1
- import { loadGlobalGSDPreferences, loadProjectGSDPreferences, } from "./preferences.js";
1
+ import { loadEffectiveGSDPreferences, loadGlobalGSDPreferences, loadProjectGSDPreferences, } from "./preferences.js";
2
+ import { crossAxisPreferenceWarnings } from "./preferences-validation.js";
2
3
  const notifiedPreferenceDiagnostics = new Set();
3
4
  export function collectPreferenceDiagnostics(basePath) {
4
5
  const diagnostics = [
@@ -14,6 +15,28 @@ export function collectPreferenceDiagnostics(basePath) {
14
15
  seen.add(signature);
15
16
  unique.push(diagnostic);
16
17
  }
18
+ const effective = loadEffectiveGSDPreferences(basePath);
19
+ if (effective) {
20
+ const existingMessages = new Set(unique.map((diagnostic) => diagnostic.message));
21
+ for (const message of crossAxisPreferenceWarnings(effective.preferences)) {
22
+ if (existingMessages.has(message))
23
+ continue;
24
+ const diagnostic = {
25
+ path: effective.path,
26
+ scope: effective.scope,
27
+ severity: "warning",
28
+ kind: "validation",
29
+ message,
30
+ sanitized: true,
31
+ };
32
+ const signature = preferenceDiagnosticSignature(diagnostic);
33
+ if (seen.has(signature))
34
+ continue;
35
+ seen.add(signature);
36
+ existingMessages.add(message);
37
+ unique.push(diagnostic);
38
+ }
39
+ }
17
40
  return unique;
18
41
  }
19
42
  export function formatPreferenceDiagnostic(diagnostic) {
@@ -74,10 +74,12 @@ function resolveWinningPhase(models, chain) {
74
74
  * - Legacy: `planning: claude-opus-4-6`
75
75
  * - Extended: `planning: { model: claude-opus-4-6, fallbacks: [glm-5, minimax-m2.5] }`
76
76
  */
77
- export function resolveModelWithFallbacksForUnit(unitType, basePath, availableModelIds, preferredModelId) {
78
- const loadOpts = availableModelIds !== undefined || preferredModelId !== undefined
79
- ? { availableModelIds, preferredModelId }
80
- : undefined;
77
+ export function resolveModelWithFallbacksForUnit(unitType, basePath, availableModelIds, preferredModelId, skipProfileDefaults = false) {
78
+ const loadOpts = {
79
+ ...(availableModelIds !== undefined ? { availableModelIds } : {}),
80
+ ...(preferredModelId !== undefined ? { preferredModelId } : {}),
81
+ ...(skipProfileDefaults ? { skipProfileDefaults: true } : {}),
82
+ };
81
83
  const prefs = loadEffectiveGSDPreferences(basePath, loadOpts);
82
84
  const chain = phaseChainForUnit(unitType);
83
85
  if (!chain)
@@ -34,6 +34,15 @@ const VALID_POST_UNIT_HOOK_ON_BLOCK_ACTIONS = new Set([
34
34
  "pause",
35
35
  ]);
36
36
  const VALID_GATE_EVALUATE_SLICE_GATES = new Set(getGateIdsForTurn("gate-evaluate"));
37
+ /** Cross-axis warnings that only apply to the effective (merged) preference shape. */
38
+ export function crossAxisPreferenceWarnings(preferences) {
39
+ if (preferences.mode === "team" && preferences.workspace?.mode === "parent") {
40
+ return [
41
+ "mode:team + workspace.mode:parent: team branch-push/PR resolves at the project root and will not push child repositories — see docs/dev/ADR-044",
42
+ ];
43
+ }
44
+ return [];
45
+ }
37
46
  export function validatePreferences(preferences) {
38
47
  const errors = [];
39
48
  const warnings = [];
@@ -489,8 +498,12 @@ export function validatePreferences(preferences) {
489
498
  }
490
499
  // ─── Remote Questions ───────────────────────────────────────────────
491
500
  if (preferences.remote_questions !== undefined) {
492
- if (preferences.remote_questions && typeof preferences.remote_questions === "object") {
493
- validated.remote_questions = preferences.remote_questions;
501
+ const remoteQuestions = preferences.remote_questions;
502
+ if (typeof remoteQuestions === "object" && remoteQuestions !== null) {
503
+ validated.remote_questions = remoteQuestions;
504
+ }
505
+ else if (remoteQuestions === false) {
506
+ // Explicit disable for a globally-configured remote questions channel.
494
507
  }
495
508
  else {
496
509
  errors.push("remote_questions must be an object");
@@ -1524,6 +1537,15 @@ export function validatePreferences(preferences) {
1524
1537
  else {
1525
1538
  errors.push("workspace must be an object");
1526
1539
  }
1540
+ // parent mode is behavioral: it must coordinate at least one declared
1541
+ // child repository. Without one it is indistinguishable from project
1542
+ // mode, so reject it explicitly rather than silently degrading.
1543
+ if (validated.workspace?.mode === "parent") {
1544
+ const childRepoCount = validated.workspace.repositories ? Object.keys(validated.workspace.repositories).length : 0;
1545
+ if (childRepoCount === 0) {
1546
+ errors.push('workspace.mode "parent" requires at least one repository under workspace.repositories');
1547
+ }
1548
+ }
1527
1549
  }
1528
1550
  // ─── Enhanced Verification ──────────────────────────────────────────────────
1529
1551
  if (preferences.enhanced_verification !== undefined) {
@@ -1596,5 +1618,6 @@ export function validatePreferences(preferences) {
1596
1618
  errors.push(`language must be a non-empty string up to 50 characters with no newlines (e.g. "Chinese", "de", "日本語")`);
1597
1619
  }
1598
1620
  }
1621
+ warnings.push(...crossAxisPreferenceWarnings(validated));
1599
1622
  return { preferences: validated, errors, warnings };
1600
1623
  }