gsd-pi 2.80.0-dev.42bd34838 → 2.80.0-dev.488219eb6

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 (509) hide show
  1. package/dist/claude-cli-check.d.ts +30 -0
  2. package/dist/claude-cli-check.js +18 -7
  3. package/dist/cli.js +0 -19
  4. package/dist/headless-query.d.ts +10 -0
  5. package/dist/headless-query.js +6 -4
  6. package/dist/loader-entrypoint.d.ts +8 -0
  7. package/dist/loader-entrypoint.js +27 -0
  8. package/dist/loader.js +2 -11
  9. package/dist/mcp-server.d.ts +1 -0
  10. package/dist/mcp-server.js +6 -3
  11. package/dist/resources/.managed-resources-content-hash +1 -1
  12. package/dist/resources/extensions/claude-code-cli/readiness.js +18 -7
  13. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +29 -0
  14. package/dist/resources/extensions/github-sync/sync.js +4 -1
  15. package/dist/resources/extensions/gsd/auto/loop.js +71 -8
  16. package/dist/resources/extensions/gsd/auto/phases.js +179 -99
  17. package/dist/resources/extensions/gsd/auto/resolve.js +12 -0
  18. package/dist/resources/extensions/gsd/auto/run-unit.js +10 -30
  19. package/dist/resources/extensions/gsd/auto/session.js +8 -0
  20. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
  21. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
  22. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
  23. package/dist/resources/extensions/gsd/auto-dispatch.js +16 -0
  24. package/dist/resources/extensions/gsd/auto-post-unit.js +94 -76
  25. package/dist/resources/extensions/gsd/auto-prompts.js +90 -15
  26. package/dist/resources/extensions/gsd/auto-start.js +238 -12
  27. package/dist/resources/extensions/gsd/auto-worktree.js +209 -81
  28. package/dist/resources/extensions/gsd/auto.js +95 -44
  29. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +96 -26
  30. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +44 -37
  31. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -10
  32. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +6 -3
  33. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -1
  34. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -4
  35. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -3
  36. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
  37. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +298 -54
  38. package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
  39. package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
  40. package/dist/resources/extensions/gsd/clean-root-preflight.js +24 -6
  41. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  42. package/dist/resources/extensions/gsd/commands-config.js +1 -1
  43. package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
  44. package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
  45. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  46. package/dist/resources/extensions/gsd/db/unit-dispatches.js +53 -0
  47. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
  48. package/dist/resources/extensions/gsd/git-service.js +37 -1
  49. package/dist/resources/extensions/gsd/guided-flow.js +61 -32
  50. package/dist/resources/extensions/gsd/init-wizard.js +4 -1
  51. package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
  52. package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
  53. package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
  54. package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
  55. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +8 -4
  56. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  57. package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
  58. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  59. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  60. package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
  61. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
  62. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
  63. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  64. package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
  65. package/dist/resources/extensions/gsd/worktree-resolver.js +57 -5
  66. package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  67. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  68. package/dist/web/standalone/.next/BUILD_ID +1 -1
  69. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  70. package/dist/web/standalone/.next/build-manifest.json +3 -3
  71. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  72. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  73. package/dist/web/standalone/.next/required-server-files.json +1 -1
  74. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  75. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  76. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  77. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  78. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  79. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  80. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  81. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  82. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  83. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  84. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  85. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  91. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/index.html +1 -1
  93. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  94. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  95. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  96. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  100. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  101. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  102. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  103. package/dist/web/standalone/.next/server/middleware.js +3 -3
  104. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  105. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  106. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  107. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
  108. package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
  109. package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
  110. package/dist/web/standalone/server.js +1 -1
  111. package/dist/welcome-screen.d.ts +2 -0
  112. package/dist/welcome-screen.js +9 -7
  113. package/package.json +1 -1
  114. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  115. package/packages/pi-agent-core/dist/agent-loop.js +4 -1
  116. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  117. package/packages/pi-agent-core/dist/agent.d.ts +5 -0
  118. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  119. package/packages/pi-agent-core/dist/agent.js +2 -0
  120. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  121. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  122. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  123. package/packages/pi-agent-core/dist/index.js +2 -0
  124. package/packages/pi-agent-core/dist/index.js.map +1 -1
  125. package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
  126. package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
  127. package/packages/pi-agent-core/dist/token-audit.js +221 -0
  128. package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
  129. package/packages/pi-agent-core/dist/types.d.ts +9 -0
  130. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  131. package/packages/pi-agent-core/dist/types.js.map +1 -1
  132. package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
  133. package/packages/pi-agent-core/src/agent-loop.ts +4 -1
  134. package/packages/pi-agent-core/src/agent.ts +8 -0
  135. package/packages/pi-agent-core/src/index.ts +2 -0
  136. package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
  137. package/packages/pi-agent-core/src/token-audit.ts +287 -0
  138. package/packages/pi-agent-core/src/types.ts +14 -0
  139. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  140. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
  141. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  142. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
  143. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
  144. package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
  145. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  146. package/packages/pi-ai/dist/providers/anthropic.js +9 -7
  147. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  148. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
  149. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
  150. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
  151. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  152. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
  153. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
  154. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
  155. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
  156. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
  157. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
  158. package/packages/pi-ai/src/providers/anthropic.ts +22 -9
  159. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
  160. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
  161. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
  162. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
  163. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  164. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +18 -0
  165. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  166. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +12 -0
  167. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  168. package/packages/pi-coding-agent/dist/core/agent-session.js +36 -7
  169. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  170. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +3 -1
  171. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  172. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  173. package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
  174. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  175. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -0
  176. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  177. package/packages/pi-coding-agent/dist/core/extensions/runner.js +3 -6
  178. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  179. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +3 -3
  180. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  181. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +34 -3
  182. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  183. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  184. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
  185. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
  186. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
  187. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
  188. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
  189. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
  190. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
  191. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  192. package/packages/pi-coding-agent/dist/core/sdk.js +74 -2
  193. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  194. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
  195. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  196. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
  197. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  198. package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
  199. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  200. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
  201. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
  202. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
  203. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  204. package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
  205. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  206. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
  207. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  208. package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
  209. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  210. package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
  211. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  212. package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
  213. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  214. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
  215. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  216. package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
  217. package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  218. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
  219. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  220. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
  221. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  222. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
  223. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  224. package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
  225. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  226. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
  227. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  228. package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
  229. package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  230. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
  231. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  232. package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
  233. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  234. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
  235. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
  236. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
  237. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
  238. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
  239. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
  240. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
  241. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
  242. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
  243. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
  244. package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
  245. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  246. package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
  247. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  248. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +89 -2
  249. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  250. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +25 -1
  251. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  252. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +5 -0
  253. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  254. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +153 -8
  255. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  256. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  257. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +18 -1
  258. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  259. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +23 -5
  260. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  261. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  262. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  263. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +19 -0
  264. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  265. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +23 -5
  266. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -1
  267. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +25 -0
  268. package/packages/pi-coding-agent/src/core/agent-session.ts +40 -7
  269. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +3 -1
  270. package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
  271. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +3 -3
  272. package/packages/pi-coding-agent/src/core/extensions/runner.ts +5 -5
  273. package/packages/pi-coding-agent/src/core/extensions/types.ts +37 -2
  274. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
  275. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
  276. package/packages/pi-coding-agent/src/core/sdk.ts +85 -3
  277. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
  278. package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
  279. package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
  280. package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
  281. package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
  282. package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
  283. package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
  284. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
  285. package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
  286. package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
  287. package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
  288. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
  289. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
  290. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
  291. package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
  292. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +119 -2
  293. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -1
  294. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +177 -8
  295. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +24 -5
  296. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +17 -1
  297. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +21 -0
  298. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +25 -8
  299. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  300. package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
  301. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +30 -0
  302. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +26 -0
  303. package/src/resources/extensions/github-sync/sync.ts +8 -1
  304. package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
  305. package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -2
  306. package/src/resources/extensions/gsd/auto/loop.ts +84 -8
  307. package/src/resources/extensions/gsd/auto/phases.ts +258 -159
  308. package/src/resources/extensions/gsd/auto/resolve.ts +19 -0
  309. package/src/resources/extensions/gsd/auto/run-unit.ts +10 -29
  310. package/src/resources/extensions/gsd/auto/session.ts +8 -0
  311. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
  312. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
  313. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
  314. package/src/resources/extensions/gsd/auto-dispatch.ts +16 -0
  315. package/src/resources/extensions/gsd/auto-post-unit.ts +107 -78
  316. package/src/resources/extensions/gsd/auto-prompts.ts +95 -14
  317. package/src/resources/extensions/gsd/auto-start.ts +286 -15
  318. package/src/resources/extensions/gsd/auto-worktree.ts +241 -72
  319. package/src/resources/extensions/gsd/auto.ts +132 -40
  320. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +116 -24
  321. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
  322. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
  323. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +8 -3
  324. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
  325. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
  326. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
  327. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
  328. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +347 -54
  329. package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
  330. package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
  331. package/src/resources/extensions/gsd/clean-root-preflight.ts +32 -7
  332. package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
  333. package/src/resources/extensions/gsd/commands-config.ts +1 -1
  334. package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
  335. package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
  336. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  337. package/src/resources/extensions/gsd/db/unit-dispatches.ts +66 -0
  338. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
  339. package/src/resources/extensions/gsd/git-service.ts +41 -2
  340. package/src/resources/extensions/gsd/guided-flow.ts +71 -39
  341. package/src/resources/extensions/gsd/init-wizard.ts +5 -1
  342. package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
  343. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  344. package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
  345. package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
  346. package/src/resources/extensions/gsd/prompts/complete-milestone.md +8 -4
  347. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  348. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  349. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  350. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  351. package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
  352. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
  353. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
  354. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
  355. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
  356. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
  357. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +361 -10
  358. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
  359. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
  360. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
  361. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +106 -0
  362. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
  363. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
  364. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
  365. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
  366. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
  367. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
  368. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
  369. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +138 -0
  370. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
  371. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
  372. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
  373. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
  374. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
  375. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
  376. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
  377. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +15 -6
  378. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
  379. package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
  380. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
  381. package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
  382. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
  383. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
  384. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
  385. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
  386. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
  387. package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
  388. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +35 -31
  389. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +5 -1
  390. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  391. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
  392. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +4 -9
  393. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
  394. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
  395. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
  396. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
  397. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
  398. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
  399. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
  400. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
  401. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  402. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +132 -0
  403. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
  404. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
  405. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
  406. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
  407. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
  408. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
  409. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +12 -0
  410. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
  411. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
  412. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
  413. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +5 -1
  414. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
  415. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
  416. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
  417. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
  418. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +1 -0
  419. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +242 -0
  420. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +79 -98
  421. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
  422. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
  423. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
  424. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
  425. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -0
  426. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +133 -0
  427. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  428. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  429. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
  430. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
  431. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +91 -75
  432. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
  433. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
  434. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
  435. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
  436. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
  437. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
  438. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
  439. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
  440. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
  441. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  442. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -125
  443. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
  444. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
  445. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
  446. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
  447. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
  448. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
  449. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
  450. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
  451. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
  452. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
  453. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
  454. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  455. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
  456. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
  457. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +166 -0
  458. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
  459. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
  460. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
  461. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
  462. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
  463. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
  464. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
  465. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -97
  466. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
  467. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
  468. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
  469. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
  470. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
  471. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -0
  472. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +33 -47
  473. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
  474. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
  475. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
  476. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
  477. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  478. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
  479. package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
  480. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
  481. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
  482. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
  483. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +50 -1
  484. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
  485. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
  486. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
  487. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
  488. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
  489. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
  490. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  491. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
  492. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
  493. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
  494. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +14 -13
  495. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +1 -0
  496. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
  497. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
  498. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  499. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +140 -3
  500. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
  501. package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
  502. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  503. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  504. package/src/resources/extensions/gsd/worktree-resolver.ts +83 -5
  505. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
  506. package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  507. package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
  508. /package/dist/web/standalone/.next/static/{tht0ltP8EIjsohPOA_WZf → G68KoLv5claox_Dyd4pZn}/_buildManifest.js +0 -0
  509. /package/dist/web/standalone/.next/static/{tht0ltP8EIjsohPOA_WZf → G68KoLv5claox_Dyd4pZn}/_ssgManifest.js +0 -0
