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
@@ -8,7 +8,7 @@
8
8
 
9
9
  import { createHash } from "node:crypto";
10
10
  import { execFileSync } from "node:child_process";
11
- import { cpSync, existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, realpathSync, renameSync, rmSync, symlinkSync, unlinkSync, writeFileSync } from "node:fs";
11
+ import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, realpathSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
12
12
  import { homedir } from "node:os";
13
13
  import { basename, dirname, join, resolve } from "node:path";
14
14
 
@@ -276,14 +276,9 @@ export function validateProjectId(id: string): boolean {
276
276
  * If `GSD_PROJECT_ID` is set, returns it directly (validation is expected
277
277
  * to have already happened at startup via `validateProjectId`).
278
278
  *
279
- * For repos with a remote URL, returns SHA-256 of the remote URL only —
280
- * this makes the identity stable across directory moves/renames (#2750).
281
- *
282
- * For local-only repos (no remote), includes the git root in the hash.
283
- * Local repos use a `.gsd-id` marker file for recovery after moves.
284
- *
285
- * Deterministic: same repo always produces the same hash regardless of
286
- * which worktree the caller is inside.
279
+ * Otherwise returns SHA-256 of `${remoteUrl}\n${resolvedRoot}`, truncated
280
+ * to 12 hex chars. Deterministic: same repo always produces the same hash
281
+ * regardless of which worktree the caller is inside.
287
282
  */
288
283
  export function repoIdentity(basePath: string): string {
289
284
  const projectId = process.env.GSD_PROJECT_ID;
@@ -291,14 +286,8 @@ export function repoIdentity(basePath: string): string {
291
286
  return projectId;
292
287
  }
293
288
  const remoteUrl = getRemoteUrl(basePath);
294
- if (remoteUrl) {
295
- // Remote URL alone uniquely identifies the repo — path is redundant.
296
- // This makes moves transparent for repos with remotes (#2750).
297
- return createHash("sha256").update(remoteUrl).digest("hex").slice(0, 12);
298
- }
299
- // Local-only repo: include git root since there's no remote to anchor identity.
300
289
  const root = resolveGitRoot(basePath);
301
- const input = `\n${root}`;
290
+ const input = `${remoteUrl}\n${root}`;
302
291
  return createHash("sha256").update(input).digest("hex").slice(0, 12);
303
292
  }
304
293
 
@@ -362,148 +351,21 @@ export function cleanNumberedGsdVariants(projectPath: string): string[] {
362
351
  return removed;
363
352
  }
364
353
 
365
- // ─── .gsd-id Marker ─────────────────────────────────────────────────────────
366
-
367
- /**
368
- * Write a `.gsd-id` marker file in the project root.
369
- *
370
- * This file records the identity hash used for the external state directory.
371
- * For local-only repos (no remote), this marker survives directory moves and
372
- * enables automatic recovery of orphaned state (#2750).
373
- *
374
- * The marker is gitignored by ensureGitignore(). Non-fatal: failure to write
375
- * the marker must never block project setup.
376
- */
377
- function writeGsdIdMarker(projectPath: string, identity: string): void {
378
- try {
379
- const markerPath = join(projectPath, ".gsd-id");
380
- // Only write if content differs to avoid unnecessary disk writes.
381
- if (existsSync(markerPath)) {
382
- try {
383
- if (readFileSync(markerPath, "utf-8").trim() === identity) return;
384
- } catch { /* fall through and overwrite */ }
385
- }
386
- writeFileSync(markerPath, identity + "\n", "utf-8");
387
- } catch {
388
- // Non-fatal — marker write failure should not block project setup
389
- }
390
- }
391
-
392
- /**
393
- * Read the `.gsd-id` marker from the project root.
394
- * Returns the identity hash, or null if the marker doesn't exist or is unreadable.
395
- */
396
- function readGsdIdMarker(projectPath: string): string | null {
397
- try {
398
- const markerPath = join(projectPath, ".gsd-id");
399
- if (!existsSync(markerPath)) return null;
400
- const content = readFileSync(markerPath, "utf-8").trim();
401
- return /^[a-zA-Z0-9_-]+$/.test(content) ? content : null;
402
- } catch {
403
- return null;
404
- }
405
- }
406
-
407
- /**
408
- * Check whether an external state directory has meaningful content.
409
- * Returns true if the directory contains any files or subdirectories
410
- * beyond just repo-meta.json.
411
- */
412
- function hasProjectState(externalPath: string): boolean {
413
- try {
414
- if (!existsSync(externalPath)) return false;
415
- const entries = readdirSync(externalPath);
416
- return entries.some(e => e !== "repo-meta.json");
417
- } catch {
418
- return false;
419
- }
420
- }
421
-
422
- /**
423
- * Resolve the external state directory, with recovery for relocated projects.
424
- *
425
- * For local-only repos where the computed identity produces an empty state dir,
426
- * checks the `.gsd-id` marker for the original identity hash and recovers
427
- * the old state directory if it still exists and contains data (#2750).
428
- *
429
- * Returns the resolved external path (may differ from the computed identity).
430
- */
431
- function resolveExternalPathWithRecovery(projectPath: string): string {
432
- const computedPath = externalGsdRoot(projectPath);
433
- const computedId = repoIdentity(projectPath);
434
-
435
- // Check if computed path already has state — fast path, no recovery needed.
436
- if (hasProjectState(computedPath)) {
437
- return computedPath;
438
- }
439
-
440
- // Check for .gsd-id marker from a previous location.
441
- const markerId = readGsdIdMarker(projectPath);
442
- if (markerId && markerId !== computedId) {
443
- // The marker points to a different identity — the repo was likely moved.
444
- const base = process.env.GSD_STATE_DIR || gsdHome;
445
- const markerPath = join(base, "projects", markerId);
446
- if (hasProjectState(markerPath)) {
447
- // Recover: use the old state directory and update the marker to the new identity.
448
- // Move the state from the old hash dir to the new one so future lookups work
449
- // without the marker.
450
- try {
451
- mkdirSync(computedPath, { recursive: true });
452
- const entries = readdirSync(markerPath);
453
- for (const entry of entries) {
454
- try {
455
- const src = join(markerPath, entry);
456
- const dst = join(computedPath, entry);
457
- // Use rename for same-filesystem (fast) or fall back to copy.
458
- try {
459
- renameSync(src, dst);
460
- } catch {
461
- cpSync(src, dst, { recursive: true, force: true });
462
- }
463
- } catch { /* continue with remaining entries */ }
464
- }
465
- // Clean up old directory after successful migration.
466
- try { rmSync(markerPath, { recursive: true, force: true }); } catch { /* non-fatal */ }
467
- } catch {
468
- // If migration fails, just point at the old directory.
469
- return markerPath;
470
- }
471
- }
472
- }
473
-
474
- return computedPath;
475
- }
476
-
477
354
  // ─── Symlink Management ─────────────────────────────────────────────────────
478
355
 
479
356
  /**
480
357
  * Ensure the `<project>/.gsd` symlink points to the external state directory.
481
358
  *
482
359
  * 1. Clean up any macOS numbered collision variants (`.gsd 2`, `.gsd 3`, etc.)
483
- * 2. Resolve external dir (with relocation recovery via `.gsd-id` marker)
484
- * 3. mkdir -p the external dir
485
- * 4. If `<project>/.gsd` doesn't exist create symlink
486
- * 5. If `<project>/.gsd` is already the correct symlink no-op
487
- * 6. If `<project>/.gsd` is a real directory → return as-is (migration handles later)
488
- * 7. Write `.gsd-id` marker for future relocation recovery
360
+ * 2. mkdir -p the external dir
361
+ * 3. If `<project>/.gsd` doesn't exist → create symlink
362
+ * 4. If `<project>/.gsd` is already the correct symlink → no-op
363
+ * 5. If `<project>/.gsd` is a real directoryreturn as-is (migration handles later)
489
364
  *
490
365
  * Returns the resolved external path.
491
366
  */
492
367
  export function ensureGsdSymlink(projectPath: string): string {
493
- const result = ensureGsdSymlinkCore(projectPath);
494
-
495
- // Write .gsd-id marker so future relocations can recover this state (#2750).
496
- // Only write for the project root (not subdirectories or worktrees that
497
- // delegate to a parent .gsd).
498
- if (!isInsideWorktree(projectPath)) {
499
- writeGsdIdMarker(projectPath, repoIdentity(projectPath));
500
- }
501
-
502
- return result;
503
- }
504
-
505
- function ensureGsdSymlinkCore(projectPath: string): string {
506
- const externalPath = resolveExternalPathWithRecovery(projectPath);
368
+ const externalPath = externalGsdRoot(projectPath);
507
369
  const localGsd = join(projectPath, ".gsd");
508
370
  const inWorktree = isInsideWorktree(projectPath);
509
371
 
@@ -556,28 +418,12 @@ function ensureGsdSymlinkCore(projectPath: string): string {
556
418
 
557
419
  const replaceWithSymlink = (): string => {
558
420
  rmSync(localGsd, { recursive: true, force: true });
559
- // Defensive: remove any residual entry (e.g. dangling symlink) before creating.
560
- try { unlinkSync(localGsd); } catch { /* already gone */ }
561
421
  symlinkSync(externalPath, localGsd, "junction");
562
422
  return externalPath;
563
423
  };
564
424
 
565
- // Check for dangling symlinks (e.g. after relocation recovery removed the old
566
- // state dir). existsSync follows symlinks, so it returns false for dangling ones.
567
- // lstatSync does NOT follow, so we can detect the dangling symlink and replace it.
568
425
  if (!existsSync(localGsd)) {
569
- try {
570
- const stat = lstatSync(localGsd);
571
- if (stat.isSymbolicLink()) {
572
- // Dangling symlink — replace with correct one (#2750).
573
- return replaceWithSymlink();
574
- }
575
- } catch {
576
- // lstat also failed — nothing exists at this path
577
- }
578
- // Nothing exists yet — create symlink.
579
- // Defensive: remove any residual entry to avoid EEXIST race (#2750).
580
- try { unlinkSync(localGsd); } catch { /* nothing to remove */ }
426
+ // Nothing exists yet — create symlink
581
427
  symlinkSync(externalPath, localGsd, "junction");
582
428
  return externalPath;
583
429
  }
@@ -596,27 +442,6 @@ function ensureGsdSymlinkCore(projectPath: string): string {
596
442
  if (inWorktree) {
597
443
  return replaceWithSymlink();
598
444
  }
599
- // After identity hash change (e.g. upgrade from path-based to remote-only
600
- // hash, or relocation recovery), migrate data from old target to new path
601
- // and update the symlink (#2750).
602
- if (!hasProjectState(externalPath) && hasProjectState(target)) {
603
- try {
604
- mkdirSync(externalPath, { recursive: true });
605
- const oldEntries = readdirSync(target);
606
- for (const entry of oldEntries) {
607
- try {
608
- const src = join(target, entry);
609
- const dst = join(externalPath, entry);
610
- try { renameSync(src, dst); } catch { cpSync(src, dst, { recursive: true, force: true }); }
611
- } catch { /* continue */ }
612
- }
613
- try { rmSync(target, { recursive: true, force: true }); } catch { /* non-fatal */ }
614
- return replaceWithSymlink();
615
- } catch {
616
- // Migration failed — preserve old symlink
617
- return target;
618
- }
619
- }
620
445
  // Outside worktrees, preserve custom overrides or legacy symlinks.
621
446
  return target;
622
447
  }
@@ -19,7 +19,6 @@ import { isParked, getParkedReason } from "./milestone-actions.js";
19
19
  import { getMilestoneSlices, isDbAvailable } from "./gsd-db.js";
20
20
  import { buildExistingMilestonesContext } from "./guided-flow-queue.js";
21
21
  import { loadPrompt } from "./prompt-loader.js";
22
- import { isGsdGitignored } from "./gitignore.js";
23
22
 
24
23
  // ─── Entry Point ──────────────────────────────────────────────────────────────
25
24
 
@@ -54,14 +53,9 @@ export async function handleRethink(
54
53
  const rethinkData = buildRethinkData(basePath, milestoneIds, state, queueOrder);
55
54
  const existingMilestonesContext = await buildExistingMilestonesContext(basePath, milestoneIds, state);
56
55
 
57
- const commitInstruction = isGsdGitignored(basePath)
58
- ? "Do not commit planning artifacts — .gsd/ is gitignored in this project."
59
- : 'After changes, run `git add .gsd/ && git commit -m "docs(gsd): rethink milestone plan"` to persist (rethink runs interactively outside auto-mode, so no system auto-commit)';
60
-
61
56
  const content = loadPrompt("rethink", {
62
57
  rethinkData,
63
58
  existingMilestonesContext,
64
- commitInstruction,
65
59
  });
66
60
 
67
61
  pi.sendMessage(
@@ -219,14 +219,13 @@ export function parseRoadmapSlices(content: string): RoadmapSliceEntry[] {
219
219
  function parseProseSliceHeaders(content: string): RoadmapSliceEntry[] {
220
220
  const slices: RoadmapSliceEntry[] = [];
221
221
  // Match H1-H4 headers containing S<digits> with optional "Slice" prefix, bold markers,
222
- // numeric prefixes (e.g., "1.", "(1)"), bracketed IDs (e.g., "[S01]"),
223
- // optional checkmark completion marker, and optional leading indentation.
222
+ // and optional checkmark completion marker before the slice ID.
224
223
  // Separator after the ID is flexible: colon, dash, em/en dash, dot, or just whitespace.
225
- const headerPattern = /^\s*#{1,4}\s+\*{0,2}(?:\u2713\s+)?(?:\d+[.)]\s+)?(?:\(\d+\)\s+)?(?:Slice\s+)?\[?(S\d+)\]?\*{0,2}[:\s.\u2014\u2013-]*\s*(.+)/gm;
224
+ const headerPattern = /^#{1,4}\s+\*{0,2}(?:\u2713\s+)?(?:Slice\s+)?(S\d+)\*{0,2}[:\s.\u2014\u2013-]*\s*(.+)/gm;
226
225
  let match: RegExpExecArray | null;
227
226
 
228
227
  // Check for checkmark before the slice ID (e.g., "## checkmark S01: Title")
229
- const prefixCheckPattern = /^\s*#{1,4}\s+\*{0,2}\u2713\s+/;
228
+ const prefixCheckPattern = /^#{1,4}\s+\*{0,2}\u2713\s+/;
230
229
 
231
230
  while ((match = headerPattern.exec(content)) !== null) {
232
231
  const id = match[1]!;
@@ -252,7 +251,7 @@ function parseProseSliceHeaders(content: string): RoadmapSliceEntry[] {
252
251
 
253
252
  // Try to extract depends from prose: "Depends on: S01" or "**Depends on:** S01, S02"
254
253
  const afterHeader = content.slice(match.index + match[0].length);
255
- const nextHeader = afterHeader.search(/^\s*#{1,4}\s/m);
254
+ const nextHeader = afterHeader.search(/^#{1,4}\s/m);
256
255
  const section = nextHeader !== -1 ? afterHeader.slice(0, nextHeader) : afterHeader.slice(0, 500);
257
256
 
258
257
  const depsMatch = section.match(/\*{0,2}Depends\s+on:?\*{0,2}\s*(.+)/i);
@@ -36,24 +36,22 @@ import {
36
36
 
37
37
  import { findMilestoneIds } from './milestone-ids.js';
38
38
  import { loadQueueOrder, sortByQueueOrder } from './queue-order.js';
39
+ import { isClosedStatus } from './status-guards.js';
39
40
  import { nativeBatchParseGsdFiles, type BatchParsedFile } from './native-parser-bridge.js';
40
41
 
41
42
  import { join, resolve } from 'path';
42
- import { existsSync, readdirSync, readFileSync } from 'node:fs';
43
+ import { existsSync, readdirSync } from 'node:fs';
43
44
  import { debugCount, debugTime } from './debug-logger.js';
44
45
  import { extractVerdict } from './verdict-parser.js';
45
- import { logWarning, logError } from './workflow-logger.js';
46
46
 
47
47
  import {
48
48
  isDbAvailable,
49
49
  getAllMilestones,
50
- getMilestone,
51
50
  getMilestoneSlices,
52
51
  getSliceTasks,
53
52
  getReplanHistory,
54
53
  getSlice,
55
54
  insertMilestone,
56
- insertSlice,
57
55
  updateTaskStatus,
58
56
  getPendingSliceGateCount,
59
57
  type MilestoneRow,
@@ -66,29 +64,8 @@ import {
66
64
  * files like CONTEXT, CONTEXT-DRAFT, ROADMAP, or SUMMARY). These appear when
67
65
  * a milestone is created but never initialised. Treating them as active causes
68
66
  * auto-mode to stall or falsely declare completion.
69
- *
70
- * However, a milestone is NOT a ghost if:
71
- * - It has a DB row with a meaningful status (queued, active, etc.) — the DB
72
- * knows about it even if content files haven't been created yet.
73
- * - It has a worktree directory — a worktree proves the milestone was
74
- * legitimately created and is expected to be populated.
75
- *
76
- * Fixes #2921: queued milestones with worktrees were incorrectly classified
77
- * as ghosts, causing auto-mode to skip them entirely.
78
67
  */
79
68
  export function isGhostMilestone(basePath: string, mid: string): boolean {
80
- // If the milestone has a DB row, it's a known milestone — not a ghost.
81
- if (isDbAvailable()) {
82
- const dbRow = getMilestone(mid);
83
- if (dbRow) return false;
84
- }
85
-
86
- // If a worktree exists for this milestone, it was legitimately created.
87
- const root = gsdRoot(basePath);
88
- const wtPath = join(root, 'worktrees', mid);
89
- if (existsSync(wtPath)) return false;
90
-
91
- // Fall back to content-file check: no substantive files means ghost.
92
69
  const context = resolveMilestoneFile(basePath, mid, "CONTEXT");
93
70
  const draft = resolveMilestoneFile(basePath, mid, "CONTEXT-DRAFT");
94
71
  const roadmap = resolveMilestoneFile(basePath, mid, "ROADMAP");
@@ -232,10 +209,10 @@ export async function deriveState(basePath: string): Promise<GSDState> {
232
209
  if (isDbAvailable()) {
233
210
  let dbMilestones = getAllMilestones();
234
211
 
235
- // Disk→DB reconciliation when DB is empty but disk has milestones (#2631).
236
- // deriveStateFromDb() does its own reconciliation, but deriveState() skips
237
- // it entirely when the DB is empty. Sync here so the DB path is used when
238
- // disk milestones exist but haven't been migrated yet.
212
+ // Disk→DB reconciliation (#2631): when the milestones table is empty
213
+ // (e.g. failed initial migration per #2529), the reconciliation code
214
+ // inside deriveStateFromDb is unreachable. Populate from disk here so
215
+ // the DB path activates correctly.
239
216
  if (dbMilestones.length === 0) {
240
217
  const diskIds = findMilestoneIds(basePath);
241
218
  let synced = false;
@@ -254,7 +231,7 @@ export async function deriveState(basePath: string): Promise<GSDState> {
254
231
  stopDbTimer({ phase: result.phase, milestone: result.activeMilestone?.id });
255
232
  _telemetry.dbDeriveCount++;
256
233
  } else {
257
- // DB open but no milestones on disk either use filesystem path
234
+ // DB open but empty hierarchy tables pre-migration project, use filesystem
258
235
  result = await _deriveStateImpl(basePath);
259
236
  _telemetry.markdownDeriveCount++;
260
237
  }
@@ -291,13 +268,6 @@ function extractContextTitle(content: string | null, fallback: string): string {
291
268
 
292
269
  // ─── DB-backed State Derivation ────────────────────────────────────────────
293
270
 
294
- /**
295
- * Helper: check if a DB status counts as "done" (handles K002 ambiguity).
296
- */
297
- function isStatusDone(status: string): boolean {
298
- return status === 'complete' || status === 'done';
299
- }
300
-
301
271
  /**
302
272
  * Derive GSD state from the milestones/slices/tasks DB tables.
303
273
  * Flag files (PARKED, VALIDATION, CONTINUE, REPLAN, REPLAN-TRIGGER, CONTEXT-DRAFT)
@@ -328,36 +298,6 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
328
298
  }
329
299
  if (synced) allMilestones = getAllMilestones();
330
300
 
331
- // Disk→DB slice reconciliation (#2533): slices defined in ROADMAP.md but
332
- // missing from the DB cause permanent "No slice eligible" blocks because
333
- // the dependency resolver only sees DB rows. Parse each milestone's roadmap
334
- // and insert any missing slices, checking SUMMARY files to set correct status.
335
- // insertSlice uses INSERT OR IGNORE, so existing rows are never overwritten.
336
- for (const mid of diskIds) {
337
- if (isGhostMilestone(basePath, mid)) continue;
338
- const roadmapPath = resolveMilestoneFile(basePath, mid, "ROADMAP");
339
- if (!roadmapPath) continue;
340
-
341
- const dbSlices = getMilestoneSlices(mid);
342
- const dbSliceIds = new Set(dbSlices.map(s => s.id));
343
-
344
- let roadmapContent: string;
345
- try { roadmapContent = readFileSync(roadmapPath, "utf-8"); }
346
- catch { continue; }
347
-
348
- const parsed = parseRoadmap(roadmapContent);
349
- for (const s of parsed.slices) {
350
- if (dbSliceIds.has(s.id)) continue;
351
- const summaryPath = resolveSliceFile(basePath, mid, s.id, "SUMMARY");
352
- const sliceStatus = (s.done || summaryPath) ? "complete" : "pending";
353
- insertSlice({
354
- id: s.id, milestoneId: mid, title: s.title,
355
- status: sliceStatus, risk: s.risk,
356
- depends: s.depends, demo: s.demo,
357
- });
358
- }
359
- }
360
-
361
301
  // Reconcile: discover milestones that exist on disk but are missing from
362
302
  // the DB. This happens when milestones were created before the DB migration
363
303
  // or were manually added to the filesystem. Without this, disk-only
@@ -417,7 +357,7 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
417
357
  continue;
418
358
  }
419
359
 
420
- if (isStatusDone(m.status)) {
360
+ if (isClosedStatus(m.status)) {
421
361
  completeMilestoneIds.add(m.id);
422
362
  continue;
423
363
  }
@@ -431,7 +371,7 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
431
371
 
432
372
  // Check roadmap: all slices done means milestone is complete
433
373
  const slices = getMilestoneSlices(m.id);
434
- if (slices.length > 0 && slices.every(s => isStatusDone(s.status))) {
374
+ if (slices.length > 0 && slices.every(s => isClosedStatus(s.status))) {
435
375
  // All slices done but no summary — still counts as complete for dep resolution
436
376
  // if a summary file exists
437
377
  // Note: without summary file, the milestone is in validating/completing state, not complete
@@ -453,7 +393,7 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
453
393
 
454
394
  // Ghost milestone check: no slices in DB AND no substantive files on disk
455
395
  const slices = getMilestoneSlices(m.id);
456
- if (slices.length === 0 && !isStatusDone(m.status)) {
396
+ if (slices.length === 0 && !isClosedStatus(m.status)) {
457
397
  // Check disk for ghost detection
458
398
  if (isGhostMilestone(basePath, m.id)) continue;
459
399
  }
@@ -476,7 +416,7 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
476
416
  }
477
417
 
478
418
  // Not complete — determine if it should be active
479
- const allSlicesDone = slices.length > 0 && slices.every(s => isStatusDone(s.status));
419
+ const allSlicesDone = slices.length > 0 && slices.every(s => isClosedStatus(s.status));
480
420
 
481
421
  // Get title — prefer DB, fall back to context file extraction
482
422
  let title = stripMilestonePrefix(m.title) || m.id;
@@ -586,8 +526,7 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
586
526
  ? `All milestones complete. ${activeReqs} active requirement${activeReqs === 1 ? '' : 's'} in REQUIREMENTS.md ${activeReqs === 1 ? 'has' : 'have'} not been mapped to a milestone.`
587
527
  : 'All milestones complete.';
588
528
  return {
589
- activeMilestone: null,
590
- lastCompletedMilestone: lastEntry ? { id: lastEntry.id, title: lastEntry.title } : null,
529
+ activeMilestone: lastEntry ? { id: lastEntry.id, title: lastEntry.title } : null,
591
530
  activeSlice: null, activeTask: null,
592
531
  phase: 'complete',
593
532
  recentDecisions: [], blockers: [],
@@ -629,7 +568,10 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
629
568
  }
630
569
 
631
570
  // ── All slices done → validating/completing ─────────────────────────
632
- const allSlicesDone = activeMilestoneSlices.every(s => isStatusDone(s.status));
571
+ // Guard: [].every() === true (vacuous truth). Without the length check,
572
+ // an empty slice array causes a premature phase transition to
573
+ // validating-milestone. See: https://github.com/gsd-build/gsd-2/issues/2667
574
+ const allSlicesDone = activeMilestoneSlices.length > 0 && activeMilestoneSlices.every(s => isClosedStatus(s.status));
633
575
  if (allSlicesDone) {
634
576
  const validationFile = resolveMilestoneFile(basePath, activeMilestone.id, "VALIDATION");
635
577
  const validationContent = validationFile ? await loadFile(validationFile) : null;
@@ -662,19 +604,19 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
662
604
 
663
605
  // ── Find active slice (first incomplete with deps satisfied) ─────────
664
606
  const sliceProgress = {
665
- done: activeMilestoneSlices.filter(s => isStatusDone(s.status)).length,
607
+ done: activeMilestoneSlices.filter(s => isClosedStatus(s.status)).length,
666
608
  total: activeMilestoneSlices.length,
667
609
  };
668
610
 
669
611
  const doneSliceIds = new Set(
670
- activeMilestoneSlices.filter(s => isStatusDone(s.status)).map(s => s.id)
612
+ activeMilestoneSlices.filter(s => isClosedStatus(s.status)).map(s => s.id)
671
613
  );
672
614
 
673
615
  let activeSlice: ActiveRef | null = null;
674
616
  let activeSliceRow: SliceRow | null = null;
675
617
 
676
618
  for (const s of activeMilestoneSlices) {
677
- if (isStatusDone(s.status)) continue;
619
+ if (isClosedStatus(s.status)) continue;
678
620
  if (s.depends.every(dep => doneSliceIds.has(dep))) {
679
621
  activeSlice = { id: s.id, title: s.title };
680
622
  activeSliceRow = s;
@@ -717,16 +659,20 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
717
659
  // causing the dispatcher to re-dispatch the same completed task forever.
718
660
  let reconciled = false;
719
661
  for (const t of tasks) {
720
- if (isStatusDone(t.status)) continue;
662
+ if (isClosedStatus(t.status)) continue;
721
663
  const summaryPath = resolveTaskFile(basePath, activeMilestone.id, activeSlice.id, t.id, "SUMMARY");
722
664
  if (summaryPath && existsSync(summaryPath)) {
723
665
  try {
724
666
  updateTaskStatus(activeMilestone.id, activeSlice.id, t.id, "complete");
725
- logWarning("reconcile", `task ${activeMilestone.id}/${activeSlice.id}/${t.id} status reconciled from "${t.status}" to "complete" (#2514)`, { mid: activeMilestone.id, sid: activeSlice.id, tid: t.id });
667
+ process.stderr.write(
668
+ `gsd-reconcile: task ${activeMilestone.id}/${activeSlice.id}/${t.id} had SUMMARY on disk but DB status was "${t.status}" — updated to "complete" (#2514)\n`,
669
+ );
726
670
  reconciled = true;
727
671
  } catch (e) {
728
672
  // DB write failed — continue with stale status rather than crash
729
- logError("reconcile", `failed to update task ${t.id}`, { tid: t.id, error: (e as Error).message });
673
+ process.stderr.write(
674
+ `gsd-reconcile: failed to update task ${t.id}: ${(e as Error).message}\n`,
675
+ );
730
676
  }
731
677
  }
732
678
  }
@@ -736,11 +682,11 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
736
682
  }
737
683
 
738
684
  const taskProgress = {
739
- done: tasks.filter(t => isStatusDone(t.status)).length,
685
+ done: tasks.filter(t => isClosedStatus(t.status)).length,
740
686
  total: tasks.length,
741
687
  };
742
688
 
743
- const activeTaskRow = tasks.find(t => !isStatusDone(t.status));
689
+ const activeTaskRow = tasks.find(t => !isClosedStatus(t.status));
744
690
 
745
691
  if (!activeTaskRow && tasks.length > 0) {
746
692
  // All tasks done but slice not marked complete → summarizing
@@ -801,7 +747,7 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
801
747
  }
802
748
 
803
749
  // ── Blocker detection: check completed tasks for blocker_discovered ──
804
- const completedTasks = tasks.filter(t => isStatusDone(t.status));
750
+ const completedTasks = tasks.filter(t => isClosedStatus(t.status));
805
751
  let blockerTaskId: string | null = null;
806
752
  for (const ct of completedTasks) {
807
753
  if (ct.blocker_discovered) {
@@ -1381,7 +1327,9 @@ export async function _deriveStateImpl(basePath: string): Promise<GSDState> {
1381
1327
  const summaryPath = resolveTaskFile(basePath, activeMilestone.id, activeSlice.id, t.id, "SUMMARY");
1382
1328
  if (summaryPath && existsSync(summaryPath)) {
1383
1329
  t.done = true;
1384
- logWarning("reconcile", `task ${activeMilestone.id}/${activeSlice.id}/${t.id} reconciled via SUMMARY on disk (#2514)`, { mid: activeMilestone.id, sid: activeSlice.id, tid: t.id });
1330
+ process.stderr.write(
1331
+ `gsd-reconcile: task ${activeMilestone.id}/${activeSlice.id}/${t.id} has SUMMARY on disk but plan shows incomplete — marking done (#2514)\n`,
1332
+ );
1385
1333
  }
1386
1334
  }
1387
1335
 
@@ -317,35 +317,6 @@ test("auto/resolve.ts one-shot pattern: _currentResolve is nulled before calling
317
317
  );
318
318
  });
319
319
 
320
- test("auto/phases.ts: selectAndApplyModel called exactly once and before updateProgressWidget (#2907)", () => {
321
- const src = readFileSync(
322
- resolve(import.meta.dirname, "..", "auto", "phases.ts"),
323
- "utf-8",
324
- );
325
- // Extract the runUnitPhase function body
326
- const fnStart = src.indexOf("export async function runUnitPhase");
327
- assert.ok(fnStart > 0, "runUnitPhase should exist in phases.ts");
328
- const fnBody = src.slice(fnStart, fnStart + 8000);
329
-
330
- // selectAndApplyModel must appear exactly once
331
- const allOccurrences = [...fnBody.matchAll(/selectAndApplyModel\(/g)];
332
- assert.equal(
333
- allOccurrences.length,
334
- 1,
335
- `selectAndApplyModel should be called exactly once in runUnitPhase, found ${allOccurrences.length} calls`,
336
- );
337
-
338
- // selectAndApplyModel must appear BEFORE updateProgressWidget
339
- const modelIdx = fnBody.indexOf("selectAndApplyModel(");
340
- const widgetIdx = fnBody.indexOf("updateProgressWidget(");
341
- assert.ok(modelIdx > 0, "selectAndApplyModel should exist in runUnitPhase");
342
- assert.ok(widgetIdx > 0, "updateProgressWidget should exist in runUnitPhase");
343
- assert.ok(
344
- modelIdx < widgetIdx,
345
- "selectAndApplyModel must be called BEFORE updateProgressWidget (#2899/#2907)",
346
- );
347
- });
348
-
349
320
  // ─── autoLoop tests (T02) ─────────────────────────────────────────────────
350
321
 
351
322
  /**