gsd-pi 2.77.0-dev.58d3d4d6c → 2.77.0-dev.cfd69e714

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 (429) hide show
  1. package/README.md +1 -1
  2. package/dist/claude-cli-check.js +5 -1
  3. package/dist/headless.js +49 -4
  4. package/dist/resource-loader.d.ts +40 -0
  5. package/dist/resource-loader.js +32 -13
  6. package/dist/resources/extensions/browser-tools/capture.js +9 -0
  7. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
  8. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
  9. package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
  10. package/dist/resources/extensions/browser-tools/tools/forms.js +5 -1
  11. package/dist/resources/extensions/browser-tools/tools/intent.js +5 -1
  12. package/dist/resources/extensions/claude-code-cli/readiness.js +5 -1
  13. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +481 -17
  14. package/dist/resources/extensions/gsd/auto/loop.js +43 -0
  15. package/dist/resources/extensions/gsd/auto/phases.js +15 -21
  16. package/dist/resources/extensions/gsd/auto/session.js +0 -2
  17. package/dist/resources/extensions/gsd/auto-dispatch.js +102 -24
  18. package/dist/resources/extensions/gsd/auto-model-selection.js +124 -4
  19. package/dist/resources/extensions/gsd/auto-post-unit.js +71 -64
  20. package/dist/resources/extensions/gsd/auto-prompts.js +329 -102
  21. package/dist/resources/extensions/gsd/auto-recovery.js +195 -23
  22. package/dist/resources/extensions/gsd/auto-start.js +34 -24
  23. package/dist/resources/extensions/gsd/auto-tool-tracking.js +47 -7
  24. package/dist/resources/extensions/gsd/auto-worktree.js +122 -26
  25. package/dist/resources/extensions/gsd/auto.js +31 -20
  26. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +9 -1
  27. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +209 -0
  28. package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +3 -6
  29. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -3
  30. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +127 -9
  31. package/dist/resources/extensions/gsd/component-loader.js +447 -0
  32. package/dist/resources/extensions/gsd/component-types.js +69 -0
  33. package/dist/resources/extensions/gsd/detection.js +49 -1
  34. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  35. package/dist/resources/extensions/gsd/gate-registry.js +2 -2
  36. package/dist/resources/extensions/gsd/git-constants.js +28 -1
  37. package/dist/resources/extensions/gsd/git-self-heal.js +27 -0
  38. package/dist/resources/extensions/gsd/git-service.js +126 -2
  39. package/dist/resources/extensions/gsd/gsd-db.js +6 -3
  40. package/dist/resources/extensions/gsd/guided-flow.js +17 -5
  41. package/dist/resources/extensions/gsd/memory-extractor.js +7 -1
  42. package/dist/resources/extensions/gsd/milestone-scope-classifier.js +299 -0
  43. package/dist/resources/extensions/gsd/model-cost-table.js +3 -0
  44. package/dist/resources/extensions/gsd/model-router.js +6 -0
  45. package/dist/resources/extensions/gsd/native-git-bridge.js +34 -4
  46. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
  47. package/dist/resources/extensions/gsd/prompts/plan-slice.md +15 -2
  48. package/dist/resources/extensions/gsd/safety/git-checkpoint.js +11 -0
  49. package/dist/resources/extensions/gsd/service-tier.js +5 -2
  50. package/dist/resources/extensions/gsd/session-lock.js +19 -10
  51. package/dist/resources/extensions/gsd/skill-manifest.js +168 -0
  52. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +278 -8
  53. package/dist/resources/extensions/gsd/state.js +44 -33
  54. package/dist/resources/extensions/gsd/sync-lock.js +98 -42
  55. package/dist/resources/extensions/gsd/unit-context-composer.js +147 -0
  56. package/dist/resources/extensions/gsd/unit-context-manifest.js +370 -0
  57. package/dist/resources/extensions/gsd/uok/gate-runner.js +53 -5
  58. package/dist/resources/extensions/gsd/workflow-mcp.js +6 -0
  59. package/dist/resources/extensions/gsd/worktree-manager.js +34 -8
  60. package/dist/resources/extensions/mcp-client/index.js +3 -1
  61. package/dist/resources/extensions/ollama/index.js +5 -1
  62. package/dist/resources/extensions/remote-questions/manager.js +11 -5
  63. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  64. package/dist/web/standalone/.next/BUILD_ID +1 -1
  65. package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
  66. package/dist/web/standalone/.next/build-manifest.json +2 -2
  67. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  68. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  69. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  70. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  71. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  72. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  73. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  74. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  75. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  76. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  77. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  78. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  79. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  80. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  81. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  82. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  83. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  85. package/dist/web/standalone/.next/server/app/index.html +1 -1
  86. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  91. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app-paths-manifest.json +5 -5
  93. package/dist/web/standalone/.next/server/chunks/1926.js +1 -1
  94. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  95. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  96. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  97. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  98. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  99. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  100. package/package.json +2 -3
  101. package/packages/daemon/src/logger.ts +4 -3
  102. package/packages/mcp-server/dist/server.d.ts +24 -0
  103. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  104. package/packages/mcp-server/dist/server.js +88 -87
  105. package/packages/mcp-server/dist/server.js.map +1 -1
  106. package/packages/mcp-server/src/mcp-server.test.ts +25 -3
  107. package/packages/mcp-server/src/readers/graph.test.ts +87 -15
  108. package/packages/mcp-server/src/secure-env-collect.test.ts +232 -237
  109. package/packages/mcp-server/src/server.ts +131 -105
  110. package/packages/mcp-server/src/workflow-tools.test.ts +80 -39
  111. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  112. package/packages/native/package.json +1 -1
  113. package/packages/native/src/__tests__/_test-coverage-guard.test.mjs +98 -0
  114. package/packages/native/src/__tests__/module-compat.test.mjs +59 -27
  115. package/packages/native/src/__tests__/ps.test.mjs +14 -8
  116. package/packages/native/src/__tests__/stream-process.test.mjs +23 -2
  117. package/packages/native/src/__tests__/truncate.test.mjs +17 -2
  118. package/packages/pi-agent-core/src/agent-loop.test.ts +5 -15
  119. package/packages/pi-agent-core/src/agent.test.ts +96 -102
  120. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  121. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
  122. package/packages/pi-ai/dist/models/capability-patches.js +9 -2
  123. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
  124. package/packages/pi-ai/dist/models/generated/index.d.ts +34 -0
  125. package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
  126. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
  127. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
  128. package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
  129. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
  130. package/packages/pi-ai/dist/models/generated/openai.d.ts +17 -0
  131. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -1
  132. package/packages/pi-ai/dist/models/generated/openai.js +17 -0
  133. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -1
  134. package/packages/pi-ai/dist/models.generated.test.js +43 -70
  135. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  136. package/packages/pi-ai/dist/models.test.js +36 -11
  137. package/packages/pi-ai/dist/models.test.js.map +1 -1
  138. package/packages/pi-ai/scripts/generate-models.ts +44 -0
  139. package/packages/pi-ai/src/models/capability-patches.ts +10 -2
  140. package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
  141. package/packages/pi-ai/src/models/generated/openai.ts +17 -0
  142. package/packages/pi-ai/src/models.generated.test.ts +46 -73
  143. package/packages/pi-ai/src/models.test.ts +48 -11
  144. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  145. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +96 -32
  146. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  147. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js +75 -12
  148. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js.map +1 -1
  149. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +99 -31
  150. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  151. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +5 -0
  152. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  153. package/packages/pi-coding-agent/dist/core/extensions/loader.js +61 -0
  154. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  155. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +30 -4
  156. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -1
  157. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +17 -0
  158. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  159. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js +76 -18
  160. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js.map +1 -1
  161. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  162. package/packages/pi-coding-agent/dist/core/retry-handler.js +2 -6
  163. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  164. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +5 -1
  165. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
  166. package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts +18 -0
  167. package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts.map +1 -0
  168. package/packages/pi-coding-agent/dist/core/retryable-error-regex.js +18 -0
  169. package/packages/pi-coding-agent/dist/core/retryable-error-regex.js.map +1 -0
  170. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +20 -0
  171. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  172. package/packages/pi-coding-agent/dist/core/system-prompt.js +16 -2
  173. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  174. package/packages/pi-coding-agent/dist/index.d.ts +1 -0
  175. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  176. package/packages/pi-coding-agent/dist/index.js +1 -0
  177. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  178. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +20 -13
  179. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -1
  180. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  181. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +18 -3
  182. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  183. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +125 -0
  184. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  185. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +2 -0
  186. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  187. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  188. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +4 -0
  189. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  190. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +105 -13
  191. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  192. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts +2 -0
  193. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts.map +1 -0
  194. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js +130 -0
  195. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js.map +1 -0
  196. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +113 -37
  197. package/packages/pi-coding-agent/src/core/agent-session-model-switch.test.ts +89 -17
  198. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +112 -43
  199. package/packages/pi-coding-agent/src/core/extensions/loader.ts +58 -0
  200. package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +35 -4
  201. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +20 -0
  202. package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +93 -28
  203. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +5 -1
  204. package/packages/pi-coding-agent/src/core/retry-handler.ts +2 -8
  205. package/packages/pi-coding-agent/src/core/retryable-error-regex.ts +18 -0
  206. package/packages/pi-coding-agent/src/core/system-prompt.ts +35 -1
  207. package/packages/pi-coding-agent/src/index.ts +1 -0
  208. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +26 -20
  209. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +146 -1
  210. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +20 -3
  211. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +2 -0
  212. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +119 -13
  213. package/packages/pi-coding-agent/src/tests/system-prompt-skill-filter.test.ts +157 -0
  214. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  215. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +18 -8
  216. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
  217. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +128 -17
  218. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
  219. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +36 -12
  220. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -1
  221. package/packages/pi-tui/dist/__tests__/tui.test.js +18 -30
  222. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  223. package/packages/pi-tui/dist/components/__tests__/input.test.js +10 -3
  224. package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -1
  225. package/packages/pi-tui/dist/components/__tests__/loader.test.js +53 -9
  226. package/packages/pi-tui/dist/components/__tests__/loader.test.js.map +1 -1
  227. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js +6 -2
  228. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js.map +1 -1
  229. package/packages/pi-tui/dist/components/editor.d.ts +14 -0
  230. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  231. package/packages/pi-tui/dist/components/editor.js +19 -0
  232. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  233. package/packages/pi-tui/dist/components/image.test.js +6 -5
  234. package/packages/pi-tui/dist/components/image.test.js.map +1 -1
  235. package/packages/pi-tui/dist/editor-component.d.ts +2 -0
  236. package/packages/pi-tui/dist/editor-component.d.ts.map +1 -1
  237. package/packages/pi-tui/dist/editor-component.js.map +1 -1
  238. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +24 -8
  239. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +140 -17
  240. package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +41 -12
  241. package/packages/pi-tui/src/__tests__/tui.test.ts +18 -37
  242. package/packages/pi-tui/src/components/__tests__/input.test.ts +19 -3
  243. package/packages/pi-tui/src/components/__tests__/loader.test.ts +112 -35
  244. package/packages/pi-tui/src/components/__tests__/markdown-maxlines.test.ts +9 -2
  245. package/packages/pi-tui/src/components/editor.ts +22 -0
  246. package/packages/pi-tui/src/components/image.test.ts +10 -5
  247. package/packages/pi-tui/src/editor-component.ts +3 -0
  248. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  249. package/packages/rpc-client/dist/rpc-client.test.js +101 -51
  250. package/packages/rpc-client/dist/rpc-client.test.js.map +1 -1
  251. package/packages/rpc-client/src/rpc-client.test.ts +109 -52
  252. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  253. package/scripts/install.js +15 -1
  254. package/src/resources/extensions/browser-tools/capture.ts +12 -0
  255. package/src/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
  256. package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
  257. package/src/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
  258. package/src/resources/extensions/browser-tools/tools/forms.ts +5 -1
  259. package/src/resources/extensions/browser-tools/tools/intent.ts +5 -1
  260. package/src/resources/extensions/claude-code-cli/readiness.ts +5 -1
  261. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +518 -19
  262. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +919 -75
  263. package/src/resources/extensions/github-sync/tests/cli.test.ts +76 -7
  264. package/src/resources/extensions/github-sync/tests/templates.test.ts +33 -1
  265. package/src/resources/extensions/gsd/auto/loop.ts +47 -0
  266. package/src/resources/extensions/gsd/auto/phases.ts +16 -20
  267. package/src/resources/extensions/gsd/auto/session.ts +0 -2
  268. package/src/resources/extensions/gsd/auto-dispatch.ts +113 -24
  269. package/src/resources/extensions/gsd/auto-model-selection.ts +131 -4
  270. package/src/resources/extensions/gsd/auto-post-unit.ts +82 -73
  271. package/src/resources/extensions/gsd/auto-prompts.ts +330 -90
  272. package/src/resources/extensions/gsd/auto-recovery.ts +225 -24
  273. package/src/resources/extensions/gsd/auto-start.ts +54 -6
  274. package/src/resources/extensions/gsd/auto-tool-tracking.ts +51 -7
  275. package/src/resources/extensions/gsd/auto-worktree.ts +130 -26
  276. package/src/resources/extensions/gsd/auto.ts +43 -22
  277. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +9 -1
  278. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +221 -0
  279. package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +3 -7
  280. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -3
  281. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +158 -9
  282. package/src/resources/extensions/gsd/component-loader.ts +598 -0
  283. package/src/resources/extensions/gsd/component-types.ts +362 -0
  284. package/src/resources/extensions/gsd/detection.ts +58 -1
  285. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  286. package/src/resources/extensions/gsd/gate-registry.ts +2 -2
  287. package/src/resources/extensions/gsd/git-constants.ts +30 -1
  288. package/src/resources/extensions/gsd/git-self-heal.ts +31 -0
  289. package/src/resources/extensions/gsd/git-service.ts +133 -2
  290. package/src/resources/extensions/gsd/gsd-db.ts +6 -3
  291. package/src/resources/extensions/gsd/guided-flow.ts +20 -5
  292. package/src/resources/extensions/gsd/memory-extractor.ts +11 -3
  293. package/src/resources/extensions/gsd/milestone-scope-classifier.ts +366 -0
  294. package/src/resources/extensions/gsd/model-cost-table.ts +3 -0
  295. package/src/resources/extensions/gsd/model-router.ts +6 -0
  296. package/src/resources/extensions/gsd/native-git-bridge.ts +34 -4
  297. package/src/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
  298. package/src/resources/extensions/gsd/prompts/plan-slice.md +15 -2
  299. package/src/resources/extensions/gsd/safety/git-checkpoint.ts +15 -0
  300. package/src/resources/extensions/gsd/service-tier.ts +5 -2
  301. package/src/resources/extensions/gsd/session-lock.ts +20 -10
  302. package/src/resources/extensions/gsd/skill-manifest.ts +175 -0
  303. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +309 -8
  304. package/src/resources/extensions/gsd/state.ts +49 -44
  305. package/src/resources/extensions/gsd/sync-lock.ts +97 -39
  306. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +270 -0
  307. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +341 -0
  308. package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +264 -0
  309. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +94 -289
  310. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +742 -0
  311. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +78 -0
  312. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +61 -0
  313. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +93 -0
  314. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +8 -197
  315. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +15 -58
  316. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +17 -21
  317. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +263 -0
  318. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +25 -0
  319. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +192 -0
  320. package/src/resources/extensions/gsd/tests/complete-task.test.ts +16 -8
  321. package/src/resources/extensions/gsd/tests/component-loader.test.ts +589 -0
  322. package/src/resources/extensions/gsd/tests/component-types.test.ts +127 -0
  323. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +50 -1
  324. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -3
  325. package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +40 -0
  326. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +91 -3
  327. package/src/resources/extensions/gsd/tests/derive-state.test.ts +4 -3
  328. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +3 -2
  329. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +139 -129
  330. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +9 -105
  331. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +102 -0
  332. package/src/resources/extensions/gsd/tests/gate-storage.test.ts +1 -1
  333. package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +4 -55
  334. package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +7 -57
  335. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +20 -0
  336. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +18 -2
  337. package/src/resources/extensions/gsd/tests/integration/queue-completed-milestone-perf.test.ts +10 -4
  338. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +144 -7
  339. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +4 -0
  340. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +2 -16
  341. package/src/resources/extensions/gsd/tests/interrupted-session-ui.test.ts +6 -9
  342. package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +8 -37
  343. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +5 -15
  344. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +227 -62
  345. package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +187 -0
  346. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
  347. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  348. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +6 -49
  349. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +6 -3
  350. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +273 -133
  351. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +301 -0
  352. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +32 -1
  353. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +23 -24
  354. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +32 -0
  355. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +75 -2
  356. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +132 -0
  357. package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +8 -40
  358. package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +136 -256
  359. package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +114 -0
  360. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +148 -0
  361. package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
  362. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +29 -0
  363. package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +55 -95
  364. package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +158 -0
  365. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +120 -1
  366. package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +112 -0
  367. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +164 -1
  368. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +5 -5
  369. package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +11 -92
  370. package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +102 -101
  371. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +31 -0
  372. package/src/resources/extensions/gsd/tests/test-helpers.test.ts +12 -61
  373. package/src/resources/extensions/gsd/tests/test-helpers.ts +21 -8
  374. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +61 -1
  375. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -1
  376. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +355 -0
  377. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +258 -0
  378. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +75 -0
  379. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +49 -26
  380. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +1 -0
  381. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +144 -81
  382. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -54
  383. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +342 -277
  384. package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +37 -29
  385. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +226 -266
  386. package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +103 -67
  387. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +92 -90
  388. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +238 -59
  389. package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +113 -161
  390. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +262 -0
  391. package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +186 -0
  392. package/src/resources/extensions/gsd/tests/write-gate.test.ts +7 -5
  393. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +80 -96
  394. package/src/resources/extensions/gsd/types.ts +3 -3
  395. package/src/resources/extensions/gsd/unit-context-composer.ts +218 -0
  396. package/src/resources/extensions/gsd/unit-context-manifest.ts +574 -0
  397. package/src/resources/extensions/gsd/uok/gate-runner.ts +65 -5
  398. package/src/resources/extensions/gsd/workflow-mcp.ts +6 -0
  399. package/src/resources/extensions/gsd/worktree-manager.ts +55 -7
  400. package/src/resources/extensions/mcp-client/index.ts +3 -1
  401. package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +70 -36
  402. package/src/resources/extensions/ollama/index.ts +5 -1
  403. package/src/resources/extensions/ollama/ollama-auth-mode.test.ts +123 -15
  404. package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +206 -19
  405. package/src/resources/extensions/remote-questions/manager.ts +36 -4
  406. package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +200 -190
  407. package/src/resources/extensions/shared/tests/interview-preview.test.ts +11 -3
  408. package/src/resources/extensions/voice/tests/linux-ready.test.ts +129 -113
  409. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts +0 -2
  410. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts.map +0 -1
  411. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js +0 -289
  412. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js.map +0 -1
  413. package/packages/pi-ai/src/utils/oauth/oauth-providers.test.ts +0 -363
  414. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +0 -144
  415. package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +0 -157
  416. package/src/resources/extensions/gsd/tests/dashboard-model-label-ordering.test.ts +0 -107
  417. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed.test.ts +0 -48
  418. package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -159
  419. package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
  420. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -79
  421. package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +0 -75
  422. package/src/resources/extensions/gsd/tests/forensics-journal.test.ts +0 -162
  423. package/src/resources/extensions/gsd/tests/forensics-worktree-telemetry.test.ts +0 -145
  424. package/src/resources/extensions/gsd/tests/gitignore-bg-shell.test.ts +0 -38
  425. package/src/resources/extensions/gsd/tests/gsd-no-project-error.test.ts +0 -73
  426. package/src/resources/extensions/gsd/tests/idle-watchdog-stall-override.test.ts +0 -130
  427. package/src/resources/extensions/gsd/tests/import-done-milestones.test.ts +0 -43
  428. /package/dist/web/standalone/.next/static/{Cev5xrAYA3ZGTRLyjR2fX → SvCJDZPQW104bR1KnBQg1}/_buildManifest.js +0 -0
  429. /package/dist/web/standalone/.next/static/{Cev5xrAYA3ZGTRLyjR2fX → SvCJDZPQW104bR1KnBQg1}/_ssgManifest.js +0 -0
