gsd-pi 2.80.0-dev.4ea7d80e7 → 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 (656) 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 +16 -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 +43 -1
  29. package/dist/resources/extensions/gsd/auto-start.js +238 -12
  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 +159 -44
  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-handlers.js +23 -9
  52. package/dist/resources/extensions/gsd/context-budget.js +37 -2
  53. package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
  54. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  55. package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
  56. package/dist/resources/extensions/gsd/db-base-schema.js +4 -2
  57. package/dist/resources/extensions/gsd/db-migration-steps.js +6 -0
  58. package/dist/resources/extensions/gsd/detection.js +106 -0
  59. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
  60. package/dist/resources/extensions/gsd/git-service.js +73 -5
  61. package/dist/resources/extensions/gsd/gsd-db.js +46 -13
  62. package/dist/resources/extensions/gsd/guided-flow.js +141 -46
  63. package/dist/resources/extensions/gsd/init-wizard.js +4 -1
  64. package/dist/resources/extensions/gsd/memory-store.js +69 -12
  65. package/dist/resources/extensions/gsd/migrate/command.js +40 -1
  66. package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
  67. package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
  68. package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
  69. package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
  70. package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
  71. package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
  72. package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
  73. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
  74. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  75. package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
  76. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  77. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  78. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  79. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
  80. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  81. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  82. package/dist/resources/extensions/gsd/quick.js +34 -2
  83. package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -2
  84. package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
  85. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
  86. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
  87. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  88. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
  89. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
  90. package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
  91. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
  92. package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
  93. package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
  94. package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
  95. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  96. package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
  97. package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
  98. package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
  99. package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
  100. package/dist/resources/extensions/gsd/worktree-resolver.js +90 -22
  101. package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  102. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  103. package/dist/web/standalone/.next/BUILD_ID +1 -1
  104. package/dist/web/standalone/.next/app-path-routes-manifest.json +14 -14
  105. package/dist/web/standalone/.next/build-manifest.json +3 -3
  106. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  107. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  108. package/dist/web/standalone/.next/required-server-files.json +1 -1
  109. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  111. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/index.html +1 -1
  128. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  129. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  130. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  131. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
  136. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/middleware.js +3 -3
  139. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  140. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  141. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  142. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
  143. package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
  144. package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
  145. package/dist/web/standalone/server.js +1 -1
  146. package/dist/welcome-screen.d.ts +2 -0
  147. package/dist/welcome-screen.js +9 -7
  148. package/package.json +3 -3
  149. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  150. package/packages/mcp-server/dist/workflow-tools.js +22 -17
  151. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  152. package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
  153. package/packages/mcp-server/src/workflow-tools.ts +30 -16
  154. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  155. package/packages/native/tsconfig.tsbuildinfo +1 -1
  156. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  157. package/packages/pi-agent-core/dist/agent-loop.js +4 -1
  158. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  159. package/packages/pi-agent-core/dist/agent.d.ts +5 -0
  160. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  161. package/packages/pi-agent-core/dist/agent.js +2 -0
  162. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  163. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  164. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  165. package/packages/pi-agent-core/dist/index.js +2 -0
  166. package/packages/pi-agent-core/dist/index.js.map +1 -1
  167. package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
  168. package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
  169. package/packages/pi-agent-core/dist/token-audit.js +221 -0
  170. package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
  171. package/packages/pi-agent-core/dist/types.d.ts +9 -0
  172. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  173. package/packages/pi-agent-core/dist/types.js.map +1 -1
  174. package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
  175. package/packages/pi-agent-core/src/agent-loop.ts +4 -1
  176. package/packages/pi-agent-core/src/agent.ts +8 -0
  177. package/packages/pi-agent-core/src/index.ts +2 -0
  178. package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
  179. package/packages/pi-agent-core/src/token-audit.ts +287 -0
  180. package/packages/pi-agent-core/src/types.ts +14 -0
  181. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  182. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
  183. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  184. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
  185. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
  186. package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
  187. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  188. package/packages/pi-ai/dist/providers/anthropic.js +9 -7
  189. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  190. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
  191. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
  192. package/packages/pi-ai/dist/types.d.ts +2 -0
  193. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  194. package/packages/pi-ai/dist/types.js.map +1 -1
  195. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
  196. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  197. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
  198. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
  199. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
  200. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
  201. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
  202. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
  203. package/packages/pi-ai/src/providers/anthropic.ts +22 -9
  204. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
  205. package/packages/pi-ai/src/types.ts +3 -0
  206. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
  207. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
  208. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
  209. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  210. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +32 -0
  211. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  212. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +30 -1
  213. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  214. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +17 -0
  215. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  216. package/packages/pi-coding-agent/dist/core/agent-session.js +52 -7
  217. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  218. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +6 -2
  219. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  220. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
  221. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  222. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
  223. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  224. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
  225. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
  226. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
  227. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
  228. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
  229. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
  230. package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
  231. package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
  232. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
  233. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
  234. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
  235. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
  236. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  237. package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
  238. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  239. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +3 -0
  240. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  241. package/packages/pi-coding-agent/dist/core/extensions/runner.js +6 -6
  242. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  243. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +5 -3
  244. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  245. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +41 -3
  246. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  247. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  248. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
  249. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
  250. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
  251. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
  252. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
  253. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
  254. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
  255. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  256. package/packages/pi-coding-agent/dist/core/sdk.js +81 -4
  257. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  258. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
  259. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  260. package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
  261. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  262. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
  263. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  264. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
  265. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  266. package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
  267. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  268. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
  269. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
  270. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
  271. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  272. package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
  273. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
  275. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  276. package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
  277. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  278. package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
  279. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  280. package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
  281. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  282. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
  283. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  284. package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
  285. package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  286. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
  287. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  288. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
  289. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  290. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
  291. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
  293. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  294. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
  295. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  296. package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
  297. package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  298. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
  299. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  300. package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
  301. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
  303. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
  304. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
  305. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
  306. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
  307. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
  308. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
  309. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
  310. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
  311. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
  312. package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
  313. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  314. package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
  315. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  316. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +89 -2
  317. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  318. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +25 -1
  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 +6 -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 +155 -7
  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 +31 -6
  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 +2 -0
  330. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  331. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +22 -0
  332. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  333. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
  334. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
  335. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
  336. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
  337. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
  338. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
  339. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
  340. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +36 -0
  341. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +40 -1
  342. package/packages/pi-coding-agent/src/core/agent-session.ts +59 -7
  343. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +6 -2
  344. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
  345. package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
  346. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  347. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  348. package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
  349. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +5 -3
  350. package/packages/pi-coding-agent/src/core/extensions/runner.ts +8 -5
  351. package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -2
  352. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
  353. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
  354. package/packages/pi-coding-agent/src/core/sdk.ts +92 -4
  355. package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
  356. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
  357. package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
  358. package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
  359. package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
  360. package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
  361. package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
  362. package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
  363. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
  364. package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
  365. package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
  366. package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
  367. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
  368. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
  369. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
  370. package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
  371. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +119 -2
  372. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -1
  373. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +180 -7
  374. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
  375. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +39 -8
  376. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +24 -0
  377. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
  378. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
  379. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  380. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  381. package/packages/pi-tui/dist/tui.js +18 -8
  382. package/packages/pi-tui/dist/tui.js.map +1 -1
  383. package/packages/pi-tui/src/tui.ts +20 -8
  384. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  385. package/src/resources/GSD-WORKFLOW.md +2 -2
  386. package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
  387. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +42 -3
  388. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +67 -0
  389. package/src/resources/extensions/github-sync/sync.ts +8 -1
  390. package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
  391. package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -2
  392. package/src/resources/extensions/gsd/auto/loop.ts +134 -16
  393. package/src/resources/extensions/gsd/auto/phases.ts +328 -200
  394. package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
  395. package/src/resources/extensions/gsd/auto/run-unit.ts +28 -30
  396. package/src/resources/extensions/gsd/auto/session.ts +8 -0
  397. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
  398. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
  399. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
  400. package/src/resources/extensions/gsd/auto-dispatch.ts +16 -0
  401. package/src/resources/extensions/gsd/auto-post-unit.ts +117 -88
  402. package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
  403. package/src/resources/extensions/gsd/auto-recovery.ts +54 -0
  404. package/src/resources/extensions/gsd/auto-start.ts +286 -15
  405. package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
  406. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
  407. package/src/resources/extensions/gsd/auto-worktree.ts +241 -72
  408. package/src/resources/extensions/gsd/auto.ts +208 -39
  409. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +120 -8
  410. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
  411. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
  412. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +32 -19
  413. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
  414. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
  415. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
  416. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
  417. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +369 -54
  418. package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
  419. package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
  420. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +19 -2
  421. package/src/resources/extensions/gsd/clean-root-preflight.ts +72 -9
  422. package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
  423. package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
  424. package/src/resources/extensions/gsd/commands-config.ts +1 -1
  425. package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
  426. package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
  427. package/src/resources/extensions/gsd/context-budget.ts +44 -2
  428. package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
  429. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  430. package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
  431. package/src/resources/extensions/gsd/db-base-schema.ts +4 -2
  432. package/src/resources/extensions/gsd/db-migration-steps.ts +8 -0
  433. package/src/resources/extensions/gsd/detection.ts +128 -0
  434. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
  435. package/src/resources/extensions/gsd/git-service.ts +87 -10
  436. package/src/resources/extensions/gsd/gsd-db.ts +50 -13
  437. package/src/resources/extensions/gsd/guided-flow.ts +167 -53
  438. package/src/resources/extensions/gsd/init-wizard.ts +5 -1
  439. package/src/resources/extensions/gsd/memory-store.ts +77 -12
  440. package/src/resources/extensions/gsd/migrate/command.ts +47 -1
  441. package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
  442. package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
  443. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  444. package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
  445. package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
  446. package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
  447. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  448. package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
  449. package/src/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
  450. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  451. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  452. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  453. package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  454. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  455. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
  456. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  457. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  458. package/src/resources/extensions/gsd/quick.ts +37 -2
  459. package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -2
  460. package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
  461. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
  462. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
  463. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
  464. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
  465. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
  466. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +433 -11
  467. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
  468. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
  469. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
  470. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +160 -11
  471. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
  472. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
  473. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +14 -1
  474. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
  475. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
  476. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
  477. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
  478. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
  479. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +138 -0
  480. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
  481. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
  482. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
  483. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
  484. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
  485. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
  486. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
  487. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +97 -2
  488. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
  489. package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
  490. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
  491. package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
  492. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
  493. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
  494. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
  495. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
  496. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
  497. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
  498. package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
  499. package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
  500. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
  501. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
  502. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +5 -1
  503. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  504. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
  505. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +4 -9
  506. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
  507. package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
  508. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
  509. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
  510. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
  511. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
  512. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
  513. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
  514. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
  515. package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
  516. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
  517. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
  518. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  519. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +132 -0
  520. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
  521. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
  522. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
  523. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
  524. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
  525. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
  526. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +66 -0
  527. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
  528. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
  529. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
  530. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +239 -1
  531. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
  532. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
  533. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
  534. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
  535. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
  536. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +1 -0
  537. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
  538. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
  539. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +242 -0
  540. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +79 -98
  541. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
  542. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
  543. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
  544. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
  545. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -0
  546. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +133 -0
  547. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  548. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  549. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
  550. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
  551. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +91 -75
  552. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
  553. package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
  554. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
  555. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
  556. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
  557. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
  558. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
  559. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
  560. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
  561. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
  562. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
  563. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  564. package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
  565. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
  566. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
  567. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
  568. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
  569. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
  570. package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
  571. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
  572. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
  573. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
  574. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
  575. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
  576. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
  577. package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +192 -0
  578. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
  579. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
  580. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
  581. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  582. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
  583. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
  584. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +166 -0
  585. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
  586. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
  587. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
  588. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
  589. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
  590. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
  591. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
  592. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
  593. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -59
  594. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
  595. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
  596. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
  597. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
  598. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
  599. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
  600. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +55 -0
  601. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -0
  602. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
  603. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
  604. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
  605. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
  606. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
  607. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  608. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
  609. package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
  610. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
  611. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
  612. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
  613. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
  614. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
  615. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
  616. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
  617. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
  618. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
  619. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
  620. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
  621. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
  622. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  623. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
  624. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
  625. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
  626. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
  627. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +38 -6
  628. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +1 -0
  629. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
  630. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
  631. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
  632. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
  633. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  634. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +203 -4
  635. package/src/resources/extensions/gsd/tests/write-gate.test.ts +40 -1
  636. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
  637. package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
  638. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  639. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
  640. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
  641. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
  642. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
  643. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
  644. package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
  645. package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
  646. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  647. package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
  648. package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
  649. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  650. package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
  651. package/src/resources/extensions/gsd/worktree-resolver.ts +119 -20
  652. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
  653. package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  654. package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
  655. /package/dist/web/standalone/.next/static/{vIAZSyxIuvqNkCvXt9oqb → Y9yOOsO4ZA5BPTOS8ixvP}/_buildManifest.js +0 -0
  656. /package/dist/web/standalone/.next/static/{vIAZSyxIuvqNkCvXt9oqb → Y9yOOsO4ZA5BPTOS8ixvP}/_ssgManifest.js +0 -0
