gsd-pi 2.77.0 → 2.78.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 (798) hide show
  1. package/README.md +18 -36
  2. package/dist/claude-cli-check.js +5 -1
  3. package/dist/cli-web-branch.d.ts +1 -0
  4. package/dist/cli-web-branch.js +3 -0
  5. package/dist/cli.js +38 -2
  6. package/dist/extension-discovery.d.ts +6 -0
  7. package/dist/extension-discovery.js +37 -0
  8. package/dist/extension-registry.d.ts +3 -0
  9. package/dist/extension-sort.d.ts +18 -0
  10. package/dist/extension-sort.js +114 -0
  11. package/dist/extension-validator.d.ts +47 -0
  12. package/dist/extension-validator.js +127 -0
  13. package/dist/headless.js +49 -4
  14. package/dist/loader.js +35 -7
  15. package/dist/provider-migrations.d.ts +18 -0
  16. package/dist/provider-migrations.js +14 -0
  17. package/dist/resource-loader.d.ts +40 -0
  18. package/dist/resource-loader.js +32 -13
  19. package/dist/resources/extensions/browser-tools/capture.js +9 -0
  20. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
  21. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
  22. package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
  23. package/dist/resources/extensions/browser-tools/tools/forms.js +5 -1
  24. package/dist/resources/extensions/browser-tools/tools/intent.js +5 -1
  25. package/dist/resources/extensions/claude-code-cli/readiness.js +5 -1
  26. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +552 -67
  27. package/dist/resources/extensions/cmux/index.js +20 -0
  28. package/dist/resources/extensions/github-sync/templates.js +103 -0
  29. package/dist/resources/extensions/google-search/extension-manifest.json +5 -4
  30. package/dist/resources/extensions/google-search/index.js +3 -375
  31. package/dist/resources/extensions/gsd/abandon-detect.js +44 -0
  32. package/dist/resources/extensions/gsd/auto/loop.js +124 -2
  33. package/dist/resources/extensions/gsd/auto/phases.js +57 -39
  34. package/dist/resources/extensions/gsd/auto/resolve.js +24 -0
  35. package/dist/resources/extensions/gsd/auto/run-unit.js +10 -2
  36. package/dist/resources/extensions/gsd/auto/session.js +6 -2
  37. package/dist/resources/extensions/gsd/auto/turn-epoch.js +95 -0
  38. package/dist/resources/extensions/gsd/auto-dispatch.js +201 -38
  39. package/dist/resources/extensions/gsd/auto-loop.js +1 -1
  40. package/dist/resources/extensions/gsd/auto-model-selection.js +124 -4
  41. package/dist/resources/extensions/gsd/auto-post-unit.js +215 -64
  42. package/dist/resources/extensions/gsd/auto-prompts.js +372 -104
  43. package/dist/resources/extensions/gsd/auto-recovery.js +210 -24
  44. package/dist/resources/extensions/gsd/auto-start.js +122 -30
  45. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +11 -5
  46. package/dist/resources/extensions/gsd/auto-tool-tracking.js +47 -7
  47. package/dist/resources/extensions/gsd/auto-unit-closeout.js +11 -2
  48. package/dist/resources/extensions/gsd/auto-worktree.js +180 -34
  49. package/dist/resources/extensions/gsd/auto.js +107 -35
  50. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +19 -1
  51. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +209 -0
  52. package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +5 -6
  53. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +11 -0
  54. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -3
  55. package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -6
  56. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +127 -9
  57. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +31 -4
  58. package/dist/resources/extensions/gsd/commands-cmux.js +9 -6
  59. package/dist/resources/extensions/gsd/commands-extensions.js +634 -43
  60. package/dist/resources/extensions/gsd/component-loader.js +447 -0
  61. package/dist/resources/extensions/gsd/component-types.js +69 -0
  62. package/dist/resources/extensions/gsd/context-store.js +23 -7
  63. package/dist/resources/extensions/gsd/detection.js +49 -1
  64. package/dist/resources/extensions/gsd/dispatch-guard.js +29 -3
  65. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  66. package/dist/resources/extensions/gsd/file-lock.js +49 -9
  67. package/dist/resources/extensions/gsd/forensics.js +106 -0
  68. package/dist/resources/extensions/gsd/gate-registry.js +2 -2
  69. package/dist/resources/extensions/gsd/git-constants.js +28 -1
  70. package/dist/resources/extensions/gsd/git-self-heal.js +27 -0
  71. package/dist/resources/extensions/gsd/git-service.js +127 -2
  72. package/dist/resources/extensions/gsd/gitignore.js +1 -0
  73. package/dist/resources/extensions/gsd/gsd-db.js +6 -3
  74. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -1
  75. package/dist/resources/extensions/gsd/guided-flow.js +39 -13
  76. package/dist/resources/extensions/gsd/journal.js +17 -2
  77. package/dist/resources/extensions/gsd/memory-extractor.js +7 -1
  78. package/dist/resources/extensions/gsd/milestone-actions.js +15 -0
  79. package/dist/resources/extensions/gsd/milestone-scope-classifier.js +299 -0
  80. package/dist/resources/extensions/gsd/milestone-summary-classifier.js +37 -0
  81. package/dist/resources/extensions/gsd/model-cost-table.js +3 -0
  82. package/dist/resources/extensions/gsd/model-router.js +6 -0
  83. package/dist/resources/extensions/gsd/native-git-bridge.js +34 -4
  84. package/dist/resources/extensions/gsd/notifications.js +30 -16
  85. package/dist/resources/extensions/gsd/preferences-validation.js +23 -0
  86. package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +4 -0
  87. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
  88. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
  89. package/dist/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
  90. package/dist/resources/extensions/gsd/prompts/plan-slice.md +15 -2
  91. package/dist/resources/extensions/gsd/prompts/system.md +1 -0
  92. package/dist/resources/extensions/gsd/reports.js +5 -4
  93. package/dist/resources/extensions/gsd/safety/git-checkpoint.js +11 -0
  94. package/dist/resources/extensions/gsd/service-tier.js +5 -2
  95. package/dist/resources/extensions/gsd/session-lock.js +19 -10
  96. package/dist/resources/extensions/gsd/skill-manifest.js +168 -0
  97. package/dist/resources/extensions/gsd/slice-cadence.js +238 -0
  98. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +278 -8
  99. package/dist/resources/extensions/gsd/state-transition-matrix.js +118 -0
  100. package/dist/resources/extensions/gsd/state.js +69 -58
  101. package/dist/resources/extensions/gsd/sync-lock.js +98 -42
  102. package/dist/resources/extensions/gsd/tools/complete-slice.js +21 -0
  103. package/dist/resources/extensions/gsd/tools/complete-task.js +31 -0
  104. package/dist/resources/extensions/gsd/tools/validate-milestone.js +7 -2
  105. package/dist/resources/extensions/gsd/unit-context-composer.js +147 -0
  106. package/dist/resources/extensions/gsd/unit-context-manifest.js +370 -0
  107. package/dist/resources/extensions/gsd/uok/audit.js +18 -2
  108. package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +33 -0
  109. package/dist/resources/extensions/gsd/uok/execution-graph.js +10 -0
  110. package/dist/resources/extensions/gsd/uok/gate-runner.js +53 -5
  111. package/dist/resources/extensions/gsd/uok/gitops.js +2 -1
  112. package/dist/resources/extensions/gsd/uok/loop-adapter.js +37 -10
  113. package/dist/resources/extensions/gsd/uok/parity-report.js +58 -0
  114. package/dist/resources/extensions/gsd/uok/plan-v2.js +10 -4
  115. package/dist/resources/extensions/gsd/uok/writer.js +82 -0
  116. package/dist/resources/extensions/gsd/workflow-logger.js +10 -2
  117. package/dist/resources/extensions/gsd/workflow-mcp.js +6 -0
  118. package/dist/resources/extensions/gsd/worktree-manager.js +86 -8
  119. package/dist/resources/extensions/gsd/worktree-resolver.js +86 -7
  120. package/dist/resources/extensions/gsd/worktree-telemetry.js +198 -0
  121. package/dist/resources/extensions/mcp-client/auth.js +10 -1
  122. package/dist/resources/extensions/mcp-client/index.js +121 -10
  123. package/dist/resources/extensions/ollama/index.js +5 -1
  124. package/dist/resources/extensions/remote-questions/manager.js +11 -5
  125. package/dist/resources/extensions/shared/cmux-events.js +12 -0
  126. package/dist/resources/extensions/shared/rtk-session-stats.js +1 -2
  127. package/dist/resources/skills/create-skill/SKILL.md +2 -2
  128. package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
  129. package/dist/resources/skills/create-skill/workflows/audit-skill.md +4 -4
  130. package/dist/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
  131. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  132. package/dist/web/standalone/.next/BUILD_ID +1 -1
  133. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  134. package/dist/web/standalone/.next/build-manifest.json +3 -3
  135. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  145. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  151. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  158. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  184. package/dist/web/standalone/.next/server/app/api/notifications/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  186. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/session/events/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  202. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  204. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  208. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  210. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  212. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  214. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  216. package/dist/web/standalone/.next/server/app/index.html +1 -1
  217. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  218. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  219. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  220. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  221. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  222. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  223. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  224. package/dist/web/standalone/.next/server/chunks/1926.js +1 -0
  225. package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
  226. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  227. package/dist/web/standalone/.next/server/middleware-manifest.json +1 -1
  228. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  229. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  230. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  231. package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +11 -0
  232. package/dist/web/standalone/.next/static/chunks/{webpack-5fc74f13a25fa1bb.js → webpack-2e68521d7c82f7c2.js} +1 -1
  233. package/package.json +17 -16
  234. package/packages/daemon/package.json +2 -2
  235. package/packages/daemon/src/logger.ts +4 -3
  236. package/packages/mcp-server/README.md +3 -3
  237. package/packages/mcp-server/dist/env-writer.d.ts +1 -0
  238. package/packages/mcp-server/dist/env-writer.d.ts.map +1 -1
  239. package/packages/mcp-server/dist/env-writer.js +74 -6
  240. package/packages/mcp-server/dist/env-writer.js.map +1 -1
  241. package/packages/mcp-server/dist/server.d.ts +24 -0
  242. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  243. package/packages/mcp-server/dist/server.js +111 -87
  244. package/packages/mcp-server/dist/server.js.map +1 -1
  245. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  246. package/packages/mcp-server/dist/workflow-tools.js +15 -6
  247. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  248. package/packages/mcp-server/package.json +7 -2
  249. package/packages/mcp-server/src/env-writer.test.ts +79 -1
  250. package/packages/mcp-server/src/env-writer.ts +76 -6
  251. package/packages/mcp-server/src/mcp-server.test.ts +25 -3
  252. package/packages/mcp-server/src/readers/graph.test.ts +87 -15
  253. package/packages/mcp-server/src/readers/readers.test.ts +5 -1
  254. package/packages/mcp-server/src/secure-env-collect.test.ts +232 -237
  255. package/packages/mcp-server/src/server.ts +158 -105
  256. package/packages/mcp-server/src/workflow-tools.test.ts +85 -0
  257. package/packages/mcp-server/src/workflow-tools.ts +19 -6
  258. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  259. package/packages/native/package.json +7 -2
  260. package/packages/native/src/__tests__/_test-coverage-guard.test.mjs +98 -0
  261. package/packages/native/src/__tests__/clipboard.test.mjs +69 -23
  262. package/packages/native/src/__tests__/module-compat.test.mjs +59 -27
  263. package/packages/native/src/__tests__/ps.test.mjs +14 -8
  264. package/packages/native/src/__tests__/stream-process.test.mjs +23 -2
  265. package/packages/native/src/__tests__/truncate.test.mjs +17 -2
  266. package/packages/native/tsconfig.tsbuildinfo +1 -1
  267. package/packages/pi-agent-core/package.json +6 -1
  268. package/packages/pi-agent-core/src/agent-loop.test.ts +226 -31
  269. package/packages/pi-agent-core/src/agent.test.ts +96 -102
  270. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  271. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
  272. package/packages/pi-ai/dist/models/capability-patches.js +9 -2
  273. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
  274. package/packages/pi-ai/dist/models/generated/index.d.ts +34 -0
  275. package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
  276. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
  277. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
  278. package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
  279. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
  280. package/packages/pi-ai/dist/models/generated/openai.d.ts +17 -0
  281. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -1
  282. package/packages/pi-ai/dist/models/generated/openai.js +17 -0
  283. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -1
  284. package/packages/pi-ai/dist/models.generated.test.js +43 -70
  285. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  286. package/packages/pi-ai/dist/models.test.js +36 -11
  287. package/packages/pi-ai/dist/models.test.js.map +1 -1
  288. package/packages/pi-ai/package.json +6 -1
  289. package/packages/pi-ai/scripts/generate-models.ts +44 -0
  290. package/packages/pi-ai/src/models/capability-patches.ts +10 -2
  291. package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
  292. package/packages/pi-ai/src/models/generated/openai.ts +17 -0
  293. package/packages/pi-ai/src/models.generated.test.ts +46 -73
  294. package/packages/pi-ai/src/models.test.ts +48 -11
  295. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  296. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +96 -32
  297. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  298. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js +75 -12
  299. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js.map +1 -1
  300. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +99 -31
  301. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +25 -0
  303. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  304. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +105 -6
  305. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  306. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +230 -28
  307. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  308. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts +30 -2
  309. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts.map +1 -1
  310. package/packages/pi-coding-agent/dist/core/compaction/utils.js +113 -12
  311. package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
  312. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts +1 -0
  313. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
  314. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +29 -18
  315. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  316. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts +2 -0
  317. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts.map +1 -0
  318. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js +130 -0
  319. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js.map +1 -0
  320. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js +56 -1
  321. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js.map +1 -1
  322. package/packages/pi-coding-agent/dist/core/discovery-cache.test.js +8 -15
  323. package/packages/pi-coding-agent/dist/core/discovery-cache.test.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts +25 -0
  325. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts.map +1 -0
  326. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js +109 -0
  327. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js.map +1 -0
  328. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts +67 -0
  329. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts.map +1 -0
  330. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js +167 -0
  331. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js.map +1 -0
  332. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +8 -2
  333. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  334. package/packages/pi-coding-agent/dist/core/extensions/loader.js +85 -8
  335. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  336. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +7 -0
  337. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  338. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  339. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +41 -4
  340. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -1
  341. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +19 -2
  342. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  343. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js +76 -18
  344. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/core/resource-loader.js +1 -1
  346. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  347. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  348. package/packages/pi-coding-agent/dist/core/retry-handler.js +2 -6
  349. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  350. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +5 -1
  351. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
  352. package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts +18 -0
  353. package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts.map +1 -0
  354. package/packages/pi-coding-agent/dist/core/retryable-error-regex.js +18 -0
  355. package/packages/pi-coding-agent/dist/core/retryable-error-regex.js.map +1 -0
  356. package/packages/pi-coding-agent/dist/core/sdk.d.ts +1 -0
  357. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  358. package/packages/pi-coding-agent/dist/core/sdk.js +4 -1
  359. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/core/sdk.test.js +19 -1
  361. package/packages/pi-coding-agent/dist/core/sdk.test.js.map +1 -1
  362. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +20 -0
  363. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  364. package/packages/pi-coding-agent/dist/core/system-prompt.js +19 -5
  365. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  366. package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js +2 -1
  367. package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js.map +1 -1
  368. package/packages/pi-coding-agent/dist/index.d.ts +1 -0
  369. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  370. package/packages/pi-coding-agent/dist/index.js +1 -0
  371. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  372. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js +15 -6
  373. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +36 -5
  375. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  376. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +20 -13
  377. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -1
  378. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  379. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -5
  380. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts +7 -1
  382. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  383. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +31 -9
  384. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  386. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +30 -12
  387. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  388. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  389. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +18 -3
  390. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  391. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +139 -0
  392. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  393. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +2 -0
  394. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  395. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  396. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +4 -0
  397. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  398. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +105 -13
  399. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  400. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts +2 -0
  401. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts.map +1 -0
  402. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js +130 -0
  403. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js.map +1 -0
  404. package/packages/pi-coding-agent/package.json +6 -1
  405. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +113 -37
  406. package/packages/pi-coding-agent/src/core/agent-session-model-switch.test.ts +89 -17
  407. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +112 -43
  408. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +368 -28
  409. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +122 -6
  410. package/packages/pi-coding-agent/src/core/compaction/utils.ts +111 -13
  411. package/packages/pi-coding-agent/src/core/compaction-orchestrator.test.ts +154 -0
  412. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +32 -18
  413. package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +68 -1
  414. package/packages/pi-coding-agent/src/core/discovery-cache.test.ts +9 -18
  415. package/packages/pi-coding-agent/src/core/extensions/extension-discovery.ts +119 -0
  416. package/packages/pi-coding-agent/src/core/extensions/extension-registry.ts +222 -0
  417. package/packages/pi-coding-agent/src/core/extensions/loader.ts +82 -11
  418. package/packages/pi-coding-agent/src/core/extensions/types.ts +8 -0
  419. package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +48 -4
  420. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +22 -2
  421. package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +93 -28
  422. package/packages/pi-coding-agent/src/core/resource-loader.ts +1 -1
  423. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +5 -1
  424. package/packages/pi-coding-agent/src/core/retry-handler.ts +2 -8
  425. package/packages/pi-coding-agent/src/core/retryable-error-regex.ts +18 -0
  426. package/packages/pi-coding-agent/src/core/sdk.test.ts +25 -1
  427. package/packages/pi-coding-agent/src/core/sdk.ts +10 -3
  428. package/packages/pi-coding-agent/src/core/system-prompt.ts +38 -4
  429. package/packages/pi-coding-agent/src/core/tools/path-utils.test.ts +2 -1
  430. package/packages/pi-coding-agent/src/index.ts +1 -0
  431. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/provider-display-name.test.ts +17 -7
  432. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +49 -3
  433. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +26 -20
  434. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +14 -5
  435. package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +45 -11
  436. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +48 -9
  437. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +160 -1
  438. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +20 -3
  439. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +2 -0
  440. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +119 -13
  441. package/packages/pi-coding-agent/src/tests/system-prompt-skill-filter.test.ts +157 -0
  442. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  443. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +31 -14
  444. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
  445. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +128 -17
  446. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
  447. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +51 -6
  448. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -1
  449. package/packages/pi-tui/dist/__tests__/tui.test.js +18 -30
  450. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  451. package/packages/pi-tui/dist/components/__tests__/input.test.js +10 -3
  452. package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -1
  453. package/packages/pi-tui/dist/components/__tests__/loader.test.js +53 -9
  454. package/packages/pi-tui/dist/components/__tests__/loader.test.js.map +1 -1
  455. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js +6 -2
  456. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js.map +1 -1
  457. package/packages/pi-tui/dist/components/editor.d.ts +14 -0
  458. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  459. package/packages/pi-tui/dist/components/editor.js +19 -0
  460. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  461. package/packages/pi-tui/dist/components/image.test.js +6 -5
  462. package/packages/pi-tui/dist/components/image.test.js.map +1 -1
  463. package/packages/pi-tui/dist/editor-component.d.ts +2 -0
  464. package/packages/pi-tui/dist/editor-component.d.ts.map +1 -1
  465. package/packages/pi-tui/dist/editor-component.js.map +1 -1
  466. package/packages/pi-tui/dist/stdin-buffer.d.ts +7 -0
  467. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  468. package/packages/pi-tui/dist/stdin-buffer.js +20 -0
  469. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  470. package/packages/pi-tui/package.json +6 -1
  471. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +46 -15
  472. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +140 -17
  473. package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +62 -6
  474. package/packages/pi-tui/src/__tests__/tui.test.ts +18 -37
  475. package/packages/pi-tui/src/components/__tests__/input.test.ts +19 -3
  476. package/packages/pi-tui/src/components/__tests__/loader.test.ts +112 -35
  477. package/packages/pi-tui/src/components/__tests__/markdown-maxlines.test.ts +9 -2
  478. package/packages/pi-tui/src/components/editor.ts +22 -0
  479. package/packages/pi-tui/src/components/image.test.ts +10 -5
  480. package/packages/pi-tui/src/editor-component.ts +3 -0
  481. package/packages/pi-tui/src/stdin-buffer.ts +26 -0
  482. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  483. package/packages/rpc-client/dist/rpc-client.test.js +101 -51
  484. package/packages/rpc-client/dist/rpc-client.test.js.map +1 -1
  485. package/packages/rpc-client/package.json +6 -1
  486. package/packages/rpc-client/src/rpc-client.test.ts +109 -52
  487. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  488. package/pkg/package.json +1 -1
  489. package/scripts/install.js +526 -0
  490. package/scripts/lib/workspace-manifest.cjs +86 -0
  491. package/scripts/link-workspace-packages.cjs +5 -17
  492. package/scripts/postinstall.js +9 -178
  493. package/src/resources/extensions/browser-tools/capture.ts +12 -0
  494. package/src/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
  495. package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
  496. package/src/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
  497. package/src/resources/extensions/browser-tools/tools/forms.ts +5 -1
  498. package/src/resources/extensions/browser-tools/tools/intent.ts +5 -1
  499. package/src/resources/extensions/claude-code-cli/readiness.ts +5 -1
  500. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +602 -73
  501. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +1028 -91
  502. package/src/resources/extensions/cmux/index.ts +35 -10
  503. package/src/resources/extensions/github-sync/templates.ts +151 -0
  504. package/src/resources/extensions/github-sync/tests/cli.test.ts +76 -7
  505. package/src/resources/extensions/github-sync/tests/templates.test.ts +92 -1
  506. package/src/resources/extensions/google-search/extension-manifest.json +5 -4
  507. package/src/resources/extensions/google-search/index.ts +9 -470
  508. package/src/resources/extensions/gsd/abandon-detect.ts +62 -0
  509. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  510. package/src/resources/extensions/gsd/auto/loop.ts +142 -2
  511. package/src/resources/extensions/gsd/auto/phases.ts +62 -38
  512. package/src/resources/extensions/gsd/auto/resolve.ts +29 -0
  513. package/src/resources/extensions/gsd/auto/run-unit.ts +16 -2
  514. package/src/resources/extensions/gsd/auto/session.ts +7 -2
  515. package/src/resources/extensions/gsd/auto/turn-epoch.ts +108 -0
  516. package/src/resources/extensions/gsd/auto/types.ts +1 -1
  517. package/src/resources/extensions/gsd/auto-dispatch.ts +214 -37
  518. package/src/resources/extensions/gsd/auto-loop.ts +1 -1
  519. package/src/resources/extensions/gsd/auto-model-selection.ts +131 -4
  520. package/src/resources/extensions/gsd/auto-post-unit.ts +226 -73
  521. package/src/resources/extensions/gsd/auto-prompts.ts +385 -93
  522. package/src/resources/extensions/gsd/auto-recovery.ts +240 -25
  523. package/src/resources/extensions/gsd/auto-start.ts +146 -14
  524. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +12 -5
  525. package/src/resources/extensions/gsd/auto-tool-tracking.ts +51 -7
  526. package/src/resources/extensions/gsd/auto-unit-closeout.ts +14 -3
  527. package/src/resources/extensions/gsd/auto-worktree.ts +190 -31
  528. package/src/resources/extensions/gsd/auto.ts +127 -41
  529. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +20 -1
  530. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +221 -0
  531. package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +6 -6
  532. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +11 -0
  533. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -3
  534. package/src/resources/extensions/gsd/bootstrap/system-context.ts +13 -9
  535. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +158 -9
  536. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +27 -8
  537. package/src/resources/extensions/gsd/commands-cmux.ts +10 -6
  538. package/src/resources/extensions/gsd/commands-extensions.ts +747 -41
  539. package/src/resources/extensions/gsd/component-loader.ts +598 -0
  540. package/src/resources/extensions/gsd/component-types.ts +362 -0
  541. package/src/resources/extensions/gsd/context-store.ts +25 -8
  542. package/src/resources/extensions/gsd/detection.ts +58 -1
  543. package/src/resources/extensions/gsd/dispatch-guard.ts +26 -2
  544. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  545. package/src/resources/extensions/gsd/file-lock.ts +84 -11
  546. package/src/resources/extensions/gsd/forensics.ts +118 -1
  547. package/src/resources/extensions/gsd/gate-registry.ts +2 -2
  548. package/src/resources/extensions/gsd/git-constants.ts +30 -1
  549. package/src/resources/extensions/gsd/git-self-heal.ts +31 -0
  550. package/src/resources/extensions/gsd/git-service.ts +150 -2
  551. package/src/resources/extensions/gsd/gitignore.ts +1 -0
  552. package/src/resources/extensions/gsd/gsd-db.ts +6 -3
  553. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -1
  554. package/src/resources/extensions/gsd/guided-flow.ts +57 -14
  555. package/src/resources/extensions/gsd/journal.ts +38 -3
  556. package/src/resources/extensions/gsd/memory-extractor.ts +11 -3
  557. package/src/resources/extensions/gsd/milestone-actions.ts +18 -0
  558. package/src/resources/extensions/gsd/milestone-scope-classifier.ts +366 -0
  559. package/src/resources/extensions/gsd/milestone-summary-classifier.ts +42 -0
  560. package/src/resources/extensions/gsd/model-cost-table.ts +3 -0
  561. package/src/resources/extensions/gsd/model-router.ts +6 -0
  562. package/src/resources/extensions/gsd/native-git-bridge.ts +34 -4
  563. package/src/resources/extensions/gsd/notifications.ts +27 -15
  564. package/src/resources/extensions/gsd/preferences-validation.ts +21 -0
  565. package/src/resources/extensions/gsd/prompt-cache-optimizer.ts +4 -0
  566. package/src/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
  567. package/src/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
  568. package/src/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
  569. package/src/resources/extensions/gsd/prompts/plan-slice.md +15 -2
  570. package/src/resources/extensions/gsd/prompts/system.md +1 -0
  571. package/src/resources/extensions/gsd/reports.ts +5 -4
  572. package/src/resources/extensions/gsd/safety/git-checkpoint.ts +15 -0
  573. package/src/resources/extensions/gsd/service-tier.ts +5 -2
  574. package/src/resources/extensions/gsd/session-lock.ts +20 -10
  575. package/src/resources/extensions/gsd/skill-manifest.ts +175 -0
  576. package/src/resources/extensions/gsd/slice-cadence.ts +299 -0
  577. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +309 -8
  578. package/src/resources/extensions/gsd/state-transition-matrix.ts +152 -0
  579. package/src/resources/extensions/gsd/state.ts +76 -66
  580. package/src/resources/extensions/gsd/sync-lock.ts +97 -39
  581. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +270 -0
  582. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +2 -1
  583. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +341 -0
  584. package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +264 -0
  585. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +135 -285
  586. package/src/resources/extensions/gsd/tests/auto-mode-guards.test.ts +79 -0
  587. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +742 -0
  588. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +78 -0
  589. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +61 -0
  590. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +166 -0
  591. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +4 -1
  592. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +8 -194
  593. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +64 -0
  594. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +2 -2
  595. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +15 -58
  596. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +2 -2
  597. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +3 -2
  598. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +3 -2
  599. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +2 -1
  600. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +17 -21
  601. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +108 -0
  602. package/src/resources/extensions/gsd/tests/cmux.test.ts +5 -9
  603. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +263 -0
  604. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +25 -0
  605. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +192 -0
  606. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +2 -1
  607. package/src/resources/extensions/gsd/tests/complete-task.test.ts +16 -8
  608. package/src/resources/extensions/gsd/tests/component-loader.test.ts +589 -0
  609. package/src/resources/extensions/gsd/tests/component-types.test.ts +127 -0
  610. package/src/resources/extensions/gsd/tests/context-store.test.ts +79 -0
  611. package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +2 -1
  612. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +50 -1
  613. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +159 -0
  614. package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +1 -0
  615. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -3
  616. package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +40 -0
  617. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +91 -3
  618. package/src/resources/extensions/gsd/tests/derive-state.test.ts +4 -4
  619. package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +2 -1
  620. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +2 -1
  621. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +14 -9
  622. package/src/resources/extensions/gsd/tests/dispatch-guard-summary-db-mismatch.test.ts +77 -0
  623. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +25 -0
  624. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +14 -0
  625. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +3 -2
  626. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +4 -3
  627. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +4 -3
  628. package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +173 -0
  629. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +139 -129
  630. package/src/resources/extensions/gsd/tests/file-lock.test.ts +86 -12
  631. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +8 -104
  632. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +102 -0
  633. package/src/resources/extensions/gsd/tests/gate-storage.test.ts +1 -1
  634. package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +131 -0
  635. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +117 -0
  636. package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +4 -55
  637. package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +7 -56
  638. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +20 -0
  639. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +30 -0
  640. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +18 -2
  641. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  642. package/src/resources/extensions/gsd/tests/integration/queue-completed-milestone-perf.test.ts +10 -4
  643. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +144 -7
  644. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +4 -0
  645. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +2 -16
  646. package/src/resources/extensions/gsd/tests/integration/worktree-e2e.test.ts +11 -0
  647. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +9 -3
  648. package/src/resources/extensions/gsd/tests/interrupted-session-ui.test.ts +6 -9
  649. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +64 -0
  650. package/src/resources/extensions/gsd/tests/knowledge.test.ts +93 -1
  651. package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +47 -0
  652. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +5 -15
  653. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +227 -55
  654. package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +187 -0
  655. package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +3 -3
  656. package/src/resources/extensions/gsd/tests/milestone-summary-classifier.test.ts +30 -0
  657. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +4 -2
  658. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
  659. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  660. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +6 -48
  661. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +6 -3
  662. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +59 -2
  663. package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +5 -0
  664. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +273 -130
  665. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +150 -0
  666. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +301 -0
  667. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +32 -1
  668. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +2 -1
  669. package/src/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +12 -0
  670. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +15 -4
  671. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +54 -41
  672. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +213 -0
  673. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +3 -2
  674. package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +4 -5
  675. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +13 -7
  676. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +75 -2
  677. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +132 -0
  678. package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +8 -40
  679. package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +136 -256
  680. package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +170 -0
  681. package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +114 -0
  682. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +6 -3
  683. package/src/resources/extensions/gsd/tests/rewrite-docs-abandon-detect.test.ts +195 -0
  684. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +148 -0
  685. package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
  686. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +29 -0
  687. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +3 -2
  688. package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +55 -95
  689. package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +158 -0
  690. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +120 -1
  691. package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +112 -0
  692. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +242 -0
  693. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +3 -2
  694. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +164 -1
  695. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +2 -1
  696. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +112 -0
  697. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +29 -5
  698. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +44 -0
  699. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +3 -3
  700. package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +11 -92
  701. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +2 -2
  702. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +7 -6
  703. package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +102 -101
  704. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +31 -0
  705. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +4 -3
  706. package/src/resources/extensions/gsd/tests/test-helpers.test.ts +98 -0
  707. package/src/resources/extensions/gsd/tests/test-helpers.ts +153 -0
  708. package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -1
  709. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +61 -1
  710. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -1
  711. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +50 -2
  712. package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +162 -0
  713. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +355 -0
  714. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +258 -0
  715. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +51 -0
  716. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +16 -0
  717. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +75 -0
  718. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +49 -26
  719. package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +65 -0
  720. package/src/resources/extensions/gsd/tests/uok-parity-report.test.ts +42 -0
  721. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +19 -2
  722. package/src/resources/extensions/gsd/tests/uok-writer.test.ts +75 -0
  723. package/src/resources/extensions/gsd/tests/validate-extension-package.test.ts +168 -0
  724. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +139 -5
  725. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +144 -80
  726. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -54
  727. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +342 -277
  728. package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +37 -29
  729. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +25 -2
  730. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +226 -266
  731. package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +103 -67
  732. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +92 -90
  733. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +238 -59
  734. package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +113 -161
  735. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +210 -0
  736. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +262 -0
  737. package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +186 -0
  738. package/src/resources/extensions/gsd/tests/write-gate.test.ts +7 -5
  739. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +80 -96
  740. package/src/resources/extensions/gsd/tools/complete-slice.ts +38 -0
  741. package/src/resources/extensions/gsd/tools/complete-task.ts +49 -0
  742. package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -2
  743. package/src/resources/extensions/gsd/types.ts +3 -3
  744. package/src/resources/extensions/gsd/unit-context-composer.ts +218 -0
  745. package/src/resources/extensions/gsd/unit-context-manifest.ts +574 -0
  746. package/src/resources/extensions/gsd/uok/audit.ts +20 -2
  747. package/src/resources/extensions/gsd/uok/contracts.ts +65 -0
  748. package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +56 -0
  749. package/src/resources/extensions/gsd/uok/execution-graph.ts +22 -0
  750. package/src/resources/extensions/gsd/uok/gate-runner.ts +65 -5
  751. package/src/resources/extensions/gsd/uok/gitops.ts +6 -1
  752. package/src/resources/extensions/gsd/uok/loop-adapter.ts +45 -10
  753. package/src/resources/extensions/gsd/uok/parity-report.ts +84 -0
  754. package/src/resources/extensions/gsd/uok/plan-v2.ts +13 -5
  755. package/src/resources/extensions/gsd/uok/writer.ts +113 -0
  756. package/src/resources/extensions/gsd/workflow-logger.ts +22 -3
  757. package/src/resources/extensions/gsd/workflow-mcp.ts +6 -0
  758. package/src/resources/extensions/gsd/worktree-manager.ts +109 -7
  759. package/src/resources/extensions/gsd/worktree-resolver.ts +96 -9
  760. package/src/resources/extensions/gsd/worktree-telemetry.ts +322 -0
  761. package/src/resources/extensions/mcp-client/auth.ts +12 -1
  762. package/src/resources/extensions/mcp-client/index.ts +132 -11
  763. package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +70 -36
  764. package/src/resources/extensions/ollama/index.ts +5 -1
  765. package/src/resources/extensions/ollama/ollama-auth-mode.test.ts +123 -15
  766. package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +206 -19
  767. package/src/resources/extensions/remote-questions/manager.ts +36 -4
  768. package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +200 -190
  769. package/src/resources/extensions/shared/cmux-events.ts +59 -0
  770. package/src/resources/extensions/shared/rtk-session-stats.ts +1 -2
  771. package/src/resources/extensions/shared/tests/interview-preview.test.ts +11 -3
  772. package/src/resources/extensions/voice/tests/linux-ready.test.ts +129 -113
  773. package/src/resources/skills/create-skill/SKILL.md +2 -2
  774. package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
  775. package/src/resources/skills/create-skill/workflows/audit-skill.md +4 -4
  776. package/src/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
  777. package/dist/web/standalone/.next/server/chunks/7461.js +0 -1
  778. package/dist/web/standalone/.next/static/chunks/2826.e59e8578e2e28639.js +0 -9
  779. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts +0 -2
  780. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts.map +0 -1
  781. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js +0 -289
  782. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js.map +0 -1
  783. package/packages/pi-ai/src/utils/oauth/oauth-providers.test.ts +0 -363
  784. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +0 -143
  785. package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +0 -142
  786. package/src/resources/extensions/gsd/tests/dashboard-model-label-ordering.test.ts +0 -107
  787. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed.test.ts +0 -48
  788. package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -159
  789. package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
  790. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -79
  791. package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +0 -74
  792. package/src/resources/extensions/gsd/tests/forensics-journal.test.ts +0 -162
  793. package/src/resources/extensions/gsd/tests/gitignore-bg-shell.test.ts +0 -38
  794. package/src/resources/extensions/gsd/tests/gsd-no-project-error.test.ts +0 -73
  795. package/src/resources/extensions/gsd/tests/idle-watchdog-stall-override.test.ts +0 -125
  796. package/src/resources/extensions/gsd/tests/import-done-milestones.test.ts +0 -42
  797. /package/dist/web/standalone/.next/static/{pV-mPo7rYGb5JBC09C8GG → C1zT2kEfoLhDdbWPWKrXd}/_buildManifest.js +0 -0
  798. /package/dist/web/standalone/.next/static/{pV-mPo7rYGb5JBC09C8GG → C1zT2kEfoLhDdbWPWKrXd}/_ssgManifest.js +0 -0