@@ -0,0 +1,370 @@
1
+ // GSD-2 — UnitContextManifest (#4782 phase 1).
2
+ //
3
+ // Declarative description of what context each auto-mode unit type needs
4
+ // in its system prompt. Establishes the contract that later phases will
5
+ // use to drive a single composeSystemPromptForUnit() — replacing the
6
+ // per-unit-type branching currently spread across `auto-prompts.ts`.
7
+ //
8
+ // **Phase 1 ships the type + the data + a CI coverage guard.** It adds
9
+ // zero wiring — no caller reads a manifest yet. Every unit type gets a
10
+ // manifest that describes today's behavior as faithfully as possible, so
11
+ // when the composer lands in phase 2 the migration can proceed manifest-
12
+ // by-manifest without behavior change.
13
+ //
14
+ // Phased rollout tracking:
15
+ // - Phase 1 (this PR): schema + manifests + coverage test.
16
+ // - Phase 2: add composeSystemPromptForUnit(); migrate one low-risk
17
+ // unit type (e.g. reassess-roadmap) as the pilot.
18
+ // - Phase 3: migrate remaining unit types, tighten manifests per
19
+ // empirical usage, introduce skipWhen predicates absorbing the
20
+ // reassess opt-in gate from #4778.
21
+ // - Phase 4: introduce pipeline variants as declared sequences,
22
+ // absorbing the scope-classifier gates from #4781.
23
+ //
24
+ // Naming:
25
+ // - Artifact keys are STABLE strings (not paths). Path resolution is
26
+ // the composer's job; manifests describe intent, not disk layout.
27
+ // - Char budgets are nominal — blown budgets log a telemetry event,
28
+ // they do not truncate or error (the composer decides fallback).
29
+ // ─── Artifact registry ────────────────────────────────────────────────────
30
+ /**
31
+ * Stable identifiers for every artifact class a unit might inline, excerpt,
32
+ * or reference on-demand. Adding a new artifact class requires (a) a key
33
+ * here, (b) path/body resolution in the composer, and (c) updates to any
34
+ * manifest that should surface it.
35
+ */
36
+ export const ARTIFACT_KEYS = [
37
+ // Milestone-scoped
38
+ "roadmap",
39
+ "milestone-context",
40
+ "milestone-summary",
41
+ "milestone-validation",
42
+ "milestone-research",
43
+ "milestone-plan",
44
+ // Slice-scoped
45
+ "slice-context",
46
+ "slice-research",
47
+ "slice-plan",
48
+ "slice-summary",
49
+ "slice-uat",
50
+ "slice-assessment",
51
+ // Task-scoped
52
+ "task-plan",
53
+ "task-summary",
54
+ "prior-task-summaries",
55
+ "dependency-summaries",
56
+ // Project-scoped
57
+ "requirements",
58
+ "decisions",
59
+ "project",
60
+ "templates",
61
+ ];
62
+ // ─── Manifests ────────────────────────────────────────────────────────────
63
+ // Phase 1 policy: every manifest encodes today's behavior. Skills = "all"
64
+ // unless the unit type was already narrowed via the existing skill-manifest
65
+ // resolver (#4779). Memory/knowledge policies reflect the defaults in
66
+ // `bootstrap/system-context.ts`. Artifact classifications follow what
67
+ // `auto-prompts.ts` inlines today for each unit type.
68
+ const COMMON_BUDGET_LARGE = 1_500_000; // ~400K tokens
69
+ const COMMON_BUDGET_MEDIUM = 750_000; // ~200K tokens
70
+ const COMMON_BUDGET_SMALL = 250_000; // ~65K tokens
71
+ // ─── Tool policy constants (#4934) ────────────────────────────────────────
72
+ // Reused across manifests so per-unit assignment stays declarative and the
73
+ // allowed-path set for the docs policy lives in one reviewable place.
74
+ const TOOLS_ALL = { mode: "all" };
75
+ const TOOLS_PLANNING = { mode: "planning" };
76
+ const TOOLS_DOCS = {
77
+ mode: "docs",
78
+ // Globs are resolved relative to project basePath. The set is intentionally
79
+ // narrow: top-level docs/, README, CHANGELOG, and any markdown at the
80
+ // project root. Projects with non-standard layouts (e.g. mintlify-docs/)
81
+ // will need this list extended in a follow-up; landed conservative now,
82
+ // expand on demand.
83
+ allowedPathGlobs: [
84
+ "docs/**",
85
+ "README.md",
86
+ "README.*.md",
87
+ "CHANGELOG.md",
88
+ "*.md",
89
+ ],
90
+ };
91
+ /**
92
+ * Canonical unit types handled by auto-mode dispatch. The coverage test
93
+ * enumerates these against `UNIT_MANIFESTS` to catch manifest drift when
94
+ * a new unit type lands.
95
+ */
96
+ export const KNOWN_UNIT_TYPES = [
97
+ "research-milestone",
98
+ "plan-milestone",
99
+ "discuss-milestone",
100
+ "validate-milestone",
101
+ "complete-milestone",
102
+ "research-slice",
103
+ "plan-slice",
104
+ "refine-slice",
105
+ "replan-slice",
106
+ "complete-slice",
107
+ "reassess-roadmap",
108
+ "execute-task",
109
+ "reactive-execute",
110
+ "run-uat",
111
+ "gate-evaluate",
112
+ "rewrite-docs",
113
+ ];
114
+ export const UNIT_MANIFESTS = {
115
+ // ─── Milestone-scoped ────────────────────────────────────────────────
116
+ "research-milestone": {
117
+ skills: { mode: "all" },
118
+ knowledge: "full",
119
+ memory: "prompt-relevant",
120
+ codebaseMap: true,
121
+ preferences: "active-only",
122
+ tools: TOOLS_PLANNING,
123
+ artifacts: {
124
+ // Phase 3 migration (#4782): matches today's actual
125
+ // buildResearchMilestonePrompt inlining order.
126
+ inline: ["milestone-context", "project", "requirements", "decisions", "templates"],
127
+ excerpt: [],
128
+ onDemand: [],
129
+ },
130
+ maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
131
+ },
132
+ "plan-milestone": {
133
+ skills: { mode: "all" },
134
+ knowledge: "full",
135
+ memory: "prompt-relevant",
136
+ codebaseMap: true,
137
+ preferences: "active-only",
138
+ tools: TOOLS_PLANNING,
139
+ artifacts: {
140
+ inline: ["project", "requirements", "decisions", "milestone-research", "templates"],
141
+ excerpt: [],
142
+ onDemand: [],
143
+ },
144
+ maxSystemPromptChars: COMMON_BUDGET_LARGE,
145
+ },
146
+ "discuss-milestone": {
147
+ skills: { mode: "all" },
148
+ knowledge: "full",
149
+ memory: "prompt-relevant",
150
+ codebaseMap: true,
151
+ preferences: "active-only",
152
+ tools: TOOLS_PLANNING,
153
+ artifacts: {
154
+ inline: ["project", "requirements", "decisions", "milestone-context", "templates"],
155
+ excerpt: [],
156
+ onDemand: [],
157
+ },
158
+ maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
159
+ },
160
+ "validate-milestone": {
161
+ skills: { mode: "all" },
162
+ knowledge: "scoped",
163
+ memory: "prompt-relevant",
164
+ codebaseMap: false,
165
+ preferences: "active-only",
166
+ tools: TOOLS_PLANNING,
167
+ artifacts: {
168
+ inline: ["roadmap", "slice-summary", "slice-uat", "requirements", "decisions", "templates"],
169
+ excerpt: [],
170
+ onDemand: [],
171
+ },
172
+ maxSystemPromptChars: COMMON_BUDGET_LARGE,
173
+ },
174
+ "complete-milestone": {
175
+ skills: { mode: "all" },
176
+ knowledge: "scoped",
177
+ memory: "prompt-relevant",
178
+ codebaseMap: false,
179
+ preferences: "active-only",
180
+ tools: TOOLS_PLANNING,
181
+ artifacts: {
182
+ // #4780 landed slice-summary as excerpt for this unit; phase 2 of
183
+ // the architecture will read this manifest as the source of truth
184
+ // and retire the special-case wiring in auto-prompts.ts.
185
+ inline: ["roadmap", "milestone-context", "requirements", "decisions", "project", "templates"],
186
+ excerpt: ["slice-summary"],
187
+ onDemand: ["slice-summary"],
188
+ },
189
+ maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
190
+ },
191
+ // ─── Slice-scoped ────────────────────────────────────────────────────
192
+ "research-slice": {
193
+ skills: { mode: "all" },
194
+ knowledge: "full",
195
+ memory: "prompt-relevant",
196
+ codebaseMap: true,
197
+ preferences: "active-only",
198
+ tools: TOOLS_PLANNING,
199
+ artifacts: {
200
+ inline: ["roadmap", "milestone-research", "dependency-summaries", "templates"],
201
+ excerpt: [],
202
+ onDemand: [],
203
+ },
204
+ maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
205
+ },
206
+ "plan-slice": {
207
+ skills: { mode: "all" },
208
+ knowledge: "full",
209
+ memory: "prompt-relevant",
210
+ codebaseMap: true,
211
+ preferences: "active-only",
212
+ tools: TOOLS_PLANNING,
213
+ artifacts: {
214
+ inline: ["roadmap", "slice-research", "dependency-summaries", "requirements", "decisions", "templates"],
215
+ excerpt: [],
216
+ onDemand: [],
217
+ },
218
+ maxSystemPromptChars: COMMON_BUDGET_LARGE,
219
+ },
220
+ "refine-slice": {
221
+ skills: { mode: "all" },
222
+ knowledge: "scoped",
223
+ memory: "prompt-relevant",
224
+ codebaseMap: true,
225
+ preferences: "active-only",
226
+ tools: TOOLS_PLANNING,
227
+ artifacts: {
228
+ inline: ["slice-plan", "slice-research", "dependency-summaries", "templates"],
229
+ excerpt: [],
230
+ onDemand: [],
231
+ },
232
+ maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
233
+ },
234
+ "replan-slice": {
235
+ skills: { mode: "all" },
236
+ knowledge: "scoped",
237
+ memory: "prompt-relevant",
238
+ codebaseMap: true,
239
+ preferences: "active-only",
240
+ tools: TOOLS_PLANNING,
241
+ artifacts: {
242
+ inline: ["slice-plan", "slice-research", "dependency-summaries", "prior-task-summaries", "templates"],
243
+ excerpt: [],
244
+ onDemand: [],
245
+ },
246
+ maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
247
+ },
248
+ "complete-slice": {
249
+ skills: { mode: "all" },
250
+ knowledge: "scoped",
251
+ memory: "prompt-relevant",
252
+ codebaseMap: false,
253
+ preferences: "active-only",
254
+ tools: TOOLS_PLANNING,
255
+ artifacts: {
256
+ // Phase 3 migration (#4782): matches today's actual
257
+ // buildCompleteSlicePrompt inlining order. Overrides prepend +
258
+ // knowledge splice stay in the builder imperatively (see RFC
259
+ // #4924 — computed/prepend blocks are phase-4 composer work).
260
+ inline: ["roadmap", "slice-context", "slice-plan", "requirements", "prior-task-summaries", "templates"],
261
+ excerpt: [],
262
+ onDemand: [],
263
+ },
264
+ maxSystemPromptChars: COMMON_BUDGET_LARGE,
265
+ },
266
+ "reassess-roadmap": {
267
+ skills: { mode: "all" },
268
+ knowledge: "scoped",
269
+ memory: "critical-only",
270
+ codebaseMap: false,
271
+ preferences: "none",
272
+ tools: TOOLS_PLANNING,
273
+ artifacts: {
274
+ // Phase 2 pilot (#4782): manifest now matches today's actual
275
+ // buildReassessRoadmapPrompt behavior for equivalence. Phase 3
276
+ // will tighten this list once the composer reports real telemetry.
277
+ inline: ["roadmap", "slice-context", "slice-summary", "project", "requirements", "decisions"],
278
+ excerpt: [],
279
+ onDemand: [],
280
+ },
281
+ maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
282
+ },
283
+ // ─── Task-scoped ─────────────────────────────────────────────────────
284
+ "execute-task": {
285
+ skills: { mode: "all" },
286
+ knowledge: "scoped",
287
+ memory: "prompt-relevant",
288
+ codebaseMap: true,
289
+ preferences: "active-only",
290
+ tools: TOOLS_ALL,
291
+ artifacts: {
292
+ inline: ["task-plan", "slice-plan", "prior-task-summaries", "templates"],
293
+ excerpt: [],
294
+ onDemand: ["slice-research"],
295
+ },
296
+ maxSystemPromptChars: COMMON_BUDGET_LARGE,
297
+ },
298
+ "reactive-execute": {
299
+ skills: { mode: "all" },
300
+ knowledge: "scoped",
301
+ memory: "prompt-relevant",
302
+ codebaseMap: true,
303
+ preferences: "active-only",
304
+ tools: TOOLS_ALL,
305
+ artifacts: {
306
+ inline: ["slice-plan", "prior-task-summaries", "templates"],
307
+ excerpt: [],
308
+ onDemand: ["slice-research"],
309
+ },
310
+ maxSystemPromptChars: COMMON_BUDGET_LARGE,
311
+ },
312
+ // ─── Ancillary units ─────────────────────────────────────────────────
313
+ "run-uat": {
314
+ skills: { mode: "all" },
315
+ knowledge: "critical-only",
316
+ memory: "critical-only",
317
+ codebaseMap: false,
318
+ preferences: "active-only",
319
+ tools: TOOLS_PLANNING,
320
+ artifacts: {
321
+ // Phase 3 migration (#4782): manifest matches today's actual
322
+ // buildRunUatPrompt inlining. Prior phase-1 entry listed
323
+ // `slice-plan` aspirationally — the real builder inlines the UAT
324
+ // file, the slice SUMMARY (optional), and the project row.
325
+ inline: ["slice-uat", "slice-summary", "project"],
326
+ excerpt: [],
327
+ onDemand: [],
328
+ },
329
+ maxSystemPromptChars: COMMON_BUDGET_SMALL,
330
+ },
331
+ "gate-evaluate": {
332
+ skills: { mode: "all" },
333
+ knowledge: "critical-only",
334
+ memory: "critical-only",
335
+ codebaseMap: false,
336
+ preferences: "active-only",
337
+ tools: TOOLS_PLANNING,
338
+ artifacts: {
339
+ inline: ["slice-plan", "prior-task-summaries"],
340
+ excerpt: [],
341
+ onDemand: [],
342
+ },
343
+ maxSystemPromptChars: COMMON_BUDGET_SMALL,
344
+ },
345
+ "rewrite-docs": {
346
+ skills: { mode: "all" },
347
+ knowledge: "scoped",
348
+ memory: "prompt-relevant",
349
+ codebaseMap: true,
350
+ preferences: "active-only",
351
+ tools: TOOLS_DOCS,
352
+ artifacts: {
353
+ inline: ["project", "requirements", "decisions", "templates"],
354
+ excerpt: [],
355
+ onDemand: [],
356
+ },
357
+ maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
358
+ },
359
+ };
360
+ // ─── Lookup helper ────────────────────────────────────────────────────────
361
+ /**
362
+ * Return the manifest for a unit type, or null when the type is unknown.
363
+ *
364
+ * Callers MUST treat null as "fall through to today's default behavior"
365
+ * rather than erroring — unknown unit types may be experimental and
366
+ * should not crash the composer.
367
+ */
368
+ export function resolveManifest(unitType) {
369
+ return UNIT_MANIFESTS[unitType] ?? null;
370
+ }
@@ -24,7 +24,8 @@ export class UokGateRunner {
24
24
  async run(id, ctx) {
25
25
  const gate = this.registry.get(id);
26
26
  if (!gate) {
27
- return {
27
+ const now = new Date().toISOString();
28
+ const unknownResult = {
28
29
  gateId: id,
29
30
  gateType: "unknown",
30
31
  outcome: "manual-attention",
@@ -33,16 +34,63 @@ export class UokGateRunner {
33
34
  attempt: 1,
34
35
  maxAttempts: 1,
35
36
  retryable: false,
36
- evaluatedAt: new Date().toISOString(),
37
+ evaluatedAt: now,
37
38
  };
39
+ insertGateRun({
40
+ traceId: ctx.traceId,
41
+ turnId: ctx.turnId,
42
+ gateId: unknownResult.gateId,
43
+ gateType: unknownResult.gateType,
44
+ unitType: ctx.unitType,
45
+ unitId: ctx.unitId,
46
+ milestoneId: ctx.milestoneId,
47
+ sliceId: ctx.sliceId,
48
+ taskId: ctx.taskId,
49
+ outcome: unknownResult.outcome,
50
+ failureClass: unknownResult.failureClass,
51
+ rationale: unknownResult.rationale,
52
+ findings: unknownResult.findings,
53
+ attempt: unknownResult.attempt,
54
+ maxAttempts: unknownResult.maxAttempts,
55
+ retryable: unknownResult.retryable,
56
+ evaluatedAt: unknownResult.evaluatedAt,
57
+ });
58
+ emitUokAuditEvent(ctx.basePath, buildAuditEnvelope({
59
+ traceId: ctx.traceId,
60
+ turnId: ctx.turnId,
61
+ category: "gate",
62
+ type: "gate-run",
63
+ payload: {
64
+ gateId: unknownResult.gateId,
65
+ gateType: unknownResult.gateType,
66
+ outcome: unknownResult.outcome,
67
+ failureClass: unknownResult.failureClass,
68
+ attempt: unknownResult.attempt,
69
+ maxAttempts: unknownResult.maxAttempts,
70
+ retryable: unknownResult.retryable,
71
+ },
72
+ }));
73
+ return unknownResult;
38
74
  }
39
75
  let attempt = 0;
40
76
  let final = null;
41
77
  const maxAttemptsByFailureClass = RETRY_MATRIX;
42
- while (attempt < 3) {
78
+ const maxAttemptsCeiling = Math.max(...Object.values(RETRY_MATRIX)) + 1;
79
+ while (attempt < maxAttemptsCeiling) {
43
80
  attempt += 1;
44
81
  const now = new Date().toISOString();
45
- const result = await gate.execute(ctx, attempt);
82
+ let result;
83
+ try {
84
+ result = await gate.execute(ctx, attempt);
85
+ }
86
+ catch (err) {
87
+ const message = err instanceof Error ? err.message : String(err);
88
+ result = {
89
+ outcome: "fail",
90
+ failureClass: "unknown",
91
+ rationale: message,
92
+ };
93
+ }
46
94
  const failureClass = result.failureClass ?? (result.outcome === "pass" ? "none" : "unknown");
47
95
  const retryBudget = maxAttemptsByFailureClass[failureClass] ?? 0;
48
96
  const retryable = result.outcome !== "pass" && attempt <= retryBudget;
@@ -54,7 +102,7 @@ export class UokGateRunner {
54
102
  rationale: result.rationale,
55
103
  findings: result.findings,
56
104
  attempt,
57
- maxAttempts: Math.max(1, retryBudget),
105
+ maxAttempts: retryBudget + 1,
58
106
  retryable,
59
107
  evaluatedAt: now,
60
108
  };
@@ -15,6 +15,7 @@ const MCP_WORKFLOW_TOOL_SURFACE = new Set([
15
15
  "gsd_journal_query",
16
16
  "gsd_milestone_complete",
17
17
  "gsd_milestone_generate_id",
18
+ "gsd_milestone_reopen",
18
19
  "gsd_checkpoint_db",
19
20
  "gsd_milestone_status",
20
21
  "gsd_milestone_validate",
@@ -23,6 +24,9 @@ const MCP_WORKFLOW_TOOL_SURFACE = new Set([
23
24
  "gsd_plan_slice",
24
25
  "gsd_replan_slice",
25
26
  "gsd_reassess_roadmap",
27
+ "gsd_reopen_milestone",
28
+ "gsd_reopen_slice",
29
+ "gsd_reopen_task",
26
30
  "gsd_requirement_save",
27
31
  "gsd_requirement_update",
28
32
  "gsd_roadmap_reassess",
@@ -32,9 +36,11 @@ const MCP_WORKFLOW_TOOL_SURFACE = new Set([
32
36
  "gsd_skip_slice",
33
37
  "gsd_slice_replan",
34
38
  "gsd_slice_complete",
39
+ "gsd_slice_reopen",
35
40
  "gsd_summary_save",
36
41
  "gsd_task_plan",
37
42
  "gsd_task_complete",
43
+ "gsd_task_reopen",
38
44
  "gsd_update_requirement",
39
45
  "gsd_validate_milestone",
40
46
  ]);
@@ -19,7 +19,7 @@ import { execFileSync } from "node:child_process";
19
19
  import { join, resolve, sep } from "node:path";
20
20
  import { GSDError, GSD_PARSE_ERROR, GSD_STALE_STATE, GSD_LOCK_HELD, GSD_GIT_ERROR, GSD_MERGE_CONFLICT } from "./errors.js";
21
21
  import { logWarning } from "./workflow-logger.js";
22
- import { nativeBranchDelete, nativeBranchExists, nativeBranchForceReset, nativeCommit, nativeDetectMainBranch, nativeDiffContent, nativeDiffNameStatus, nativeDiffNumstat, nativeGetCurrentBranch, nativeLogOneline, nativeMergeSquash, nativeWorktreeAdd, nativeWorktreeList, nativeWorktreePrune, nativeWorktreeRemove, } from "./native-git-bridge.js";
22
+ import { nativeBranchDelete, nativeBranchExists, nativeBranchForceReset, nativeCommit, nativeDetectMainBranch, nativeDiffContent, nativeDiffNameStatus, nativeDiffNumstat, nativeGetCurrentBranch, nativeIsAncestor, nativeLogOneline, nativeMergeSquash, nativeWorktreeAdd, nativeWorktreeList, nativeWorktreePrune, nativeWorktreeRemove, } from "./native-git-bridge.js";
23
23
  import { emitCanonicalRootRedirect } from "./worktree-telemetry.js";
24
24
  // ─── Path Helpers ──────────────────────────────────────────────────────────
25
25
  function normalizePathForComparison(path) {
@@ -171,6 +171,13 @@ export function createWorktree(basePath, name, opts = {}) {
171
171
  // Use the explicit start point (e.g. integration branch) if provided,
172
172
  // otherwise fall back to the repo's detected main branch.
173
173
  const startPoint = opts.startPoint ?? nativeDetectMainBranch(basePath);
174
+ // Reject early if startPoint resolves to an empty/invalid ref. On an
175
+ // unborn branch (zero-commit repo) nativeDetectMainBranch returns "",
176
+ // which would flow into `git worktree add ... ""` and crash with
177
+ // `fatal: not a valid object name`. (Issue #4980 HIGH-9)
178
+ if (!startPoint || startPoint.length === 0) {
179
+ throw new GSDError(GSD_GIT_ERROR, "Repository has no commits yet (unborn branch). Make an initial commit before creating worktrees.");
180
+ }
174
181
  // Check if the branch already exists (leftover from a previous worktree)
175
182
  const branchAlreadyExists = nativeBranchExists(basePath, branch);
176
183
  if (branchAlreadyExists) {
@@ -188,6 +195,18 @@ export function createWorktree(basePath, name, opts = {}) {
188
195
  nativeWorktreeAdd(basePath, wtPath, branch);
189
196
  }
190
197
  else {
198
+ // Ancestry guard: refuse to force-reset a branch that has commits not
199
+ // reachable from startPoint. A crash-then-resume cycle that didn't
200
+ // write the resume file would silently orphan prior-session commits
201
+ // (recoverable from reflog for 90d, then gone — branch is also
202
+ // deleted at teardown). (Issue #4980 HIGH-3)
203
+ const branchIsAncestor = nativeIsAncestor(basePath, branch, startPoint);
204
+ if (!branchIsAncestor) {
205
+ throw new GSDError(GSD_GIT_ERROR, `Branch "${branch}" already exists with commits not reachable from "${startPoint}". ` +
206
+ `Refusing to force-reset — would orphan prior work. ` +
207
+ `If you intend to keep those commits, retry with reuseExistingBranch=true. ` +
208
+ `If you intend to discard, run \`git branch -D ${branch}\` manually first.`);
209
+ }
191
210
  // Reset the stale branch to the start point, then attach worktree to it
192
211
  nativeBranchForceReset(basePath, branch, startPoint);
193
212
  nativeWorktreeAdd(basePath, wtPath, branch);
@@ -419,15 +438,22 @@ export function removeWorktree(basePath, name, opts = {}) {
419
438
  // Lines starting with '+' indicate uncommitted submodule changes
420
439
  hasSubmoduleChanges = submoduleStatus.split("\n").some((line) => line.startsWith("+") || line.startsWith("-"));
421
440
  if (hasSubmoduleChanges) {
422
- // Stash submodule changes so they are not lost during force removal.
423
- // The stash is created in the worktree before it's torn down.
441
+ // Save submodule changes to a labeled rescue branch instead of the
442
+ // shared stash list. Stash is per-repo (not per-worktree), so an
443
+ // entry created here would appear in the user's main-tree stash
444
+ // list and reference paths that disappear after worktree removal.
445
+ // A branch persists in the shared .git refs after worktree removal
446
+ // and is discoverable via `git branch --list 'gsd/submodule-rescue/*'`.
447
+ // (Issue #4980 HIGH-11)
448
+ const rescueBranch = `gsd/submodule-rescue/${name}-${Date.now()}`;
424
449
  try {
425
- execFileSync("git", ["stash", "push", "-m", "gsd: auto-stash submodule changes before worktree teardown"], { cwd: resolvedWtPath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" });
426
- logWarning("reconcile", `Stashed uncommitted submodule changes before worktree teardown`, { worktree: name, path: resolvedWtPath });
450
+ execFileSync("git", ["add", "-A"], { cwd: resolvedWtPath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" });
451
+ execFileSync("git", ["commit", "-m", `gsd: rescue submodule changes from worktree ${name}`, "--allow-empty"], { cwd: resolvedWtPath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" });
452
+ execFileSync("git", ["branch", rescueBranch, "HEAD"], { cwd: resolvedWtPath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" });
453
+ logWarning("reconcile", `Saved uncommitted submodule changes to rescue branch ${rescueBranch}`, { worktree: name, path: resolvedWtPath, rescueBranch });
427
454
  }
428
- catch {
429
- // Stash failed — warn the user that submodule changes may be lost
430
- logWarning("reconcile", `Submodule changes detected — stash failed, changes may be lost during force removal`, { worktree: name, path: resolvedWtPath });
455
+ catch (err) {
456
+ logWarning("reconcile", `Submodule rescue branch creation failed — changes may be lost during force removal: ${err instanceof Error ? err.message : String(err)}`, { worktree: name, path: resolvedWtPath });
431
457
  }
432
458
  }
433
459
  }
@@ -145,7 +145,9 @@ async function assertTrustedStdioServer(config, ctx, signal) {
145
145
  }
146
146
  return trustKey;
147
147
  }
148
- function getServerConfig(name) {
148
+ // Exported for tests (see tests/server-name-spaces.test.ts).
149
+ // Production call sites treat this as module-private.
150
+ export function getServerConfig(name) {
149
151
  const trimmed = name.trim();
150
152
  return readConfigs().find((s) => s.name === trimmed ||
151
153
  s.name.toLowerCase() === trimmed.toLowerCase());
@@ -38,8 +38,12 @@ let providerRegistered = false;
38
38
  /**
39
39
  * Probe Ollama and register discovered models.
40
40
  * Safe to call multiple times — re-discovers and re-registers.
41
+ *
42
+ * Exported for tests (see ollama-auth-mode.test.ts, ollama-status-indicator.test.ts)
43
+ * so a fake HTTP endpoint can drive the registration/unregistration paths.
44
+ * Production callers always go through the session_start handler below.
41
45
  */
42
- async function probeAndRegister(pi) {
46
+ export async function probeAndRegister(pi) {
43
47
  const running = await client.isRunning();
44
48
  if (!running) {
45
49
  if (providerRegistered) {
@@ -16,21 +16,27 @@ const COMMAND_POLLING_INTERVAL_MS = 5000;
16
16
  *
17
17
  * @param basePath - Project root, forwarded to command handlers (e.g. /status).
18
18
  * @param intervalMs - Polling interval in milliseconds (default 5 s).
19
+ * @param deps - Test-only overrides. Omit in production.
19
20
  * @returns A cleanup function that stops the polling interval.
20
21
  */
21
- export function startCommandPolling(basePath, intervalMs = COMMAND_POLLING_INTERVAL_MS) {
22
- const config = resolveRemoteConfig();
22
+ export function startCommandPolling(basePath, intervalMs = COMMAND_POLLING_INTERVAL_MS, deps = {}) {
23
+ const resolveConfig = deps.resolveConfig ?? resolveRemoteConfig;
24
+ const createAdapter = deps.createAdapter ??
25
+ ((c, b) => new TelegramAdapter(c.token, c.channelId, b));
26
+ const setIntervalFn = deps.setIntervalFn ?? setInterval;
27
+ const clearIntervalFn = deps.clearIntervalFn ?? clearInterval;
28
+ const config = resolveConfig();
23
29
  if (!config || config.channel !== "telegram") {
24
30
  // Non-Telegram channels have no command polling support — return a no-op cleanup.
25
31
  return () => { };
26
32
  }
27
- const adapter = new TelegramAdapter(config.token, config.channelId, basePath);
28
- const timer = setInterval(() => {
33
+ const adapter = createAdapter(config, basePath);
34
+ const timer = setIntervalFn(() => {
29
35
  void adapter.pollAndHandleCommands(basePath).catch(() => {
30
36
  // Non-fatal: network hiccup or rate-limit — best-effort polling
31
37
  });
32
38
  }, intervalMs);
33
- return () => clearInterval(timer);
39
+ return () => clearIntervalFn(timer);
34
40
  }
35
41
  /**
36
42
  * Check whether a remote channel is configured without triggering any