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,7 +9,6 @@ import {
9
9
  closeDatabase,
10
10
  insertMilestone,
11
11
  insertSlice,
12
- insertAssessment,
13
12
  getSlice,
14
13
  getMilestoneSlices,
15
14
  getAssessment,
@@ -324,119 +323,3 @@ test('handleReassessRoadmap returns structured error payloads with actionable me
324
323
  cleanup(base);
325
324
  }
326
325
  });
327
-
328
- // ─── Bug #2957: Stale VALIDATION survives roadmap remediation ────────────
329
-
330
- test('handleReassessRoadmap invalidates stale milestone-validation when roadmap changes (#2957)', async () => {
331
- const base = makeTmpBase();
332
- openDatabase(join(base, '.gsd', 'gsd.db'));
333
-
334
- try {
335
- // Seed: M001 with S01-S04 all complete, plus a stale VALIDATION with needs-remediation
336
- insertMilestone({ id: 'M001', title: 'Test Milestone', status: 'active' });
337
- insertSlice({ id: 'S01', milestoneId: 'M001', title: 'Slice One', status: 'complete', demo: 'Demo' });
338
- insertSlice({ id: 'S02', milestoneId: 'M001', title: 'Slice Two', status: 'complete', demo: 'Demo' });
339
- insertSlice({ id: 'S03', milestoneId: 'M001', title: 'Slice Three', status: 'complete', demo: 'Demo' });
340
- insertSlice({ id: 'S04', milestoneId: 'M001', title: 'Slice Four', status: 'complete', demo: 'Demo' });
341
-
342
- // Insert milestone-validation assessment with needs-remediation verdict (stale)
343
- const validationPath = join('.gsd', 'milestones', 'M001', 'M001-VALIDATION.md');
344
- insertAssessment({
345
- path: validationPath,
346
- milestoneId: 'M001',
347
- sliceId: null,
348
- taskId: null,
349
- status: 'needs-remediation',
350
- scope: 'milestone-validation',
351
- fullContent: '---\nverdict: needs-remediation\nremediation_round: 0\n---\n\n# Validation\nNeeds remediation.',
352
- });
353
-
354
- // Verify the validation row exists before reassess
355
- const adapter = _getAdapter()!;
356
- const before = adapter.prepare(
357
- `SELECT * FROM assessments WHERE milestone_id = 'M001' AND scope = 'milestone-validation'`,
358
- ).get() as Record<string, unknown> | undefined;
359
- assert.ok(before, 'milestone-validation row should exist before reassess');
360
-
361
- // Now reassess the roadmap: add remediation slice S05
362
- // This simulates the scenario from #2957 where validation produced needs-remediation
363
- // and then roadmap was reassessed to add a remediation slice
364
- const result = await handleReassessRoadmap({
365
- milestoneId: 'M001',
366
- completedSliceId: 'S04',
367
- verdict: 'on-track',
368
- assessment: 'S04 completed. Adding remediation slice S05.',
369
- sliceChanges: {
370
- modified: [],
371
- added: [
372
- {
373
- sliceId: 'S05',
374
- title: 'Remediation Slice',
375
- risk: 'low',
376
- depends: ['S04'],
377
- demo: 'Fix the issues found during validation.',
378
- },
379
- ],
380
- removed: [],
381
- },
382
- }, base);
383
-
384
- assert.ok(!('error' in result), `unexpected error: ${'error' in result ? result.error : ''}`);
385
-
386
- // The stale milestone-validation row must be deleted after roadmap changes
387
- const after = adapter.prepare(
388
- `SELECT * FROM assessments WHERE milestone_id = 'M001' AND scope = 'milestone-validation'`,
389
- ).get() as Record<string, unknown> | undefined;
390
- assert.equal(after, undefined, 'milestone-validation row should be deleted after roadmap changes — stale validation must not survive remediation (#2957)');
391
- } finally {
392
- cleanup(base);
393
- }
394
- });
395
-
396
- test('handleReassessRoadmap does NOT invalidate validation when no roadmap structural changes (#2957)', async () => {
397
- const base = makeTmpBase();
398
- openDatabase(join(base, '.gsd', 'gsd.db'));
399
-
400
- try {
401
- // Seed: M001 with slices, plus a validation with pass verdict
402
- insertMilestone({ id: 'M001', title: 'Test Milestone', status: 'active' });
403
- insertSlice({ id: 'S01', milestoneId: 'M001', title: 'Slice One', status: 'complete', demo: 'Demo' });
404
- insertSlice({ id: 'S02', milestoneId: 'M001', title: 'Slice Two', status: 'pending', demo: 'Demo' });
405
-
406
- // Insert milestone-validation assessment with pass verdict
407
- const validationPath = join('.gsd', 'milestones', 'M001', 'M001-VALIDATION.md');
408
- insertAssessment({
409
- path: validationPath,
410
- milestoneId: 'M001',
411
- sliceId: null,
412
- taskId: null,
413
- status: 'pass',
414
- scope: 'milestone-validation',
415
- fullContent: '---\nverdict: pass\nremediation_round: 0\n---\n\n# Validation\nAll good.',
416
- });
417
-
418
- // Reassess with no structural changes (empty added/modified/removed)
419
- const result = await handleReassessRoadmap({
420
- milestoneId: 'M001',
421
- completedSliceId: 'S01',
422
- verdict: 'confirmed',
423
- assessment: 'S01 completed. No changes needed.',
424
- sliceChanges: {
425
- modified: [],
426
- added: [],
427
- removed: [],
428
- },
429
- }, base);
430
-
431
- assert.ok(!('error' in result), `unexpected error: ${'error' in result ? result.error : ''}`);
432
-
433
- // Validation should still exist when no structural changes occurred
434
- const adapter = _getAdapter()!;
435
- const row = adapter.prepare(
436
- `SELECT * FROM assessments WHERE milestone_id = 'M001' AND scope = 'milestone-validation'`,
437
- ).get() as Record<string, unknown> | undefined;
438
- assert.ok(row, 'milestone-validation row should survive when no structural changes occurred');
439
- } finally {
440
- cleanup(base);
441
- }
442
- });
@@ -296,100 +296,3 @@ Do the second thing.
296
296
  assert.equal(slices[0]?.id, "S01");
