gsd-pi 2.80.0-dev.710c06e97 → 2.80.0-dev.7582bf37a

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 (685) 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 +40 -3
  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 +104 -86
  27. package/dist/resources/extensions/gsd/auto-prompts.js +214 -17
  28. package/dist/resources/extensions/gsd/auto-recovery.js +174 -10
  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 +209 -81
  33. package/dist/resources/extensions/gsd/auto.js +168 -45
  34. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +99 -10
  35. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +44 -37
  36. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -10
  37. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +30 -20
  38. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -1
  39. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -4
  40. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -3
  41. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
  42. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +319 -54
  43. package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
  44. package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
  45. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +19 -2
  46. package/dist/resources/extensions/gsd/clean-root-preflight.js +65 -9
  47. package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
  48. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  49. package/dist/resources/extensions/gsd/commands-config.js +1 -1
  50. package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
  51. package/dist/resources/extensions/gsd/commands-extract-learnings.js +17 -12
  52. package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
  53. package/dist/resources/extensions/gsd/context-budget.js +37 -2
  54. package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
  55. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  56. package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
  57. package/dist/resources/extensions/gsd/db-base-schema.js +18 -2
  58. package/dist/resources/extensions/gsd/db-migration-steps.js +22 -0
  59. package/dist/resources/extensions/gsd/detection.js +106 -0
  60. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
  61. package/dist/resources/extensions/gsd/git-service.js +73 -5
  62. package/dist/resources/extensions/gsd/gsd-db.js +146 -13
  63. package/dist/resources/extensions/gsd/guided-flow.js +143 -48
  64. package/dist/resources/extensions/gsd/init-wizard.js +4 -1
  65. package/dist/resources/extensions/gsd/memory-store.js +69 -12
  66. package/dist/resources/extensions/gsd/migrate/command.js +40 -1
  67. package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
  68. package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
  69. package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
  70. package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
  71. package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
  72. package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
  73. package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
  74. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
  75. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  76. package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
  77. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  78. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  79. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  80. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
  81. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  82. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  83. package/dist/resources/extensions/gsd/quick.js +34 -2
  84. package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -2
  85. package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
  86. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
  87. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
  88. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  89. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
  90. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
  91. package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
  92. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
  93. package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
  94. package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
  95. package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
  96. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  97. package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
  98. package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
  99. package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
  100. package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
  101. package/dist/resources/extensions/gsd/worktree-resolver.js +90 -22
  102. package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  103. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  104. package/dist/web/standalone/.next/BUILD_ID +1 -1
  105. package/dist/web/standalone/.next/app-path-routes-manifest.json +16 -16
  106. package/dist/web/standalone/.next/build-manifest.json +3 -3
  107. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  108. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  109. package/dist/web/standalone/.next/required-server-files.json +1 -1
  110. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  112. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  121. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/index.html +1 -1
  129. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  130. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  131. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  132. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app-paths-manifest.json +16 -16
  137. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/middleware.js +3 -3
  140. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  141. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  142. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  143. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
  144. package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
  145. package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
  146. package/dist/web/standalone/server.js +1 -1
  147. package/dist/welcome-screen.d.ts +2 -0
  148. package/dist/welcome-screen.js +9 -7
  149. package/package.json +6 -4
  150. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  151. package/packages/mcp-server/dist/workflow-tools.js +22 -17
  152. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  153. package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
  154. package/packages/mcp-server/src/workflow-tools.ts +30 -16
  155. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  156. package/packages/native/tsconfig.tsbuildinfo +1 -1
  157. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  158. package/packages/pi-agent-core/dist/agent-loop.js +4 -1
  159. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  160. package/packages/pi-agent-core/dist/agent.d.ts +5 -0
  161. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  162. package/packages/pi-agent-core/dist/agent.js +2 -0
  163. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  164. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  165. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  166. package/packages/pi-agent-core/dist/index.js +2 -0
  167. package/packages/pi-agent-core/dist/index.js.map +1 -1
  168. package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
  169. package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
  170. package/packages/pi-agent-core/dist/token-audit.js +221 -0
  171. package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
  172. package/packages/pi-agent-core/dist/types.d.ts +9 -0
  173. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  174. package/packages/pi-agent-core/dist/types.js.map +1 -1
  175. package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
  176. package/packages/pi-agent-core/src/agent-loop.ts +4 -1
  177. package/packages/pi-agent-core/src/agent.ts +8 -0
  178. package/packages/pi-agent-core/src/index.ts +2 -0
  179. package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
  180. package/packages/pi-agent-core/src/token-audit.ts +287 -0
  181. package/packages/pi-agent-core/src/types.ts +14 -0
  182. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  183. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
  184. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  185. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
  186. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
  187. package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
  188. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  189. package/packages/pi-ai/dist/providers/anthropic.js +9 -7
  190. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  191. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
  192. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
  193. package/packages/pi-ai/dist/types.d.ts +2 -0
  194. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  195. package/packages/pi-ai/dist/types.js.map +1 -1
  196. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
  197. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  198. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
  199. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
  200. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
  201. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
  202. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
  203. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
  204. package/packages/pi-ai/src/providers/anthropic.ts +22 -9
  205. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
  206. package/packages/pi-ai/src/types.ts +3 -0
  207. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
  208. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
  209. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
  210. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  211. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +32 -0
  212. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  213. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +30 -1
  214. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  215. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +17 -0
  216. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  217. package/packages/pi-coding-agent/dist/core/agent-session.js +52 -7
  218. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  219. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +78 -0
  220. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  221. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
  222. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  223. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
  224. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  225. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
  226. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
  227. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
  228. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
  229. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
  230. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
  231. package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
  232. package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
  233. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
  234. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
  235. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
  236. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
  237. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  238. package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
  239. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  240. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -0
  241. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  242. package/packages/pi-coding-agent/dist/core/extensions/runner.js +20 -7
  243. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  244. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +102 -3
  245. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  246. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +41 -3
  247. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  248. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  249. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
  250. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
  251. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
  252. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
  253. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
  254. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
  255. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
  256. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  257. package/packages/pi-coding-agent/dist/core/sdk.js +81 -4
  258. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  259. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
  260. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  261. package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
  262. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  263. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
  264. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  265. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
  266. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
  268. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  269. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
  270. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
  271. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
  272. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  273. package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
  274. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  275. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
  276. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  277. package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
  278. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  279. package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
  280. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  281. package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
  282. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  283. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
  284. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  285. package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
  286. package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
  288. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  289. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
  290. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  291. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
  292. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  293. package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
  294. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
  296. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  297. package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
  298. package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  299. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
  300. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  301. package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
  302. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  303. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
  304. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
  305. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
  306. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
  307. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
  308. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
  309. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
  310. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
  311. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
  312. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
  313. package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
  314. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  315. package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
  316. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  317. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +6 -4
  318. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
  319. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +137 -19
  320. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  321. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +2 -2
  322. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  323. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  324. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  325. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  326. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +2 -1
  327. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  328. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +32 -7
  329. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  330. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +18 -0
  331. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  332. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +225 -16
  333. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  334. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  335. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +85 -2
  336. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  337. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +71 -0
  338. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  339. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  340. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  341. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +22 -0
  342. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  343. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  344. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +36 -27
  345. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  346. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +21 -0
  347. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  348. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
  349. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
  350. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
  351. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
  352. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
  353. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
  354. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
  355. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +36 -0
  356. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +40 -1
  357. package/packages/pi-coding-agent/src/core/agent-session.ts +59 -7
  358. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +91 -0
  359. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
  360. package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
  361. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  362. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  363. package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
  364. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +113 -3
  365. package/packages/pi-coding-agent/src/core/extensions/runner.ts +24 -6
  366. package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -2
  367. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
  368. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
  369. package/packages/pi-coding-agent/src/core/sdk.ts +92 -4
  370. package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
  371. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
  372. package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
  373. package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
  374. package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
  375. package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
  376. package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
  377. package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
  378. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
  379. package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
  380. package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
  381. package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
  382. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
  383. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
  384. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
  385. package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
  386. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +7 -5
  387. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +185 -19
  388. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +2 -2
  389. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -0
  390. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +2 -1
  391. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +41 -10
  392. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +260 -16
  393. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
  394. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +107 -3
  395. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +24 -0
  396. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +36 -27
  397. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +25 -0
  398. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
  399. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
  400. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  401. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  402. package/packages/pi-tui/dist/tui.js +18 -8
  403. package/packages/pi-tui/dist/tui.js.map +1 -1
  404. package/packages/pi-tui/src/tui.ts +20 -8
  405. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  406. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  407. package/pkg/dist/modes/interactive/theme/themes.js +36 -27
  408. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  409. package/src/resources/GSD-WORKFLOW.md +2 -2
  410. package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
  411. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +42 -3
  412. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +67 -0
  413. package/src/resources/extensions/github-sync/sync.ts +8 -1
  414. package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
  415. package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -2
  416. package/src/resources/extensions/gsd/auto/loop.ts +134 -16
  417. package/src/resources/extensions/gsd/auto/phases.ts +328 -200
  418. package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
  419. package/src/resources/extensions/gsd/auto/run-unit.ts +28 -30
  420. package/src/resources/extensions/gsd/auto/session.ts +8 -0
  421. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
  422. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
  423. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
  424. package/src/resources/extensions/gsd/auto-dispatch.ts +33 -0
  425. package/src/resources/extensions/gsd/auto-post-unit.ts +117 -88
  426. package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
  427. package/src/resources/extensions/gsd/auto-recovery.ts +185 -7
  428. package/src/resources/extensions/gsd/auto-start.ts +293 -21
  429. package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
  430. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
  431. package/src/resources/extensions/gsd/auto-worktree.ts +241 -72
  432. package/src/resources/extensions/gsd/auto.ts +220 -40
  433. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +120 -8
  434. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
  435. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
  436. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +32 -19
  437. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
  438. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
  439. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
  440. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
  441. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +369 -54
  442. package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
  443. package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
  444. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +19 -2
  445. package/src/resources/extensions/gsd/clean-root-preflight.ts +72 -9
  446. package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
  447. package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
  448. package/src/resources/extensions/gsd/commands-config.ts +1 -1
  449. package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
  450. package/src/resources/extensions/gsd/commands-extract-learnings.ts +17 -12
  451. package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
  452. package/src/resources/extensions/gsd/context-budget.ts +44 -2
  453. package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
  454. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  455. package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
  456. package/src/resources/extensions/gsd/db-base-schema.ts +19 -2
  457. package/src/resources/extensions/gsd/db-migration-steps.ts +25 -0
  458. package/src/resources/extensions/gsd/detection.ts +128 -0
  459. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
  460. package/src/resources/extensions/gsd/git-service.ts +87 -10
  461. package/src/resources/extensions/gsd/gsd-db.ts +168 -13
  462. package/src/resources/extensions/gsd/guided-flow.ts +169 -55
  463. package/src/resources/extensions/gsd/init-wizard.ts +5 -1
  464. package/src/resources/extensions/gsd/memory-store.ts +77 -12
  465. package/src/resources/extensions/gsd/migrate/command.ts +47 -1
  466. package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
  467. package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
  468. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  469. package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
  470. package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
  471. package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
  472. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  473. package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
  474. package/src/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
  475. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  476. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  477. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  478. package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  479. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  480. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
  481. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  482. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  483. package/src/resources/extensions/gsd/quick.ts +37 -2
  484. package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -2
  485. package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
  486. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
  487. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
  488. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
  489. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
  490. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
  491. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +433 -11
  492. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
  493. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
  494. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
  495. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +160 -11
  496. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
  497. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
  498. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +139 -2
  499. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
  500. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
  501. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
  502. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
  503. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
  504. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +138 -0
  505. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
  506. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
  507. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
  508. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
  509. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
  510. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
  511. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
  512. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +97 -2
  513. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
  514. package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
  515. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
  516. package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
  517. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +9 -0
  518. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
  519. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
  520. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
  521. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
  522. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
  523. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
  524. package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
  525. package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
  526. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
  527. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
  528. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +5 -1
  529. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  530. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
  531. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +2 -2
  532. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +4 -9
  533. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
  534. package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
  535. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
  536. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
  537. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
  538. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
  539. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
  540. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
  541. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
  542. package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
  543. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
  544. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
  545. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  546. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +132 -0
  547. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
  548. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
  549. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -0
  550. package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +33 -1
  551. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
  552. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
  553. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
  554. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
  555. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +66 -0
  556. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
  557. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
  558. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
  559. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +239 -1
  560. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
  561. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
  562. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
  563. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
  564. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
  565. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +1 -0
  566. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
  567. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
  568. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +242 -0
  569. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +79 -98
  570. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
  571. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
  572. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
  573. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
  574. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -0
  575. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +133 -0
  576. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  577. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  578. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
  579. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
  580. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +91 -75
  581. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
  582. package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
  583. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
  584. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
  585. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
  586. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
  587. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
  588. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
  589. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
  590. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
  591. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
  592. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  593. package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
  594. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
  595. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
  596. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
  597. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
  598. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
  599. package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
  600. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
  601. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
  602. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
  603. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
  604. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
  605. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
  606. package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +192 -0
  607. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
  608. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
  609. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
  610. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  611. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
  612. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
  613. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +166 -0
  614. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
  615. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
  616. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
  617. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
  618. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
  619. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
  620. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
  621. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
  622. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -59
  623. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
  624. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
  625. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
  626. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
  627. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
  628. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
  629. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +101 -2
  630. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -0
  631. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
  632. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
  633. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
  634. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
  635. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
  636. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  637. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
  638. package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
  639. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
  640. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
  641. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
  642. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
  643. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
  644. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
  645. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
  646. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
  647. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
  648. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
  649. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
  650. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
  651. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  652. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
  653. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
  654. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
  655. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
  656. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +38 -6
  657. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +1 -0
  658. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
  659. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
  660. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
  661. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
  662. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  663. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +203 -4
  664. package/src/resources/extensions/gsd/tests/write-gate.test.ts +40 -1
  665. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
  666. package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
  667. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  668. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
  669. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
  670. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
  671. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
  672. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
  673. package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
  674. package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
  675. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  676. package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
  677. package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
  678. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  679. package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
  680. package/src/resources/extensions/gsd/worktree-resolver.ts +119 -20
  681. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
  682. package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  683. package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
  684. /package/dist/web/standalone/.next/static/{CaMwumvGbBPZrJicfsCzV → Y9yOOsO4ZA5BPTOS8ixvP}/_buildManifest.js +0 -0
  685. /package/dist/web/standalone/.next/static/{CaMwumvGbBPZrJicfsCzV → Y9yOOsO4ZA5BPTOS8ixvP}/_ssgManifest.js +0 -0
