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
@@ -1,140 +0,0 @@
1
- // GSD State Machine Regression Tests — Event Replay & Reconciliation (#3161)
2
-
3
- import { describe, test, beforeEach, afterEach } from "node:test";
4
- import assert from "node:assert/strict";
5
- import {
6
- openDatabase,
7
- closeDatabase,
8
- insertMilestone,
9
- insertSlice,
10
- insertTask,
11
- getTask,
12
- updateTaskStatus,
13
- insertVerificationEvidence,
14
- upsertDecision,
15
- } from "../gsd-db.ts";
16
- import { extractEntityKey } from "../workflow-reconcile.ts";
17
-
18
- // ─── Helpers ─────────────────────────────────────────────────────────────────
19
-
20
- const MID = "M001";
21
- const SID = "S01";
22
- const TID = "T01";
23
- const TS = new Date().toISOString();
24
-
25
- function setupDb(): void {
26
- openDatabase(":memory:");
27
- insertMilestone({ id: MID, title: "Test Milestone" });
28
- insertSlice({ id: SID, milestoneId: MID, title: "Test Slice" });
29
- insertTask({ id: TID, sliceId: SID, milestoneId: MID, title: "Test Task" });
30
- }
31
-
32
- // ─── Tests ────────────────────────────────────────────────────────────────────
33
-
34
- describe("event-replay-idempotency", () => {
35
- beforeEach(() => {
36
- setupDb();
37
- });
38
-
39
- afterEach(() => {
40
- closeDatabase();
41
- });
42
-
43
- test("updateTaskStatus is idempotent for complete_task replay", () => {
44
- // Simulates replaying a complete_task event twice (e.g. crash recovery)
45
- updateTaskStatus(MID, SID, TID, "done", TS);
46
- updateTaskStatus(MID, SID, TID, "done", TS);
47
-
48
- const task = getTask(MID, SID, TID);
49
- assert.ok(task !== null, "task should exist after status update");
50
- assert.equal(task!.status, "done", "status should be 'done' after double replay");
51
- });
52
-
53
- test("updateTaskStatus is idempotent for start_task replay", () => {
54
- // Simulates replaying a start_task event twice
55
- updateTaskStatus(MID, SID, TID, "in-progress");
56
- updateTaskStatus(MID, SID, TID, "in-progress");
57
-
58
- const task = getTask(MID, SID, TID);
59
- assert.ok(task !== null, "task should exist after status update");
60
- assert.equal(task!.status, "in-progress", "status should be 'in-progress' after double replay");
61
- });
62
-
63
- test("updateTaskStatus for report_blocker does not set blocker_discovered flag (M4)", () => {
64
- // M4 finding: report_blocker replay only calls updateTaskStatus("blocked").
65
- // The blocker_discovered column is NOT set during replay — this is a known
66
- // lossy replay: status is recovered but the blocker flag is not.
67
- updateTaskStatus(MID, SID, TID, "blocked");
68
-
69
- const task = getTask(MID, SID, TID);
70
- assert.ok(task !== null, "task should exist after blocked status update");
71
- assert.equal(task!.status, "blocked", "status should be 'blocked'");
72
- assert.equal(
73
- task!.blocker_discovered,
74
- false,
75
- "blocker_discovered should remain false — report_blocker replay is lossy (M4 finding)",
76
- );
77
- });
78
-
79
- test("insertVerificationEvidence is NOT idempotent — duplicates accumulate (M5)", () => {
80
- // M5 finding: insertVerificationEvidence uses a plain INSERT (no ON CONFLICT),
81
- // so replaying the same record_verification event twice produces two rows.
82
- // Both calls must succeed without throwing — the duplication is the risk.
83
- const evidence = {
84
- taskId: TID,
85
- sliceId: SID,
86
- milestoneId: MID,
87
- command: "npm test",
88
- exitCode: 0,
89
- verdict: "pass",
90
- durationMs: 1200,
91
- };
92
-
93
- assert.doesNotThrow(
94
- () => insertVerificationEvidence(evidence),
95
- "first insertVerificationEvidence call should not throw",
96
- );
97
- assert.doesNotThrow(
98
- () => insertVerificationEvidence(evidence),
99
- "second insertVerificationEvidence call should not throw — duplicates accumulate silently (M5 finding)",
100
- );
101
- });
102
-
103
- test("upsertDecision is idempotent via INSERT OR REPLACE", () => {
104
- // save_decision replay uses upsertDecision which is INSERT OR REPLACE,
105
- // so replaying the same decision id twice overwrites without error.
106
- const base = {
107
- id: "arch:logging",
108
- when_context: "during planning",
109
- scope: "arch",
110
- decision: "logging",
111
- rationale: "structured logs",
112
- revisable: "yes" as const,
113
- made_by: "agent" as const,
114
- superseded_by: null,
115
- };
116
-
117
- upsertDecision({ ...base, choice: "structured" });
118
- upsertDecision({ ...base, choice: "unstructured" });
119
-
120
- // No error means the second call replaced the first — idempotent at the id level.
121
- // The final choice is "unstructured" per INSERT OR REPLACE semantics.
122
- });
123
-
124
- test("unknown event commands in replayEvents are silently skipped — extractEntityKey returns null for unknown commands", () => {
125
- // replayEvents uses a switch/default that silently skips unrecognised commands.
126
- // We verify this via extractEntityKey which follows the same command set.
127
- // A future_command not in the switch must return null (not throw).
128
- const event = {
129
- cmd: "future_command",
130
- params: { foo: "bar" },
131
- ts: new Date().toISOString(),
132
- hash: "0000000000000000",
133
- actor: "agent" as const,
134
- session_id: "test-session",
135
- };
136
-
137
- const key = extractEntityKey(event);
138
- assert.equal(key, null, "extractEntityKey should return null for unknown commands");
139
- });
140
- });
@@ -1,129 +0,0 @@
1
- import { describe, it, beforeEach, afterEach } from "node:test";
2
- import assert from "node:assert/strict";
3
- import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
4
- import { join, dirname } from "node:path";
5
- import { fileURLToPath } from "node:url";
6
-
7
- const __dirname = dirname(fileURLToPath(import.meta.url));
8
- const gsdDir = join(__dirname, "..");
9
-
10
- /**
11
- * Test suite for #2941: Forensics report context lost on follow-up turns.
12
- *
13
- * The forensics flow sends a one-shot message via sendMessage() with
14
- * triggerTurn: true. On follow-up turns, the context is gone because
15
- * there's no re-injection mechanism like buildGuidedExecuteContextInjection
16
- * provides for task execution.
17
- *
18
- * Fix: write an active-forensics.json marker when forensics starts, and
19
- * have buildBeforeAgentStartResult() re-inject the forensics prompt on
20
- * subsequent turns.
21
- */
22
-
23
- describe("forensics context persistence (#2941)", () => {
24
- // ─── Source-level invariant tests ──────────────────────────────────────────
25
-
26
- it("forensics.ts writes active-forensics marker after saving report", () => {
27
- const src = readFileSync(join(gsdDir, "forensics.ts"), "utf-8");
28
- assert.ok(
29
- src.includes("active-forensics.json"),
30
- "forensics.ts must reference active-forensics.json marker file",
31
- );
32
- assert.ok(
33
- src.includes("writeForensicsMarker"),
34
- "forensics.ts must call writeForensicsMarker to persist session state",
35
- );
36
- });
37
-
38
- it("system-context.ts checks for active forensics marker in buildBeforeAgentStartResult", () => {
39
- const src = readFileSync(join(gsdDir, "bootstrap", "system-context.ts"), "utf-8");
40
- assert.ok(
41
- src.includes("active-forensics.json"),
42
- "system-context.ts must check for active-forensics.json marker",
43
- );
44
- assert.ok(
45
- src.includes("gsd-forensics"),
46
- "system-context.ts must inject gsd-forensics customType message",
47
- );
48
- });
49
-
50
- it("system-context.ts exports clearForensicsMarker for cleanup", () => {
51
- const src = readFileSync(join(gsdDir, "bootstrap", "system-context.ts"), "utf-8");
52
- assert.ok(
53
- src.includes("clearForensicsMarker"),
54
- "system-context.ts must export clearForensicsMarker function",
55
- );
56
- });
57
-
58
- // ─── Functional tests using temp directories ──────────────────────────────
59
-
60
- const tmpBase = join(__dirname, "__tmp_forensics_persist__");
61
-
62
- beforeEach(() => {
63
- rmSync(tmpBase, { recursive: true, force: true });
64
- mkdirSync(join(tmpBase, ".gsd", "runtime"), { recursive: true });
65
- mkdirSync(join(tmpBase, ".gsd", "forensics"), { recursive: true });
66
- });
67
-
68
- afterEach(() => {
69
- rmSync(tmpBase, { recursive: true, force: true });
70
- });
71
-
72
- it("writeForensicsMarker creates marker with reportPath and promptContent", async () => {
73
- const { writeForensicsMarker } = await import("../forensics.ts");
74
-
75
- const reportPath = join(tmpBase, ".gsd", "forensics", "report-2026-01-01.md");
76
- writeFileSync(reportPath, "# Test Report", "utf-8");
77
-
78
- writeForensicsMarker(tmpBase, reportPath, "Test forensics prompt content");
79
-
80
- const markerPath = join(tmpBase, ".gsd", "runtime", "active-forensics.json");
81
- assert.ok(existsSync(markerPath), "marker file must be created");
82
-
83
- const marker = JSON.parse(readFileSync(markerPath, "utf-8"));
84
- assert.equal(marker.reportPath, reportPath);
85
- assert.equal(marker.promptContent, "Test forensics prompt content");
86
- assert.ok(marker.createdAt, "marker must have createdAt timestamp");
87
- });
88
-
89
- it("readForensicsMarker returns null when no marker exists", async () => {
90
- const { readForensicsMarker } = await import("../forensics.ts");
91
-
92
- const result = readForensicsMarker(join(tmpBase, "nonexistent"));
93
- assert.equal(result, null);
94
- });
95
-
96
- it("readForensicsMarker returns marker data when file exists", async () => {
97
- const { readForensicsMarker } = await import("../forensics.ts");
98
-
99
- const markerPath = join(tmpBase, ".gsd", "runtime", "active-forensics.json");
100
- const markerData = {
101
- reportPath: "/some/report.md",
102
- promptContent: "forensics prompt",
103
- createdAt: new Date().toISOString(),
104
- };
105
- writeFileSync(markerPath, JSON.stringify(markerData), "utf-8");
106
-
107
- const result = readForensicsMarker(tmpBase);
108
- assert.ok(result);
109
- assert.equal(result.reportPath, "/some/report.md");
110
- assert.equal(result.promptContent, "forensics prompt");
111
- });
112
-
113
- it("clearForensicsMarker removes the marker file", async () => {
114
- const { clearForensicsMarker } = await import("../bootstrap/system-context.ts");
115
-
116
- const markerPath = join(tmpBase, ".gsd", "runtime", "active-forensics.json");
117
- writeFileSync(markerPath, JSON.stringify({ reportPath: "/x", promptContent: "y", createdAt: new Date().toISOString() }), "utf-8");
118
- assert.ok(existsSync(markerPath), "precondition: marker must exist");
119
-
120
- clearForensicsMarker(tmpBase);
121
- assert.ok(!existsSync(markerPath), "marker must be removed after clear");
122
- });
123
-
124
- it("clearForensicsMarker is a no-op when no marker exists", async () => {
125
- const { clearForensicsMarker } = await import("../bootstrap/system-context.ts");
126
- // Should not throw
127
- clearForensicsMarker(join(tmpBase, "nonexistent"));
128
- });
129
- });
@@ -1,96 +0,0 @@
1
- import { describe, it } from "node:test";
2
- import assert from "node:assert/strict";
3
- import { readFileSync } from "node:fs";
4
- import { join, dirname } from "node:path";
5
- import { fileURLToPath } from "node:url";
6
-
7
- const __dirname = dirname(fileURLToPath(import.meta.url));
8
- const gsdDir = join(__dirname, "..");
9
-
10
- /**
11
- * Tests for #3129: forensics reads DB for completion status instead of legacy file.
12
- *
13
- * The old loadCompletedKeys() reads completed-units.json which is never populated
14
- * during normal auto-mode completion. The DB (milestones/slices/tasks tables) is
15
- * the authoritative source for completion status.
16
- */
17
- describe("forensics DB completion status (#3129)", () => {
18
- const forensicsSrc = readFileSync(join(gsdDir, "forensics.ts"), "utf-8");
19
- const stateSrc = readFileSync(join(gsdDir, "state.ts"), "utf-8");
20
-
21
- // ── Primary fix: forensics queries DB for completion counts ──────────
22
-
23
- it("ForensicReport has dbCompletionCounts field for DB-sourced completion data", () => {
24
- assert.ok(
25
- forensicsSrc.includes("dbCompletionCounts"),
26
- "ForensicReport must include dbCompletionCounts field for DB-sourced completion data",
27
- );
28
- });
29
-
30
- it("buildForensicReport queries DB for completed milestones, slices, and tasks", () => {
31
- assert.ok(
32
- forensicsSrc.includes("getDbCompletionCounts"),
33
- "buildForensicReport must call getDbCompletionCounts to query DB completion status",
34
- );
35
- });
36
-
37
- it("getDbCompletionCounts checks isDbAvailable before querying", () => {
38
- assert.ok(
39
- forensicsSrc.includes("isDbAvailable"),
40
- "getDbCompletionCounts must check isDbAvailable() before querying the DB",
41
- );
42
- });
43
-
44
- it("getDbCompletionCounts queries getAllMilestones for milestone completion", () => {
45
- assert.ok(
46
- forensicsSrc.includes("getAllMilestones"),
47
- "getDbCompletionCounts must use getAllMilestones() to count completed milestones",
48
- );
49
- });
50
-
51
- it("completion counting uses isClosedStatus for consistent status checks", () => {
52
- assert.ok(
53
- forensicsSrc.includes("isClosedStatus"),
54
- "forensics must use isClosedStatus() for consistent status checks",
55
- );
56
- });
57
-
58
- it("report rendering shows DB completion counts instead of just legacy key count", () => {
59
- assert.ok(
60
- forensicsSrc.includes("milestones complete"),
61
- "report must show '__ milestones complete' from DB data",
62
- );
63
- assert.ok(
64
- forensicsSrc.includes("slices complete"),
65
- "report must show '__ slices complete' from DB data",
66
- );
67
- assert.ok(
68
- forensicsSrc.includes("tasks complete"),
69
- "report must show '__ tasks complete' from DB data",
70
- );
71
- });
72
-
73
- it("falls back to completed-units.json only when DB is unavailable", () => {
74
- // loadCompletedKeys should still exist as fallback
75
- assert.ok(
76
- forensicsSrc.includes("loadCompletedKeys"),
77
- "loadCompletedKeys must still exist as fallback for non-DB projects",
78
- );
79
- // But the report should prefer DB counts
80
- assert.ok(
81
- forensicsSrc.includes("dbCompletionCounts"),
82
- "report must prefer dbCompletionCounts over legacy completedKeys",
83
- );
84
- });
85
-
86
- // ── Secondary fix: STATE.md label when all milestones complete ───────
87
-
88
- it("state.ts returns null activeMilestone when all milestones are complete", () => {
89
- // When phase is "complete", activeMilestone should be null, not the last milestone
90
- // The last completed milestone should be in a separate field
91
- assert.ok(
92
- stateSrc.includes("lastCompletedMilestone"),
93
- "GSDState must have lastCompletedMilestone field for the final milestone when phase=complete",
94
- );
95
- });
96
- });
@@ -1,164 +0,0 @@
1
- /**
2
- * gsdroot-worktree-detection.test.ts — Regression test for #2594.
3
- *
4
- * gsdRoot() must return the worktree's own .gsd directory when the basePath
5
- * is inside a .gsd/worktrees/<name>/ structure, not walk up to the project
6
- * root's .gsd via the git-root probe.
7
- *
8
- * The bug: when a git worktree lives at /project/.gsd/worktrees/M008/,
9
- * probeGsdRoot() runs `git rev-parse --show-toplevel` which can return the
10
- * main project root (not the worktree root) depending on git version and
11
- * worktree setup. The walk-up then finds /project/.gsd and returns that
12
- * instead of the worktree's own .gsd path.
13
- */
14
-
15
- import { describe, test, beforeEach, afterEach } from "node:test";
16
- import assert from "node:assert/strict";
17
- import { mkdirSync, rmSync, writeFileSync } from "node:fs";
18
- import { join } from "node:path";
19
- import { mkdtempSync, realpathSync } from "node:fs";
20
- import { tmpdir } from "node:os";
21
- import { spawnSync } from "node:child_process";
22
-
23
- import { gsdRoot, _clearGsdRootCache } from "../paths.ts";
24
-
25
- describe("gsdRoot() worktree detection (#2594)", () => {
26
- let projectRoot: string;
27
- let projectGsd: string;
28
-
29
- beforeEach(() => {
30
- _clearGsdRootCache();
31
- // Create a temporary project with a git repo to simulate real conditions.
32
- // realpathSync handles macOS /tmp -> /private/tmp.
33
- projectRoot = realpathSync(mkdtempSync(join(tmpdir(), "gsdroot-wt-")));
34
- projectGsd = join(projectRoot, ".gsd");
35
- mkdirSync(projectGsd, { recursive: true });
36
-
37
- // Initialize a git repo in the project root so git rev-parse works
38
- spawnSync("git", ["init", "--initial-branch=main"], {
39
- cwd: projectRoot,
40
- stdio: "ignore",
41
- });
42
- spawnSync("git", ["config", "user.email", "test@test.com"], {
43
- cwd: projectRoot,
44
- stdio: "ignore",
45
- });
46
- spawnSync("git", ["config", "user.name", "Test"], {
47
- cwd: projectRoot,
48
- stdio: "ignore",
49
- });
50
- // Create an initial commit so we have a HEAD
51
- writeFileSync(join(projectRoot, "README.md"), "# Test");
52
- spawnSync("git", ["add", "."], { cwd: projectRoot, stdio: "ignore" });
53
- spawnSync("git", ["commit", "-m", "init"], {
54
- cwd: projectRoot,
55
- stdio: "ignore",
56
- });
57
- });
58
-
59
- afterEach(() => {
60
- _clearGsdRootCache();
61
- rmSync(projectRoot, { recursive: true, force: true });
62
- });
63
-
64
- test("returns worktree .gsd when basePath is a worktree with its own .gsd (fast path)", () => {
65
- // Simulates a worktree that already had copyPlanningArtifacts() run,
66
- // so it has its own .gsd/ directory.
67
- const worktreeBase = join(projectGsd, "worktrees", "M008");
68
- const worktreeGsd = join(worktreeBase, ".gsd");
69
- mkdirSync(worktreeGsd, { recursive: true });
70
-
71
- const result = gsdRoot(worktreeBase);
72
- assert.equal(
73
- result,
74
- worktreeGsd,
75
- `Expected worktree .gsd (${worktreeGsd}), got ${result}. ` +
76
- "gsdRoot() should use the fast path for an existing worktree .gsd.",
77
- );
78
- });
79
-
80
- test("returns worktree .gsd path (not project root .gsd) when worktree .gsd does not exist yet", () => {
81
- // This is the core #2594 bug: the worktree directory exists but its .gsd
82
- // subdirectory hasn't been created yet. Without the fix, probeGsdRoot()
83
- // walks up from the worktree path, finds /project/.gsd, and returns it.
84
- // With the fix, it detects the .gsd/worktrees/<name>/ pattern and returns
85
- // the worktree-local .gsd path as the creation fallback.
86
- const worktreeBase = join(projectGsd, "worktrees", "M008");
87
- mkdirSync(worktreeBase, { recursive: true });
88
- // NOTE: no .gsd/ inside worktreeBase
89
-
90
- const result = gsdRoot(worktreeBase);
91
- const expected = join(worktreeBase, ".gsd");
92
-
93
- // Without the fix, this returns projectGsd (/project/.gsd) because the
94
- // walk-up from worktreeBase finds it. With the fix, it returns the
95
- // worktree-local path.
96
- assert.notEqual(
97
- result,
98
- projectGsd,
99
- "gsdRoot() must NOT return the project root .gsd when basePath is inside .gsd/worktrees/",
100
- );
101
- assert.equal(
102
- result,
103
- expected,
104
- `Expected worktree-local .gsd (${expected}), got ${result}.`,
105
- );
106
- });
107
-
108
- test("returns worktree .gsd when basePath is a real git worktree inside .gsd/worktrees/", () => {
109
- // Create a real git worktree at .gsd/worktrees/M010
110
- const worktreeName = "M010";
111
- const worktreeBase = join(projectGsd, "worktrees", worktreeName);
112
-
113
- // Use git worktree add to create a real worktree
114
- const result = spawnSync(
115
- "git",
116
- ["worktree", "add", "-b", `milestone/${worktreeName}`, worktreeBase],
117
- { cwd: projectRoot, encoding: "utf-8" },
118
- );
119
-
120
- if (result.status !== 0) {
121
- // If git worktree add fails, skip the test gracefully
122
- assert.ok(true, "Skipped: git worktree add not available");
123
- return;
124
- }
125
-
126
- // The real git worktree exists at worktreeBase but has NO .gsd/ subdir yet
127
- const gsdResult = gsdRoot(worktreeBase);
128
- const expected = join(worktreeBase, ".gsd");
129
-
130
- assert.notEqual(
131
- gsdResult,
132
- projectGsd,
133
- "gsdRoot() must NOT escape to project root .gsd from inside a git worktree",
134
- );
135
- assert.equal(
136
- gsdResult,
137
- expected,
138
- `Expected worktree-local .gsd (${expected}), got ${gsdResult}`,
139
- );
140
-
141
- // Cleanup worktree
142
- spawnSync("git", ["worktree", "remove", "--force", worktreeBase], {
143
- cwd: projectRoot,
144
- stdio: "ignore",
145
- });
146
- });
147
-
148
- test("still returns project .gsd for normal (non-worktree) basePath", () => {
149
- const result = gsdRoot(projectRoot);
150
- assert.equal(result, projectGsd);
151
- });
152
-
153
- test("still returns project .gsd for a subdirectory of the project", () => {
154
- const subdir = join(projectRoot, "src", "lib");
155
- mkdirSync(subdir, { recursive: true });
156
-
157
- const result = gsdRoot(subdir);
158
- assert.equal(
159
- result,
160
- projectGsd,
161
- "Non-worktree subdirectories should still resolve to project .gsd",
162
- );
163
- });
164
- });
@@ -1,135 +0,0 @@
1
- /**
2
- * Guided-flow dynamic routing — regression test for #2958.
3
- *
4
- * Verifies that dispatchWorkflow() routes through the dynamic routing pipeline
5
- * (selectAndApplyModel from auto-model-selection.ts) instead of bypassing it
6
- * with a direct call to resolveModelWithFallbacksForUnit.
7
- *
8
- * Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
9
- */
10
-
11
- import test from "node:test";
12
- import assert from "node:assert/strict";
13
- import { readFileSync } from "node:fs";
14
- import { join, dirname } from "node:path";
15
- import { fileURLToPath } from "node:url";
16
-
17
- const __dirname = dirname(fileURLToPath(import.meta.url));
18
- const gsdDir = join(__dirname, "..");
19
-
20
- function readSrc(file: string): string {
21
- return readFileSync(join(gsdDir, file), "utf-8");
22
- }
23
-
24
- const guidedFlowSrc = readSrc("guided-flow.ts");
25
-
26
- // ═══════════════════════════════════════════════════════════════════════════
27
- // #2958: dispatchWorkflow must route through dynamic routing pipeline
28
- // ═══════════════════════════════════════════════════════════════════════════
29
-
30
- test("#2958: guided-flow imports selectAndApplyModel from auto-model-selection", () => {
31
- assert.ok(
32
- guidedFlowSrc.includes("selectAndApplyModel"),
33
- "guided-flow.ts must import and use selectAndApplyModel from auto-model-selection.ts",
34
- );
35
- });
36
-
37
- test("#2958: dispatchWorkflow does not call resolveModelWithFallbacksForUnit directly", () => {
38
- // Extract the dispatchWorkflow function body
39
- const fnStart = guidedFlowSrc.indexOf("async function dispatchWorkflow(");
40
- assert.ok(fnStart !== -1, "dispatchWorkflow function not found");
41
-
42
- // Find the function body by tracking brace depth
43
- const openBrace = guidedFlowSrc.indexOf("{", fnStart);
44
- let depth = 1;
45
- let pos = openBrace + 1;
46
- while (depth > 0 && pos < guidedFlowSrc.length) {
47
- if (guidedFlowSrc[pos] === "{") depth++;
48
- else if (guidedFlowSrc[pos] === "}") depth--;
49
- pos++;
50
- }
51
- const fnBody = guidedFlowSrc.slice(openBrace, pos);
52
-
53
- assert.ok(
54
- !fnBody.includes("resolveModelWithFallbacksForUnit"),
55
- "dispatchWorkflow must NOT call resolveModelWithFallbacksForUnit directly — " +
56
- "it must route through selectAndApplyModel for dynamic routing support (#2958)",
57
- );
58
- });
59
-
60
- test("#2958: dispatchWorkflow calls selectAndApplyModel for model selection", () => {
61
- // Extract the dispatchWorkflow function body
62
- const fnStart = guidedFlowSrc.indexOf("async function dispatchWorkflow(");
63
- assert.ok(fnStart !== -1, "dispatchWorkflow function not found");
64
-
65
- const openBrace = guidedFlowSrc.indexOf("{", fnStart);
66
- let depth = 1;
67
- let pos = openBrace + 1;
68
- while (depth > 0 && pos < guidedFlowSrc.length) {
69
- if (guidedFlowSrc[pos] === "{") depth++;
70
- else if (guidedFlowSrc[pos] === "}") depth--;
71
- pos++;
72
- }
73
- const fnBody = guidedFlowSrc.slice(openBrace, pos);
74
-
75
- assert.ok(
76
- fnBody.includes("selectAndApplyModel"),
77
- "dispatchWorkflow must call selectAndApplyModel to route through the dynamic routing pipeline (#2958)",
78
- );
79
- });
80
-
81
- test("#2958: dispatchWorkflow does not use resolveAvailableModel inline", () => {
82
- const fnStart = guidedFlowSrc.indexOf("async function dispatchWorkflow(");
83
- assert.ok(fnStart !== -1, "dispatchWorkflow function not found");
84
-
85
- const openBrace = guidedFlowSrc.indexOf("{", fnStart);
86
- let depth = 1;
87
- let pos = openBrace + 1;
88
- while (depth > 0 && pos < guidedFlowSrc.length) {
89
- if (guidedFlowSrc[pos] === "{") depth++;
90
- else if (guidedFlowSrc[pos] === "}") depth--;
91
- pos++;
92
- }
93
- const fnBody = guidedFlowSrc.slice(openBrace, pos);
94
-
95
- assert.ok(
96
- !fnBody.includes("resolveAvailableModel"),
97
- "dispatchWorkflow must NOT use resolveAvailableModel inline — " +
98
- "model resolution is handled by selectAndApplyModel (#2958)",
99
- );
100
- });
101
-
102
- test("#2958: guided-flow does not import resolveModelWithFallbacksForUnit", () => {
103
- // The import should be removed since dispatchWorkflow was the only consumer
104
- // Check if resolveModelWithFallbacksForUnit is still used elsewhere in the file
105
- const fnStart = guidedFlowSrc.indexOf("async function dispatchWorkflow(");
106
- const beforeDispatch = guidedFlowSrc.slice(0, fnStart);
107
- const afterFnEnd = (() => {
108
- const openBrace = guidedFlowSrc.indexOf("{", fnStart);
109
- let depth = 1;
110
- let p = openBrace + 1;
111
- while (depth > 0 && p < guidedFlowSrc.length) {
112
- if (guidedFlowSrc[p] === "{") depth++;
113
- else if (guidedFlowSrc[p] === "}") depth--;
114
- p++;
115
- }
116
- return guidedFlowSrc.slice(p);
117
- })();
118
-
119
- // If resolveModelWithFallbacksForUnit is not used outside dispatchWorkflow,
120
- // the import should be removed
121
- const usedOutside = beforeDispatch.includes("resolveModelWithFallbacksForUnit(")
122
- || afterFnEnd.includes("resolveModelWithFallbacksForUnit(");
123
-
124
- if (!usedOutside) {
125
- // Verify the import line was cleaned up
126
- const importLines = guidedFlowSrc.split("\n").filter(l =>
127
- l.includes("import") && l.includes("resolveModelWithFallbacksForUnit"),
128
- );
129
- assert.equal(
130
- importLines.length,
131
- 0,
132
- "resolveModelWithFallbacksForUnit import should be removed when no longer used outside dispatchWorkflow",
133
- );
134
- }
135
- });