@@ -1,63 +1,79 @@
1
1
  /**
2
- * Regression test: S##-CONTEXT.md from slice discussion must be
3
- * injected into all 5 downstream prompt builders (#3452).
4
- *
5
- * Scans auto-prompts.ts for the 5 builder functions and verifies
6
- * each one resolves and inlines the slice-level CONTEXT file.
2
+ * Regression test: S##-CONTEXT.md from slice discussion is injected into
3
+ * downstream prompt builders (#3452).
7
4
  */
8
5
 
9
6
  import { describe, test } from "node:test";
10
7
  import assert from "node:assert/strict";
11
- import { readFileSync } from "node:fs";
12
- import { join, dirname } from "node:path";
13
- import { fileURLToPath } from "node:url";
14
- import { extractSourceRegion } from "./test-helpers.ts";
8
+ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
9
+ import { join } from "node:path";
10
+ import { tmpdir } from "node:os";
15
11
 
16
- const __dirname = dirname(fileURLToPath(import.meta.url));
17
- const autoPromptsPath = join(__dirname, "..", "auto-prompts.ts");
18
- const source = readFileSync(autoPromptsPath, "utf-8");
12
+ import {
13
+ buildCompleteSlicePrompt,
14
+ buildPlanSlicePrompt,
15
+ buildReassessRoadmapPrompt,
16
+ buildReplanSlicePrompt,
17
+ buildResearchSlicePrompt,
18
+ } from "../auto-prompts.ts";
19
19
 
