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
@@ -9,25 +9,6 @@ function requireDb() {
9
9
  throw new Error("workflow-manifest: No database open");
10
10
  return db;
11
11
  }
12
- /**
13
- * Coerce a raw DB value to a number, returning `fallback` for
14
- * null/undefined/non-numeric strings (e.g. "-", "N/A", "").
15
- * SQLite can store TEXT in INTEGER columns after migrations or manual inserts.
16
- */
17
- export function toNumeric(value, fallback = null) {
18
- if (value === null || value === undefined)
19
- return fallback;
20
- if (typeof value === "number")
21
- return Number.isFinite(value) ? value : fallback;
22
- if (typeof value === "string") {
23
- const trimmed = value.trim();
24
- if (trimmed === "" || trimmed === "-" || trimmed === "N/A")
25
- return fallback;
26
- const n = Number(trimmed);
27
- return Number.isFinite(n) ? n : fallback;
28
- }
29
- return fallback;
30
- }
31
12
  // ─── snapshotState ───────────────────────────────────────────────────────
32
13
  /**
33
14
  * Capture complete DB state as a StateManifest.
@@ -81,7 +62,7 @@ export function snapshotState() {
81
62
  proof_level: r["proof_level"] ?? "",
82
63
  integration_closure: r["integration_closure"] ?? "",
83
64
  observability_impact: r["observability_impact"] ?? "",
84
- sequence: toNumeric(r["sequence"], 0),
65
+ sequence: r["sequence"] ?? 0,
85
66
  replan_triggered_at: r["replan_triggered_at"] ?? null,
86
67
  }));
87
68
  const rawTasks = db.prepare("SELECT * FROM tasks ORDER BY milestone_id, slice_id, sequence, id").all();
@@ -110,11 +91,11 @@ export function snapshotState() {
110
91
  expected_output: JSON.parse(r["expected_output"] || "[]"),
111
92
  observability_impact: r["observability_impact"] ?? "",
112
93
  full_plan_md: r["full_plan_md"] ?? "",
113
- sequence: toNumeric(r["sequence"], 0),
94
+ sequence: r["sequence"] ?? 0,
114
95
  }));
115
96
  const rawDecisions = db.prepare("SELECT * FROM decisions ORDER BY seq").all();
116
97
  const decisions = rawDecisions.map((r) => ({
117
- seq: toNumeric(r["seq"], 0),
98
+ seq: r["seq"],
118
99
  id: r["id"],
119
100
  when_context: r["when_context"] ?? "",
120
101
  scope: r["scope"] ?? "",
@@ -132,9 +113,9 @@ export function snapshotState() {
132
113
  slice_id: r["slice_id"],
133
114
  milestone_id: r["milestone_id"],
134
115
  command: r["command"],
135
- exit_code: toNumeric(r["exit_code"]),
116
+ exit_code: r["exit_code"] ?? null,
136
117
  verdict: r["verdict"] ?? "",
137
- duration_ms: toNumeric(r["duration_ms"]),
118
+ duration_ms: r["duration_ms"] ?? null,
138
119
  created_at: r["created_at"],
139
120
  }));
140
121
  const result = {
@@ -1,7 +1,7 @@
1
1
  // GSD Extension — Projection Renderers (DB -> Markdown)
2
2
  // Renders PLAN.md, ROADMAP.md, SUMMARY.md, and STATE.md from database rows.
3
3
  // Projections are read-only views of engine state (Layer 3 of the architecture).
4
- import { _getAdapter, isDbAvailable, getMilestone, getMilestoneSlices, getSliceTasks, getVerificationEvidence, } from "./gsd-db.js";
4
+ import { _getAdapter, isDbAvailable, getMilestone, getMilestoneSlices, getSliceTasks, } from "./gsd-db.js";
5
5
  import { atomicWriteSync } from "./atomic-write.js";
6
6
  import { join } from "node:path";
7
7
  import { mkdirSync, existsSync } from "node:fs";
@@ -16,10 +16,8 @@ export function renderPlanContent(sliceRow, taskRows) {
16
16
  const lines = [];
17
17
  lines.push(`# ${sliceRow.id}: ${sliceRow.title}`);
18
18
  lines.push("");
19
- // #2945: never use full_summary_md/full_uat_md as display fallbacks —
20
- // they contain multi-line rendered markdown that corrupts single-line fields.
21
- lines.push(`**Goal:** ${sliceRow.goal || "TBD"}`);
22
- lines.push(`**Demo:** After this: ${sliceRow.demo || "TBD"}`);
19
+ lines.push(`**Goal:** ${sliceRow.goal || sliceRow.full_summary_md || "TBD"}`);
20
+ lines.push(`**Demo:** After this: ${sliceRow.demo || sliceRow.full_uat_md || "TBD"}`);
23
21
  lines.push("");
24
22
  lines.push("## Tasks");
25
23
  for (const task of taskRows) {
@@ -87,10 +85,7 @@ export function renderRoadmapContent(milestoneRow, sliceRows) {
87
85
  depends = slice.depends.join(", ");
88
86
  }
89
87
  const risk = (slice.risk || "low").toLowerCase();
90
- // #2945 Bug 1: never use full_uat_md as a table cell fallback — it contains
91
- // multi-line UAT content (preconditions, steps, expected results) that
92
- // corrupts the markdown table and makes subsequent slices invisible.
93
- const demo = slice.demo || "TBD";
88
+ const demo = slice.demo || slice.full_uat_md || "TBD";
94
89
  lines.push(`| ${slice.id} | ${slice.title} | ${risk} | ${depends} | ${done} | ${demo} |`);
95
90
  }
96
91
  lines.push("");
@@ -113,85 +108,64 @@ export function renderRoadmapProjection(basePath, milestoneId) {
113
108
  // ─── SUMMARY.md Projection ──────────────────────────────────────────────
114
109
  /**
115
110
  * Render SUMMARY.md content from a task row.
116
- * Single source of truth for summary rendering used both at completion
117
- * time and at projection regeneration time (#2720).
118
- *
119
- * @param evidence - Optional verification evidence rows. When called from
120
- * complete-task, these are passed directly. When called from projection
121
- * regeneration, they are queried from the DB by renderSummaryProjection.
111
+ * Pure functionno side effects.
122
112
  */
