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
@@ -206,6 +206,83 @@ test("session_start does NOT call setFooter or suppress gsd-health when isAutoAc
206
206
  assert.equal(healthWidgetHideCount, 0, "gsd-health must NOT be hidden when isAutoActive() is false");
207
207
  });
208
208
 
209
+ test("session_start installs the welcome screen as the TUI header", async (t) => {
210
+ const dir = join(
211
+ tmpdir(),
212
+ `gsd-welcome-header-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
213
+ );
214
+ mkdirSync(join(dir, "bin"), { recursive: true });
215
+ mkdirSync(join(dir, "dist"), { recursive: true });
216
+ writeFileSync(join(dir, "bin", "welcome-screen.js"), "export const stale = true;\n", "utf-8");
217
+ writeFileSync(
218
+ join(dir, "dist", "welcome-screen.js"),
219
+ [
220
+ "export function buildWelcomeScreenLines(opts) {",
221
+ " return [`welcome ${opts.version} ${opts.remoteChannel ?? 'none'} ${opts.width}`];",
222
+ "}",
223
+ "",
224
+ ].join("\n"),
225
+ "utf-8",
226
+ );
227
+
228
+ const originalCwd = process.cwd();
229
+ const originalGsdPkgRoot = process.env.GSD_PKG_ROOT;
230
+ const originalGsdBinPath = process.env.GSD_BIN_PATH;
231
+ const originalGsdVersion = process.env.GSD_VERSION;
232
+ const originalFirstRunBanner = process.env.GSD_FIRST_RUN_BANNER;
233
+ process.chdir(dir);
234
+ process.env.GSD_PKG_ROOT = dir;
235
+ process.env.GSD_BIN_PATH = join(dir, "bin", "loader.js");
236
+ process.env.GSD_VERSION = "9.9.9-test";
237
+ delete process.env.GSD_FIRST_RUN_BANNER;
238
+ t.after(() => {
239
+ process.chdir(originalCwd);
240
+ if (originalGsdPkgRoot === undefined) delete process.env.GSD_PKG_ROOT;
241
+ else process.env.GSD_PKG_ROOT = originalGsdPkgRoot;
242
+ if (originalGsdBinPath === undefined) delete process.env.GSD_BIN_PATH;
243
+ else process.env.GSD_BIN_PATH = originalGsdBinPath;
244
+ if (originalGsdVersion === undefined) delete process.env.GSD_VERSION;
245
+ else process.env.GSD_VERSION = originalGsdVersion;
246
+ if (originalFirstRunBanner === undefined) delete process.env.GSD_FIRST_RUN_BANNER;
247
+ else process.env.GSD_FIRST_RUN_BANNER = originalFirstRunBanner;
248
+ try { rmSync(dir, { recursive: true, force: true }); } catch { /* best-effort */ }
249
+ });
250
+
251
+ const handlers = new Map<string, (event: unknown, ctx: any) => Promise<void> | void>();
252
+ const pi = {
253
+ on(event: string, handler: (event: unknown, ctx: any) => Promise<void> | void) {
254
+ handlers.set(event, handler);
255
+ },
256
+ } as any;
257
+
258
+ registerHooks(pi, []);
259
+
260
+ const sessionStart = handlers.get("session_start");
261
+ assert.ok(sessionStart, "session_start handler must be registered");
262
+
263
+ let headerFactory: ((tui: unknown, theme: unknown) => { render(width: number): string[] }) | undefined;
264
+ await sessionStart!({}, {
265
+ hasUI: true,
266
+ ui: {
267
+ notify: () => {},
268
+ setStatus: () => {},
269
+ setFooter: () => {},
270
+ setHeader: (factory: typeof headerFactory) => {
271
+ headerFactory = factory;
272
+ },
273
+ setWorkingMessage: () => {},
274
+ onTerminalInput: () => () => {},
275
+ setWidget: () => {},
276
+ },
277
+ sessionManager: { getSessionId: () => null },
278
+ model: null,
279
+ } as any);
280
+
281
+ assert.equal(typeof headerFactory, "function", "session_start should install a header factory");
282
+ const header = headerFactory!({}, {});
283
+ assert.deepEqual(header.render(123), ["welcome 9.9.9-test none 123"]);
284
+ });
285
+
209
286
  test("session_start and session_switch apply disabled model provider policy from current preferences", async (t) => {
210
287
  const dir = join(
211
288
  tmpdir(),
@@ -0,0 +1,166 @@
1
+ // GSD-2 + src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts
2
+ // Regression: session-transition aborts must not be classified as user cancellations.
3
+
4
+ import test from "node:test";
5
+ import assert from "node:assert/strict";
6
+
7
+ import {
8
+ _handleSessionSwitchAgentEnd,
9
+ isClaudeCodeSessionSwitchAbortMessage,
10
+ } from "../bootstrap/agent-end-recovery.js";
11
+ import type { ErrorContext } from "../auto/types.js";
12
+
13
+ test("user-abort message during session-switch is dropped (not propagated as cancellation)", () => {
14
+ // The Anthropic SDK emits this exact string when newSession() aborts an
15
+ // in-flight stream during a unit-to-unit session transition. Before the fix
16
+ // this was misclassified as a user cancellation and killed auto-mode with
17
+ // "Auto-mode stopped — Unit aborted: Claude Code process aborted by user".
18
+ let cancelledWith: ErrorContext | null = null;
19
+ const resolveCancelled = (ctx: ErrorContext) => {
20
+ cancelledWith = ctx;
21
+ return true;
22
+ };
23
+
24
+ _handleSessionSwitchAgentEnd(
25
+ { stopReason: "error", errorMessage: "Claude Code process aborted by user" },
26
+ resolveCancelled,
27
+ );
28
+ assert.equal(cancelledWith, null, "SDK user-abort during session-switch must not propagate cancellation");
29
+
30
+ _handleSessionSwitchAgentEnd(
31
+ { stopReason: "error", errorMessage: "Request aborted by user" },
32
+ resolveCancelled,
33
+ );
34
+ assert.equal(cancelledWith, null, "proxy user-abort during session-switch must not propagate cancellation");
35
+ });
36
+
37
+ test("genuine stopReason='aborted' with errorMessage during session-switch still propagates", () => {
38
+ // Regression guard for prior behavior: genuine aborts with diagnostic content
39
+ // continue to surface as cancellations so transient-pause recovery can run.
40
+ let cancelledWith: { message: string; category: string; isTransient?: boolean } | null = null;
41
+ const resolveCancelled = (ctx: ErrorContext) => {
42
+ cancelledWith = ctx;
43
+ return true;
44
+ };
45
+
46
+ _handleSessionSwitchAgentEnd(
47
+ {
48
+ stopReason: "aborted",
49
+ errorMessage: "stream torn down mid-flight",
50
+ content: [{ type: "text", text: "partial output" }],
51
+ },
52
+ resolveCancelled,
53
+ );
54
+
55
+ assert.deepEqual(cancelledWith, {
56
+ message: "stream torn down mid-flight",
57
+ category: "aborted",
58
+ isTransient: true,
59
+ });
60
+ });
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
+
119
+ test("empty-content aborted during session-switch is silently ignored", () => {
120
+ // Empty-content aborted is a non-fatal LLM stop; we must not pause/cancel.
121
+ let cancelledWith: unknown = null;
122
+ const resolveCancelled = (ctx: ErrorContext) => {
123
+ cancelledWith = ctx;
124
+ return true;
125
+ };
126
+
127
+ _handleSessionSwitchAgentEnd(
128
+ { stopReason: "aborted", content: [] },
129
+ resolveCancelled,
130
+ );
131
+
132
+ assert.equal(cancelledWith, null);
133
+ });
134
+
135
+ test("non-abort errors during session-switch are not propagated through this helper", () => {
136
+ // Real provider errors (rate-limit, network, unsupported-model) are handled
137
+ // by the post-switch retry pipeline — not by the in-flight switch handler.
138
+ let cancelledWith: unknown = null;
139
+ const resolveCancelled = (ctx: ErrorContext) => {
140
+ cancelledWith = ctx;
141
+ return true;
142
+ };
143
+
144
+ _handleSessionSwitchAgentEnd(
145
+ { stopReason: "error", errorMessage: "rate limit exceeded" },
146
+ resolveCancelled,
147
+ );
148
+
149
+ assert.equal(cancelledWith, null);
150
+ });
151
+
152
+ test("malformed lastMsg is rejected gracefully", () => {
153
+ let calls = 0;
154
+ const resolveCancelled = (_ctx: unknown) => {
155
+ calls += 1;
156
+ return true;
157
+ };
158
+
159
+ _handleSessionSwitchAgentEnd(undefined, resolveCancelled as never);
160
+ _handleSessionSwitchAgentEnd(null, resolveCancelled as never);
161
+ _handleSessionSwitchAgentEnd("not an object", resolveCancelled as never);
162
+ _handleSessionSwitchAgentEnd({}, resolveCancelled as never);
163
+ _handleSessionSwitchAgentEnd({ stopReason: "completed" }, resolveCancelled as never);
164
+
165
+ assert.equal(calls, 0, "malformed or non-abort lastMsg must not invoke cancellation");
166
+ });
@@ -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 });