297
297
  assert.equal(slices[1]?.id, "S02");
298
298
  });
299
-
300
- // ── Regression tests for #2567 ─────────────────────────────────────────────
301
- // Prose H3 parser fails on common LLM-generated patterns: numbered prefixes,
302
- // parenthetical numbering, bracketed IDs, and indented headings.
303
-
304
- test("parseRoadmapSlices: numbered H3 headers under ## Slices (#2567)", () => {
305
- const numberedContent = `# M002: My Milestone
306
-
307
- **Vision:** Ship the product.
308
-
309
- ## Slices
310
-
311
- ### 1. S01: Setup Environment
312
- Set up the dev environment and tooling.
313
-
314
- ### 2. S02: Build Core
315
- Implement the core logic.
316
- **Depends on:** S01
317
-
318
- ### 3. S03: Polish UI
319
- Final polish and theming.
320
- **Depends on:** S01, S02
321
- `;
322
- const slices = parseRoadmapSlices(numberedContent);
323
- assert.equal(slices.length, 3, "should parse 3 slices from numbered H3 headers");
324
- assert.equal(slices[0]?.id, "S01");
325
- assert.equal(slices[0]?.title, "Setup Environment");
326
- assert.equal(slices[1]?.id, "S02");
327
- assert.deepEqual(slices[1]?.depends, ["S01"]);
328
- assert.equal(slices[2]?.id, "S03");
329
- assert.deepEqual(slices[2]?.depends, ["S01", "S02"]);
330
- });
331
-
332
- test("parseRoadmapSlices: parenthetical-numbered H3 headers (#2567)", () => {
333
- const parenContent = `# M002: Milestone
334
-
335
- **Vision:** Ship.
336
-
337
- ## Slices
338
-
339
- ### (1) S01: Setup
340
- Setup work.
341
-
342
- ### (2) S02: Build
343
- Build work.
344
- **Depends on:** S01
345
- `;
346
- const slices = parseRoadmapSlices(parenContent);
347
- assert.equal(slices.length, 2, "should parse slices with parenthetical numbering");
348
- assert.equal(slices[0]?.id, "S01");
349
- assert.equal(slices[0]?.title, "Setup");
350
- assert.equal(slices[1]?.id, "S02");
351
- assert.deepEqual(slices[1]?.depends, ["S01"]);
352
- });
353
-
354
- test("parseRoadmapSlices: bracketed slice IDs in H3 headers (#2567)", () => {
355
- const bracketContent = `# M002: Milestone
356
-
357
- **Vision:** Ship.
358
-
359
- ## Slices
360
-
361
- ### [S01] Setup Environment
362
- Setup work.
363
-
364
- ### [S02] Build Core
365
- Build work.
366
- **Depends on:** S01
367
- `;
368
- const slices = parseRoadmapSlices(bracketContent);
369
- assert.equal(slices.length, 2, "should parse slices with bracketed IDs");
370
- assert.equal(slices[0]?.id, "S01");
371
- assert.equal(slices[0]?.title, "Setup Environment");
372
- assert.equal(slices[1]?.id, "S02");
373
- assert.deepEqual(slices[1]?.depends, ["S01"]);
374
- });
375
-
376
- test("parseRoadmapSlices: indented H3 headers under ## Slices (#2567)", () => {
377
- const indentedContent = `# M002: Milestone
378
-
379
- **Vision:** Ship.
380
-
381
- ## Slices
382
-
383
- ### S01: Setup
384
- Setup work.
385
-
386
- ### S02: Build
387
- Build work.
388
- `;
389
- const slices = parseRoadmapSlices(indentedContent);
390
- assert.equal(slices.length, 2, "should parse slices from indented H3 headers");
391
- assert.equal(slices[0]?.id, "S01");
392
- assert.equal(slices[0]?.title, "Setup");
393
- assert.equal(slices[1]?.id, "S02");
394
- assert.equal(slices[1]?.title, "Build");
395
- });
@@ -183,137 +183,3 @@ test("secure_env_collect: detectDestination — convex file (not dir) does not t
183
183
  rmSync(tmp, { recursive: true, force: true });
184
184
  }