123
- export function renderSummaryContent(taskRow, sliceId, milestoneId, evidence) {
124
- // ── Frontmatter (YAML list format, matches parseSummary() expectations) ──
125
- const keyFilesYaml = taskRow.key_files && taskRow.key_files.length > 0
126
- ? taskRow.key_files.map(f => ` - ${f}`).join("\n")
127
- : " - (none)";
128
- const keyDecisionsYaml = taskRow.key_decisions && taskRow.key_decisions.length > 0
129
- ? taskRow.key_decisions.map(d => ` - ${d}`).join("\n")
130
- : " - (none)";
131
- // Derive verification_result from evidence if available
132
- const evidenceList = evidence ?? [];
133
- const allPassed = evidenceList.length > 0 &&
134
- evidenceList.every(e => {
135
- const code = e.exitCode ?? e.exit_code ?? -1;
136
- return code === 0 || e.verdict.includes("\u2705") || e.verdict.toLowerCase().includes("pass");
137
- });
138
- const verificationResult = taskRow.verification_result
139
- ? (allPassed ? "passed" : (evidenceList.length === 0 ? "untested" : "mixed"))
140
- : (allPassed ? "passed" : (evidenceList.length === 0 ? "untested" : "mixed"));
141
- // Build verification evidence table
142
- let evidenceTable = "| # | Command | Exit Code | Verdict | Duration |\n|---|---------|-----------|---------|----------|\n";
143
- if (evidenceList.length > 0) {
144
- evidenceList.forEach((e, i) => {
145
- const code = e.exitCode ?? e.exit_code ?? 0;
146
- const dur = e.durationMs ?? e.duration_ms ?? 0;
147
- evidenceTable += `| ${i + 1} | \`${e.command}\` | ${code} | ${e.verdict} | ${dur}ms |\n`;
148
- });
113
+ export function renderSummaryContent(taskRow, sliceId, milestoneId) {
114
+ const lines = [];
115
+ // Frontmatter
116
+ lines.push("---");
117
+ lines.push(`id: ${taskRow.id}`);
118
+ lines.push(`parent: ${sliceId}`);
119
+ lines.push(`milestone: ${milestoneId}`);
120
+ lines.push("provides: []");
121
+ lines.push("requires: []");
122
+ lines.push("affects: []");
123
+ // key_files is already parsed to string[]
124
+ if (taskRow.key_files && taskRow.key_files.length > 0) {
125
+ lines.push(`key_files: [${taskRow.key_files.map(f => `"${f}"`).join(", ")}]`);
126
+ }
127
+ else {
128
+ lines.push("key_files: []");
129
+ }
130
+ // key_decisions is already parsed to string[]
131
+ if (taskRow.key_decisions && taskRow.key_decisions.length > 0) {
132
+ lines.push(`key_decisions: [${taskRow.key_decisions.map(d => `"${d}"`).join(", ")}]`);
149
133
  }
150
134
  else {
151
- evidenceTable += "| \u2014 | No verification commands discovered | \u2014 | \u2014 | \u2014 |\n";
135
+ lines.push("key_decisions: []");
136
+ }
137
+ lines.push("patterns_established: []");
138
+ lines.push("drill_down_paths: []");
139
+ lines.push("observability_surfaces: []");
140
+ lines.push(`duration: "${taskRow.duration || ""}"`);
141
+ lines.push(`verification_result: "${taskRow.verification_result || ""}"`);
142
+ lines.push(`completed_at: ${taskRow.completed_at || ""}`);
143
+ lines.push(`blocker_discovered: ${taskRow.blocker_discovered ? "true" : "false"}`);
144
+ lines.push("---");
145
+ lines.push("");
146
+ lines.push(`# ${taskRow.id}: ${taskRow.title}`);
147
+ lines.push("");
148
+ // One-liner (if present)
149
+ if (taskRow.one_liner) {
150
+ lines.push(`> ${taskRow.one_liner}`);
151
+ lines.push("");
152
152
  }
153
- const title = taskRow.one_liner || taskRow.title || taskRow.id;
154
- return `---
155
- id: ${taskRow.id}
156
- parent: ${sliceId}
157
- milestone: ${milestoneId}
158
- key_files:
159
- ${keyFilesYaml}
160
- key_decisions:
161
- ${keyDecisionsYaml}
162
- duration: ${taskRow.duration || ""}
163
- verification_result: ${verificationResult}
164
- completed_at: ${taskRow.completed_at || ""}
165
- blocker_discovered: ${taskRow.blocker_discovered ? "true" : "false"}
166
- ---
167
-
168
- # ${taskRow.id}: ${title}
169
-
170
- **${taskRow.one_liner || ""}**
171
-
172
- ## What Happened
173
-
174
- ${taskRow.narrative || "No summary recorded."}
175
-
176
- ## Verification
177
-
178
- ${taskRow.verification_result || "No verification recorded."}
179
-
180
- ## Verification Evidence
181
-
182
- ${evidenceTable}
183
- ## Deviations
184
-
185
- ${taskRow.deviations || "None."}
186
-
187
- ## Known Issues
188
-
189
- ${taskRow.known_issues || "None."}
190
-
191
- ## Files Created/Modified
192
-
193
- ${taskRow.key_files && taskRow.key_files.length > 0 ? taskRow.key_files.map(f => `- \`${f}\``).join("\n") : "None."}
194
- `;
153
+ lines.push("## What Happened");
154
+ lines.push(taskRow.full_summary_md || taskRow.narrative || "No summary recorded.");
155
+ lines.push("");
156
+ // Deviations (if present)
157
+ if (taskRow.deviations) {
158
+ lines.push("## Deviations");
159
+ lines.push(taskRow.deviations);
160
+ lines.push("");
161
+ }
162
+ // Known issues (if present)
163
+ if (taskRow.known_issues) {
164
+ lines.push("## Known Issues");
165
+ lines.push(taskRow.known_issues);
166
+ lines.push("");
167
+ }
168
+ return lines.join("\n");
195
169
  }
196
170
  /**
197
171
  * Render SUMMARY.md projection to disk for a specific task.
@@ -202,8 +176,7 @@ export function renderSummaryProjection(basePath, milestoneId, sliceId, taskId)
202
176
  const taskRow = taskRows.find(t => t.id === taskId);
203
177
  if (!taskRow)
204
178
  return;
205
- const evidenceRows = getVerificationEvidence(milestoneId, sliceId, taskId);
206
- const content = renderSummaryContent(taskRow, sliceId, milestoneId, evidenceRows);
179
+ const content = renderSummaryContent(taskRow, sliceId, milestoneId);
207
180
  const dir = join(basePath, ".gsd", "milestones", milestoneId, "slices", sliceId, "tasks");
208
181
  mkdirSync(dir, { recursive: true });
209
182
  atomicWriteSync(join(dir, `${taskId}-SUMMARY.md`), content);
@@ -217,18 +190,13 @@ export function renderSummaryProjection(basePath, milestoneId, sliceId, taskId)
217
190
  export function renderStateContent(state) {
218
191
  const lines = [];
219
192
  lines.push("# GSD State", "");
193
+ const activeMilestone = state.activeMilestone
194
+ ? `${state.activeMilestone.id}: ${state.activeMilestone.title}`
195
+ : "None";
220
196
  const activeSlice = state.activeSlice
221
197
  ? `${state.activeSlice.id}: ${state.activeSlice.title}`
222
198
  : "None";
223
- if (state.phase === 'complete' && state.lastCompletedMilestone) {
224
- lines.push(`**Last Completed Milestone:** ${state.lastCompletedMilestone.id}: ${state.lastCompletedMilestone.title}`);
225
- }
226
- else {
227
- const activeMilestone = state.activeMilestone
228
- ? `${state.activeMilestone.id}: ${state.activeMilestone.title}`
229
- : "None";
230
- lines.push(`**Active Milestone:** ${activeMilestone}`);
231
- }
199
+ lines.push(`**Active Milestone:** ${activeMilestone}`);
232
200
  lines.push(`**Active Slice:** ${activeSlice}`);
233
201
  lines.push(`**Phase:** ${state.phase}`);
234
202
  if (state.requirements) {
@@ -1,39 +1,10 @@
1
1
  import { join } from "node:path";
2
2
  import { mkdirSync, existsSync, readFileSync, unlinkSync } from "node:fs";
3
- import { logWarning, logError } from "./workflow-logger.js";
4
3
  import { readEvents, findForkPoint, appendEvent, getSessionId } from "./workflow-events.js";
5
- import { transaction, updateTaskStatus, updateSliceStatus, getSliceTasks, insertVerificationEvidence, upsertDecision, openDatabase, } from "./gsd-db.js";
6
- import { isClosedStatus } from "./status-guards.js";
4
+ import { transaction, updateTaskStatus, updateSliceStatus, insertVerificationEvidence, upsertDecision, openDatabase, } from "./gsd-db.js";
7
5
  import { writeManifest } from "./workflow-manifest.js";
8
6
  import { atomicWriteSync } from "./atomic-write.js";
9
7
  import { acquireSyncLock, releaseSyncLock } from "./sync-lock.js";
10
- // ─── Replay Helpers ──────────────────────────────────────────────────────────
11
- /**
12
- * Replay a complete_slice event with task validation.
13
- *
14
- * #2945 Bug 2: The original replay blindly called updateSliceStatus("done")
15
- * without checking whether all tasks in the slice are actually complete.
16
- * During API overload or partial execution, a complete_slice event could
17
- * be logged even when tasks were skipped, causing the milestone completion
18
- * guard to see the slice as "done" and allow premature milestone completion.
19
- *
20
- * This function validates that every task in the slice has a closed status
21
- * before marking the slice as done. If any task is still pending, the slice
22
- * status is left unchanged.
23
- */
24
- export function replaySliceComplete(milestoneId, sliceId, ts) {
25
- const tasks = getSliceTasks(milestoneId, sliceId);
26
- // If there are tasks and any are not closed, skip the status update
27
- if (tasks.length > 0) {
28
- const incompleteTasks = tasks.filter(t => !isClosedStatus(t.status));
29
- if (incompleteTasks.length > 0) {
30
- process.stderr.write(`[gsd] reconcile: skipping complete_slice replay for ${sliceId} — ` +
31
- `${incompleteTasks.length} task(s) still pending\n`);
32
- return;
33
- }
34
- }
35
- updateSliceStatus(milestoneId, sliceId, "done", ts);
36
- }
37
8
  // ─── replayEvents ─────────────────────────────────────────────────────────────
38
9
  /**
39
10
  * Replay a list of WorkflowEvents by dispatching each to the appropriate
@@ -87,8 +58,7 @@ function replayEvents(events) {
87
58
  case "complete_slice": {
88
59
  const milestoneId = p["milestoneId"];
89
60
  const sliceId = p["sliceId"];
90
- // #2945 Bug 2: validate tasks before marking slice done
91
- replaySliceComplete(milestoneId, sliceId, event.ts);
61
+ updateSliceStatus(milestoneId, sliceId, "done", event.ts);
92
62
  break;
93
63
  }
94
64
  case "plan_slice": {
@@ -251,7 +221,7 @@ export function reconcileWorktreeLogs(mainBasePath, worktreeBasePath) {
251
221
  // Acquire advisory lock to prevent concurrent reconcile + append races
252
222
  const lock = acquireSyncLock(mainBasePath);
253
223
  if (!lock.acquired) {
254
- logWarning("reconcile", "could not acquire sync lock — another reconciliation may be in progress");
224
+ process.stderr.write(`[gsd] reconcile: could not acquire sync lock — another reconciliation may be in progress\n`);
255
225
  return { autoMerged: 0, conflicts: [] };
256
226
  }
257
227
  try {
@@ -281,7 +251,7 @@ function _reconcileWorktreeLogsInner(mainBasePath, worktreeBasePath) {
281
251
  if (conflicts.length > 0) {
282
252
  // D-04: atomic all-or-nothing — block entire merge
283
253
  writeConflictsFile(mainBasePath, conflicts, worktreeBasePath);
284
- logError("reconcile", `${conflicts.length} conflict(s) detected`, { count: String(conflicts.length), path: join(mainBasePath, ".gsd", "CONFLICTS.md") });
254
+ process.stderr.write(`[gsd] reconcile: ${conflicts.length} conflict(s) detected see ${join(mainBasePath, ".gsd", "CONFLICTS.md")}\n`);
285
255
  return { autoMerged: 0, conflicts };
286
256
  }
287
257
  // Step 6: Clean merge — stable sort by timestamp (index-based tiebreaker)
@@ -302,7 +272,7 @@ function _reconcileWorktreeLogsInner(mainBasePath, worktreeBasePath) {
302
272
  writeManifest(mainBasePath);
303
273
  }
304
274
  catch (err) {
305
- logWarning("reconcile", "manifest write failed (non-fatal)", { error: err.message });
275
+ process.stderr.write(`[gsd] reconcile: manifest write failed (non-fatal): ${err.message}\n`);
306
276
  }
307
277
  return { autoMerged: merged.length, conflicts: [] };
308
278
  }
@@ -3,7 +3,6 @@ import { isDbAvailable, getMilestoneSlices, getSliceTasks } from "./gsd-db.js";
3
3
  import { parseRoadmap, parsePlan } from "./parsers-legacy.js";
4
4
  import { resolveMilestoneFile, resolveSliceFile, resolveTaskFile, resolveTasksDir, } from "./paths.js";
5
5
  import { deriveState } from "./state.js";
6
- import { extractVerdict } from "./verdict-parser.js";
7
6
  import { findMilestoneIds } from "./guided-flow.js";
8
7
  import { getSliceBranchName, detectWorktreeName } from "./worktree.js";
9
8
  // Extract milestone title from roadmap header without using parsers.
@@ -117,29 +116,6 @@ export async function indexWorkspace(basePath, opts = {}) {
117
116
  taskId: state.activeTask?.id,
118
117
  phase: state.phase,
119
118
  };
120
- // Enrich milestones with authoritative status from state registry (#2807)
121
- if (state.registry) {
122
- const registryMap = new Map(state.registry.map(e => [e.id, e]));
123
- for (const milestone of milestones) {
124
- const entry = registryMap.get(milestone.id);
125
- if (entry) {
126
- milestone.status = entry.status;
127
- }
128
- }
129
- }
130
- // Populate validationVerdict from VALIDATION files (#2807)
131
- for (const milestone of milestones) {
132
- const validationPath = resolveMilestoneFile(basePath, milestone.id, "VALIDATION");
133
- if (validationPath) {
134
- const validationContent = await loadFile(validationPath);
135
- if (validationContent) {
136
- const verdict = extractVerdict(validationContent);
137
- if (verdict === "pass" || verdict === "needs-attention" || verdict === "needs-remediation") {
138
- milestone.validationVerdict = verdict;
139
- }
140
- }
141
- }
142
- }
143
119
  const scopes = [{ scope: "project", label: "project", kind: "project" }];
144
120
  for (const milestone of milestones) {
145
121
  scopes.push({ scope: milestone.id, label: `${milestone.id}: ${milestone.title}`, kind: "milestone" });
@@ -14,7 +14,7 @@
14
14
  * 3. merge() — LLM-guided reconciliation of .gsd/ artifacts back to main
15
15
  * 4. remove() — git worktree remove + branch cleanup
16
16
  */
17
- import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, realpathSync, rmSync } from "node:fs";
17
+ import { existsSync, mkdirSync, readFileSync, realpathSync, rmSync } from "node:fs";
18
18
  import { execFileSync } from "node:child_process";
19
19
  import { join, resolve, sep } from "node:path";
20
20
  import { GSDError, GSD_PARSE_ERROR, GSD_STALE_STATE, GSD_LOCK_HELD, GSD_GIT_ERROR, GSD_MERGE_CONFLICT } from "./errors.js";
@@ -203,73 +203,6 @@ export function listWorktrees(basePath) {
203
203
  }
204
204
  return worktrees;
205
205
  }
206
- // ─── Nested .git Detection (#2616) ──────────────────────────────────────
207
- //
208
- // Scaffolding tools (create-next-app, cargo init, etc.) create nested .git
209
- // directories inside worktrees. Git records these as gitlinks (mode 160000)
210
- // without a .gitmodules entry — so worktree cleanup destroys the only copy
211
- // of their object database, causing permanent silent data loss.
212
- /** Directories to skip when scanning for nested .git dirs. */
213
- const NESTED_GIT_SKIP_DIRS = new Set([
214
- ".git", ".gsd", "node_modules", ".next", ".nuxt", "dist", "build",
215
- "__pycache__", ".tox", ".venv", "venv", "target", "vendor",
216
- ]);
217
- /**
218
- * Recursively find nested .git directories inside a worktree root.
219
- * Returns paths to directories that contain their own .git (directory, not file).
220
- * Skips node_modules, .gsd, and other non-project directories for performance.
221
- *
222
- * A nested .git *directory* (not a .git file — which is a legitimate worktree
223
- * pointer) indicates a scaffolded repo that will become an orphaned gitlink.
224
- */
225
- export function findNestedGitDirs(rootPath) {
226
- const results = [];
227
- function walk(dir, depth) {
228
- // Cap recursion depth to avoid runaway scanning
229
- if (depth > 10)
230
- return;
231
- let entries;
232
- try {
233
- entries = readdirSync(dir);
234
- }
235
- catch {
236
- return; // Permission denied, broken symlink, etc.
237
- }
238
- for (const entry of entries) {
239
- if (NESTED_GIT_SKIP_DIRS.has(entry))
240
- continue;
241
- const fullPath = join(dir, entry);
242
- // Only follow real directories, not symlinks
243
- let stat;
244
- try {
245
- stat = lstatSync(fullPath);
246
- }
247
- catch {
248
- continue;
249
- }
250
- if (!stat.isDirectory())
251
- continue;
252
- // Check if this directory contains a .git *directory* (not a .git file).
253
- // A .git file is a worktree pointer and is legitimate.
254
- // A .git directory is a standalone repo created by scaffolding.
255
- const innerGit = join(fullPath, ".git");
256
- try {
257
- const innerStat = lstatSync(innerGit);
258
- if (innerStat.isDirectory()) {
259
- results.push(fullPath);
260
- // Don't recurse into the nested repo — we found what we need
261
- continue;
262
- }
263
- }
264
- catch {
265
- // No .git here — continue scanning
266
- }
267
- walk(fullPath, depth + 1);
268
- }
269
- }
270
- walk(rootPath, 0);
271
- return results;
272
- }
273
206
  /**
274
207
  * Remove a worktree and optionally delete its branch.
275
208
  * If the process is currently inside the worktree, chdir out first.
@@ -336,24 +269,6 @@ export function removeWorktree(basePath, name, opts = {}) {
336
269
  // submodule status failed — proceed with normal removal
337
270
  }
338
271
  }
339
- // Nested .git safety (#2616): detect nested .git directories created by
340
- // scaffolding tools (create-next-app, cargo init, etc.). These produce
341
- // gitlink entries (mode 160000) without .gitmodules — cleanup would destroy
342
- // the only copy of the nested object database, causing permanent data loss.
343
- // Fix: remove the nested .git dirs so git tracks the files as regular content.
344
- const nestedGitDirs = findNestedGitDirs(resolvedWtPath);
345
- if (nestedGitDirs.length > 0) {
346
- for (const nestedDir of nestedGitDirs) {
347
- const nestedGitPath = join(nestedDir, ".git");
348
- try {
349
- rmSync(nestedGitPath, { recursive: true, force: true });
350
- logWarning("reconcile", `Removed nested .git directory from scaffolded project to prevent data loss (#2616)`, { worktree: name, nestedRepo: nestedDir });
351
- }
352
- catch {
353
- logWarning("reconcile", `Failed to remove nested .git directory — files may be lost as orphaned gitlink`, { worktree: name, nestedRepo: nestedDir });
354
- }
355
- }
356
- }
357
272
  // Remove worktree: try non-force first when submodules have changes,
