gsd-pi 2.80.0-dev.96f4d89d5 → 2.80.0-dev.b0acf17e9

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 (667) hide show
  1. package/README.md +4 -2
  2. package/dist/claude-cli-check.d.ts +30 -0
  3. package/dist/claude-cli-check.js +18 -7
  4. package/dist/cli.js +0 -19
  5. package/dist/headless-query.d.ts +10 -0
  6. package/dist/headless-query.js +6 -4
  7. package/dist/loader-entrypoint.d.ts +8 -0
  8. package/dist/loader-entrypoint.js +27 -0
  9. package/dist/loader.js +2 -11
  10. package/dist/mcp-server.d.ts +1 -0
  11. package/dist/mcp-server.js +6 -3
  12. package/dist/resources/.managed-resources-content-hash +1 -1
  13. package/dist/resources/GSD-WORKFLOW.md +2 -2
  14. package/dist/resources/extensions/claude-code-cli/readiness.js +18 -7
  15. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +29 -0
  16. package/dist/resources/extensions/github-sync/sync.js +4 -1
  17. package/dist/resources/extensions/gsd/auto/loop.js +103 -9
  18. package/dist/resources/extensions/gsd/auto/phases.js +240 -139
  19. package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
  20. package/dist/resources/extensions/gsd/auto/run-unit.js +22 -30
  21. package/dist/resources/extensions/gsd/auto/session.js +8 -0
  22. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
  23. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
  24. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
  25. package/dist/resources/extensions/gsd/auto-dispatch.js +26 -0
  26. package/dist/resources/extensions/gsd/auto-post-unit.js +103 -86
  27. package/dist/resources/extensions/gsd/auto-prompts.js +214 -17
  28. package/dist/resources/extensions/gsd/auto-recovery.js +197 -9
  29. package/dist/resources/extensions/gsd/auto-start.js +240 -15
  30. package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
  31. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
  32. package/dist/resources/extensions/gsd/auto-worktree.js +165 -28
  33. package/dist/resources/extensions/gsd/auto.js +165 -45
  34. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +99 -10
  35. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +50 -37
  36. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +35 -10
  37. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +36 -20
  38. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +10 -1
  39. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +12 -4
  40. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +11 -3
  41. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
  42. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +330 -55
  43. package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
  44. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +129 -1
  45. package/dist/resources/extensions/gsd/clean-root-preflight.js +65 -9
  46. package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
  47. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  48. package/dist/resources/extensions/gsd/commands-config.js +1 -1
  49. package/dist/resources/extensions/gsd/commands-extract-learnings.js +17 -12
  50. package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
  51. package/dist/resources/extensions/gsd/context-budget.js +37 -2
  52. package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
  53. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  54. package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
  55. package/dist/resources/extensions/gsd/db-base-schema.js +18 -2
  56. package/dist/resources/extensions/gsd/db-migration-steps.js +22 -0
  57. package/dist/resources/extensions/gsd/detection.js +106 -0
  58. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
  59. package/dist/resources/extensions/gsd/git-service.js +73 -5
  60. package/dist/resources/extensions/gsd/gsd-db.js +146 -13
  61. package/dist/resources/extensions/gsd/guided-flow.js +143 -48
  62. package/dist/resources/extensions/gsd/init-wizard.js +4 -1
  63. package/dist/resources/extensions/gsd/memory-store.js +69 -12
  64. package/dist/resources/extensions/gsd/migrate/command.js +40 -1
  65. package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
  66. package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
  67. package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
  68. package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
  69. package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
  70. package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
  71. package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
  72. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +21 -19
  73. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  74. package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
  75. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  76. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  77. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  78. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
  79. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  80. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  81. package/dist/resources/extensions/gsd/quick.js +34 -2
  82. package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -2
  83. package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
  84. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
  85. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  86. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
  87. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
  88. package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
  89. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
  90. package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
  91. package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
  92. package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
  93. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  94. package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
  95. package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
  96. package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
  97. package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
  98. package/dist/resources/extensions/gsd/worktree-resolver.js +90 -22
  99. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  100. package/dist/web/standalone/.next/BUILD_ID +1 -1
  101. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  102. package/dist/web/standalone/.next/build-manifest.json +3 -3
  103. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  104. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  105. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  106. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  107. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  116. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/index.html +1 -1
  124. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  125. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  126. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  127. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  132. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/middleware.js +3 -3
  135. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  136. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  137. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  138. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
  139. package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
  140. package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
  141. package/dist/welcome-screen.d.ts +2 -0
  142. package/dist/welcome-screen.js +9 -7
  143. package/package.json +6 -4
  144. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  145. package/packages/mcp-server/dist/workflow-tools.js +22 -17
  146. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  147. package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
  148. package/packages/mcp-server/src/workflow-tools.ts +30 -16
  149. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  150. package/packages/native/tsconfig.tsbuildinfo +1 -1
  151. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  152. package/packages/pi-agent-core/dist/agent-loop.js +4 -1
  153. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  154. package/packages/pi-agent-core/dist/agent.d.ts +5 -0
  155. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  156. package/packages/pi-agent-core/dist/agent.js +2 -0
  157. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  158. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  159. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  160. package/packages/pi-agent-core/dist/index.js +2 -0
  161. package/packages/pi-agent-core/dist/index.js.map +1 -1
  162. package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
  163. package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
  164. package/packages/pi-agent-core/dist/token-audit.js +221 -0
  165. package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
  166. package/packages/pi-agent-core/dist/types.d.ts +9 -0
  167. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  168. package/packages/pi-agent-core/dist/types.js.map +1 -1
  169. package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
  170. package/packages/pi-agent-core/src/agent-loop.ts +4 -1
  171. package/packages/pi-agent-core/src/agent.ts +8 -0
  172. package/packages/pi-agent-core/src/index.ts +2 -0
  173. package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
  174. package/packages/pi-agent-core/src/token-audit.ts +287 -0
  175. package/packages/pi-agent-core/src/types.ts +14 -0
  176. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  177. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
  178. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  179. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
  180. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
  181. package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
  182. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  183. package/packages/pi-ai/dist/providers/anthropic.js +9 -7
  184. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  185. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
  186. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
  187. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
  188. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  189. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
  190. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
  191. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
  192. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
  193. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
  194. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
  195. package/packages/pi-ai/src/providers/anthropic.ts +22 -9
  196. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
  197. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
  198. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
  199. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
  200. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  201. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +32 -0
  202. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  203. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +18 -0
  204. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  205. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +12 -0
  206. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  207. package/packages/pi-coding-agent/dist/core/agent-session.js +44 -7
  208. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  209. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +78 -0
  210. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  211. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
  212. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  213. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
  214. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  215. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
  216. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
  217. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
  218. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
  219. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
  220. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
  221. package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
  222. package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
  223. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
  224. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
  225. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
  226. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
  227. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  228. package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
  229. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  230. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -0
  231. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  232. package/packages/pi-coding-agent/dist/core/extensions/runner.js +20 -7
  233. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  234. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +102 -3
  235. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  236. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +41 -3
  237. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  238. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  239. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
  240. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
  241. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
  242. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
  243. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
  244. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
  245. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
  246. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  247. package/packages/pi-coding-agent/dist/core/sdk.js +74 -2
  248. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  249. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
  250. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  251. package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
  252. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  253. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
  254. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  255. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
  256. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  257. package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
  258. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  259. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
  260. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
  261. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
  262. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  263. package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
  264. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  265. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
  266. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
  268. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  269. package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
  270. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  271. package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
  272. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  273. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
  274. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  275. package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
  276. package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  277. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
  278. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  279. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
  280. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  281. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
  282. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  283. package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
  284. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  285. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
  286. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
  288. package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  289. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
  290. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  291. package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
  292. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
  294. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
  296. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
  297. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
  298. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
  299. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
  300. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
  301. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
  302. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
  303. package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
  304. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  305. package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
  306. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  307. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +6 -4
  308. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
  309. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +137 -19
  310. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  311. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +2 -2
  312. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  313. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  314. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  315. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  316. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +2 -1
  317. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  318. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +7 -6
  319. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  320. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +18 -0
  321. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  322. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +225 -16
  323. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  325. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +85 -2
  326. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +71 -0
  328. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  329. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  330. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +3 -0
  331. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  332. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  333. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +36 -27
  334. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  335. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +21 -0
  336. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  337. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
  338. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
  339. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
  340. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
  341. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
  342. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
  343. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
  344. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +36 -0
  345. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +25 -0
  346. package/packages/pi-coding-agent/src/core/agent-session.ts +48 -7
  347. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +91 -0
  348. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
  349. package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
  350. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  351. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  352. package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
  353. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +113 -3
  354. package/packages/pi-coding-agent/src/core/extensions/runner.ts +24 -6
  355. package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -2
  356. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
  357. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
  358. package/packages/pi-coding-agent/src/core/sdk.ts +85 -3
  359. package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
  360. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
  361. package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
  362. package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
  363. package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
  364. package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
  365. package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
  366. package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
  367. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
  368. package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
  369. package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
  370. package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
  371. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
  372. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
  373. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
  374. package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
  375. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +7 -5
  376. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +185 -19
  377. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +2 -2
  378. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -0
  379. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +2 -1
  380. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +10 -9
  381. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +260 -16
  382. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
  383. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +107 -3
  384. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +3 -0
  385. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +36 -27
  386. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +25 -0
  387. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
  388. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
  389. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  390. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  391. package/packages/pi-tui/dist/tui.js +18 -8
  392. package/packages/pi-tui/dist/tui.js.map +1 -1
  393. package/packages/pi-tui/src/tui.ts +20 -8
  394. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  395. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  396. package/pkg/dist/modes/interactive/theme/themes.js +36 -27
  397. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  398. package/src/resources/GSD-WORKFLOW.md +2 -2
  399. package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
  400. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +30 -0
  401. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +26 -0
  402. package/src/resources/extensions/github-sync/sync.ts +8 -1
  403. package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
  404. package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -2
  405. package/src/resources/extensions/gsd/auto/loop.ts +134 -16
  406. package/src/resources/extensions/gsd/auto/phases.ts +328 -200
  407. package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
  408. package/src/resources/extensions/gsd/auto/run-unit.ts +28 -30
  409. package/src/resources/extensions/gsd/auto/session.ts +8 -0
  410. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
  411. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
  412. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
  413. package/src/resources/extensions/gsd/auto-dispatch.ts +33 -0
  414. package/src/resources/extensions/gsd/auto-post-unit.ts +116 -88
  415. package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
  416. package/src/resources/extensions/gsd/auto-recovery.ts +207 -7
  417. package/src/resources/extensions/gsd/auto-start.ts +293 -21
  418. package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
  419. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
  420. package/src/resources/extensions/gsd/auto-worktree.ts +199 -30
  421. package/src/resources/extensions/gsd/auto.ts +216 -40
  422. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +120 -8
  423. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +51 -37
  424. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +35 -10
  425. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +38 -19
  426. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +11 -1
  427. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +13 -4
  428. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +12 -3
  429. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
  430. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +386 -55
  431. package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
  432. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +135 -1
  433. package/src/resources/extensions/gsd/clean-root-preflight.ts +72 -9
  434. package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
  435. package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
  436. package/src/resources/extensions/gsd/commands-config.ts +1 -1
  437. package/src/resources/extensions/gsd/commands-extract-learnings.ts +17 -12
  438. package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
  439. package/src/resources/extensions/gsd/context-budget.ts +44 -2
  440. package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
  441. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  442. package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
  443. package/src/resources/extensions/gsd/db-base-schema.ts +19 -2
  444. package/src/resources/extensions/gsd/db-migration-steps.ts +25 -0
  445. package/src/resources/extensions/gsd/detection.ts +128 -0
  446. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
  447. package/src/resources/extensions/gsd/git-service.ts +87 -10
  448. package/src/resources/extensions/gsd/gsd-db.ts +168 -13
  449. package/src/resources/extensions/gsd/guided-flow.ts +169 -55
  450. package/src/resources/extensions/gsd/init-wizard.ts +5 -1
  451. package/src/resources/extensions/gsd/memory-store.ts +77 -12
  452. package/src/resources/extensions/gsd/migrate/command.ts +47 -1
  453. package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
  454. package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
  455. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  456. package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
  457. package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
  458. package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
  459. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  460. package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
  461. package/src/resources/extensions/gsd/prompts/complete-milestone.md +21 -19
  462. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  463. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  464. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  465. package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  466. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  467. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
  468. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  469. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  470. package/src/resources/extensions/gsd/quick.ts +37 -2
  471. package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -2
  472. package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
  473. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
  474. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
  475. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
  476. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
  477. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
  478. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +433 -11
  479. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
  480. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
  481. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
  482. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +160 -11
  483. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
  484. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
  485. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +184 -2
  486. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
  487. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
  488. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
  489. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
  490. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
  491. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +138 -0
  492. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
  493. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
  494. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
  495. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
  496. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
  497. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
  498. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
  499. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +97 -2
  500. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
  501. package/src/resources/extensions/gsd/tests/cmux.test.ts +42 -53
  502. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
  503. package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
  504. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +9 -0
  505. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
  506. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
  507. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
  508. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
  509. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
  510. package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
  511. package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
  512. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
  513. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
  514. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +5 -1
  515. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  516. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
  517. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +2 -2
  518. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +4 -9
  519. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
  520. package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
  521. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
  522. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
  523. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
  524. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
  525. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
  526. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
  527. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
  528. package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
  529. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
  530. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
  531. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  532. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +132 -0
  533. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
  534. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
  535. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -0
  536. package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +33 -1
  537. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
  538. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +35 -0
  539. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
  540. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +66 -0
  541. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
  542. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
  543. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
  544. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +239 -1
  545. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
  546. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
  547. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
  548. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
  549. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
  550. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +1 -0
  551. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
  552. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
  553. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +242 -0
  554. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +79 -98
  555. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
  556. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
  557. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
  558. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
  559. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -0
  560. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +133 -0
  561. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  562. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  563. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
  564. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
  565. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +91 -75
  566. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
  567. package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
  568. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
  569. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
  570. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
  571. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
  572. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
  573. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
  574. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
  575. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
  576. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  577. package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
  578. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
  579. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
  580. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
  581. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
  582. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
  583. package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
  584. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
  585. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
  586. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
  587. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
  588. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
  589. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
  590. package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +192 -0
  591. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
  592. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
  593. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
  594. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  595. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
  596. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
  597. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +166 -0
  598. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
  599. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
  600. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
  601. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
  602. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
  603. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
  604. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
  605. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
  606. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -59
  607. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
  608. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
  609. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
  610. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
  611. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
  612. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
  613. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +101 -2
  614. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -0
  615. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
  616. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +36 -45
  617. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
  618. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
  619. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
  620. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  621. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
  622. package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
  623. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
  624. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
  625. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
  626. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
  627. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
  628. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
  629. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
  630. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
  631. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
  632. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
  633. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
  634. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
  635. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  636. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
  637. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
  638. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
  639. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
  640. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +38 -6
  641. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +1 -0
  642. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
  643. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
  644. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
  645. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
  646. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  647. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +203 -4
  648. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +179 -0
  649. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
  650. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  651. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
  652. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
  653. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
  654. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
  655. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
  656. package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
  657. package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
  658. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  659. package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
  660. package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
  661. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  662. package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
  663. package/src/resources/extensions/gsd/worktree-resolver.ts +119 -20
  664. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
  665. package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
  666. /package/dist/web/standalone/.next/static/{y7d--cnc6Cibuva-Lzzw_ → naNyn5ToUBzCQtuLbEYXC}/_buildManifest.js +0 -0
  667. /package/dist/web/standalone/.next/static/{y7d--cnc6Cibuva-Lzzw_ → naNyn5ToUBzCQtuLbEYXC}/_ssgManifest.js +0 -0
