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
@@ -3,20 +3,18 @@
3
3
  //
4
4
  // An agent can claim a unit (task, slice) before working on it.
5
5
  // complete-task and complete-slice enforce ownership when claims exist.
6
- // Claims are stored in SQLite (.gsd/unit-claims.db) for atomic
7
- // first-writer-wins semantics via INSERT OR IGNORE.
6
+ // If no claim file is present, ownership is not enforced (backward compatible).
8
7
  //
8
+ // Claim file location: .gsd/unit-claims.json
9
9
  // Unit key format:
10
10
  // task: "<milestoneId>/<sliceId>/<taskId>"
11
11
  // slice: "<milestoneId>/<sliceId>"
12
12
  //
13
13
  // Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
14
14
 
15
- import { createRequire } from "node:module";
16
- import { mkdirSync } from "node:fs";
15
+ import { existsSync, readFileSync, mkdirSync } from "node:fs";
17
16
  import { join } from "node:path";
18
-
19
- const _require = createRequire(import.meta.url);
17
+ import { atomicWriteSync } from "./atomic-write.js";
20
18
 
21
19
  // ─── Types ───────────────────────────────────────────────────────────────
22
20
 
@@ -25,133 +23,7 @@ export interface UnitClaim {
25
23
  claimed_at: string;
26
24
  }
27
25
 
28
- // ─── SQLite Provider (mirrors gsd-db.ts pattern) ─────────────────────────
29
-
30
- interface StmtLike {
31
- run(...params: unknown[]): unknown;
32
- get(...params: unknown[]): Record<string, unknown> | undefined;
33
- }
34
-
35
- interface DbLike {
36
- exec(sql: string): void;
37
- prepare(sql: string): StmtLike;
38
- close(): void;
39
- }
40
-
41
- type ProviderName = "node:sqlite" | "better-sqlite3";
42
-
43
- let providerName: ProviderName | null = null;
44
- let providerModule: unknown = null;
45
- let loadAttempted = false;
46
-
47
- function suppressSqliteWarning(): void {
48
- const origEmit = process.emit;
49
- // @ts-expect-error overriding process.emit for warning filter
50
- process.emit = function (event: string, ...args: unknown[]): boolean {
51
- if (
52
- event === "warning" &&
53
- args[0] &&
54
- typeof args[0] === "object" &&
55
- "name" in args[0] &&
56
- (args[0] as { name: string }).name === "ExperimentalWarning" &&
57
- "message" in args[0] &&
58
- typeof (args[0] as { message: string }).message === "string" &&
59
- (args[0] as { message: string }).message.includes("SQLite")
60
- ) {
61
- return false;
62
- }
63
- return origEmit.apply(process, [event, ...args] as Parameters<typeof process.emit>) as unknown as boolean;
64
- };
65
- }
66
-
67
- function loadProvider(): void {
68
- if (loadAttempted) return;
69
- loadAttempted = true;
70
-
71
- try {
72
- suppressSqliteWarning();
73
- const mod = _require("node:sqlite");
74
- if (mod.DatabaseSync) {
75
- providerModule = mod;
76
- providerName = "node:sqlite";
77
- return;
78
- }
79
- } catch {
80
- // unavailable
81
- }
82
-
83
- try {
84
- const mod = _require("better-sqlite3");
85
- if (typeof mod === "function" || (mod && mod.default)) {
86
- providerModule = mod.default || mod;
87
- providerName = "better-sqlite3";
88
- return;
89
- }
90
- } catch {
91
- // unavailable
92
- }
93
- }
94
-
95
- function normalizeRow(row: unknown): Record<string, unknown> | undefined {
96
- if (row == null) return undefined;
97
- if (Object.getPrototypeOf(row) === null) {
98
- return { ...(row as Record<string, unknown>) };
99
- }
100
- return row as Record<string, unknown>;
101
- }
102
-
103
- function openRawDb(path: string): unknown {
104
- loadProvider();
105
- if (!providerModule || !providerName) return null;
106
-
107
- if (providerName === "node:sqlite") {
108
- const { DatabaseSync } = providerModule as {
109
- DatabaseSync: new (path: string) => unknown;
110
- };
111
- return new DatabaseSync(path);
112
- }
113
-
114
- const Database = providerModule as new (path: string) => unknown;
115
- return new Database(path);
116
- }
117
-
118
- function wrapDb(rawDb: unknown): DbLike {
119
- const db = rawDb as {
120
- exec(sql: string): void;
121
- prepare(sql: string): {
122
- run(...args: unknown[]): unknown;
123
- get(...args: unknown[]): unknown;
124
- };
125
- close(): void;
126
- };
127
- return {
128
- exec(sql: string): void { db.exec(sql); },
129
- prepare(sql: string): StmtLike {
130
- const raw = db.prepare(sql);
131
- return {
132
- run(...params: unknown[]): unknown { return raw.run(...params); },
133
- get(...params: unknown[]): Record<string, unknown> | undefined {
134
- return normalizeRow(raw.get(...params));
135
- },
136
- };
137
- },
138
- close(): void { db.close(); },
139
- };
140
- }
141
-
142
- // ─── Per-basePath DB pool ────────────────────────────────────────────────
143
-
144
- const dbPool = new Map<string, DbLike>();
145
-
146
- function claimsDbPath(basePath: string): string {
147
- return join(basePath, ".gsd", "unit-claims.db");
148
- }
149
-
150
- function getDb(basePath: string): DbLike | null {
151
- const existing = dbPool.get(basePath);
152
- if (existing) return existing;
153
- return null;
154
- }
26
+ type ClaimsMap = Record<string, UnitClaim>;
155
27
 