20
- const BUILDERS = [
21
- "buildResearchSlicePrompt",
22
- "buildPlanSlicePrompt",
23
- "buildCompleteSlicePrompt",
24
- "buildReplanSlicePrompt",
25
- "buildReassessRoadmapPrompt",
26
- ];
20
+ function makeSliceContextFixture(): string {
21
+ const base = mkdtempSync(join(tmpdir(), "gsd-slice-context-"));
22
+ const milestoneDir = join(base, ".gsd", "milestones", "M001");
23
+ const sliceDir = join(milestoneDir, "slices", "S01");
24
+ mkdirSync(join(sliceDir, "tasks"), { recursive: true });
25
+ writeFileSync(
26
+ join(milestoneDir, "M001-ROADMAP.md"),
27
+ [
28
+ "# M001: Context Injection",
29
+ "",
30
+ "## Slices",
31
+ "- [ ] **S01: Context-heavy slice** `risk:low`",
32
+ " Demo: context appears in prompts.",
33
+ ].join("\n"),
34
+ "utf-8",
35
+ );
36
+ writeFileSync(join(milestoneDir, "M001-CONTEXT.md"), "# M001 Context\n", "utf-8");
37
+ writeFileSync(
38
+ join(sliceDir, "S01-CONTEXT.md"),
39
+ "# Slice Context\n\nUnique slice context marker: SLICE-CONTEXT-3452\n",
40
+ "utf-8",
41
+ );
42
+ writeFileSync(
43
+ join(sliceDir, "S01-PLAN.md"),
44
+ [
45
+ "# S01: Context-heavy slice",
46
+ "",
47
+ "**Goal:** Test context injection.",
48
+ "**Demo:** Prompt contains the marker.",
49
+ "",
50
+ "## Tasks",
51
+ "- [ ] **T01: Task** `est:10m`",
52
+ ].join("\n"),
53
+ "utf-8",
54
+ );
55
+ return base;
56
+ }
27
57
 