@@ -1,41 +1,48 @@
1
1
  /**
2
2
  * clear-stale-autostart.test.ts — #3667
3
3
  *
4
- * Verify that guided-flow.ts adds a createdAt timestamp to pending auto-start
5
- * entries and implements a staleness check (30s age guard) so that /clear
6
- * interrupted discussions don't permanently block future /gsd invocations.
4
+ * Pending auto-start entries carry a createdAt timestamp so later /gsd
5
+ * invocations can distinguish an in-flight discussion from a stale one.
7
6
  */
8
7
 
9
- import { describe, test } from "node:test";
8
+ import { describe, test, afterEach } from "node:test";
10
9
  import assert from "node:assert/strict";
11
- import { readFileSync } from "node:fs";
12
- import { join, dirname } from "node:path";
13
- import { fileURLToPath } from "node:url";
14
-
15
- const __dirname = dirname(fileURLToPath(import.meta.url));
16
- const sourceFile = join(__dirname, "..", "guided-flow.ts");
10
+ import { mkdtempSync, mkdirSync, realpathSync, rmSync } from "node:fs";
11
+ import { join } from "node:path";
12
+ import { tmpdir } from "node:os";
13
+
14
+ import {
15
+ _getPendingAutoStart,
16
+ clearPendingAutoStart,
17
+ setPendingAutoStart,
18
+ } from "../guided-flow.ts";
19
+
20
+ afterEach(() => {
21
+ clearPendingAutoStart();
22
+ });
17
23
 
