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,345 +1,138 @@
1
- /**
2
- * Triage dispatch ordering contract tests.
3
- *
4
- * These tests verify structural invariants of the triage integration
5
- * by inspecting the actual source code of auto-post-unit.ts, auto.ts,
6
- * and post-unit-hooks.ts. Full behavioral testing requires the
7
- * @gsd/pi-coding-agent runtime.
8
- */
1
+ // GSD-2 — Triage and quick-task dispatch behavior tests.
9
2
 
10
3
  import test from "node:test";
11
4
  import assert from "node:assert/strict";
12
- import { readFileSync } from "node:fs";
13
- import { join, dirname } from "node:path";
14
- import { fileURLToPath } from "node:url";
15
-
16
- const __dirname = dirname(fileURLToPath(import.meta.url));
17
- const hooksPath = join(__dirname, "..", "post-unit-hooks.ts");
18
- const registryPath = join(__dirname, "..", "rule-registry.ts");
19
- const autoPromptsPath = join(__dirname, "..", "auto-prompts.ts");
20
-
21
- // After decomposition, triage/dispatch logic lives in auto-post-unit.ts
22
- const postUnitSrc = readFileSync(join(__dirname, "..", "auto-post-unit.ts"), "utf-8");
23
- // auto.ts retains top-level orchestration and imports
24
- const autoSrc = [
25
- readFileSync(join(__dirname, "..", "auto.ts"), "utf-8"),
26
- postUnitSrc,
27
- readFileSync(join(__dirname, "..", "auto-start.ts"), "utf-8"),
28
- ].join("\n");
29
- // Hook exclusion logic lives in the rule-registry (facade delegates there)
30
- const hooksSrc = [
31
- readFileSync(hooksPath, "utf-8"),
32
- readFileSync(registryPath, "utf-8"),
33
- ].join("\n");
34
- const autoPromptsSrc = (() => { try { return readFileSync(autoPromptsPath, "utf-8"); } catch { return autoSrc; } })();
35
-
36
- // ─── Hook exclusion ──────────────────────────────────────────────────────────
37
-
38
- test("dispatch: triage-captures excluded from post-unit hook triggering", () => {
39
- assert.ok(
40
- hooksSrc.includes('"triage-captures"'),
41
- "post-unit-hooks.ts should reference triage-captures",
42
- );
43
- assert.ok(
44
- hooksSrc.includes('completedUnitType === "triage-captures"'),
45
- "should check for triage-captures in the hook exclusion guard",
46
- );
47
- });
48
-
49
- // ─── Triage check placement ──────────────────────────────────────────────────
50
-
51
- test("dispatch: triage check appears after hook section and before stepMode check", () => {
52
- const triageCheckIndex = postUnitSrc.indexOf("// ── Triage check");
53
- const quickTaskIndex = postUnitSrc.indexOf("// ── Quick-task dispatch");
54
- const stepModeIndex = postUnitSrc.indexOf("if (s.stepMode)");
55
-
56
- assert.ok(triageCheckIndex > 0, "triage check block should exist");
57
- assert.ok(quickTaskIndex > 0, "quick-task dispatch block should exist");
58
- assert.ok(stepModeIndex > 0, "step mode check should exist");
59
-
60
- assert.ok(
61
- triageCheckIndex < quickTaskIndex,
62
- "triage check should come before quick-task dispatch",
63
- );
64
- assert.ok(
65
- quickTaskIndex < stepModeIndex,
66
- "quick-task dispatch should come before stepMode check",
67
- );
68
- });
69
-
70
- // ─── Guard conditions ────────────────────────────────────────────────────────
71
-
72
- test("dispatch: triage check guards against step mode", () => {
73
- const triageBlock = postUnitSrc.slice(
74
- postUnitSrc.indexOf("// ── Triage check"),
75
- postUnitSrc.indexOf("// ── Quick-task dispatch"),
76
- );
77
- assert.ok(
78
- triageBlock.includes("!s.stepMode"),
79
- "triage block should guard against step mode",
80
- );
81
- });
82
-
83
- test("dispatch: triage check guards against hook unit types", () => {
84
- const triageBlock = postUnitSrc.slice(
85
- postUnitSrc.indexOf("// ── Triage check"),
86
- postUnitSrc.indexOf("// ── Quick-task dispatch"),
87
- );
88
- assert.ok(
89
- triageBlock.includes('!s.currentUnit.type.startsWith("hook/")'),
90
- "triage block should not fire for hook units",
91
- );
92
- });
93
-
94
- test("dispatch: triage check guards against triage-on-triage", () => {
95
- const triageBlock = postUnitSrc.slice(
96
- postUnitSrc.indexOf("// ── Triage check"),
97
- postUnitSrc.indexOf("// ── Quick-task dispatch"),
98
- );
99
- assert.ok(
100
- triageBlock.includes('s.currentUnit.type !== "triage-captures"'),
101
- "triage block should not fire for triage units",
102
- );
103
- });
104
-
105
- test("dispatch: triage check guards against quick-task triggering triage", () => {
106
- const triageBlock = postUnitSrc.slice(
107
- postUnitSrc.indexOf("// ── Triage check"),
108
- postUnitSrc.indexOf("// ── Quick-task dispatch"),
109
- );
110
- assert.ok(
111
- triageBlock.includes('s.currentUnit.type !== "quick-task"'),
112
- "triage block should not fire for quick-task units",
113
- );
114
- });
115
-
116
- test("dispatch: triage dispatch keeps the loop in continue mode", () => {
117
- const triageBlock = postUnitSrc.slice(
118
- postUnitSrc.indexOf("// ── Triage check"),
119
- postUnitSrc.indexOf("// ── Quick-task dispatch"),
120
- );
121
- assert.ok(
122
- triageBlock.includes('return "continue"') || triageBlock.includes("return enqueueSidecar("),
123
- "triage dispatch should return 'continue' after enqueuing sidecar work",
124
- );
125
- });
126
-
127
- test("dispatch: triage imports hasPendingCaptures and loadPendingCaptures", () => {
128
- assert.ok(
129
- autoSrc.includes("hasPendingCaptures") && autoSrc.includes("loadPendingCaptures"),
130
- "should import capture functions",
131
- );
132
- assert.ok(
133
- autoSrc.includes('from "./captures.js"'),
134
- "should import from captures module",
135
- );
136
- });
137
-
138
- // ─── Prompt integration ──────────────────────────────────────────────────────
139
-
140
- test("dispatch: replan prompt builder loads capture context", () => {
141
- const src = autoPromptsSrc;
142
- assert.ok(
143
- src.includes("loadReplanCaptures"),
144
- "buildReplanSlicePrompt should load replan captures",
145
- );
146
- assert.ok(
147
- src.includes("captureContext"),
148
- "buildReplanSlicePrompt should pass captureContext to template",
149
- );
150
- });
151
-
152
- test("dispatch: reassess prompt builder loads deferred captures", () => {
153
- const src = autoPromptsSrc;
154
- assert.ok(
155
- src.includes("loadDeferredCaptures"),
156
- "buildReassessRoadmapPrompt should load deferred captures",
157
- );
158
- assert.ok(
159
- src.includes("deferredCaptures"),
160
- "buildReassessRoadmapPrompt should pass deferredCaptures to template",
161
- );
162
- });
163
-
164
- // ─── Prompt templates ────────────────────────────────────────────────────────
165
-
166
- test("dispatch: replan prompt template includes captureContext variable", () => {
167
- const promptPath = join(__dirname, "..", "prompts", "replan-slice.md");
168
- const prompt = readFileSync(promptPath, "utf-8");
169
- assert.ok(
170
- prompt.includes("{{captureContext}}"),
171
- "replan-slice.md should include {{captureContext}}",
172
- );
173
- });
174
-
175
- test("dispatch: reassess prompt template includes deferredCaptures variable", () => {
176
- const promptPath = join(__dirname, "..", "prompts", "reassess-roadmap.md");
177
- const prompt = readFileSync(promptPath, "utf-8");
178
- assert.ok(
179
- prompt.includes("{{deferredCaptures}}"),
180
- "reassess-roadmap.md should include {{deferredCaptures}}",
181
- );
182
- });
183
-
184
- test("dispatch: triage prompt template exists and has classification criteria", () => {
185
- const promptPath = join(__dirname, "..", "prompts", "triage-captures.md");
186
- const prompt = readFileSync(promptPath, "utf-8");
187
- assert.ok(prompt.includes("quick-task"), "should have quick-task classification");
188
- assert.ok(prompt.includes("inject"), "should have inject classification");
189
- assert.ok(prompt.includes("defer"), "should have defer classification");
190
- assert.ok(prompt.includes("replan"), "should have replan classification");
191
- assert.ok(prompt.includes("note"), "should have note classification");
192
- assert.ok(prompt.includes("{{pendingCaptures}}"), "should have pending captures variable");
193
- });
194
-
195
- // ─── Dashboard integration ───────────────────────────────────────────────────
196
-
197
- test("dashboard: AutoDashboardData includes pendingCaptureCount field", () => {
198
- assert.ok(
199
- autoSrc.includes("pendingCaptureCount"),
200
- "auto.ts should have pendingCaptureCount in AutoDashboardData",
201
- );
202
- });
203
-
204
- test("dashboard: getAutoDashboardData computes pendingCaptureCount", () => {
205
- assert.ok(
206
- autoSrc.includes("pendingCaptureCount = countPendingCaptures") ||
207
- autoSrc.includes("pendingCaptureCount = countPendingCaptures(basePath)"),
208
- "getAutoDashboardData should compute pendingCaptureCount from countPendingCaptures (single-read)",
209
- );
210
- });
211
-
212
- test("dashboard: overlay renders pending captures badge", () => {
213
- const overlayPath = join(__dirname, "..", "dashboard-overlay.ts");
214
- const overlaySrc = readFileSync(overlayPath, "utf-8");
215
- assert.ok(
216
- overlaySrc.includes("pendingCaptureCount"),
217
- "dashboard-overlay.ts should reference pendingCaptureCount",
218
- );
219
- assert.ok(
220
- overlaySrc.includes("pending capture"),
221
- "dashboard-overlay.ts should show pending captures text",
222
- );
223
- });
224
-
225
- test("dashboard: overlay labels triage-captures and quick-task unit types", () => {
226
- const overlayPath = join(__dirname, "..", "dashboard-overlay.ts");
227
- const overlaySrc = readFileSync(overlayPath, "utf-8");
228
- assert.ok(
229
- overlaySrc.includes('"triage-captures"'),
230
- "unitLabel should handle triage-captures",
231
- );
232
- assert.ok(
233
- overlaySrc.includes('"quick-task"'),
234
- "unitLabel should handle quick-task",
235
- );
236
- });
237
-
238
- // ─── Post-triage resolution execution ─────────────────────────────────────────
239
-
240
- test("dispatch: post-triage resolution executor fires after triage-captures unit", () => {
241
- const postTriageBlock = postUnitSrc.slice(
242
- postUnitSrc.indexOf("Post-triage: execute actionable resolutions"),
243
- );
244
- assert.ok(
245
- postTriageBlock.includes('s.currentUnit.type === "triage-captures"'),
246
- "should check for triage-captures unit completion",
247
- );
248
- assert.ok(
249
- postTriageBlock.includes("executeTriageResolutions"),
250
- "should call executeTriageResolutions",
251
- );
252
- });
253
-
254
- test("dispatch: post-triage executor handles inject results", () => {
255
- const postTriageBlock = postUnitSrc.slice(
256
- postUnitSrc.indexOf("Post-triage: execute actionable resolutions"),
257
- );
258
- assert.ok(
259
- postTriageBlock.includes("triageResult.injected"),
260
- "should check injected count",
261
- );
262
- });
263
-
264
- test("dispatch: post-triage executor handles replan results", () => {
265
- const postTriageBlock = postUnitSrc.slice(
266
- postUnitSrc.indexOf("Post-triage: execute actionable resolutions"),
267
- );
268
- assert.ok(
269
- postTriageBlock.includes("triageResult.replanned"),
270
- "should check replanned count",
271
- );
272
- });
273
-
274
- test("dispatch: post-triage executor queues quick-tasks", () => {
275
- const postTriageBlock = postUnitSrc.slice(
276
- postUnitSrc.indexOf("Post-triage: execute actionable resolutions"),
277
- );
278
- assert.ok(
279
- postTriageBlock.includes("s.pendingQuickTasks"),
280
- "should push quick-tasks to s.pendingQuickTasks queue",
281
- );
282
- });
283
-
284
- // ─── Quick-task dispatch ──────────────────────────────────────────────────────
285
-
286
- test("dispatch: quick-task dispatch block exists after triage check", () => {
287
- const quickTaskBlock = postUnitSrc.indexOf("// ── Quick-task dispatch");
288
- const triageBlock = postUnitSrc.indexOf("// ── Triage check");
289
-
290
- assert.ok(quickTaskBlock > 0, "quick-task dispatch block should exist");
291
- assert.ok(
292
- quickTaskBlock > triageBlock,
293
- "quick-task dispatch should come after triage check",
294
- );
295
- });
296
-
297
- test("dispatch: quick-task dispatch uses buildQuickTaskPrompt", () => {
298
- const quickTaskSection = postUnitSrc.slice(
299
- postUnitSrc.indexOf("// ── Quick-task dispatch"),
300
- );
301
- assert.ok(
302
- quickTaskSection.includes("buildQuickTaskPrompt"),
303
- "should call buildQuickTaskPrompt for quick-task dispatch",
304
- );
305
- });
306
-
307
- test("dispatch: quick-task dispatch marks capture as executed", () => {
308
- const quickTaskSection = postUnitSrc.slice(
309
- postUnitSrc.indexOf("// ── Quick-task dispatch"),
310
- );
311
- assert.ok(
312
- quickTaskSection.includes("markCaptureExecuted"),
313
- "should mark capture as executed after dispatch",
314
- );
315
- });
316
-
317
- test("dispatch: quick-task dispatch keeps the loop in continue mode", () => {
318
- const quickTaskSection = postUnitSrc.slice(
319
- postUnitSrc.indexOf("// ── Quick-task dispatch"),
320
- postUnitSrc.indexOf("if (s.stepMode)"),
321
- );
322
- assert.ok(
323
- quickTaskSection.includes('return "continue"') || quickTaskSection.includes("return enqueueSidecar("),
324
- "quick-task dispatch should return 'continue' after enqueuing sidecar work",
325
- );
326
- });
327
-
328
- // ─── Post-unit hook exclusion for quick-task ──────────────────────────────────
329
-
330
- test("dispatch: quick-task excluded from post-unit hook triggering", () => {
331
- assert.ok(
332
- hooksSrc.includes('"quick-task"'),
333
- "post-unit-hooks.ts should reference quick-task",
334
- );
335
- });
336
-
337
- // ─── pendingQuickTasks queue lifecycle ────────────────────────────────────────
338
-
339
- test("dispatch: pendingQuickTasks queue is reset on auto-mode start/stop", () => {
340
- const resetMatches = autoSrc.match(/s\.pendingQuickTasks = \[\]/g);
341
- assert.ok(
342
- resetMatches && resetMatches.length >= 2,
343
- "s.pendingQuickTasks should be reset in start and stop paths",
344
- );
5
+ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
6
+ import { join } from "node:path";
7
+ import { tmpdir } from "node:os";
8
+
9
+ import {
10
+ appendCapture,
11
+ countPendingCaptures,
12
+ hasPendingCaptures,
13
+ loadPendingCaptures,
14
+ markCaptureExecuted,
15
+ markCaptureResolved,
16
+ } from "../captures.ts";
17
+ import { checkPostUnitHooks } from "../post-unit-hooks.ts";
18
+ import {
19
+ _shouldDispatchQuickTaskForTest,
20
+ _shouldDispatchTriageForTest,
21
+ } from "../auto-post-unit.ts";
22
+ import {
23
+ buildQuickTaskPrompt,
24
+ loadDeferredCaptures,
25
+ loadReplanCaptures,
26
+ } from "../triage-resolution.ts";
27
+
28
+ function makeProject(): string {
29
+ const base = mkdtempSync(join(tmpdir(), "gsd-triage-dispatch-"));
30
+ mkdirSync(join(base, ".gsd", "milestones", "M001", "slices", "S01"), { recursive: true });
31
+ writeFileSync(
32
+ join(base, ".gsd", "milestones", "M001", "M001-ROADMAP.md"),
33
+ [
34
+ "# M001",
35
+ "",
36
+ "## Slices",
37
+ "- [ ] **S01: Slice** `risk:low` `depends:[]`",
38
+ ].join("\n"),
39
+ );
40
+ writeFileSync(
41
+ join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-PLAN.md"),
42
+ "# S01 Plan\n\n## Tasks\n- [ ] **T01: Task** `est:10m`\n",
43
+ );
44
+ return base;
45
+ }
46
+
47
+ test("post-unit hooks exclude triage and quick-task units", () => {
48
+ assert.equal(checkPostUnitHooks("triage-captures", "M001/S01/triage", "/tmp/project"), null);
49
+ assert.equal(checkPostUnitHooks("quick-task", "M001/CAP-1", "/tmp/project"), null);
50
+ });
51
+
52
+ test("triage dispatch guard excludes step mode, hook units, triage units, and quick tasks", () => {
53
+ const normal = { stepMode: false, currentUnit: { type: "execute-task", id: "M001/S01/T01", startedAt: 1 } };
54
+ assert.equal(_shouldDispatchTriageForTest(normal as any), true);
55
+ assert.equal(_shouldDispatchTriageForTest({ ...normal, stepMode: true } as any), false);
56
+ assert.equal(
57
+ _shouldDispatchTriageForTest({ stepMode: false, currentUnit: { type: "hook/review", id: "M001/S01/T01", startedAt: 1 } } as any),
58
+ false,
59
+ );
60
+ assert.equal(
61
+ _shouldDispatchTriageForTest({ stepMode: false, currentUnit: { type: "triage-captures", id: "M001/S01/triage", startedAt: 1 } } as any),
62
+ false,
63
+ );
64
+ assert.equal(
65
+ _shouldDispatchTriageForTest({ stepMode: false, currentUnit: { type: "quick-task", id: "M001/CAP-1", startedAt: 1 } } as any),
66
+ false,
67
+ );
68
+ });
69
+
70
+ test("quick-task dispatch guard requires queued captures and avoids quick-task recursion", () => {
71
+ const capture = {
72
+ id: "CAP-test",
73
+ text: "Fix typo",
74
+ timestamp: new Date().toISOString(),
75
+ status: "resolved" as const,
76
+ classification: "quick-task" as const,
77
+ };
78
+ assert.equal(
79
+ _shouldDispatchQuickTaskForTest({
80
+ stepMode: false,
81
+ currentUnit: { type: "execute-task", id: "M001/S01/T01", startedAt: 1 },
82
+ pendingQuickTasks: [capture],
83
+ } as any),
84
+ true,
85
+ );
86
+ assert.equal(
87
+ _shouldDispatchQuickTaskForTest({
88
+ stepMode: false,
89
+ currentUnit: { type: "quick-task", id: "M001/CAP-test", startedAt: 1 },
90
+ pendingQuickTasks: [capture],
91
+ } as any),
92
+ false,
93
+ );
94
+ assert.equal(
95
+ _shouldDispatchQuickTaskForTest({
96
+ stepMode: false,
97
+ currentUnit: { type: "execute-task", id: "M001/S01/T01", startedAt: 1 },
98
+ pendingQuickTasks: [],
99
+ } as any),
100
+ false,
101
+ );
102
+ });
103
+
104
+ test("capture lifecycle exposes pending, replan, deferred, and executed states", () => {
105
+ const base = makeProject();
106
+ try {
107
+ const pendingId = appendCapture(base, "Need a quick follow-up.");
108
+ const replanId = appendCapture(base, "Plan needs a new task.");
109
+ const deferId = appendCapture(base, "Create a future milestone.");
110
+
111
+ assert.equal(hasPendingCaptures(base), true);
112
+ assert.equal(countPendingCaptures(base), 3);
113
+ assert.deepEqual(loadPendingCaptures(base).map((entry) => entry.id).sort(), [deferId, pendingId, replanId].sort());
114
+
115
+ markCaptureResolved(base, replanId, "replan", "replan slice", "Need plan update", "M001");
116
+ markCaptureResolved(base, deferId, "defer", "defer milestone", "Out of current scope", "M001");
117
+ markCaptureExecuted(base, replanId);
118
+
119
+ assert.equal(loadReplanCaptures(base).some((entry) => entry.id === replanId), true);
120
+ assert.equal(loadDeferredCaptures(base).some((entry) => entry.id === deferId), true);
121
+ } finally {
122
+ rmSync(base, { recursive: true, force: true });
123
+ }
124
+ });
125
+
126
+ test("quick-task prompt carries capture identity and completion instruction", () => {
127
+ const prompt = buildQuickTaskPrompt({
128
+ id: "CAP-quick",
129
+ text: "Fix the CLI typo",
130
+ timestamp: new Date().toISOString(),
131
+ status: "resolved",
132
+ classification: "quick-task",
133
+ });
134
+
135
+ assert.match(prompt, /CAP-quick/);
136
+ assert.match(prompt, /Fix the CLI typo/);
137
+ assert.match(prompt, /Quick task complete/);
345
138
  });
@@ -21,12 +21,18 @@ import type {
21
21
  ComputedArtifactRegistry,
22
22
  UnitContextManifest,
23
23
  } from "../unit-context-manifest.ts";
24
- import { UNIT_MANIFESTS } from "../unit-context-manifest.ts";
25
- import { buildReassessRoadmapPrompt } from "../auto-prompts.ts";
24
+ import { KNOWN_UNIT_TYPES, UNIT_MANIFESTS } from "../unit-context-manifest.ts";
25
+ import {
26
+ buildExecuteTaskPrompt,
27
+ buildGateEvaluatePrompt,
28
+ buildReassessRoadmapPrompt,
29
+ buildWorkflowPreferencesPrompt,
30
+ } from "../auto-prompts.ts";
26
31
  import { invalidateAllCaches } from "../cache.ts";
27
32
  import {
28
33
  openDatabase,
29
34
  closeDatabase,
35
+ insertGateRow,
30
36
  insertMilestone,
31
37
  upsertMilestonePlanning,
32
38
  insertSlice,
@@ -121,7 +127,7 @@ test("Context Mode composer: standalone output starts with heading and includes
121
127
  assert.ok(out.startsWith("## Context Mode"));
122
128
  assert.match(out, /execution lane/i);
123
129
  assert.match(out, /`gsd_exec`/);
124
- assert.match(out, /noisy commands/);
130
+ assert.match(out, /builds, tests, and diagnostics/);
125
131
  assert.match(out, /`gsd_exec_search`/);
126
132
  assert.match(out, /before reruns/);
127
133
  assert.match(out, /`gsd_resume`/);
@@ -136,7 +142,45 @@ test("Context Mode composer: nested output is compact single sentence", () => {
136
142
  assert.match(out, /`gsd_exec`/);
137
143
  assert.match(out, /`gsd_exec_search`/);
138
144
  assert.match(out, /`gsd_resume`/);
139
- assert.ok(out.length < 180, `nested guidance should stay compact, got ${out.length} chars`);
145
+ assert.ok(out.length < 240, `nested guidance should stay compact, got ${out.length} chars`);
146
+ });
147
+
148
+ const laneLabelByMode: Record<string, string> = {
149
+ interview: "interview",
150
+ research: "research",
151
+ planning: "planning",
152
+ execution: "execution",
153
+ verification: "verification",
154
+ orchestration: "orchestration",
155
+ docs: "documentation",
156
+ };
157
+
158
+ test("Context Mode composer: every known eligible unit renders its configured lane and required tools", () => {
159
+ for (const unitType of KNOWN_UNIT_TYPES) {
160
+ const manifest = UNIT_MANIFESTS[unitType];
161
+ assert.ok(manifest, `missing manifest for ${unitType}`);
162
+ const out = composeContextModeInstructions(unitType, { enabled: true, renderMode: "standalone" });
163
+ if (manifest.contextMode === "none") {
164
+ assert.strictEqual(out, "", `${unitType} should not render Context Mode`);
165
+ continue;
166
+ }
167
+ assert.ok(out.startsWith("## Context Mode"), `${unitType} should render standalone Context Mode heading`);
168
+ assert.match(out, new RegExp(`Lane: \\*\\*${laneLabelByMode[manifest.contextMode]} lane\\*\\*\\.`, "i"));
169
+ assert.match(out, /`gsd_exec`/, `${unitType} should mention gsd_exec`);
170
+ assert.match(out, /`gsd_exec_search`/, `${unitType} should mention gsd_exec_search`);
171
+ assert.match(out, /`gsd_resume`/, `${unitType} should mention gsd_resume`);
172
+ }
173
+ });
174
+
175
+ test("Context Mode composer: workflow-preferences and research-decision render no Context Mode block", () => {
176
+ assert.strictEqual(
177
+ composeContextModeInstructions("workflow-preferences", { enabled: true, renderMode: "standalone" }),
178
+ "",
179
+ );
180
+ assert.strictEqual(
181
+ composeContextModeInstructions("research-decision", { enabled: true, renderMode: "standalone" }),
182
+ "",
183
+ );
140
184
  });
141
185
 
142
186
  // ─── Integration: migrated buildReassessRoadmapPrompt ─────────────────────
@@ -220,6 +264,94 @@ test("#4782 phase 2: buildReassessRoadmapPrompt emits composer-shaped context wi
220
264
  assert.ok(!prompt.includes("Slice Context (from discussion)"));
221
265
  });
222
266
 
267
+ test("Context Mode resume injection: eligible prompts include one bounded snapshot block above inlined context", async (t) => {
268
+ const base = makeFixtureBase();
269
+ t.after(() => cleanup(base));
270
+ invalidateAllCaches();
271
+
272
+ seed(base, "M001");
273
+ writeArtifacts(base);
274
+ writeFileSync(
275
+ join(base, ".gsd", "last-snapshot.md"),
276
+ "# GSD context snapshot\n\nResume evidence.\n",
277
+ "utf-8",
278
+ );
279
+
280
+ const prompt = await buildReassessRoadmapPrompt("M001", "Test", "S01", base);
281
+
282
+ assert.equal(prompt.match(/## Context Snapshot/g)?.length, 1);
283
+ assert.match(prompt, /Source: `\.gsd\/last-snapshot\.md`/);
284
+ assert.match(prompt, /Resume evidence/);
285
+ assert.ok(prompt.indexOf("## Context Mode") < prompt.indexOf("## Context Snapshot"));
286
+ assert.ok(prompt.indexOf("## Context Snapshot") < prompt.indexOf("## Inlined Context"));
287
+ });
288
+
289
+ test("Context Mode resume injection: missing snapshot does not add an empty block", async (t) => {
290
+ const base = makeFixtureBase();
291
+ t.after(() => cleanup(base));
292
+ invalidateAllCaches();
293
+
294
+ seed(base, "M001");
295
+ writeArtifacts(base);
296
+
297
+ const prompt = await buildReassessRoadmapPrompt("M001", "Test", "S01", base);
298
+
299
+ assert.match(prompt, /## Context Mode/);
300
+ assert.doesNotMatch(prompt, /## Context Snapshot/);
301
+ });
302
+
303
+ test("Context Mode resume injection: disabled mode suppresses guidance and snapshot reads", async (t) => {
304
+ const base = makeFixtureBase();
305
+ t.after(() => cleanup(base));
306
+ invalidateAllCaches();
307
+
308
+ seed(base, "M001");
309
+ writeArtifacts(base);
310
+ writeFileSync(join(base, ".gsd", "PREFERENCES.md"), "---\ncontext_mode:\n enabled: false\n---\n", "utf-8");
311
+ writeFileSync(join(base, ".gsd", "last-snapshot.md"), "# GSD context snapshot\n\nDo not inject.\n", "utf-8");
312
+
313
+ const prompt = await buildReassessRoadmapPrompt("M001", "Test", "S01", base);
314
+
315
+ assert.doesNotMatch(prompt, /## Context Mode/);
316
+ assert.doesNotMatch(prompt, /## Context Snapshot/);
317
+ assert.doesNotMatch(prompt, /Do not inject/);
318
+ });
319
+
320
+ test("Context Mode resume injection: none-mode units do not inject snapshots", async () => {
321
+ const base = makeFixtureBase();
322
+ try {
323
+ writeFileSync(join(base, ".gsd", "last-snapshot.md"), "# GSD context snapshot\n\nNo lane.\n", "utf-8");
324
+ const prompt = await buildWorkflowPreferencesPrompt(base);
325
+ assert.doesNotMatch(prompt, /## Context Mode/);
326
+ assert.doesNotMatch(prompt, /## Context Snapshot/);
327
+ assert.doesNotMatch(prompt, /No lane/);
328
+ } finally {
329
+ cleanup(base);
330
+ }
331
+ });
332
+
333
+ test("Context Mode prompt suppression: disabled inlined, phase-anchor, and nested prompts omit Context Mode", async (t) => {
334
+ const base = makeFixtureBase();
335
+ t.after(() => cleanup(base));
336
+ invalidateAllCaches();
337
+
338
+ seed(base, "M001");
339
+ writeArtifacts(base);
340
+ insertGateRow({ milestoneId: "M001", sliceId: "S01", gateId: "Q3", scope: "slice" });
341
+ writeFileSync(join(base, ".gsd", "PREFERENCES.md"), "---\ncontext_mode:\n enabled: false\n---\n", "utf-8");
342
+ writeFileSync(join(base, ".gsd", "last-snapshot.md"), "# GSD context snapshot\n\nDo not inject.\n", "utf-8");
343
+
344
+ const inlinedPrompt = await buildReassessRoadmapPrompt("M001", "Test", "S01", base);
345
+ assert.doesNotMatch(inlinedPrompt, /## Context Mode|Context Mode \(|## Context Snapshot/);
346
+
347
+ const phaseAnchorPrompt = await buildExecuteTaskPrompt("M001", "S01", "First", "T01", "Task", base);
348
+ assert.doesNotMatch(phaseAnchorPrompt, /## Context Mode|Context Mode \(|## Context Snapshot/);
349
+
350
+ const nestedPrompt = await buildGateEvaluatePrompt("M001", "Test", "S01", "First", base);
351
+ assert.match(nestedPrompt, /Use this as the prompt for a `subagent` call/);
352
+ assert.doesNotMatch(nestedPrompt, /## Context Mode|Context Mode \(|## Context Snapshot/);
353
+ });
354
+
223
355
  // ─── v2 surface (#4924) ───────────────────────────────────────────────────
224
356
 
225
357
  const fakeBase: BaseResolverContext = {