185
185
  });
186
-
187
- // ─── Bug #2997: undefined vs null handling ──────────────────────────────────
188
-
189
- /**
190
- * When ctx.ui.custom() returns undefined (e.g. noOpUIContext, component
191
- * disposal, abort), the strict null checks (=== null / !== null) let
192
- * undefined slip through as a "provided" value, crashing writeEnvKey
193
- * which calls .replace() on it.
194
- *
195
- * These tests verify the fix: loose equality (== null / != null) so that
196
- * both null AND undefined are treated as "skipped".
197
- */
198
-
199
- // Helper to dynamically load the orchestrator
200
- async function loadOrchestrator(): Promise<{
201
- collectSecretsFromManifest: Function;
202
- }> {
203
- const mod = await import("../../get-secrets-from-user.ts");
204
- return { collectSecretsFromManifest: mod.collectSecretsFromManifest };
205
- }
206
-
207
- // Helper to dynamically load files.ts functions
208
- async function loadFilesExports(): Promise<{
209
- formatSecretsManifest: (m: any) => string;
210
- }> {
211
- const mod = await import("../files.ts");
212
- return { formatSecretsManifest: mod.formatSecretsManifest };
213
- }
214
-
215
- function makeManifest(entries: Array<{ key: string; status?: string; formatHint?: string; guidance?: string[] }>): any {
216
- return {
217
- milestone: "M001",
218
- generatedAt: "2026-03-12T00:00:00Z",
219
- entries: entries.map((e) => ({
220
- key: e.key,
221
- service: "TestService",
222
- dashboardUrl: "",
223
- guidance: e.guidance ?? [],
224
- formatHint: e.formatHint ?? "",
225
- status: e.status ?? "pending",
226
- destination: "dotenv",
227
- })),
228
- };
229
- }
230
-
231
- async function writeManifestFile(dir: string, manifest: any): Promise<string> {
232
- const { formatSecretsManifest } = await loadFilesExports();
233
- const milestoneDir = join(dir, ".gsd", "milestones", "M001");
234
- mkdirSync(milestoneDir, { recursive: true });
235
- const filePath = join(milestoneDir, "M001-SECRETS.md");
236
- writeFileSync(filePath, formatSecretsManifest(manifest));
237
- return filePath;
238
- }
239
-
240
- test("secure_env_collect #2997: undefined from ctx.ui.custom() is treated as skipped, not provided", async (t) => {
241
- const { collectSecretsFromManifest } = await loadOrchestrator();
242
-
243
- const tmp = makeTempDir("sec-undefined-test");
244
- t.after(() => {
245
- rmSync(tmp, { recursive: true, force: true });
246
- });
247
-
248
- const manifest = makeManifest([
249
- { key: "SECRET_THAT_RETURNS_UNDEFINED", status: "pending" },
250
- ]);
251
- await writeManifestFile(tmp, manifest);
252
-
253
- let callIndex = 0;
254
- const mockCtx = {
255
- cwd: tmp,
256
- hasUI: true,
257
- ui: {
258
- // First call is summary screen, second is collect — return undefined
259
- // to simulate noOpUIContext or component disposal
260
- custom: async (_factory: any) => {
261
- callIndex++;
262
- if (callIndex <= 1) return null; // summary screen dismiss
263
- return undefined; // BUG TRIGGER: should be treated as skipped
264
- },
265
- },
266
- };
267
-
268
- // Before the fix, this crashes with:
269
- // "Cannot read properties of undefined (reading 'replace')"
270
- const result = await collectSecretsFromManifest(tmp, "M001", mockCtx as any);
271
-
272
- // The undefined-returning key must appear in skipped, not in applied
273
- assert.ok(
274
- result.skipped.includes("SECRET_THAT_RETURNS_UNDEFINED"),
275
- "Key returning undefined should be in skipped list",
276
- );
277
- assert.ok(
278
- !result.applied.includes("SECRET_THAT_RETURNS_UNDEFINED"),
279
- "Key returning undefined must NOT be in applied list",
280
- );
281
- });
282
-
283
- test("secure_env_collect #2997: null from ctx.ui.custom() is still treated as skipped (regression guard)", async (t) => {
284
- const { collectSecretsFromManifest } = await loadOrchestrator();
285
-
286
- const tmp = makeTempDir("sec-null-test");
287
- t.after(() => {
288
- rmSync(tmp, { recursive: true, force: true });
289
- });
290
-
291
- const manifest = makeManifest([
292
- { key: "SECRET_THAT_RETURNS_NULL", status: "pending" },
293
- ]);
294
- await writeManifestFile(tmp, manifest);
295
-
296
- let callIndex = 0;
297
- const mockCtx = {
298
- cwd: tmp,
299
- hasUI: true,
300
- ui: {
301
- custom: async (_factory: any) => {
302
- callIndex++;
303
- if (callIndex <= 1) return null; // summary screen dismiss
304
- return null; // explicit null skip
305
- },
306
- },
307
- };
308
-
309
- const result = await collectSecretsFromManifest(tmp, "M001", mockCtx as any);
310
-
311
- assert.ok(
312
- result.skipped.includes("SECRET_THAT_RETURNS_NULL"),
313
- "Key returning null should be in skipped list",
314
- );
315
- assert.ok(
316
- !result.applied.includes("SECRET_THAT_RETURNS_NULL"),
317
- "Key returning null must NOT be in applied list",
318
- );
319
- });
@@ -24,7 +24,6 @@ function makeMockPi() {
24
24
  const RENAME_MAP: Array<{ canonical: string; alias: string }> = [
25
25
  { canonical: "gsd_decision_save", alias: "gsd_save_decision" },
26
26
  { canonical: "gsd_requirement_update", alias: "gsd_update_requirement" },
27
- { canonical: "gsd_requirement_save", alias: "gsd_save_requirement" },
28
27
  { canonical: "gsd_summary_save", alias: "gsd_save_summary" },
29
28
  { canonical: "gsd_milestone_generate_id", alias: "gsd_generate_milestone_id" },
30
29
  { canonical: "gsd_task_complete", alias: "gsd_complete_task" },
@@ -45,7 +44,7 @@ console.log('\n── Tool naming: registration count ──');
45
44
  const pi = makeMockPi();
46
45
  registerDbTools(pi);
47
46
 
48
- assert.deepStrictEqual(pi.tools.length, 29, 'Should register exactly 29 tools (14 canonical + 14 aliases + 1 gate tool)');
47
+ assert.deepStrictEqual(pi.tools.length, 27, 'Should register exactly 27 tools (13 canonical + 13 aliases + 1 gate tool)');
49
48
 
50
49
  // ─── Both names exist for each pair ──────────────────────────────────────────
51
50
 
@@ -212,14 +212,6 @@ test("resolution: buildQuickTaskPrompt includes capture text and ID", () => {
212
212
  assert.ok(prompt.includes("add retry logic to OAuth"), "should include capture text");
213
213
  assert.ok(prompt.includes("Quick Task"), "should have Quick Task header");
214
214
  assert.ok(prompt.includes("Do NOT modify"), "should warn about plan files");
215
- assert.ok(
216
- prompt.includes("Verify the issue still exists"),
217
- "should instruct agent to verify issue still exists (#2872)",
218
- );
219
- assert.ok(
220
- prompt.includes("Already resolved"),
221
- "should instruct agent to report already resolved if fixed (#2872)",
222
- );
223
215
  });
224
216
 
225
217
  // ─── markCaptureExecuted ─────────────────────────────────────────────────────
@@ -3,7 +3,7 @@
3
3
 
4
4
  import test from 'node:test';
5
5
  import assert from 'node:assert/strict';
6
- import { mkdtempSync, rmSync } from 'node:fs';
6
+ import { mkdtempSync, rmSync, existsSync, readFileSync } from 'node:fs';
7
7
  import { join } from 'node:path';
8
8
  import { tmpdir } from 'node:os';
9
9
 
@@ -14,8 +14,6 @@ import {
14
14
  checkOwnership,
15
15
  taskUnitKey,
16
16
  sliceUnitKey,
17
- initOwnershipTable,
18
- closeOwnershipDb,
19
17
  } from '../unit-ownership.ts';
20
18
 
21
19
  function makeTmpBase(): string {
@@ -36,51 +34,28 @@ test('sliceUnitKey: builds correct key', () => {
36
34
  assert.equal(sliceUnitKey('M001', 'S01'), 'M001/S01');
37
35
  });
38
36
 
39
- // ─── Claim / get / release (SQLite-backed) ──────────────────────────────
37
+ // ─── Claim / get / release ───────────────────────────────────────────────
40
38
 
41
- test('claimUnit: creates DB and records agent', () => {
39
+ test('claimUnit: creates claim file and records agent', () => {
42
40
  const base = makeTmpBase();
43
41
  try {
44
- initOwnershipTable(base);
45
- const claimed = claimUnit(base, 'M001/S01/T01', 'executor-01');
42
+ claimUnit(base, 'M001/S01/T01', 'executor-01');
46
43
 
47
- assert.equal(claimed, true, 'first claim should succeed');
44
+ assert.ok(existsSync(join(base, '.gsd', 'unit-claims.json')), 'claim file should exist');
48
45
  assert.equal(getOwner(base, 'M001/S01/T01'), 'executor-01');
49
46
  } finally {
50
- closeOwnershipDb(base);
51
47
  cleanup(base);
52
48
  }
53
49
  });
54
50
 
55
- test('claimUnit: rejects second claim on same unit (first-writer-wins)', () => {
51
+ test('claimUnit: overwrites existing claim (last writer wins)', () => {
56
52
  const base = makeTmpBase();
57
53
  try {
58
- initOwnershipTable(base);
59
- const first = claimUnit(base, 'M001/S01/T01', 'executor-01');
60
- const second = claimUnit(base, 'M001/S01/T01', 'executor-02');
54
+ claimUnit(base, 'M001/S01/T01', 'executor-01');
55
+ claimUnit(base, 'M001/S01/T01', 'executor-02');
61
56
 
62
- assert.equal(first, true, 'first claim should succeed');
63
- assert.equal(second, false, 'second claim should fail (first-writer-wins)');
64
- assert.equal(getOwner(base, 'M001/S01/T01'), 'executor-01',
65
- 'original owner must be preserved');
57
+ assert.equal(getOwner(base, 'M001/S01/T01'), 'executor-02');
66
58
  } finally {
67
- closeOwnershipDb(base);
68
- cleanup(base);
69
- }
70
- });
71
-
72
- test('claimUnit: same agent re-claiming same unit succeeds', () => {
73
- const base = makeTmpBase();
74
- try {
75
- initOwnershipTable(base);
76
- const first = claimUnit(base, 'M001/S01/T01', 'agent-a');
77
- const second = claimUnit(base, 'M001/S01/T01', 'agent-a');
78
-
79
- assert.equal(first, true);
80
- assert.equal(second, true, 're-claim by same agent should succeed');
81
- assert.equal(getOwner(base, 'M001/S01/T01'), 'agent-a');
82
- } finally {
83
- closeOwnershipDb(base);
84
59
  cleanup(base);
85
60
  }
86
61
  });
@@ -88,25 +63,21 @@ test('claimUnit: same agent re-claiming same unit succeeds', () => {
88
63
  test('claimUnit: multiple units can be claimed independently', () => {
89
64
  const base = makeTmpBase();
90
65
  try {
91
- initOwnershipTable(base);
92
66
  claimUnit(base, 'M001/S01/T01', 'agent-a');
93
67
  claimUnit(base, 'M001/S01/T02', 'agent-b');
94
68
 
95
69
  assert.equal(getOwner(base, 'M001/S01/T01'), 'agent-a');
96
70
  assert.equal(getOwner(base, 'M001/S01/T02'), 'agent-b');
97
71
  } finally {
98
- closeOwnershipDb(base);
99
72
  cleanup(base);
100
73
  }
101
74
  });
102
75
 
103
- test('getOwner: returns null when no DB initialized', () => {
76
+ test('getOwner: returns null when no claim file exists', () => {
104
77
  const base = makeTmpBase();
105
78
  try {
106
- initOwnershipTable(base);
107
79
  assert.equal(getOwner(base, 'M001/S01/T01'), null);
108
80
  } finally {
109
- closeOwnershipDb(base);
110
81
  cleanup(base);
111
82
  }
112
83
  });
@@ -114,11 +85,9 @@ test('getOwner: returns null when no DB initialized', () => {
114
85
  test('getOwner: returns null for unclaimed unit', () => {
115
86
  const base = makeTmpBase();
116
87
  try {
117
- initOwnershipTable(base);
118
88
  claimUnit(base, 'M001/S01/T01', 'agent-a');
119
89
  assert.equal(getOwner(base, 'M001/S01/T99'), null);
120
90
  } finally {
121
- closeOwnershipDb(base);
122
91
  cleanup(base);
123
92
  }
124
93
  });
@@ -126,13 +95,11 @@ test('getOwner: returns null for unclaimed unit', () => {
126
95
  test('releaseUnit: removes claim', () => {
127
96
  const base = makeTmpBase();
128
97
  try {
129
- initOwnershipTable(base);
130
98
  claimUnit(base, 'M001/S01/T01', 'agent-a');
131
99
  releaseUnit(base, 'M001/S01/T01');
132
100
 
133
101
  assert.equal(getOwner(base, 'M001/S01/T01'), null);
134
102
  } finally {
135
- closeOwnershipDb(base);
136
103
  cleanup(base);
137
104
  }
138
105
  });
@@ -140,43 +107,32 @@ test('releaseUnit: removes claim', () => {
140
107
  test('releaseUnit: no-op for non-existent claim', () => {
141
108
  const base = makeTmpBase();
142
109
  try {
143
- initOwnershipTable(base);
144
110
  // Should not throw
145
111
  releaseUnit(base, 'M001/S01/T01');
146
112
  } finally {
147
- closeOwnershipDb(base);
148
113
  cleanup(base);
149
114
  }
150
115
  });
151
116
 
152
- test('releaseUnit: allows reclaim after release', () => {
117
+ // ─── checkOwnership ──────────────────────────────────────────────────────
118
+
119
+ test('checkOwnership: returns null when no actorName provided (opt-in)', () => {
153
120
  const base = makeTmpBase();
154
121
  try {
155
- initOwnershipTable(base);
156
122
  claimUnit(base, 'M001/S01/T01', 'agent-a');
157
- releaseUnit(base, 'M001/S01/T01');
158
123
 
159
- const reclaimed = claimUnit(base, 'M001/S01/T01', 'agent-b');
160
- assert.equal(reclaimed, true, 'reclaim after release should succeed');
161
- assert.equal(getOwner(base, 'M001/S01/T01'), 'agent-b');
124
+ // No actorName ownership not enforced
125
+ assert.equal(checkOwnership(base, 'M001/S01/T01', undefined), null);
162
126
  } finally {
163
- closeOwnershipDb(base);
164
127
  cleanup(base);
165
128
  }
166
129
  });
167
130
 
168
- // ─── checkOwnership ──────────────────────────────────────────────────────
169
-
170
- test('checkOwnership: returns null when no actorName provided (opt-in)', () => {
131
+ test('checkOwnership: returns null when no claim file exists', () => {
171
132
  const base = makeTmpBase();
172
133
  try {
173
- initOwnershipTable(base);
174
- claimUnit(base, 'M001/S01/T01', 'agent-a');
175
-
176
- // No actorName → ownership not enforced
177
- assert.equal(checkOwnership(base, 'M001/S01/T01', undefined), null);
134
+ assert.equal(checkOwnership(base, 'M001/S01/T01', 'agent-a'), null);
178
135
  } finally {
179
- closeOwnershipDb(base);
180
136
  cleanup(base);
181
137
  }
182
138
  });
@@ -184,13 +140,11 @@ test('checkOwnership: returns null when no actorName provided (opt-in)', () => {
184
140
  test('checkOwnership: returns null when unit is unclaimed', () => {
185
141
  const base = makeTmpBase();
186
142
  try {
187
- initOwnershipTable(base);
188
143
  claimUnit(base, 'M001/S01/T01', 'agent-a');
189
144
 
190
145
  // Different unit, unclaimed
191
146
  assert.equal(checkOwnership(base, 'M001/S01/T99', 'agent-b'), null);
192
147
  } finally {
193
- closeOwnershipDb(base);
194
148
  cleanup(base);
195
149
  }
196
150
  });
@@ -198,12 +152,10 @@ test('checkOwnership: returns null when unit is unclaimed', () => {
198
152
  test('checkOwnership: returns null when actor matches owner', () => {
199
153
  const base = makeTmpBase();
200
154
  try {
201
- initOwnershipTable(base);
202
155
  claimUnit(base, 'M001/S01/T01', 'agent-a');
203
156
 
204
157
  assert.equal(checkOwnership(base, 'M001/S01/T01', 'agent-a'), null);
205
158
  } finally {
206
- closeOwnershipDb(base);
207
159
  cleanup(base);
208
160
  }
209
161
  });
@@ -211,7 +163,6 @@ test('checkOwnership: returns null when actor matches owner', () => {
211
163
  test('checkOwnership: returns error string when actor does not match owner', () => {
212
164
  const base = makeTmpBase();
213
165
  try {
214
- initOwnershipTable(base);
215
166
  claimUnit(base, 'M001/S01/T01', 'agent-a');
216
167
 
217
168
  const err = checkOwnership(base, 'M001/S01/T01', 'agent-b');
@@ -219,40 +170,6 @@ test('checkOwnership: returns error string when actor does not match owner', ()
219
170
  assert.match(err!, /owned by agent-a/);
220
171
  assert.match(err!, /not agent-b/);
221
172
  } finally {
222
- closeOwnershipDb(base);
223
- cleanup(base);
224
- }
225
- });
226
-
227
- // ─── Race condition: first-writer-wins atomicity ─────────────────────────
228
-
229
- test('claimUnit: concurrent claims — only first writer wins (no lost update)', () => {
230
- const base = makeTmpBase();
231
- try {
232
- initOwnershipTable(base);
233
-
234
- // Simulate the race described in #2728:
235
- // Two agents both try to claim the same unit.
236
- // With SQLite INSERT OR IGNORE, only the first succeeds.
237
- const results: boolean[] = [];
238
- const agents = ['agent-alpha', 'agent-beta', 'agent-gamma'];
239
- for (const agent of agents) {
240
- results.push(claimUnit(base, 'M001/S01/T01', agent));
241
- }
242
-
243
- // Exactly one agent should have won
244
- const wins = results.filter(r => r === true);
245
- assert.equal(wins.length, 1, 'exactly one agent should win the claim');
246
-
247
- // The winner is the first agent (deterministic in single-threaded)
248
- assert.equal(results[0], true);
249
- assert.equal(results[1], false);
250
- assert.equal(results[2], false);
251
-
252
- // The owner must be the first agent
253
- assert.equal(getOwner(base, 'M001/S01/T01'), 'agent-alpha');
254
- } finally {
255
- closeOwnershipDb(base);
256
173
  cleanup(base);
257
174
  }
258
175
  });
@@ -6,7 +6,7 @@ import { tmpdir } from "node:os";
6
6
  import { randomUUID } from "node:crypto";
7
7
 
8
8
  import { handleValidateMilestone } from "../tools/validate-milestone.js";
9
- import { openDatabase, closeDatabase, _getAdapter, insertMilestone, insertSlice } from "../gsd-db.js";
9
+ import { openDatabase, closeDatabase, _getAdapter, insertMilestone } from "../gsd-db.js";
10
10
  import { clearPathCache } from "../paths.js";
11
11
  import { clearParseCache } from "../files.js";
12
12
 
@@ -45,7 +45,6 @@ describe("handleValidateMilestone write ordering (#2725)", () => {
45
45
  const dbPath = join(base, ".gsd", "gsd.db");
46
46
  openDatabase(dbPath);
47
47
  insertMilestone({ id: "M001" });
48
- insertSlice({ id: "S01", milestoneId: "M001" });
49
48
 
50
49
  const result = await handleValidateMilestone(VALID_PARAMS, base);
51
50
  assert.ok(!("error" in result), `unexpected error: ${"error" in result ? result.error : ""}`);
@@ -72,7 +71,6 @@ describe("handleValidateMilestone write ordering (#2725)", () => {
72
71
  const dbPath = join(base, ".gsd", "gsd.db");
73
72
  openDatabase(dbPath);
74
73
  insertMilestone({ id: "M001" });
75
- insertSlice({ id: "S01", milestoneId: "M001" });
76
74
 
77
75
  const result = await handleValidateMilestone(
78
76
  { ...VALID_PARAMS, verificationClasses: undefined },
@@ -90,7 +88,6 @@ describe("handleValidateMilestone write ordering (#2725)", () => {
90
88
  const dbPath = join(base, ".gsd", "gsd.db");
91
89
  openDatabase(dbPath);
92
90
  insertMilestone({ id: "M001" });
93
- insertSlice({ id: "S01", milestoneId: "M001" });
94
91
 
95
92
  // Force disk write failure by replacing the milestone directory with a
96
93
  // regular file. saveFile() will fail because it cannot write inside a