gsd-pi 2.80.0-dev.3065f7bfa → 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 (376) 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 +32 -8
  17. package/dist/resources/extensions/gsd/auto/resolve.js +12 -0
  18. package/dist/resources/extensions/gsd/auto/run-unit.js +3 -1
  19. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
  20. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
  21. package/dist/resources/extensions/gsd/auto-post-unit.js +81 -76
  22. package/dist/resources/extensions/gsd/auto-start.js +41 -6
  23. package/dist/resources/extensions/gsd/auto-worktree.js +98 -80
  24. package/dist/resources/extensions/gsd/auto.js +84 -29
  25. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +62 -13
  26. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +20 -26
  27. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +29 -12
  28. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +6 -9
  29. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -7
  30. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -10
  31. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -9
  32. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
  33. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +60 -26
  34. package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
  35. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  36. package/dist/resources/extensions/gsd/commands-config.js +1 -1
  37. package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
  38. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  39. package/dist/resources/extensions/gsd/db/unit-dispatches.js +53 -0
  40. package/dist/resources/extensions/gsd/git-service.js +37 -1
  41. package/dist/resources/extensions/gsd/guided-flow.js +14 -4
  42. package/dist/resources/extensions/gsd/init-wizard.js +4 -1
  43. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +6 -4
  44. package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
  45. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
  46. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
  47. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  48. package/dist/resources/extensions/gsd/worktree-resolver.js +22 -1
  49. package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  50. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  51. package/dist/web/standalone/.next/BUILD_ID +1 -1
  52. package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -17
  53. package/dist/web/standalone/.next/build-manifest.json +3 -3
  54. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  55. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  56. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  57. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  58. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  59. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  60. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  61. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  62. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  63. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  64. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  65. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  66. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  67. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  68. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  69. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  70. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  71. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  72. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  73. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  74. package/dist/web/standalone/.next/server/app/index.html +1 -1
  75. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  76. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  77. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  78. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  79. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  80. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  81. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  82. package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -17
  83. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  84. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  85. package/dist/web/standalone/.next/server/middleware.js +3 -3
  86. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  87. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  88. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  89. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
  90. package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
  91. package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
  92. package/dist/welcome-screen.d.ts +2 -0
  93. package/dist/welcome-screen.js +9 -7
  94. package/package.json +1 -1
  95. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
  96. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  97. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
  98. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
  99. package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
  100. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  101. package/packages/pi-ai/dist/providers/anthropic.js +9 -7
  102. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  103. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
  104. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
  105. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
  106. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  107. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
  108. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
  109. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
  110. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
  111. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
  112. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
  113. package/packages/pi-ai/src/providers/anthropic.ts +22 -9
  114. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
  115. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
  116. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
  117. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
  118. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  119. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +3 -1
  120. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  121. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +2 -2
  122. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  123. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  124. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
  125. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
  126. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
  127. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  128. package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
  129. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  130. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
  131. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  132. package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
  133. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  134. package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
  135. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  136. package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
  137. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  138. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
  139. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  140. package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
  141. package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  142. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
  143. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  144. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
  145. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  146. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
  147. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  148. package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
  149. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  150. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
  151. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  152. package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
  153. package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  154. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
  155. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  156. package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
  157. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  158. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
  159. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
  160. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
  161. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
  162. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
  163. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
  164. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
  165. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
  166. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
  167. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
  168. package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
  169. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  170. package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
  171. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  172. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +89 -2
  173. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  174. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +25 -1
  175. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  176. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +5 -0
  177. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  178. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +153 -8
  179. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  180. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  181. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +18 -1
  182. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  183. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +23 -5
  184. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  185. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  186. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  187. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +19 -0
  188. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  189. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +23 -5
  190. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -1
  191. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +3 -1
  192. package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -1
  193. package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
  194. package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
  195. package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
  196. package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
  197. package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
  198. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
  199. package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
  200. package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
  201. package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
  202. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
  203. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
  204. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
  205. package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
  206. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +119 -2
  207. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -1
  208. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +177 -8
  209. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +24 -5
  210. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +17 -1
  211. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +21 -0
  212. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +25 -8
  213. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  214. package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
  215. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +30 -0
  216. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +26 -0
  217. package/src/resources/extensions/github-sync/sync.ts +8 -1
  218. package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
  219. package/src/resources/extensions/gsd/auto/loop.ts +84 -8
  220. package/src/resources/extensions/gsd/auto/phases.ts +43 -8
  221. package/src/resources/extensions/gsd/auto/resolve.ts +19 -0
  222. package/src/resources/extensions/gsd/auto/run-unit.ts +3 -0
  223. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
  224. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
  225. package/src/resources/extensions/gsd/auto-post-unit.ts +93 -78
  226. package/src/resources/extensions/gsd/auto-start.ts +56 -6
  227. package/src/resources/extensions/gsd/auto-worktree.ts +118 -72
  228. package/src/resources/extensions/gsd/auto.ts +121 -29
  229. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +76 -12
  230. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +20 -26
  231. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +27 -12
  232. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +7 -9
  233. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +4 -7
  234. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +6 -10
  235. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +5 -9
  236. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
  237. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +64 -26
  238. package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
  239. package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
  240. package/src/resources/extensions/gsd/commands-config.ts +1 -1
  241. package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
  242. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  243. package/src/resources/extensions/gsd/db/unit-dispatches.ts +66 -0
  244. package/src/resources/extensions/gsd/git-service.ts +41 -2
  245. package/src/resources/extensions/gsd/guided-flow.ts +19 -4
  246. package/src/resources/extensions/gsd/init-wizard.ts +5 -1
  247. package/src/resources/extensions/gsd/prompts/complete-milestone.md +6 -4
  248. package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
  249. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
  250. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
  251. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
  252. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
  253. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
  254. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +15 -0
  255. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
  256. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
  257. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
  258. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +106 -0
  259. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
  260. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
  261. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
  262. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
  263. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
  264. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
  265. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
  266. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +138 -0
  267. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
  268. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
  269. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
  270. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
  271. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +1 -217
  272. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
  273. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
  274. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
  275. package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
  276. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
  277. package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
  278. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
  279. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
  280. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
  281. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +35 -31
  282. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  283. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
  284. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +4 -9
  285. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
  286. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
  287. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
  288. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
  289. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
  290. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
  291. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
  292. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
  293. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
  294. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
  295. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
  296. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
  297. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
  298. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +12 -0
  299. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
  300. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
  301. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -59
  302. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
  303. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
  304. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +79 -98
  305. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
  306. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
  307. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
  308. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
  309. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
  310. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +113 -0
  311. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
  312. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
  313. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
  314. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
  315. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
  316. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
  317. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
  318. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
  319. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -125
  320. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
  321. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
  322. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
  323. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
  324. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
  325. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
  326. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
  327. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
  328. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -90
  329. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
  330. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
  331. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
  332. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
  333. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +61 -1
  334. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
  335. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
  336. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
  337. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
  338. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
  339. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
  340. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
  341. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -97
  342. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
  343. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
  344. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
  345. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
  346. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
  347. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +33 -47
  348. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
  349. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
  350. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
  351. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
  352. package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
  353. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
  354. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
  355. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +50 -1
  356. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +6 -101
  357. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
  358. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
  359. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
  360. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
  361. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
  362. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
  363. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
  364. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
  365. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +14 -13
  366. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
  367. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +36 -0
  368. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
  369. package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
  370. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  371. package/src/resources/extensions/gsd/worktree-resolver.ts +34 -1
  372. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
  373. package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  374. package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
  375. /package/dist/web/standalone/.next/static/{O2WvnXROue6l7nAp_4dhC → G68KoLv5claox_Dyd4pZn}/_buildManifest.js +0 -0
  376. /package/dist/web/standalone/.next/static/{O2WvnXROue6l7nAp_4dhC → G68KoLv5claox_Dyd4pZn}/_ssgManifest.js +0 -0