@@ -159,7 +159,7 @@ Setting `prefer_skills: []` does **not** disable skill discovery — it just mea
159
159
 
160
160
  - `phases`: fine-grained control over which phases run. Usually set by `token_profile`, but can be overridden. Keys:
161
161
  - `skip_research`: boolean — skip milestone-level research. Default: `false`.
162
- - `reassess_after_slice`: boolean — run roadmap reassessment after each completed slice. Default: `true`.
162
+ - `reassess_after_slice`: boolean — run a dedicated roadmap-reassessment unit after each completed slice. Default: `false` (per ADR-003 §4). The plan-slice agent for the next slice performs JIT reassessment via a prompt preamble at zero additional token cost; a dedicated reassess session is opt-in. Set to `true` (e.g. via the `burn-max` profile) if you want the explicit session.
163
163
  - `skip_reassess`: boolean — force-disable roadmap reassessment even if `reassess_after_slice` is enabled. Default: `false`.
164
164
  - `skip_slice_research`: boolean — skip per-slice research. Default: `false`.
165
165
 
@@ -1,11 +1,19 @@
1
1
  import { existsSync } from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import { join } from "node:path";
4
+ // The file-lock module is loaded in both CJS builds and ESM sources. Under ESM
5
+ // the bare `require` identifier is not defined, so we always go through
6
+ // createRequire. We try the current module's resolution context first and fall
7
+ // back to the installed gsd-pi package if we are running from a consumer
8
+ // project that does not hoist proper-lockfile.
9
+ const localRequire = createRequire(import.meta.url);
2
10
  function _require(name) {
3
11
  try {
4
- return require(name);
12
+ return localRequire(name);
5
13
  }
6
14
  catch {
7
15
  try {
8
- const gsdPiRequire = require("module").createRequire(require("path").join(process.cwd(), "node_modules", "gsd-pi", "index.js"));
16
+ const gsdPiRequire = createRequire(join(process.cwd(), "node_modules", "gsd-pi", "index.js"));
9
17
  return gsdPiRequire(name);
10
18
  }
11
19
  catch {
@@ -13,14 +21,44 @@ function _require(name) {
13
21
  }
14
22
  }
15
23
  }
16
- export function withFileLockSync(filePath, fn) {
24
+ const DEFAULT_RETRIES = 5;
25
+ const DEFAULT_STALE_MS = 10000;
26
+ const SYNC_RETRY_DELAY_MS = 50;
27
+ // Block the thread for `ms` milliseconds without spinning the CPU.
28
+ // Used by the sync lock retry loop, since proper-lockfile's lockSync does not
29
+ // accept a `retries` option (only the async `lock` does).
30
+ function sleepSync(ms) {
31
+ if (ms <= 0)
32
+ return;
33
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
34
+ }
35
+ function acquireLockSyncWithRetry(lockfile, filePath, retries, stale) {
36
+ let lastErr;
37
+ for (let attempt = 0; attempt <= retries; attempt++) {
38
+ try {
39
+ return lockfile.lockSync(filePath, { stale });
40
+ }
41
+ catch (err) {
42
+ lastErr = err;
43
+ if (err?.code !== "ELOCKED")
44
+ throw err;
45
+ if (attempt < retries)
46
+ sleepSync(SYNC_RETRY_DELAY_MS);
47
+ }
48
+ }
49
+ throw lastErr;
50
+ }
51
+ export function withFileLockSync(filePath, fn, opts = {}) {
17
52
  const lockfile = _require("proper-lockfile");
18
53
  if (!lockfile)
19
54
  return fn();
20
55
  if (!existsSync(filePath))
21
56
  return fn();
57
+ const retries = opts.retries ?? DEFAULT_RETRIES;
58
+ const stale = opts.stale ?? DEFAULT_STALE_MS;
59
+ const onLocked = opts.onLocked ?? "fail";
22
60
  try {
23
- const release = lockfile.lockSync(filePath, { retries: 5, stale: 10000 });
61
+ const release = acquireLockSyncWithRetry(lockfile, filePath, retries, stale);
24
62
  try {
25
63
  return fn();
26
64
  }
@@ -29,21 +67,23 @@ export function withFileLockSync(filePath, fn) {
29
67
  }
30
68
  }
31
69
  catch (err) {
32
- if (err.code === "ELOCKED") {
33
- // Could not get lock after retries, let's fallback to un-locked instead of crashing the whole state machine
70
+ if (err?.code === "ELOCKED" && onLocked === "skip") {
34
71
  return fn();
35
72
  }
36
73
  throw err;
37
74
  }
38
75
  }
39
- export async function withFileLock(filePath, fn) {
76
+ export async function withFileLock(filePath, fn, opts = {}) {
40
77
  const lockfile = _require("proper-lockfile");
41
78
  if (!lockfile)
42
79
  return await fn();
43
80
  if (!existsSync(filePath))
44
81
  return await fn();
82
+ const retries = opts.retries ?? DEFAULT_RETRIES;
83
+ const stale = opts.stale ?? DEFAULT_STALE_MS;
84
+ const onLocked = opts.onLocked ?? "fail";
45
85
  try {
46
- const release = await lockfile.lock(filePath, { retries: 5, stale: 10000 });
86
+ const release = await lockfile.lock(filePath, { retries, stale });
47
87
  try {
48
88
  return await fn();
49
89
  }
@@ -52,7 +92,7 @@ export async function withFileLock(filePath, fn) {
52
92
  }
53
93
  }
54
94
  catch (err) {
55
- if (err.code === "ELOCKED") {
95
+ if (err?.code === "ELOCKED" && onLocked === "skip") {
56
96
  return await fn();
57
97
  }
58
98
  throw err;
@@ -29,6 +29,7 @@ import { getAutoWorktreePath } from "./auto-worktree.js";
29
29
  import { loadEffectiveGSDPreferences, loadGlobalGSDPreferences, getGlobalGSDPreferencesPath } from "./preferences.js";
30
30
  import { showNextAction } from "../shared/tui.js";
31
31
  import { ensurePreferencesFile, serializePreferencesToFrontmatter } from "./commands-prefs-wizard.js";
32
+ import { summarizeWorktreeTelemetry, percentile } from "./worktree-telemetry.js";
32
33
  // ─── Duplicate Detection ──────────────────────────────────────────────────────
33
34
  const DEDUP_PROMPT_SECTION = `
34
35
  ## Pre-Investigation: Duplicate Check (REQUIRED)
@@ -214,6 +215,16 @@ export async function buildForensicReport(basePath) {
214
215
  detectCrash(crashLock, anomalies);
215
216
  detectDoctorIssues(doctorIssues, anomalies);
216
217
  detectErrorTraces(unitTraces, anomalies);
218
+ // 11b. #4764 — worktree lifecycle telemetry
219
+ let worktreeTelemetry = null;
220
+ try {
221
+ worktreeTelemetry = summarizeWorktreeTelemetry(basePath);
222
+ detectWorktreeOrphans(worktreeTelemetry, anomalies);
223
+ }
224
+ catch {
225
+ // Telemetry is best-effort — do not let an aggregator failure block the
226
+ // rest of the forensic report.
227
+ }
217
228
  detectJournalAnomalies(journalSummary, anomalies);
218
229
  return {
219
230
  gsdVersion,
@@ -232,6 +243,7 @@ export async function buildForensicReport(basePath) {
232
243
  recentUnits,
233
244
  journalSummary,
234
245
  activityLogMeta,
246
+ worktreeTelemetry,
235
247
  };
236
248
  }
237
249
  // ─── Activity Log Scanner ─────────────────────────────────────────────────────
@@ -630,6 +642,45 @@ function detectMissingArtifacts(completedKeys, basePath, activeMilestone, anomal
630
642
  }
631
643
  }
632
644
  }
645
+ /**
646
+ * #4764 — surface worktree lifecycle and orphan signals in the forensic report.
647
+ *
648
+ * Consumes only the aggregated summary (not raw journal events) to respect
649
+ * the forensics memory-bloat guard in forensics-journal.test.ts — per-event
650
+ * detail stays in the journal itself where the LLM can query it on demand.
651
+ */
652
+ function detectWorktreeOrphans(summary, anomalies) {
653
+ // 1. Orphan aggregate — severity depends on reason. In-progress orphans are
654
+ // the #4761 consumer-side signal (live work sitting on an unmerged branch).
655
+ for (const [reason, count] of Object.entries(summary.orphansByReason)) {
656
+ if (count <= 0)
657
+ continue;
658
+ const severity = reason === "in-progress-unmerged" ? "warning" : "info";
659
+ anomalies.push({
660
+ type: "worktree-orphan",
661
+ severity,
662
+ summary: `${count} worktree orphan(s) detected (${reason})`,
663
+ details: reason === "in-progress-unmerged"
664
+ ? "Auto-mode exited without completing a milestone; live work sits on an unmerged milestone branch. Run `/gsd auto` to resume, or merge manually."
665
+ : reason === "complete-unmerged"
666
+ ? "A completed milestone's branch was never merged back to main. Run `/gsd health --fix` to resolve."
667
+ : `Reason: ${reason}.`,
668
+ });
669
+ }
670
+ // 2. Auto-exit producer signal — #4761's upstream cause.
671
+ if (summary.exitsWithUnmergedWork > 0) {
672
+ const reasonBreakdown = Object.entries(summary.exitsByReason)
673
+ .filter(([, n]) => n > 0)
674
+ .map(([r, n]) => `${r}=${n}`)
675
+ .join(", ");
676
+ anomalies.push({
677
+ type: "worktree-unmerged-exit",
678
+ severity: "warning",
679
+ summary: `${summary.exitsWithUnmergedWork} auto-exit(s) left milestone work unmerged`,
680
+ details: `Exit reasons: ${reasonBreakdown || "(none)"} · Producer-side signal for #4761-class orphans. Inspect .gsd/journal/*.jsonl with eventType:"auto-exit" for per-exit detail.`,
681
+ });
682
+ }
683
+ }
633
684
  function detectCrash(crashLock, anomalies) {
634
685
  if (!crashLock)
635
686
  return;
@@ -808,6 +859,39 @@ function saveForensicReport(basePath, report, problemDescription) {
808
859
  sections.push(`- Newest: ${meta.newestFile}`);
809
860
  sections.push(``);
810
861
  }
862
+ // #4764 — Worktree telemetry summary
863
+ if (report.worktreeTelemetry) {
864
+ const t = report.worktreeTelemetry;
865
+ const p50 = percentile(t.mergeDurationsMs, 0.5);
866
+ const p95 = percentile(t.mergeDurationsMs, 0.95);
867
+ sections.push(`## Worktree Telemetry`, ``);
868
+ sections.push(`- Worktrees created: ${t.worktreesCreated}`);
869
+ sections.push(`- Worktrees merged: ${t.worktreesMerged}`);
870
+ sections.push(`- Orphans detected: ${t.orphansDetected}`);
871
+ if (t.orphansDetected > 0) {
872
+ const breakdown = Object.entries(t.orphansByReason)
873
+ .map(([r, n]) => `${r}=${n}`).join(", ");
874
+ sections.push(` - By reason: ${breakdown}`);
875
+ }
876
+ sections.push(`- Merge conflicts: ${t.mergeConflicts}`);
877
+ if (t.mergeDurationsMs.length > 0) {
878
+ sections.push(`- Merge duration p50 / p95: ${p50 ?? "-"} / ${p95 ?? "-"} ms (n=${t.mergeDurationsMs.length})`);
879
+ }
880
+ sections.push(`- Auto-exits leaving unmerged work: ${t.exitsWithUnmergedWork}`);
881
+ if (Object.keys(t.exitsByReason).length > 0) {
882
+ const breakdown = Object.entries(t.exitsByReason)
883
+ .sort((a, b) => b[1] - a[1])
884
+ .map(([r, n]) => `${r}=${n}`).join(", ");
885
+ sections.push(` - Exit reasons: ${breakdown}`);
886
+ }
887
+ sections.push(`- Canonical-root redirects (#4761 fix fired): ${t.canonicalRedirects}`);
888
+ // #4765 slice-cadence counters
889
+ if (t.slicesMerged + t.sliceMergeConflicts + t.milestoneResquashes > 0) {
890
+ sections.push(`- Slices merged: ${t.slicesMerged} · Slice merge conflicts: ${t.sliceMergeConflicts}`);
891
+ sections.push(`- Milestone re-squashes: ${t.milestoneResquashes}`);
892
+ }
893
+ sections.push(``);
894
+ }
811
895
  // Journal summary
812
896
  if (report.journalSummary) {
813
897
  const js = report.journalSummary;
@@ -940,6 +1024,28 @@ function formatReportForPrompt(report) {
940
1024
  sections.push(`- Total duration: ${formatDuration(totals.duration)}`);
941
1025
  sections.push("");
942
1026
  }
1027
+ // #4764 — worktree telemetry (compact prompt form)
1028
+ if (report.worktreeTelemetry) {
1029
+ const t = report.worktreeTelemetry;
1030
+ const hasSignal = t.worktreesCreated + t.worktreesMerged + t.orphansDetected +
1031
+ t.exitsWithUnmergedWork + t.canonicalRedirects +
1032
+ t.slicesMerged + t.milestoneResquashes > 0;
1033
+ if (hasSignal) {
1034
+ sections.push("### Worktree Telemetry");
1035
+ sections.push(`- Created: ${t.worktreesCreated} · Merged: ${t.worktreesMerged} · Conflicts: ${t.mergeConflicts}`);
1036
+ sections.push(`- Orphans: ${t.orphansDetected} · Unmerged exits: ${t.exitsWithUnmergedWork} · Redirects (#4761): ${t.canonicalRedirects}`);
1037
+ if (t.orphansDetected > 0) {
1038
+ const breakdown = Object.entries(t.orphansByReason)
1039
+ .map(([r, n]) => `${r}=${n}`).join(", ");
1040
+ sections.push(`- Orphan reasons: ${breakdown}`);
1041
+ }
1042
+ // #4765 — slice-cadence counters (only shown when the feature was exercised)
1043
+ if (t.slicesMerged + t.sliceMergeConflicts + t.milestoneResquashes > 0) {
1044
+ sections.push(`- Slices merged: ${t.slicesMerged} · Slice conflicts: ${t.sliceMergeConflicts} · Re-squashes: ${t.milestoneResquashes}`);
1045
+ }
1046
+ sections.push("");
1047
+ }
1048
+ }
943
1049
  // Activity log metadata
944
1050
  if (report.activityLogMeta) {
945
1051
  const meta = report.activityLogMeta;
@@ -37,9 +37,9 @@ export const GATE_REGISTRY = {
37
37
  id: "Q4",
38
38
  scope: "slice",
39
39
  ownerTurn: "gate-evaluate",
40
- question: "What existing promises does this break?",
40
+ question: "Which existing requirements (R-IDs) does this slice touch, and which must be re-tested?",
41
41
  guidance: [
42
- "List which existing requirements (R001, R003, etc.) are touched by this slice.",
42
+ "List the R-IDs (e.g. R001, R003) touched by this slice; see the milestone requirements artifact at .gsd/milestones/<id>/REQUIREMENTS.md.",
43
43
  "Identify what must be re-tested after shipping.",
44
44
  "Flag decisions that should be revisited given the new scope.",
45
45
  "If no existing requirements are affected, return verdict 'omitted'.",
@@ -1,9 +1,36 @@
1
1
  /**
2
2
  * Shared git constants used across git-service and native-git-bridge.
3
3
  */
4
+ /**
5
+ * Parent process env vars that, if leaked into a git child process, can
6
+ * silently redirect every operation to a different repo or index.
7
+ *
8
+ * Stripped from GIT_NO_PROMPT_ENV so a GSD invoked from inside a git hook,
9
+ * a different worktree's terminal, or any context that pre-set these vars
10
+ * cannot redirect GSD's git operations to the wrong target.
11
+ * (Issue #4980 NEW-1)
12
+ */
13
+ const LEAKING_GIT_ENV_VARS = [
14
+ "GIT_DIR",
15
+ "GIT_WORK_TREE",
16
+ "GIT_INDEX_FILE",
17
+ "GIT_OBJECT_DIRECTORY",
18
+ "GIT_ALTERNATE_OBJECT_DIRECTORIES",
19
+ "GIT_COMMON_DIR",
20
+ "GIT_NAMESPACE",
21
+ ];
22
+ function buildSafeParentEnv() {
23
+ const safe = {};
24
+ for (const [k, v] of Object.entries(process.env)) {
25
+ if (!LEAKING_GIT_ENV_VARS.includes(k)) {
26
+ safe[k] = v;
27
+ }
28
+ }
29
+ return safe;
30
+ }
4
31
  /** Env overlay that suppresses interactive git credential prompts and git-svn noise. */
5
32
  export const GIT_NO_PROMPT_ENV = {
6
- ...process.env,
33
+ ...buildSafeParentEnv(),
7
34
  GIT_TERMINAL_PROMPT: "0",
8
35
  GIT_ASKPASS: "",
9
36
  GIT_SVN_ID: "",
@@ -9,12 +9,25 @@
9
9
  * what actions were taken. `formatGitError` maps raw git errors to
10
10
  * user-friendly messages suggesting `/gsd doctor`.
11
11
  */
12
+ import { execFileSync } from "node:child_process";
12
13
  import { existsSync, unlinkSync } from "node:fs";
13
14
  import { join } from "node:path";
14
15
  import { MergeConflictError } from "./git-service.js";
15
16
  import { nativeMergeAbort, nativeRebaseAbort, nativeResetHard } from "./native-git-bridge.js";
16
17
  // Re-export for consumers
17
18
  export { MergeConflictError };
19
+ function hasWorkingTreeChanges(cwd) {
20
+ try {
21
+ return execFileSync("git", ["status", "--porcelain"], {
22
+ cwd,
23
+ stdio: ["ignore", "pipe", "pipe"],
24
+ encoding: "utf-8",
25
+ }).trim().length > 0;
26
+ }
27
+ catch {
28
+ return true;
29
+ }
30
+ }
18
31
  /**
19
32
  * Detect and clean up leftover merge/rebase state, then hard-reset.
20
33
  *
@@ -60,6 +73,20 @@ export function abortAndReset(cwd) {
60
73
  cleaned.push("rebase abort attempted (may have failed)");
61
74
  }
62
75
  }
76
+ // Preserve any staged or untracked user work before the hard reset.
77
+ // Reset --hard discards staged changes (reflog only covers committed
78
+ // state), so a labeled stash gives the user a recovery handle if their
79
+ // in-flight inspection work would otherwise be silently lost.
80
+ // (Issue #4980 HIGH-5)
81
+ if (hasWorkingTreeChanges(cwd)) {
82
+ try {
83
+ execFileSync("git", ["stash", "push", "--include-untracked", "-m", `gsd: pre-self-heal-reset ${new Date().toISOString()}`], { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" });
84
+ cleaned.push("stashed working tree before reset");
85
+ }
86
+ catch {
87
+ /* nothing to stash, or stash refused (e.g. unresolved conflicts) — proceed */
88
+ }
89
+ }
63
90
  // Always hard-reset to HEAD
64
91
  try {
65
92
  nativeResetHard(cwd);
@@ -7,7 +7,7 @@
7
7
  * This module centralizes the GitPreferences interface, runtime exclusion
8
8
  * paths, commit type inference, and the runGit shell helper.
9
9
  */
10
- import { execFileSync, execSync } from "node:child_process";
10
+ import { execFileSync } from "node:child_process";
11
11
  import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
12
12
  import { join } from "node:path";
13
13
  import { gsdRoot } from "./paths.js";
@@ -84,6 +84,7 @@ export class MergeConflictError extends GSDError {
84
84
  */
85
85
  export const RUNTIME_EXCLUSION_PATHS = [
86
86
  ".gsd/activity/",
87
+ ".gsd/audit/",
87
88
  ".gsd/forensics/",
88
89
  ".gsd/runtime/",
89
90
  ".gsd/worktrees/",
@@ -242,6 +243,107 @@ export function resolveMilestoneIntegrationBranch(basePath, milestoneId, prefs =
242
243
  reason: `Recorded integration branch "${recordedBranch}" for milestone ${milestoneId} no longer exists, and no safe fallback branch could be determined.`,
243
244
  };
244
245
  }
246
+ // ─── Pre-Merge Command Tokenizer ──────────────────────────────────────────
247
+ /**
248
+ * Tokenize a user-supplied pre-merge command string into argv form, with
249
+ * minimal support for double- and single-quoted strings. Designed to be
250
+ * sufficient for typical commands ("npm test", `npm run lint:ci`,
251
+ * `pnpm run tsc --noEmit`) without spawning a shell.
252
+ *
253
+ * Returns [] when the input is empty or whitespace-only.
254
+ * Throws when quoting is malformed.
255
+ *
256
+ * Used by GitServiceImpl.runPreMergeCheck to eliminate the shell-injection
257
+ * surface that running an arbitrary user string through a shell would create.
258
+ * (Issue #4980 HIGH-2)
259
+ */
260
+ export function tokenizePreMergeCommand(input) {
261
+ const tokens = [];
262
+ let current = "";
263
+ let i = 0;
264
+ let quote = "";
265
+ let hasContent = false;
266
+ while (i < input.length) {
267
+ const ch = input[i];
268
+ if (quote) {
269
+ if (ch === quote) {
270
+ quote = "";
271
+ }
272
+ else if (ch === "\\" && quote === '"' && i + 1 < input.length) {
273
+ current += input[i + 1];
274
+ i += 2;
275
+ continue;
276
+ }
277
+ else {
278
+ current += ch;
279
+ }
280
+ i++;
281
+ continue;
282
+ }
283
+ if (ch === '"' || ch === "'") {
284
+ quote = ch;
285
+ hasContent = true;
286
+ i++;
287
+ continue;
288
+ }
289
+ if (ch === " " || ch === "\t") {
290
+ if (hasContent) {
291
+ tokens.push(current);
292
+ current = "";
293
+ hasContent = false;
294
+ }
295
+ i++;
296
+ continue;
297
+ }
298
+ if (ch === "\\" && i + 1 < input.length) {
299
+ current += input[i + 1];
300
+ i += 2;
301
+ hasContent = true;
302
+ continue;
303
+ }
304
+ current += ch;
305
+ hasContent = true;
306
+ i++;
307
+ }
308
+ if (quote) {
309
+ throw new Error(`Unterminated ${quote === '"' ? "double" : "single"} quote in pre-merge command`);
310
+ }
311
+ if (hasContent)
312
+ tokens.push(current);
313
+ return tokens;
314
+ }
315
+ function containsUnquotedShellControl(input) {
316
+ let i = 0;
317
+ let quote = "";
318
+ while (i < input.length) {
319
+ const ch = input[i];
320
+ if (quote) {
321
+ if (ch === quote) {
322
+ quote = "";
323
+ }
324
+ else if (ch === "\\" && quote === '"' && i + 1 < input.length) {
325
+ i += 2;
326
+ continue;
327
+ }
328
+ i++;
329
+ continue;
330
+ }
331
+ if (ch === '"' || ch === "'") {
332
+ quote = ch;
333
+ i++;
334
+ continue;
335
+ }
336
+ if (ch === "\\" && i + 1 < input.length) {
337
+ i += 2;
338
+ continue;
339
+ }
340
+ if (ch === ";" || ch === "&" || ch === "|" || ch === "`" || ch === "$" || ch === "<" || ch === ">") {
341
+ return true;
342
+ }
343
+ i++;
344
+ }
345
+ return false;
346
+ }
245
347
  // ─── Git Helper ────────────────────────────────────────────────────────────
246
348
  /**
247
349
  * Strip git-svn noise from error messages.
@@ -600,8 +702,31 @@ export class GitServiceImpl {
600
702
  return { passed: true, skipped: true };
601
703
  }
602
704
  }
705
+ // Tokenize and run via execFileSync (no shell). Shell metacharacters in
706
+ // user-supplied prefs.pre_merge_check would otherwise be interpreted as
707
+ // chaining/redirection (e.g. `;`, `&&`, `|`, backticks) — a privesc
708
+ // surface in repos with a checked-in `.gsd/PREFERENCES.md`.
709
+ // (Issue #4980 HIGH-2)
710
+ if (containsUnquotedShellControl(command)) {
711
+ return {
712
+ passed: false,
713
+ skipped: false,
714
+ command,
715
+ error: "pre_merge_check contains shell metacharacters (;, &&, |, $, backticks, redirects). " +
716
+ "Put complex commands in a script file (e.g. './scripts/pre-merge.sh') and reference the script path instead.",
717
+ };
718
+ }
719
+ const tokens = tokenizePreMergeCommand(command);
720
+ if (tokens.length === 0) {
721
+ return { passed: true, skipped: true };
722
+ }
603
723
  try {
604
- execSync(command, { cwd: this.basePath, stdio: "pipe", encoding: "utf-8" });
724
+ execFileSync(tokens[0], tokens.slice(1), {
725
+ cwd: this.basePath,
726
+ stdio: "pipe",
727
+ encoding: "utf-8",
728
+ env: GIT_NO_PROMPT_ENV,
729
+ });
605
730
  return { passed: true, skipped: false, command };
606
731
  }
607
732
  catch (err) {
@@ -24,6 +24,7 @@ import { GIT_NO_PROMPT_ENV } from "./git-constants.js";
24
24
  */
25
25
  const GSD_RUNTIME_PATTERNS = [
26
26
  ".gsd/activity/",
27
+ ".gsd/audit/",
27
28
  ".gsd/forensics/",
28
29
  ".gsd/runtime/",
29
30
  ".gsd/worktrees/",
@@ -135,7 +135,7 @@ function openRawDb(path) {
135
135
  const Database = providerModule;
136
136
  return new Database(path);
137
137
  }
138
- const SCHEMA_VERSION = 22;
138
+ export const SCHEMA_VERSION = 22;
139
139
  function indexExists(db, name) {
140
140
  return !!db.prepare("SELECT 1 as present FROM sqlite_master WHERE type = 'index' AND name = ?").get(name);
141
141
  }
@@ -2556,6 +2556,9 @@ export function insertReplanHistory(entry) {
2556
2556
  export function insertAssessment(entry) {
2557
2557
  if (!currentDb)
2558
2558
  throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
2559
+ // Idempotent: PRIMARY KEY is `path`, which is deterministic given (milestone_id, scope) per
2560
+ // the artifact-path resolver. Retrying the same reassess-roadmap silently overwrites the row
2561
+ // instead of accumulating duplicates.
2559
2562
  currentDb.prepare(`INSERT OR REPLACE INTO assessments (path, milestone_id, slice_id, task_id, status, scope, full_content, created_at)
2560
2563
  VALUES (:path, :milestone_id, :slice_id, :task_id, :status, :scope, :full_content, :created_at)`).run({
2561
2564
  ":path": entry.path,
@@ -2655,7 +2658,7 @@ function rowToGate(row) {
2655
2658
  scope: row["scope"],
2656
2659
  task_id: row["task_id"] ?? "",
2657
2660
  status: row["status"],
2658
- verdict: row["verdict"] || "",
2661
+ verdict: row["status"] === "pending" ? null : row["verdict"],
2659
2662
  rationale: row["rationale"] || "",
2660
2663
  findings: row["findings"] || "",
2661
2664
  evaluated_at: row["evaluated_at"] ?? null,
@@ -2739,7 +2742,7 @@ export function getGateResults(milestoneId, sliceId, scope) {
2739
2742
  export function markAllGatesOmitted(milestoneId, sliceId) {
2740
2743
  if (!currentDb)
2741
2744
  return;
2742
- currentDb.prepare(`UPDATE quality_gates SET status = 'omitted', verdict = 'omitted', evaluated_at = :now
2745
+ currentDb.prepare(`UPDATE quality_gates SET status = 'complete', verdict = 'omitted', evaluated_at = :now
2743
2746
  WHERE milestone_id = :mid AND slice_id = :sid AND status = 'pending'`).run({
2744
2747
  ":mid": milestoneId,
2745
2748
  ":sid": sliceId,
@@ -13,6 +13,7 @@ import { deriveState } from "./state.js";
13
13
  import { invalidateAllCaches } from "./cache.js";
14
14
  import { gsdRoot, resolveMilestoneFile, resolveGsdRootFile, relGsdRootFile, } from "./paths.js";
15
15
  import { readFileSync, writeFileSync, existsSync } from "node:fs";
16
+ import { atomicWriteSync } from "./atomic-write.js";
16
17
  import { nativeAddPaths, nativeCommit } from "./native-git-bridge.js";
17
18
  import { loadEffectiveGSDPreferences } from "./preferences.js";
18
19
  import { saveQueueOrder } from "./queue-order.js";
@@ -361,5 +362,7 @@ function syncProjectMdSequence(basePath, registry, newOrder) {
361
362
  const separatorLine = lines[tableStart + 1];
362
363
  const newTable = [headerLine, separatorLine, ...newRows];
363
364
  lines.splice(tableStart, tableEnd - tableStart, ...newTable);
364
- writeFileSync(projectPath, lines.join("\n"), "utf-8");
365
+ // Atomic write: tmp+rename avoids a torn PROJECT.md appearing dirty in
366
+ // another worktree's working tree during a concurrent /gsd auto merge.
367
+ atomicWriteSync(projectPath, lines.join("\n"), "utf-8");
365
368
  }