gsd-pi 2.65.0-dev.5c8557b → 2.65.0-dev.d0517ff

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 (316) hide show
  1. package/dist/mcp-server.js +6 -2
  2. package/dist/resources/extensions/browser-tools/capture.js +20 -1
  3. package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +93 -0
  4. package/dist/resources/extensions/gsd/auto/run-unit.js +13 -2
  5. package/dist/resources/extensions/gsd/auto/session.js +4 -0
  6. package/dist/resources/extensions/gsd/auto-dispatch.js +99 -9
  7. package/dist/resources/extensions/gsd/auto-model-selection.js +7 -5
  8. package/dist/resources/extensions/gsd/auto-post-unit.js +17 -6
  9. package/dist/resources/extensions/gsd/auto-prompts.js +24 -0
  10. package/dist/resources/extensions/gsd/auto-recovery.js +40 -22
  11. package/dist/resources/extensions/gsd/auto-start.js +42 -11
  12. package/dist/resources/extensions/gsd/auto-tool-tracking.js +10 -0
  13. package/dist/resources/extensions/gsd/auto-worktree.js +29 -7
  14. package/dist/resources/extensions/gsd/auto.js +21 -15
  15. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +17 -4
  16. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -0
  17. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +6 -4
  18. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +5 -1
  19. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +11 -3
  20. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +31 -1
  21. package/dist/resources/extensions/gsd/commands/context.js +8 -1
  22. package/dist/resources/extensions/gsd/commands/handlers/core.js +20 -0
  23. package/dist/resources/extensions/gsd/commands-extensions.js +1 -1
  24. package/dist/resources/extensions/gsd/config-overlay.js +312 -0
  25. package/dist/resources/extensions/gsd/db-writer.js +13 -3
  26. package/dist/resources/extensions/gsd/detection.js +1 -1
  27. package/dist/resources/extensions/gsd/dispatch-guard.js +2 -1
  28. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -0
  29. package/dist/resources/extensions/gsd/doctor.js +2 -1
  30. package/dist/resources/extensions/gsd/gitignore.js +1 -0
  31. package/dist/resources/extensions/gsd/gsd-db.js +47 -4
  32. package/dist/resources/extensions/gsd/guided-flow.js +220 -29
  33. package/dist/resources/extensions/gsd/index.js +1 -1
  34. package/dist/resources/extensions/gsd/json-persistence.js +5 -2
  35. package/dist/resources/extensions/gsd/md-importer.js +14 -7
  36. package/dist/resources/extensions/gsd/parallel-orchestrator.js +17 -11
  37. package/dist/resources/extensions/gsd/pre-execution-checks.js +12 -5
  38. package/dist/resources/extensions/gsd/preferences-types.js +3 -0
  39. package/dist/resources/extensions/gsd/preferences-validation.js +45 -1
  40. package/dist/resources/extensions/gsd/preferences.js +9 -2
  41. package/dist/resources/extensions/gsd/preparation.js +1092 -0
  42. package/dist/resources/extensions/gsd/prompt-validation.js +67 -0
  43. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +3 -3
  44. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  45. package/dist/resources/extensions/gsd/prompts/discuss-prepared.md +424 -0
  46. package/dist/resources/extensions/gsd/prompts/discuss.md +2 -0
  47. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +6 -1
  48. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -4
  49. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +23 -0
  50. package/dist/resources/extensions/gsd/prompts/queue.md +2 -0
  51. package/dist/resources/extensions/gsd/prompts/rethink.md +2 -1
  52. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +56 -23
  53. package/dist/resources/extensions/gsd/quick.js +19 -15
  54. package/dist/resources/extensions/gsd/reactive-graph.js +12 -0
  55. package/dist/resources/extensions/gsd/roadmap-slices.js +24 -5
  56. package/dist/resources/extensions/gsd/safety/content-validator.js +3 -3
  57. package/dist/resources/extensions/gsd/session-lock.js +23 -1
  58. package/dist/resources/extensions/gsd/state.js +115 -28
  59. package/dist/resources/extensions/gsd/templates/context-enhanced.md +138 -0
  60. package/dist/resources/extensions/gsd/tools/complete-milestone.js +15 -3
  61. package/dist/resources/extensions/gsd/tools/complete-slice.js +27 -6
  62. package/dist/resources/extensions/gsd/tools/complete-task.js +31 -7
  63. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -5
  64. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +5 -2
  65. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +119 -0
  66. package/dist/resources/extensions/gsd/tools/reopen-slice.js +30 -0
  67. package/dist/resources/extensions/gsd/tools/reopen-task.js +18 -0
  68. package/dist/resources/extensions/gsd/triage-resolution.js +33 -16
  69. package/dist/resources/extensions/gsd/undo.js +3 -2
  70. package/dist/resources/extensions/gsd/workflow-events.js +1 -0
  71. package/dist/resources/extensions/gsd/workflow-logger.js +1 -1
  72. package/dist/resources/extensions/gsd/workflow-projections.js +7 -9
  73. package/dist/resources/extensions/gsd/workflow-reconcile.js +100 -9
  74. package/dist/resources/extensions/gsd/workflow-templates.js +11 -2
  75. package/dist/resources/extensions/gsd/worktree-manager.js +5 -2
  76. package/dist/resources/extensions/gsd/worktree.js +9 -0
  77. package/dist/resources/extensions/shared/interview-ui.js +1 -1
  78. package/dist/web/standalone/.next/BUILD_ID +1 -1
  79. package/dist/web/standalone/.next/app-path-routes-manifest.json +15 -15
  80. package/dist/web/standalone/.next/build-manifest.json +3 -3
  81. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  82. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  83. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  84. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  91. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  92. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/index.html +1 -1
  100. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app-paths-manifest.json +15 -15
  107. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  108. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  110. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  111. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  112. package/dist/web/standalone/.next/static/chunks/6502.8874bcae249c02e1.js +9 -0
  113. package/dist/web/standalone/.next/static/chunks/{webpack-a1c1e452c6b32d04.js → webpack-9fed74684e1c5bb1.js} +1 -1
  114. package/package.json +1 -1
  115. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  116. package/packages/pi-coding-agent/dist/core/retry-handler.js +30 -19
  117. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  118. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +51 -0
  119. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
  120. package/packages/pi-coding-agent/dist/core/sdk.js +9 -9
  121. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  122. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts +2 -1
  123. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -1
  124. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +10 -1
  125. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
  126. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +1 -0
  127. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  128. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +20 -5
  129. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  130. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +15 -1
  131. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  132. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +18 -0
  133. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  134. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  135. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +4 -0
  136. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  137. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +80 -0
  138. package/packages/pi-coding-agent/src/core/retry-handler.ts +37 -25
  139. package/packages/pi-coding-agent/src/core/sdk.ts +9 -9
  140. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +10 -0
  141. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +20 -4
  142. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +27 -0
  143. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +16 -1
  144. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +5 -0
  145. package/packages/pi-tui/dist/components/image.d.ts +2 -0
  146. package/packages/pi-tui/dist/components/image.d.ts.map +1 -1
  147. package/packages/pi-tui/dist/components/image.js +4 -0
  148. package/packages/pi-tui/dist/components/image.js.map +1 -1
  149. package/packages/pi-tui/dist/components/image.test.d.ts +6 -0
  150. package/packages/pi-tui/dist/components/image.test.d.ts.map +1 -0
  151. package/packages/pi-tui/dist/components/image.test.js +32 -0
  152. package/packages/pi-tui/dist/components/image.test.js.map +1 -0
  153. package/packages/pi-tui/src/components/image.test.ts +36 -0
  154. package/packages/pi-tui/src/components/image.ts +5 -0
  155. package/src/resources/extensions/browser-tools/capture.ts +19 -1
  156. package/src/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +93 -0
  157. package/src/resources/extensions/gsd/auto/run-unit.ts +12 -2
  158. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  159. package/src/resources/extensions/gsd/auto-dispatch.ts +110 -9
  160. package/src/resources/extensions/gsd/auto-model-selection.ts +7 -5
  161. package/src/resources/extensions/gsd/auto-post-unit.ts +16 -6
  162. package/src/resources/extensions/gsd/auto-prompts.ts +31 -0
  163. package/src/resources/extensions/gsd/auto-recovery.ts +29 -23
  164. package/src/resources/extensions/gsd/auto-start.ts +45 -10
  165. package/src/resources/extensions/gsd/auto-tool-tracking.ts +10 -0
  166. package/src/resources/extensions/gsd/auto-worktree.ts +28 -7
  167. package/src/resources/extensions/gsd/auto.ts +19 -8
  168. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +16 -4
  169. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -0
  170. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +5 -4
  171. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +4 -1
  172. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +11 -3
  173. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +36 -1
  174. package/src/resources/extensions/gsd/commands/context.ts +7 -1
  175. package/src/resources/extensions/gsd/commands/handlers/core.ts +23 -0
  176. package/src/resources/extensions/gsd/commands-extensions.ts +1 -1
  177. package/src/resources/extensions/gsd/config-overlay.ts +331 -0
  178. package/src/resources/extensions/gsd/db-writer.ts +11 -3
  179. package/src/resources/extensions/gsd/detection.ts +1 -1
  180. package/src/resources/extensions/gsd/dispatch-guard.ts +2 -1
  181. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -0
  182. package/src/resources/extensions/gsd/doctor.ts +2 -1
  183. package/src/resources/extensions/gsd/gitignore.ts +1 -0
  184. package/src/resources/extensions/gsd/gsd-db.ts +46 -4
  185. package/src/resources/extensions/gsd/guided-flow.ts +254 -30
  186. package/src/resources/extensions/gsd/index.ts +1 -0
  187. package/src/resources/extensions/gsd/json-persistence.ts +6 -3
  188. package/src/resources/extensions/gsd/md-importer.ts +13 -6
  189. package/src/resources/extensions/gsd/parallel-orchestrator.ts +19 -11
  190. package/src/resources/extensions/gsd/pre-execution-checks.ts +15 -7
  191. package/src/resources/extensions/gsd/preferences-types.ts +25 -0
  192. package/src/resources/extensions/gsd/preferences-validation.ts +45 -1
  193. package/src/resources/extensions/gsd/preferences.ts +9 -2
  194. package/src/resources/extensions/gsd/preparation.ts +1419 -0
  195. package/src/resources/extensions/gsd/prompt-validation.ts +88 -0
  196. package/src/resources/extensions/gsd/prompts/complete-milestone.md +3 -3
  197. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  198. package/src/resources/extensions/gsd/prompts/discuss-prepared.md +424 -0
  199. package/src/resources/extensions/gsd/prompts/discuss.md +2 -0
  200. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +6 -1
  201. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -4
  202. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +23 -0
  203. package/src/resources/extensions/gsd/prompts/queue.md +2 -0
  204. package/src/resources/extensions/gsd/prompts/rethink.md +2 -1
  205. package/src/resources/extensions/gsd/prompts/validate-milestone.md +56 -23
  206. package/src/resources/extensions/gsd/quick.ts +20 -15
  207. package/src/resources/extensions/gsd/reactive-graph.ts +18 -0
  208. package/src/resources/extensions/gsd/roadmap-slices.ts +21 -5
  209. package/src/resources/extensions/gsd/safety/content-validator.ts +3 -3
  210. package/src/resources/extensions/gsd/session-lock.ts +17 -1
  211. package/src/resources/extensions/gsd/state.ts +115 -26
  212. package/src/resources/extensions/gsd/templates/context-enhanced.md +138 -0
  213. package/src/resources/extensions/gsd/tests/adversarial-review-fixes.test.ts +223 -0
  214. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +33 -2
  215. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +56 -0
  216. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +41 -0
  217. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +72 -0
  218. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +54 -0
  219. package/src/resources/extensions/gsd/tests/defer-milestone-stamp.test.ts +30 -0
  220. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -3
  221. package/src/resources/extensions/gsd/tests/discuss-incremental-persistence.test.ts +36 -0
  222. package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +46 -0
  223. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +33 -0
  224. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +37 -0
  225. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +37 -0
  226. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed.test.ts +48 -0
  227. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +42 -0
  228. package/src/resources/extensions/gsd/tests/gitignore-bg-shell.test.ts +38 -0
  229. package/src/resources/extensions/gsd/tests/guided-flow-state-rebuild.test.ts +103 -0
  230. package/src/resources/extensions/gsd/tests/import-done-milestones.test.ts +42 -0
  231. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +11 -9
  232. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
  233. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +28 -30
  234. package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
  235. package/src/resources/extensions/gsd/tests/integration-prepared-discussion.test.ts +525 -0
  236. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +62 -0
  237. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +48 -0
  238. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +46 -0
  239. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +77 -0
  240. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +55 -0
  241. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +39 -0
  242. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +68 -0
  243. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +218 -20
  244. package/src/resources/extensions/gsd/tests/pre-execution-fail-closed.test.ts +2 -2
  245. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +2 -2
  246. package/src/resources/extensions/gsd/tests/preparation.test.ts +1211 -0
  247. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +53 -0
  248. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +83 -0
  249. package/src/resources/extensions/gsd/tests/prompt-builder.test.ts +669 -0
  250. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +7 -4
  251. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +85 -0
  252. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -1
  253. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +47 -0
  254. package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +107 -0
  255. package/src/resources/extensions/gsd/tests/reactive-graph.test.ts +45 -0
  256. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +63 -0
  257. package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +4 -5
  258. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +51 -0
  259. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +56 -0
  260. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +31 -0
  261. package/src/resources/extensions/gsd/tests/skipped-validation-completion.test.ts +39 -0
  262. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +51 -0
  263. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +1 -1
  264. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +36 -0
  265. package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +147 -0
  266. package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +13 -0
  267. package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +21 -0
  268. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +21 -0
  269. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +6 -7
  270. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +47 -0
  271. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +1 -0
  272. package/src/resources/extensions/gsd/tests/symlink-extension-discovery.test.ts +125 -0
  273. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +65 -0
  274. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +29 -1
  275. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +2 -1
  276. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +3 -4
  277. package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +15 -0
  278. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +89 -0
  279. package/src/resources/extensions/gsd/tests/wave1-critical-regressions.test.ts +49 -0
  280. package/src/resources/extensions/gsd/tests/wave2-events-regressions.test.ts +48 -0
  281. package/src/resources/extensions/gsd/tests/wave3-session-regressions.test.ts +47 -0
  282. package/src/resources/extensions/gsd/tests/wave4-write-safety-regressions.test.ts +70 -0
  283. package/src/resources/extensions/gsd/tests/wave5-consistency-regressions.test.ts +165 -0
  284. package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +48 -0
  285. package/src/resources/extensions/gsd/tests/workflow-logger-audit.test.ts +6 -3
  286. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +38 -0
  287. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +16 -0
  288. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -0
  289. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +16 -17
  290. package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +13 -9
  291. package/src/resources/extensions/gsd/tests/worktree.test.ts +26 -9
  292. package/src/resources/extensions/gsd/tests/write-gate.test.ts +127 -2
  293. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -0
  294. package/src/resources/extensions/gsd/tools/complete-milestone.ts +13 -3
  295. package/src/resources/extensions/gsd/tools/complete-slice.ts +26 -6
  296. package/src/resources/extensions/gsd/tools/complete-task.ts +29 -7
  297. package/src/resources/extensions/gsd/tools/plan-milestone.ts +11 -9
  298. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +5 -2
  299. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +152 -0
  300. package/src/resources/extensions/gsd/tools/reopen-slice.ts +27 -0
  301. package/src/resources/extensions/gsd/tools/reopen-task.ts +17 -0
  302. package/src/resources/extensions/gsd/triage-resolution.ts +37 -17
  303. package/src/resources/extensions/gsd/types.ts +4 -0
  304. package/src/resources/extensions/gsd/undo.ts +3 -2
  305. package/src/resources/extensions/gsd/workflow-events.ts +5 -3
  306. package/src/resources/extensions/gsd/workflow-logger.ts +1 -1
  307. package/src/resources/extensions/gsd/workflow-projections.ts +7 -8
  308. package/src/resources/extensions/gsd/workflow-reconcile.ts +109 -8
  309. package/src/resources/extensions/gsd/workflow-templates.ts +11 -2
  310. package/src/resources/extensions/gsd/worktree-manager.ts +4 -2
  311. package/src/resources/extensions/gsd/worktree.ts +10 -0
  312. package/src/resources/extensions/shared/interview-ui.ts +1 -1
  313. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +8 -10
  314. package/dist/web/standalone/.next/static/chunks/6502.7593d7797a4b3999.js +0 -9
  315. /package/dist/web/standalone/.next/static/{qq3YfHPfyqvh3DIMVmsRH → JwdBI3y1H8vtBKiYvWfEK}/_buildManifest.js +0 -0
  316. /package/dist/web/standalone/.next/static/{qq3YfHPfyqvh3DIMVmsRH → JwdBI3y1H8vtBKiYvWfEK}/_ssgManifest.js +0 -0
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Regression test for #3675 — isolation:none stale branch guard
3
+ *
4
+ * When switching from isolation:branch/worktree to isolation:none, HEAD
5
+ * could remain on a milestone/<MID> branch. The fix in auto-start.ts
6
+ * detects this and auto-checks out to the integration branch.
7
+ *
8
+ * This structural test verifies the milestone/ branch check exists
9
+ * in auto-start.ts.
10
+ */
11
+
12
+ import { describe, test } from 'node:test';
13
+ import assert from 'node:assert/strict';
14
+ import { readFileSync } from 'node:fs';
15
+ import { fileURLToPath } from 'node:url';
16
+ import { dirname, join } from 'node:path';
17
+
18
+ const __filename = fileURLToPath(import.meta.url);
19
+ const __dirname = dirname(__filename);
20
+
21
+ const source = readFileSync(join(__dirname, '..', 'auto-start.ts'), 'utf-8');
22
+
23
+ describe('isolation:none stale branch guard (#3675)', () => {
24
+ test('checks for milestone/ branch prefix', () => {
25
+ assert.match(source, /startsWith\(["']milestone\//,
26
+ 'auto-start should check for milestone/ branch prefix');
27
+ });
28
+
29
+ test('imports nativeGetCurrentBranch', () => {
30
+ assert.match(source, /nativeGetCurrentBranch/,
31
+ 'auto-start should import nativeGetCurrentBranch');
32
+ });
33
+
34
+ test('imports nativeDetectMainBranch', () => {
35
+ assert.match(source, /nativeDetectMainBranch/,
36
+ 'auto-start should import nativeDetectMainBranch');
37
+ });
38
+
39
+ test('imports nativeCheckoutBranch', () => {
40
+ assert.match(source, /nativeCheckoutBranch/,
41
+ 'auto-start should import nativeCheckoutBranch');
42
+ });
43
+
44
+ test('guard is conditional on isolation mode "none"', () => {
45
+ assert.match(source, /getIsolationMode\(\)\s*===\s*["']none["']/,
46
+ 'guard should only activate when isolation mode is "none"');
47
+ });
48
+
49
+ test('calls nativeCheckoutBranch to return to integration branch', () => {
50
+ assert.match(source, /nativeCheckoutBranch\(base,\s*integrationBranch\)/,
51
+ 'should checkout to the integration branch');
52
+ });
53
+
54
+ test('guard is wrapped in try-catch (non-fatal)', () => {
55
+ // Find the milestone/ check and verify it is inside a try block
56
+ const milestoneIdx = source.indexOf('startsWith("milestone/")');
57
+ assert.ok(milestoneIdx > 0, 'milestone/ check should exist');
58
+ const before = source.slice(Math.max(0, milestoneIdx - 500), milestoneIdx);
59
+ assert.match(before, /try\s*\{/,
60
+ 'milestone branch guard should be inside a try block');
61
+ });
62
+ });
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Regression test for #3670 — needs-remediation verdict forces re-validation
3
+ *
4
+ * When validation returns needs-remediation, the state machine must route
5
+ * back to validating-milestone instead of completing-milestone. Without this,
6
+ * dispatch blocks completion for needs-remediation while state derives
7
+ * completing-milestone, creating a permanent deadlock.
8
+ *
9
+ * This structural test verifies the verdict === 'needs-remediation' guard
10
+ * exists at all three derivation paths in state.ts.
11
+ */
12
+
13
+ import { describe, test } from 'node:test';
14
+ import assert from 'node:assert/strict';
15
+ import { readFileSync } from 'node:fs';
16
+ import { fileURLToPath } from 'node:url';
17
+ import { dirname, join } from 'node:path';
18
+
19
+ const __filename = fileURLToPath(import.meta.url);
20
+ const __dirname = dirname(__filename);
21
+
22
+ const source = readFileSync(join(__dirname, '..', 'state.ts'), 'utf-8');
23
+
24
+ describe('needs-remediation revalidation guard (#3670)', () => {
25
+ test('verdict === needs-remediation guard exists in state.ts', () => {
26
+ const matches = source.match(/verdict\s*===\s*['"]needs-remediation['"]/g);
27
+ assert.ok(matches, 'verdict === "needs-remediation" check must exist in state.ts');
28
+ assert.ok(matches.length >= 2,
29
+ `Expected at least 2 needs-remediation guards (deriveStateFromDb + _deriveStateImpl), found ${matches.length}`);
30
+ });
31
+
32
+ test('needsRevalidation variable is derived from verdict', () => {
33
+ assert.match(source, /needsRevalidation.*=.*verdict\s*===\s*['"]needs-remediation['"]/,
34
+ 'needsRevalidation should incorporate verdict === "needs-remediation"');
35
+ });
36
+
37
+ test('deriveStateFromDb path uses needs-remediation guard', () => {
38
+ assert.match(source, /!validationTerminal\s*\|\|\s*verdict\s*===\s*['"]needs-remediation['"]/,
39
+ 'deriveStateFromDb should check !validationTerminal || verdict === "needs-remediation"');
40
+ });
41
+
42
+ test('extractVerdict is called on validation content', () => {
43
+ const extractCalls = source.match(/extractVerdict\(validationContent\)/g);
44
+ assert.ok(extractCalls, 'extractVerdict should be called on validation content');
45
+ assert.ok(extractCalls.length >= 2,
46
+ `Expected at least 2 extractVerdict calls, found ${extractCalls.length}`);
47
+ });
48
+ });
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Regression test for #3578 — note captures marked as executed
3
+ *
4
+ * Note-classified captures were stuck in "resolved but not executed" limbo
5
+ * because executeTriageResolutions only handled inject/replan/defer. The fix
6
+ * adds a filter for classification === "note" and calls markCaptureExecuted
7
+ * for each matching capture.
8
+ *
9
+ * Structural verification test — reads source to confirm the note filter
10
+ * and markCaptureExecuted call exist.
11
+ */
12
+
13
+ import { describe, test } from 'node:test';
14
+ import assert from 'node:assert/strict';
15
+ import { readFileSync } from 'node:fs';
16
+ import { fileURLToPath } from 'node:url';
17
+ import { dirname, join } from 'node:path';
18
+
19
+ const __filename = fileURLToPath(import.meta.url);
20
+ const __dirname = dirname(__filename);
21
+
22
+ const source = readFileSync(join(__dirname, '..', 'triage-resolution.ts'), 'utf-8');
23
+
24
+ describe('note captures executed in triage resolution (#3578)', () => {
25
+ test('markCaptureExecuted is imported', () => {
26
+ assert.match(source, /markCaptureExecuted/,
27
+ 'markCaptureExecuted should be imported');
28
+ });
29
+
30
+ test('note classification filter exists', () => {
31
+ assert.match(source, /classification\s*===\s*"note"/,
32
+ 'filter should check classification === "note"');
33
+ });
34
+
35
+ test('note filter checks resolved status and not-executed', () => {
36
+ assert.match(source, /status\s*===\s*"resolved"\s*&&\s*!c\.executed\s*&&\s*c\.classification\s*===\s*"note"/,
37
+ 'filter should check resolved + not-executed + note classification');
38
+ });
39
+
40
+ test('markCaptureExecuted is called for note captures', () => {
41
+ // The source should call markCaptureExecuted for note captures
42
+ const noteSection = source.slice(source.indexOf('classification === "note"'));
43
+ assert.match(noteSection, /markCaptureExecuted\(basePath,\s*cap\.id\)/,
44
+ 'markCaptureExecuted should be called for note captures');
45
+ });
46
+ });
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Parallel research slices dispatch — structural tests.
3
+ *
4
+ * Verifies the dispatch rule and prompt builder exist with correct structure.
5
+ */
6
+
7
+ import test from "node:test";
8
+ import assert from "node:assert/strict";
9
+ import { readFileSync } from "node:fs";
10
+ import { join, dirname } from "node:path";
11
+ import { fileURLToPath } from "node:url";
12
+
13
+ const __dirname = dirname(fileURLToPath(import.meta.url));
14
+
15
+ const dispatchSrc = readFileSync(join(__dirname, "..", "auto-dispatch.ts"), "utf-8");
16
+ const promptsSrc = readFileSync(join(__dirname, "..", "auto-prompts.ts"), "utf-8");
17
+ const templatePath = join(__dirname, "..", "prompts", "parallel-research-slices.md");
18
+ const templateSrc = readFileSync(templatePath, "utf-8");
19
+
20
+ // ─── Dispatch rule ────────────────────────────────────────────────────────
21
+
22
+ test("dispatch: parallel-research-slices rule exists", () => {
23
+ assert.ok(
24
+ dispatchSrc.includes("parallel-research-slices"),
25
+ "dispatch table should have parallel-research-slices rule",
26
+ );
27
+ });
28
+
29
+ test("dispatch: parallel-research-slices requires 2+ slices", () => {
30
+ assert.ok(
31
+ dispatchSrc.includes("researchReadySlices.length < 2"),
32
+ "rule should require at least 2 slices for parallel dispatch",
33
+ );
34
+ });
35
+
36
+ test("dispatch: parallel-research-slices respects skip_research", () => {
37
+ const ruleIdx = dispatchSrc.indexOf("parallel-research-slices");
38
+ const ruleBlock = dispatchSrc.slice(ruleIdx, ruleIdx + 500);
39
+ assert.ok(
40
+ ruleBlock.includes("skip_research") || dispatchSrc.slice(ruleIdx - 300, ruleIdx).includes("skip_research"),
41
+ "rule should check skip_research preference",
42
+ );
43
+ });
44
+
45
+ // ─── Prompt builder ───────────────────────────────────────────────────────
46
+
47
+ test("prompt: buildParallelResearchSlicesPrompt exported", () => {
48
+ assert.ok(
49
+ promptsSrc.includes("export async function buildParallelResearchSlicesPrompt"),
50
+ "buildParallelResearchSlicesPrompt should be exported",
51
+ );
52
+ });
53
+
54
+ test("prompt: builds per-slice subagent prompts", () => {
55
+ assert.ok(
56
+ promptsSrc.includes("buildResearchSlicePrompt"),
57
+ "parallel prompt builder should delegate to per-slice research prompts",
58
+ );
59
+ });
60
+
61
+ // ─── Template ─────────────────────────────────────────────────────────────
62
+
63
+ test("template: parallel-research-slices.md has required variables", () => {
64
+ assert.ok(templateSrc.includes("{{sliceCount}}"), "template should use sliceCount");
65
+ assert.ok(templateSrc.includes("{{mid}}"), "template should use mid");
66
+ assert.ok(templateSrc.includes("{{subagentPrompts}}"), "template should use subagentPrompts");
67
+ });
68
+
69
+ // ─── Validate milestone prompt ────────────────────────────────────────────
70
+
71
+ test("template: validate-milestone uses parallel reviewers", () => {
72
+ const validateSrc = readFileSync(join(__dirname, "..", "prompts", "validate-milestone.md"), "utf-8");
73
+ assert.ok(
74
+ validateSrc.includes("Reviewer A") && validateSrc.includes("Reviewer B") && validateSrc.includes("Reviewer C"),
75
+ "validate-milestone should dispatch 3 parallel reviewers",
76
+ );
77
+ });
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Regression test for #3671 — isGhostMilestone detects phantom queued rows
3
+ *
4
+ * gsd_milestone_generate_id inserts a DB row with status "queued" as a side
5
+ * effect. If the milestone is never planned, isGhostMilestone previously
6
+ * returned false for any milestone with a DB row, blocking the state machine.
7
+ *
8
+ * The fix makes isGhostMilestone treat a "queued" DB row with no disk
9
+ * artifacts (CONTEXT, ROADMAP, SUMMARY) as a ghost.
10
+ *
11
+ * This structural test verifies the dbRow.status === 'queued' guard exists.
12
+ */
13
+
14
+ import { describe, test } from 'node:test';
15
+ import assert from 'node:assert/strict';
16
+ import { readFileSync } from 'node:fs';
17
+ import { fileURLToPath } from 'node:url';
18
+ import { dirname, join } from 'node:path';
19
+
20
+ const __filename = fileURLToPath(import.meta.url);
21
+ const __dirname = dirname(__filename);
22
+
23
+ const source = readFileSync(join(__dirname, '..', 'state.ts'), 'utf-8');
24
+
25
+ describe('isGhostMilestone phantom queued detection (#3671)', () => {
26
+ test('isGhostMilestone function exists', () => {
27
+ assert.match(source, /export function isGhostMilestone\(/,
28
+ 'isGhostMilestone should be exported');
29
+ });
30
+
31
+ test('checks dbRow.status === queued', () => {
32
+ assert.match(source, /dbRow\.status\s*===\s*['"]queued['"]/,
33
+ 'isGhostMilestone should check dbRow.status === "queued"');
34
+ });
35
+
36
+ test('checks for CONTEXT disk artifact', () => {
37
+ assert.match(source, /resolveMilestoneFile\(basePath,\s*mid,\s*["']CONTEXT["']\)/,
38
+ 'should check for CONTEXT file');
39
+ });
40
+
41
+ test('checks for ROADMAP disk artifact', () => {
42
+ assert.match(source, /resolveMilestoneFile\(basePath,\s*mid,\s*["']ROADMAP["']\)/,
43
+ 'should check for ROADMAP file');
44
+ });
45
+
46
+ test('checks for SUMMARY disk artifact', () => {
47
+ assert.match(source, /resolveMilestoneFile\(basePath,\s*mid,\s*["']SUMMARY["']\)/,
48
+ 'should check for SUMMARY file');
49
+ });
50
+
51
+ test('returns !hasContent for queued rows (ghost if no artifacts)', () => {
52
+ assert.match(source, /return !hasContent/,
53
+ 'should return !hasContent for queued phantom milestones');
54
+ });
55
+ });
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Regression test for #3695 — insertMilestone defaults status to "queued"
3
+ *
4
+ * Milestones were being auto-created with status "active", causing phantom
5
+ * milestones to appear as active work. The fix defaults to "queued" so
6
+ * new milestones must be explicitly activated.
7
+ */
8
+
9
+ import { describe, test } from 'node:test';
10
+ import assert from 'node:assert/strict';
11
+ import { readFileSync } from 'node:fs';
12
+ import { fileURLToPath } from 'node:url';
13
+ import { dirname, join } from 'node:path';
14
+
15
+ const __filename = fileURLToPath(import.meta.url);
16
+ const __dirname = dirname(__filename);
17
+
18
+ const dbSrc = readFileSync(
19
+ join(__dirname, '..', 'gsd-db.ts'),
20
+ 'utf-8',
21
+ );
22
+
23
+ describe('insertMilestone defaults status to queued (#3695)', () => {
24
+ test('insertMilestone function exists', () => {
25
+ assert.match(dbSrc, /export function insertMilestone\(/,
26
+ 'insertMilestone should be exported from gsd-db.ts');
27
+ });
28
+
29
+ test('default status is "queued" not "active"', () => {
30
+ // The status parameter should default to "queued" via nullish coalescing
31
+ assert.match(dbSrc, /m\.status\s*\?\?\s*"queued"/,
32
+ 'insertMilestone should default status to "queued"');
33
+ });
34
+
35
+ test('comment explains the rationale', () => {
36
+ assert.match(dbSrc, /never auto-create milestones as "active"/i,
37
+ 'should have a comment explaining why default is queued');
38
+ });
39
+ });
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Regression test for #3626 / #3649 — pre-execution-checks false positives
3
+ *
4
+ * Two sources of false positives were fixed:
5
+ * 1. normalizeFilePath did not strip backtick wrapping from LLM-generated
6
+ * paths like `src/foo.ts`, causing file-existence checks to fail (#3649).
7
+ * 2. checkFilePathConsistency checked both task.files and task.inputs, but
8
+ * task.files ("files likely touched") intentionally includes files that
9
+ * will be created by the task, so they don't need to pre-exist (#3626).
10
+ */
11
+
12
+ import { describe, it } from 'node:test'
13
+ import assert from 'node:assert/strict'
14
+ import { normalizeFilePath, checkFilePathConsistency } from '../pre-execution-checks.ts'
15
+ import { readFileSync } from 'node:fs'
16
+ import { resolve } from 'node:path'
17
+
18
+ const src = readFileSync(
19
+ resolve(process.cwd(), 'src', 'resources', 'extensions', 'gsd', 'pre-execution-checks.ts'),
20
+ 'utf-8',
21
+ )
22
+
23
+ describe('normalizeFilePath backtick stripping (#3649)', () => {
24
+ it('strips backticks from file paths', () => {
25
+ assert.equal(normalizeFilePath('`src/foo.ts`'), 'src/foo.ts')
26
+ })
27
+
28
+ it('strips backticks even when mixed with other normalization', () => {
29
+ assert.equal(normalizeFilePath('`./src//bar.ts`'), 'src/bar.ts')
30
+ })
31
+
32
+ it('leaves normal paths unchanged', () => {
33
+ assert.equal(normalizeFilePath('src/foo.ts'), 'src/foo.ts')
34
+ })
35
+
36
+ it('handles empty string', () => {
37
+ assert.equal(normalizeFilePath(''), '')
38
+ })
39
+ })
40
+
41
+ describe('checkFilePathConsistency checks task.inputs not task.files (#3626)', () => {
42
+ it('source uses only task.inputs in filesToCheck', () => {
43
+ // Verify the fix structurally: the spread should be [...task.inputs] only
44
+ const fnStart = src.indexOf('export function checkFilePathConsistency(')
45
+ assert.ok(fnStart !== -1, 'checkFilePathConsistency function must exist')
46
+
47
+ // Find the filesToCheck assignment
48
+ const filesToCheckLine = src.indexOf('filesToCheck', fnStart)
49
+ assert.ok(filesToCheckLine !== -1, 'filesToCheck assignment must exist')
50
+
51
+ // Extract the line
52
+ const lineEnd = src.indexOf('\n', filesToCheckLine)
53
+ const line = src.slice(filesToCheckLine, lineEnd)
54
+
55
+ // Must include task.inputs
56
+ assert.ok(
57
+ line.includes('task.inputs'),
58
+ 'filesToCheck must reference task.inputs',
59
+ )
60
+
61
+ // Must NOT include task.files
62
+ assert.ok(
63
+ !line.includes('task.files'),
64
+ 'filesToCheck must NOT reference task.files — files likely touched include ' +
65
+ 'files the task will create, so they do not need to pre-exist',
66
+ )
67
+ })
68
+ })