156
28
  // ─── Key Builders ────────────────────────────────────────────────────────
157
29
 
@@ -163,103 +35,60 @@ export function sliceUnitKey(milestoneId: string, sliceId: string): string {
163
35
  return `${milestoneId}/${sliceId}`;
164
36
  }
165
37
 
166
- // ─── Lifecycle ───────────────────────────────────────────────────────────
38
+ // ─── File Path ───────────────────────────────────────────────────────────
167
39
 
168
- /**
169
- * Initialize the ownership SQLite database for a given basePath.
170
- * Creates .gsd/ directory and unit-claims.db with the unit_claims table.
171
- * Safe to call multiple times (idempotent).
172
- */
173
- export function initOwnershipTable(basePath: string): void {
174
- if (dbPool.has(basePath)) return;
40
+ function claimsPath(basePath: string): string {
41
+ return join(basePath, ".gsd", "unit-claims.json");
42
+ }
175
43
 
176
- const dir = join(basePath, ".gsd");
177
- mkdirSync(dir, { recursive: true });
44
+ // ─── Read Claims ─────────────────────────────────────────────────────────
178
45
 
179
- const raw = openRawDb(claimsDbPath(basePath));
180
- if (!raw) {
181
- throw new Error("No SQLite provider available for unit-ownership");
46
+ function readClaims(basePath: string): ClaimsMap | null {
47
+ const path = claimsPath(basePath);
48
+ if (!existsSync(path)) return null;
49
+ try {
50
+ return JSON.parse(readFileSync(path, "utf-8")) as ClaimsMap;
51
+ } catch {
52
+ return null;
182
53
  }
183
-
184
- const db = wrapDb(raw);
185
-
186
- db.exec("PRAGMA journal_mode=WAL");
187
- db.exec("PRAGMA busy_timeout = 5000");
188
- db.exec("PRAGMA synchronous = NORMAL");
189
-
190
- db.exec(`
191
- CREATE TABLE IF NOT EXISTS unit_claims (
192
- unit_key TEXT PRIMARY KEY,
193
- agent_name TEXT NOT NULL,
194
- claimed_at TEXT NOT NULL
195
- )
196
- `);
197
-
198
- dbPool.set(basePath, db);
199
- }
200
-
201
- /**
202
- * Close the ownership database for a given basePath.
203
- * Safe to call even if not initialized.
204
- */
205
- export function closeOwnershipDb(basePath: string): void {
206
- const db = dbPool.get(basePath);
207
- if (!db) return;
208
- try { db.close(); } catch { /* swallow */ }
209
- dbPool.delete(basePath);
210
54
  }
211
55
 
212
56
  // ─── Public API ──────────────────────────────────────────────────────────
213
57
 
214
58
  /**
215
59
  * Claim a unit for an agent.
216
- * Uses INSERT OR IGNORE for atomic first-writer-wins semantics.
217
- * Returns true if the claim was acquired (or the same agent already owns it).
218
- * Returns false if a different agent already owns the unit.
60
+ * Overwrites any existing claim for this unit (last writer wins).
219
61
  */
220
- export function claimUnit(basePath: string, unitKey: string, agentName: string): boolean {
221
- const db = getDb(basePath);
222
- if (!db) {
223
- // Auto-init if not already initialized (backward compat)
224
- initOwnershipTable(basePath);
225
- return claimUnit(basePath, unitKey, agentName);
226
- }
227
-
228
- // INSERT OR IGNORE: if the row already exists, this is a no-op.
229
- // The PRIMARY KEY constraint on unit_key prevents duplicate claims.
230
- db.prepare(
231
- "INSERT OR IGNORE INTO unit_claims (unit_key, agent_name, claimed_at) VALUES (?, ?, ?)",
232
- ).run(unitKey, agentName, new Date().toISOString());
233
-
234
- // Check who owns it now
235
- const row = db.prepare("SELECT agent_name FROM unit_claims WHERE unit_key = ?").get(unitKey);
236
- const owner = row?.agent_name as string | undefined;
237
-
238
- return owner === agentName;
62
+ export function claimUnit(basePath: string, unitKey: string, agentName: string): void {
63
+ const claims = readClaims(basePath) ?? {};
64
+ claims[unitKey] = { agent: agentName, claimed_at: new Date().toISOString() };
65
+ const dir = join(basePath, ".gsd");
66
+ mkdirSync(dir, { recursive: true });
67
+ atomicWriteSync(claimsPath(basePath), JSON.stringify(claims, null, 2) + "\n");
239
68
  }
240
69
 
241
70
  /**
242
- * Release a unit claim (remove it from the claims table).
71
+ * Release a unit claim (remove it from the claims map).
243
72
  */
244
73
  export function releaseUnit(basePath: string, unitKey: string): void {
245
- const db = getDb(basePath);
246
- if (!db) return;
247
- db.prepare("DELETE FROM unit_claims WHERE unit_key = ?").run(unitKey);
74
+ const claims = readClaims(basePath);
75
+ if (!claims || !(unitKey in claims)) return;
76
+ delete claims[unitKey];
77
+ atomicWriteSync(claimsPath(basePath), JSON.stringify(claims, null, 2) + "\n");
248
78
  }
249
79
 
250
80
  /**
251
- * Get the current owner of a unit, or null if unclaimed.
81
+ * Get the current owner of a unit, or null if unclaimed / no claims file.
252
82
  */
253
83
  export function getOwner(basePath: string, unitKey: string): string | null {
254
- const db = getDb(basePath);
255
- if (!db) return null;
256
- const row = db.prepare("SELECT agent_name FROM unit_claims WHERE unit_key = ?").get(unitKey);
257
- return (row?.agent_name as string) ?? null;
84
+ const claims = readClaims(basePath);
85
+ if (!claims) return null;
86
+ return claims[unitKey]?.agent ?? null;
258
87
  }
259
88
 
260
89
  /**
261
90
  * Check if an actor is authorized to operate on a unit.
262
- * Returns null if ownership passes (or is unclaimed).
91
+ * Returns null if ownership passes (or is unclaimed / no file).
263
92
  * Returns an error string if a different agent owns the unit.
264
93
  */
265
94
  export function checkOwnership(
@@ -269,7 +98,7 @@ export function checkOwnership(
269
98
  ): string | null {
270
99
  if (!actorName) return null; // no actor identity provided — opt-in, so allow
271
100
  const owner = getOwner(basePath, unitKey);
272
- if (owner === null) return null; // unit unclaimed
101
+ if (owner === null) return null; // unit unclaimed or no claims file
273
102
  if (owner === actorName) return null; // actor is the owner
274
103
  return `Unit ${unitKey} is owned by ${owner}, not ${actorName}`;
275
104
  }
@@ -20,28 +20,13 @@ import type { UatType } from "./files.js";
20
20
  * Returns `undefined` when frontmatter is absent or has no `verdict` field.
21
21
  */
22
22
  export function extractVerdict(content: string): string | undefined {
23
- // Primary: YAML frontmatter verdict (canonical format)
24
23
  const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
25
- if (fmMatch) {
26
- const verdictMatch = fmMatch[1].match(/verdict:\s*([\w-]+)/i);
27
- if (verdictMatch) {
28
- let v = verdictMatch[1].toLowerCase();
29
- if (v === "passed") v = "pass";
30
- return v;
31
- }
32
- return undefined;
33
- }
34
-
35
- // Fallback: detect verdict in markdown body (LLM manual writes, #2960).
36
- // Matches patterns like: **Verdict:** PASS, **Verdict:** ✅ PASS, **Verdict** needs-remediation
37
- const bodyMatch = content.match(/\*\*Verdict:?\*\*\s*(?:✅\s*)?(\w[\w-]*)/i);
38
- if (bodyMatch) {
39
- let v = bodyMatch[1].toLowerCase();
40
- if (v === "passed") v = "pass";
41
- return v;
42
- }
43
-
44
- return undefined;
24
+ if (!fmMatch) return undefined;
25
+ const verdictMatch = fmMatch[1].match(/verdict:\s*([\w-]+)/i);
26
+ if (!verdictMatch) return undefined;
27
+ let v = verdictMatch[1].toLowerCase();
28
+ if (v === "passed") v = "pass";
29
+ return v;
45
30
  }
46
31
 
47
32
  /**
@@ -31,9 +31,7 @@ export type LogComponent =
31
31
  | "state" // deriveState fallback/degradation
32
32
  | "tool" // Tool handler errors
33
33
  | "compaction" // Event compaction
34
- | "reconcile" // Worktree reconciliation
35
- | "db" // Database operations (gsd-db)
36
- | "dispatch"; // Auto-dispatch rule evaluation
34
+ | "reconcile"; // Worktree reconciliation
37
35
 
38
36
  export interface LogEntry {
39
37
  ts: string;
@@ -42,23 +42,6 @@ function requireDb() {
42
42
  return db;
43
43
  }
44
44
 
45
- /**
46
- * Coerce a raw DB value to a number, returning `fallback` for
47
- * null/undefined/non-numeric strings (e.g. "-", "N/A", "").
48
- * SQLite can store TEXT in INTEGER columns after migrations or manual inserts.
49
- */
50
- export function toNumeric(value: unknown, fallback: number | null = null): number | null {
51
- if (value === null || value === undefined) return fallback;
52
- if (typeof value === "number") return Number.isFinite(value) ? value : fallback;
53
- if (typeof value === "string") {
54
- const trimmed = value.trim();
55
- if (trimmed === "" || trimmed === "-" || trimmed === "N/A") return fallback;
56
- const n = Number(trimmed);
57
- return Number.isFinite(n) ? n : fallback;
58
- }
59
- return fallback;
60
- }
61
-
62
45
  // ─── snapshotState ───────────────────────────────────────────────────────
63
46
 
64
47
  /**
@@ -116,7 +99,7 @@ export function snapshotState(): StateManifest {
116
99
  proof_level: (r["proof_level"] as string) ?? "",
117
100
  integration_closure: (r["integration_closure"] as string) ?? "",
118
101
  observability_impact: (r["observability_impact"] as string) ?? "",
119
- sequence: toNumeric(r["sequence"], 0) as number,
102
+ sequence: (r["sequence"] as number) ?? 0,
120
103
  replan_triggered_at: (r["replan_triggered_at"] as string) ?? null,
121
104
  }));
122
105
 
@@ -146,12 +129,12 @@ export function snapshotState(): StateManifest {
146
129
  expected_output: JSON.parse((r["expected_output"] as string) || "[]"),
147
130
  observability_impact: (r["observability_impact"] as string) ?? "",
148
131
  full_plan_md: (r["full_plan_md"] as string) ?? "",
149
- sequence: toNumeric(r["sequence"], 0) as number,
132
+ sequence: (r["sequence"] as number) ?? 0,
150
133
  }));
151
134
 
152
135
  const rawDecisions = db.prepare("SELECT * FROM decisions ORDER BY seq").all() as Record<string, unknown>[];
153
136
  const decisions: Decision[] = rawDecisions.map((r) => ({
154
- seq: toNumeric(r["seq"], 0) as number,
137
+ seq: r["seq"] as number,
155
138
  id: r["id"] as string,
156
139
  when_context: (r["when_context"] as string) ?? "",
157
140
  scope: (r["scope"] as string) ?? "",
@@ -170,9 +153,9 @@ export function snapshotState(): StateManifest {
170
153
  slice_id: r["slice_id"] as string,
171
154
  milestone_id: r["milestone_id"] as string,
172
155
  command: r["command"] as string,
173
- exit_code: toNumeric(r["exit_code"]),
156
+ exit_code: (r["exit_code"] as number) ?? null,
174
157
  verdict: (r["verdict"] as string) ?? "",
175
- duration_ms: toNumeric(r["duration_ms"]),
158
+ duration_ms: (r["duration_ms"] as number) ?? null,
176
159
  created_at: r["created_at"] as string,
177
160
  }));
178
161
 
@@ -9,9 +9,8 @@ import {
9
9
  getMilestone,
10
10
  getMilestoneSlices,
11
11
  getSliceTasks,
12
- getVerificationEvidence,
13
12
  } from "./gsd-db.js";
14
- import type { MilestoneRow, SliceRow, TaskRow, VerificationEvidenceRow } from "./gsd-db.js";
13
+ import type { MilestoneRow, SliceRow, TaskRow } from "./gsd-db.js";
15
14
  import { atomicWriteSync } from "./atomic-write.js";
16
15
  import { join } from "node:path";
17
16
  import { mkdirSync, existsSync } from "node:fs";
@@ -30,10 +29,8 @@ export function renderPlanContent(sliceRow: SliceRow, taskRows: TaskRow[]): stri
30
29
 
31
30
  lines.push(`# ${sliceRow.id}: ${sliceRow.title}`);
32
31
  lines.push("");
33
- // #2945: never use full_summary_md/full_uat_md as display fallbacks —
34
- // they contain multi-line rendered markdown that corrupts single-line fields.
35
- lines.push(`**Goal:** ${sliceRow.goal || "TBD"}`);
36
- lines.push(`**Demo:** After this: ${sliceRow.demo || "TBD"}`);
32
+ lines.push(`**Goal:** ${sliceRow.goal || sliceRow.full_summary_md || "TBD"}`);
33
+ lines.push(`**Demo:** After this: ${sliceRow.demo || sliceRow.full_uat_md || "TBD"}`);
37
34
  lines.push("");
38
35
  lines.push("## Tasks");
39
36
 
@@ -116,10 +113,7 @@ export function renderRoadmapContent(milestoneRow: MilestoneRow, sliceRows: Slic
116
113
  }
117
114
 
118
115
  const risk = (slice.risk || "low").toLowerCase();
119
- // #2945 Bug 1: never use full_uat_md as a table cell fallback — it contains
120
- // multi-line UAT content (preconditions, steps, expected results) that
121
- // corrupts the markdown table and makes subsequent slices invisible.
122
- const demo = slice.demo || "TBD";
116
+ const demo = slice.demo || slice.full_uat_md || "TBD";
123
117
 
124
118
  lines.push(`| ${slice.id} | ${slice.title} | ${risk} | ${depends} | ${done} | ${demo} |`);
125
119
  }
@@ -148,93 +142,71 @@ export function renderRoadmapProjection(basePath: string, milestoneId: string):
148
142
 
149
143
  /**
150
144
  * Render SUMMARY.md content from a task row.
151
- * Single source of truth for summary rendering used both at completion
152
- * time and at projection regeneration time (#2720).
153
- *
154
- * @param evidence - Optional verification evidence rows. When called from
155
- * complete-task, these are passed directly. When called from projection
156
- * regeneration, they are queried from the DB by renderSummaryProjection.
145
+ * Pure functionno side effects.
157
146
  */
158
- export function renderSummaryContent(
159
- taskRow: TaskRow,
160
- sliceId: string,
161
- milestoneId: string,
162
- evidence?: Array<{ command: string; exitCode?: number; exit_code?: number; verdict: string; durationMs?: number; duration_ms?: number }>,
163
- ): string {
164
- // ── Frontmatter (YAML list format, matches parseSummary() expectations) ──
165
- const keyFilesYaml = taskRow.key_files && taskRow.key_files.length > 0
166
- ? taskRow.key_files.map(f => ` - ${f}`).join("\n")
167
- : " - (none)";
168
- const keyDecisionsYaml = taskRow.key_decisions && taskRow.key_decisions.length > 0
169
- ? taskRow.key_decisions.map(d => ` - ${d}`).join("\n")
170
- : " - (none)";
171
-
172
- // Derive verification_result from evidence if available
173
- const evidenceList = evidence ?? [];
174
- const allPassed = evidenceList.length > 0 &&
175
- evidenceList.every(e => {
176
- const code = e.exitCode ?? e.exit_code ?? -1;
177
- return code === 0 || e.verdict.includes("\u2705") || e.verdict.toLowerCase().includes("pass");
178
- });
179
- const verificationResult = taskRow.verification_result
180
- ? (allPassed ? "passed" : (evidenceList.length === 0 ? "untested" : "mixed"))
181
- : (allPassed ? "passed" : (evidenceList.length === 0 ? "untested" : "mixed"));
182
-
183
- // Build verification evidence table
184
- let evidenceTable = "| # | Command | Exit Code | Verdict | Duration |\n|---|---------|-----------|---------|----------|\n";
185
- if (evidenceList.length > 0) {
186
- evidenceList.forEach((e, i) => {
187
- const code = e.exitCode ?? e.exit_code ?? 0;
188
- const dur = e.durationMs ?? e.duration_ms ?? 0;
189
- evidenceTable += `| ${i + 1} | \`${e.command}\` | ${code} | ${e.verdict} | ${dur}ms |\n`;
190
- });
147
+ export function renderSummaryContent(taskRow: TaskRow, sliceId: string, milestoneId: string): string {
148
+ const lines: string[] = [];
149
+
150
+ // Frontmatter
151
+ lines.push("---");
152
+ lines.push(`id: ${taskRow.id}`);
153
+ lines.push(`parent: ${sliceId}`);
154
+ lines.push(`milestone: ${milestoneId}`);
155
+ lines.push("provides: []");
156
+ lines.push("requires: []");
157
+ lines.push("affects: []");
158
+
159
+ // key_files is already parsed to string[]
160
+ if (taskRow.key_files && taskRow.key_files.length > 0) {
161
+ lines.push(`key_files: [${taskRow.key_files.map(f => `"${f}"`).join(", ")}]`);
191
162
  } else {
192
- evidenceTable += "| \u2014 | No verification commands discovered | \u2014 | \u2014 | \u2014 |\n";
163
+ lines.push("key_files: []");
193
164
  }
194
165
 
195
- const title = taskRow.one_liner || taskRow.title || taskRow.id;
196
-
197
- return `---
198
- id: ${taskRow.id}
199
- parent: ${sliceId}
200
- milestone: ${milestoneId}
201
- key_files:
202
- ${keyFilesYaml}
203
- key_decisions:
204
- ${keyDecisionsYaml}
205
- duration: ${taskRow.duration || ""}
206
- verification_result: ${verificationResult}
207
- completed_at: ${taskRow.completed_at || ""}
208
- blocker_discovered: ${taskRow.blocker_discovered ? "true" : "false"}
209
- ---
210
-
211
- # ${taskRow.id}: ${title}
212
-
213
- **${taskRow.one_liner || ""}**
214
-
215
- ## What Happened
216
-
217
- ${taskRow.narrative || "No summary recorded."}
218
-
219
- ## Verification
220
-
221
- ${taskRow.verification_result || "No verification recorded."}
222
-
223
- ## Verification Evidence
166
+ // key_decisions is already parsed to string[]
167
+ if (taskRow.key_decisions && taskRow.key_decisions.length > 0) {
168
+ lines.push(`key_decisions: [${taskRow.key_decisions.map(d => `"${d}"`).join(", ")}]`);
169
+ } else {
170
+ lines.push("key_decisions: []");
171
+ }
224
172
 
225
- ${evidenceTable}
226
- ## Deviations
173
+ lines.push("patterns_established: []");
174
+ lines.push("drill_down_paths: []");
175
+ lines.push("observability_surfaces: []");
176
+ lines.push(`duration: "${taskRow.duration || ""}"`);
177
+ lines.push(`verification_result: "${taskRow.verification_result || ""}"`);
178
+ lines.push(`completed_at: ${taskRow.completed_at || ""}`);
179
+ lines.push(`blocker_discovered: ${taskRow.blocker_discovered ? "true" : "false"}`);
180
+ lines.push("---");
181
+ lines.push("");
182
+ lines.push(`# ${taskRow.id}: ${taskRow.title}`);
183
+ lines.push("");
227
184
 
228
- ${taskRow.deviations || "None."}
185
+ // One-liner (if present)
186
+ if (taskRow.one_liner) {
187
+ lines.push(`> ${taskRow.one_liner}`);
188
+ lines.push("");
189
+ }
229
190
 
230
- ## Known Issues
191
+ lines.push("## What Happened");
192
+ lines.push(taskRow.full_summary_md || taskRow.narrative || "No summary recorded.");
193
+ lines.push("");
231
194
 
232
- ${taskRow.known_issues || "None."}
195
+ // Deviations (if present)
196
+ if (taskRow.deviations) {
197
+ lines.push("## Deviations");
198
+ lines.push(taskRow.deviations);
199
+ lines.push("");
200
+ }
233
201
 
234
- ## Files Created/Modified
202
+ // Known issues (if present)
203
+ if (taskRow.known_issues) {
204
+ lines.push("## Known Issues");
205
+ lines.push(taskRow.known_issues);
206
+ lines.push("");
207
+ }
235
208
 
236
- ${taskRow.key_files && taskRow.key_files.length > 0 ? taskRow.key_files.map(f => `- \`${f}\``).join("\n") : "None."}
237
- `;
209
+ return lines.join("\n");
238
210
  }
239
211
 
240
212
  /**
@@ -246,8 +218,7 @@ export function renderSummaryProjection(basePath: string, milestoneId: string, s
246
218
  const taskRow = taskRows.find(t => t.id === taskId);
247
219
  if (!taskRow) return;
248
220
 
249
- const evidenceRows = getVerificationEvidence(milestoneId, sliceId, taskId);
250
- const content = renderSummaryContent(taskRow, sliceId, milestoneId, evidenceRows);
221
+ const content = renderSummaryContent(taskRow, sliceId, milestoneId);
251
222
  const dir = join(basePath, ".gsd", "milestones", milestoneId, "slices", sliceId, "tasks");
252
223
  mkdirSync(dir, { recursive: true });
253
224
  atomicWriteSync(join(dir, `${taskId}-SUMMARY.md`), content);
@@ -264,18 +235,14 @@ export function renderStateContent(state: GSDState): string {
264
235
  const lines: string[] = [];
265
236
  lines.push("# GSD State", "");
266
237
 
238
+ const activeMilestone = state.activeMilestone
239
+ ? `${state.activeMilestone.id}: ${state.activeMilestone.title}`
240
+ : "None";
267
241
  const activeSlice = state.activeSlice
268
242
  ? `${state.activeSlice.id}: ${state.activeSlice.title}`
269
243
  : "None";
270
244
 
271
- if (state.phase === 'complete' && state.lastCompletedMilestone) {
272
- lines.push(`**Last Completed Milestone:** ${state.lastCompletedMilestone.id}: ${state.lastCompletedMilestone.title}`);
273
- } else {
274
- const activeMilestone = state.activeMilestone
275
- ? `${state.activeMilestone.id}: ${state.activeMilestone.title}`
276
- : "None";
277
- lines.push(`**Active Milestone:** ${activeMilestone}`);
278
- }
245
+ lines.push(`**Active Milestone:** ${activeMilestone}`);
279
246
  lines.push(`**Active Slice:** ${activeSlice}`);
280
247
  lines.push(`**Phase:** ${state.phase}`);
281
248
  if (state.requirements) {