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
@@ -54,7 +54,6 @@ For each capture, classify it as one of:
54
54
  - Add `**Resolution:** <brief description of what will happen>`
55
55
  - Add `**Rationale:** <why this classification>`
56
56
  - Add `**Resolved:** <current ISO timestamp>`
57
- - Add `**Milestone:** <current milestone ID>` (e.g., `**Milestone:** M003`)
58
57
 
59
58
  4. **Summarize** what was triaged: how many captures, what classifications were assigned, and what actions are pending (e.g., "2 quick-tasks ready for execution, 1 deferred to S03").
60
59
 
@@ -7,7 +7,7 @@
7
7
  */
8
8
  import { createHash } from "node:crypto";
9
9
  import { execFileSync } from "node:child_process";
10
- import { cpSync, existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, realpathSync, renameSync, rmSync, symlinkSync, unlinkSync, writeFileSync } from "node:fs";
10
+ import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, realpathSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
11
11
  import { homedir } from "node:os";
12
12
  import { basename, dirname, join, resolve } from "node:path";
13
13
  const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
@@ -255,14 +255,9 @@ export function validateProjectId(id) {
255
255
  * If `GSD_PROJECT_ID` is set, returns it directly (validation is expected
256
256
  * to have already happened at startup via `validateProjectId`).
257
257
  *
258
- * For repos with a remote URL, returns SHA-256 of the remote URL only —
259
- * this makes the identity stable across directory moves/renames (#2750).
260
- *
261
- * For local-only repos (no remote), includes the git root in the hash.
262
- * Local repos use a `.gsd-id` marker file for recovery after moves.
263
- *
264
- * Deterministic: same repo always produces the same hash regardless of
265
- * which worktree the caller is inside.
258
+ * Otherwise returns SHA-256 of `${remoteUrl}\n${resolvedRoot}`, truncated
259
+ * to 12 hex chars. Deterministic: same repo always produces the same hash
260
+ * regardless of which worktree the caller is inside.
266
261
  */
267
262
  export function repoIdentity(basePath) {
268
263
  const projectId = process.env.GSD_PROJECT_ID;
@@ -270,14 +265,8 @@ export function repoIdentity(basePath) {
270
265
  return projectId;
271
266
  }
272
267
  const remoteUrl = getRemoteUrl(basePath);
273
- if (remoteUrl) {
274
- // Remote URL alone uniquely identifies the repo — path is redundant.
275
- // This makes moves transparent for repos with remotes (#2750).
276
- return createHash("sha256").update(remoteUrl).digest("hex").slice(0, 12);
277
- }
278
- // Local-only repo: include git root since there's no remote to anchor identity.
279
268
  const root = resolveGitRoot(basePath);
280
- const input = `\n${root}`;
269
+ const input = `${remoteUrl}\n${root}`;
281
270
  return createHash("sha256").update(input).digest("hex").slice(0, 12);
282
271
  }
283
272
  // ─── External State Directory ───────────────────────────────────────────────
@@ -336,149 +325,20 @@ export function cleanNumberedGsdVariants(projectPath) {
336
325
  }
337
326
  return removed;
338
327
  }
339
- // ─── .gsd-id Marker ─────────────────────────────────────────────────────────
340
- /**
341
- * Write a `.gsd-id` marker file in the project root.
342
- *
343
- * This file records the identity hash used for the external state directory.
344
- * For local-only repos (no remote), this marker survives directory moves and
345
- * enables automatic recovery of orphaned state (#2750).
346
- *
347
- * The marker is gitignored by ensureGitignore(). Non-fatal: failure to write
348
- * the marker must never block project setup.
349
- */
350
- function writeGsdIdMarker(projectPath, identity) {
351
- try {
352
- const markerPath = join(projectPath, ".gsd-id");
353
- // Only write if content differs to avoid unnecessary disk writes.
354
- if (existsSync(markerPath)) {
355
- try {
356
- if (readFileSync(markerPath, "utf-8").trim() === identity)
357
- return;
358
- }
359
- catch { /* fall through and overwrite */ }
360
- }
361
- writeFileSync(markerPath, identity + "\n", "utf-8");
362
- }
363
- catch {
364
- // Non-fatal — marker write failure should not block project setup
365
- }
366
- }
367
- /**
368
- * Read the `.gsd-id` marker from the project root.
369
- * Returns the identity hash, or null if the marker doesn't exist or is unreadable.
370
- */
371
- function readGsdIdMarker(projectPath) {
372
- try {
373
- const markerPath = join(projectPath, ".gsd-id");
374
- if (!existsSync(markerPath))
375
- return null;
376
- const content = readFileSync(markerPath, "utf-8").trim();
377
- return /^[a-zA-Z0-9_-]+$/.test(content) ? content : null;
378
- }
379
- catch {
380
- return null;
381
- }
382
- }
383
- /**
384
- * Check whether an external state directory has meaningful content.
385
- * Returns true if the directory contains any files or subdirectories
386
- * beyond just repo-meta.json.
387
- */
388
- function hasProjectState(externalPath) {
389
- try {
390
- if (!existsSync(externalPath))
391
- return false;
392
- const entries = readdirSync(externalPath);
393
- return entries.some(e => e !== "repo-meta.json");
394
- }
395
- catch {
396
- return false;
397
- }
398
- }
399
- /**
400
- * Resolve the external state directory, with recovery for relocated projects.
401
- *
402
- * For local-only repos where the computed identity produces an empty state dir,
403
- * checks the `.gsd-id` marker for the original identity hash and recovers
404
- * the old state directory if it still exists and contains data (#2750).
405
- *
406
- * Returns the resolved external path (may differ from the computed identity).
407
- */
408
- function resolveExternalPathWithRecovery(projectPath) {
409
- const computedPath = externalGsdRoot(projectPath);
410
- const computedId = repoIdentity(projectPath);
411
- // Check if computed path already has state — fast path, no recovery needed.
412
- if (hasProjectState(computedPath)) {
413
- return computedPath;
414
- }
415
- // Check for .gsd-id marker from a previous location.
416
- const markerId = readGsdIdMarker(projectPath);
417
- if (markerId && markerId !== computedId) {
418
- // The marker points to a different identity — the repo was likely moved.
419
- const base = process.env.GSD_STATE_DIR || gsdHome;
420
- const markerPath = join(base, "projects", markerId);
421
- if (hasProjectState(markerPath)) {
422
- // Recover: use the old state directory and update the marker to the new identity.
423
- // Move the state from the old hash dir to the new one so future lookups work
424
- // without the marker.
425
- try {
426
- mkdirSync(computedPath, { recursive: true });
427
- const entries = readdirSync(markerPath);
428
- for (const entry of entries) {
429
- try {
430
- const src = join(markerPath, entry);
431
- const dst = join(computedPath, entry);
432
- // Use rename for same-filesystem (fast) or fall back to copy.
433
- try {
434
- renameSync(src, dst);
435
- }
436
- catch {
437
- cpSync(src, dst, { recursive: true, force: true });
438
- }
439
- }
440
- catch { /* continue with remaining entries */ }
441
- }
442
- // Clean up old directory after successful migration.
443
- try {
444
- rmSync(markerPath, { recursive: true, force: true });
445
- }
446
- catch { /* non-fatal */ }
447
- }
448
- catch {
449
- // If migration fails, just point at the old directory.
450
- return markerPath;
451
- }
452
- }
453
- }
454
- return computedPath;
455
- }
456
328
  // ─── Symlink Management ─────────────────────────────────────────────────────
457
329
  /**
458
330
  * Ensure the `<project>/.gsd` symlink points to the external state directory.
459
331
  *
460
332
  * 1. Clean up any macOS numbered collision variants (`.gsd 2`, `.gsd 3`, etc.)
461
- * 2. Resolve external dir (with relocation recovery via `.gsd-id` marker)
462
- * 3. mkdir -p the external dir
463
- * 4. If `<project>/.gsd` doesn't exist create symlink
464
- * 5. If `<project>/.gsd` is already the correct symlink no-op
465
- * 6. If `<project>/.gsd` is a real directory → return as-is (migration handles later)
466
- * 7. Write `.gsd-id` marker for future relocation recovery
333
+ * 2. mkdir -p the external dir
334
+ * 3. If `<project>/.gsd` doesn't exist → create symlink
335
+ * 4. If `<project>/.gsd` is already the correct symlink → no-op
336
+ * 5. If `<project>/.gsd` is a real directoryreturn as-is (migration handles later)
467
337
  *
468
338
  * Returns the resolved external path.
469
339
  */
470
340
  export function ensureGsdSymlink(projectPath) {
471
- const result = ensureGsdSymlinkCore(projectPath);
472
- // Write .gsd-id marker so future relocations can recover this state (#2750).
473
- // Only write for the project root (not subdirectories or worktrees that
474
- // delegate to a parent .gsd).
475
- if (!isInsideWorktree(projectPath)) {
476
- writeGsdIdMarker(projectPath, repoIdentity(projectPath));
477
- }
478
- return result;
479
- }
480
- function ensureGsdSymlinkCore(projectPath) {
481
- const externalPath = resolveExternalPathWithRecovery(projectPath);
341
+ const externalPath = externalGsdRoot(projectPath);
482
342
  const localGsd = join(projectPath, ".gsd");
483
343
  const inWorktree = isInsideWorktree(projectPath);
484
344
  // Guard: Never create a symlink at ~/.gsd — that's the user-level GSD home,
@@ -527,34 +387,11 @@ function ensureGsdSymlinkCore(projectPath) {
527
387
  writeRepoMeta(externalPath, getRemoteUrl(projectPath), resolveGitRoot(projectPath));
528
388
  const replaceWithSymlink = () => {
529
389
  rmSync(localGsd, { recursive: true, force: true });
530
- // Defensive: remove any residual entry (e.g. dangling symlink) before creating.
531
- try {
532
- unlinkSync(localGsd);
533
- }
534
- catch { /* already gone */ }
535
390
  symlinkSync(externalPath, localGsd, "junction");
536
391
  return externalPath;
537
392
  };
538
- // Check for dangling symlinks (e.g. after relocation recovery removed the old
539
- // state dir). existsSync follows symlinks, so it returns false for dangling ones.
540
- // lstatSync does NOT follow, so we can detect the dangling symlink and replace it.
541
393
  if (!existsSync(localGsd)) {
542
- try {
543
- const stat = lstatSync(localGsd);
544
- if (stat.isSymbolicLink()) {
545
- // Dangling symlink — replace with correct one (#2750).
546
- return replaceWithSymlink();
547
- }
548
- }
549
- catch {
550
- // lstat also failed — nothing exists at this path
551
- }
552
- // Nothing exists yet — create symlink.
553
- // Defensive: remove any residual entry to avoid EEXIST race (#2750).
554
- try {
555
- unlinkSync(localGsd);
556
- }
557
- catch { /* nothing to remove */ }
394
+ // Nothing exists yet — create symlink
558
395
  symlinkSync(externalPath, localGsd, "junction");
559
396
  return externalPath;
560
397
  }
@@ -571,37 +408,6 @@ function ensureGsdSymlinkCore(projectPath) {
571
408
  if (inWorktree) {
572
409
  return replaceWithSymlink();
573
410
  }
574
- // After identity hash change (e.g. upgrade from path-based to remote-only
575
- // hash, or relocation recovery), migrate data from old target to new path
576
- // and update the symlink (#2750).
577
- if (!hasProjectState(externalPath) && hasProjectState(target)) {
578
- try {
579
- mkdirSync(externalPath, { recursive: true });
580
- const oldEntries = readdirSync(target);
581
- for (const entry of oldEntries) {
582
- try {
583
- const src = join(target, entry);
584
- const dst = join(externalPath, entry);
585
- try {
586
- renameSync(src, dst);
587
- }
588
- catch {
589
- cpSync(src, dst, { recursive: true, force: true });
590
- }
591
- }
592
- catch { /* continue */ }
593
- }
594
- try {
595
- rmSync(target, { recursive: true, force: true });
596
- }
597
- catch { /* non-fatal */ }
598
- return replaceWithSymlink();
599
- }
600
- catch {
601
- // Migration failed — preserve old symlink
602
- return target;
603
- }
604
- }
605
411
  // Outside worktrees, preserve custom overrides or legacy symlinks.
606
412
  return target;
607
413
  }
@@ -16,7 +16,6 @@ import { getParkedReason } from "./milestone-actions.js";
16
16
  import { getMilestoneSlices, isDbAvailable } from "./gsd-db.js";
17
17
  import { buildExistingMilestonesContext } from "./guided-flow-queue.js";
18
18
  import { loadPrompt } from "./prompt-loader.js";
19
- import { isGsdGitignored } from "./gitignore.js";
20
19
  // ─── Entry Point ──────────────────────────────────────────────────────────────
21
20
  export async function handleRethink(_args, ctx, pi) {
22
21
  if (isAutoActive()) {
@@ -39,13 +38,9 @@ export async function handleRethink(_args, ctx, pi) {
39
38
  const queueOrder = loadQueueOrder(basePath);
40
39
  const rethinkData = buildRethinkData(basePath, milestoneIds, state, queueOrder);
41
40
  const existingMilestonesContext = await buildExistingMilestonesContext(basePath, milestoneIds, state);
42
- const commitInstruction = isGsdGitignored(basePath)
43
- ? "Do not commit planning artifacts — .gsd/ is gitignored in this project."
44
- : '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)';
45
41
  const content = loadPrompt("rethink", {
46
42
  rethinkData,
47
43
  existingMilestonesContext,
48
- commitInstruction,
49
44
  });
50
45
  pi.sendMessage({ customType: "gsd-rethink", content, display: false }, { triggerTurn: true });
51
46
  }
@@ -211,13 +211,12 @@ export function parseRoadmapSlices(content) {
211
211
  function parseProseSliceHeaders(content) {
212
212
  const slices = [];
213
213
  // Match H1-H4 headers containing S<digits> with optional "Slice" prefix, bold markers,
214
- // numeric prefixes (e.g., "1.", "(1)"), bracketed IDs (e.g., "[S01]"),
215
- // optional checkmark completion marker, and optional leading indentation.
214
+ // and optional checkmark completion marker before the slice ID.
216
215
  // Separator after the ID is flexible: colon, dash, em/en dash, dot, or just whitespace.
217
- 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;
216
+ const headerPattern = /^#{1,4}\s+\*{0,2}(?:\u2713\s+)?(?:Slice\s+)?(S\d+)\*{0,2}[:\s.\u2014\u2013-]*\s*(.+)/gm;
218
217
  let match;
219
218
  // Check for checkmark before the slice ID (e.g., "## checkmark S01: Title")
220
- const prefixCheckPattern = /^\s*#{1,4}\s+\*{0,2}\u2713\s+/;
219
+ const prefixCheckPattern = /^#{1,4}\s+\*{0,2}\u2713\s+/;
221
220
  while ((match = headerPattern.exec(content)) !== null) {
222
221
  const id = match[1];
223
222
  let title = match[2].trim().replace(/\*{1,2}$/g, "").trim(); // strip trailing bold markers
@@ -239,7 +238,7 @@ function parseProseSliceHeaders(content) {
239
238
  }
240
239
  // Try to extract depends from prose: "Depends on: S01" or "**Depends on:** S01, S02"
241
240
  const afterHeader = content.slice(match.index + match[0].length);
242
- const nextHeader = afterHeader.search(/^\s*#{1,4}\s/m);
241
+ const nextHeader = afterHeader.search(/^#{1,4}\s/m);
243
242
  const section = nextHeader !== -1 ? afterHeader.slice(0, nextHeader) : afterHeader.slice(0, 500);
244
243
  const depsMatch = section.match(/\*{0,2}Depends\s+on:?\*{0,2}\s*(.+)/i);
245
244
  let depends = [];
@@ -6,41 +6,20 @@ import { parseSummary, loadFile, parseRequirementCounts, parseContextDependsOn,
6
6
  import { resolveMilestoneFile, resolveSlicePath, resolveSliceFile, resolveTaskFile, resolveTasksDir, resolveGsdRootFile, gsdRoot, } from './paths.js';
7
7
  import { findMilestoneIds } from './milestone-ids.js';
8
8
  import { loadQueueOrder, sortByQueueOrder } from './queue-order.js';
9
+ import { isClosedStatus } from './status-guards.js';
9
10
  import { nativeBatchParseGsdFiles } from './native-parser-bridge.js';
10
11
  import { join, resolve } from 'path';
11
- import { existsSync, readdirSync, readFileSync } from 'node:fs';
12
+ import { existsSync, readdirSync } from 'node:fs';
12
13
  import { debugCount, debugTime } from './debug-logger.js';
13
14
  import { extractVerdict } from './verdict-parser.js';
14
- import { logWarning, logError } from './workflow-logger.js';
15
- import { isDbAvailable, getAllMilestones, getMilestone, getMilestoneSlices, getSliceTasks, getReplanHistory, getSlice, insertMilestone, insertSlice, updateTaskStatus, getPendingSliceGateCount, } from './gsd-db.js';
15
+ import { isDbAvailable, getAllMilestones, getMilestoneSlices, getSliceTasks, getReplanHistory, getSlice, insertMilestone, updateTaskStatus, getPendingSliceGateCount, } from './gsd-db.js';
16
16
  /**
17
17
  * A "ghost" milestone directory contains only META.json (and no substantive
18
18
  * files like CONTEXT, CONTEXT-DRAFT, ROADMAP, or SUMMARY). These appear when
19
19
  * a milestone is created but never initialised. Treating them as active causes
20
20
  * auto-mode to stall or falsely declare completion.
21
- *
22
- * However, a milestone is NOT a ghost if:
23
- * - It has a DB row with a meaningful status (queued, active, etc.) — the DB
24
- * knows about it even if content files haven't been created yet.
25
- * - It has a worktree directory — a worktree proves the milestone was
26
- * legitimately created and is expected to be populated.
27
- *
28
- * Fixes #2921: queued milestones with worktrees were incorrectly classified
29
- * as ghosts, causing auto-mode to skip them entirely.
30
21
  */
31
22
  export function isGhostMilestone(basePath, mid) {
32
- // If the milestone has a DB row, it's a known milestone — not a ghost.
33
- if (isDbAvailable()) {
34
- const dbRow = getMilestone(mid);
35
- if (dbRow)
36
- return false;
37
- }
38
- // If a worktree exists for this milestone, it was legitimately created.
39
- const root = gsdRoot(basePath);
40
- const wtPath = join(root, 'worktrees', mid);
41
- if (existsSync(wtPath))
42
- return false;
43
- // Fall back to content-file check: no substantive files means ghost.
44
23
  const context = resolveMilestoneFile(basePath, mid, "CONTEXT");
45
24
  const draft = resolveMilestoneFile(basePath, mid, "CONTEXT-DRAFT");
46
25
  const roadmap = resolveMilestoneFile(basePath, mid, "ROADMAP");
@@ -161,10 +140,10 @@ export async function deriveState(basePath) {
161
140
  // Dual-path: try DB-backed derivation first when hierarchy tables are populated
162
141
  if (isDbAvailable()) {
163
142
  let dbMilestones = getAllMilestones();
164
- // Disk→DB reconciliation when DB is empty but disk has milestones (#2631).
165
- // deriveStateFromDb() does its own reconciliation, but deriveState() skips
166
- // it entirely when the DB is empty. Sync here so the DB path is used when
167
- // disk milestones exist but haven't been migrated yet.
143
+ // Disk→DB reconciliation (#2631): when the milestones table is empty
144
+ // (e.g. failed initial migration per #2529), the reconciliation code
145
+ // inside deriveStateFromDb is unreachable. Populate from disk here so
146
+ // the DB path activates correctly.
168
147
  if (dbMilestones.length === 0) {
169
148
  const diskIds = findMilestoneIds(basePath);
170
149
  let synced = false;
@@ -184,7 +163,7 @@ export async function deriveState(basePath) {
184
163
  _telemetry.dbDeriveCount++;
185
164
  }
186
165
  else {
187
- // DB open but no milestones on disk either use filesystem path
166
+ // DB open but empty hierarchy tables pre-migration project, use filesystem
188
167
  result = await _deriveStateImpl(basePath);
189
168
  _telemetry.markdownDeriveCount++;
190
169
  }
@@ -219,12 +198,6 @@ function extractContextTitle(content, fallback) {
219
198
  return stripMilestonePrefix(h1.slice(2).trim()) || fallback;
220
199
  }
221
200
  // ─── DB-backed State Derivation ────────────────────────────────────────────
222
- /**
223
- * Helper: check if a DB status counts as "done" (handles K002 ambiguity).
224
- */
225
- function isStatusDone(status) {
226
- return status === 'complete' || status === 'done';
227
- }
228
201
  /**
229
202
  * Derive GSD state from the milestones/slices/tasks DB tables.
230
203
  * Flag files (PARKED, VALIDATION, CONTINUE, REPLAN, REPLAN-TRIGGER, CONTEXT-DRAFT)
@@ -253,39 +226,6 @@ export async function deriveStateFromDb(basePath) {
253
226
  }
254
227
  if (synced)
255
228
  allMilestones = getAllMilestones();
256
- // Disk→DB slice reconciliation (#2533): slices defined in ROADMAP.md but
257
- // missing from the DB cause permanent "No slice eligible" blocks because
258
- // the dependency resolver only sees DB rows. Parse each milestone's roadmap
259
- // and insert any missing slices, checking SUMMARY files to set correct status.
260
- // insertSlice uses INSERT OR IGNORE, so existing rows are never overwritten.
261
- for (const mid of diskIds) {
262
- if (isGhostMilestone(basePath, mid))
263
- continue;
264
- const roadmapPath = resolveMilestoneFile(basePath, mid, "ROADMAP");
265
- if (!roadmapPath)
266
- continue;
267
- const dbSlices = getMilestoneSlices(mid);
268
- const dbSliceIds = new Set(dbSlices.map(s => s.id));
269
- let roadmapContent;
270
- try {
271
- roadmapContent = readFileSync(roadmapPath, "utf-8");
272
- }
273
- catch {
274
- continue;
275
- }
276
- const parsed = parseRoadmap(roadmapContent);
277
- for (const s of parsed.slices) {
278
- if (dbSliceIds.has(s.id))
279
- continue;
280
- const summaryPath = resolveSliceFile(basePath, mid, s.id, "SUMMARY");
281
- const sliceStatus = (s.done || summaryPath) ? "complete" : "pending";
282
- insertSlice({
283
- id: s.id, milestoneId: mid, title: s.title,
284
- status: sliceStatus, risk: s.risk,
285
- depends: s.depends, demo: s.demo,
286
- });
287
- }
288
- }
289
229
  // Reconcile: discover milestones that exist on disk but are missing from
290
230
  // the DB. This happens when milestones were created before the DB migration
291
231
  // or were manually added to the filesystem. Without this, disk-only
@@ -341,7 +281,7 @@ export async function deriveStateFromDb(basePath) {
341
281
  parkedMilestoneIds.add(m.id);
342
282
  continue;
343
283
  }
344
- if (isStatusDone(m.status)) {
284
+ if (isClosedStatus(m.status)) {
345
285
  completeMilestoneIds.add(m.id);
346
286
  continue;
347
287
  }
@@ -353,7 +293,7 @@ export async function deriveStateFromDb(basePath) {
353
293
  }
354
294
  // Check roadmap: all slices done means milestone is complete
355
295
  const slices = getMilestoneSlices(m.id);
356
- if (slices.length > 0 && slices.every(s => isStatusDone(s.status))) {
296
+ if (slices.length > 0 && slices.every(s => isClosedStatus(s.status))) {
357
297
  // All slices done but no summary — still counts as complete for dep resolution
358
298
  // if a summary file exists
359
299
  // Note: without summary file, the milestone is in validating/completing state, not complete
@@ -372,7 +312,7 @@ export async function deriveStateFromDb(basePath) {
372
312
  }
373
313
  // Ghost milestone check: no slices in DB AND no substantive files on disk
374
314
  const slices = getMilestoneSlices(m.id);
375
- if (slices.length === 0 && !isStatusDone(m.status)) {
315
+ if (slices.length === 0 && !isClosedStatus(m.status)) {
376
316
  // Check disk for ghost detection
377
317
  if (isGhostMilestone(basePath, m.id))
378
318
  continue;
@@ -393,7 +333,7 @@ export async function deriveStateFromDb(basePath) {
393
333
  continue;
394
334
  }
395
335
  // Not complete — determine if it should be active
396
- const allSlicesDone = slices.length > 0 && slices.every(s => isStatusDone(s.status));
336
+ const allSlicesDone = slices.length > 0 && slices.every(s => isClosedStatus(s.status));
397
337
  // Get title — prefer DB, fall back to context file extraction
398
338
  let title = stripMilestonePrefix(m.title) || m.id;
399
339
  if (title === m.id) {
@@ -492,8 +432,7 @@ export async function deriveStateFromDb(basePath) {
492
432
  ? `All milestones complete. ${activeReqs} active requirement${activeReqs === 1 ? '' : 's'} in REQUIREMENTS.md ${activeReqs === 1 ? 'has' : 'have'} not been mapped to a milestone.`
493
433
  : 'All milestones complete.';
494
434
  return {
495
- activeMilestone: null,
496
- lastCompletedMilestone: lastEntry ? { id: lastEntry.id, title: lastEntry.title } : null,
435
+ activeMilestone: lastEntry ? { id: lastEntry.id, title: lastEntry.title } : null,
497
436
  activeSlice: null, activeTask: null,
498
437
  phase: 'complete',
499
438
  recentDecisions: [], blockers: [],
@@ -531,7 +470,10 @@ export async function deriveStateFromDb(basePath) {
531
470
  };
532
471
  }
533
472
  // ── All slices done → validating/completing ─────────────────────────
534
- const allSlicesDone = activeMilestoneSlices.every(s => isStatusDone(s.status));
473
+ // Guard: [].every() === true (vacuous truth). Without the length check,
474
+ // an empty slice array causes a premature phase transition to
475
+ // validating-milestone. See: https://github.com/gsd-build/gsd-2/issues/2667
476
+ const allSlicesDone = activeMilestoneSlices.length > 0 && activeMilestoneSlices.every(s => isClosedStatus(s.status));
535
477
  if (allSlicesDone) {
536
478
  const validationFile = resolveMilestoneFile(basePath, activeMilestone.id, "VALIDATION");
537
479
  const validationContent = validationFile ? await loadFile(validationFile) : null;
@@ -561,14 +503,14 @@ export async function deriveStateFromDb(basePath) {
561
503
  }
562
504
  // ── Find active slice (first incomplete with deps satisfied) ─────────
563
505
  const sliceProgress = {
564
- done: activeMilestoneSlices.filter(s => isStatusDone(s.status)).length,
506
+ done: activeMilestoneSlices.filter(s => isClosedStatus(s.status)).length,
565
507
  total: activeMilestoneSlices.length,
566
508
  };
567
- const doneSliceIds = new Set(activeMilestoneSlices.filter(s => isStatusDone(s.status)).map(s => s.id));
509
+ const doneSliceIds = new Set(activeMilestoneSlices.filter(s => isClosedStatus(s.status)).map(s => s.id));
568
510
  let activeSlice = null;
569
511
  let activeSliceRow = null;
570
512
  for (const s of activeMilestoneSlices) {
571
- if (isStatusDone(s.status))
513
+ if (isClosedStatus(s.status))
572
514
  continue;
573
515
  if (s.depends.every(dep => doneSliceIds.has(dep))) {
574
516
  activeSlice = { id: s.id, title: s.title };
@@ -608,18 +550,18 @@ export async function deriveStateFromDb(basePath) {
608
550
  // causing the dispatcher to re-dispatch the same completed task forever.
609
551
  let reconciled = false;
610
552
  for (const t of tasks) {
611
- if (isStatusDone(t.status))
553
+ if (isClosedStatus(t.status))
612
554
  continue;
613
555
  const summaryPath = resolveTaskFile(basePath, activeMilestone.id, activeSlice.id, t.id, "SUMMARY");
614
556
  if (summaryPath && existsSync(summaryPath)) {
615
557
  try {
616
558
  updateTaskStatus(activeMilestone.id, activeSlice.id, t.id, "complete");
617
- 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 });
559
+ process.stderr.write(`gsd-reconcile: task ${activeMilestone.id}/${activeSlice.id}/${t.id} had SUMMARY on disk but DB status was "${t.status}" — updated to "complete" (#2514)\n`);
618
560
  reconciled = true;
619
561
  }
620
562
  catch (e) {
621
563
  // DB write failed — continue with stale status rather than crash
622
- logError("reconcile", `failed to update task ${t.id}`, { tid: t.id, error: e.message });
564
+ process.stderr.write(`gsd-reconcile: failed to update task ${t.id}: ${e.message}\n`);
623
565
  }
624
566
  }
625
567
  }
@@ -628,10 +570,10 @@ export async function deriveStateFromDb(basePath) {
628
570
  tasks = getSliceTasks(activeMilestone.id, activeSlice.id);
629
571
  }
630
572
  const taskProgress = {
631
- done: tasks.filter(t => isStatusDone(t.status)).length,
573
+ done: tasks.filter(t => isClosedStatus(t.status)).length,
632
574
  total: tasks.length,
633
575
  };
634
- const activeTaskRow = tasks.find(t => !isStatusDone(t.status));
576
+ const activeTaskRow = tasks.find(t => !isClosedStatus(t.status));
635
577
  if (!activeTaskRow && tasks.length > 0) {
636
578
  // All tasks done but slice not marked complete → summarizing
637
579
  return {
@@ -686,7 +628,7 @@ export async function deriveStateFromDb(basePath) {
686
628
  };
687
629
  }
688
630
  // ── Blocker detection: check completed tasks for blocker_discovered ──
689
- const completedTasks = tasks.filter(t => isStatusDone(t.status));
631
+ const completedTasks = tasks.filter(t => isClosedStatus(t.status));
690
632
  let blockerTaskId = null;
691
633
  for (const ct of completedTasks) {
692
634
  if (ct.blocker_discovered) {
@@ -1245,7 +1187,7 @@ export async function _deriveStateImpl(basePath) {
1245
1187
  const summaryPath = resolveTaskFile(basePath, activeMilestone.id, activeSlice.id, t.id, "SUMMARY");
1246
1188
  if (summaryPath && existsSync(summaryPath)) {
1247
1189
  t.done = true;
1248
- logWarning("reconcile", `task ${activeMilestone.id}/${activeSlice.id}/${t.id} reconciled via SUMMARY on disk (#2514)`, { mid: activeMilestone.id, sid: activeSlice.id, tid: t.id });
1190
+ process.stderr.write(`gsd-reconcile: task ${activeMilestone.id}/${activeSlice.id}/${t.id} has SUMMARY on disk but plan shows incomplete marking done (#2514)\n`);
1249
1191
  }
1250
1192
  }
1251
1193
  const taskProgress = {
@@ -87,26 +87,7 @@ export function load(url, context, nextLoad) {
87
87
  emitDecoratorMetadata: true,
88
88
  },
89
89
  });
90
- // Inject CJS-compatible globals (__dirname, __filename, require) so that
91
- // workspace packages compiled as ESM can still use them. This avoids the
92
- // need for import.meta.url behind indirect invocation patterns that fail in
93
- // CJS and in dynamically-created scopes.
94
- // Only inject globals that the source file doesn't already declare itself.
95
- const preambleLines = [
96
- 'import { fileURLToPath as __preamble_fUTP } from "node:url";',
97
- 'import { dirname as __preamble_dn } from "node:path";',
98
- 'import { createRequire as __preamble_cR } from "node:module";',
99
- ];
100
- if (!outputText.includes('const __filename') && !outputText.includes('let __filename')) {
101
- preambleLines.push('const __filename = __preamble_fUTP(import.meta.url);');
102
- }
103
- if (!outputText.includes('const __dirname') && !outputText.includes('let __dirname')) {
104
- preambleLines.push('const __dirname = __preamble_dn(__preamble_fUTP(import.meta.url));');
105
- }
106
- if (!outputText.includes('const require') && !outputText.includes('let require')) {
107
- preambleLines.push('const require = __preamble_cR(import.meta.url);');
108
- }
109
- return { format: 'module', source: preambleLines.join('\n') + '\n' + outputText, shortCircuit: true };
90
+ return { format: 'module', source: outputText, shortCircuit: true };
110
91
  }
111
92
  return nextLoad(url, context);
112
93
  }