@@ -1,19 +1,16 @@
1
1
  import test from "node:test";
2
2
  import assert from "node:assert/strict";
3
- import { readFileSync } from "node:fs";
4
- import { join } from "node:path";
5
3
 
6
- const initWizardSource = readFileSync(join(import.meta.dirname, "..", "init-wizard.ts"), "utf8");
7
- const guidedFlowSource = readFileSync(join(import.meta.dirname, "..", "guided-flow.ts"), "utf8");
4
+ import { shouldWriteGitFiles } from "../init-wizard.ts";
5
+ import { shouldSkipGitBootstrapAfterInit } from "../guided-flow.ts";
8
6
 
9
- test("init wizard returns gitEnabled false when git setup is skipped", () => {
10
- assert.match(initWizardSource, /gitEnabled = signals\.isGitRepo/);
11
- assert.match(initWizardSource, /return \{ completed: true, bootstrapped: true, gitEnabled \}/);
12
- assert.match(initWizardSource, /if \(gitEnabled\) \{\s*ensureGitignore\(basePath\);/);
7
+ test("init wizard does not write git files when git setup is skipped", () => {
8
+ assert.equal(shouldWriteGitFiles(false), false);
9
+ assert.equal(shouldWriteGitFiles(true), true);
13
10
  });
14
11
 
15
- test("guided flow does not initialize git after the init wizard skip-git choice", () => {
16
- assert.match(guidedFlowSource, /skipGitBootstrap = result\.gitEnabled === false/);
17
- assert.match(guidedFlowSource, /if \(!skipGitBootstrap && \(!nativeIsRepo\(basePath\) \|\| isInheritedRepo\(basePath\)\)\)/);
18
- assert.match(guidedFlowSource, /if \(!skipGitBootstrap && nativeIsRepo\(basePath\)\) \{\s*ensureGitignore\(basePath\);/);
12
+ test("guided flow skips git bootstrap after the init wizard skip-git choice", () => {
13
+ assert.equal(shouldSkipGitBootstrapAfterInit({ gitEnabled: false }), true);
14
+ assert.equal(shouldSkipGitBootstrapAfterInit({ gitEnabled: true }), false);
15
+ assert.equal(shouldSkipGitBootstrapAfterInit({}), false);
19
16
  });
@@ -1,3 +1,5 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Auto-worktree milestone squash-merge integration tests.
1
3
  /**
2
4
  * auto-worktree-milestone-merge.test.ts — Integration tests for mergeMilestoneToMain.
3
5
  *
@@ -25,6 +27,13 @@ import {
25
27
  import { getSliceBranchName } from "../../worktree.ts";
26
28
  import { nativeMergeSquash } from "../../native-git-bridge.ts";
27
29
  import { drainLogs, setStderrLoggingEnabled } from "../../workflow-logger.ts";
30
+ import {
31
+ closeDatabase,
32
+ insertMilestone,
33
+ insertSlice,
34
+ insertTask,
35
+ openDatabase,
36
+ } from "../../gsd-db.ts";
28
37
 
29
38
  function run(cmd: string, cwd: string): string {
30
39
  // Safe: all inputs are hardcoded test strings, not user input
@@ -117,6 +126,7 @@ describe("auto-worktree-milestone-merge", { timeout: 300_000 }, () => {
117
126
 
118
127
  afterEach(() => {
119
128
  process.chdir(savedCwd);
129
+ closeDatabase();
120
130
  for (const d of tempDirs) {
121
131
  if (existsSync(d)) rmSync(d, { recursive: true, force: true });
122
132
  }
@@ -179,6 +189,24 @@ describe("auto-worktree-milestone-merge", { timeout: 300_000 }, () => {
179
189
  addSliceToMilestone(repo, wtPath, "M020", "S03", "Logging infra", [
180
190
  { file: "logger.ts", content: "export const log = () => {};\n", message: "add logger" },
181
191
  ]);
192
+ openDatabase(":memory:");
193
+ insertMilestone({ id: "M020", title: "M020: Backend foundation", status: "complete" });
194
+ for (const slice of [
195
+ { id: "S01", title: "Core API", tasks: [{ id: "T01", title: "Create API router" }] },
196
+ { id: "S02", title: "Error handling", tasks: [{ id: "T02", title: "Handle API errors" }] },
197
+ { id: "S03", title: "Logging infra", tasks: [{ id: "T03", title: "Wire request logging" }] },
198
+ ]) {
199
+ insertSlice({ id: slice.id, milestoneId: "M020", title: slice.title, status: "complete" });
200
+ for (const task of slice.tasks) {
201
+ insertTask({
202
+ id: task.id,
203
+ sliceId: slice.id,
204
+ milestoneId: "M020",
205
+ title: task.title,
206
+ status: "complete",
207
+ });
208
+ }
209
+ }
182
210
 
183
211
  const roadmap = makeRoadmap("M020", "Backend foundation", [
184
212
  { id: "S01", title: "Core API" },
@@ -193,13 +221,20 @@ describe("auto-worktree-milestone-merge", { timeout: 300_000 }, () => {
193
221
  assert.ok(result.commitMessage.includes("- S01: Core API"), "body lists S01");
194
222
  assert.ok(result.commitMessage.includes("- S02: Error handling"), "body lists S02");
195
223
  assert.ok(result.commitMessage.includes("- S03: Logging infra"), "body lists S03");
224
+ assert.ok(result.commitMessage.includes("Completed tasks:"), "body lists completed tasks");
225
+ assert.ok(result.commitMessage.includes("- S01/T01: Create API router"), "body lists S01 task");
226
+ assert.ok(result.commitMessage.includes("- S02/T02: Handle API errors"), "body lists S02 task");
227
+ assert.ok(result.commitMessage.includes("Milestone: M020 - Backend foundation"), "body has human milestone context");
196
228
  assert.ok(result.commitMessage.includes("GSD-Milestone: M020"), "body has GSD-Milestone trailer");
197
229
  assert.ok(result.commitMessage.includes("Branch: milestone/M020"), "body has branch metadata");
230
+ assert.ok(!result.commitMessage.includes("auto-commit after complete-milestone"), "body avoids generic complete-milestone fallback");
231
+ assert.ok(!result.commitMessage.includes("GSD-Unit:"), "body avoids generic unit trailer");
198
232
 
199
233
  const gitMsg = run("git log -1 --format=%B main", repo).trim();
200
234
  assert.match(gitMsg, /^feat:/, "git commit message starts with feat:");
201
235
  assert.ok(gitMsg.includes("GSD-Milestone: M020"), "git commit has GSD-Milestone trailer");
202
236
  assert.ok(gitMsg.includes("- S01: Core API"), "git commit body has S01");
237
+ assert.ok(gitMsg.includes("- S03/T03: Wire request logging"), "git commit body has task names");
203
238
  });
204
239
 
205
240
  test("nothing to commit — safe when no code changes (#1738, #1792)", () => {
@@ -7,13 +7,13 @@ import assert from 'node:assert/strict';
7
7
  * English output, and that nativeMergeSquash passes the env to execFileSync.
8
8
  */
9
9
 
10
- import { mkdtempSync, mkdirSync, writeFileSync, rmSync, readFileSync } from "node:fs";
10
+ import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from "node:fs";
11
11
  import { join } from "node:path";
12
12
  import { tmpdir } from "node:os";
13
13
  import { execFileSync } from "node:child_process";
14
14
 
15
15
  import { GIT_NO_PROMPT_ENV } from "../../git-constants.ts";
16
- import { nativeAddAllWithExclusions } from "../../native-git-bridge.ts";
16
+ import { nativeAddAllWithExclusions, nativeMergeSquash } from "../../native-git-bridge.ts";
17
17
  import { RUNTIME_EXCLUSION_PATHS } from "../../git-service.ts";
18
18
  function git(cwd: string, ...args: string[]): string {
19
19
  return execFileSync("git", args, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
@@ -97,23 +97,34 @@ describe('git-locale', async () => {
97
97
 
98
98
  // ─── nativeMergeSquash: env is passed (merge-squash stderr is English) ─
99
99
 
100
- test('nativeMergeSquash fallback uses GIT_NO_PROMPT_ENV', () => {
101
- // We verify indirectly: the source code must pass env: GIT_NO_PROMPT_ENV.
102
- // Read the source and check for the pattern. This is a static check.
103
- const src = readFileSync(
104
- join(import.meta.dirname, "../..", "native-git-bridge.ts"),
105
- "utf-8"
106
- );
107
-
108
- // Find the nativeMergeSquash function and check it uses GIT_NO_PROMPT_ENV
109
- const fnStart = src.indexOf("export function nativeMergeSquash");
110
- assert.ok(fnStart !== -1, "nativeMergeSquash function exists in source");
111
-
112
- const fnBody = src.slice(fnStart, src.indexOf("\nexport function", fnStart + 1));
113
- const hasEnv = fnBody.includes("env: GIT_NO_PROMPT_ENV");
114
- assert.ok(
115
- hasEnv,
116
- "nativeMergeSquash fallback must pass env: GIT_NO_PROMPT_ENV to execFileSync (#1997)"
117
- );
100
+ test('nativeMergeSquash succeeds under non-English locale env', () => {
101
+ const repo = initTempRepo();
102
+ try {
103
+ const mainBranch = git(repo, "branch", "--show-current");
104
+ git(repo, "checkout", "-b", "feature");
105
+ createFile(repo, "src/feature.ts", "export const feature = true;");
106
+ git(repo, "add", "-A");
107
+ git(repo, "commit", "-m", "feat: add feature");
108
+ git(repo, "checkout", mainBranch);
109
+
110
+ const origLcAll = process.env.LC_ALL;
111
+ const origLang = process.env.LANG;
112
+ process.env.LANG = "de_DE.UTF-8";
113
+ delete process.env.LC_ALL;
114
+ try {
115
+ const result = nativeMergeSquash(repo, "feature");
116
+ assert.equal(result.success, true);
117
+ } finally {
118
+ if (origLcAll !== undefined) process.env.LC_ALL = origLcAll;
119
+ else delete process.env.LC_ALL;
120
+ if (origLang !== undefined) process.env.LANG = origLang;
121
+ else delete process.env.LANG;
122
+ }
123
+
124
+ const staged = git(repo, "diff", "--cached", "--name-only");
125
+ assert.ok(staged.includes("src/feature.ts"));
126
+ } finally {
127
+ rmSync(repo, { recursive: true, force: true });
128
+ }
118
129
  });
119
130
  });
@@ -1,3 +1,5 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Git service integration and commit-message tests.
1
3
  import { describe, test } from 'node:test';
2
4
  import assert from 'node:assert/strict';
3
5
  import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync, symlinkSync, readFileSync } from "node:fs";
@@ -211,7 +213,12 @@ describe('git-service', async () => {
211
213
  test('buildTaskCommitMessage', () => {
212
214
  const msg = buildTaskCommitMessage({
213
215
  taskId: "S01/T02",
216
+ taskDisplayId: "T02",
214
217
  taskTitle: "implement user authentication",
218
+ milestoneId: "M001",
219
+ milestoneTitle: "User management",
220
+ sliceId: "S01",
221
+ sliceTitle: "Authentication",
215
222
  oneLiner: "Added JWT-based auth with refresh token rotation",
216
223
  keyFiles: ["src/auth.ts", "src/middleware/jwt.ts"],
217
224
  });
@@ -220,7 +227,12 @@ describe('git-service', async () => {
220
227
  assert.ok(msg.includes("JWT-based auth"), "message includes one-liner content");
221
228
  assert.ok(msg.includes("- src/auth.ts"), "message body includes key files");
222
229
  assert.ok(msg.includes("- src/middleware/jwt.ts"), "message body includes second key file");
230
+ assert.ok(msg.includes("GSD context:"), "message includes human GSD context block");
231
+ assert.ok(msg.includes("- Milestone: M001 - User management"), "message includes milestone name");
232
+ assert.ok(msg.includes("- Slice: S01 - Authentication"), "message includes slice name");
233
+ assert.ok(msg.includes("- Task: T02 - implement user authentication"), "message includes task name");
223
234
  assert.ok(msg.includes("GSD-Task: S01/T02"), "GSD-Task trailer in body");
235
+ assert.ok(!msg.includes("chore: auto-commit after execute-task"), "message does not use generic fallback");
224
236
  });
225
237
 
226
238
  test('buildTaskCommitMessage sanitizes subject text', () => {
@@ -542,6 +554,60 @@ describe('git-service', async () => {
542
554
  rmSync(repo, { recursive: true, force: true });
543
555
  });
544
556
 
557
+ // Regression: #5500. The LLM occasionally hallucinates files in
558
+ // task.keyFiles that were never written. Pre-existing scoped-stage code
559
+ // ran `git add -- <every keyFile>` and failed the entire commit on the
560
+ // first missing path. Verify that valid paths still commit and missing
561
+ // ones are dropped silently.
562
+ test('GitServiceImpl: scoped staging drops missing keyFiles and commits the rest', () => {
563
+ const repo = initTempRepo();
564
+ const svc = new GitServiceImpl(repo);
565
+
566
+ createFile(repo, "src/index.ts", "export const ok = true;");
567
+ // Note: src/commands/list.ts is intentionally NOT created — the LLM
568
+ // claimed it wrote this file but didn't.
569
+
570
+ const msg = svc.autoCommit("execute-task", "M001/S01/T02", [], {
571
+ taskId: "S01/T02",
572
+ taskTitle: "wire up command list",
573
+ oneLiner: "Added list command stub",
574
+ keyFiles: ["src/index.ts", "src/commands/list.ts"],
575
+ });
576
+ assert.ok(msg !== null, "autoCommit succeeds when at least one keyFile exists");
577
+
578
+ const committed = run("git show --name-only --format= HEAD", repo);
579
+ assert.ok(committed.includes("src/index.ts"), "existing key file is committed");
580
+ assert.ok(!committed.includes("src/commands/list.ts"), "missing key file is silently dropped");
581
+
582
+ rmSync(repo, { recursive: true, force: true });
583
+ });
584
+
585
+ // Regression: #5500. When ALL keyFiles are bogus, scopedStageTaskFiles
586
+ // must return false so autoCommit falls back to smartStage. The commit
587
+ // still goes out (using `git add -A` semantics) instead of failing.
588
+ test('GitServiceImpl: all missing keyFiles falls back to smartStage', () => {
589
+ const repo = initTempRepo();
590
+ const svc = new GitServiceImpl(repo);
591
+
592
+ createFile(repo, "src/actually-changed.ts", "export const real = true;");
593
+
594
+ const msg = svc.autoCommit("execute-task", "M001/S01/T03", [], {
595
+ taskId: "S01/T03",
596
+ taskTitle: "fix path handling",
597
+ oneLiner: "Hardened path resolution",
598
+ keyFiles: ["src/wrong/path-1.ts", "src/wrong/path-2.ts"],
599
+ });
600
+ assert.ok(msg !== null, "autoCommit falls back to smartStage when all keyFiles are missing");
601
+
602
+ const committed = run("git show --name-only --format= HEAD", repo);
603
+ assert.ok(
604
+ committed.includes("src/actually-changed.ts"),
605
+ "smartStage fallback stages real dirty files when scoped staging finds nothing",
606
+ );
607
+
608
+ rmSync(repo, { recursive: true, force: true });
609
+ });
610
+
545
611
  // ─── GitServiceImpl: empty-after-staging guard ─────────────────────────
546
612
 
547
613
  test('GitServiceImpl: empty-after-staging guard', () => {
@@ -4,8 +4,6 @@
4
4
  * Verifies that when auto-mode transitions between milestones, the
5
5
  * worktree lifecycle is handled: old worktree merged, new worktree created.
6
6
  *
7
- * Uses source-level checks since the full auto-mode dispatch loop
8
- * requires the @gsd/pi-coding-agent runtime.
9
7
  */
10
8
 
11
9
  import test from "node:test";
@@ -119,48 +117,3 @@ test("worktree swap on milestone transition: merge old, create new", () => {
119
117
  }
120
118
  }
121
119
  });
122
-
123
- // ─── Verify the transition code path exists in auto.ts ──────────────────────
124
-
125
- test("auto/phases.ts milestone transition block contains worktree lifecycle", () => {
126
- const phasesSrc = readFileSync(
127
- join(__dirname, "../..", "auto", "phases.ts"),
128
- "utf-8",
129
- );
130
-
131
- // The resolver handles worktree merge + enter inside the milestone transition block
132
- assert.ok(
133
- phasesSrc.includes("Worktree lifecycle on milestone transition"),
134
- "auto/phases.ts should contain the worktree lifecycle comment marker",
135
- );
136
- assert.ok(
137
- phasesSrc.includes("resolver.mergeAndExit") && phasesSrc.includes("mid !== s.currentMilestoneId"),
138
- "auto/phases.ts should call resolver.mergeAndExit during milestone transition",
139
- );
140
- assert.ok(
141
- phasesSrc.includes("resolver.enterMilestone"),
142
- "auto/phases.ts should call resolver.enterMilestone for incoming milestone",
143
- );
144
- });
145
-
146
- // ─── Verify worktree-resolver mergeAndExit preserves branch on missing roadmap (#1573) ──
147
-
148
- test("worktree-resolver mergeAndExit preserves branch when roadmap is missing (#1573)", () => {
149
- const resolverSrc = readFileSync(
150
- join(__dirname, "../..", "worktree-resolver.ts"),
151
- "utf-8",
152
- );
153
-
154
- // The fallback teardown must pass preserveBranch: true to prevent orphaning commits
155
- assert.ok(
156
- resolverSrc.includes("preserveBranch: true"),
157
- "worktree-resolver.ts should pass preserveBranch: true in the no-roadmap fallback",
158
- );
159
-
160
- // The worktree path should be tried as a fallback for roadmap resolution
161
- assert.ok(
162
- resolverSrc.includes("this.s.basePath !== originalBase") ||
163
- resolverSrc.includes("roadmap-fallback"),
164
- "worktree-resolver.ts should try resolving roadmap from worktree path as fallback",
165
- );
166
- });
@@ -1,213 +1,71 @@
1
1
  // GSD Extension — Interactive Routing Bypass Tests
2
- // Verifies that dynamic routing is skipped for interactive (guided-flow) dispatches
3
- // and that model downgrade notifications always fire (#3962).
4
- // Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
5
2
 
6
3
  import test, { describe } from "node:test";
7
4
  import assert from "node:assert/strict";
8
- import { readFileSync } from "node:fs";
9
- import { join, dirname } from "node:path";
10
- import { fileURLToPath } from "node:url";
11
- import { extractSourceRegion } from "./test-helpers.ts";
12
-
13
- const __dirname = dirname(fileURLToPath(import.meta.url));
14
-
15
- // ─── Source-level structural tests ──────────────────────────────────────────
16
-
17
- const modelSelectionSrc = readFileSync(
18
- join(__dirname, "..", "auto-model-selection.ts"),
19
- "utf-8",
20
- );
21
-
22
- const guidedFlowSrc = readFileSync(
23
- join(__dirname, "..", "guided-flow.ts"),
24
- "utf-8",
25
- );
26
-
27
- const autoStartSrc = readFileSync(
28
- join(__dirname, "..", "auto-start.ts"),
29
- "utf-8",
30
- );
31
-
32
- describe("interactive routing bypass (#3962)", () => {
33
- test("selectAndApplyModel accepts isAutoMode parameter", () => {
34
- // The function signature should include isAutoMode with a default of true
35
- assert.ok(
36
- modelSelectionSrc.includes("isAutoMode"),
37
- "selectAndApplyModel should have isAutoMode parameter",
38
- );
39
- assert.ok(
40
- modelSelectionSrc.includes("isAutoMode = true"),
41
- "isAutoMode should default to true (auto-mode behavior preserved)",
42
- );
43
- });
44
-
45
- test("routing is disabled when isAutoMode is false", () => {
46
- // The code should disable routing when not in auto-mode
47
- assert.ok(
48
- modelSelectionSrc.includes("if (!isAutoMode)"),
49
- "should check isAutoMode flag to disable routing",
50
- );
51
- assert.ok(
52
- modelSelectionSrc.includes("routingConfig.enabled = false"),
53
- "should set routingConfig.enabled = false for interactive mode",
54
- );
55
- });
56
-
57
- test("resolvePreferredModelConfig skips routing synthesis when isAutoMode is false", () => {
58
- // resolvePreferredModelConfig should accept isAutoMode and bail early
59
- // before synthesizing a routing ceiling from tier_models (#3962 codex review)
60
- assert.ok(
61
- modelSelectionSrc.includes("function resolvePreferredModelConfig"),
62
- "resolvePreferredModelConfig should exist",
63
- );
64
- // The function should check isAutoMode before routing synthesis
65
- const fnIdx = modelSelectionSrc.indexOf("function resolvePreferredModelConfig");
66
- const fnBody = extractSourceRegion(modelSelectionSrc, "function resolvePreferredModelConfig");
67
- assert.ok(
68
- fnBody.includes("isAutoMode"),
69
- "resolvePreferredModelConfig should accept isAutoMode parameter",
70
- );
71
- assert.ok(
72
- fnBody.includes("if (!isAutoMode) return undefined"),
73
- "should return undefined (skip routing synthesis) when not in auto-mode",
74
- );
75
- });
76
-
77
- test("selectAndApplyModel threads isAutoMode to resolvePreferredModelConfig", () => {
78
- // The call to resolvePreferredModelConfig inside selectAndApplyModel
79
- // should pass isAutoMode as the third argument
80
- const callSite = "resolvePreferredModelConfig(unitType, autoModeStartModel, isAutoMode)";
81
- assert.ok(
82
- modelSelectionSrc.includes(callSite),
83
- "selectAndApplyModel should pass isAutoMode to resolvePreferredModelConfig",
84
- );
85
- });
86
-
87
- test("guided-flow passes isAutoMode=false", () => {
88
- // guided-flow.ts should explicitly pass isAutoMode as false
89
- assert.ok(
90
- guidedFlowSrc.includes("/* isAutoMode */ false"),
91
- "guided-flow should pass isAutoMode=false to selectAndApplyModel",
92
- );
93
- });
94
-
95
- test("auto/phases.ts does NOT pass isAutoMode=false", () => {
96
- // auto/phases.ts should use the default (true) — it's auto-mode
97
- const phasesSrc = readFileSync(
98
- join(__dirname, "..", "auto", "phases.ts"),
5
+ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
6
+ import { join } from "node:path";
7
+ import { tmpdir } from "node:os";
8
+
9
+ import { resolvePreferredModelConfig } from "../auto-model-selection.ts";
10
+
11
+ function withRoutingPrefs<T>(fn: () => T): T {
12
+ const originalCwd = process.cwd();
13
+ const originalGsdHome = process.env.GSD_HOME;
14
+ const tempProject = mkdtempSync(join(tmpdir(), "gsd-interactive-routing-"));
15
+ const tempGsdHome = mkdtempSync(join(tmpdir(), "gsd-interactive-routing-home-"));
16
+
17
+ try {
18
+ mkdirSync(join(tempProject, ".gsd"), { recursive: true });
19
+ writeFileSync(
20
+ join(tempProject, ".gsd", "PREFERENCES.md"),
21
+ [
22
+ "---",
23
+ "dynamic_routing:",
24
+ " enabled: true",
25
+ " tier_models:",
26
+ " light: gpt-4o-mini",
27
+ " standard: claude-sonnet-4-6",
28
+ " heavy: claude-opus-4-6",
29
+ "---",
30
+ ].join("\n"),
99
31
  "utf-8",
100
32
  );
101
- assert.ok(
102
- !phasesSrc.includes("isAutoMode"),
103
- "auto/phases.ts should use default isAutoMode=true (not pass it explicitly)",
104
- );
105
- });
106
- });
107
-
108
- describe("model downgrade notifications always visible (#3962)", () => {
109
- test("downgrade notification is not gated by verbose flag", () => {
110
- // The downgrade notification block should NOT be wrapped in `if (verbose)`
111
- // Find the downgrade block and verify it's not behind a verbose check
112
- const downgradeBlock = "if (routingResult.wasDowngraded)";
113
- const downgradeIdx = modelSelectionSrc.indexOf(downgradeBlock);
114
- assert.ok(downgradeIdx > 0, "downgrade block should exist");
115
-
116
- // Extract the code between wasDowngraded check and the next routing label assignment
117
- const afterDowngrade = modelSelectionSrc.slice(
118
- downgradeIdx,
119
- modelSelectionSrc.indexOf("routingTierLabel =", downgradeIdx),
120
- );
121
-
122
- // The notification calls should NOT be wrapped in `if (verbose)`
123
- assert.ok(
124
- !afterDowngrade.includes("if (verbose)"),
125
- "downgrade notifications should not be gated by verbose flag",
126
- );
127
-
128
- // But the notification calls should exist
129
- assert.ok(
130
- afterDowngrade.includes('ctx.ui.notify('),
131
- "downgrade notifications should still fire",
132
- );
133
- });
134
-
135
- test("tier escalation notification is not gated by verbose flag", () => {
136
- // Extract the escalation block: from "if (escalated)" to its closing
137
- // and verify the notification is present but `if (verbose)` is not.
138
- const escalatedIdx = modelSelectionSrc.indexOf("if (escalated)");
139
- assert.ok(escalatedIdx > 0, "escalation block should exist");
140
-
141
- // Get the block from "if (escalated)" to the next distinctive marker
142
- // (the capability-override loading that immediately follows).
143
- const block = extractSourceRegion(
144
- modelSelectionSrc,
145
- "if (escalated)",
146
- "// Load user capability overrides",
147
- );
148
- assert.ok(
149
- block.includes("Tier escalation:"),
150
- "escalation block should contain the notification",
151
- );
152
- assert.ok(
153
- !block.includes("if (verbose)"),
154
- "escalation block should not gate notification behind verbose flag",
155
- );
156
- });
157
- });
158
-
159
- describe("auto-mode start routing banner (#3962)", () => {
160
- test("auto-start shows dynamic routing status on startup", () => {
161
- assert.ok(
162
- autoStartSrc.includes("Dynamic routing:"),
163
- "auto-start should display routing status banner",
164
- );
165
- assert.ok(
166
- autoStartSrc.includes("resolveDynamicRoutingConfig"),
167
- "auto-start should import resolveDynamicRoutingConfig",
168
- );
169
- });
170
-
171
- test("banner shows different messages for enabled vs disabled routing", () => {
172
- assert.ok(
173
- autoStartSrc.includes("Dynamic routing: enabled"),
174
- "should show message when routing is enabled",
175
- );
176
- assert.ok(
177
- autoStartSrc.includes("Dynamic routing: disabled"),
178
- "should show message when routing is disabled",
179
- );
180
- });
33
+ process.env.GSD_HOME = tempGsdHome;
34
+ process.chdir(tempProject);
35
+ return fn();
36
+ } finally {
37
+ process.chdir(originalCwd);
38
+ if (originalGsdHome === undefined) delete process.env.GSD_HOME;
39
+ else process.env.GSD_HOME = originalGsdHome;
40
+ rmSync(tempProject, { recursive: true, force: true });
41
+ rmSync(tempGsdHome, { recursive: true, force: true });
42
+ }
43
+ }
181
44
 
182
- test("banner shows the ceiling model", () => {
183
- assert.ok(
184
- autoStartSrc.includes("startModelLabel"),
185
- "banner should reference the start/ceiling model",
186
- );
187
- });
188
-
189
- test("banner accounts for flat-rate provider suppression", () => {
190
- // The banner should check isFlatRateProvider to accurately reflect
191
- // whether routing will actually be active at dispatch time (#3962 codex review)
192
- assert.ok(
193
- autoStartSrc.includes("isFlatRateProvider"),
194
- "banner should check flat-rate provider status",
195
- );
196
- assert.ok(
197
- autoStartSrc.includes("effectivelyEnabled"),
198
- "banner should compute effective routing state, not just raw config",
199
- );
45
+ describe("interactive routing bypass (#3962)", () => {
46
+ test("interactive dispatch does not synthesize dynamic routing config", () => {
47
+ withRoutingPrefs(() => {
48
+ const result = resolvePreferredModelConfig(
49
+ "execute-task",
50
+ { provider: "anthropic", id: "claude-sonnet-4-6" },
51
+ false,
52
+ );
53
+
54
+ assert.equal(result, undefined);
55
+ });
200
56
  });
201
57
 
202
- test("banner uses effective ceiling from tier_models.heavy when configured", () => {
203
- // The actual ceiling may come from tier_models.heavy, not the start model
204
- assert.ok(
205
- autoStartSrc.includes("tier_models?.heavy"),
206
- "banner should check tier_models.heavy for the effective ceiling",
207
- );
208
- assert.ok(
209
- autoStartSrc.includes("effectiveCeiling"),
210
- "banner should compute the effective ceiling model",
211
- );
58
+ test("auto-mode dispatch still synthesizes dynamic routing config", () => {
59
+ withRoutingPrefs(() => {
60
+ const result = resolvePreferredModelConfig(
61
+ "execute-task",
62
+ { provider: "anthropic", id: "claude-sonnet-4-6" },
63
+ true,
64
+ );
65
+
66
+ assert.ok(result);
67
+ assert.equal(result!.primary, "claude-opus-4-6");
68
+ assert.equal(result!.source, "synthesized");
69
+ });
212
70
  });
213
71
  });