28
58
  describe("slice CONTEXT.md injection into prompt builders (#3452)", () => {
29
- for (const builder of BUILDERS) {
30
- test(`${builder} resolves slice CONTEXT file`, () => {
31
- // Find the function body
32
- const fnStart = source.indexOf(`export async function ${builder}`);
33
- assert.ok(fnStart !== -1, `${builder} should exist in auto-prompts.ts`);
59
+ const builders: Array<[string, (base: string) => Promise<string>]> = [
60
+ ["buildResearchSlicePrompt", (base) => buildResearchSlicePrompt("M001", "Context Injection", "S01", "Context-heavy slice", base)],
61
+ ["buildPlanSlicePrompt", (base) => buildPlanSlicePrompt("M001", "Context Injection", "S01", "Context-heavy slice", base)],
62
+ ["buildCompleteSlicePrompt", (base) => buildCompleteSlicePrompt("M001", "Context Injection", "S01", "Context-heavy slice", base)],
63
+ ["buildReplanSlicePrompt", (base) => buildReplanSlicePrompt("M001", "Context Injection", "S01", "Context-heavy slice", base)],
64
+ ["buildReassessRoadmapPrompt", (base) => buildReassessRoadmapPrompt("M001", "Context Injection", "S01", base)],
65
+ ];
34
66
 
35
- // Get a reasonable chunk after the function start
36
- const chunk = extractSourceRegion(source, `export async function ${builder}`);
37
-
38
- // ADR-011: buildPlanSlicePrompt / buildRefineSlicePrompt now delegate to
39
- // a shared helper (renderSlicePrompt) that performs the slice CONTEXT
40
- // resolve. When a builder delegates, scan the helper's body instead.
41
- const delegatesToHelper = chunk.includes("renderSlicePrompt(");
42
- const bodyToCheck = delegatesToHelper
43
- ? (() => {
44
- const helperStart = source.indexOf("async function renderSlicePrompt");
45
- assert.ok(helperStart !== -1, "renderSlicePrompt helper must exist");
46
- return extractSourceRegion(source, "async function renderSlicePrompt");
47
- })()
48
- : chunk;
49
-
50
- // Must resolve the slice CONTEXT path
51
- assert.ok(
52
- bodyToCheck.includes('resolveSliceFile(base, mid,') && bodyToCheck.includes('"CONTEXT"'),
53
- `${builder} should call resolveSliceFile with "CONTEXT" (directly or via renderSlicePrompt)`,
54
- );
55
-
56
- // Must inline it with inlineFileOptional
57
- assert.ok(
58
- bodyToCheck.includes("Slice Context"),
59
- `${builder} should inline slice CONTEXT with a "Slice Context" label`,
60
- );
67
+ for (const [name, build] of builders) {
68
+ test(`${name} includes slice discussion context`, async () => {
69
+ const base = makeSliceContextFixture();
70
+ try {
71
+ const prompt = await build(base);
72
+ assert.match(prompt, /Slice Context/);
73
+ assert.match(prompt, /SLICE-CONTEXT-3452/);
74
+ } finally {
75
+ rmSync(base, { recursive: true, force: true });
76
+ }
61
77
  });
62
78
  }
63
79
  });
@@ -1,20 +1,20 @@
1
- /**
2
- * Structural tests for slice-level parallel orchestrator.
3
- * Verifies the orchestrator module exists and has the correct shape,
4
- * env var usage, and preference gating.
5
- */
1
+ // GSD-2 — Slice parallel orchestrator behavior tests.
6
2
 
7
3
  import { describe, it } from "node:test";
8
4
  import assert from "node:assert/strict";
9
5
  import { execFileSync, spawn } from "node:child_process";
10
6
  import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
11
- import { join, dirname } from "node:path";
7
+ import { join } from "node:path";
12
8
  import { tmpdir } from "node:os";
13
- import { fileURLToPath } from "node:url";
14
- import { restoreSliceState, SLICE_WORKER_AUTO_ARGS } from "../slice-parallel-orchestrator.ts";
15
9
 
16
- const __dirname = dirname(fileURLToPath(import.meta.url));
17
- const gsdDir = join(__dirname, "..");
10
+ import { deriveState } from "../state.js";
11
+ import { validatePreferences } from "../preferences-validation.ts";
12
+ import {
13
+ _buildSliceWorkerEnvForTest,
14
+ _resolveSliceParallelMaxWorkersForTest,
15
+ restoreSliceState,
16
+ SLICE_WORKER_AUTO_ARGS,
17
+ } from "../slice-parallel-orchestrator.ts";
18
18
 
19
19
  function readLinuxProcessStartFingerprint(pid: number): string | null {
20
20
  try {
@@ -83,81 +83,31 @@ function writeSliceOrchestratorState(
83
83
  );
84
84
  }
85
85
 
86
- describe("slice-parallel-orchestrator structural tests", () => {
87
- it("orchestrator uses GSD_SLICE_LOCK env var", () => {
88
- const source = readFileSync(join(gsdDir, "slice-parallel-orchestrator.ts"), "utf-8");
89
- assert.ok(
90
- source.includes("GSD_SLICE_LOCK"),
91
- "Orchestrator must use GSD_SLICE_LOCK env var to isolate slice workers",
92
- );
93
- });
94
-
95
- it("orchestrator sets GSD_PARALLEL_WORKER=1 to prevent nesting", () => {
96
- const source = readFileSync(join(gsdDir, "slice-parallel-orchestrator.ts"), "utf-8");
97
- assert.ok(
98
- source.includes("GSD_PARALLEL_WORKER"),
99
- "Orchestrator must set GSD_PARALLEL_WORKER to prevent nested parallel",
100
- );
101
- });
102
-
103
- it("slice workers use headless auto instead of print-mode slash commands", () => {
104
- const args: readonly string[] = SLICE_WORKER_AUTO_ARGS;
105
- assert.deepEqual([...args], ["headless", "--json", "auto"]);
106
- assert.equal(args.includes("--print"), false);
107
- });
108
-
109
- it("maxWorkers default is 2", () => {
110
- const source = readFileSync(join(gsdDir, "slice-parallel-orchestrator.ts"), "utf-8");
111
- // Check that default max workers is 2 (in opts.maxWorkers ?? 2 or similar)
112
- assert.ok(
113
- source.includes("maxWorkers") && source.includes("2"),
114
- "Default maxWorkers should be 2",
115
- );
116
- });
117
-
118
- it("orchestrator imports GSD_MILESTONE_LOCK for milestone isolation", () => {
119
- const source = readFileSync(join(gsdDir, "slice-parallel-orchestrator.ts"), "utf-8");
120
- assert.ok(
121
- source.includes("GSD_MILESTONE_LOCK"),
122
- "Orchestrator must also pass GSD_MILESTONE_LOCK for milestone context",
123
- );
86
+ describe("slice worker launch contract", () => {
87
+ it("uses headless auto instead of print-mode slash commands", () => {
88
+ assert.deepEqual([...SLICE_WORKER_AUTO_ARGS], ["headless", "--json", "auto"]);
89
+ assert.equal(SLICE_WORKER_AUTO_ARGS.includes("--print" as never), false);
124
90
  });
125
91
 
126
- it("recovery preserves terminal workers for coordinator-side collection", () => {
127
- const source = readFileSync(join(gsdDir, "slice-parallel-orchestrator.ts"), "utf-8");
128
- assert.ok(
129
- source.includes('} else if (w.state === "running")') &&
130
- source.includes("survivors.push(w);"),
131
- "Recovery must only prune dead running workers, not stopped/error workers",
92
+ it("builds isolated worker environment", () => {
93
+ const env = _buildSliceWorkerEnvForTest(
94
+ "/repo",
95
+ "M001",
96
+ "S02",
97
+ "worker-token",
98
+ { PATH: "/bin" } as NodeJS.ProcessEnv,
132
99
  );
133
- });
134
100
 
135
- it("recovered PID-only workers are validated before signaling", () => {
136
- const source = readFileSync(join(gsdDir, "slice-parallel-orchestrator.ts"), "utf-8");
137
- assert.ok(
138
- source.includes("isRecoveredSliceWorkerAlive(worker)") &&
139
- source.includes('process.kill(worker.pid, "SIGTERM")'),
140
- "stopSliceParallel must validate recovered worker identity before signaling a PID",
141
- );
101
+ assert.equal(env.GSD_SLICE_LOCK, "S02");
102
+ assert.equal(env.GSD_MILESTONE_LOCK, "M001");
103
+ assert.equal(env.GSD_PROJECT_ROOT, "/repo");
104
+ assert.equal(env.GSD_PARALLEL_WORKER, "1");
105
+ assert.equal(env.GSD_SLICE_WORKER_TOKEN, "worker-token");
142
106
  });
143
107
 
144
- it("persists worker identity for crash recovery", () => {
145
- const source = readFileSync(join(gsdDir, "slice-parallel-orchestrator.ts"), "utf-8");
146
- assert.ok(
147
- source.includes("workerToken") &&
148
- source.includes("processStartFingerprint") &&
149
- source.includes("GSD_SLICE_WORKER_TOKEN"),
150
- "Orchestrator must persist stable worker identity metadata for recovered workers",
151
- );
152
- });
153
-
154
- it("spawn failures remove stale worker state and worktree", () => {
155
- const source = readFileSync(join(gsdDir, "slice-parallel-orchestrator.ts"), "utf-8");
156
- assert.ok(
157
- source.includes("sliceState.workers.delete(slice.id)") &&
158
- source.includes("removeWorktree(basePath, wtName, { deleteBranch: true, force: true })"),
159
- "Failed slice worker spawns must remove stale worker state and clean up the worktree",
160
- );
108
+ it("defaults to two workers unless explicitly configured", () => {
109
+ assert.equal(_resolveSliceParallelMaxWorkersForTest(), 2);
110
+ assert.equal(_resolveSliceParallelMaxWorkersForTest(4), 4);
161
111
  });
162
112
  });
163
113
 
@@ -217,36 +167,47 @@ describe("slice-parallel-orchestrator recovery identity", () => {
217
167
  });
218
168
  });
219
169
 
220
- describe("slice_parallel preference gating", () => {
221
- it("preferences-types.ts includes slice_parallel in interface", () => {
222
- const source = readFileSync(join(gsdDir, "preferences-types.ts"), "utf-8");
223
- assert.ok(
224
- source.includes("slice_parallel"),
225
- "GSDPreferences should have slice_parallel field",
226
- );
227
- });
228
-
229
- it("slice_parallel is in KNOWN_PREFERENCE_KEYS", () => {
230
- const source = readFileSync(join(gsdDir, "preferences-types.ts"), "utf-8");
231
- assert.ok(
232
- source.includes('"slice_parallel"'),
233
- 'KNOWN_PREFERENCE_KEYS should include "slice_parallel"',
234
- );
170
+ describe("slice_parallel preference and state gating", () => {
171
+ it("validates slice_parallel preferences", () => {
172
+ const result = validatePreferences({
173
+ slice_parallel: { enabled: true, max_workers: 3 },
174
+ });
175
+
176
+ assert.equal(result.errors.length, 0);
177
+ assert.deepEqual(result.preferences.slice_parallel, {
178
+ enabled: true,
179
+ max_workers: 3,
180
+ });
235
181
  });
236
182
 
237
- it("state.ts checks GSD_SLICE_LOCK for slice isolation", () => {
238
- const source = readFileSync(join(gsdDir, "state.ts"), "utf-8");
239
- assert.ok(
240
- source.includes("GSD_SLICE_LOCK"),
241
- "State derivation should check GSD_SLICE_LOCK for slice-level parallel isolation",
242
- );
243
- });
183
+ it("derives the locked slice for parallel workers", async () => {
184
+ const basePath = makeTempProject();
185
+ const oldWorker = process.env.GSD_PARALLEL_WORKER;
186
+ const oldSlice = process.env.GSD_SLICE_LOCK;
187
+ try {
188
+ const msDir = join(basePath, ".gsd", "milestones", "M001");
189
+ mkdirSync(msDir, { recursive: true });
190
+ writeFileSync(
191
+ join(msDir, "M001-ROADMAP.md"),
192
+ [
193
+ "# M001",
194
+ "",
195
+ "## Slices",
196
+ "- [ ] **S01: First** `risk:low` `depends:[]`",
197
+ "- [ ] **S02: Second** `risk:low` `depends:[]`",
198
+ ].join("\n"),
199
+ );
200
+ process.env.GSD_PARALLEL_WORKER = "1";
201
+ process.env.GSD_SLICE_LOCK = "S02";
244
202
 
245
- it("auto.ts imports slice parallel orchestrator when enabled", () => {
246
- const source = readFileSync(join(gsdDir, "auto.ts"), "utf-8");
247
- assert.ok(
248
- source.includes("slice_parallel") || source.includes("slice-parallel"),
249
- "auto.ts should reference slice_parallel for dispatch gating",
250
- );
203
+ const state = await deriveState(basePath);
204
+ assert.equal(state.activeSlice?.id, "S02");
205
+ } finally {
206
+ if (oldWorker === undefined) delete process.env.GSD_PARALLEL_WORKER;
207
+ else process.env.GSD_PARALLEL_WORKER = oldWorker;
208
+ if (oldSlice === undefined) delete process.env.GSD_SLICE_LOCK;
209
+ else process.env.GSD_SLICE_LOCK = oldSlice;
210
+ rmSync(basePath, { recursive: true, force: true });
211
+ }
251
212
  });
252
213
  });
@@ -1,51 +1,124 @@
1
1
  /**
2
- * Regression test for #3697 — set slice sequence on insert
3
- *
4
- * All three insertSlice call sites must pass a sequence value so slices
5
- * are ordered correctly instead of defaulting to 0.
2
+ * Regression test for #3697 — set slice sequence on insert.
6
3
  */
7
4
 
8
- import { describe, test } from 'node:test';
9
- import assert from 'node:assert/strict';
10
- import { readFileSync } from 'node:fs';
11
- import { fileURLToPath } from 'node:url';
12
- import { dirname, join } from 'node:path';
13
-
14
- const __filename = fileURLToPath(import.meta.url);
15
- const __dirname = dirname(__filename);
16
-
17
- const planMilestoneSrc = readFileSync(
18
- join(__dirname, '..', 'tools', 'plan-milestone.ts'),
19
- 'utf-8',
20
- );
21
- const reassessRoadmapSrc = readFileSync(
22
- join(__dirname, '..', 'tools', 'reassess-roadmap.ts'),
23
- 'utf-8',
24
- );
25
- const mdImporterSrc = readFileSync(
26
- join(__dirname, '..', 'md-importer.ts'),
27
- 'utf-8',
28
- );
29
-
30
- describe('slice sequence on insert (#3697)', () => {
31
- test('plan-milestone.ts passes sequence to insertSlice', () => {
32
- assert.match(planMilestoneSrc, /insertSlice\(/,
33
- 'plan-milestone.ts should call insertSlice');
34
- assert.match(planMilestoneSrc, /sequence:\s*i\s*\+\s*1/,
35
- 'plan-milestone.ts should pass sequence: i + 1');
5
+ import { describe, test, afterEach } from "node:test";
6
+ import assert from "node:assert/strict";
7
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
8
+ import { join } from "node:path";
9
+ import { tmpdir } from "node:os";
10
+
11
+ import { handlePlanMilestone } from "../tools/plan-milestone.ts";
12
+ import { handleReassessRoadmap } from "../tools/reassess-roadmap.ts";
13
+ import { migrateHierarchyToDb } from "../md-importer.ts";
14
+ import {
15
+ closeDatabase,
16
+ getMilestoneSlices,
17
+ insertMilestone,
18
+ insertSlice,
19
+ openDatabase,
20
+ } from "../gsd-db.ts";
21
+
22
+ let tempBase: string | null = null;
23
+
24
+ afterEach(() => {
25
+ closeDatabase();
26
+ if (tempBase) rmSync(tempBase, { recursive: true, force: true });
27
+ tempBase = null;
28
+ });
29
+
30
+ function makeBase(name: string): string {
31
+ tempBase = mkdtempSync(join(tmpdir(), name));
32
+ mkdirSync(join(tempBase, ".gsd", "milestones"), { recursive: true });
33
+ openDatabase(join(tempBase, ".gsd", "gsd.db"));
34
+ return tempBase;
35
+ }
36
+
37
+ function slice(sliceId: string, title: string) {
38
+ return {
39
+ sliceId,
40
+ title,
41
+ risk: "low",
42
+ depends: [],
43
+ demo: `${title} demo`,
44
+ goal: `${title} goal`,
45
+ successCriteria: `${title} success`,
46
+ proofLevel: "unit",
47
+ integrationClosure: "covered",
48
+ observabilityImpact: "none",
49
+ };
50
+ }
51
+
52
+ describe("slice sequence on insert (#3697)", () => {
53
+ test("plan milestone persists slices in agent-provided order", async () => {
54
+ const base = makeBase("gsd-sequence-plan-");
55
+
56
+ const result = await handlePlanMilestone({
57
+ milestoneId: "M001",
58
+ title: "Sequence",
59
+ vision: "Preserve slice order",
60
+ slices: [slice("S01", "First"), slice("S02", "Second"), slice("S03", "Third")],
61
+ }, base);
62
+
63
+ assert.ok(!("error" in result), JSON.stringify(result));
64
+ assert.deepEqual(
65
+ getMilestoneSlices("M001").map((row) => [row.id, row.sequence]),
66
+ [["S01", 1], ["S02", 2], ["S03", 3]],
67
+ );
36
68
  });
37
69
 
38
- test('reassess-roadmap.ts passes sequence to insertSlice', () => {
39
- assert.match(reassessRoadmapSrc, /insertSlice\(/,
40
- 'reassess-roadmap.ts should call insertSlice');
41
- assert.match(reassessRoadmapSrc, /sequence:\s*existingCount\s*\+\s*i\s*\+\s*1/,
42
- 'reassess-roadmap.ts should pass sequence: existingCount + i + 1');
70
+ test("reassess roadmap appends new slices after existing slices", async () => {
71
+ const base = makeBase("gsd-sequence-reassess-");
72
+ insertMilestone({ id: "M001", title: "Sequence", status: "active", depends_on: [] });
73
+ insertSlice({ id: "S01", milestoneId: "M001", title: "Done", status: "complete", risk: "low", depends: [], demo: "", sequence: 1 });
74
+ insertSlice({ id: "S02", milestoneId: "M001", title: "Existing", status: "pending", risk: "low", depends: [], demo: "", sequence: 2 });
75
+
76
+ const result = await handleReassessRoadmap({
77
+ milestoneId: "M001",
78
+ completedSliceId: "S01",
79
+ verdict: "pass",
80
+ assessment: "Add follow-up slices.",
81
+ sliceChanges: {
82
+ modified: [],
83
+ added: [
84
+ { sliceId: "S03", title: "Added 1", risk: "low", depends: [], demo: "" },
85
+ { sliceId: "S04", title: "Added 2", risk: "low", depends: [], demo: "" },
86
+ ],
87
+ removed: [],
88
+ },
89
+ }, base);
90
+
91
+ assert.ok(!("error" in result), JSON.stringify(result));
92
+ assert.deepEqual(
93
+ getMilestoneSlices("M001").map((row) => [row.id, row.sequence]),
94
+ [["S01", 1], ["S02", 2], ["S03", 3], ["S04", 4]],
95
+ );
43
96
  });
44
97
 
45
- test('md-importer.ts passes sequence to insertSlice', () => {
46
- assert.match(mdImporterSrc, /insertSlice\(/,
47
- 'md-importer.ts should call insertSlice');
48
- assert.match(mdImporterSrc, /sequence:\s*si\s*\+\s*1/,
49
- 'md-importer.ts should pass sequence: si + 1');
98
+ test("markdown importer preserves roadmap order in sequence values", () => {
99
+ const base = makeBase("gsd-sequence-import-");
100
+ const milestoneDir = join(base, ".gsd", "milestones", "M001");
101
+ mkdirSync(milestoneDir, { recursive: true });
102
+ writeFileSync(
103
+ join(milestoneDir, "M001-ROADMAP.md"),
104
+ [
105
+ "# M001: Imported",
106
+ "",
107
+ "## Slices",
108
+ "- [ ] **S01: First** `risk:low`",
109
+ " Demo: first.",
110
+ "- [ ] **S02: Second** `risk:low`",
111
+ " Demo: second.",
112
+ ].join("\n"),
113
+ "utf-8",
114
+ );
115
+
116
+ const result = migrateHierarchyToDb(base);
117
+
118
+ assert.equal(result.slices, 2);
119
+ assert.deepEqual(
120
+ getMilestoneSlices("M001").map((row) => [row.id, row.sequence]),
121
+ [["S01", 1], ["S02", 2]],
122
+ );
50
123
  });
51
124
  });
@@ -1,34 +1,33 @@
1
+ // GSD-2 — Guided smart entry complete-state behavior tests.
2
+
1
3
  import test from "node:test";
2
4
  import assert from "node:assert/strict";
3
- import { mkdtempSync, mkdirSync, rmSync, writeFileSync, readFileSync } from "node:fs";
5
+ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
4
6
  import { join } from "node:path";
5
7
  import { tmpdir } from "node:os";
6
8
 
7
- const { deriveState } = await import("../state.js");
9
+ import { deriveState } from "../state.js";
10
+
11
+ function writeCompleteMilestone(base: string): void {
12
+ const milestoneDir = join(base, ".gsd", "milestones", "M001");
13
+ mkdirSync(milestoneDir, { recursive: true });
14
+ writeFileSync(
15
+ join(milestoneDir, "M001-ROADMAP.md"),
16
+ [
17
+ "# M001: Complete Milestone",
18
+ "",
19
+ "## Slices",
20
+ "- [x] **S01: Done slice** `risk:low` `depends:[]`",
21
+ " > Done.",
22
+ ].join("\n"),
23
+ );
24
+ writeFileSync(join(milestoneDir, "M001-SUMMARY.md"), "# M001 Summary\n\nComplete.");
25
+ }
8
26
 
9
27
  test("deriveState reports the last completed milestone when all milestone slices are done", async () => {
10
28
  const base = mkdtempSync(join(tmpdir(), "gsd-smart-entry-complete-"));
11
-
12
29
  try {
13
- const milestoneDir = join(base, ".gsd", "milestones", "M001");
14
- mkdirSync(milestoneDir, { recursive: true });
15
-
16
- writeFileSync(
17
- join(milestoneDir, "M001-ROADMAP.md"),
18
- [
19
- "# M001: Complete Milestone",
20
- "",
21
- "## Slices",
22
- "- [x] **S01: Done slice** `risk:low` `depends:[]`",
23
- " > Done.",
24
- ].join("\n"),
25
- );
26
-
27
- writeFileSync(
28
- join(milestoneDir, "M001-SUMMARY.md"),
29
- "# M001 Summary\n\nComplete.",
30
- );
31
-
30
+ writeCompleteMilestone(base);
32
31
  const state = await deriveState(base);
33
32
  assert.equal(state.phase, "complete");
34
33
  assert.equal(state.lastCompletedMilestone?.id, "M001");
@@ -36,78 +35,3 @@ test("deriveState reports the last completed milestone when all milestone slices
36
35
  rmSync(base, { recursive: true, force: true });
37
36
  }
38
37
  });
39
-
40
- test("guided-flow complete branch offers a chooser for next milestone or status", () => {
41
- const guidedFlowSource = readFileSync(join(import.meta.dirname, "..", "guided-flow.ts"), "utf-8");
42
- const branchIdx = guidedFlowSource.indexOf('state.phase === "complete"');
43
-
44
- assert.ok(branchIdx > -1, "guided-flow.ts should have a complete-phase smart-entry branch");
45
-
46
- const nextBranchIdx = guidedFlowSource.indexOf('state.phase === "needs-discussion"', branchIdx);
47
- const branchChunk = guidedFlowSource.slice(branchIdx, nextBranchIdx === -1 ? branchIdx + 1600 : nextBranchIdx);
48
-
49
- assert.match(branchChunk, /showNextAction\(/, "complete branch should present a chooser");
50
- assert.match(branchChunk, /id:\s*"quick_task"/, "complete branch should offer quick task before milestone planning");
51
- assert.match(branchChunk, /Do a small bounded task without opening a milestone/, "quick task action should explain that it avoids milestones");
52
- assert.match(branchChunk, /recommended:\s*true/, "quick task action should be the recommended complete-state action");
53
- assert.match(branchChunk, /findMilestoneIds\(basePath\)/, "complete branch should compute the next milestone id");
54
- assert.match(
55
- branchChunk,
56
- /nextMilestoneIdReserved\(milestoneIds,\s*uniqueMilestoneIds,\s*basePath\)/,
57
- "complete branch should derive the next milestone id",
58
- );
59
- assert.match(branchChunk, /dispatchWorkflow\(pi, await prepareAndBuildDiscussPrompt\(/, "complete branch should dispatch the prepared discuss prompt");
60
- });
61
-
62
- test("guided-flow quick task choices prompt for text and route through /gsd quick", () => {
63
- const guidedFlowSource = readFileSync(join(import.meta.dirname, "..", "guided-flow.ts"), "utf-8");
64
-
65
- assert.match(
66
- guidedFlowSource,
67
- /async function runQuickTaskChoice\([\s\S]*ctx\.ui\.input\("Quick task"[\s\S]*await import\("\.\/quick\.js"\)[\s\S]*await handleQuick\(task,\s*ctx,\s*pi\)/,
68
- "quick task chooser should prompt for task text and route through handleQuick",
69
- );
70
-
71
- const notifyOnlyPattern = /if \(choice === "quick_task"\) \{\s*ctx\.ui\.notify\("Run \/gsd quick <task>/;
72
- assert.doesNotMatch(
73
- guidedFlowSource,
74
- notifyOnlyPattern,
75
- "quick task chooser must not merely print instructions after selection",
76
- );
77
-
78
- const quickChoiceCalls = guidedFlowSource.match(/if \(choice === "quick_task"\) \{\s*await runQuickTaskChoice\(ctx,\s*pi\);/g) ?? [];
79
- assert.equal(quickChoiceCalls.length, 3, "all guided-flow quick task choices should dispatch the helper");
80
- });
81
-
82
- test("dispatcher routes multi-word freeform /gsd input through /gsd do", () => {
83
- const dispatcherSource = readFileSync(join(import.meta.dirname, "..", "commands", "dispatcher.ts"), "utf-8");
84
-
85
- assert.match(
86
- dispatcherSource,
87
- /if\s*\(trimmed\.includes\(" "\)\)\s*\{[\s\S]*handleDo\(trimmed,\s*ctx,\s*pi\)/,
88
- "dispatcher should treat multi-word unknown input as natural-language /gsd do work",
89
- );
90
- assert.match(
91
- dispatcherSource,
92
- /Unknown: \/gsd/,
93
- "single-token unknown commands should still report the normal unknown-command warning",
94
- );
95
- });
96
-
97
- test("guided-flow needs-discussion skip branch opens the project DB before reserving a new milestone", () => {
98
- const guidedFlowSource = readFileSync(join(import.meta.dirname, "..", "guided-flow.ts"), "utf-8");
99
- const laterDbOpenIdx = guidedFlowSource.indexOf("// Ensure DB is open before querying slices (#2560).");
100
- assert.ok(laterDbOpenIdx > -1, "guided-flow.ts should contain the post-draft DB-open guard");
101
-
102
- const branchPrefix = guidedFlowSource.slice(0, laterDbOpenIdx);
103
- const skipBranchIdx = branchPrefix.lastIndexOf('choice === "skip_milestone"');
104
- assert.ok(skipBranchIdx > -1, "needs-discussion skip branch should be present");
105
-
106
- const branchChunk = branchPrefix.slice(skipBranchIdx);
107
- const ensureIdx = branchChunk.indexOf("ensureDbOpen(basePath)");
108
- const reserveIdx = branchChunk.indexOf("nextMilestoneIdReserved");
109
-
110
- assert.ok(ensureIdx > -1, "skip branch should open the project DB");
111
- assert.ok(reserveIdx > -1, "skip branch should reserve the next milestone ID");
112
- assert.ok(ensureIdx < reserveIdx, "project DB must be opened before milestone ID reservation");
113
- });