@@ -1,51 +1,67 @@
1
1
  /**
2
- * Regression test for #3624 — cap run-uat dispatch attempts
3
- *
4
- * When verification commands fail before writing a verdict, the run-uat
5
- * dispatch rule fires repeatedly in an infinite loop. The fix adds a
6
- * MAX_UAT_ATTEMPTS constant and calls incrementUatCount before dispatch
7
- * to cap the number of attempts.
8
- *
9
- * Structural verification test — reads source to confirm MAX_UAT_ATTEMPTS
10
- * and incrementUatCount exist.
2
+ * Regression test for #3624 — cap run-uat dispatch attempts.
11
3
  */
12
4
 
13
- import { describe, test } from 'node:test';
14
- import assert from 'node:assert/strict';
15
- import { readFileSync } from 'node:fs';
16
- import { fileURLToPath } from 'node:url';
17
- import { dirname, join } from 'node:path';
5
+ import test from "node:test";
6
+ import assert from "node:assert/strict";
7
+ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
8
+ import { join } from "node:path";
9
+ import { tmpdir } from "node:os";
18
10
 
19
- const __filename = fileURLToPath(import.meta.url);
20
- const __dirname = dirname(__filename);
11
+ import { DISPATCH_RULES, getUatCount } from "../auto-dispatch.ts";
21
12
 
