gsd-pi 2.58.0-dev.778d6ac → 2.58.0-dev.d63175c

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 (628) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +35 -49
  3. package/dist/headless-ui.d.ts +0 -17
  4. package/dist/headless-ui.js +3 -97
  5. package/dist/headless.js +6 -67
  6. package/dist/help-text.js +0 -1
  7. package/dist/onboarding.js +0 -44
  8. package/dist/resource-loader.js +1 -16
  9. package/dist/resources/agents/researcher.md +1 -1
  10. package/dist/resources/extensions/ask-user-questions.js +3 -16
  11. package/dist/resources/extensions/async-jobs/extension-manifest.json +1 -1
  12. package/dist/resources/extensions/bg-shell/extension-manifest.json +1 -1
  13. package/dist/resources/extensions/browser-tools/extension-manifest.json +1 -1
  14. package/dist/resources/extensions/claude-code-cli/partial-builder.js +6 -14
  15. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +36 -59
  16. package/dist/resources/extensions/context7/extension-manifest.json +1 -1
  17. package/dist/resources/extensions/get-secrets-from-user.js +5 -8
  18. package/dist/resources/extensions/google-search/extension-manifest.json +1 -1
  19. package/dist/resources/extensions/google-search/index.js +1 -2
  20. package/dist/resources/extensions/gsd/auto/phases.js +21 -25
  21. package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
  22. package/dist/resources/extensions/gsd/auto-dashboard.js +20 -37
  23. package/dist/resources/extensions/gsd/auto-dispatch.js +2 -17
  24. package/dist/resources/extensions/gsd/auto-model-selection.js +3 -26
  25. package/dist/resources/extensions/gsd/auto-post-unit.js +4 -16
  26. package/dist/resources/extensions/gsd/auto-prompts.js +1 -1
  27. package/dist/resources/extensions/gsd/auto-recovery.js +5 -13
  28. package/dist/resources/extensions/gsd/auto-start.js +22 -35
  29. package/dist/resources/extensions/gsd/auto-worktree.js +12 -196
  30. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +0 -32
  31. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +8 -80
  32. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -32
  33. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +18 -33
  34. package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -44
  35. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +0 -67
  36. package/dist/resources/extensions/gsd/captures.js +4 -56
  37. package/dist/resources/extensions/gsd/db-writer.js +8 -116
  38. package/dist/resources/extensions/gsd/doctor-git-checks.js +0 -28
  39. package/dist/resources/extensions/gsd/doctor-providers.js +1 -2
  40. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +4 -5
  41. package/dist/resources/extensions/gsd/doctor.js +1 -3
  42. package/dist/resources/extensions/gsd/error-classifier.js +10 -13
  43. package/dist/resources/extensions/gsd/extension-manifest.json +1 -16
  44. package/dist/resources/extensions/gsd/forensics.js +20 -123
  45. package/dist/resources/extensions/gsd/git-service.js +1 -23
  46. package/dist/resources/extensions/gsd/gitignore.js +0 -33
  47. package/dist/resources/extensions/gsd/gsd-db.js +9 -36
  48. package/dist/resources/extensions/gsd/guided-flow.js +44 -106
  49. package/dist/resources/extensions/gsd/health-widget-core.js +0 -31
  50. package/dist/resources/extensions/gsd/health-widget.js +0 -17
  51. package/dist/resources/extensions/gsd/index.js +1 -1
  52. package/dist/resources/extensions/gsd/memory-extractor.js +0 -7
  53. package/dist/resources/extensions/gsd/migrate-external.js +1 -8
  54. package/dist/resources/extensions/gsd/model-cost-table.js +0 -18
  55. package/dist/resources/extensions/gsd/model-router.js +1 -35
  56. package/dist/resources/extensions/gsd/native-git-bridge.js +0 -17
  57. package/dist/resources/extensions/gsd/notifications.js +1 -16
  58. package/dist/resources/extensions/gsd/parallel-eligibility.js +2 -13
  59. package/dist/resources/extensions/gsd/parallel-merge.js +5 -78
  60. package/dist/resources/extensions/gsd/parsers-legacy.js +3 -20
  61. package/dist/resources/extensions/gsd/paths.js +0 -43
  62. package/dist/resources/extensions/gsd/preferences-models.js +1 -14
  63. package/dist/resources/extensions/gsd/preferences-types.js +1 -2
  64. package/dist/resources/extensions/gsd/preferences.js +16 -13
  65. package/dist/resources/extensions/gsd/prompt-loader.js +1 -4
  66. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  67. package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -4
  68. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
  69. package/dist/resources/extensions/gsd/prompts/discuss.md +1 -1
  70. package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -3
  71. package/dist/resources/extensions/gsd/prompts/forensics.md +2 -2
  72. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  73. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  74. package/dist/resources/extensions/gsd/prompts/plan-slice.md +0 -2
  75. package/dist/resources/extensions/gsd/prompts/rethink.md +1 -1
  76. package/dist/resources/extensions/gsd/prompts/triage-captures.md +0 -1
  77. package/dist/resources/extensions/gsd/repo-identity.js +11 -205
  78. package/dist/resources/extensions/gsd/rethink.js +0 -5
  79. package/dist/resources/extensions/gsd/roadmap-slices.js +4 -5
  80. package/dist/resources/extensions/gsd/state.js +27 -85
  81. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +1 -20
  82. package/dist/resources/extensions/gsd/tools/complete-task.js +71 -34
  83. package/dist/resources/extensions/gsd/tools/plan-milestone.js +2 -12
  84. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +1 -29
  85. package/dist/resources/extensions/gsd/tools/validate-milestone.js +3 -14
  86. package/dist/resources/extensions/gsd/triage-resolution.js +7 -22
  87. package/dist/resources/extensions/gsd/undo.js +2 -2
  88. package/dist/resources/extensions/gsd/unit-ownership.js +33 -164
  89. package/dist/resources/extensions/gsd/verdict-parser.js +8 -20
  90. package/dist/resources/extensions/gsd/workflow-manifest.js +5 -24
  91. package/dist/resources/extensions/gsd/workflow-projections.js +63 -95
  92. package/dist/resources/extensions/gsd/workflow-reconcile.js +5 -35
  93. package/dist/resources/extensions/gsd/workspace-index.js +0 -24
  94. package/dist/resources/extensions/gsd/worktree-manager.js +1 -105
  95. package/dist/resources/extensions/gsd/worktree-resolver.js +3 -20
  96. package/dist/resources/extensions/mcp-client/index.js +7 -11
  97. package/dist/resources/extensions/search-the-web/extension-manifest.json +1 -1
  98. package/dist/resources/extensions/shared/interview-ui.js +1 -11
  99. package/dist/resources/skills/create-gsd-extension/SKILL.md +3 -5
  100. package/dist/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +4 -5
  101. package/dist/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
  102. package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
  103. package/dist/resources/skills/create-gsd-extension/workflows/debug-extension.md +3 -5
  104. package/dist/web/standalone/.next/BUILD_ID +1 -1
  105. package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -17
  106. package/dist/web/standalone/.next/build-manifest.json +3 -3
  107. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  108. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  109. package/dist/web/standalone/.next/required-server-files.json +1 -1
  110. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  112. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  121. package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
  122. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  123. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  125. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  128. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/index.html +1 -1
  183. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  184. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  185. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  186. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  187. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  188. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  189. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -17
  191. package/dist/web/standalone/.next/server/chunks/2229.js +2 -2
  192. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  195. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  196. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  197. package/dist/web/standalone/.next/static/chunks/6502.8b732f67a11b11b4.js +9 -0
  198. package/dist/web/standalone/.next/static/chunks/{webpack-a1c1e452c6b32d04.js → webpack-61d3afac6d0f0ce7.js} +1 -1
  199. package/dist/web/standalone/.next/static/css/a58ef8a151aa0493.css +1 -0
  200. package/dist/web/standalone/server.js +1 -1
  201. package/dist/web-mode.js +1 -2
  202. package/package.json +2 -2
  203. package/packages/native/dist/ast/index.js +5 -9
  204. package/packages/native/dist/ast/types.js +1 -2
  205. package/packages/native/dist/clipboard/index.js +7 -12
  206. package/packages/native/dist/clipboard/types.js +1 -2
  207. package/packages/native/dist/diff/index.js +7 -12
  208. package/packages/native/dist/diff/types.js +1 -2
  209. package/packages/native/dist/fd/index.js +3 -6
  210. package/packages/native/dist/fd/types.js +1 -2
  211. package/packages/native/dist/glob/index.js +5 -9
  212. package/packages/native/dist/glob/types.js +1 -2
  213. package/packages/native/dist/grep/index.js +5 -9
  214. package/packages/native/dist/grep/types.js +1 -2
  215. package/packages/native/dist/gsd-parser/index.js +11 -18
  216. package/packages/native/dist/gsd-parser/types.js +1 -2
  217. package/packages/native/dist/highlight/index.js +7 -12
  218. package/packages/native/dist/highlight/types.js +1 -2
  219. package/packages/native/dist/html/index.js +3 -6
  220. package/packages/native/dist/html/types.js +1 -2
  221. package/packages/native/dist/image/index.js +5 -10
  222. package/packages/native/dist/image/types.js +4 -7
  223. package/packages/native/dist/index.js +17 -70
  224. package/packages/native/dist/json-parse/index.js +8 -13
  225. package/packages/native/dist/native.js +10 -47
  226. package/packages/native/dist/ps/index.js +9 -15
  227. package/packages/native/dist/ps/types.js +1 -2
  228. package/packages/native/dist/stream-process/index.js +7 -12
  229. package/packages/native/dist/text/index.js +14 -24
  230. package/packages/native/dist/text/types.js +2 -5
  231. package/packages/native/dist/truncate/index.js +7 -12
  232. package/packages/native/dist/ttsr/index.js +7 -12
  233. package/packages/native/dist/ttsr/types.js +1 -2
  234. package/packages/native/dist/xxhash/index.js +5 -9
  235. package/packages/native/package.json +19 -19
  236. package/packages/native/src/native.ts +8 -9
  237. package/packages/pi-agent-core/dist/agent-loop.js +2 -3
  238. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  239. package/packages/pi-agent-core/dist/proxy.d.ts +1 -1
  240. package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
  241. package/packages/pi-agent-core/dist/proxy.js.map +1 -1
  242. package/packages/pi-agent-core/src/agent-loop.ts +2 -3
  243. package/packages/pi-agent-core/src/proxy.ts +1 -1
  244. package/packages/pi-ai/dist/env-api-keys.js +0 -1
  245. package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
  246. package/packages/pi-ai/dist/index.d.ts +0 -1
  247. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  248. package/packages/pi-ai/dist/index.js +0 -1
  249. package/packages/pi-ai/dist/index.js.map +1 -1
  250. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  251. package/packages/pi-ai/dist/providers/anthropic-shared.js +2 -19
  252. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  253. package/packages/pi-ai/dist/types.d.ts +3 -3
  254. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  255. package/packages/pi-ai/dist/types.js.map +1 -1
  256. package/packages/pi-ai/dist/utils/json-parse.d.ts +0 -3
  257. package/packages/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
  258. package/packages/pi-ai/dist/utils/json-parse.js +1 -24
  259. package/packages/pi-ai/dist/utils/json-parse.js.map +1 -1
  260. package/packages/pi-ai/src/env-api-keys.ts +0 -1
  261. package/packages/pi-ai/src/index.ts +0 -1
  262. package/packages/pi-ai/src/providers/anthropic-shared.ts +2 -17
  263. package/packages/pi-ai/src/types.ts +2 -3
  264. package/packages/pi-ai/src/utils/json-parse.ts +1 -28
  265. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +0 -4
  266. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/agent-session.js +0 -31
  268. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  269. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +1 -17
  270. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  271. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +2 -62
  272. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  273. package/packages/pi-coding-agent/dist/core/exec.d.ts.map +1 -1
  274. package/packages/pi-coding-agent/dist/core/exec.js +1 -3
  275. package/packages/pi-coding-agent/dist/core/exec.js.map +1 -1
  276. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +0 -4
  277. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  278. package/packages/pi-coding-agent/dist/core/extensions/index.js +0 -2
  279. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  280. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +0 -5
  281. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  282. package/packages/pi-coding-agent/dist/core/extensions/loader.js +0 -5
  283. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  284. package/packages/pi-coding-agent/dist/core/index.d.ts +1 -1
  285. package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  286. package/packages/pi-coding-agent/dist/core/index.js +1 -1
  287. package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
  289. package/packages/pi-coding-agent/dist/core/lsp/index.js +0 -3
  290. package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
  291. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +0 -3
  293. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
  294. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/messages.js +2 -31
  296. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  297. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  298. package/packages/pi-coding-agent/dist/core/model-resolver.js +0 -1
  299. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  300. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +0 -10
  301. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/resource-loader.js +1 -12
  303. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  304. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +0 -6
  305. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  306. package/packages/pi-coding-agent/dist/core/retry-handler.js +1 -48
  307. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  308. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  309. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -10
  310. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  311. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  312. package/packages/pi-coding-agent/dist/core/tools/read.js +4 -13
  313. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  314. package/packages/pi-coding-agent/dist/index.d.ts +2 -2
  315. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  316. package/packages/pi-coding-agent/dist/index.js +1 -1
  317. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  318. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  319. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +0 -4
  320. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  321. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts +0 -1
  322. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts.map +1 -1
  323. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js +0 -5
  324. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js.map +1 -1
  325. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -38
  326. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +1 -94
  327. package/packages/pi-coding-agent/src/core/exec.ts +1 -3
  328. package/packages/pi-coding-agent/src/core/extensions/index.ts +0 -4
  329. package/packages/pi-coding-agent/src/core/extensions/loader.ts +0 -5
  330. package/packages/pi-coding-agent/src/core/index.ts +0 -6
  331. package/packages/pi-coding-agent/src/core/lsp/index.ts +0 -3
  332. package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +0 -3
  333. package/packages/pi-coding-agent/src/core/messages.ts +2 -29
  334. package/packages/pi-coding-agent/src/core/model-resolver.ts +0 -1
  335. package/packages/pi-coding-agent/src/core/resource-loader.ts +1 -20
  336. package/packages/pi-coding-agent/src/core/retry-handler.ts +1 -52
  337. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +3 -11
  338. package/packages/pi-coding-agent/src/core/tools/read.ts +4 -14
  339. package/packages/pi-coding-agent/src/index.ts +0 -6
  340. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +0 -7
  341. package/packages/pi-coding-agent/src/modes/rpc/remote-terminal.ts +0 -6
  342. package/packages/pi-tui/dist/terminal.d.ts +0 -2
  343. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  344. package/packages/pi-tui/dist/terminal.js +0 -9
  345. package/packages/pi-tui/dist/terminal.js.map +1 -1
  346. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  347. package/packages/pi-tui/dist/tui.js +0 -9
  348. package/packages/pi-tui/dist/tui.js.map +1 -1
  349. package/packages/pi-tui/src/terminal.ts +0 -14
  350. package/packages/pi-tui/src/tui.ts +0 -8
  351. package/scripts/ensure-workspace-builds.cjs +14 -45
  352. package/src/resources/agents/researcher.md +1 -1
  353. package/src/resources/extensions/ask-user-questions.ts +3 -21
  354. package/src/resources/extensions/async-jobs/extension-manifest.json +1 -1
  355. package/src/resources/extensions/bg-shell/extension-manifest.json +1 -1
  356. package/src/resources/extensions/browser-tools/extension-manifest.json +1 -1
  357. package/src/resources/extensions/claude-code-cli/partial-builder.ts +6 -13
  358. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +35 -63
  359. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +0 -28
  360. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +1 -108
  361. package/src/resources/extensions/context7/extension-manifest.json +1 -1
  362. package/src/resources/extensions/get-secrets-from-user.ts +5 -8
  363. package/src/resources/extensions/google-search/extension-manifest.json +1 -1
  364. package/src/resources/extensions/google-search/index.ts +1 -2
  365. package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -1
  366. package/src/resources/extensions/gsd/auto/phases.ts +34 -43
  367. package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
  368. package/src/resources/extensions/gsd/auto-dashboard.ts +19 -37
  369. package/src/resources/extensions/gsd/auto-dispatch.ts +2 -18
  370. package/src/resources/extensions/gsd/auto-model-selection.ts +5 -26
  371. package/src/resources/extensions/gsd/auto-post-unit.ts +4 -18
  372. package/src/resources/extensions/gsd/auto-prompts.ts +1 -1
  373. package/src/resources/extensions/gsd/auto-recovery.ts +5 -12
  374. package/src/resources/extensions/gsd/auto-start.ts +26 -35
  375. package/src/resources/extensions/gsd/auto-worktree.ts +9 -190
  376. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +0 -31
  377. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +8 -85
  378. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -38
  379. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +19 -31
  380. package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -50
  381. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +0 -75
  382. package/src/resources/extensions/gsd/captures.ts +3 -63
  383. package/src/resources/extensions/gsd/db-writer.ts +7 -140
  384. package/src/resources/extensions/gsd/doctor-git-checks.ts +0 -26
  385. package/src/resources/extensions/gsd/doctor-providers.ts +1 -2
  386. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +4 -5
  387. package/src/resources/extensions/gsd/doctor.ts +1 -3
  388. package/src/resources/extensions/gsd/error-classifier.ts +11 -14
  389. package/src/resources/extensions/gsd/extension-manifest.json +1 -16
  390. package/src/resources/extensions/gsd/forensics.ts +20 -144
  391. package/src/resources/extensions/gsd/git-service.ts +3 -26
  392. package/src/resources/extensions/gsd/gitignore.ts +0 -33
  393. package/src/resources/extensions/gsd/gsd-db.ts +7 -43
  394. package/src/resources/extensions/gsd/guided-flow.ts +45 -114
  395. package/src/resources/extensions/gsd/health-widget-core.ts +0 -34
  396. package/src/resources/extensions/gsd/health-widget.ts +0 -17
  397. package/src/resources/extensions/gsd/index.ts +0 -1
  398. package/src/resources/extensions/gsd/memory-extractor.ts +0 -8
  399. package/src/resources/extensions/gsd/migrate-external.ts +1 -9
  400. package/src/resources/extensions/gsd/model-cost-table.ts +0 -19
  401. package/src/resources/extensions/gsd/model-router.ts +1 -35
  402. package/src/resources/extensions/gsd/native-git-bridge.ts +0 -17
  403. package/src/resources/extensions/gsd/notifications.ts +0 -16
  404. package/src/resources/extensions/gsd/parallel-eligibility.ts +2 -15
  405. package/src/resources/extensions/gsd/parallel-merge.ts +4 -87
  406. package/src/resources/extensions/gsd/parsers-legacy.ts +3 -22
  407. package/src/resources/extensions/gsd/paths.ts +0 -42
  408. package/src/resources/extensions/gsd/preferences-models.ts +1 -14
  409. package/src/resources/extensions/gsd/preferences-types.ts +1 -2
  410. package/src/resources/extensions/gsd/preferences.ts +15 -13
  411. package/src/resources/extensions/gsd/prompt-loader.ts +1 -4
  412. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  413. package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -4
  414. package/src/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
  415. package/src/resources/extensions/gsd/prompts/discuss.md +1 -1
  416. package/src/resources/extensions/gsd/prompts/execute-task.md +1 -3
  417. package/src/resources/extensions/gsd/prompts/forensics.md +2 -2
  418. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  419. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  420. package/src/resources/extensions/gsd/prompts/plan-slice.md +0 -2
  421. package/src/resources/extensions/gsd/prompts/rethink.md +1 -1
  422. package/src/resources/extensions/gsd/prompts/triage-captures.md +0 -1
  423. package/src/resources/extensions/gsd/repo-identity.ts +11 -186
  424. package/src/resources/extensions/gsd/rethink.ts +0 -6
  425. package/src/resources/extensions/gsd/roadmap-slices.ts +4 -5
  426. package/src/resources/extensions/gsd/state.ts +32 -84
  427. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +0 -29
  428. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +1 -71
  429. package/src/resources/extensions/gsd/tests/captures.test.ts +0 -103
  430. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +0 -27
  431. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +0 -21
  432. package/src/resources/extensions/gsd/tests/db-writer.test.ts +12 -7
  433. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +5 -78
  434. package/src/resources/extensions/gsd/tests/derive-state.test.ts +0 -29
  435. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +0 -40
  436. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +1 -20
  437. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +0 -117
  438. package/src/resources/extensions/gsd/tests/empty-db-reconciliation.test.ts +79 -0
  439. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -31
  440. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +12 -125
  441. package/src/resources/extensions/gsd/tests/health-widget.test.ts +0 -67
  442. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +1 -111
  443. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +0 -101
  444. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +0 -59
  445. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +0 -110
  446. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +1 -1
  447. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +2 -85
  448. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +0 -34
  449. package/src/resources/extensions/gsd/tests/model-router.test.ts +3 -68
  450. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +0 -28
  451. package/src/resources/extensions/gsd/tests/notifications.test.ts +0 -45
  452. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +1 -33
  453. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +0 -29
  454. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +0 -38
  455. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +0 -117
  456. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +0 -97
  457. package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +0 -134
  458. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +1 -2
  459. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +0 -8
  460. package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +17 -100
  461. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +1 -4
  462. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +0 -48
  463. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +0 -92
  464. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +2 -4
  465. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +1 -48
  466. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +5 -29
  467. package/src/resources/extensions/gsd/tools/complete-task.ts +74 -36
  468. package/src/resources/extensions/gsd/tools/plan-milestone.ts +1 -13
  469. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +0 -36
  470. package/src/resources/extensions/gsd/tools/validate-milestone.ts +2 -20
  471. package/src/resources/extensions/gsd/triage-resolution.ts +6 -23
  472. package/src/resources/extensions/gsd/types.ts +2 -4
  473. package/src/resources/extensions/gsd/undo.ts +2 -2
  474. package/src/resources/extensions/gsd/unit-ownership.ts +35 -206
  475. package/src/resources/extensions/gsd/verdict-parser.ts +6 -21
  476. package/src/resources/extensions/gsd/workflow-logger.ts +1 -3
  477. package/src/resources/extensions/gsd/workflow-manifest.ts +5 -22
  478. package/src/resources/extensions/gsd/workflow-projections.ts +64 -97
  479. package/src/resources/extensions/gsd/workflow-reconcile.ts +10 -39
  480. package/src/resources/extensions/gsd/workspace-index.ts +0 -30
  481. package/src/resources/extensions/gsd/worktree-manager.ts +1 -120
  482. package/src/resources/extensions/gsd/worktree-resolver.ts +3 -22
  483. package/src/resources/extensions/mcp-client/index.ts +7 -13
  484. package/src/resources/extensions/search-the-web/extension-manifest.json +1 -1
  485. package/src/resources/extensions/shared/interview-ui.ts +1 -12
  486. package/src/resources/skills/create-gsd-extension/SKILL.md +3 -5
  487. package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +4 -5
  488. package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
  489. package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
  490. package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +3 -5
  491. package/dist/resources/extensions/gsd/milestone-validation-gates.js +0 -45
  492. package/dist/resources/extensions/ollama/index.js +0 -112
  493. package/dist/resources/extensions/ollama/model-capabilities.js +0 -115
  494. package/dist/resources/extensions/ollama/ollama-client.js +0 -168
  495. package/dist/resources/extensions/ollama/ollama-commands.js +0 -194
  496. package/dist/resources/extensions/ollama/ollama-discovery.js +0 -69
  497. package/dist/resources/extensions/ollama/ollama-tool.js +0 -184
  498. package/dist/resources/extensions/ollama/types.js +0 -2
  499. package/dist/startup-model-validation.d.ts +0 -39
  500. package/dist/startup-model-validation.js +0 -50
  501. package/dist/web/standalone/.next/static/chunks/6502.7593d7797a4b3999.js +0 -9
  502. package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
  503. package/packages/native/src/__tests__/module-compat.test.mjs +0 -91
  504. package/packages/pi-agent-core/src/agent-loop.test.ts +0 -45
  505. package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts +0 -2
  506. package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts.map +0 -1
  507. package/packages/pi-ai/dist/providers/anthropic-shared.test.js +0 -25
  508. package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +0 -1
  509. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts +0 -37
  510. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +0 -1
  511. package/packages/pi-ai/dist/utils/repair-tool-json.js +0 -75
  512. package/packages/pi-ai/dist/utils/repair-tool-json.js.map +0 -1
  513. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts +0 -2
  514. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts.map +0 -1
  515. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +0 -73
  516. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +0 -1
  517. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +0 -29
  518. package/packages/pi-ai/src/utils/repair-tool-json.ts +0 -88
  519. package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +0 -102
  520. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts +0 -6
  521. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts.map +0 -1
  522. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +0 -176
  523. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +0 -1
  524. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts +0 -28
  525. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts.map +0 -1
  526. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js +0 -37
  527. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js.map +0 -1
  528. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts +0 -2
  529. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts.map +0 -1
  530. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js +0 -63
  531. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js.map +0 -1
  532. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts +0 -19
  533. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts.map +0 -1
  534. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js +0 -115
  535. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js.map +0 -1
  536. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts +0 -2
  537. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts.map +0 -1
  538. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js +0 -109
  539. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js.map +0 -1
  540. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts +0 -44
  541. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts.map +0 -1
  542. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js +0 -97
  543. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js.map +0 -1
  544. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts +0 -2
  545. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts.map +0 -1
  546. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js +0 -181
  547. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js.map +0 -1
  548. package/packages/pi-coding-agent/dist/core/messages.test.d.ts +0 -9
  549. package/packages/pi-coding-agent/dist/core/messages.test.d.ts.map +0 -1
  550. package/packages/pi-coding-agent/dist/core/messages.test.js +0 -86
  551. package/packages/pi-coding-agent/dist/core/messages.test.js.map +0 -1
  552. package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts +0 -9
  553. package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts.map +0 -1
  554. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +0 -193
  555. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +0 -1
  556. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts +0 -16
  557. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts.map +0 -1
  558. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +0 -80
  559. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +0 -1
  560. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +0 -236
  561. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +0 -77
  562. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +0 -62
  563. package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +0 -134
  564. package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +0 -137
  565. package/packages/pi-coding-agent/src/core/image-overflow-recovery.test.ts +0 -228
  566. package/packages/pi-coding-agent/src/core/image-overflow-recovery.ts +0 -118
  567. package/packages/pi-coding-agent/src/core/messages.test.ts +0 -114
  568. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +0 -255
  569. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +0 -92
  570. package/src/resources/extensions/gsd/milestone-validation-gates.ts +0 -56
  571. package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +0 -71
  572. package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +0 -47
  573. package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +0 -192
  574. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +0 -131
  575. package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +0 -47
  576. package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +0 -127
  577. package/src/resources/extensions/gsd/tests/dynamic-routing-default.test.ts +0 -20
  578. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +0 -74
  579. package/src/resources/extensions/gsd/tests/event-replay-idempotency.test.ts +0 -140
  580. package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -129
  581. package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
  582. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +0 -164
  583. package/src/resources/extensions/gsd/tests/guided-flow-dynamic-routing.test.ts +0 -135
  584. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +0 -97
  585. package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +0 -107
  586. package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +0 -243
  587. package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +0 -150
  588. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +0 -959
  589. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +0 -105
  590. package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +0 -116
  591. package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +0 -159
  592. package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +0 -150
  593. package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +0 -70
  594. package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +0 -297
  595. package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +0 -178
  596. package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +0 -69
  597. package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +0 -157
  598. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +0 -90
  599. package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +0 -162
  600. package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +0 -233
  601. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +0 -305
  602. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +0 -405
  603. package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +0 -257
  604. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +0 -1628
  605. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +0 -106
  606. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +0 -174
  607. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +0 -221
  608. package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +0 -289
  609. package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +0 -154
  610. package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +0 -156
  611. package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +0 -82
  612. package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +0 -140
  613. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +0 -101
  614. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +0 -95
  615. package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +0 -55
  616. package/src/resources/extensions/ollama/index.ts +0 -130
  617. package/src/resources/extensions/ollama/model-capabilities.ts +0 -145
  618. package/src/resources/extensions/ollama/ollama-client.ts +0 -196
  619. package/src/resources/extensions/ollama/ollama-commands.ts +0 -248
  620. package/src/resources/extensions/ollama/ollama-discovery.ts +0 -106
  621. package/src/resources/extensions/ollama/ollama-tool.ts +0 -218
  622. package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +0 -162
  623. package/src/resources/extensions/ollama/tests/ollama-client.test.ts +0 -38
  624. package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +0 -28
  625. package/src/resources/extensions/ollama/types.ts +0 -130
  626. package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +0 -156
  627. /package/dist/web/standalone/.next/static/{R0D4xaIPl5kg93edN7Oo0 → 5DLsjFHdSB6_a1EDQVjr7}/_buildManifest.js +0 -0
  628. /package/dist/web/standalone/.next/static/{R0D4xaIPl5kg93edN7Oo0 → 5DLsjFHdSB6_a1EDQVjr7}/_ssgManifest.js +0 -0
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Regression test for #2631: deriveState disk→DB reconciliation must
3
+ * run even when the milestones table starts empty.
4
+ *
5
+ * When getAllMilestones() returns [] (e.g. after a failed initial migration),
6
+ * the reconciliation code inside deriveStateFromDb was unreachable because
7
+ * deriveState only called it when dbMilestones.length > 0. The fix moves
8
+ * disk→DB sync into deriveState itself, before the length check.
9
+ */
10
+ import { test } from "node:test";
11
+ import assert from "node:assert/strict";
12
+ import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from "node:fs";
13
+ import { join } from "node:path";
14
+ import { tmpdir } from "node:os";
15
+
16
+ import { deriveState, invalidateStateCache } from "../state.ts";
17
+ import {
18
+ openDatabase,
19
+ closeDatabase,
20
+ getAllMilestones,
21
+ } from "../gsd-db.ts";
22
+
23
+ test("deriveState populates empty DB from disk milestones (#2631)", async () => {
24
+ const base = mkdtempSync(join(tmpdir(), "gsd-empty-db-"));
25
+ mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
26
+
27
+ try {
28
+ // Create a milestone on disk with a CONTEXT file (not a ghost)
29
+ writeFileSync(
30
+ join(base, ".gsd", "milestones", "M001", "M001-CONTEXT.md"),
31
+ "# M001: Test Milestone\n\nSome context about this milestone.",
32
+ );
33
+
34
+ // Open DB — milestones table is empty (simulating failed migration)
35
+ openDatabase(":memory:");
36
+ const before = getAllMilestones();
37
+ assert.equal(before.length, 0, "DB should start with 0 milestones");
38
+
39
+ // deriveState should reconcile disk → DB
40
+ invalidateStateCache();
41
+ const state = await deriveState(base);
42
+
43
+ // After deriveState, the DB should now have the disk milestone
44
+ const after = getAllMilestones();
45
+ assert.ok(after.length > 0, "DB should have milestones after reconciliation");
46
+ assert.equal(after[0]!.id, "M001", "reconciled milestone should be M001");
47
+
48
+ // State should reflect the milestone (not "No milestones found")
49
+ assert.ok(
50
+ state.activeMilestone !== null,
51
+ "activeMilestone should not be null after reconciliation",
52
+ );
53
+
54
+ closeDatabase();
55
+ } finally {
56
+ closeDatabase();
57
+ rmSync(base, { recursive: true, force: true });
58
+ }
59
+ });
60
+
61
+ test("deriveState does NOT insert ghost milestones into DB (#2631 guard)", async () => {
62
+ const base = mkdtempSync(join(tmpdir(), "gsd-empty-db-"));
63
+ // Create a ghost milestone directory (empty — no CONTEXT, no ROADMAP)
64
+ mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
65
+
66
+ try {
67
+ openDatabase(":memory:");
68
+ invalidateStateCache();
69
+ await deriveState(base);
70
+
71
+ const milestones = getAllMilestones();
72
+ assert.equal(milestones.length, 0, "ghost milestone should NOT be inserted");
73
+
74
+ closeDatabase();
75
+ } finally {
76
+ closeDatabase();
77
+ rmSync(base, { recursive: true, force: true });
78
+ }
79
+ });
@@ -46,34 +46,3 @@ describe("forensics dedup (#2096)", () => {
46
46
  "opt-in notice must mention duplicate detection");
47
47
  });
