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
@@ -1,157 +0,0 @@
1
- /**
2
- * Unit tests for the queue-mode execution guard (#2545).
3
- *
4
- * When queue phase is active, the agent should only create milestones —
5
- * not execute work. This guard blocks write/edit/bash tool calls that
6
- * target source code (non-.gsd/ paths) during queue mode.
7
- *
8
- * Exercises shouldBlockQueueExecution() — a pure function that checks:
9
- * (a) queuePhaseActive false → pass (not in queue mode)
10
- * (b) toolName is read-only (read, grep, find, ls) → pass
11
- * (c) toolName is ask_user_questions → pass (discussion tool)
12
- * (d) write/edit to .gsd/ path → pass (planning artifacts)
13
- * (e) write/edit to source path → block
14
- * (f) bash command → block (could execute work)
15
- * (g) registered GSD tools (gsd_milestone_generate_id, gsd_summary_save) → pass
16
- */
17
-
18
- import test from 'node:test';
19
- import assert from 'node:assert/strict';
20
- import { shouldBlockQueueExecution } from '../bootstrap/write-gate.ts';
21
-
22
- // ─── Scenario 1: Not in queue mode — all tools pass ──
23
-
24
- test('queue-guard: allows all tools when queue phase is not active', () => {
25
- const r1 = shouldBlockQueueExecution('write', '/src/index.ts', false);
26
- assert.strictEqual(r1.block, false, 'write should pass outside queue mode');
27
-
28
- const r2 = shouldBlockQueueExecution('bash', 'npm test', false);
29
- assert.strictEqual(r2.block, false, 'bash should pass outside queue mode');
30
-
31
- const r3 = shouldBlockQueueExecution('edit', '/src/index.ts', false);
32
- assert.strictEqual(r3.block, false, 'edit should pass outside queue mode');
33
- });
34
-
35
- // ─── Scenario 2: Read-only tools always pass in queue mode ──
36
-
37
- test('queue-guard: allows read-only tools during queue mode', () => {
38
- for (const tool of ['read', 'grep', 'find', 'ls', 'glob']) {
39
- const result = shouldBlockQueueExecution(tool, '/src/index.ts', true);
40
- assert.strictEqual(result.block, false, `${tool} should pass in queue mode`);
41
- }
42
- });
43
-
44
- // ─── Scenario 3: Discussion/planning tools pass in queue mode ──
45
-
46
- test('queue-guard: allows discussion and planning tools during queue mode', () => {
47
- const r1 = shouldBlockQueueExecution('ask_user_questions', '', true);
48
- assert.strictEqual(r1.block, false, 'ask_user_questions should pass');
49
-
50
- const r2 = shouldBlockQueueExecution('gsd_milestone_generate_id', '', true);
51
- assert.strictEqual(r2.block, false, 'gsd_milestone_generate_id should pass');
52
-
53
- const r3 = shouldBlockQueueExecution('gsd_summary_save', '', true);
54
- assert.strictEqual(r3.block, false, 'gsd_summary_save should pass');
55
- });
56
-
57
- // ─── Scenario 4: Write to .gsd/ paths passes (planning artifacts) ──
58
-
59
- test('queue-guard: allows writes to .gsd/ paths during queue mode', () => {
60
- const r1 = shouldBlockQueueExecution('write', '.gsd/milestones/M001/M001-CONTEXT.md', true);
61
- assert.strictEqual(r1.block, false, 'write to .gsd/ should pass');
62
-
63
- const r2 = shouldBlockQueueExecution('write', '/project/.gsd/PROJECT.md', true);
64
- assert.strictEqual(r2.block, false, 'write to .gsd/PROJECT.md should pass');
65
-
66
- const r3 = shouldBlockQueueExecution('edit', '.gsd/QUEUE.md', true);
67
- assert.strictEqual(r3.block, false, 'edit to .gsd/QUEUE.md should pass');
68
-
69
- const r4 = shouldBlockQueueExecution('write', '.gsd/REQUIREMENTS.md', true);
70
- assert.strictEqual(r4.block, false, 'write to .gsd/REQUIREMENTS.md should pass');
71
-
72
- const r5 = shouldBlockQueueExecution('write', '.gsd/DECISIONS.md', true);
73
- assert.strictEqual(r5.block, false, 'write to .gsd/DECISIONS.md should pass');
74
- });
75
-
76
- // ─── Scenario 5: Write/edit to source code paths blocked ──
77
-
78
- test('queue-guard: blocks writes to source code during queue mode', () => {
79
- const r1 = shouldBlockQueueExecution('write', 'src/index.ts', true);
80
- assert.strictEqual(r1.block, true, 'write to src/ should be blocked');
81
- assert.ok(r1.reason, 'should provide a reason');
82
- assert.ok(r1.reason!.includes('queue'), 'reason should mention queue');
83
-
84
- const r2 = shouldBlockQueueExecution('write', '/project/src/components/App.tsx', true);
85
- assert.strictEqual(r2.block, true, 'write to component file should be blocked');
86
-
87
- const r3 = shouldBlockQueueExecution('edit', 'package.json', true);
88
- assert.strictEqual(r3.block, true, 'edit to package.json should be blocked');
89
-
90
- const r4 = shouldBlockQueueExecution('edit', '/project/lib/utils.ts', true);
91
- assert.strictEqual(r4.block, true, 'edit to lib/ should be blocked');
92
- });
93
-
94
- // ─── Scenario 6: Bash commands blocked during queue mode ──
95
-
96
- test('queue-guard: blocks bash commands during queue mode', () => {
97
- const r1 = shouldBlockQueueExecution('bash', 'npm install some-package', true);
98
- assert.strictEqual(r1.block, true, 'npm install should be blocked');
99
- assert.ok(r1.reason, 'should provide a reason');
100
-
101
- const r2 = shouldBlockQueueExecution('bash', 'node src/index.ts', true);
102
- assert.strictEqual(r2.block, true, 'running node should be blocked');
103
- });
104
-
105
- // ─── Scenario 7: Bash read-only commands pass during queue mode ──
106
-
107
- test('queue-guard: allows read-only bash commands during queue mode', () => {
108
- const r1 = shouldBlockQueueExecution('bash', 'cat src/index.ts', true);
109
- assert.strictEqual(r1.block, false, 'cat should pass');
110
-
111
- const r2 = shouldBlockQueueExecution('bash', 'ls -la src/', true);
112
- assert.strictEqual(r2.block, false, 'ls should pass');
113
-
114
- const r3 = shouldBlockQueueExecution('bash', 'git log --oneline -10', true);
115
- assert.strictEqual(r3.block, false, 'git log should pass');
116
-
117
- const r4 = shouldBlockQueueExecution('bash', 'find . -name "*.ts"', true);
118
- assert.strictEqual(r4.block, false, 'find should pass');
119
-
120
- const r5 = shouldBlockQueueExecution('bash', 'grep -rn "TODO" src/', true);
121
- assert.strictEqual(r5.block, false, 'grep should pass');
122
-
123
- const r6 = shouldBlockQueueExecution('bash', 'head -20 src/index.ts', true);
124
- assert.strictEqual(r6.block, false, 'head should pass');
125
-
126
- const r7 = shouldBlockQueueExecution('bash', 'wc -l src/index.ts', true);
127
- assert.strictEqual(r7.block, false, 'wc should pass');
128
-
129
- const r8 = shouldBlockQueueExecution('bash', 'git diff HEAD~1', true);
130
- assert.strictEqual(r8.block, false, 'git diff should pass');
131
-
132
- const r9 = shouldBlockQueueExecution('bash', 'gh issue view 42', true);
133
- assert.strictEqual(r9.block, false, 'gh issue view should pass');
134
- });
135
-
136
- // ─── Scenario 8: mkdir for .gsd/ milestone directories passes ──
137
-
138
- test('queue-guard: allows mkdir for .gsd/ milestone directories', () => {
139
- const r1 = shouldBlockQueueExecution('bash', 'mkdir -p .gsd/milestones/M010/slices', true);
140
- assert.strictEqual(r1.block, false, 'mkdir -p .gsd/ should pass');
141
- });
142
-
143
- // ─── Scenario 9: Web search and library tools pass ──
144
-
145
- test('queue-guard: allows web search and library tools during queue mode', () => {
146
- const r1 = shouldBlockQueueExecution('search-the-web', '', true);
147
- assert.strictEqual(r1.block, false, 'search-the-web should pass');
148
-
149
- const r2 = shouldBlockQueueExecution('resolve_library', '', true);
150
- assert.strictEqual(r2.block, false, 'resolve_library should pass');
151
-
152
- const r3 = shouldBlockQueueExecution('get_library_docs', '', true);
153
- assert.strictEqual(r3.block, false, 'get_library_docs should pass');
154
-
155
- const r4 = shouldBlockQueueExecution('fetch_page', '', true);
156
- assert.strictEqual(r4.block, false, 'fetch_page should pass');
157
- });
@@ -1,90 +0,0 @@
1
- /**
2
- * Tests that cleanupQuickBranch is called on turn_end to squash-merge the
3
- * quick branch back to the original branch after the agent completes.
4
- *
5
- * Relates to #2668: /gsd quick does not squash-merge branch back after agent
6
- * completes task. cleanupQuickBranch() exists but is never invoked.
7
- *
8
- * The fix registers a turn_end hook in register-hooks.ts that calls
9
- * cleanupQuickBranch() after each turn, which is a no-op when no quick-task
10
- * state is pending.
11
- */
12
-
13
- import { describe, it } from "node:test";
14
- import assert from "node:assert/strict";
15
- import { readFileSync } from "node:fs";
16
- import { join } from "node:path";
17
-
18
- // ─── Structural test: verify turn_end hook exists in register-hooks.ts ──────
19
-
20
- describe("quick task turn_end cleanup (#2668)", () => {
21
- const hooksSource = readFileSync(
22
- join(import.meta.dirname, "..", "bootstrap", "register-hooks.ts"),
23
- "utf-8",
24
- );
25
-
26
- it("register-hooks.ts imports cleanupQuickBranch from quick.ts", () => {
27
- assert.ok(
28
- hooksSource.includes("cleanupQuickBranch"),
29
- "register-hooks.ts must reference cleanupQuickBranch",
30
- );
31
-
32
- // Verify it's imported (not just mentioned in a comment)
33
- const importMatch = hooksSource.match(
34
- /import\s*\{[^}]*cleanupQuickBranch[^}]*\}\s*from\s*["'][^"']*quick/,
35
- );
36
- assert.ok(
37
- importMatch,
38
- "cleanupQuickBranch must be imported from quick module",
39
- );
40
- });
41
-
42
- it("registers a turn_end handler that calls cleanupQuickBranch", () => {
43
- // Find the turn_end registration
44
- const turnEndMatch = hooksSource.match(
45
- /pi\.on\(\s*["']turn_end["']/,
46
- );
47
- assert.ok(
48
- turnEndMatch,
49
- "register-hooks.ts must register a turn_end handler",
50
- );
51
-
52
- // Extract the turn_end handler body — find everything from the pi.on("turn_end"
53
- // to the matching closing });
54
- const turnEndIdx = hooksSource.indexOf(turnEndMatch[0]);
55
- assert.ok(turnEndIdx !== -1);
56
-
57
- // Get the rest of the source from that point
58
- const rest = hooksSource.slice(turnEndIdx);
59
-
60
- // The handler must call cleanupQuickBranch
61
- // Look for cleanupQuickBranch within the first handler body (up to first `});`)
62
- const handlerEnd = rest.indexOf("});");
63
- assert.ok(handlerEnd !== -1, "turn_end handler has a closing });");
64
-
65
- const handlerBody = rest.slice(0, handlerEnd);
66
- assert.ok(
67
- handlerBody.includes("cleanupQuickBranch"),
68
- "turn_end handler must call cleanupQuickBranch",
69
- );
70
- });
71
-
72
- it("turn_end handler calls cleanupQuickBranch without arguments (uses cwd default)", () => {
73
- // cleanupQuickBranch(basePath = process.cwd()) — calling without args is correct
74
- // because the handler runs in the same process where handleQuick set up cwd
75
- const turnEndIdx = hooksSource.indexOf('pi.on("turn_end"') !== -1
76
- ? hooksSource.indexOf('pi.on("turn_end"')
77
- : hooksSource.indexOf("pi.on('turn_end'");
78
- assert.ok(turnEndIdx !== -1);
79
-
80
- const rest = hooksSource.slice(turnEndIdx);
81
- const handlerEnd = rest.indexOf("});");
82
- const handlerBody = rest.slice(0, handlerEnd);
83
-
84
- // Should call cleanupQuickBranch() — either bare or with no-arg form
85
- assert.ok(
86
- handlerBody.includes("cleanupQuickBranch("),
87
- "turn_end handler invokes cleanupQuickBranch()",
88
- );
89
- });
90
- });
@@ -1,162 +0,0 @@
1
- // GSD State Machine Regression Tests — Event Replay & Reconciliation (#3161)
2
-
3
- import { describe, test, afterEach } from "node:test";
4
- import assert from "node:assert/strict";
5
- import { createHash } from "node:crypto";
6
- import * as fs from "node:fs";
7
- import * as path from "node:path";
8
- import * as os from "node:os";
9
- import { findForkPoint, readEvents, appendEvent } from "../workflow-events.ts";
10
- import type { WorkflowEvent } from "../workflow-events.ts";
11
- import { extractEntityKey, detectConflicts } from "../workflow-reconcile.ts";
12
-
13
- // ─── Helper: build a full WorkflowEvent from cmd + params ────────────────────
14
-
15
- function makeEvent(cmd: string, params: Record<string, unknown>, ts?: string): WorkflowEvent {
16
- const hash = createHash("sha256")
17
- .update(JSON.stringify({ cmd, params }))
18
- .digest("hex")
19
- .slice(0, 16);
20
- return { cmd, params, ts: ts ?? new Date().toISOString(), hash, actor: "agent", session_id: "test-session" };
21
- }
22
-
23
- // ─── Temp dir management ─────────────────────────────────────────────────────
24
-
25
- const tempDirs: string[] = [];
26
-
27
- function tempDir(): string {
28
- const dir = fs.mkdtempSync(path.join(os.tmpdir(), "gsd-recon-test-"));
29
- tempDirs.push(dir);
30
- return dir;
31
- }
32
-
33
- afterEach(() => {
34
- for (const dir of tempDirs.splice(0)) {
35
- try { fs.rmSync(dir, { recursive: true, force: true }); } catch { /* best effort */ }
36
- }
37
- });
38
-
39
- // ─── Tests ────────────────────────────────────────────────────────────────────
40
-
41
- describe("reconciliation-edge-cases", () => {
42
-
43
- // findForkPoint
44
- test("findForkPoint returns -1 for completely diverged logs", () => {
45
- const eA = makeEvent("complete_task", { milestoneId: "M001", sliceId: "S01", taskId: "T01" });
46
- const eB = makeEvent("complete_task", { milestoneId: "M001", sliceId: "S01", taskId: "T02" });
47
-
48
- const logA: WorkflowEvent[] = [eA];
49
- const logB: WorkflowEvent[] = [eB];
50
-
51
- assert.equal(findForkPoint(logA, logB), -1, "completely diverged logs should return -1");
52
- });
53
-
54
- test("findForkPoint returns last index when one log is prefix of another", () => {
55
- const e1 = makeEvent("start_task", { milestoneId: "M001", sliceId: "S01", taskId: "T01" });
56
- const e2 = makeEvent("complete_task", { milestoneId: "M001", sliceId: "S01", taskId: "T01" });
57
- const e3 = makeEvent("complete_slice", { milestoneId: "M001", sliceId: "S01" });
58
-
59
- const logA: WorkflowEvent[] = [e1, e2];
60
- const logB: WorkflowEvent[] = [e1, e2, e3];
61
-
62
- assert.equal(findForkPoint(logA, logB), 1, "prefix log should fork at last shared index");
63
- });
64
-
65
- test("findForkPoint returns -1 for empty logs", () => {
66
- assert.equal(findForkPoint([], []), -1, "two empty logs should return -1");
67
- });
68
-
69
- // extractEntityKey
70
- test("extractEntityKey returns null for malformed events (missing taskId)", () => {
71
- const event = makeEvent("complete_task", {});
72
- // params has no taskId — should return null rather than return a bad key
73
- assert.equal(extractEntityKey(event), null, "missing taskId should yield null entity key");
74
- });
75
-
76
- test("extractEntityKey returns null for unknown commands", () => {
77
- const event = makeEvent("future_cmd", { foo: "bar" });
78
- assert.equal(extractEntityKey(event), null, "unknown command should yield null entity key");
79
- });
80
-
81
- test("plan_slice and complete_slice use different entity types", () => {
82
- const planEvent = makeEvent("plan_slice", { sliceId: "S01" });
83
- const completeEvent = makeEvent("complete_slice", { sliceId: "S01" });
84
-
85
- const planKey = extractEntityKey(planEvent);
86
- const completeKey = extractEntityKey(completeEvent);
87
-
88
- assert.ok(planKey !== null, "plan_slice should produce an entity key");
89
- assert.ok(completeKey !== null, "complete_slice should produce an entity key");
90
- assert.equal(planKey!.type, "slice_plan", "plan_slice entity type should be 'slice_plan'");
91
- assert.equal(completeKey!.type, "slice", "complete_slice entity type should be 'slice'");
92
- assert.notEqual(
93
- planKey!.type,
94
- completeKey!.type,
95
- "plan_slice and complete_slice must map to different entity types",
96
- );
97
- });
98
-
99
- // detectConflicts
100
- test("detectConflicts finds no conflicts when entities do not overlap", () => {
101
- const mainDiverged: WorkflowEvent[] = [
102
- makeEvent("complete_task", { milestoneId: "M001", sliceId: "S01", taskId: "T01" }),
103
- ];
104
- const wtDiverged: WorkflowEvent[] = [
105
- makeEvent("complete_task", { milestoneId: "M001", sliceId: "S01", taskId: "T02" }),
106
- ];
107
-
108
- const conflicts = detectConflicts(mainDiverged, wtDiverged);
109
- assert.equal(conflicts.length, 0, "non-overlapping task edits should produce no conflicts");
110
- });
111
-
112
- test("detectConflicts flags conflict when both sides touch the same task", () => {
113
- const mainDiverged: WorkflowEvent[] = [
114
- makeEvent("start_task", { milestoneId: "M001", sliceId: "S01", taskId: "T01" }),
115
- ];
116
- const wtDiverged: WorkflowEvent[] = [
117
- makeEvent("complete_task", { milestoneId: "M001", sliceId: "S01", taskId: "T01" }),
118
- ];
119
-
120
- const conflicts = detectConflicts(mainDiverged, wtDiverged);
121
- assert.equal(conflicts.length, 1, "same task touched by both sides should produce exactly one conflict");
122
-
123
- const conflict = conflicts[0]!;
124
- assert.equal(conflict.entityType, "task", "conflict entityType should be 'task'");
125
- assert.equal(conflict.entityId, "T01", "conflict entityId should be 'T01'");
126
- });
127
-
128
- test("detectConflicts ignores events with null entity keys", () => {
129
- // Events with unknown commands produce null keys and must not cause false conflicts.
130
- const mainDiverged: WorkflowEvent[] = [
131
- makeEvent("unknown_future_cmd", { milestoneId: "M001" }),
132
- ];
133
- const wtDiverged: WorkflowEvent[] = [
134
- makeEvent("another_unknown_cmd", { milestoneId: "M001" }),
135
- ];
136
-
137
- const conflicts = detectConflicts(mainDiverged, wtDiverged);
138
- assert.equal(conflicts.length, 0, "unknown commands with null entity keys should not produce conflicts");
139
- });
140
-
141
- // appendEvent — filesystem creation
142
- test("appendEvent creates event log if directory does not exist", () => {
143
- const base = tempDir();
144
- // Remove the .gsd directory if it somehow exists — appendEvent should create it.
145
- const gsdDir = path.join(base, ".gsd");
146
- if (fs.existsSync(gsdDir)) fs.rmSync(gsdDir, { recursive: true, force: true });
147
-
148
- appendEvent(base, {
149
- cmd: "complete_task",
150
- params: { milestoneId: "M001", sliceId: "S01", taskId: "T01" },
151
- ts: new Date().toISOString(),
152
- actor: "agent",
153
- });
154
-
155
- const logPath = path.join(base, ".gsd", "event-log.jsonl");
156
- assert.ok(fs.existsSync(logPath), "event-log.jsonl should be created by appendEvent");
157
-
158
- const events = readEvents(logPath);
159
- assert.equal(events.length, 1, "event log should contain exactly one event");
160
- assert.equal(events[0]!.cmd, "complete_task", "persisted event should have the correct cmd");
161
- });
162
- });
@@ -1,233 +0,0 @@
1
- /**
2
- * slice-disk-reconcile.test.ts — #2533
3
- *
4
- * Slices that exist on disk (in ROADMAP.md) but are missing from the SQLite
5
- * database cause permanent "No slice eligible — check dependency ordering"
6
- * blocks. deriveStateFromDb must reconcile disk slices into the DB, just as
7
- * it already does for milestones (#2416).
8
- *
9
- * Scenario: M001 has a ROADMAP with S01-S04. S01 and S02 have SUMMARY files
10
- * (complete on disk). S03 depends on S01. Only S04 is in the DB (depends on
11
- * S03). Without slice reconciliation, S01-S03 are invisible and S04 is
12
- * permanently blocked.
13
- */
14
-
15
- import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
16
- import { join } from "node:path";
17
- import { tmpdir } from "node:os";
18
-
19
- import { deriveStateFromDb, invalidateStateCache } from "../state.ts";
20
- import {
21
- openDatabase,
22
- closeDatabase,
23
- insertMilestone,
24
- insertSlice,
25
- getMilestoneSlices,
26
- } from "../gsd-db.ts";
27
- import { createTestContext } from "./test-helpers.ts";
28
-
29
- const { assertEq, assertTrue, report } = createTestContext();
30
-
31
- function createFixtureBase(): string {
32
- const base = mkdtempSync(join(tmpdir(), "gsd-slice-reconcile-"));
33
- mkdirSync(join(base, ".gsd", "milestones"), { recursive: true });
34
- return base;
35
- }
36
-
37
- function writeFile(base: string, relativePath: string, content: string): void {
38
- const full = join(base, ".gsd", relativePath);
39
- mkdirSync(join(full, ".."), { recursive: true });
40
- writeFileSync(full, content);
41
- }
42
-
43
- function cleanup(base: string): void {
44
- rmSync(base, { recursive: true, force: true });
45
- }
46
-
47
- const CONTEXT_CONTENT = `# M001: Test Milestone
48
-
49
- This milestone tests slice reconciliation.
50
-
51
- ## Must-Haves
52
- - Something important
53
- `;
54
-
55
- // Roadmap with 4 slices: S01 (no deps), S02 (no deps), S03 (depends S01), S04 (depends S03)
56
- const ROADMAP_CONTENT = `# M001: Test Milestone
57
-
58
- **Vision:** Test slice disk→DB reconciliation.
59
-
60
- ## Slices
61
-
62
- - [x] **S01: Foundation** \`risk:low\` \`depends:[]\`
63
- > Set up project structure.
64
- - [x] **S02: Core Utils** \`risk:low\` \`depends:[]\`
65
- > Build utility functions.
66
- - [ ] **S03: Integration** \`risk:medium\` \`depends:[S01]\`
67
- > Integrate components.
68
- - [ ] **S04: Final Assembly** \`risk:high\` \`depends:[S03]\`
69
- > Assemble everything.
70
- `;
71
-
72
- async function testMissingSlicesCauseBlock(): Promise<void> {
73
- console.log("\n--- Test: missing DB slices cause permanent block (pre-fix) ---");
74
-
75
- const base = createFixtureBase();
76
- const dbPath = join(base, ".gsd", "gsd.db");
77
-
78
- try {
79
- openDatabase(dbPath);
80
-
81
- // M001 in DB
82
- insertMilestone({ id: "M001", title: "M001: Test Milestone", status: "active", depends_on: [] });
83
-
84
- // Only S04 is in the DB — S01-S03 are missing
85
- insertSlice({ id: "S04", milestoneId: "M001", title: "S04: Final Assembly", status: "pending", risk: "high", depends: ["S03"] });
86
-
87
- // Write disk files — S01 and S02 have SUMMARY (complete on disk)
88
- writeFile(base, "milestones/M001/CONTEXT.md", CONTEXT_CONTENT);
89
- writeFile(base, "milestones/M001/ROADMAP.md", ROADMAP_CONTENT);
90
- writeFile(base, "milestones/M001/S01/PLAN.md", "# S01 Plan\n");
91
- writeFile(base, "milestones/M001/S01/SUMMARY.md", "# S01 Summary\nDone.");
92
- writeFile(base, "milestones/M001/S02/PLAN.md", "# S02 Plan\n");
93
- writeFile(base, "milestones/M001/S02/SUMMARY.md", "# S02 Summary\nDone.");
94
- writeFile(base, "milestones/M001/S03/PLAN.md", "# S03 Plan\n");
95
-
96
- invalidateStateCache();
97
- const state = await deriveStateFromDb(base);
98
-
99
- // After the fix, slices S01-S03 should be reconciled into DB
100
- const dbSlices = getMilestoneSlices("M001");
101
- assertTrue(
102
- dbSlices.length === 4,
103
- `All 4 roadmap slices should be in DB after reconciliation, got ${dbSlices.length}`,
104
- );
105
-
106
- // S01 and S02 should be marked complete (have SUMMARY files)
107
- const s01 = dbSlices.find(s => s.id === "S01");
108
- assertTrue(s01 !== undefined, "S01 should exist in DB after reconciliation");
109
- if (s01) {
110
- assertEq(s01.status, "complete", "S01 should be 'complete' (has SUMMARY on disk)");
111
- }
112
-
113
- const s02 = dbSlices.find(s => s.id === "S02");
114
- assertTrue(s02 !== undefined, "S02 should exist in DB after reconciliation");
115
- if (s02) {
116
- assertEq(s02.status, "complete", "S02 should be 'complete' (has SUMMARY on disk)");
117
- }
118
-
119
- // S03 should be pending (no SUMMARY)
120
- const s03 = dbSlices.find(s => s.id === "S03");
121
- assertTrue(s03 !== undefined, "S03 should exist in DB after reconciliation");
122
- if (s03) {
123
- assertEq(s03.status, "pending", "S03 should be 'pending' (no SUMMARY on disk)");
124
- }
125
-
126
- // The state should NOT be blocked — S03 should be eligible (S01 dep satisfied)
127
- assertTrue(
128
- state.phase !== "blocked",
129
- `Phase should not be 'blocked' after reconciliation, got '${state.phase}'`,
130
- );
131
-
132
- // Active slice should be S03 (S01 dep met, S03 is first incomplete with satisfied deps)
133
- assertTrue(
134
- state.activeSlice !== null,
135
- "There should be an active slice after reconciliation",
136
- );
137
- if (state.activeSlice) {
138
- assertEq(
139
- state.activeSlice.id,
140
- "S03",
141
- "Active slice should be S03 (its dependency S01 is complete) (#2533)",
142
- );
143
- }
144
- } finally {
145
- closeDatabase();
146
- cleanup(base);
147
- }
148
- }
149
-
150
- async function testSliceReconciliationIdempotent(): Promise<void> {
151
- console.log("\n--- Test: slice reconciliation is idempotent ---");
152
-
153
- const base = createFixtureBase();
154
- const dbPath = join(base, ".gsd", "gsd.db");
155
-
156
- try {
157
- openDatabase(dbPath);
158
-
159
- insertMilestone({ id: "M001", title: "M001: Test", status: "active", depends_on: [] });
160
- // S01 already in DB with correct status
161
- insertSlice({ id: "S01", milestoneId: "M001", title: "S01: Foundation", status: "complete", depends: [] });
162
-
163
- writeFile(base, "milestones/M001/CONTEXT.md", CONTEXT_CONTENT);
164
- writeFile(base, "milestones/M001/ROADMAP.md", ROADMAP_CONTENT);
165
- writeFile(base, "milestones/M001/S01/PLAN.md", "# S01 Plan\n");
166
- writeFile(base, "milestones/M001/S01/SUMMARY.md", "# S01 Summary\nDone.");
167
- writeFile(base, "milestones/M001/S02/PLAN.md", "# S02 Plan\n");
168
- writeFile(base, "milestones/M001/S02/SUMMARY.md", "# S02 Summary\nDone.");
169
-
170
- invalidateStateCache();
171
- await deriveStateFromDb(base);
172
-
173
- // S01 should still be complete (not overwritten)
174
- const dbSlices = getMilestoneSlices("M001");
175
- const s01 = dbSlices.find(s => s.id === "S01");
176
- assertTrue(s01 !== undefined, "S01 should still exist in DB");
177
- if (s01) {
178
- assertEq(s01.status, "complete", "S01 status should remain 'complete' (not overwritten)");
179
- }
180
-
181
- // S02-S04 should have been added
182
- assertTrue(
183
- dbSlices.length === 4,
184
- `Should have 4 slices after reconciliation (existing + new), got ${dbSlices.length}`,
185
- );
186
- } finally {
187
- closeDatabase();
188
- cleanup(base);
189
- }
190
- }
191
-
192
- async function testNoRoadmapSkipsReconciliation(): Promise<void> {
193
- console.log("\n--- Test: no ROADMAP file skips slice reconciliation ---");
194
-
195
- const base = createFixtureBase();
196
- const dbPath = join(base, ".gsd", "gsd.db");
197
-
198
- try {
199
- openDatabase(dbPath);
200
-
201
- insertMilestone({ id: "M001", title: "M001: No Roadmap", status: "active", depends_on: [] });
202
-
203
- // Only a CONTEXT file, no ROADMAP
204
- writeFile(base, "milestones/M001/CONTEXT.md", CONTEXT_CONTENT);
205
-
206
- invalidateStateCache();
207
- const state = await deriveStateFromDb(base);
208
-
209
- const dbSlices = getMilestoneSlices("M001");
210
- assertEq(dbSlices.length, 0, "No slices should be added when no ROADMAP exists");
211
-
212
- // Should be in pre-planning (no roadmap)
213
- assertEq(state.phase, "pre-planning", "Phase should be pre-planning with no roadmap");
214
- } finally {
215
- closeDatabase();
216
- cleanup(base);
217
- }
218
- }
219
-
220
- async function main(): Promise<void> {
221
- console.log("\n=== #2533: deriveStateFromDb reconciles disk slices ===");
222
-
223
- await testMissingSlicesCauseBlock();
224
- await testSliceReconciliationIdempotent();
225
- await testNoRoadmapSkipsReconciliation();
226
-
227
- report();
228
- }
229
-
230
- main().catch((err) => {
231
- console.error(err);
232
- process.exit(1);
233
- });