22
- const source = readFileSync(join(__dirname, '..', 'auto-dispatch.ts'), 'utf-8');
13
+ function makeUatProject(): string {
14
+ const base = mkdtempSync(join(tmpdir(), "gsd-uat-cap-"));
15
+ const milestone = join(base, ".gsd", "milestones", "M001");
16
+ mkdirSync(join(milestone, "slices", "S01"), { recursive: true });
17
+ mkdirSync(join(milestone, "slices", "S02"), { recursive: true });
18
+ writeFileSync(
19
+ join(milestone, "M001-ROADMAP.md"),
20
+ [
21
+ "# M001: UAT Cap",
22
+ "",
23
+ "## Slices",
24
+ "- [x] **S01: Completed slice** `risk:low`",
25
+ " Demo: done.",
26
+ "- [ ] **S02: Remaining slice** `risk:low`",
27
+ " Demo: pending.",
28
+ ].join("\n"),
29
+ "utf-8",
30
+ );
31
+ writeFileSync(
32
+ join(milestone, "slices", "S01", "S01-UAT.md"),
33
+ "# UAT\n\nRun the checks. No verdict has been written yet.\n",
34
+ "utf-8",
35
+ );
36
+ return base;
37
+ }
23
38
 
24
- describe('run-uat replay cap (#3624)', () => {
25
- test('MAX_UAT_ATTEMPTS constant is defined', () => {
26
- assert.match(source, /const MAX_UAT_ATTEMPTS\s*=\s*\d+/,
27
- 'MAX_UAT_ATTEMPTS constant should be defined');
28
- });
39
+ test("run-uat dispatch stops after three attempts without a verdict", async () => {
40
+ const basePath = makeUatProject();
41
+ const rule = DISPATCH_RULES.find((r) => r.name === "run-uat (post-completion)");
42
+ assert.ok(rule, "run-uat dispatch rule is registered");
29
43
 
30
- test('incrementUatCount function is exported', () => {
31
- assert.match(source, /export function incrementUatCount\(/,
32
- 'incrementUatCount should be an exported function');
33
- });
44
+ const ctx = {
45
+ state: { phase: "planning", activeSlice: null },
46
+ mid: "M001",
47
+ midTitle: "UAT Cap",
48
+ basePath,
49
+ prefs: { uat_dispatch: true },
50
+ };
34
51
 
35
- test('getUatCount function is exported', () => {
36
- assert.match(source, /export function getUatCount\(/,
37
- 'getUatCount should be an exported function');
38
- });
52
+ try {
53
+ for (let i = 1; i <= 3; i++) {
54
+ const action = await rule.match(ctx as any);
55
+ assert.equal(action?.action, "dispatch");
56
+ assert.equal(action?.unitType, "run-uat");
57
+ assert.equal(getUatCount(basePath, "M001", "S01"), i);
58
+ }
39
59
 
40
- test('incrementUatCount is called before dispatch in rule', () => {
41
- // incrementUatCount should be called before the dispatch return
42
- const ruleSection = source.slice(source.indexOf('checkNeedsRunUat'));
43
- assert.match(ruleSection, /incrementUatCount\(/,
44
- 'incrementUatCount should be called in the dispatch rule');
45
- });
46
-
47
- test('attempts are compared against MAX_UAT_ATTEMPTS', () => {
48
- assert.match(source, /attempts\s*>\s*MAX_UAT_ATTEMPTS/,
49
- 'dispatch should check attempts > MAX_UAT_ATTEMPTS');
50
- });
60
+ const capped = await rule.match(ctx as any);
61
+ assert.equal(capped?.action, "stop");
62
+ assert.match(capped?.reason ?? "", /dispatched 3 times/);
63
+ assert.equal(getUatCount(basePath, "M001", "S01"), 4);
64
+ } finally {
65
+ rmSync(basePath, { recursive: true, force: true });
66
+ }
51
67
  });
@@ -144,6 +144,18 @@ test("safety-harness-bug2-race: bash evidence survives mid-unit reset between to
144
144
  assert.ok(bash[0].outputSnippet.includes("found"), "output snippet captured");
145
145
  });
146
146
 
147
+ test("safety-harness: gsd_exec counts as execution evidence", () => {
148
+ resetEvidence();
149
+
150
+ recordToolCall("tc-exec-1", "gsd_exec", { command: "grep -n render index.html" });
151
+ recordToolResult("tc-exec-1", "gsd_exec", "Command exited with code 0\n1:render\n", false);
152
+
153
+ const bash = getEvidence().filter((e): e is BashEvidence => e.kind === "bash");
154
+ assert.equal(bash.length, 1, "gsd_exec must be tracked as execution evidence");
155
+ assert.equal(bash[0].command, "grep -n render index.html");
156
+ assert.equal(bash[0].exitCode, 0);
157
+ });
158
+
147
159
  // ─── Bug 3: git diff HEAD~1 scope check ─────────────────────────────────────
148
160
 
149
161
  test("safety-harness-bug3: validateFileChanges works on initial commit (no HEAD~1)", (t) => {
@@ -237,3 +249,20 @@ test("safety-harness-bug3: validateFileChanges works on merge commit", (t) => {
237
249
  // Must produce a valid result without throwing
238
250
  assert.ok(audit !== null, "audit must be produced for merge commit repo");
239
251
  });
252
+
253
+ test("safety-harness: planned changed file avoids unexpected-file warning", (t) => {
254
+ const base = mkdtempSync(join(tmpdir(), "gsd-planned-file-"));
255
+ t.after(() => rmSync(base, { recursive: true, force: true }));
256
+
257
+ execFileSync("git", ["init"], { cwd: base });
258
+ execFileSync("git", ["config", "user.email", "test@example.com"], { cwd: base });
259
+ execFileSync("git", ["config", "user.name", "Test User"], { cwd: base });
260
+ writeFileSync(join(base, "index.html"), "<main></main>\n");
261
+ execFileSync("git", ["add", "index.html"], { cwd: base });
262
+ execFileSync("git", ["commit", "-m", "add static app"], { cwd: base });
263
+
264
+ const audit = validateFileChanges(base, [], ["index.html"]);
265
+ assert.ok(audit !== null, "audit must be produced");
266
+ assert.deepEqual(audit!.unexpectedFiles, [], "planned index.html must not be unexpected");
267
+ assert.deepEqual(audit!.missingFiles, [], "planned index.html must not be missing");
268
+ });
@@ -0,0 +1,156 @@
1
+ // gsd-2 / V27 + V28 schema migration regression tests
2
+ //
3
+ // Same bug class as #4591 (schema-v21-sequence): a migration block can be
4
+ // added but the SCHEMA_VERSION constant left unchanged, causing fresh-install
5
+ // + upgrade paths to silently skip the column add. This file pins both V27
6
+ // (artifacts.content_hash) and V28 (memories.last_hit_at) at the schema and
7
+ // write-path level on fresh-install DBs.
8
+
9
+ import test from "node:test";
10
+ import assert from "node:assert/strict";
11
+ import * as fs from "node:fs";
12
+ import * as path from "node:path";
13
+ import * as os from "node:os";
14
+
15
+ import {
16
+ openDatabase,
17
+ closeDatabase,
18
+ _getAdapter,
19
+ insertArtifact,
20
+ insertMemoryRow,
21
+ incrementMemoryHitCount,
22
+ SCHEMA_VERSION,
23
+ } from "../gsd-db.ts";
24
+
25
+ function makeTmp(): string {
26
+ return fs.mkdtempSync(path.join(os.tmpdir(), "gsd-v27v28-"));
27
+ }
28
+
29
+ function cleanup(base: string): void {
30
+ try { closeDatabase(); } catch { /* noop */ }
31
+ try { fs.rmSync(base, { recursive: true, force: true }); } catch { /* noop */ }
32
+ }
33
+
34
+ test("SCHEMA_VERSION constant is at least 28 (V28 migration committed)", () => {
35
+ assert.ok(
36
+ SCHEMA_VERSION >= 28,
37
+ `SCHEMA_VERSION must be ≥ 28 after V28 migration; got ${SCHEMA_VERSION}`,
38
+ );
39
+ });
40
+
41
+ test("fresh-install DB has artifacts.content_hash column (V27)", () => {
42
+ const base = makeTmp();
43
+ const dbPath = path.join(base, "gsd.db");
44
+ try {
45
+ openDatabase(dbPath);
46
+ const db = _getAdapter()!;
47
+ const cols = db.prepare("PRAGMA table_info(artifacts)").all() as Array<Record<string, unknown>>;
48
+ const colNames = new Set(cols.map((c) => c["name"] as string));
49
+ assert.ok(
50
+ colNames.has("content_hash"),
51
+ "V27 must add content_hash column to artifacts on fresh install",
52
+ );
53
+ } finally {
54
+ cleanup(base);
55
+ }
56
+ });
57
+
58
+ test("fresh-install DB has memories.last_hit_at column (V28)", () => {
59
+ const base = makeTmp();
60
+ const dbPath = path.join(base, "gsd.db");
61
+ try {
62
+ openDatabase(dbPath);
63
+ const db = _getAdapter()!;
64
+ const cols = db.prepare("PRAGMA table_info(memories)").all() as Array<Record<string, unknown>>;
65
+ const colNames = new Set(cols.map((c) => c["name"] as string));
66
+ assert.ok(
67
+ colNames.has("last_hit_at"),
68
+ "V28 must add last_hit_at column to memories on fresh install",
69
+ );
70
+ } finally {
71
+ cleanup(base);
72
+ }
73
+ });
74
+
75
+ test("fresh-install DB stamps SCHEMA_VERSION (≥28) in schema_version table", () => {
76
+ const base = makeTmp();
77
+ const dbPath = path.join(base, "gsd.db");
78
+ try {
79
+ openDatabase(dbPath);
80
+ const db = _getAdapter()!;
81
+ const row = db.prepare("SELECT MAX(version) as v FROM schema_version").get() as Record<string, unknown> | undefined;
82
+ const max = (row?.["v"] as number) ?? 0;
83
+ assert.ok(max >= 28, `fresh install must record schema_version ≥ 28; got ${max}`);
84
+ } finally {
85
+ cleanup(base);
86
+ }
87
+ });
88
+
89
+ test("insertArtifact populates content_hash with SHA-256 of full_content (V27 write-path)", () => {
90
+ const base = makeTmp();
91
+ const dbPath = path.join(base, "gsd.db");
92
+ try {
93
+ openDatabase(dbPath);
94
+ insertArtifact({
95
+ path: "M001/PROJECT.md",
96
+ artifact_type: "PROJECT",
97
+ milestone_id: "M001",
98
+ slice_id: null,
99
+ task_id: null,
100
+ full_content: "hello world",
101
+ });
102
+
103
+ const db = _getAdapter()!;
104
+ const row = db
105
+ .prepare("SELECT content_hash FROM artifacts WHERE path = :p")
106
+ .get({ ":p": "M001/PROJECT.md" }) as Record<string, unknown> | undefined;
107
+ const hash = row?.["content_hash"] as string | null | undefined;
108
+
109
+ // SHA-256 of "hello world" hex-encoded:
110
+ const expected = "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9";
111
+ assert.equal(hash, expected, "content_hash must be SHA-256 hex of full_content");
112
+ } finally {
113
+ cleanup(base);
114
+ }
115
+ });
116
+
117
+ test("incrementMemoryHitCount sets last_hit_at alongside hit_count (V28 write-path)", () => {
118
+ const base = makeTmp();
119
+ const dbPath = path.join(base, "gsd.db");
120
+ try {
121
+ openDatabase(dbPath);
122
+
123
+ const created = "2026-01-01T00:00:00.000Z";
124
+ insertMemoryRow({
125
+ id: "MEM001",
126
+ category: "gotcha",
127
+ content: "test memory",
128
+ confidence: 0.9,
129
+ sourceUnitType: null,
130
+ sourceUnitId: null,
131
+ createdAt: created,
132
+ updatedAt: created,
133
+ scope: "project",
134
+ tags: [],
135
+ structuredFields: null,
136
+ });
137
+
138
+ // Before increment: last_hit_at should be NULL
139
+ const db = _getAdapter()!;
140
+ const before = db
141
+ .prepare("SELECT last_hit_at FROM memories WHERE id = :id")
142
+ .get({ ":id": "MEM001" }) as Record<string, unknown>;
143
+ assert.equal(before["last_hit_at"], null, "last_hit_at starts NULL on fresh insert");
144
+
145
+ const hitTime = "2026-02-01T00:00:00.000Z";
146
+ incrementMemoryHitCount("MEM001", hitTime);
147
+
148
+ const after = db
149
+ .prepare("SELECT hit_count, last_hit_at FROM memories WHERE id = :id")
150
+ .get({ ":id": "MEM001" }) as Record<string, unknown>;
151
+ assert.equal(after["hit_count"], 1, "hit_count increments");
152
+ assert.equal(after["last_hit_at"], hitTime, "last_hit_at set to provided timestamp");
153
+ } finally {
154
+ cleanup(base);
155
+ }
156
+ });
@@ -0,0 +1,96 @@
1
+ // GSD-2 + src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts
2
+ // Regression: bootstrap must rederive `currentMilestoneId` from an unmerged
3
+ // completed milestone branch when in-memory state was lost across a process
4
+ // restart (#5538-followup).
5
+
6
+ import test from "node:test";
7
+ import assert from "node:assert/strict";
8
+
9
+ import { _selectResumableMilestone } from "../auto-start.js";
10
+
11
+ const ALL_COMPLETE = (_id: string) => true;
12
+ const NEVER_COMPLETE = (_id: string) => false;
13
+ const HAS_COMMITS = (_branch: string) => 1;
14
+ const NO_COMMITS = (_branch: string) => 0;
15
+
16
+ test("returns null when no branches exist", () => {
17
+ const result = _selectResumableMilestone([], new Set(), ALL_COMPLETE, HAS_COMMITS);
18
+ assert.equal(result, null);
19
+ });
20
+
21
+ test("returns null when every milestone branch is already merged", () => {
22
+ const branches = ["milestone/M001", "milestone/M002"];
23
+ const merged = new Set(branches);
24
+ const result = _selectResumableMilestone(branches, merged, ALL_COMPLETE, HAS_COMMITS);
25
+ assert.equal(result, null);
26
+ });
27
+
28
+ test("returns null when no candidate milestones are complete", () => {
29
+ const branches = ["milestone/M002"];
30
+ const result = _selectResumableMilestone(branches, new Set(), NEVER_COMPLETE, HAS_COMMITS);
31
+ assert.equal(result, null);
32
+ });
33
+
34
+ test("returns null when no branch has commits ahead", () => {
35
+ const branches = ["milestone/M002"];
36
+ const result = _selectResumableMilestone(branches, new Set(), ALL_COMPLETE, NO_COMMITS);
37
+ assert.equal(result, null);
38
+ });
39
+
40
+ test("returns the unmerged completed milestone (regression: M002 stranded after restart)", () => {
41
+ // Repro of test12345 state: M001 ✅ merged, M002 ✅ unmerged, M003 🔄.
42
+ // Bootstrap must seed currentMilestoneId = "M002" so the loop's transition
43
+ // guard fires when the next iteration sees mid="M003".
44
+ const branches = ["milestone/M002", "milestone/M003"];
45
+ const merged = new Set<string>(); // none merged from this list
46
+ const isComplete = (id: string) => id === "M002"; // M003 still in progress
47
+ const result = _selectResumableMilestone(branches, merged, isComplete, HAS_COMMITS);
48
+ assert.equal(result, "M002");
49
+ });
50
+
51
+ test("picks the lex-greatest milestone when multiple candidates exist", () => {
52
+ // M001, M002 both unmerged complete -> pick M002 (the most recent).
53
+ const branches = ["milestone/M001", "milestone/M002"];
54
+ const result = _selectResumableMilestone(
55
+ branches,
56
+ new Set(),
57
+ ALL_COMPLETE,
58
+ HAS_COMMITS,
59
+ );
60
+ assert.equal(result, "M002");
61
+ });
62
+
63
+ test("ignores branch names that don't follow the milestone/ prefix", () => {
64
+ const branches = ["feature/something", "milestone/M002", "fix/bug-1"];
65
+ const result = _selectResumableMilestone(
66
+ branches,
67
+ new Set(),
68
+ ALL_COMPLETE,
69
+ HAS_COMMITS,
70
+ );
71
+ assert.equal(result, "M002");
72
+ });
73
+
74
+ test("isComplete callback throwing skips that milestone but does not crash", () => {
75
+ const branches = ["milestone/M001", "milestone/M002"];
76
+ const isComplete = (id: string) => {
77
+ if (id === "M001") throw new Error("db unavailable for M001");
78
+ return true;
79
+ };
80
+ // Implementation choice: a thrown isComplete is propagated. Wrapping in
81
+ // try/catch happens at the production wrapper level (findUnmergedCompletedMilestone).
82
+ // Verify the helper itself surfaces the error so callers see real failures.
83
+ assert.throws(() => _selectResumableMilestone(branches, new Set(), isComplete, HAS_COMMITS));
84
+ });
85
+
86
+ test("commitsAhead callback throwing for one branch falls through to others", () => {
87
+ // Production wrapper: commits-ahead failures should not abort the search.
88
+ // The helper catches throws from commitsAhead per-branch and treats as 0.
89
+ const branches = ["milestone/M001", "milestone/M002"];
90
+ const commitsAhead = (branch: string) => {
91
+ if (branch === "milestone/M001") throw new Error("rev-walk failed");
92
+ return 5;
93
+ };
94
+ const result = _selectResumableMilestone(branches, new Set(), ALL_COMPLETE, commitsAhead);
95
+ assert.equal(result, "M002");
96
+ });
@@ -1,7 +1,5 @@
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
4
  import {
7
5
  clearSessionModelOverride,
@@ -9,8 +7,6 @@ import {
9
7
  setSessionModelOverride,
10
8
  } from "../session-model-override.js";
11
9
 
12
- const phasesSource = readFileSync(join(import.meta.dirname, "..", "auto", "phases.ts"), "utf-8");
13
-
14
10
  test("setSessionModelOverride stores provider/model for the session", () => {
15
11
  const sessionId = `session-override-${Date.now()}`;
16
12
  setSessionModelOverride(sessionId, { provider: "openai-codex", id: "gpt-5.4" });
@@ -27,9 +23,18 @@ test("clearSessionModelOverride removes the session override", () => {
27
23
  assert.equal(getSessionModelOverride(sessionId), undefined);
28
24
  });
29
25
 
30
- test("auto dispatch threads manual session model override into selectAndApplyModel", () => {
31
- assert.ok(
32
- phasesSource.includes("s.manualSessionModelOverride"),
33
- "auto/phases.ts should pass s.manualSessionModelOverride into selectAndApplyModel",
34
- );
26
+ test("session model overrides are isolated by session id", () => {
27
+ const first = `session-first-${Date.now()}`;
28
+ const second = `session-second-${Date.now()}`;
29
+ setSessionModelOverride(first, { provider: "openai-codex", id: "gpt-5.4" });
30
+ setSessionModelOverride(second, { provider: "anthropic", id: "claude-sonnet-4-6" });
31
+
32
+ assert.deepEqual(getSessionModelOverride(first), {
33
+ provider: "openai-codex",
34
+ id: "gpt-5.4",
35
+ });
36
+ assert.deepEqual(getSessionModelOverride(second), {
37
+ provider: "anthropic",
38
+ id: "claude-sonnet-4-6",
39
+ });
35
40
  });
@@ -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(),