48
48
  });
49
-
50
- describe("forensics dedup ordering (#2704)", () => {
51
- it("{{dedupSection}} appears before Investigation Protocol in the prompt template", () => {
52
- const prompt = readFileSync(join(gsdDir, "prompts", "forensics.md"), "utf-8");
53
- const dedupIndex = prompt.indexOf("{{dedupSection}}");
54
- const investigationIndex = prompt.indexOf("## Investigation Protocol");
55
- assert.ok(dedupIndex !== -1, "prompt must contain {{dedupSection}}");
56
- assert.ok(investigationIndex !== -1, "prompt must contain ## Investigation Protocol");
57
- assert.ok(
58
- dedupIndex < investigationIndex,
59
- `{{dedupSection}} (index ${dedupIndex}) must appear before Investigation Protocol (index ${investigationIndex}) — dedup should run before expensive investigation to avoid wasting tokens on already-fixed bugs`,
60
- );
61
- });
62
-
63
- it("DEDUP_PROMPT_SECTION contains a decision gate to skip investigation", () => {
64
- const source = readFileSync(join(gsdDir, "forensics.ts"), "utf-8");
65
- // The dedup section must instruct the agent to skip investigation when a match is found
66
- assert.ok(
67
- source.includes("Skip full investigation") || source.includes("skip full investigation") || source.includes("Skip investigation"),
68
- "DEDUP_PROMPT_SECTION must contain a decision gate telling the agent to skip full investigation when a duplicate is found",
69
- );
70
- });
71
-
72
- it("DEDUP_PROMPT_SECTION heading reflects pre-investigation role", () => {
73
- const source = readFileSync(join(gsdDir, "forensics.ts"), "utf-8");
74
- assert.ok(
75
- source.includes("Pre-Investigation") || source.includes("pre-investigation"),
76
- "DEDUP_PROMPT_SECTION heading must indicate it runs before investigation, not just before issue creation",
77
- );
78
- });
79
- });
@@ -21,10 +21,8 @@ import {
21
21
  import {
22
22
  saveDecisionToDb,
23
23
  updateRequirementInDb,
24
- saveRequirementToDb,
25
24
  saveArtifactToDb,
26
25
  nextDecisionId,
27
- nextRequirementId,
28
26
  } from '../db-writer.ts';
29
27
  import type { Requirement } from '../types.ts';
30
28
 
@@ -162,11 +160,18 @@ describe('gsd-tools', () => {
162
160
  assert.ok(mdContent.includes('R001'), 'REQUIREMENTS.md should contain R001');
163
161
  assert.ok(mdContent.includes('validated'), 'REQUIREMENTS.md should reflect updated status');
164
162
 
165
- // Updating non-existent requirement upserts (creates it) — see #2919
166
- await updateRequirementInDb('R999', { status: 'deferred' }, tmpDir);
167
- const upserted = getRequirementById('R999');
168
- assert.ok(upserted !== null, 'R999 should be created by upsert');
169
- assert.deepStrictEqual(upserted!.status, 'deferred', 'Upserted requirement should have the updated status');
163
+ // Updating non-existent requirement throws
164
+ let threwForMissing = false;
165
+ try {
166
+ await updateRequirementInDb('R999', { status: 'deferred' }, tmpDir);
167
+ } catch (err) {
168
+ threwForMissing = true;
169
+ assert.ok(
170
+ (err as Error).message.includes('R999'),
171
+ 'Error should mention the missing requirement ID',
172
+ );
173
+ }
174
+ assert.ok(threwForMissing, 'Should throw for non-existent requirement');
170
175
 
171
176
  closeDatabase();
172
177
  } finally {
@@ -258,124 +263,6 @@ describe('gsd-tools', () => {
258
263
  assert.deepStrictEqual(fallbackId, 'D001', 'nextDecisionId should return D001 when DB unavailable');
259
264
  });
260
265
 
261
- test('gsd_requirement_save creates new requirement', async () => {
262
- const tmpDir = makeTmpDir();
263
- try {
264
- const dbPath = path.join(tmpDir, '.gsd', 'gsd.db');
265
- openDatabase(dbPath);
266
-
267
- // (a) saveRequirementToDb creates a new requirement with auto-assigned ID
268
- const result = await saveRequirementToDb(
269
- {
270
- class: 'functional',
271
- status: 'active',
272
- description: 'Must support dark mode',
273
- why: 'Accessibility requirement',
274
- source: 'user-research',
275
- },
276
- tmpDir,
277
- );
278
-
279
- assert.deepStrictEqual(result.id, 'R001', 'First requirement should be R001');
280
-
281
- // Verify DB row exists
282
- const row = getRequirementById('R001');
283
- assert.ok(row !== null, 'Requirement R001 should exist in DB');
284
- assert.deepStrictEqual(row!.class, 'functional', 'Class should match');
285
- assert.deepStrictEqual(row!.description, 'Must support dark mode', 'Description should match');
286
- assert.deepStrictEqual(row!.status, 'active', 'Status should match');
287
-
288
- // Verify REQUIREMENTS.md was generated
289
- const mdPath = path.join(tmpDir, '.gsd', 'REQUIREMENTS.md');
290
- assert.ok(fs.existsSync(mdPath), 'REQUIREMENTS.md should be created');
291
- const mdContent = fs.readFileSync(mdPath, 'utf-8');
292
- assert.ok(mdContent.includes('R001'), 'REQUIREMENTS.md should contain R001');
293
- assert.ok(mdContent.includes('dark mode'), 'REQUIREMENTS.md should contain description');
294
-
295
- // (b) Auto-assigns correct next ID
296
- const result2 = await saveRequirementToDb(
297
- {
298
- class: 'non-functional',
299
- status: 'active',
300
- description: 'Must load in under 2 seconds',
301
- why: 'Performance SLA',
302
- source: 'design',
303
- },
304
- tmpDir,
305
- );
306
- assert.deepStrictEqual(result2.id, 'R002', 'Second requirement should be R002');
307
-
308
- closeDatabase();
309
- } finally {
310
- cleanupDir(tmpDir);
311
- }
312
- });
313
-
314
- test('nextRequirementId computes correct next ID', async () => {
315
- const tmpDir = makeTmpDir();
316
- try {
317
- const dbPath = path.join(tmpDir, '.gsd', 'gsd.db');
318
- openDatabase(dbPath);
319
-
320
- // No requirements yet
321
- const id1 = await nextRequirementId();
322
- assert.deepStrictEqual(id1, 'R001', 'Should return R001 when no requirements exist');
323
-
324
- // Add one requirement
325
- upsertRequirement({
326
- id: 'R001',
327
- class: 'functional',
328
- status: 'active',
329
- description: 'Test',
330
- why: '',
331
- source: '',
332
- primary_owner: '',
333
- supporting_slices: '',
334
- validation: '',
335
- notes: '',
336
- full_content: '',
337
- superseded_by: null,
338
- });
339
-
340
- const id2 = await nextRequirementId();
341
- assert.deepStrictEqual(id2, 'R002', 'Should return R002 after R001 exists');
342
-
343
- closeDatabase();
344
- } finally {
345
- cleanupDir(tmpDir);
346
- }
347
- });
348
-
349
- test('gsd_requirement_update upserts when requirement not in DB', async () => {
350
- const tmpDir = makeTmpDir();
351
- try {
352
- const dbPath = path.join(tmpDir, '.gsd', 'gsd.db');
353
- openDatabase(dbPath);
354
-
355
- // Requirement R025 does NOT exist in DB — simulates the bug scenario
356
- // where requirements exist in REQUIREMENTS.md but were never imported.
357
- // updateRequirementInDb should create the row instead of throwing.
358
- await updateRequirementInDb(
359
- 'R025',
360
- { status: 'validated', validation: 'Integration tests pass' },
361
- tmpDir,
362
- );
363
-
364
- const created = getRequirementById('R025');
365
- assert.ok(created !== null, 'R025 should be created by upsert');
366
- assert.deepStrictEqual(created!.status, 'validated', 'Status should be set');
367
- assert.deepStrictEqual(created!.validation, 'Integration tests pass', 'Validation should be set');
368
-
369
- // Verify REQUIREMENTS.md was generated
370
- const mdPath = path.join(tmpDir, '.gsd', 'REQUIREMENTS.md');
371
- assert.ok(fs.existsSync(mdPath), 'REQUIREMENTS.md should be created');
372
-
373
- closeDatabase();
374
- } finally {
375
- cleanupDir(tmpDir);
376
- }
377
- });
378
-
379
266
  test('Tool result format', async () => {
380
267
  const tmpDir = makeTmpDir();
381
268
  try {
@@ -6,7 +6,6 @@ import { tmpdir } from "node:os";
6
6
  import {
7
7
  buildHealthLines,
8
8
  detectHealthWidgetProjectState,
9
- formatRelativeTime,
10
9
  type HealthWidgetData,
11
10
  } from "../health-widget-core.ts";
12
11
 
@@ -35,8 +34,6 @@ function activeData(overrides: Partial<HealthWidgetData> = {}): HealthWidgetData
35
34
  providerIssue: null,
36
35
  environmentErrorCount: 0,
37
36
  environmentWarningCount: 0,
38
- lastCommitEpoch: null,
39
- lastCommitMessage: null,
40
37
  lastRefreshed: Date.now(),
41
38
  ...overrides,
42
39
  };
@@ -101,70 +98,6 @@ test("buildHealthLines: active state with issues reports issue summary", (t) =>
101
98
  assert.match(lines[0]!, /Env: 1 error/);
102
99
  });
103
100
 
104
- // ── Last commit display ──────────────────────────────────────────────────
105
-
106
- test("buildHealthLines: shows last commit with relative time and message", (t) => {
107
- const epoch = Math.floor(Date.now() / 1000) - 300; // 5 minutes ago
108
- const lines = buildHealthLines(activeData({
109
- lastCommitEpoch: epoch,
110
- lastCommitMessage: "feat(widget): add health display",
111
- }));
112
- assert.equal(lines.length, 1);
113
- assert.match(lines[0]!, /Last commit: 5m ago/);
114
- assert.match(lines[0]!, /feat\(widget\): add health display/);
115
- });
116
-
117
- test("buildHealthLines: truncates long commit messages", (t) => {
118
- const epoch = Math.floor(Date.now() / 1000) - 60;
119
- const longMsg = "a".repeat(80);
120
- const lines = buildHealthLines(activeData({
121
- lastCommitEpoch: epoch,
122
- lastCommitMessage: longMsg,
123
- }));
124
- assert.equal(lines.length, 1);
125
- assert.match(lines[0]!, /a{49}…/);
126
- assert.ok(!lines[0]!.includes("a".repeat(51)), "message is truncated");
127
- });
128
-
129
- test("buildHealthLines: no last commit section when epoch is null", (t) => {
130
- const lines = buildHealthLines(activeData({ lastCommitEpoch: null }));
131
- assert.equal(lines.length, 1);
132
- assert.ok(!lines[0]!.includes("Last commit"), "no last commit when null");
133
- });
134
-
135
- test("buildHealthLines: last commit without message shows only time", (t) => {
136
- const epoch = Math.floor(Date.now() / 1000) - 3600; // 1 hour ago
137
- const lines = buildHealthLines(activeData({
138
- lastCommitEpoch: epoch,
139
- lastCommitMessage: null,
140
- }));
141
- assert.equal(lines.length, 1);
142
- assert.match(lines[0]!, /Last commit: 1h ago/);
143
- assert.ok(!lines[0]!.includes(" — "), "no dash separator when no message");
144
- });
145
-
146
- // ── formatRelativeTime ───────────────────────────────────────────────────
147
-
148
- test("formatRelativeTime: just now for <60s", () => {
149
- const epoch = Math.floor(Date.now() / 1000) - 30;
150
- assert.equal(formatRelativeTime(epoch), "just now");
151
- });
152
-
153
- test("formatRelativeTime: minutes", () => {
154
- const epoch = Math.floor(Date.now() / 1000) - 300;
155
- assert.equal(formatRelativeTime(epoch), "5m ago");
156
- });
157
-
158
- test("formatRelativeTime: hours", () => {
159
- const epoch = Math.floor(Date.now() / 1000) - 7200;
160
- assert.equal(formatRelativeTime(epoch), "2h ago");
161
- });
162
-
163
- test("formatRelativeTime: days", () => {
164
- const epoch = Math.floor(Date.now() / 1000) - 172800;
165
- assert.equal(formatRelativeTime(epoch), "2d ago");
166
- });
167
-
168
101
  test("detectHealthWidgetProjectState: metrics file alone does not imply project", (t) => {
169
102
  const dir = makeTempDir("metrics-only");
170
103
  t.after(() => { cleanup(dir); });
@@ -111,51 +111,7 @@ test("resolveExpectedArtifactPath returns correct path for all slice-level types
111
111
 
112
112
  const uatResult = resolveExpectedArtifactPath("run-uat", "M001/S01", base);
113
113
  assert.ok(uatResult);
114
- assert.ok(uatResult!.includes("ASSESSMENT"));
115
- });
116
-
117
- // ─── run-uat artifact path contract (#2873) ──────────────────────────────
118
-
119
- test("resolveExpectedArtifactPath for run-uat returns ASSESSMENT path, not UAT (#2873)", (t) => {
120
- // The run-uat prompt instructs the agent to call gsd_summary_save with
121
- // artifact_type: "ASSESSMENT", which writes S##-ASSESSMENT.md. The artifact
122
- // verification path must match — otherwise verification fails and auto-mode
123
- // retries the unit in an infinite loop.
124
- const base = makeTmpBase();
125
- t.after(() => cleanup(base));
126
-
127
- const result = resolveExpectedArtifactPath("run-uat", "M001/S01", base);
128
- assert.ok(result, "run-uat should resolve to a non-null artifact path");
129
- assert.ok(
130
- result!.endsWith("S01-ASSESSMENT.md"),
131
- `run-uat artifact path should end with S01-ASSESSMENT.md, got: ${result}`,
132
- );
133
- });
134
-
135
- test("diagnoseExpectedArtifact for run-uat references ASSESSMENT (#2873)", (t) => {
136
- const base = makeTmpBase();
137
- t.after(() => cleanup(base));
138
-
139
- const diag = diagnoseExpectedArtifact("run-uat", "M001/S01", base);
140
- assert.ok(diag, "run-uat should have a diagnostic message");
141
- assert.ok(
142
- diag!.includes("ASSESSMENT"),
143
- `run-uat diagnostic should reference ASSESSMENT, got: ${diag}`,
144
- );
145
- });
146
-
147
- test("verifyExpectedArtifact passes for run-uat when ASSESSMENT file exists (#2873)", (t) => {
148
- // Regression test: run-uat writes S##-ASSESSMENT.md via gsd_summary_save,
149
- // but verification looked for S##-UAT.md, causing false stuck retries.
150
- const base = makeTmpBase();
151
- t.after(() => cleanup(base));
152
-
153
- // Write the ASSESSMENT file (what gsd_summary_save actually produces)
154
- const assessPath = join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-ASSESSMENT.md");
155
- writeFileSync(assessPath, "---\nverdict: PASS\n---\n# UAT Assessment\n");
156
-
157
- const verified = verifyExpectedArtifact("run-uat", "M001/S01", base);
158
- assert.ok(verified, "verifyExpectedArtifact should pass when ASSESSMENT file exists");
114
+ assert.ok(uatResult!.includes("UAT"));
159
115
  });
160
116
 
161
117
  // ─── diagnoseExpectedArtifact ─────────────────────────────────────────────
@@ -741,72 +697,6 @@ test("verifyExpectedArtifact complete-milestone fails with only .gsd/ files (#17
741
697
  assert.equal(result, false, "complete-milestone should fail verification when only .gsd/ files present");
742
698
  });
743
699
 
744
- // ─── reconcileMergeState: silent nativeCommit failure (#2542) ─────────────
745
-
746
- import { reconcileMergeState } from "../../auto-recovery.ts";
747
- import { chmodSync } from "node:fs";
748
-
749
- function makeMockCtx(): { ctx: any; notifications: Array<{ msg: string; level: string }> } {
750
- const notifications: Array<{ msg: string; level: string }> = [];
751
- const ctx = {
752
- ui: {
753
- notify(msg: string, level: string) {
754
- notifications.push({ msg, level });
755
- },
756
- },
757
- };
758
- return { ctx, notifications };
759
- }
760
-
761
- test("reconcileMergeState returns false and notifies error when nativeCommit fails (#2542)", (t) => {
762
- const base = makeGitBase();
763
- t.after(() => cleanup(base));
764
-
765
- // Create a second branch with a commit, then start a merge on main
766
- execFileSync("git", ["checkout", "-b", "feature"], { cwd: base, stdio: "ignore" });
767
- writeFileSync(join(base, "feature.txt"), "feature content");
768
- execFileSync("git", ["add", "."], { cwd: base, stdio: "ignore" });
769
- execFileSync("git", ["commit", "-m", "add feature"], { cwd: base, stdio: "ignore" });
770
- execFileSync("git", ["checkout", "main"], { cwd: base, stdio: "ignore" });
771
-
772
- // Start merge (no conflicts — fast path with MERGE_HEAD)
773
- execFileSync("git", ["merge", "--no-ff", "--no-commit", "feature"], { cwd: base, stdio: "ignore" });
774
-
775
- // Verify MERGE_HEAD exists
776
- assert.ok(existsSync(join(base, ".git", "MERGE_HEAD")), "MERGE_HEAD should exist");
777
-
778
- // Make .git/objects read-only so git cannot write the commit object,
779
- // causing nativeCommit to throw a non-"nothing to commit" error.
780
- const objectsDir = join(base, ".git", "objects");
781
- chmodSync(objectsDir, 0o444);
782
- t.after(() => { try { chmodSync(objectsDir, 0o755); } catch { /* cleanup */ } });
783
-
784
- const { ctx, notifications } = makeMockCtx();
785
- const result = reconcileMergeState(base, ctx);
786
-
787
- // The function should return false to signal reconciliation failure
788
- // (Currently it silently swallows the error and returns true — this test should FAIL before the fix)
789
- assert.equal(result, false, "reconcileMergeState should return false when nativeCommit fails");
790
- const errorNotifications = notifications.filter(n => n.level === "error");
791
- assert.ok(errorNotifications.length > 0, "should notify an error when nativeCommit fails");
792
- assert.ok(
793
- errorNotifications[0].msg.includes("Failed to finalize"),
794
- "error notification should describe the commit failure",
795
- );
796
- });
797
-
798
- test("reconcileMergeState returns true when no merge state present", (t) => {
799
- // When there's no MERGE_HEAD or SQUASH_MSG, reconcileMergeState returns false (no dirty state)
800
- const base = makeGitBase();
801
- t.after(() => cleanup(base));
802
-
803
- const { ctx, notifications } = makeMockCtx();
804
- const result = reconcileMergeState(base, ctx);
805
-
806
- assert.equal(result, false, "should return false when no merge state exists");
807
- assert.equal(notifications.length, 0, "should not notify when no merge state present");
808
- });
809
-
810
700
  test("verifyExpectedArtifact complete-milestone passes with impl files (#1703)", (t) => {
811
701
  const base = makeGitBase();
812
702
  t.after(() => cleanup(base));
@@ -638,107 +638,6 @@ describe("auto-worktree-milestone-merge", { timeout: 300_000 }, () => {
638
638
  "#1906: codeFilesChanged must be false when only .gsd/ files were merged");
639
639
  });
640
640
 
641
- test("#2912: MERGE_HEAD cleaned up after squash-merge conflict", () => {
642
- const repo = freshRepo();
643
- const wtPath = createAutoWorktree(repo, "M291");
644
-
645
- // Create a file on main that will conflict with the milestone branch
646
- run("git checkout main", repo);
647
- writeFileSync(join(repo, "conflict.ts"), "// main version\nexport const x = 1;\n");
648
- run("git add .", repo);
649
- run("git commit -m 'add conflict.ts on main'", repo);
650
-
651
- // Switch back to milestone branch and create conflicting content
652
- run("git checkout milestone/M291", wtPath);
653
- writeFileSync(join(wtPath, "conflict.ts"), "// milestone version\nexport const x = 2;\n");
654
- run("git add .", wtPath);
655
- run("git commit -m 'add conflict.ts on milestone'", wtPath);
656
-
657
- const roadmap = makeRoadmap("M291", "Conflict milestone", [
658
- { id: "S01", title: "Conflict test" },
659
- ]);
660
-
661
- // The merge should throw MergeConflictError due to conflict.ts
662
- let threw = false;
663
- try {
664
- mergeMilestoneToMain(repo, "M291", roadmap);
665
- } catch (err: unknown) {
666
- threw = true;
667
- // Verify it's a merge conflict error
668
- assert.ok(
669
- err instanceof Error && err.message.includes("conflict"),
670
- "should throw a conflict-related error",
671
- );
672
- }
673
- assert.ok(threw, "mergeMilestoneToMain must throw on code conflict");
674
-
675
- // BUG #2912: MERGE_HEAD must NOT be left on disk after the error
676
- const mergeHeadPath = join(repo, ".git", "MERGE_HEAD");
677
- assert.ok(
678
- !existsSync(mergeHeadPath),
679
- "#2912: MERGE_HEAD must be cleaned up after merge conflict error",
680
- );
681
- });
682
-
683
- test("#2912: stale MERGE_HEAD from native merge is cleaned after successful commit", () => {
684
- const repo = freshRepo();
685
- const wtPath = createAutoWorktree(repo, "M292");
686
-
687
- addSliceToMilestone(repo, wtPath, "M292", "S01", "Feature A", [
688
- { file: "feature-a.ts", content: "export const a = true;\n", message: "add feature a" },
689
- ]);
690
-
691
- const roadmap = makeRoadmap("M292", "Clean merge", [
692
- { id: "S01", title: "Feature A" },
693
- ]);
694
-
695
- // Simulate what libgit2's merge implementation does: it creates MERGE_HEAD
696
- // even for squash merges (unlike CLI git). We plant MERGE_HEAD before calling
697
- // mergeMilestoneToMain to verify the success path cleans it up.
698
- // We cannot plant it before the call because the function manages checkout
699
- // internally, so instead we verify after the call.
700
- mergeMilestoneToMain(repo, "M292", roadmap);
701
-
702
- // After successful merge+commit, MERGE_HEAD must not linger
703
- const mergeHeadPath = join(repo, ".git", "MERGE_HEAD");
704
- assert.ok(
705
- !existsSync(mergeHeadPath),
706
- "#2912: MERGE_HEAD must be cleaned up after successful merge",
707
- );
708
- });
709
-
710
- test("#2912: planted MERGE_HEAD is cleaned up in success path", () => {
711
- // This test directly verifies the cleanup code handles a MERGE_HEAD file
712
- // left by the native (libgit2) merge path. We hook into the merge by
713
- // planting MERGE_HEAD right after nativeMergeSquash would create it.
714
- const repo = freshRepo();
715
- const wtPath = createAutoWorktree(repo, "M293");
716
-
717
- addSliceToMilestone(repo, wtPath, "M293", "S01", "Feature B", [
718
- { file: "feature-b.ts", content: "export const b = true;\n", message: "add feature b" },
719
- ]);
720
-
721
- const roadmap = makeRoadmap("M293", "Planted MERGE_HEAD", [
722
- { id: "S01", title: "Feature B" },
723
- ]);
724
-
725
- // Plant a fake MERGE_HEAD in the git dir to simulate libgit2 behavior.
726
- // We need to do this after the function checks out main but before it
727
- // commits. Since we can't intercept mid-function, we plant it before
728
- // the call. If the function cleans it up, the test passes.
729
- const gitDir = join(repo, ".git");
730
- const fakeHead = run("git rev-parse HEAD", repo);
731
- writeFileSync(join(gitDir, "MERGE_HEAD"), fakeHead + "\n");
732
-
733
- mergeMilestoneToMain(repo, "M293", roadmap);
734
-
735
- // The planted MERGE_HEAD must be cleaned up
736
- assert.ok(
737
- !existsSync(join(gitDir, "MERGE_HEAD")),
738
- "#2912: planted MERGE_HEAD must be removed by success-path cleanup",
739
- );
740
- });
741
-
742
641
  test("#1906: codeFilesChanged=true when real code is merged", () => {
743
642
  const repo = freshRepo();
744
643
  const wtPath = createAutoWorktree(repo, "M190");
@@ -20,7 +20,6 @@ import {
20
20
  enterAutoWorktree,
21
21
  getAutoWorktreeOriginalBase,
22
22
  getActiveAutoWorktreeContext,
23
- syncGsdStateToWorktree,
24
23
  } from "../../auto-worktree.ts";
25
24
 
26
25
  // Note: execSync is used intentionally in tests for git operations with
@@ -287,62 +286,4 @@ describe("auto-worktree lifecycle", () => {
287
286
  teardownAutoWorktree(tempDir, "M004");
288
287
  }
289
288
  });
290
-
291
- test("#2791: mcp.json copied into worktree via copyPlanningArtifacts", () => {
292
- tempDir = createTempRepo();
293
- const msDir = join(tempDir, ".gsd", "milestones", "M003");
294
- mkdirSync(msDir, { recursive: true });
295
- writeFileSync(join(msDir, "CONTEXT.md"), "# M003 Context\n");
296
- run("git add .", tempDir);
297
- run("git commit -m \"add milestone\"", tempDir);
298
-
299
- // Create mcp.json in .gsd/ AFTER the commit (untracked, like real usage).
300
- // copyPlanningArtifacts should copy it into the worktree's .gsd/.
301
- writeFileSync(
302
- join(tempDir, ".gsd", "mcp.json"),
303
- JSON.stringify({ servers: { test: { command: "echo" } } }),
304
- );
305
-
306
- const wtPath = createAutoWorktree(tempDir, "M003");
307
-
308
- try {
309
- assert.ok(
310
- existsSync(join(wtPath, ".gsd", "mcp.json")),
311
- "mcp.json should be copied into worktree .gsd/ on creation",
312
- );
313
- } finally {
314
- teardownAutoWorktree(tempDir, "M003");
315
- }
316
- });
317
-
318
- test("#2791: mcp.json synced via syncGsdStateToWorktree (ROOT_STATE_FILES)", () => {
319
- tempDir = createTempRepo();
320
- const msDir = join(tempDir, ".gsd", "milestones", "M003");
321
- mkdirSync(msDir, { recursive: true });
322
- writeFileSync(join(msDir, "CONTEXT.md"), "# M003 Context\n");
323
- run("git add .", tempDir);
324
- run("git commit -m \"add milestone\"", tempDir);
325
-
326
- // Create worktree first (no mcp.json yet)
327
- const wtPath = createAutoWorktree(tempDir, "M003");
328
-
329
- try {
330
- // Now add mcp.json to the main .gsd/ after worktree was created
331
- writeFileSync(
332
- join(tempDir, ".gsd", "mcp.json"),
333
- JSON.stringify({ servers: { test: { command: "echo" } } }),
334
- );
335
-
336
- // Sync should pick up the new mcp.json
337
- const { synced } = syncGsdStateToWorktree(tempDir, wtPath);
338
-
339
- assert.ok(synced.includes("mcp.json"), "mcp.json should be in the synced list");
340
- assert.ok(
341
- existsSync(join(wtPath, ".gsd", "mcp.json")),
342
- "mcp.json should exist in worktree after sync",
343
- );
344
- } finally {
345
- teardownAutoWorktree(tempDir, "M003");
346
- }
347
- });
348
289
  });