358
273
  // falling back to force only after submodule state has been preserved.
359
274
  const useForce = hasSubmoduleChanges ? false : force;
@@ -368,25 +283,6 @@ export function removeWorktree(basePath, name, opts = {}) {
368
283
  }
369
284
  catch { /* may fail */ }
370
285
  }
371
- // (#2821) If the worktree directory STILL exists after both native removal
372
- // attempts (e.g. untracked files like ASSESSMENT/UAT-RESULT prevent git
373
- // worktree remove), force-remove the git internal worktree metadata first,
374
- // then remove the filesystem directory. Without this, the .git/worktrees/<name>
375
- // lock prevents rmSync from cleaning up, and the orphaned worktree directory
376
- // causes every subsequent `/gsd auto` to re-enter the stale worktree.
377
- if (existsSync(resolvedWtPath)) {
378
- try {
379
- const wtInternalDir = join(basePath, ".git", "worktrees", name);
380
- if (existsSync(wtInternalDir)) {
381
- rmSync(wtInternalDir, { recursive: true, force: true });
382
- }
383
- rmSync(resolvedWtPath, { recursive: true, force: true });
384
- }
385
- catch {
386
- logWarning("reconcile", `Worktree directory could not be removed after git internal cleanup: ${resolvedWtPath}. ` +
387
- `Manual cleanup: rm -rf "${resolvedWtPath.replaceAll("\\", "/")}"`, { worktree: name });
388
- }
389
- }
390
286
  // Prune stale entries so git knows the worktree is gone
