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
@@ -11,7 +11,7 @@ import { resolve } from 'node:path';
11
11
  import { readFileSync, existsSync, statSync } from 'node:fs';
12
12
  import { resolveGsdRootFile } from './paths.js';
13
13
  import { saveFile } from './files.js';
14
- import { GSDError, GSD_IO_ERROR } from './errors.js';
14
+ import { GSDError, GSD_STALE_STATE, GSD_IO_ERROR } from './errors.js';
15
15
  import { logWarning, logError } from './workflow-logger.js';
16
16
  import { invalidateStateCache } from './state.js';
17
17
  import { clearPathCache } from './paths.js';
@@ -205,98 +205,6 @@ export async function nextDecisionId() {
205
205
  return 'D001';
206
206
  }
207
207
  }
208
- // ─── Next Requirement ID ─────────────────────────────────────────────────
209
- /**
210
- * Compute the next requirement ID from the current DB state.
211
- * Queries MAX(CAST(SUBSTR(id, 2) AS INTEGER)) from requirements table.
212
- * Returns R001 if no requirements exist. Zero-pads to 3 digits.
213
- */
214
- export async function nextRequirementId() {
215
- try {
216
- const db = await import('./gsd-db.js');
217
- const adapter = db._getAdapter();
218
- if (!adapter)
219
- return 'R001';
220
- const row = adapter
221
- .prepare('SELECT MAX(CAST(SUBSTR(id, 2) AS INTEGER)) as max_num FROM requirements')
222
- .get();
223
- const maxNum = row ? row['max_num'] : null;
224
- if (maxNum == null || isNaN(maxNum))
225
- return 'R001';
226
- const next = maxNum + 1;
227
- return `R${String(next).padStart(3, '0')}`;
228
- }
229
- catch (err) {
230
- logError('manifest', 'nextRequirementId failed', { fn: 'nextRequirementId', error: String(err.message) });
231
- return 'R001';
232
- }
233
- }
234
- /**
235
- * Save a new requirement to DB and regenerate REQUIREMENTS.md.
236
- * Auto-assigns the next ID via nextRequirementId().
237
- * Returns the assigned ID.
238
- */
239
- export async function saveRequirementToDb(fields, basePath) {
240
- try {
241
- const db = await import('./gsd-db.js');
242
- const id = await nextRequirementId();
243
- const requirement = {
244
- id,
245
- class: fields.class,
246
- status: fields.status ?? 'active',
247
- description: fields.description,
248
- why: fields.why,
249
- source: fields.source,
250
- primary_owner: fields.primary_owner ?? '',
251
- supporting_slices: fields.supporting_slices ?? '',
252
- validation: fields.validation ?? '',
253
- notes: fields.notes ?? '',
254
- full_content: '',
255
- superseded_by: null,
256
- };
257
- db.upsertRequirement(requirement);
258
- // Fetch all requirements for full file regeneration
259
- const adapter = db._getAdapter();
260
- let allRequirements = [];
261
- if (adapter) {
262
- const rows = adapter.prepare('SELECT * FROM requirements ORDER BY id').all();
263
- allRequirements = rows.map(row => ({
264
- id: row['id'],
265
- class: row['class'],
266
- status: row['status'],
267
- description: row['description'],
268
- why: row['why'],
269
- source: row['source'],
270
- primary_owner: row['primary_owner'],
271
- supporting_slices: row['supporting_slices'],
272
- validation: row['validation'],
273
- notes: row['notes'],
274
- full_content: row['full_content'],
275
- superseded_by: row['superseded_by'] ?? null,
276
- }));
277
- }
278
- const nonSuperseded = allRequirements.filter(r => r.superseded_by == null);
279
- const md = generateRequirementsMd(nonSuperseded);
280
- const filePath = resolveGsdRootFile(basePath, 'REQUIREMENTS');
281
- try {
282
- await saveFile(filePath, md);
283
- }
284
- catch (diskErr) {
285
- logError('manifest', 'disk write failed, rolling back DB row', { fn: 'saveRequirementToDb', error: String(diskErr.message) });
286
- const rollbackAdapter = db._getAdapter();
287
- rollbackAdapter?.prepare('DELETE FROM requirements WHERE id = :id').run({ ':id': id });
288
- throw diskErr;
289
- }
290
- invalidateStateCache();
291
- clearPathCache();
292
- clearParseCache();
293
- return { id };
294
- }
295
- catch (err) {
296
- logError('manifest', 'saveRequirementToDb failed', { fn: 'saveRequirementToDb', error: String(err.message) });
297
- throw err;
298
- }
299
- }
300
208
  /**
301
209
  * Save a new decision to DB and regenerate DECISIONS.md.
302
210
  * Auto-assigns the next ID via nextDecisionId().
@@ -387,28 +295,14 @@ export async function updateRequirementInDb(id, updates, basePath) {
387
295
  try {
388
296
  const db = await import('./gsd-db.js');
389
297
  const existing = db.getRequirementById(id);
390
- // If requirement doesn't exist in DB, create a skeleton and merge updates.
391
- // This handles the case where requirements were written to REQUIREMENTS.md
392
- // but never imported into the database (see #2919).
393
- const base = existing ?? {
394
- id,
395
- class: '',
396
- status: 'active',
397
- description: '',
398
- why: '',
399
- source: '',
400
- primary_owner: '',
401
- supporting_slices: '',
402
- validation: '',
403
- notes: '',
404
- full_content: '',
405
- superseded_by: null,
406
- };
407
- // Merge updates into existing (or skeleton)
298
+ if (!existing) {
299
+ throw new GSDError(GSD_STALE_STATE, `Requirement ${id} not found`);
300
+ }
301
+ // Merge updates into existing
408
302
  const merged = {
409
- ...base,
303
+ ...existing,
410
304
  ...updates,
411
- id: base.id, // ID cannot be changed
305
+ id: existing.id, // ID cannot be changed
412
306
  };
413
307
  db.upsertRequirement(merged);
414
308
  // Fetch ALL requirements (including superseded) for full file regeneration
@@ -441,9 +335,7 @@ export async function updateRequirementInDb(id, updates, basePath) {
441
335
  }
442
336
  catch (diskErr) {
443
337
  logError('manifest', 'disk write failed, reverting DB row', { fn: 'updateRequirementInDb', error: String(diskErr.message) });
444
- if (existing) {
445
- db.upsertRequirement(existing);
446
- }
338
+ db.upsertRequirement(existing);
447
339
  throw diskErr;
448
340
  }
449
341
  // Invalidate file-read caches so deriveState() sees the updated markdown.
@@ -11,29 +11,6 @@ import { RUNTIME_EXCLUSION_PATHS, resolveMilestoneIntegrationBranch, writeIntegr
11
11
  import { nativeIsRepo, nativeWorktreeList, nativeWorktreeRemove, nativeBranchList, nativeBranchDelete, nativeLsFiles, nativeRmCached } from "./native-git-bridge.js";
12
12
  import { getAllWorktreeHealth } from "./worktree-health.js";
13
13
  import { loadEffectiveGSDPreferences } from "./preferences.js";
14
- /**
15
- * Returns true if the directory contains only doctor artifacts
16
- * (e.g. `.gsd/doctor-history.jsonl`). These dirs are created by
17
- * appendDoctorHistory() writing to worktree-scoped paths during the audit
18
- * and should not be flagged as orphaned worktrees (#3105).
19
- */
20
- function isDoctorArtifactOnly(dirPath) {
21
- try {
22
- const entries = readdirSync(dirPath);
23
- // Empty dir — not a doctor artifact, still orphaned
24
- if (entries.length === 0)
25
- return false;
26
- // Only a .gsd subdirectory
27
- if (entries.length === 1 && entries[0] === ".gsd") {
28
- const gsdEntries = readdirSync(join(dirPath, ".gsd"));
29
- return gsdEntries.length <= 1 && gsdEntries.every(e => e === "doctor-history.jsonl");
30
- }
31
- return false;
32
- }
33
- catch {
34
- return false;
35
- }
36
- }
37
14
  export async function checkGitHealth(basePath, issues, fixesApplied, shouldFix, isolationMode = "none") {
38
15
  // Degrade gracefully if not a git repo
39
16
  if (!nativeIsRepo(basePath)) {
@@ -330,11 +307,6 @@ export async function checkGitHealth(basePath, issues, fixesApplied, shouldFix,
330
307
  }
331
308
  const normalizedFullPath = normalizePath(fullPath);
332
309
  if (!registeredPaths.has(normalizedFullPath)) {
333
- // Skip directories that only contain doctor artifacts (.gsd/doctor-history.jsonl).
334
- // appendDoctorHistory() can recreate these dirs during the audit itself,
335
- // causing a circular false positive (#3105 Bug 1).
336
- if (isDoctorArtifactOnly(fullPath))
337
- continue;
338
310
  issues.push({
339
311
  severity: "warning",
340
312
  code: "worktree_directory_orphaned",
@@ -144,8 +144,7 @@ function resolveKey(providerId) {
144
144
  */
145
145
  const PROVIDER_ROUTES = {
146
146
  anthropic: ["github-copilot"],
147
- openai: ["github-copilot", "openai-codex"],
148
- google: ["google-gemini-cli"],
147
+ openai: ["github-copilot"],
149
148
  };
150
149
  function checkLlmProviders() {
151
150
  const required = collectConfiguredModelProviders();
@@ -108,12 +108,11 @@ export async function checkRuntimeHealth(basePath, issues, fixesApplied, shouldF
108
108
  const orphaned = [];
109
109
  for (const key of keys) {
110
110
  // Key format: "unitType/unitId" e.g. "execute-task/M001/S01/T01"
111
- // Hook units have compound types: "hook/<hookName>/unitId"
112
- const { splitCompletedKey } = await import("./forensics.js");
113
- const parsed = splitCompletedKey(key);
114
- if (!parsed)
111
+ const slashIdx = key.indexOf("/");
112
+ if (slashIdx === -1)
115
113
  continue;
116
- const { unitType, unitId } = parsed;
114
+ const unitType = key.slice(0, slashIdx);
115
+ const unitId = key.slice(slashIdx + 1);
117
116
  // Only validate artifact-producing unit types
118
117
  const { verifyExpectedArtifact } = await import("./auto-recovery.js");
119
118
  if (!verifyExpectedArtifact(unitType, unitId, basePath)) {
@@ -689,10 +689,8 @@ export async function runGSDDoctor(basePath, options) {
689
689
  allTasksDone = allTasksDone && task.done;
690
690
  }
691
691
  // Blocker-without-replan detection
692
- // Skip when all tasks are done — the blocker was implicitly resolved
693
- // within the task and the slice is not stuck (#3105 Bug 2).
694
692
  const replanPath = resolveSliceFile(basePath, milestoneId, slice.id, "REPLAN");
695
- if (!replanPath && !allTasksDone) {
693
+ if (!replanPath) {
696
694
  for (const task of plan.tasks) {
697
695
  if (!task.done)
698
696
  continue;
@@ -24,7 +24,7 @@ const NETWORK_RE = /network|ECONNRESET|ETIMEDOUT|ECONNREFUSED|socket hang up|fet
24
24
  const SERVER_RE = /internal server error|500|502|503|overloaded|server_error|api_error|service.?unavailable/i;
25
25
  // ECONNRESET/ECONNREFUSED are in NETWORK_RE (same-model retry first).
26
26
  const CONNECTION_RE = /terminated|connection.?refused|other side closed|EPIPE|network.?(?:is\s+)?unavailable|stream_exhausted(?:_without_result)?/i;
27
- const STREAM_RE = /Unexpected end of JSON|Unexpected token.*JSON|Expected.*in JSON|Unterminated.*in JSON|SyntaxError.*JSON/i;
27
+ const STREAM_RE = /Unexpected end of JSON|Unexpected token.*JSON|Expected double-quoted property name|SyntaxError.*JSON/i;
28
28
  const RESET_DELAY_RE = /reset in (\d+)s/i;
29
29
  /**
30
30
  * Classify an error message into one of the ErrorClass kinds.
@@ -33,9 +33,9 @@ const RESET_DELAY_RE = /reset in (\d+)s/i;
33
33
  * 1. Permanent (auth/billing/quota) — unless also rate-limited
34
34
  * 2. Rate limit (429, rate.?limit, too many requests)
35
35
  * 3. Network (ECONNRESET, ETIMEDOUT, socket hang up, fetch failed, dns)
36
- * 4. Stream truncation (malformed JSON from mid-stream cut)
37
- * 5. Server (500/502/503, overloaded, server_error)
38
- * 6. Connection (terminated, ECONNREFUSED, EPIPE, other side closed)
36
+ * 4. Server (500/502/503, overloaded, server_error)
37
+ * 5. Connection (terminated, ECONNREFUSED, EPIPE, other side closed)
38
+ * 6. Stream truncation (malformed JSON from mid-stream cut)
39
39
  * 7. Unknown
40
40
  */
41
41
  export function classifyError(errorMsg, retryAfterMs) {
@@ -61,21 +61,18 @@ export function classifyError(errorMsg, retryAfterMs) {
61
61
  // "billing" appearing alongside "network").
62
62
  return { kind: "network", retryAfterMs: retryAfterMs ?? 3_000 };
63
63
  }
64
- // 4. Stream truncationdownstream symptom of connection drop
65
- // Checked before server/connection because JSON parse errors can contain
66
- // substrings like "position 500" (matches SERVER_RE) or "Unterminated"
67
- // (matches CONNECTION_RE's "terminated" pattern).
68
- if (STREAM_RE.test(errorMsg)) {
69
- return { kind: "stream", retryAfterMs: retryAfterMs ?? 15_000 };
70
- }
71
- // 5. Server errors — try fallback model
64
+ // 4. Server errorstry fallback model
72
65
  if (SERVER_RE.test(errorMsg)) {
73
66
  return { kind: "server", retryAfterMs: retryAfterMs ?? 30_000 };
74
67
  }
75
- // 6. Connection errors — try fallback model
68
+ // 5. Connection errors — try fallback model
76
69
  if (CONNECTION_RE.test(errorMsg)) {
77
70
  return { kind: "connection", retryAfterMs: retryAfterMs ?? 15_000 };
78
71
  }
72
+ // 6. Stream truncation — downstream symptom of connection drop
73
+ if (STREAM_RE.test(errorMsg)) {
74
+ return { kind: "stream", retryAfterMs: retryAfterMs ?? 15_000 };
75
+ }
79
76
  // 7. Unknown
80
77
  return { kind: "unknown" };
81
78
  }
@@ -12,22 +12,7 @@
12
12
  "gsd_requirement_update", "gsd_milestone_generate_id"
13
13
  ],
14
14
  "commands": ["gsd", "kill", "worktree", "exit"],
15
- "hooks": [
16
- "session_start",
17
- "session_switch",
18
- "bash_transform",
19
- "session_fork",
20
- "before_agent_start",
21
- "agent_end",
22
- "session_before_compact",
23
- "session_shutdown",
24
- "tool_call",
25
- "tool_result",
26
- "tool_execution_start",
27
- "tool_execution_end",
28
- "model_select",
29
- "before_provider_request"
30
- ],
15
+ "hooks": ["session_start", "session_switch"],
31
16
  "shortcuts": ["Ctrl+Alt+G"]
32
17
  }
33
18
  }
@@ -22,8 +22,6 @@ import { deriveState } from "./state.js";
22
22
  import { isAutoActive } from "./auto.js";
23
23
  import { loadPrompt } from "./prompt-loader.js";
24
24
  import { gsdRoot } from "./paths.js";
25
- import { isDbAvailable, getAllMilestones, getMilestoneSlices, getSliceTasks } from "./gsd-db.js";
26
- import { isClosedStatus } from "./status-guards.js";
27
25
  import { formatDuration } from "../shared/format-utils.js";
28
26
  import { getAutoWorktreePath } from "./auto-worktree.js";
29
27
  import { loadEffectiveGSDPreferences, loadGlobalGSDPreferences, getGlobalGSDPreferencesPath } from "./preferences.js";
@@ -31,15 +29,13 @@ import { showNextAction } from "../shared/tui.js";
31
29
  import { ensurePreferencesFile, serializePreferencesToFrontmatter } from "./commands-prefs-wizard.js";
32
30
  // ─── Duplicate Detection ──────────────────────────────────────────────────────
33
31
  const DEDUP_PROMPT_SECTION = `
34
- ## Pre-Investigation: Duplicate Check (REQUIRED)
32
+ ## Duplicate Detection (REQUIRED before issue creation)
35
33
 
36
- Before reading GSD source code or performing deep analysis, you MUST search for existing issues and PRs that may already address this bug. This avoids wasting tokens on already-fixed bugs.
34
+ Before offering to create a GitHub issue, you MUST search for existing issues and PRs that may already address this bug. This step uses the user's AI tokens for analysis.
37
35
 
38
36
  ### Search Steps
39
37
 
40
- Use keywords from the user's problem description and the anomaly summaries in the forensic report above.
41
-
42
- 1. **Search closed issues** for similar keywords:
38
+ 1. **Search closed issues** for similar keywords from your diagnosis:
43
39
  \`\`\`
44
40
  gh issue list --repo gsd-build/gsd-2 --state closed --search "<keywords from root cause>" --limit 20
45
41
  \`\`\`
@@ -56,16 +52,20 @@ Use keywords from the user's problem description and the anomaly summaries in th
56
52
 
57
53
  ### Analysis
58
54
 
59
- For each result, compare it against the user's reported symptoms and the forensic anomalies:
55
+ For each result, compare it against your root-cause diagnosis:
60
56
  - Does the issue describe the same code path or file?
61
- - Does the PR modify the area related to the reported symptoms?
57
+ - Does the PR modify the same file:line you identified?
62
58
  - Is the symptom description semantically similar even if keywords differ?
63
59
 
64
- ### Decision Gate
60
+ ### Present Findings
61
+
62
+ If you find potential matches, present them to the user:
63
+
64
+ 1. **"Already fixed by PR #X — skip issue creation"** — when a merged PR or closed issue clearly addresses the same root cause. Explain why you believe it matches.
65
+ 2. **"Add my findings to existing issue #Y"** — when an open issue exists for the same bug. Use \`gh issue comment #Y --repo gsd-build/gsd-2\` to add forensic evidence.
66
+ 3. **"Create new issue anyway"** — when existing results do not cover this specific failure.
65
67
 
66
- - **Merged PR clearly fixes the described symptom** Report "Already fixed by PR #X" with brief explanation. Skip full investigation.
67
- - **Open issue matches** → Report "Existing issue #Y covers this." Offer to add forensic evidence. Skip full investigation unless user asks for deeper analysis.
68
- - **No matches** → Proceed to full investigation below.
68
+ Only proceed to issue creation if no matches were found OR the user explicitly chooses "Create new issue anyway".
69
69
  `;
70
70
  async function writeForensicsDedupPref(ctx, enabled) {
71
71
  const prefsPath = getGlobalGSDPreferencesPath();
@@ -148,8 +148,6 @@ export async function handleForensics(args, ctx, pi) {
148
148
  });
149
149
  ctx.ui.notify(`Forensic report saved: ${relative(basePath, savedPath)}`, "info");
150
150
  pi.sendMessage({ customType: "gsd-forensics", content, display: false }, { triggerTurn: true });
151
- // Persist forensics context so follow-up turns can re-inject it (#2941)
152
- writeForensicsMarker(basePath, savedPath, content);
153
151
  }
154
152
  // ─── Report Builder ───────────────────────────────────────────────────────────
155
153
  export async function buildForensicReport(basePath) {
@@ -169,9 +167,8 @@ export async function buildForensicReport(basePath) {
169
167
  const unitTraces = scanActivityLogs(basePath, activeMilestone);
170
168
  // 3. Load metrics
171
169
  const metrics = loadLedgerFromDisk(basePath);
172
- // 4. Load completed keys (legacy) and DB completion counts
170
+ // 4. Load completed keys
173
171
  const completedKeys = loadCompletedKeys(basePath);
174
- const dbCompletionCounts = getDbCompletionCounts();
175
172
  // 5. Check crash lock
176
173
  const crashLock = readCrashLock(basePath);
177
174
  // 6. Run doctor
@@ -225,7 +222,6 @@ export async function buildForensicReport(basePath) {
225
222
  unitTraces,
226
223
  metrics,
227
224
  completedKeys,
228
- dbCompletionCounts,
229
225
  crashLock,
230
226
  doctorIssues,
231
227
  anomalies,
@@ -462,41 +458,6 @@ function loadCompletedKeys(basePath) {
462
458
  catch { /* non-fatal */ }
463
459
  return [];
464
460
  }
465
- // ─── DB Completion Counts ────────────────────────────────────────────────────
466
- function getDbCompletionCounts() {
467
- if (!isDbAvailable())
468
- return null;
469
- const milestones = getAllMilestones();
470
- let completedMilestones = 0;
471
- let totalSlices = 0;
472
- let completedSlices = 0;
473
- let totalTasks = 0;
474
- let completedTasks = 0;
475
- for (const m of milestones) {
476
- if (isClosedStatus(m.status))
477
- completedMilestones++;
478
- const slices = getMilestoneSlices(m.id);
479
- for (const s of slices) {
480
- totalSlices++;
481
- if (isClosedStatus(s.status))
482
- completedSlices++;
483
- const tasks = getSliceTasks(m.id, s.id);
484
- for (const t of tasks) {
485
- totalTasks++;
486
- if (isClosedStatus(t.status))
487
- completedTasks++;
488
- }
489
- }
490
- }
491
- return {
492
- milestones: completedMilestones,
493
- milestonesTotal: milestones.length,
494
- slices: completedSlices,
495
- slicesTotal: totalSlices,
496
- tasks: completedTasks,
497
- tasksTotal: totalTasks,
498
- };
499
- }
500
461
  // ─── Anomaly Detectors ───────────────────────────────────────────────────────
501
462
  function detectStuckLoops(units, anomalies) {
502
463
  const counts = new Map();
@@ -554,42 +515,15 @@ function detectTimeouts(traces, anomalies) {
554
515
  }
555
516
  }
556
517
  }
557
- /**
558
- * Parse a completed-unit key into its unitType and unitId.
559
- *
560
- * Hook units use a compound slash-delimited type ("hook/<hookName>"), so a
561
- * naive `key.indexOf("/")` would split "hook/telegram-progress/M007/S01" into
562
- * unitType="hook" (wrong) instead of "hook/telegram-progress".
563
- *
564
- * Returns `null` for malformed keys that cannot be split.
565
- */
566
- export function splitCompletedKey(key) {
567
- if (key.startsWith("hook/")) {
568
- // Hook unit types are two segments: "hook/<hookName>/<unitId...>"
569
- const secondSlash = key.indexOf("/", 5); // skip past "hook/"
570
- if (secondSlash === -1)
571
- return null; // malformed — no unitId after hook name
572
- return {
573
- unitType: key.slice(0, secondSlash),
574
- unitId: key.slice(secondSlash + 1),
575
- };
576
- }
577
- const slashIdx = key.indexOf("/");
578
- if (slashIdx === -1)
579
- return null;
580
- return {
581
- unitType: key.slice(0, slashIdx),
582
- unitId: key.slice(slashIdx + 1),
583
- };
584
- }
585
518
  function detectMissingArtifacts(completedKeys, basePath, activeMilestone, anomalies) {
586
519
  // Also check the worktree path for artifacts — they may exist there but not at root
587
520
  const wtBasePath = activeMilestone ? getAutoWorktreePath(basePath, activeMilestone) : null;
588
521
  for (const key of completedKeys) {
589
- const parsed = splitCompletedKey(key);
590
- if (!parsed)
522
+ const slashIdx = key.indexOf("/");
523
+ if (slashIdx === -1)
591
524
  continue;
592
- const { unitType, unitId } = parsed;
525
+ const unitType = key.slice(0, slashIdx);
526
+ const unitId = key.slice(slashIdx + 1);
593
527
  const rootHasArtifact = verifyExpectedArtifact(unitType, unitId, basePath);
594
528
  const wtHasArtifact = wtBasePath ? verifyExpectedArtifact(unitType, unitId, wtBasePath) : false;
595
529
  if (!rootHasArtifact && !wtHasArtifact) {
@@ -815,34 +749,6 @@ function saveForensicReport(basePath, report, problemDescription) {
815
749
  writeFileSync(filePath, sections.join("\n"), "utf-8");
816
750
  return filePath;
817
751
  }
818
- /**
819
- * Write a marker file so that buildBeforeAgentStartResult() can re-inject
820
- * the forensics prompt on follow-up turns. (#2941)
821
- */
822
- export function writeForensicsMarker(basePath, reportPath, promptContent) {
823
- const dir = join(gsdRoot(basePath), "runtime");
824
- mkdirSync(dir, { recursive: true });
825
- const marker = {
826
- reportPath,
827
- promptContent,
828
- createdAt: new Date().toISOString(),
829
- };
830
- writeFileSync(join(dir, "active-forensics.json"), JSON.stringify(marker), "utf-8");
831
- }
832
- /**
833
- * Read the active forensics marker, or null if none exists.
834
- */
835
- export function readForensicsMarker(basePath) {
836
- const markerPath = join(gsdRoot(basePath), "runtime", "active-forensics.json");
837
- if (!existsSync(markerPath))
838
- return null;
839
- try {
840
- return JSON.parse(readFileSync(markerPath, "utf-8"));
841
- }
842
- catch {
843
- return null;
844
- }
845
- }
846
752
  // ─── Prompt Formatter ─────────────────────────────────────────────────────────
847
753
  function formatReportForPrompt(report) {
848
754
  const MAX_BYTES = 30 * 1024;
@@ -950,17 +856,8 @@ function formatReportForPrompt(report) {
950
856
  }
951
857
  sections.push("");
952
858
  }
953
- // Completion status — prefer DB counts, fall back to legacy completed-units.json
954
- if (report.dbCompletionCounts) {
955
- const c = report.dbCompletionCounts;
956
- sections.push(`### Completion Status (from DB)`);
957
- sections.push(`- ${c.milestones}/${c.milestonesTotal} milestones complete`);
958
- sections.push(`- ${c.slices}/${c.slicesTotal} slices complete`);
959
- sections.push(`- ${c.tasks}/${c.tasksTotal} tasks complete`);
960
- }
961
- else {
962
- sections.push(`### Completed Keys: ${report.completedKeys.length}`);
963
- }
859
+ // Completed keys count
860
+ sections.push(`### Completed Keys: ${report.completedKeys.length}`);
964
861
  sections.push(`### GSD Version: ${report.gsdVersion}`);
965
862
  sections.push(`### Active Milestone: ${report.activeMilestone ?? "none"}`);
966
863
  sections.push(`### Active Slice: ${report.activeSlice ?? "none"}`);
@@ -8,7 +8,7 @@
8
8
  * paths, commit type inference, and the runGit shell helper.
9
9
  */
10
10
  import { execFileSync, execSync } from "node:child_process";
11
- import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
11
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
12
12
  import { join } from "node:path";
13
13
  import { gsdRoot } from "./paths.js";
14
14
  import { GIT_NO_PROMPT_ENV } from "./git-constants.js";
@@ -348,28 +348,6 @@ export class GitServiceImpl {
348
348
  // If .gsd/ IS in .gitignore (the default for external state projects),
349
349
  // git add -A already skips it and the exclusions are harmless no-ops.
350
350
  const allExclusions = [...RUNTIME_EXCLUSION_PATHS, ...extraExclusions];
351
- // ── Parallel worker milestone scope (#1991) ──
352
- // When GSD_MILESTONE_LOCK is set, this process is a parallel worker that
353
- // must only commit files belonging to its own milestone. Exclude all other
354
- // milestone directories from staging to prevent cross-milestone pollution
355
- // (e.g., an M033 worker fabricating M032 artifacts in the same commit).
356
- const milestoneLock = process.env.GSD_MILESTONE_LOCK;
357
- if (milestoneLock) {
358
- const msDir = join(gsdRoot(this.basePath), "milestones");
359
- if (existsSync(msDir)) {
360
- try {
361
- const entries = readdirSync(msDir, { withFileTypes: true });
362
- for (const entry of entries) {
363
- if (entry.isDirectory() && entry.name !== milestoneLock) {
364
- allExclusions.push(`.gsd/milestones/${entry.name}/`);
365
- }
366
- }
367
- }
368
- catch {
369
- // Best-effort — if we can't read the milestones dir, proceed without scoping
370
- }
371
- }
372
- }
373
351
  nativeAddAllWithExclusions(this.basePath, allExclusions);
374
352
  }
375
353
  /** Tracks whether runtime file cleanup has run this session. */
@@ -38,7 +38,6 @@ const GSD_RUNTIME_PATTERNS = [
38
38
  const BASELINE_PATTERNS = [
39
39
  // ── GSD state directory (symlink to external storage) ──
40
40
  ".gsd",
41
- ".gsd-id",
42
41
  // ── OS junk ──
43
42
  ".DS_Store",
44
43
  "Thumbs.db",
@@ -73,38 +72,6 @@ const BASELINE_PATTERNS = [
73
72
  ".cache/",
74
73
  "tmp/",
75
74
  ];
76
- /**
77
- * Check whether `.gsd` is covered by the project's `.gitignore`.
78
- *
79
- * Uses `git check-ignore` for accurate evaluation — this respects nested
80
- * .gitignore files, global gitignore, and negation patterns. Returns true
81
- * only when git would actually ignore `.gsd/`.
82
- *
83
- * Returns false (not ignored) if:
84
- * - No `.gitignore` exists
85
- * - `.gsd` is not listed in any active ignore rule
86
- * - Not a git repo or git is unavailable
87
- */
88
- export function isGsdGitignored(basePath) {
89
- // Check both `.gsd` and `.gsd/` because `.gsd/` in .gitignore (trailing
90
- // slash = directory-only pattern) only matches the directory form. Using
91
- // both paths covers all gitignore pattern variants.
92
- for (const path of [".gsd", ".gsd/"]) {
93
- try {
94
- // git check-ignore exits 0 when the path IS ignored, 1 when it is NOT.
95
- execFileSync("git", ["check-ignore", "-q", path], {
96
- cwd: basePath,
97
- stdio: "pipe",
98
- env: GIT_NO_PROMPT_ENV,
99
- });
100
- return true; // exit 0 → .gsd is ignored
101
- }
102
- catch {
103
- // exit 1 → this form is NOT ignored, try the other
104
- }
105
- }
106
- return false; // neither form is ignored (or git unavailable)
107
- }
108
75
  /**
109
76
  * Check whether `.gsd/` contains files tracked by git.
110
77
  * If so, the project intentionally keeps `.gsd/` in version control