@@ -4,7 +4,10 @@
4
4
  import test from "node:test";
5
5
  import assert from "node:assert/strict";
6
6
 
7
- import { _handleSessionSwitchAgentEnd } from "../bootstrap/agent-end-recovery.js";
7
+ import {
8
+ _handleSessionSwitchAgentEnd,
9
+ isClaudeCodeSessionSwitchAbortMessage,
10
+ } from "../bootstrap/agent-end-recovery.js";
8
11
  import type { ErrorContext } from "../auto/types.js";
9
12
 
10
13
  test("user-abort message during session-switch is dropped (not propagated as cancellation)", () => {
@@ -56,6 +59,63 @@ test("genuine stopReason='aborted' with errorMessage during session-switch still
56
59
  });
57
60
  });
58
61
 
62
+ test("Claude Code stream-aborted placeholder during session-switch is dropped", () => {
63
+ let cancelledWith: unknown = null;
64
+ const resolveCancelled = (ctx: ErrorContext) => {
65
+ cancelledWith = ctx;
66
+ return true;
67
+ };
68
+
69
+ _handleSessionSwitchAgentEnd(
70
+ {
71
+ stopReason: "aborted",
72
+ content: [{ type: "text", text: "Claude Code stream aborted by caller" }],
73
+ },
74
+ resolveCancelled,
75
+ );
76
+
77
+ assert.equal(cancelledWith, null);
78
+ });
79
+
80
+ test("Claude Code session-switch abort detection is narrow", () => {
81
+ assert.equal(
82
+ isClaudeCodeSessionSwitchAbortMessage({
83
+ stopReason: "error",
84
+ content: [{ type: "text", text: "Claude Code error: Claude Code process aborted by user" }],
85
+ }),
86
+ false,
87
+ );
88
+ assert.equal(
89
+ isClaudeCodeSessionSwitchAbortMessage({
90
+ stopReason: "aborted",
91
+ content: [{ type: "text", text: "Claude Code stream aborted by caller" }],
92
+ }),
93
+ true,
94
+ );
95
+ assert.equal(
96
+ isClaudeCodeSessionSwitchAbortMessage({
97
+ stopReason: "aborted",
98
+ content: [{ type: "text", text: "partial output before network failure" }],
99
+ }),
100
+ false,
101
+ );
102
+ assert.equal(
103
+ isClaudeCodeSessionSwitchAbortMessage({
104
+ stopReason: "aborted",
105
+ content: [{ type: "text", text: "Request aborted by user\nAPI Error: 529 overloaded" }],
106
+ }),
107
+ false,
108
+ );
109
+ assert.equal(
110
+ isClaudeCodeSessionSwitchAbortMessage({
111
+ stopReason: "error",
112
+ errorMessage: "Request aborted by user",
113
+ content: [{ type: "text", text: "Claude Code process aborted by user" }],
114
+ }),
115
+ true,
116
+ );
117
+ });
118
+
59
119
  test("empty-content aborted during session-switch is silently ignored", () => {
60
120
  // Empty-content aborted is a non-fatal LLM stop; we must not pause/cancel.
61
121
  let cancelledWith: unknown = null;
@@ -1,56 +1,58 @@
1
1
  /**
2
- * /gsd show-config command structural tests.
3
- *
4
- * Verifies the config overlay class and command handler exist
5
- * with correct structure.
2
+ * /gsd show-config command behavior tests.
6
3
  */
7
4
 
8
5
  import test from "node:test";
9
6
  import assert from "node:assert/strict";
10
- import { readFileSync } from "node:fs";
11
- import { join, dirname } from "node:path";
12
- import { fileURLToPath } from "node:url";
13
7
 
14
- const __dirname = dirname(fileURLToPath(import.meta.url));
15
-
16
- const overlaySrc = readFileSync(join(__dirname, "..", "config-overlay.ts"), "utf-8");
17
- const coreSrc = readFileSync(join(__dirname, "..", "commands", "handlers", "core.ts"), "utf-8");
18
-
19
- // ─── Config overlay ───────────────────────────────────────────────────────
20
-
21
- test("GSDConfigOverlay class is exported", () => {
22
- assert.ok(
23
- overlaySrc.includes("export class GSDConfigOverlay"),
24
- "GSDConfigOverlay should be exported",
8
+ import { GSDConfigOverlay, formatConfigText } from "../config-overlay.ts";
9
+ import { handleCoreCommand } from "../commands/handlers/core.ts";
10
+
11
+ const theme = {
12
+ bold: (s: string) => s,
13
+ fg: (_name: string, s: string) => s,
14
+ };
15
+
16
+ test("GSDConfigOverlay renders and responds to input", () => {
17
+ let renderRequests = 0;
18
+ let closed = false;
19
+ const overlay = new GSDConfigOverlay(
20
+ { requestRender: () => { renderRequests++; } },
21
+ theme as any,
22
+ () => { closed = true; },
25
23
  );
26
- });
27
24
 
28
- test("GSDConfigOverlay implements Component interface methods", () => {
29
- assert.ok(overlaySrc.includes("render("), "should have render method");
30
- assert.ok(overlaySrc.includes("handleInput("), "should have handleInput method");
31
- assert.ok(overlaySrc.includes("invalidate("), "should have invalidate method");
32
- assert.ok(overlaySrc.includes("dispose("), "should have dispose method");
33
- });
25
+ const lines = overlay.render(60);
26
+ assert.ok(lines.some((line) => line.includes("GSD Configuration")));
34
27
 
35
- test("formatConfigText function is exported", () => {
36
- assert.ok(
37
- overlaySrc.includes("export function formatConfigText"),
38
- "formatConfigText should be exported for non-overlay fallback",
39
- );
40
- });
28
+ overlay.handleInput("j");
29
+ assert.equal(renderRequests, 1);
41
30
 
42
- // ─── Command handler ──────────────────────────────────────────────────────
31
+ overlay.handleInput("q");
32
+ assert.equal(closed, true);
33
+ });
43
34
 
44
- test("core handler routes show-config command", () => {
45
- assert.ok(
46
- coreSrc.includes('"show-config"'),
47
- "core handler should match show-config command",
48
- );
35
+ test("formatConfigText provides a text fallback", () => {
36
+ const text = formatConfigText();
37
+ assert.match(text, /GSD Configuration/);
38
+ assert.match(text, /SOURCES/);
49
39
  });
50
40
 
51
- test("show-config has text fallback via formatConfigText", () => {
52
- assert.ok(
53
- coreSrc.includes("formatConfigText"),
54
- "show-config should use formatConfigText as fallback",
55
- );
41
+ test("core handler routes show-config to overlay with text fallback", async () => {
42
+ const notifications: Array<{ message: string; level: string }> = [];
43
+ const ctx = {
44
+ ui: {
45
+ custom: async () => undefined,
46
+ notify: (message: string, level: string) => {
47
+ notifications.push({ message, level });
48
+ },
49
+ },
50
+ };
51
+
52
+ const handled = await handleCoreCommand("show-config", ctx as any);
53
+
54
+ assert.equal(handled, true);
55
+ assert.equal(notifications.length, 1);
56
+ assert.equal(notifications[0]?.level, "info");
57
+ assert.match(notifications[0]?.message ?? "", /GSD Configuration/);
56
58
  });
@@ -1,31 +1,63 @@
1
1
  /**
2
- * Regression test for #3477: gsd_skip_slice tool must rebuild STATE.md
3
- * after updating the DB so auto-mode reads the correct state.
2
+ * Regression test for #3477: gsd_skip_slice updates DB state and rebuilds
3
+ * the projected STATE.md artifact.
4
4
  */
5
- import { test } from "node:test";
5
+
6
+ import test from "node:test";
6
7
  import assert from "node:assert/strict";
7
- import { readFileSync } from "node:fs";
8
+ import { existsSync, mkdtempSync, mkdirSync, readFileSync, rmSync } from "node:fs";
8
9
  import { join } from "node:path";
10
+ import { tmpdir } from "node:os";
9
11
 
10
- test("gsd_skip_slice tool calls rebuildState after DB update (#3477)", () => {
11
- const src = readFileSync(
12
- join(import.meta.dirname, "..", "bootstrap", "db-tools.ts"),
13
- "utf-8",
14
- );
15
- // The fix adds a rebuildState call after updateSliceStatus in skip_slice
16
- assert.ok(
17
- src.includes("rebuildState"),
18
- "gsd_skip_slice must call rebuildState after updating slice status",
19
- );
20
- });
12
+ import { registerDbTools } from "../bootstrap/db-tools.ts";
13
+ import {
14
+ closeDatabase,
15
+ getSlice,
16
+ insertMilestone,
17
+ insertSlice,
18
+ openDatabase,
19
+ } from "../gsd-db.ts";
20
+
21
+ test("gsd_skip_slice marks a slice skipped and refreshes STATE.md", async () => {
22
+ const base = mkdtempSync(join(tmpdir(), "gsd-skip-slice-"));
23
+ const tools = new Map<string, any>();
24
+ const pi = { registerTool: (tool: any) => tools.set(tool.name, tool) };
25
+
26
+ try {
27
+ mkdirSync(join(base, ".gsd", "milestones", "M001", "slices", "S01"), { recursive: true });
28
+ openDatabase(join(base, ".gsd", "gsd.db"));
29
+ insertMilestone({ id: "M001", title: "Skip Test", status: "active", depends_on: [] });
30
+ insertSlice({
31
+ id: "S01",
32
+ milestoneId: "M001",
33
+ title: "Skipped slice",
34
+ status: "pending",
35
+ risk: "low",
36
+ depends: [],
37
+ demo: "",
38
+ sequence: 1,
39
+ });
40
+
41
+ registerDbTools(pi as any);
42
+ const skipSlice = tools.get("gsd_skip_slice");
43
+ assert.ok(skipSlice, "gsd_skip_slice is registered");
44
+
45
+ const result = await skipSlice.execute(
46
+ "tool-call",
47
+ { milestoneId: "M001", sliceId: "S01", reason: "descoped" },
48
+ undefined,
49
+ undefined,
50
+ { cwd: base },
51
+ );
52
+
53
+ assert.equal(result.details.operation, "skip_slice");
54
+ assert.equal(getSlice("M001", "S01")?.status, "skipped");
21
55
 
22
- test("rethink prompt warns against markdown-only edits for skip (#3477)", () => {
23
- const prompt = readFileSync(
24
- join(import.meta.dirname, "..", "prompts", "rethink.md"),
25
- "utf-8",
26
- );
27
- assert.ok(
28
- prompt.includes("MUST") && prompt.includes("gsd_skip_slice"),
29
- "Rethink prompt must emphasize gsd_skip_slice tool requirement",
30
- );
56
+ const statePath = join(base, ".gsd", "STATE.md");
57
+ assert.equal(existsSync(statePath), true, "STATE.md should be rebuilt");
58
+ assert.match(readFileSync(statePath, "utf-8"), /Active Slice:\*\* None/);
59
+ } finally {
60
+ closeDatabase();
61
+ rmSync(base, { recursive: true, force: true });
62
+ }
31
63
  });
@@ -1,17 +1,57 @@
1
1
  import test from "node:test";
2
2
  import assert from "node:assert/strict";
3
- import { readFileSync } from "node:fs";
4
- import { dirname, join } from "node:path";
5
- import { fileURLToPath } from "node:url";
3
+ import { existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
4
+ import { join } from "node:path";
5
+ import { tmpdir } from "node:os";
6
6
 
7
- const __dirname = dirname(fileURLToPath(import.meta.url));
7
+ import { DISPATCH_RULES } from "../auto-dispatch.ts";
8
+ import {
9
+ closeDatabase,
10
+ getLatestAssessmentByScope,
11
+ insertMilestone,
12
+ insertSlice,
13
+ openDatabase,
14
+ } from "../gsd-db.ts";
8
15
 
9
- test("skipped validation DB persistence stays atomic", () => {
10
- const source = readFileSync(join(__dirname, "..", "auto-dispatch.ts"), "utf-8");
16
+ test("skipped validation dispatch persists the validation file and DB assessment together", async () => {
17
+ const basePath = mkdtempSync(join(tmpdir(), "gsd-skip-validation-"));
18
+ const milestoneDir = join(basePath, ".gsd", "milestones", "M001");
19
+ const sliceDir = join(milestoneDir, "slices", "S01");
20
+ const rule = DISPATCH_RULES.find((r) => r.name === "validating-milestone → validate-milestone");
21
+ assert.ok(rule, "validate-milestone rule is registered");
11
22
 
12
- assert.match(
13
- source,
14
- /if \(isDbAvailable\(\)\) \{\s+transaction\(\(\) => \{\s+insertAssessment\([\s\S]*?insertMilestoneValidationGates\(/,
15
- "skipped validation DB writes must remain inside a single transaction",
16
- );
23
+ try {
24
+ mkdirSync(sliceDir, { recursive: true });
25
+ writeFileSync(join(sliceDir, "S01-SUMMARY.md"), "# S01 Summary\n", "utf-8");
26
+ openDatabase(join(basePath, ".gsd", "gsd.db"));
27
+ insertMilestone({ id: "M001", title: "Validation", status: "active", depends_on: [] });
28
+ insertSlice({
29
+ id: "S01",
30
+ milestoneId: "M001",
31
+ title: "Done slice",
32
+ status: "complete",
33
+ risk: "low",
34
+ depends: [],
35
+ demo: "",
36
+ sequence: 1,
37
+ });
38
+
39
+ const action = await rule.match({
40
+ state: { phase: "validating-milestone" },
41
+ mid: "M001",
42
+ midTitle: "Validation",
43
+ basePath,
44
+ prefs: { phases: { skip_milestone_validation: true } },
45
+ } as any);
46
+
47
+ assert.deepEqual(action, { action: "skip" });
48
+ assert.equal(existsSync(join(milestoneDir, "M001-VALIDATION.md")), true);
49
+ assert.equal(
50
+ getLatestAssessmentByScope("M001", "milestone-validation")?.status,
51
+ "pass",
52
+ );
53
+ } finally {
54
+ closeDatabase();
55
+ rmSync(basePath, { recursive: true, force: true });
56
+ }
17
57
  });
@@ -1,3 +1,5 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Slice-cadence merge and resquash tests.
1
3
  /**
2
4
  * Tests for slice-cadence collapse — #4765.
3
5
  *
@@ -20,6 +22,7 @@ import {
20
22
  } from "../slice-cadence.ts";
21
23
  import { MergeConflictError } from "../git-service.ts";
22
24
  import { summarizeWorktreeTelemetry } from "../worktree-telemetry.ts";
25
+ import { closeDatabase, insertMilestone, insertSlice, openDatabase } from "../gsd-db.ts";
23
26
 
24
27
  function git(args: string[], cwd: string): string {
25
28
  return execFileSync("git", args, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
@@ -81,6 +84,7 @@ describe("mergeSliceToMain", () => {
81
84
 
82
85
  afterEach(() => {
83
86
  try { process.chdir(originalCwd); } catch { /* */ }
87
+ closeDatabase();
84
88
  rmSync(dir, { recursive: true, force: true });
85
89
  });
86
90
 
@@ -109,6 +113,25 @@ describe("mergeSliceToMain", () => {
109
113
  assert.equal(summary.sliceMergeConflicts, 0);
110
114
  });
111
115
 
116
+ test("slice-cadence commit messages include milestone and slice names", () => {
117
+ openDatabase(":memory:");
118
+ insertMilestone({ id: "M001", title: "M001: Backend foundation", status: "active" });
119
+ insertSlice({ id: "S01", milestoneId: "M001", title: "S01: Core API", status: "complete" });
120
+ enterMilestoneBranch(dir, "M001");
121
+ commitFile(dir, "feature.txt", "slice 1 work\n", "feat: S01 work");
122
+
123
+ process.chdir(dir);
124
+ mergeSliceToMain(dir, "M001", "S01");
125
+
126
+ const subject = git(["log", "-1", "--format=%s", "main"], dir);
127
+ const body = git(["log", "-1", "--format=%B", "main"], dir);
128
+ assert.equal(subject, "feat: Core API - S01 of M001 (slice-cadence)");
129
+ assert.ok(body.includes("Slice: S01 - Core API"));
130
+ assert.ok(body.includes("Milestone: M001 - Backend foundation"));
131
+ assert.ok(body.includes("GSD-Slice: S01"));
132
+ assert.ok(body.includes("GSD-Milestone: M001"));
133
+ });
134
+
112
135
  test("merges slices to the recorded integration branch", () => {
113
136
  git(["checkout", "-b", "develop"], dir);
114
137
  mkdirSync(join(dir, ".gsd", "milestones", "M001"), { recursive: true });
@@ -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
  });