391
287
  nativeWorktreePrune(basePath);
392
288
  if (deleteBranch) {
@@ -248,12 +248,7 @@ export class WorktreeResolver {
248
248
  eventType: "worktree-merge-start",
249
249
  data: { milestoneId, mode },
250
250
  });
251
- // #2625: If we are physically inside an auto-worktree, we MUST merge
252
- // regardless of the current isolation config. This prevents data loss when
253
- // the default isolation mode changes between versions (e.g., "worktree" ->
254
- // "none"): the worktree branch still holds real commits that need merging.
255
- const inWorktree = this.deps.isInAutoWorktree(this.s.basePath) && this.s.originalBasePath;
256
- if (mode === "none" && !inWorktree) {
251
+ if (mode === "none") {
257
252
  debugLog("WorktreeResolver", {
258
253
  action: "mergeAndExit",
259
254
  milestoneId,
@@ -262,7 +257,8 @@ export class WorktreeResolver {
262
257
  });
263
258
  return;
264
259
  }
265
- if (mode === "worktree" || inWorktree) {
260
+ if (mode === "worktree" ||
261
+ (this.deps.isInAutoWorktree(this.s.basePath) && this.s.originalBasePath)) {
266
262
  this._mergeWorktreeMode(milestoneId, ctx);
267
263
  }
268
264
  else if (mode === "branch") {
@@ -312,19 +308,6 @@ export class WorktreeResolver {
312
308
  if (roadmapPath) {
313
309
  const roadmapContent = this.deps.readFileSync(roadmapPath, "utf-8");
314
310
  const mergeResult = this.deps.mergeMilestoneToMain(originalBase, milestoneId, roadmapContent);
315
- // #2945 Bug 3: mergeMilestoneToMain performs best-effort worktree
316
- // cleanup internally (step 12), but it can silently fail on Windows
317
- // or when the worktree directory is locked. Perform a secondary
318
- // teardown here to ensure the worktree is properly cleaned up.
319
- // This is idempotent — if the worktree was already removed,
320
- // teardownAutoWorktree handles the no-op case gracefully.
321
- try {
322
- this.deps.teardownAutoWorktree(originalBase, milestoneId);
323
- }
324
- catch {
325
- // Best-effort — the primary cleanup in mergeMilestoneToMain may
326
- // have already removed the worktree.
327
- }
328
311
  if (mergeResult.codeFilesChanged) {
329
312
  ctx.notify(`Milestone ${milestoneId} merged to main.${mergeResult.pushed ? " Pushed to remote." : ""}`, "info");
330
313
  }
@@ -74,9 +74,7 @@ function readConfigs() {
74
74
  return servers;
75
75
  }
76
76
  function getServerConfig(name) {
77
- const trimmed = name.trim();
78
- return readConfigs().find((s) => s.name === trimmed ||
79
- s.name.toLowerCase() === trimmed.toLowerCase());
77
+ return readConfigs().find((s) => s.name === name);
80
78
  }
81
79
  /** Resolve ${VAR} references in env values against process.env. */
82
80
  function resolveEnv(env) {
@@ -92,14 +90,12 @@ function resolveEnv(env) {
92
90
  return resolved;
93
91
  }
94
92
  async function getOrConnect(name, signal) {
93
+ const existing = connections.get(name);
94
+ if (existing)
95
+ return existing.client;
95
96
  const config = getServerConfig(name);
96
97
  if (!config)
97
98
  throw new Error(`Unknown MCP server: "${name}". Use mcp_servers to list available servers.`);
98
- // Always use config.name as the canonical cache key so that variant
99
- // casing / whitespace still hits the same connection.
100
- const existing = connections.get(config.name);
101
- if (existing)
102
- return existing.client;
103
99
  const client = new Client({ name: "gsd", version: "1.0.0" });
104
100
  let transport;
105
101
  if (config.transport === "stdio" && config.command) {
@@ -112,14 +108,14 @@ async function getOrConnect(name, signal) {
112
108
  });
113
109
  }
114
110
  else if (config.transport === "http" && config.url) {
115
- const resolvedUrl = config.url.replace(/\$\{([^}]+)\}/g, (_, varName) => process.env[varName] ?? "");
111
+ const resolvedUrl = config.url.replace(/\$\{([^}]+)\}/g, (_, name) => process.env[name] ?? "");
116
112
  transport = new StreamableHTTPClientTransport(new URL(resolvedUrl));
117
113
  }
118
114
  else {
119
- throw new Error(`Server "${config.name}" has unsupported transport: ${config.transport}`);
115
+ throw new Error(`Server "${name}" has unsupported transport: ${config.transport}`);
120
116
  }
121
117
  await client.connect(transport, { signal, timeout: 30000 });
122
- connections.set(config.name, { client, transport });
118
+ connections.set(name, { client, transport });
123
119
  return client;
124
120
  }
125
121
  async function closeAll() {
@@ -8,6 +8,6 @@
8
8
  "provides": {
9
9
  "tools": ["search-the-web", "fetch_page", "search_and_read", "web_search"],
10
10
  "commands": ["search-provider"],
11
- "hooks": ["session_start", "model_select", "before_provider_request"]
11
+ "hooks": ["model_select", "before_provider_request"]
12
12
  }
13
13
  }
@@ -28,7 +28,7 @@ import { Editor, Key, matchesKey, truncateToWidth, } from "@gsd/pi-tui";
28
28
  import { makeUI, INDENT } from "./ui.js";
29
29
  // ─── Constants ────────────────────────────────────────────────────────────────
30
30
  const OTHER_OPTION_LABEL = "None of the above";
31
- const OTHER_OPTION_DESCRIPTION = "Select to type your own answer.";
31
+ const OTHER_OPTION_DESCRIPTION = "Press TAB to add optional notes.";
32
32
  // ─── Wrap-up screen ───────────────────────────────────────────────────────────
33
33
  export async function showWrapUpScreen(opts, ctx) {
34
34
  return ctx.ui.custom((tui, theme, _kb, done) => {
@@ -199,16 +199,6 @@ export async function showInterviewRound(questions, opts, ctx) {
199
199
  if (!isMultiSelect(currentIdx)) {
200
200
  states[currentIdx].committedIndex = states[currentIdx].cursorIndex;
201
201
  }
202
- // Auto-open the notes field when "None of the above" is selected
203
- // so the user can immediately provide a free-text explanation
204
- // instead of being trapped in a re-asking loop (bug #2715).
205
- if (!isMultiSelect(currentIdx) && states[currentIdx].cursorIndex === noneOrDoneIdx(currentIdx)) {
206
- states[currentIdx].notesVisible = true;
207
- focusNotes = true;
208
- loadStateToEditor();
209
- refresh();
210
- return;
211
- }
212
202
  if (isMultiQuestion && currentIdx < questions.length - 1) {
213
203
  let next = currentIdx + 1;
214
204
  for (let i = 0; i < questions.length; i++) {