18
24
  describe("clear stale pending auto-start (#3667)", () => {
19
- const source = readFileSync(sourceFile, "utf-8");
20
-
21
- test("PendingAutoStartEntry interface includes createdAt field", () => {
22
- assert.match(source, /createdAt:\s*number/);
25
+ test("setPendingAutoStart defaults createdAt to Date.now()", (t) => {
26
+ const base = realpathSync(mkdtempSync(join(tmpdir(), "gsd-pending-autostart-")));
27
+ t.after(() => rmSync(base, { recursive: true, force: true }));
28
+ mkdirSync(join(base, ".gsd"), { recursive: true });
29
+ const before = Date.now();
30
+
31
+ setPendingAutoStart(base, { basePath: base, milestoneId: "M001" });
32
+
33
+ const entry = _getPendingAutoStart(base);
34
+ assert.ok(entry);
35
+ assert.equal(typeof entry!.createdAt, "number");
36
+ assert.ok(entry!.createdAt >= before);
23
37
  });
24
38
 
25
- test("setPendingAutoStart defaults createdAt to Date.now()", () => {
26
- assert.match(source, /createdAt:\s*Date\.now\(\)/);
27
- });
39
+ test("setPendingAutoStart preserves explicit createdAt for stale-entry checks", (t) => {
40
+ const base = realpathSync(mkdtempSync(join(tmpdir(), "gsd-pending-autostart-old-")));
41
+ t.after(() => rmSync(base, { recursive: true, force: true }));
42
+ mkdirSync(join(base, ".gsd"), { recursive: true });
28
43
 
29
- test("staleness check uses 30_000ms threshold", () => {
30
- assert.match(source, /30[_]?000/);
31
- });
32
-
33
- test("stale entry detection checks manifest and context files", () => {
34
- assert.match(source, /DISCUSSION-MANIFEST\.json/);
35
- assert.match(source, /CONTEXT\.md/);
36
- });
44
+ setPendingAutoStart(base, { basePath: base, milestoneId: "M001", createdAt: 123 });
37
45
 
38
- test("stale entries are deleted from the map", () => {
39
- assert.match(source, /pendingAutoStartMap\.delete\(basePath\)/);
46
+ assert.equal(_getPendingAutoStart(base)?.createdAt, 123);
40
47
  });
41
48
  });
@@ -1,3 +1,5 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Unit tests for cmux integration, layout, and CLI isolation.
1
3
  import test, { describe, beforeEach, afterEach } from "node:test";
2
4
  import assert from "node:assert/strict";
3
5
  import * as fs from "node:fs";
@@ -7,6 +9,7 @@ import { fileURLToPath } from "node:url";
7
9
  import {
8
10
  buildCmuxProgress,
9
11
  buildCmuxStatusLabel,
12
+ CmuxClient,
10
13
  detectCmuxEnvironment,
11
14
  markCmuxPromptShown,
12
15
  resetCmuxPromptState,
@@ -256,60 +259,55 @@ describe("createGridLayout", () => {
256
259
  });
257
260
 
258
261
  describe("CmuxClient stdio isolation", () => {
259
- test("runSync and runAsync explicitly set stdio to prevent terminal interference", () => {
260
- // Read the cmux index source and verify that execFileSync/spawn calls
261
- // inside runSync/runAsync include stdio options that isolate stdin and stderr.
262
- // This prevents the cmux CLI child process from inheriting the parent's
263
- // stdin/stderr, which can steal keyboard input or corrupt TUI rendering (#1922).
264
- const cmuxIndexPath = path.resolve(
265
- path.dirname(fileURLToPath(import.meta.url)),
266
- "../../cmux/index.ts",
267
- );
268
- const source = fs.readFileSync(cmuxIndexPath, "utf-8");
269
-
270
- // Extract runSync method body
271
- const runSyncMatch = source.match(/private runSync\(args: string\[\]\)[^{]*\{([\s\S]*?)\n \}/);
272
- assert.ok(runSyncMatch, "runSync method must exist");
273
- const runSyncBody = runSyncMatch[1];
274
- assert.ok(
275
- runSyncBody.includes('stdio:'),
276
- "runSync must explicitly set stdio to prevent terminal interference (see #1922)",
277
- );
278
- assert.ok(
279
- runSyncBody.includes('"ignore"'),
280
- "runSync stdio must ignore stdin to prevent stealing keyboard input from TUI",
281
- );
282
-
283
- // Extract runAsync method body
284
- const runAsyncMatch = source.match(/private async runAsync\(args: string\[\]\)[^{]*\{([\s\S]*?)\n \}/);
285
- assert.ok(runAsyncMatch, "runAsync method must exist");
286
- const runAsyncBody = runAsyncMatch[1];
287
- assert.ok(
288
- runAsyncBody.includes('stdio:'),
289
- "runAsync must explicitly set stdio to prevent terminal interference (see #1922)",
290
- );
291
- assert.ok(
292
- runAsyncBody.includes('"ignore"'),
293
- "runAsync stdio must ignore stdin to prevent stealing keyboard input from TUI",
294
- );
295
- });
296
-
297
- test("isCmuxCliAvailable uses stdio ignore to prevent terminal interference", () => {
298
- const cmuxIndexPath = path.resolve(
299
- path.dirname(fileURLToPath(import.meta.url)),
300
- "../../cmux/index.ts",
301
- );
302
- const source = fs.readFileSync(cmuxIndexPath, "utf-8");
303
-
304
- // Find isCmuxCliAvailable or the cli-check function body
305
- const fnMatch = source.match(/function isCmuxCliAvailable[\s\S]*?\{([\s\S]*?)\n\}/);
306
- if (!fnMatch) return; // function may be inlined or renamed — skip rather than fail
307
-
308
- const fnBody = fnMatch[1];
309
- assert.ok(
310
- fnBody.includes('"ignore"') || !fnBody.includes('execFileSync'),
311
- "isCmuxCliAvailable must not inherit parent stdio (see #1922)",
262
+ test("runSync and runAsync execute the cmux CLI without inheriting test stdin", async () => {
263
+ const binDir = fs.mkdtempSync(path.join(tmpdir(), "cmux-bin-"));
264
+ const logPath = path.join(binDir, "calls.jsonl");
265
+ const cmuxPath = path.join(binDir, "cmux");
266
+ const originalPath = process.env.PATH;
267
+ fs.writeFileSync(
268
+ cmuxPath,
269
+ [
270
+ "#!/usr/bin/env node",
271
+ "const fs = require('node:fs');",
272
+ `fs.appendFileSync(${JSON.stringify(logPath)}, JSON.stringify(process.argv.slice(2)) + '\\n');`,
273
+ "if (process.argv.includes('--json')) process.stdout.write(JSON.stringify({surfaces:[{id:'surface-1'}]}));",
274
+ "else process.stdout.write('ok');",
275
+ ].join("\n"),
276
+ "utf-8",
312
277
  );
278
+ fs.chmodSync(cmuxPath, 0o755);
279
+ process.env.PATH = `${binDir}:${originalPath ?? ""}`;
280
+ try {
281
+ const client = new CmuxClient({
282
+ enabled: true,
283
+ available: true,
284
+ cliAvailable: true,
285
+ notifications: true,
286
+ sidebar: true,
287
+ splits: true,
288
+ browser: false,
289
+ workspaceId: "workspace-1",
290
+ surfaceId: "surface-0",
291
+ socketPath: "/tmp/cmux.sock",
292
+ });
293
+
294
+ client.setStatus("M001", "executing");
295
+ await client.listSurfaceIds();
296
+
297
+ const calls = fs.readFileSync(logPath, "utf-8").trim().split("\n").map((line) => JSON.parse(line));
298
+ const commandPrefixes = calls.map((call) => call.slice(0, 2));
299
+ assert.ok(
300
+ commandPrefixes.some((prefix) => JSON.stringify(prefix) === JSON.stringify(["set-status", "gsd"])),
301
+ "set-status command should be invoked",
302
+ );
303
+ assert.ok(
304
+ commandPrefixes.some((prefix) => JSON.stringify(prefix) === JSON.stringify(["list-surfaces", "--json"])),
305
+ "list-surfaces command should be invoked",
306
+ );
307
+ } finally {
308
+ process.env.PATH = originalPath;
309
+ fs.rmSync(binDir, { recursive: true, force: true });
310
+ }
313
311
  });
314
312
  });
315
313
 
@@ -1,65 +1,43 @@
1
1
  /**
2
2
  * cold-resume-db-reopen.test.ts — Regression test for #2940.
3
- *
4
- * Validates that the paused-session resume path in auto.ts opens the project
5
- * database before calling rebuildState() / deriveState(), matching the fresh
6
- * bootstrap path in auto-start.ts.
7
- *
8
- * Without this, cold resume falls back to markdown parsing which misreads
9
- * done cells and redispatches wrong slices.
10
3
  */
11
4
 
12
- import { readFileSync } from "node:fs";
13
- import { join } from "node:path";
14
-
15
- import { createTestContext } from "./test-helpers.ts";
16
-
17
- const { assertTrue, report } = createTestContext();
18
-
19
- const autoSrc = readFileSync(join(import.meta.dirname, "..", "auto.ts"), "utf-8");
20
-
21
- console.log("\n=== resume path refreshes resources and opens DB before rebuildState/deriveState ===");
22
-
23
- // The resume block is the `if (s.paused) { ... }` section that calls rebuildState/deriveState.
24
- // Locate the resume section by finding `s.paused = false;` followed by `rebuildState`.
25
- const resumeSectionStart = autoSrc.indexOf("if (s.paused) {", autoSrc.indexOf("// If resuming from paused state"));
26
- assertTrue(resumeSectionStart > 0, "auto.ts has the paused-session resume block");
27
-
28
- const resumeSectionEndCandidates = [
29
- autoSrc.indexOf("await runAutoLoopWithUok(", resumeSectionStart),
30
- autoSrc.indexOf("await autoLoop(", resumeSectionStart),
31
- ].filter((idx) => idx > resumeSectionStart);
32
- const resumeSectionEnd = resumeSectionEndCandidates.length > 0 ? Math.min(...resumeSectionEndCandidates) : -1;
33
- assertTrue(resumeSectionEnd > resumeSectionStart, "resume block reaches the dispatch loop");
34
-
35
- const resumeSection = autoSrc.slice(resumeSectionStart, resumeSectionEnd);
36
-
37
- // The resume path must refresh managed resources and open the DB before
38
- // rebuildState/deriveState so resumed auto-mode uses current extension code.
39
- const rebuildIdx = resumeSection.indexOf("rebuildState(");
40
- assertTrue(rebuildIdx > 0, "resume block calls rebuildState");
41
-
42
- const deriveIdx = resumeSection.indexOf("deriveState(");
43
- assertTrue(deriveIdx > 0, "resume block calls deriveState");
44
-
45
- const preDeriveSection = resumeSection.slice(0, rebuildIdx);
46
-
47
- assertTrue(
48
- preDeriveSection.includes("initResources("),
49
- "resume path must refresh managed resources before rebuildState/deriveState (#3761)",
50
- );
51
-
52
- // There must be a DB open call before the first rebuildState call
53
- const dbOpenPatterns = [
54
- "openProjectDbIfPresent(",
55
- "openDatabase(",
56
- "ensureDbOpen(",
57
- ];
58
-
59
- const hasDbOpen = dbOpenPatterns.some(pat => preDeriveSection.includes(pat));
60
- assertTrue(
61
- hasDbOpen,
62
- "resume path must open DB before rebuildState/deriveState (#2940)",
63
- );
64
-
65
- report();
5
+ import test from "node:test";
6
+ import assert from "node:assert/strict";
7
+ import { refreshResumeResourcesAndDb } from "../auto.ts";
8
+
9
+ test("resume refreshes managed resources and opens DB before state rebuild", async () => {
10
+ const calls: string[] = [];
11
+
12
+ await refreshResumeResourcesAndDb("/tmp/project", {
13
+ env: {
14
+ GSD_CODING_AGENT_DIR: "/tmp/agent",
15
+ GSD_PKG_ROOT: "/tmp/pkg",
16
+ } as NodeJS.ProcessEnv,
17
+ importModule: async (specifier: string) => {
18
+ calls.push(`import:${specifier}`);
19
+ if (specifier.endsWith("/dist/resource-loader.js")) {
20
+ return {
21
+ initResources: (agentDir: string) => calls.push(`initResources:${agentDir}`),
22
+ };
23
+ }
24
+ if (specifier === "./prompt-loader.js") {
25
+ return {
26
+ primeCache: () => calls.push("primeCache"),
27
+ };
28
+ }
29
+ throw new Error(`unexpected import: ${specifier}`);
30
+ },
31
+ openProjectDb: async (basePath: string) => {
32
+ calls.push(`openDb:${basePath}`);
33
+ },
34
+ });
35
+
36
+ assert.deepEqual(calls, [
37
+ "import:file:///tmp/pkg/dist/resource-loader.js",
38
+ "initResources:/tmp/agent",
39
+ "import:./prompt-loader.js",
40
+ "primeCache",
41
+ "openDb:/tmp/project",
42
+ ]);
43
+ });
@@ -1,24 +1,31 @@
1
1
  import test from "node:test";
2
2
  import assert from "node:assert/strict";
3
- import { readFileSync } from "node:fs";
4
- import { dirname, join } from "node:path";
5
- import { fileURLToPath } from "node:url";
3
+ import { getStoredToolKey } from "../commands-config.ts";
6
4
 
7
- const __filename = fileURLToPath(import.meta.url);
8
- const __dirname = dirname(__filename);
5
+ test("stored tool key lookup skips empty api_key entries", () => {
6
+ const auth = {
7
+ getCredentialsForProvider(providerId: string) {
8
+ assert.equal(providerId, "tavily");
9
+ return [
10
+ { type: "api_key", key: "" },
11
+ { type: "oauth", accessToken: "oauth-token" },
12
+ { type: "api_key", key: "tool-key" },
13
+ ];
14
+ },
15
+ };
9
16
 
10
- test("commands-config source-level: tool key lookup skips empty api_key entries", () => {
11
- const source = readFileSync(join(__dirname, "..", "commands-config.ts"), "utf-8");
12
- assert.ok(
13
- source.includes('getCredentialsForProvider(providerId)'),
14
- "commands-config should read the full credential list",
15
- );
16
- assert.ok(
17
- source.includes('c.type === "api_key" && c.key'),
18
- "commands-config should require a non-empty api_key when resolving stored tool keys",
19
- );
20
- assert.ok(
21
- !source.includes("auth.get(tool.id)"),
22
- "commands-config should not rely on auth.get(tool.id), which can return an empty shadowing entry",
23
- );
17
+ assert.equal(getStoredToolKey(auth as any, "tavily"), "tool-key");
18
+ });
19
+
20
+ test("stored tool key lookup returns undefined when only shadowing credentials exist", () => {
21
+ const auth = {
22
+ getCredentialsForProvider() {
23
+ return [
24
+ { type: "api_key", key: "" },
25
+ { type: "oauth", accessToken: "oauth-token" },
26
+ ];
27
+ },
28
+ };
29
+
30
+ assert.equal(getStoredToolKey(auth as any, "brave"), undefined);
24
31
  });
@@ -29,7 +29,8 @@ test('buildSnapshot: renders memories, exec history, and active context', () =>
29
29
  memories: [
30
30
  { id: 'MEM001', category: 'gotcha', content: 'FTS5 needs Porter tokenizer', confidence: 0.9,
31
31
  source_unit_type: null, source_unit_id: null, created_at: '', updated_at: '',
32
- superseded_by: null, hit_count: 0, scope: 'project', seq: 1, tags: [], structured_fields: null },
32
+ superseded_by: null, hit_count: 0, scope: 'project', seq: 1, tags: [], structured_fields: null,
33
+ last_hit_at: null },
33
34
  ],
34
35
  execHistory: [
35
36
  {
@@ -65,6 +66,7 @@ test('buildSnapshot: enforces the byte cap with a truncation marker', () => {
65
66
  seq: i,
66
67
  tags: [] as string[],
67
68
  structured_fields: null,
69
+ last_hit_at: null,
68
70
  }));
69
71
  const snap = buildSnapshot(
70
72
  { generatedAt: new Date(), memories: longMemories, execHistory: [] },
@@ -121,3 +123,14 @@ test('executeResume: reports friendly empty state when no snapshot exists', () =
121
123
  cleanup(base);
122
124
  }
123
125
  });
126
+
127
+ test('executeResume: returns disabled error when context_mode.enabled=false', () => {
128
+ const base = freshBase();
129
+ try {
130
+ const result = executeResume({}, { baseDir: base, preferences: { context_mode: { enabled: false } } });
131
+ assert.equal(result.isError, true);
132
+ assert.equal((result.details as { error?: string }).error, 'context_mode_disabled');
133
+ } finally {
134
+ cleanup(base);
135
+ }
136
+ });
@@ -261,3 +261,34 @@ test("#4780 closer prompt: uses excerpts + lists on-demand slice SUMMARY paths",
261
261
  `closer prompt length ${prompt.length} should be < raw summary size ${rawSize} + 20KB headroom`,
262
262
  );
263
263
  });
264
+
265
+ test("complete-milestone prompt caps repeated inlined context around 20k chars", async (t) => {
266
+ const base = createBase();
267
+ t.after(() => cleanup(base));
268
+ invalidateAllCaches();
269
+
270
+ writeRoadmap(base, makeRoadmap());
271
+ writeSummary(base, "S01", makeFatSummary("S01"));
272
+ writeSummary(base, "S02", makeFatSummary("S02"));
273
+ writeFileSync(
274
+ join(base, ".gsd", "milestones", "M001", "M001-CONTEXT.md"),
275
+ "# M001 Context\n\n" + "Large milestone context body. ".repeat(1200),
276
+ );
277
+ writeFileSync(
278
+ join(base, ".gsd", "KNOWLEDGE.md"),
279
+ "# Project Knowledge\n\n## Patterns\n\n### Test Milestone shared\n" + "Large scoped knowledge body. ".repeat(1200),
280
+ );
281
+
282
+ const prompt = await buildCompleteMilestonePrompt("M001", "Test Milestone", base);
283
+ const contextStart = prompt.indexOf("## Inlined Context (preloaded");
284
+ const contextEnd = prompt.indexOf("## Steps", contextStart);
285
+ assert.ok(contextStart >= 0, "prompt should include inlined context");
286
+ assert.ok(contextEnd > contextStart, "prompt should include steps after inlined context");
287
+
288
+ const inlinedContext = prompt.slice(contextStart, contextEnd);
289
+ assert.ok(
290
+ inlinedContext.length <= 21_000,
291
+ `inlined context ${inlinedContext.length} chars should stay near the 20k cap`,
292
+ );
293
+ assert.match(inlinedContext, /\[\.\.\.truncated \d+ sections\]/);
294
+ });
@@ -547,4 +547,144 @@ describe("complete-milestone", () => {
547
547
  cleanup(base);
548
548
  }
549
549
  });
550
+
551
+ test("verification-gate step numbers match the actual numbered verification steps", () => {
552
+ // Regression for step-number drift: step 1 (duplicate guard) was inserted
553
+ // in ea5a2cc0 and the rest renumbered, but the gate text was not updated.
554
+ // Re-derive the verification-step indices from the rendered prompt and
555
+ // assert the gate / "Important" footer reference the correct numbers.
556
+ const prompt = loadPromptFromWorktree("complete-milestone", {
557
+ workingDirectory: "/tmp/test-project",
558
+ milestoneId: "M001",
559
+ milestoneTitle: "Step Number Drift",
560
+ roadmapPath: ".gsd/milestones/M001/M001-ROADMAP.md",
561
+ inlinedContext: "context",
562
+ milestoneSummaryPath: ".gsd/milestones/M001/M001-SUMMARY.md",
563
+ skillActivation: "{{skillActivation block}}",
564
+ extractLearningsSteps: "{{extract learnings block}}",
565
+ });
566
+
567
+ function findStep(needle: RegExp): number {
568
+ const lines = prompt.split("\n");
569
+ for (const line of lines) {
570
+ const m = /^(\d+)\.\s/.exec(line);
571
+ if (m && needle.test(line)) return Number(m[1]);
572
+ }
573
+ throw new Error(`no numbered step matches ${needle}`);
574
+ }
575
+
576
+ const codeChange = findStep(/Verify code changes/);
577
+ const successCriteria = findStep(/Verify every \*\*success criterion\*\*/);
578
+ const defOfDone = findStep(/Verify \*\*definition of done\*\*/);
579
+ const completeMilestone = findStep(/Persist completion through `gsd_complete_milestone`/);
580
+ const requirementUpdate = findStep(/gsd_requirement_update/);
581
+
582
+ // Gate clause references the verification steps.
583
+ const gateLine = prompt.split("\n").find(l => l.includes("Verification failure was recorded") || l.includes("verification failure was recorded"));
584
+ assert.ok(gateLine, "verification gate sentence is present");
585
+ assert.ok(
586
+ gateLine!.includes(`steps ${codeChange}, ${successCriteria}, or ${defOfDone}`),
587
+ `gate must cite verification steps ${codeChange}, ${successCriteria}, ${defOfDone}; got: ${gateLine}`,
588
+ );
589
+ // "Do NOT proceed with steps X-Y" — Y must be at least the gsd_complete_milestone step.
590
+ const proceedMatch = /Do NOT proceed with steps (\d+)[–-](\d+)/.exec(gateLine!);
591
+ assert.ok(proceedMatch, "gate must include a 'Do NOT proceed with steps X–Y' clause");
592
+ assert.ok(
593
+ Number(proceedMatch![1]) > requirementUpdate - 1 && Number(proceedMatch![2]) >= completeMilestone,
594
+ `'Do NOT proceed' range ${proceedMatch![1]}–${proceedMatch![2]} must cover steps from after the gate through gsd_complete_milestone (${completeMilestone})`,
595
+ );
596
+
597
+ // "Important" footer references the same verification steps.
598
+ const importantLine = prompt.split("\n").find(l => l.includes("Do NOT skip code-change"));
599
+ assert.ok(importantLine, "Important footer is present");
600
+ assert.ok(
601
+ importantLine!.includes(`steps ${codeChange}-${defOfDone}`) ||
602
+ importantLine!.includes(`steps ${codeChange}–${defOfDone}`),
603
+ `Important footer must cite verification range ${codeChange}-${defOfDone}; got: ${importantLine}`,
604
+ );
605
+
606
+ // On-demand Read ordering line cites the gsd_complete_milestone step.
607
+ const readOrderLine = prompt.split("\n").find(l => l.includes("On-demand Read ordering"));
608
+ assert.ok(readOrderLine, "On-demand Read ordering line is present");
609
+ assert.ok(
610
+ readOrderLine!.includes(`(step ${completeMilestone})`),
611
+ `On-demand Read ordering must cite step ${completeMilestone}; got: ${readOrderLine}`,
612
+ );
613
+ });
614
+
615
+ test("sanitizeCompleteMilestoneParams preserves actorName and triggerReason", async () => {
616
+ const { sanitizeCompleteMilestoneParams } = await import("../bootstrap/sanitize-complete-milestone.ts");
617
+
618
+ const sanitized = sanitizeCompleteMilestoneParams({
619
+ milestoneId: "M001",
620
+ title: "T",
621
+ oneLiner: "x",
622
+ narrative: "n",
623
+ verificationPassed: true,
624
+ actorName: " executor-01 ",
625
+ triggerReason: " milestone validation passed ",
626
+ } as any);
627
+
628
+ assert.strictEqual(sanitized.actorName, "executor-01");
629
+ assert.strictEqual(sanitized.triggerReason, "milestone validation passed");
630
+ });
631
+
632
+ test("sanitizeCompleteMilestoneParams omits blank actorName/triggerReason rather than emitting empty strings", async () => {
633
+ const { sanitizeCompleteMilestoneParams } = await import("../bootstrap/sanitize-complete-milestone.ts");
634
+
635
+ const sanitized = sanitizeCompleteMilestoneParams({
636
+ milestoneId: "M001",
637
+ title: "T",
638
+ oneLiner: "x",
639
+ narrative: "n",
640
+ verificationPassed: true,
641
+ // actorName/triggerReason omitted
642
+ } as any);
643
+
644
+ assert.strictEqual(sanitized.actorName, undefined);
645
+ assert.strictEqual(sanitized.triggerReason, undefined);
646
+ });
647
+
648
+ test("rendered SUMMARY.md uses placeholder text for empty enrichment fields", async () => {
649
+ const { handleCompleteMilestone } = await import("../tools/complete-milestone.ts");
650
+ const base = createFixtureBase();
651
+ const mid = "M001";
652
+ const dbPath = join(base, ".gsd", "gsd.db");
653
+ try {
654
+ openDatabase(dbPath);
655
+ insertMilestone({ id: mid, title: "Empty Enrichment", status: "active" });
656
+ insertSlice({ id: "S01", milestoneId: mid, title: "Slice", status: "complete" });
657
+ insertTask({ id: "T01", sliceId: "S01", milestoneId: mid, title: "Task", status: "complete" });
658
+
659
+ const result = await handleCompleteMilestone({
660
+ milestoneId: mid,
661
+ title: "Empty Enrichment",
662
+ oneLiner: "no enrichment",
663
+ narrative: "did the thing",
664
+ // enrichment fields intentionally empty (post-sanitizer state)
665
+ successCriteriaResults: "",
666
+ definitionOfDoneResults: "",
667
+ requirementOutcomes: "",
668
+ keyDecisions: [],
669
+ keyFiles: [],
670
+ lessonsLearned: [],
671
+ followUps: "",
672
+ deviations: "",
673
+ verificationPassed: true,
674
+ }, base);
675
+
676
+ assert.ok(!("error" in result), `handler should succeed: ${JSON.stringify(result)}`);
677
+ const summary = readFileSync((result as { summaryPath: string }).summaryPath, "utf-8");
678
+ assert.match(summary, /## Success Criteria Results\n\nNot provided\./);
679
+ assert.match(summary, /## Definition of Done Results\n\nNot provided\./);
680
+ assert.match(summary, /## Requirement Outcomes\n\nNot provided\./);
681
+ assert.match(summary, /## Deviations\n\nNone\./);
682
+ assert.match(summary, /## Follow-ups\n\nNone\./);
683
+ } finally {
684
+ try { closeDatabase(); } catch { /* */ }
685
+ clearPathCache();
686
+ clearParseCache();
687
+ cleanup(base);
688
+ }
689
+ });
550
690
  });
@@ -113,8 +113,9 @@ test("#4782 phase 3: buildCompleteSlicePrompt composes roadmap → plan → task
113
113
  "task summaries precede slice-summary template",
114
114
  );
115
115
 
116
- // Task body inlined
117
- assert.match(prompt, /Task one did the thing/);
116
+ // Task summary excerpt is inlined; full narrative remains on-demand.
117
+ assert.match(prompt, /### Task Summary: T01 \(excerpt\)/);
118
+ assert.doesNotMatch(prompt, /Task one did the thing/);
118
119
  });
119
120
 
120
121
  test("#4782 phase 3: buildCompleteSlicePrompt handles missing task summaries gracefully", async (t) => {