gsd-pi 2.75.0 → 2.76.0-dev.4100bd590

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 (1034) hide show
  1. package/README.md +208 -151
  2. package/dist/claude-cli-check.d.ts +10 -0
  3. package/dist/claude-cli-check.js +13 -3
  4. package/dist/headless-events.d.ts +1 -1
  5. package/dist/headless-events.js +5 -2
  6. package/dist/headless.js +5 -6
  7. package/dist/loader.js +0 -0
  8. package/dist/onboarding.d.ts +20 -1
  9. package/dist/onboarding.js +99 -39
  10. package/dist/resources/agents/researcher.md +1 -1
  11. package/dist/resources/extensions/ask-user-questions.js +17 -5
  12. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  13. package/dist/resources/extensions/claude-code-cli/readiness.js +34 -2
  14. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +76 -4
  15. package/dist/resources/extensions/gsd/auto/detect-stuck.js +9 -0
  16. package/dist/resources/extensions/gsd/auto/loop.js +67 -4
  17. package/dist/resources/extensions/gsd/auto/phases.js +118 -53
  18. package/dist/resources/extensions/gsd/auto/resolve.js +1 -1
  19. package/dist/resources/extensions/gsd/auto/run-unit.js +10 -1
  20. package/dist/resources/extensions/gsd/auto/session.js +5 -0
  21. package/dist/resources/extensions/gsd/auto-artifact-paths.js +20 -0
  22. package/dist/resources/extensions/gsd/auto-dashboard.js +37 -8
  23. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +8 -2
  24. package/dist/resources/extensions/gsd/auto-dispatch.js +120 -14
  25. package/dist/resources/extensions/gsd/auto-loop.js +1 -1
  26. package/dist/resources/extensions/gsd/auto-model-selection.js +54 -18
  27. package/dist/resources/extensions/gsd/auto-post-unit.js +10 -8
  28. package/dist/resources/extensions/gsd/auto-prompts.js +190 -46
  29. package/dist/resources/extensions/gsd/auto-recovery.js +57 -0
  30. package/dist/resources/extensions/gsd/auto-start.js +5 -3
  31. package/dist/resources/extensions/gsd/auto-verification.js +36 -3
  32. package/dist/resources/extensions/gsd/auto-worktree.js +71 -2
  33. package/dist/resources/extensions/gsd/auto.js +57 -25
  34. package/dist/resources/extensions/gsd/blocked-models.js +68 -0
  35. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +84 -21
  36. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +45 -23
  37. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +131 -0
  38. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +29 -0
  39. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +12 -0
  40. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +22 -0
  41. package/dist/resources/extensions/gsd/bootstrap/system-context.js +84 -10
  42. package/dist/resources/extensions/gsd/commands/catalog.js +81 -9
  43. package/dist/resources/extensions/gsd/commands/handlers/core.js +64 -24
  44. package/dist/resources/extensions/gsd/commands/handlers/escalate.js +171 -0
  45. package/dist/resources/extensions/gsd/commands/handlers/onboarding.js +159 -0
  46. package/dist/resources/extensions/gsd/commands/handlers/ops.js +21 -0
  47. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +228 -29
  48. package/dist/resources/extensions/gsd/commands-cmux.js +5 -2
  49. package/dist/resources/extensions/gsd/commands-config.js +5 -0
  50. package/dist/resources/extensions/gsd/commands-debug.js +388 -0
  51. package/dist/resources/extensions/gsd/commands-do.js +1 -0
  52. package/dist/resources/extensions/gsd/commands-extract-learnings.js +200 -77
  53. package/dist/resources/extensions/gsd/commands-handlers.js +21 -2
  54. package/dist/resources/extensions/gsd/commands-memory.js +462 -0
  55. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +40 -12
  56. package/dist/resources/extensions/gsd/commands-scan.js +94 -0
  57. package/dist/resources/extensions/gsd/commands-workflow-templates.js +101 -2
  58. package/dist/resources/extensions/gsd/custom-workflow-engine.js +74 -54
  59. package/dist/resources/extensions/gsd/db-writer.js +89 -16
  60. package/dist/resources/extensions/gsd/debug-session-store.js +238 -0
  61. package/dist/resources/extensions/gsd/definition-loader.js +7 -0
  62. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -9
  63. package/dist/resources/extensions/gsd/doctor-environment.js +2 -1
  64. package/dist/resources/extensions/gsd/doctor-git-checks.js +50 -32
  65. package/dist/resources/extensions/gsd/doctor-proactive.js +4 -1
  66. package/dist/resources/extensions/gsd/doctor-providers.js +96 -22
  67. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +22 -4
  68. package/dist/resources/extensions/gsd/doctor.js +7 -1
  69. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +1 -0
  70. package/dist/resources/extensions/gsd/error-classifier.js +27 -3
  71. package/dist/resources/extensions/gsd/escalation.js +321 -0
  72. package/dist/resources/extensions/gsd/forensics.js +26 -29
  73. package/dist/resources/extensions/gsd/git-service.js +0 -1
  74. package/dist/resources/extensions/gsd/graph.js +26 -2
  75. package/dist/resources/extensions/gsd/gsd-db.js +517 -32
  76. package/dist/resources/extensions/gsd/health-widget-core.js +42 -14
  77. package/dist/resources/extensions/gsd/health-widget.js +7 -4
  78. package/dist/resources/extensions/gsd/hook-emitter.js +108 -0
  79. package/dist/resources/extensions/gsd/init-wizard.js +86 -45
  80. package/dist/resources/extensions/gsd/markdown-renderer.js +5 -5
  81. package/dist/resources/extensions/gsd/memory-backfill.js +126 -0
  82. package/dist/resources/extensions/gsd/memory-embeddings.js +219 -0
  83. package/dist/resources/extensions/gsd/memory-extractor.js +78 -27
  84. package/dist/resources/extensions/gsd/memory-ingest.js +218 -0
  85. package/dist/resources/extensions/gsd/memory-relations.js +189 -0
  86. package/dist/resources/extensions/gsd/memory-source-store.js +113 -0
  87. package/dist/resources/extensions/gsd/memory-store.js +318 -6
  88. package/dist/resources/extensions/gsd/metrics.js +1 -0
  89. package/dist/resources/extensions/gsd/model-cost-table.js +3 -1
  90. package/dist/resources/extensions/gsd/model-router.js +16 -6
  91. package/dist/resources/extensions/gsd/native-git-bridge.js +137 -5
  92. package/dist/resources/extensions/gsd/notification-overlay.js +7 -22
  93. package/dist/resources/extensions/gsd/notification-widget.js +24 -39
  94. package/dist/resources/extensions/gsd/notifications.js +4 -0
  95. package/dist/resources/extensions/gsd/onboarding-state.js +133 -0
  96. package/dist/resources/extensions/gsd/post-execution-checks.js +27 -11
  97. package/dist/resources/extensions/gsd/pre-execution-checks.js +105 -8
  98. package/dist/resources/extensions/gsd/preferences-models.js +1 -0
  99. package/dist/resources/extensions/gsd/preferences-types.js +2 -1
  100. package/dist/resources/extensions/gsd/preferences-validation.js +42 -8
  101. package/dist/resources/extensions/gsd/preferences.js +10 -10
  102. package/dist/resources/extensions/gsd/prompts/add-tests.md +1 -0
  103. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
  104. package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  105. package/dist/resources/extensions/gsd/prompts/debug-diagnose.md +27 -0
  106. package/dist/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
  107. package/dist/resources/extensions/gsd/prompts/execute-task.md +16 -3
  108. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  109. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  110. package/dist/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  111. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -0
  112. package/dist/resources/extensions/gsd/prompts/scan.md +79 -0
  113. package/dist/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
  114. package/dist/resources/extensions/gsd/python-resolver.js +70 -0
  115. package/dist/resources/extensions/gsd/run-manager.js +37 -17
  116. package/dist/resources/extensions/gsd/setup-catalog.js +75 -0
  117. package/dist/resources/extensions/gsd/state.js +90 -7
  118. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
  119. package/dist/resources/extensions/gsd/tools/complete-task.js +80 -0
  120. package/dist/resources/extensions/gsd/tools/memory-tools.js +331 -0
  121. package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -12
  122. package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -2
  123. package/dist/resources/extensions/gsd/tools/skip-slice.js +78 -0
  124. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +14 -0
  125. package/dist/resources/extensions/gsd/uok/flags.js +7 -7
  126. package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
  127. package/dist/resources/extensions/gsd/verification-gate.js +2 -1
  128. package/dist/resources/extensions/gsd/workflow-dispatch.js +64 -0
  129. package/dist/resources/extensions/gsd/workflow-install.js +327 -0
  130. package/dist/resources/extensions/gsd/workflow-manifest.js +8 -0
  131. package/dist/resources/extensions/gsd/workflow-mcp.js +1 -6
  132. package/dist/resources/extensions/gsd/workflow-plugins.js +346 -0
  133. package/dist/resources/extensions/gsd/workflow-projections.js +17 -15
  134. package/dist/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
  135. package/dist/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
  136. package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
  137. package/dist/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
  138. package/dist/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
  139. package/dist/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
  140. package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
  141. package/dist/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
  142. package/dist/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
  143. package/dist/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
  144. package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
  145. package/dist/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
  146. package/dist/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
  147. package/dist/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
  148. package/dist/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
  149. package/dist/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
  150. package/dist/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
  151. package/dist/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
  152. package/dist/resources/extensions/gsd/workflow-templates/registry.json +184 -0
  153. package/dist/resources/extensions/gsd/workflow-templates/release.md +118 -0
  154. package/dist/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
  155. package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
  156. package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
  157. package/dist/resources/extensions/gsd/workflow-templates/spike.md +7 -0
  158. package/dist/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
  159. package/dist/resources/extensions/gsd/worktree-resolver.js +42 -1
  160. package/dist/resources/extensions/remote-questions/commands.js +380 -0
  161. package/dist/resources/extensions/remote-questions/manager.js +39 -5
  162. package/dist/resources/extensions/remote-questions/telegram-adapter.js +79 -4
  163. package/dist/resources/extensions/search-the-web/command-search-provider.js +5 -1
  164. package/dist/resources/extensions/search-the-web/native-search.js +46 -3
  165. package/dist/resources/extensions/shared/interview-ui.js +189 -1
  166. package/dist/resources/extensions/shared/layout-utils.js +17 -0
  167. package/dist/resources/extensions/shared/rtk-shared.js +47 -0
  168. package/dist/resources/extensions/shared/rtk.js +3 -46
  169. package/dist/resources/skills/api-design/SKILL.md +190 -0
  170. package/dist/resources/skills/create-mcp-server/SKILL.md +121 -0
  171. package/dist/resources/skills/create-workflow/SKILL.md +33 -6
  172. package/dist/resources/skills/decompose-into-slices/SKILL.md +139 -0
  173. package/dist/resources/skills/dependency-upgrade/SKILL.md +158 -0
  174. package/dist/resources/skills/design-an-interface/SKILL.md +102 -0
  175. package/dist/resources/skills/forensics/SKILL.md +153 -0
  176. package/dist/resources/skills/grill-me/SKILL.md +93 -0
  177. package/dist/resources/skills/handoff/SKILL.md +121 -0
  178. package/dist/resources/skills/observability/SKILL.md +174 -0
  179. package/dist/resources/skills/security-review/SKILL.md +181 -0
  180. package/dist/resources/skills/spike-wrap-up/SKILL.md +138 -0
  181. package/dist/resources/skills/tdd/SKILL.md +112 -0
  182. package/dist/resources/skills/verify-before-complete/SKILL.md +97 -0
  183. package/dist/resources/skills/write-docs/SKILL.md +81 -0
  184. package/dist/resources/skills/write-milestone-brief/SKILL.md +135 -0
  185. package/dist/rtk-shared.d.ts +10 -0
  186. package/dist/rtk-shared.js +47 -0
  187. package/dist/rtk.d.ts +2 -6
  188. package/dist/rtk.js +3 -48
  189. package/dist/shared/workspace-types.d.ts +52 -0
  190. package/dist/shared/workspace-types.js +1 -0
  191. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  192. package/dist/update-check.d.ts +10 -0
  193. package/dist/update-check.js +24 -3
  194. package/dist/web/standalone/.next/BUILD_ID +1 -1
  195. package/dist/web/standalone/.next/app-path-routes-manifest.json +16 -16
  196. package/dist/web/standalone/.next/build-manifest.json +4 -4
  197. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  198. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  199. package/dist/web/standalone/.next/required-server-files.json +4 -4
  200. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  201. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  203. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  204. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  206. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  207. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  208. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  209. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  210. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  211. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  213. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  214. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  215. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  216. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  217. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  218. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  219. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  220. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  225. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  228. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  230. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  231. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  235. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  236. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  238. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  239. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  240. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  241. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  242. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  244. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  245. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  246. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  247. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  248. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  249. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  250. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  252. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  253. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  254. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  255. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  256. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  257. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  258. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  259. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  260. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  261. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  262. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  263. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  264. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  265. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  266. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  267. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  268. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  269. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  270. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  271. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  272. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  273. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  274. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  275. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  276. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  277. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  278. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  279. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  280. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  281. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  282. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  283. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  284. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  285. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  286. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  287. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  288. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  289. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  290. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  291. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  292. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  293. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  294. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  295. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  296. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  297. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  298. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  299. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  300. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  301. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  302. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  303. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  304. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  305. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  306. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  307. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  308. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  309. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  310. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  311. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  312. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  313. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  314. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  315. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  316. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  317. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  318. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  319. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  320. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  321. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  322. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  323. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  324. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  325. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  326. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  327. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  328. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  329. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  330. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  331. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  332. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  333. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  334. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  335. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  336. package/dist/web/standalone/.next/server/app/index.html +1 -1
  337. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  338. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  339. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  340. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  341. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  342. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  343. package/dist/web/standalone/.next/server/app/page.js +2 -2
  344. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  345. package/dist/web/standalone/.next/server/app-paths-manifest.json +16 -16
  346. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  347. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  348. package/dist/web/standalone/.next/server/chunks/7461.js +1 -0
  349. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  350. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  351. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  352. package/dist/web/standalone/.next/server/middleware.js +2 -2
  353. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  354. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  355. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  356. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  357. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  358. package/dist/web/standalone/.next/static/chunks/2826.e59e8578e2e28639.js +9 -0
  359. package/dist/web/standalone/.next/static/chunks/{2008.71ee9230ad78df21.js → 3621.fc7480022c972438.js} +2 -2
  360. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  361. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  362. package/dist/web/standalone/.next/static/chunks/app/page-5b113fd32bc2a1c3.js +1 -0
  363. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  364. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  365. package/dist/web/standalone/.next/static/chunks/{webpack-b868033a5834586d.js → webpack-5fc74f13a25fa1bb.js} +1 -1
  366. package/dist/web/standalone/.next/static/css/632cd626b1731d88.css +1 -0
  367. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  368. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  369. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  370. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  371. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  372. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  373. package/dist/web/standalone/server.js +1 -1
  374. package/dist/welcome-screen.js +48 -24
  375. package/dist/wizard.js +2 -2
  376. package/dist/worktree-cli.d.ts +6 -5
  377. package/dist/worktree-cli.js +23 -7
  378. package/package.json +3 -3
  379. package/packages/daemon/package.json +2 -2
  380. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  381. package/packages/mcp-server/dist/server.js +12 -10
  382. package/packages/mcp-server/dist/server.js.map +1 -1
  383. package/packages/mcp-server/dist/session-manager.d.ts.map +1 -1
  384. package/packages/mcp-server/dist/session-manager.js +8 -1
  385. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  386. package/packages/mcp-server/dist/workflow-tools.d.ts +2 -1
  387. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  388. package/packages/mcp-server/dist/workflow-tools.js +306 -71
  389. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  390. package/packages/mcp-server/package.json +2 -2
  391. package/packages/mcp-server/src/mcp-server.test.ts +40 -4
  392. package/packages/mcp-server/src/server.ts +12 -10
  393. package/packages/mcp-server/src/session-manager.ts +10 -3
  394. package/packages/mcp-server/src/workflow-tools.test.ts +346 -1
  395. package/packages/mcp-server/src/workflow-tools.ts +359 -75
  396. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  397. package/packages/native/package.json +1 -1
  398. package/packages/native/tsconfig.tsbuildinfo +1 -1
  399. package/packages/pi-agent-core/dist/agent-loop.js +12 -0
  400. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  401. package/packages/pi-agent-core/dist/types.d.ts +30 -0
  402. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  403. package/packages/pi-agent-core/dist/types.js.map +1 -1
  404. package/packages/pi-agent-core/package.json +1 -1
  405. package/packages/pi-agent-core/src/agent-loop.ts +14 -0
  406. package/packages/pi-agent-core/src/types.ts +34 -0
  407. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  408. package/packages/pi-ai/dist/index.d.ts +1 -0
  409. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  410. package/packages/pi-ai/dist/index.js +1 -0
  411. package/packages/pi-ai/dist/index.js.map +1 -1
  412. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
  413. package/packages/pi-ai/dist/models/capability-patches.js +3 -2
  414. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
  415. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +68 -0
  416. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -1
  417. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +68 -0
  418. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -1
  419. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +17 -0
  420. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -1
  421. package/packages/pi-ai/dist/models/generated/anthropic.js +17 -0
  422. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -1
  423. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +17 -0
  424. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -1
  425. package/packages/pi-ai/dist/models/generated/google-antigravity.js +17 -0
  426. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -1
  427. package/packages/pi-ai/dist/models/generated/groq.d.ts +0 -153
  428. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -1
  429. package/packages/pi-ai/dist/models/generated/groq.js +0 -153
  430. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -1
  431. package/packages/pi-ai/dist/models/generated/index.d.ts +136 -153
  432. package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
  433. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
  434. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
  435. package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
  436. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
  437. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +17 -0
  438. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -1
  439. package/packages/pi-ai/dist/models/generated/openrouter.js +17 -0
  440. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -1
  441. package/packages/pi-ai/dist/models.generated.test.js +17 -0
  442. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  443. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts +22 -1
  444. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  445. package/packages/pi-ai/dist/providers/amazon-bedrock.js +40 -6
  446. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  447. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts +2 -0
  448. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts.map +1 -0
  449. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js +106 -0
  450. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js.map +1 -0
  451. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +42 -1
  452. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  453. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.d.ts +2 -0
  454. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.d.ts.map +1 -0
  455. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +13 -0
  456. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -0
  457. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +20 -1
  458. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  459. package/packages/pi-ai/dist/providers/anthropic-shared.js +32 -2
  460. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  461. package/packages/pi-ai/dist/providers/anthropic-shared.test.js +12 -1
  462. package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -1
  463. package/packages/pi-ai/dist/providers/anthropic.d.ts +11 -0
  464. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  465. package/packages/pi-ai/dist/providers/anthropic.js +23 -2
  466. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  467. package/packages/pi-ai/dist/providers/api-family.d.ts +27 -0
  468. package/packages/pi-ai/dist/providers/api-family.d.ts.map +1 -0
  469. package/packages/pi-ai/dist/providers/api-family.js +47 -0
  470. package/packages/pi-ai/dist/providers/api-family.js.map +1 -0
  471. package/packages/pi-ai/dist/providers/api-family.test.d.ts +2 -0
  472. package/packages/pi-ai/dist/providers/api-family.test.d.ts.map +1 -0
  473. package/packages/pi-ai/dist/providers/api-family.test.js +101 -0
  474. package/packages/pi-ai/dist/providers/api-family.test.js.map +1 -0
  475. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  476. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +12 -2
  477. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  478. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +164 -14
  479. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  480. package/packages/pi-ai/dist/utils/oauth/google-antigravity.d.ts.map +1 -1
  481. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js +15 -3
  482. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js.map +1 -1
  483. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.d.ts +2 -0
  484. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.d.ts.map +1 -0
  485. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +67 -0
  486. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -0
  487. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.d.ts.map +1 -1
  488. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js +16 -3
  489. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js.map +1 -1
  490. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.d.ts +2 -0
  491. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.d.ts.map +1 -0
  492. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +67 -0
  493. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -0
  494. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts +2 -0
  495. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts.map +1 -0
  496. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js +289 -0
  497. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js.map +1 -0
  498. package/packages/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
  499. package/packages/pi-ai/dist/utils/oauth/openai-codex.js +12 -0
  500. package/packages/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
  501. package/packages/pi-ai/package.json +2 -2
  502. package/packages/pi-ai/scripts/generate-models.ts +50 -0
  503. package/packages/pi-ai/src/index.ts +1 -0
  504. package/packages/pi-ai/src/models/capability-patches.ts +5 -2
  505. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +68 -0
  506. package/packages/pi-ai/src/models/generated/anthropic.ts +17 -0
  507. package/packages/pi-ai/src/models/generated/google-antigravity.ts +17 -0
  508. package/packages/pi-ai/src/models/generated/groq.ts +0 -153
  509. package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
  510. package/packages/pi-ai/src/models/generated/openrouter.ts +17 -0
  511. package/packages/pi-ai/src/models.generated.test.ts +17 -0
  512. package/packages/pi-ai/src/providers/amazon-bedrock.test.ts +164 -0
  513. package/packages/pi-ai/src/providers/amazon-bedrock.ts +41 -7
  514. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +47 -1
  515. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -0
  516. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +15 -1
  517. package/packages/pi-ai/src/providers/anthropic-shared.ts +36 -3
  518. package/packages/pi-ai/src/providers/anthropic.ts +25 -2
  519. package/packages/pi-ai/src/providers/api-family.test.ts +129 -0
  520. package/packages/pi-ai/src/providers/api-family.ts +57 -0
  521. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +200 -23
  522. package/packages/pi-ai/src/utils/oauth/github-copilot.ts +12 -2
  523. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +84 -0
  524. package/packages/pi-ai/src/utils/oauth/google-antigravity.ts +15 -5
  525. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +84 -0
  526. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.ts +16 -5
  527. package/packages/pi-ai/src/utils/oauth/oauth-providers.test.ts +363 -0
  528. package/packages/pi-ai/src/utils/oauth/openai-codex.ts +15 -0
  529. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  530. package/packages/pi-coding-agent/dist/cli/args.d.ts +6 -0
  531. package/packages/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
  532. package/packages/pi-coding-agent/dist/cli/args.js +14 -4
  533. package/packages/pi-coding-agent/dist/cli/args.js.map +1 -1
  534. package/packages/pi-coding-agent/dist/cli/args.test.d.ts +2 -0
  535. package/packages/pi-coding-agent/dist/cli/args.test.d.ts.map +1 -0
  536. package/packages/pi-coding-agent/dist/cli/args.test.js +38 -0
  537. package/packages/pi-coding-agent/dist/cli/args.test.js.map +1 -0
  538. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts +2 -0
  539. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts.map +1 -0
  540. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +38 -0
  541. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -0
  542. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  543. package/packages/pi-coding-agent/dist/core/agent-session.js +25 -2
  544. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  545. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +14 -0
  546. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  547. package/packages/pi-coding-agent/dist/core/auth-storage.js +34 -0
  548. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  549. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +74 -0
  550. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  551. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +4 -1
  552. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  553. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  554. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  555. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  556. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  557. package/packages/pi-coding-agent/dist/core/extensions/loader.js +4 -0
  558. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  559. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +34 -2
  560. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  561. package/packages/pi-coding-agent/dist/core/extensions/runner.js +233 -0
  562. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  563. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +200 -3
  564. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  565. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  566. package/packages/pi-coding-agent/dist/core/hooks-runner.d.ts +53 -0
  567. package/packages/pi-coding-agent/dist/core/hooks-runner.d.ts.map +1 -0
  568. package/packages/pi-coding-agent/dist/core/hooks-runner.js +337 -0
  569. package/packages/pi-coding-agent/dist/core/hooks-runner.js.map +1 -0
  570. package/packages/pi-coding-agent/dist/core/hooks-runner.test.d.ts +2 -0
  571. package/packages/pi-coding-agent/dist/core/hooks-runner.test.d.ts.map +1 -0
  572. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +234 -0
  573. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -0
  574. package/packages/pi-coding-agent/dist/core/index.d.ts +1 -0
  575. package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  576. package/packages/pi-coding-agent/dist/core/index.js +1 -0
  577. package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
  578. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.d.ts +2 -0
  579. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.d.ts.map +1 -0
  580. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.js +40 -0
  581. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.js.map +1 -0
  582. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +32 -0
  583. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  584. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  585. package/packages/pi-coding-agent/dist/core/retry-handler.js +4 -1
  586. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  587. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -0
  588. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  589. package/packages/pi-coding-agent/dist/core/sdk.js +39 -1
  590. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  591. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +55 -0
  592. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  593. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  594. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +2 -2
  595. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  596. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  597. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  598. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  599. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  600. package/packages/pi-coding-agent/dist/main.js +3 -0
  601. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  602. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  603. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +17 -7
  604. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  605. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  606. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +48 -34
  607. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  608. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts +4 -0
  609. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  610. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +83 -33
  611. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  612. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
  613. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  614. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +77 -0
  615. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  616. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -66
  617. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  618. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +1 -75
  619. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  620. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts +1 -1
  621. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  622. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +192 -24
  623. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  624. package/packages/pi-coding-agent/package.json +1 -1
  625. package/packages/pi-coding-agent/src/cli/args.test.ts +44 -0
  626. package/packages/pi-coding-agent/src/cli/args.ts +21 -6
  627. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +56 -0
  628. package/packages/pi-coding-agent/src/core/agent-session.ts +27 -2
  629. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +83 -0
  630. package/packages/pi-coding-agent/src/core/auth-storage.ts +35 -0
  631. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +4 -1
  632. package/packages/pi-coding-agent/src/core/extensions/index.ts +16 -0
  633. package/packages/pi-coding-agent/src/core/extensions/loader.ts +5 -0
  634. package/packages/pi-coding-agent/src/core/extensions/runner.ts +353 -1
  635. package/packages/pi-coding-agent/src/core/extensions/types.ts +253 -2
  636. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +269 -0
  637. package/packages/pi-coding-agent/src/core/hooks-runner.ts +460 -0
  638. package/packages/pi-coding-agent/src/core/index.ts +10 -0
  639. package/packages/pi-coding-agent/src/core/model-registry-auth-header.test.ts +44 -0
  640. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +37 -1
  641. package/packages/pi-coding-agent/src/core/retry-handler.ts +4 -1
  642. package/packages/pi-coding-agent/src/core/sdk.ts +58 -1
  643. package/packages/pi-coding-agent/src/core/settings-manager.ts +57 -0
  644. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +2 -2
  645. package/packages/pi-coding-agent/src/index.ts +16 -0
  646. package/packages/pi-coding-agent/src/main.ts +4 -0
  647. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +19 -7
  648. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +53 -31
  649. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +88 -36
  650. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +83 -0
  651. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +2 -83
  652. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +208 -27
  653. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  654. package/packages/pi-tui/package.json +1 -1
  655. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  656. package/packages/rpc-client/package.json +1 -1
  657. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  658. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
  659. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  660. package/pkg/dist/modes/interactive/theme/theme-schema.js +77 -0
  661. package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  662. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -66
  663. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  664. package/pkg/dist/modes/interactive/theme/theme.js +1 -75
  665. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  666. package/pkg/dist/modes/interactive/theme/themes.d.ts +1 -1
  667. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  668. package/pkg/dist/modes/interactive/theme/themes.js +192 -24
  669. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  670. package/pkg/package.json +1 -1
  671. package/src/resources/agents/researcher.md +1 -1
  672. package/src/resources/extensions/ask-user-questions.ts +24 -6
  673. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  674. package/src/resources/extensions/claude-code-cli/readiness.ts +36 -2
  675. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +94 -4
  676. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +84 -0
  677. package/src/resources/extensions/gsd/auto/detect-stuck.ts +10 -0
  678. package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -9
  679. package/src/resources/extensions/gsd/auto/loop.ts +109 -3
  680. package/src/resources/extensions/gsd/auto/phases.ts +146 -66
  681. package/src/resources/extensions/gsd/auto/resolve.ts +1 -1
  682. package/src/resources/extensions/gsd/auto/run-unit.ts +11 -1
  683. package/src/resources/extensions/gsd/auto/session.ts +7 -0
  684. package/src/resources/extensions/gsd/auto-artifact-paths.ts +20 -0
  685. package/src/resources/extensions/gsd/auto-dashboard.ts +46 -5
  686. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
  687. package/src/resources/extensions/gsd/auto-dispatch.ts +141 -9
  688. package/src/resources/extensions/gsd/auto-loop.ts +1 -1
  689. package/src/resources/extensions/gsd/auto-model-selection.ts +72 -18
  690. package/src/resources/extensions/gsd/auto-post-unit.ts +10 -8
  691. package/src/resources/extensions/gsd/auto-prompts.ts +232 -47
  692. package/src/resources/extensions/gsd/auto-recovery.ts +63 -1
  693. package/src/resources/extensions/gsd/auto-start.ts +8 -6
  694. package/src/resources/extensions/gsd/auto-verification.ts +36 -3
  695. package/src/resources/extensions/gsd/auto-worktree.ts +81 -1
  696. package/src/resources/extensions/gsd/auto.ts +61 -28
  697. package/src/resources/extensions/gsd/blocked-models.ts +98 -0
  698. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +105 -21
  699. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +46 -24
  700. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +163 -0
  701. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +31 -0
  702. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +15 -0
  703. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
  704. package/src/resources/extensions/gsd/bootstrap/system-context.ts +89 -10
  705. package/src/resources/extensions/gsd/commands/catalog.ts +74 -9
  706. package/src/resources/extensions/gsd/commands/handlers/core.ts +69 -27
  707. package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
  708. package/src/resources/extensions/gsd/commands/handlers/onboarding.ts +196 -0
  709. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  710. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +279 -29
  711. package/src/resources/extensions/gsd/commands-cmux.ts +6 -2
  712. package/src/resources/extensions/gsd/commands-config.ts +10 -0
  713. package/src/resources/extensions/gsd/commands-debug.ts +484 -0
  714. package/src/resources/extensions/gsd/commands-do.ts +1 -0
  715. package/src/resources/extensions/gsd/commands-extract-learnings.ts +262 -78
  716. package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
  717. package/src/resources/extensions/gsd/commands-memory.ts +551 -0
  718. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +49 -12
  719. package/src/resources/extensions/gsd/commands-scan.ts +125 -0
  720. package/src/resources/extensions/gsd/commands-workflow-templates.ts +129 -2
  721. package/src/resources/extensions/gsd/custom-workflow-engine.ts +85 -60
  722. package/src/resources/extensions/gsd/db-writer.ts +91 -17
  723. package/src/resources/extensions/gsd/debug-session-store.ts +377 -0
  724. package/src/resources/extensions/gsd/definition-loader.ts +7 -0
  725. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -9
  726. package/src/resources/extensions/gsd/doctor-environment.ts +2 -1
  727. package/src/resources/extensions/gsd/doctor-git-checks.ts +51 -30
  728. package/src/resources/extensions/gsd/doctor-proactive.ts +4 -1
  729. package/src/resources/extensions/gsd/doctor-providers.ts +109 -26
  730. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +23 -4
  731. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  732. package/src/resources/extensions/gsd/doctor.ts +7 -1
  733. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +2 -0
  734. package/src/resources/extensions/gsd/error-classifier.ts +32 -3
  735. package/src/resources/extensions/gsd/escalation.ts +367 -0
  736. package/src/resources/extensions/gsd/forensics.ts +25 -29
  737. package/src/resources/extensions/gsd/git-service.ts +0 -1
  738. package/src/resources/extensions/gsd/graph.ts +33 -3
  739. package/src/resources/extensions/gsd/gsd-db.ts +617 -32
  740. package/src/resources/extensions/gsd/health-widget-core.ts +43 -14
  741. package/src/resources/extensions/gsd/health-widget.ts +7 -3
  742. package/src/resources/extensions/gsd/hook-emitter.ts +188 -0
  743. package/src/resources/extensions/gsd/init-wizard.ts +87 -54
  744. package/src/resources/extensions/gsd/markdown-renderer.ts +5 -5
  745. package/src/resources/extensions/gsd/memory-backfill.ts +140 -0
  746. package/src/resources/extensions/gsd/memory-embeddings.ts +235 -0
  747. package/src/resources/extensions/gsd/memory-extractor.ts +100 -34
  748. package/src/resources/extensions/gsd/memory-ingest.ts +286 -0
  749. package/src/resources/extensions/gsd/memory-relations.ts +240 -0
  750. package/src/resources/extensions/gsd/memory-source-store.ts +138 -0
  751. package/src/resources/extensions/gsd/memory-store.ts +377 -7
  752. package/src/resources/extensions/gsd/metrics.ts +1 -0
  753. package/src/resources/extensions/gsd/model-cost-table.ts +3 -1
  754. package/src/resources/extensions/gsd/model-router.ts +25 -6
  755. package/src/resources/extensions/gsd/native-git-bridge.ts +134 -6
  756. package/src/resources/extensions/gsd/notification-overlay.ts +9 -19
  757. package/src/resources/extensions/gsd/notification-widget.ts +25 -43
  758. package/src/resources/extensions/gsd/notifications.ts +6 -0
  759. package/src/resources/extensions/gsd/onboarding-state.ts +146 -0
  760. package/src/resources/extensions/gsd/post-execution-checks.ts +37 -14
  761. package/src/resources/extensions/gsd/pre-execution-checks.ts +106 -12
  762. package/src/resources/extensions/gsd/preferences-models.ts +1 -0
  763. package/src/resources/extensions/gsd/preferences-types.ts +10 -2
  764. package/src/resources/extensions/gsd/preferences-validation.ts +33 -7
  765. package/src/resources/extensions/gsd/preferences.ts +10 -10
  766. package/src/resources/extensions/gsd/prompts/add-tests.md +1 -0
  767. package/src/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
  768. package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  769. package/src/resources/extensions/gsd/prompts/debug-diagnose.md +27 -0
  770. package/src/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
  771. package/src/resources/extensions/gsd/prompts/execute-task.md +16 -3
  772. package/src/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  773. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  774. package/src/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  775. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -0
  776. package/src/resources/extensions/gsd/prompts/scan.md +79 -0
  777. package/src/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
  778. package/src/resources/extensions/gsd/python-resolver.ts +76 -0
  779. package/src/resources/extensions/gsd/run-manager.ts +53 -19
  780. package/src/resources/extensions/gsd/setup-catalog.ts +105 -0
  781. package/src/resources/extensions/gsd/state.ts +95 -6
  782. package/src/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
  783. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +1 -34
  784. package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +7 -0
  785. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +49 -0
  786. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +45 -31
  787. package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +63 -0
  788. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +95 -1
  789. package/src/resources/extensions/gsd/tests/auto-prompts-fallback.test.ts +35 -0
  790. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +123 -1
  791. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +39 -0
  792. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +39 -0
  793. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +98 -0
  794. package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +54 -0
  795. package/src/resources/extensions/gsd/tests/commands-do.test.ts +48 -0
  796. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +335 -21
  797. package/src/resources/extensions/gsd/tests/commands-scan.test.ts +351 -0
  798. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +8 -6
  799. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +6 -8
  800. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  801. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +63 -0
  802. package/src/resources/extensions/gsd/tests/debug-command-handler.test.ts +905 -0
  803. package/src/resources/extensions/gsd/tests/debug-command-lifecycle.integration.test.ts +1229 -0
  804. package/src/resources/extensions/gsd/tests/debug-session-store.test.ts +565 -0
  805. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +42 -0
  806. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +8 -4
  807. package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +64 -0
  808. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +67 -0
  809. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +175 -17
  810. package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +5 -0
  811. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +306 -1
  812. package/src/resources/extensions/gsd/tests/escalation.test.ts +818 -0
  813. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +29 -12
  814. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +145 -8
  815. package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +74 -0
  816. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +62 -0
  817. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +0 -4
  818. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -1
  819. package/src/resources/extensions/gsd/tests/health-widget.test.ts +8 -2
  820. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +190 -0
  821. package/src/resources/extensions/gsd/tests/integration/doctor-git-symlink-cwd.test.ts +90 -0
  822. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +117 -0
  823. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +44 -0
  824. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +68 -1
  825. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +109 -11
  826. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +51 -0
  827. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +2 -2
  828. package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
  829. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +1 -1
  830. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +206 -1
  831. package/src/resources/extensions/gsd/tests/load-memory-block.test.ts +36 -0
  832. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  833. package/src/resources/extensions/gsd/tests/memory-embeddings.test.ts +213 -0
  834. package/src/resources/extensions/gsd/tests/memory-ingest.test.ts +153 -0
  835. package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +107 -0
  836. package/src/resources/extensions/gsd/tests/memory-relations.test.ts +175 -0
  837. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  838. package/src/resources/extensions/gsd/tests/memory-tools.test.ts +295 -0
  839. package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +3 -2
  840. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +2 -2
  841. package/src/resources/extensions/gsd/tests/model-router.test.ts +51 -1
  842. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +59 -0
  843. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +56 -37
  844. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +1 -1
  845. package/src/resources/extensions/gsd/tests/onboarding-state.test.ts +105 -0
  846. package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +114 -0
  847. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +4 -5
  848. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +17 -0
  849. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -1
  850. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +341 -6
  851. package/src/resources/extensions/gsd/tests/preferences.test.ts +69 -1
  852. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +539 -0
  853. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +11 -2
  854. package/src/resources/extensions/gsd/tests/projection-regression.test.ts +7 -0
  855. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +159 -8
  856. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +24 -0
  857. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +1 -1
  858. package/src/resources/extensions/gsd/tests/prompts-no-gitignored-test-refs.test.ts +56 -0
  859. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +88 -4
  860. package/src/resources/extensions/gsd/tests/python-resolver.test.ts +131 -0
  861. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +67 -0
  862. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +107 -0
  863. package/src/resources/extensions/gsd/tests/requirements.test.ts +9 -0
  864. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +153 -0
  865. package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +125 -0
  866. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +16 -4
  867. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +54 -0
  868. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -0
  869. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +15 -0
  870. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +5 -0
  871. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +2 -1
  872. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +31 -1
  873. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +166 -0
  874. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +9 -3
  875. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +35 -0
  876. package/src/resources/extensions/gsd/tests/workflow-install.test.ts +113 -0
  877. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +15 -6
  878. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  879. package/src/resources/extensions/gsd/tests/workflow-plugins.test.ts +310 -0
  880. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +7 -0
  881. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +8 -2
  882. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +97 -0
  883. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +2 -1
  884. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +77 -2
  885. package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
  886. package/src/resources/extensions/gsd/tools/memory-tools.ts +410 -0
  887. package/src/resources/extensions/gsd/tools/plan-milestone.ts +42 -8
  888. package/src/resources/extensions/gsd/tools/plan-slice.ts +6 -1
  889. package/src/resources/extensions/gsd/tools/skip-slice.ts +133 -0
  890. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +14 -0
  891. package/src/resources/extensions/gsd/types.ts +62 -0
  892. package/src/resources/extensions/gsd/unit-runtime.ts +1 -0
  893. package/src/resources/extensions/gsd/uok/contracts.ts +2 -1
  894. package/src/resources/extensions/gsd/uok/flags.ts +7 -7
  895. package/src/resources/extensions/gsd/uok/kernel.ts +16 -4
  896. package/src/resources/extensions/gsd/verification-gate.ts +2 -1
  897. package/src/resources/extensions/gsd/workflow-dispatch.ts +106 -0
  898. package/src/resources/extensions/gsd/workflow-install.ts +423 -0
  899. package/src/resources/extensions/gsd/workflow-logger.ts +4 -1
  900. package/src/resources/extensions/gsd/workflow-manifest.ts +8 -0
  901. package/src/resources/extensions/gsd/workflow-mcp.ts +1 -6
  902. package/src/resources/extensions/gsd/workflow-plugins.ts +403 -0
  903. package/src/resources/extensions/gsd/workflow-projections.ts +18 -16
  904. package/src/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
  905. package/src/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
  906. package/src/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
  907. package/src/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
  908. package/src/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
  909. package/src/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
  910. package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
  911. package/src/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
  912. package/src/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
  913. package/src/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
  914. package/src/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
  915. package/src/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
  916. package/src/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
  917. package/src/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
  918. package/src/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
  919. package/src/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
  920. package/src/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
  921. package/src/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
  922. package/src/resources/extensions/gsd/workflow-templates/registry.json +184 -0
  923. package/src/resources/extensions/gsd/workflow-templates/release.md +118 -0
  924. package/src/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
  925. package/src/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
  926. package/src/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
  927. package/src/resources/extensions/gsd/workflow-templates/spike.md +7 -0
  928. package/src/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
  929. package/src/resources/extensions/gsd/workflow-templates.ts +7 -0
  930. package/src/resources/extensions/gsd/workspace-index.ts +9 -4
  931. package/src/resources/extensions/gsd/worktree-resolver.ts +47 -1
  932. package/src/resources/extensions/remote-questions/commands.ts +480 -0
  933. package/src/resources/extensions/remote-questions/manager.ts +49 -4
  934. package/src/resources/extensions/remote-questions/telegram-adapter.ts +86 -4
  935. package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +246 -0
  936. package/src/resources/extensions/remote-questions/tests/remote-answer-normalization.test.ts +92 -0
  937. package/src/resources/extensions/remote-questions/tests/telegram-commands.test.ts +267 -0
  938. package/src/resources/extensions/search-the-web/command-search-provider.ts +5 -1
  939. package/src/resources/extensions/search-the-web/native-search.ts +50 -4
  940. package/src/resources/extensions/shared/interview-ui.ts +195 -1
  941. package/src/resources/extensions/shared/layout-utils.ts +26 -0
  942. package/src/resources/extensions/shared/rtk-shared.ts +58 -0
  943. package/src/resources/extensions/shared/rtk.ts +12 -52
  944. package/src/resources/extensions/shared/tests/interview-preview.test.ts +177 -0
  945. package/src/resources/extensions/shared/tests/preview-layout.test.ts +120 -0
  946. package/src/resources/skills/api-design/SKILL.md +190 -0
  947. package/src/resources/skills/create-mcp-server/SKILL.md +121 -0
  948. package/src/resources/skills/create-workflow/SKILL.md +33 -6
  949. package/src/resources/skills/decompose-into-slices/SKILL.md +139 -0
  950. package/src/resources/skills/dependency-upgrade/SKILL.md +158 -0
  951. package/src/resources/skills/design-an-interface/SKILL.md +102 -0
  952. package/src/resources/skills/forensics/SKILL.md +153 -0
  953. package/src/resources/skills/grill-me/SKILL.md +93 -0
  954. package/src/resources/skills/handoff/SKILL.md +121 -0
  955. package/src/resources/skills/observability/SKILL.md +174 -0
  956. package/src/resources/skills/security-review/SKILL.md +181 -0
  957. package/src/resources/skills/spike-wrap-up/SKILL.md +138 -0
  958. package/src/resources/skills/tdd/SKILL.md +112 -0
  959. package/src/resources/skills/verify-before-complete/SKILL.md +97 -0
  960. package/src/resources/skills/write-docs/SKILL.md +81 -0
  961. package/src/resources/skills/write-milestone-brief/SKILL.md +135 -0
  962. package/dist/web/standalone/.next/static/chunks/2826.dd3dc8bbd3025fa5.js +0 -9
  963. package/dist/web/standalone/.next/static/chunks/app/page-7115e62689b5fd84.js +0 -1
  964. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  965. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  966. package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
  967. package/packages/native/dist/ps/types.d.ts +0 -5
  968. package/packages/native/dist/ps/types.js +0 -2
  969. package/packages/native/src/ps/types.ts +0 -5
  970. package/packages/pi-ai/node_modules/@smithy/node-http-handler/LICENSE +0 -201
  971. package/packages/pi-ai/node_modules/@smithy/node-http-handler/README.md +0 -9
  972. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-cjs/index.js +0 -762
  973. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/build-abort-error.js +0 -19
  974. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/constants.js +0 -1
  975. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/get-transformed-headers.js +0 -9
  976. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/index.js +0 -3
  977. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js +0 -230
  978. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-manager.js +0 -87
  979. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-pool.js +0 -32
  980. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-handler.js +0 -169
  981. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/readable.mock.js +0 -21
  982. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/server.mock.js +0 -88
  983. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-connection-timeout.js +0 -36
  984. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-request-timeout.js +0 -21
  985. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-keep-alive.js +0 -22
  986. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-timeout.js +0 -23
  987. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/collector.js +0 -8
  988. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/index.js +0 -41
  989. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/readable.mock.js +0 -21
  990. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/timing.js +0 -4
  991. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/write-request-body.js +0 -63
  992. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/build-abort-error.d.ts +0 -10
  993. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/constants.d.ts +0 -5
  994. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/get-transformed-headers.d.ts +0 -4
  995. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/index.d.ts +0 -3
  996. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http-handler.d.ts +0 -46
  997. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-manager.d.ts +0 -24
  998. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-pool.d.ts +0 -12
  999. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-handler.d.ts +0 -63
  1000. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/readable.mock.d.ts +0 -13
  1001. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/server.mock.d.ts +0 -12
  1002. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-connection-timeout.d.ts +0 -2
  1003. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-request-timeout.d.ts +0 -6
  1004. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-keep-alive.d.ts +0 -6
  1005. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-timeout.d.ts +0 -2
  1006. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/collector.d.ts +0 -5
  1007. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/index.d.ts +0 -6
  1008. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/readable.mock.d.ts +0 -13
  1009. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/timing.d.ts +0 -8
  1010. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/build-abort-error.d.ts +0 -10
  1011. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/constants.d.ts +0 -5
  1012. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/get-transformed-headers.d.ts +0 -4
  1013. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/index.d.ts +0 -3
  1014. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http-handler.d.ts +0 -46
  1015. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-manager.d.ts +0 -24
  1016. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-pool.d.ts +0 -12
  1017. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-handler.d.ts +0 -63
  1018. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/readable.mock.d.ts +0 -13
  1019. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/server.mock.d.ts +0 -12
  1020. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-connection-timeout.d.ts +0 -2
  1021. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-request-timeout.d.ts +0 -6
  1022. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-keep-alive.d.ts +0 -6
  1023. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-timeout.d.ts +0 -2
  1024. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/collector.d.ts +0 -5
  1025. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/index.d.ts +0 -6
  1026. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/readable.mock.d.ts +0 -13
  1027. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/timing.d.ts +0 -8
  1028. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/write-request-body.d.ts +0 -12
  1029. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/write-request-body.d.ts +0 -12
  1030. package/packages/pi-ai/node_modules/@smithy/node-http-handler/package.json +0 -68
  1031. package/packages/pi-ai/oauth.d.ts +0 -1
  1032. package/packages/pi-ai/oauth.js +0 -1
  1033. /package/dist/web/standalone/.next/static/{prkokVQFxWtUVIku57_0z → YnUwu2WWaT0_hyTLUF4nq}/_buildManifest.js +0 -0
  1034. /package/dist/web/standalone/.next/static/{prkokVQFxWtUVIku57_0z → YnUwu2WWaT0_hyTLUF4nq}/_ssgManifest.js +0 -0
@@ -0,0 +1,1229 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { existsSync, mkdtempSync, mkdirSync, readdirSync, rmSync, writeFileSync } from "node:fs";
4
+ import { join } from "node:path";
5
+ import { tmpdir } from "node:os";
6
+
7
+ import { handleGSDCommand } from "../commands/dispatcher.ts";
8
+ import { handleDebug } from "../commands-debug.ts";
9
+ import {
10
+ createDebugSession,
11
+ debugSessionArtifactPath,
12
+ debugSessionsDir,
13
+ loadDebugSession,
14
+ updateDebugSession,
15
+ } from "../debug-session-store.ts";
16
+
17
+ interface DispatchCall {
18
+ payload: any;
19
+ options: any;
20
+ }
21
+
22
+ function createMockPiWithDispatch() {
23
+ const calls: DispatchCall[] = [];
24
+ return {
25
+ calls,
26
+ pi: {
27
+ sendMessage(payload: any, options: any) {
28
+ calls.push({ payload, options });
29
+ },
30
+ },
31
+ };
32
+ }
33
+
34
+ interface MockCtx {
35
+ notifications: Array<{ message: string; level: string }>;
36
+ ui: {
37
+ notify: (message: string, level: string) => void;
38
+ custom: () => Promise<void>;
39
+ };
40
+ shutdown: () => Promise<void>;
41
+ }
42
+
43
+ function makeBase(): string {
44
+ const base = mkdtempSync(join(tmpdir(), "gsd-debug-lifecycle-int-"));
45
+ mkdirSync(join(base, ".gsd"), { recursive: true });
46
+ return base;
47
+ }
48
+
49
+ function createMockCtx(): MockCtx {
50
+ const notifications: Array<{ message: string; level: string }> = [];
51
+ return {
52
+ notifications,
53
+ ui: {
54
+ notify(message: string, level: string) {
55
+ notifications.push({ message, level });
56
+ },
57
+ custom: async () => {},
58
+ },
59
+ shutdown: async () => {},
60
+ };
61
+ }
62
+
63
+ function lastNotification(ctx: MockCtx): { message: string; level: string } {
64
+ assert.ok(ctx.notifications.length > 0, "expected at least one UI notification");
65
+ return ctx.notifications.at(-1)!;
66
+ }
67
+
68
+ test("/gsd debug lifecycle integration covers start/list/status/continue across multiple sessions", async () => {
69
+ const base = makeBase();
70
+ const saved = process.cwd();
71
+ process.chdir(base);
72
+
73
+ try {
74
+ const ctx = createMockCtx();
75
+
76
+ await handleGSDCommand("debug API returns 500 on checkout", ctx as any, {} as any);
77
+ const firstStarted = lastNotification(ctx);
78
+ assert.equal(firstStarted.level, "info");
79
+ assert.match(firstStarted.message, /Debug session started: api-returns-500-on-checkout/);
80
+
81
+ await handleGSDCommand("debug API returns 500 on checkout", ctx as any, {} as any);
82
+ const secondStarted = lastNotification(ctx);
83
+ assert.equal(secondStarted.level, "info");
84
+ assert.match(secondStarted.message, /Debug session started: api-returns-500-on-checkout-2/);
85
+
86
+ await handleGSDCommand("debug Checkout retries spin forever", ctx as any, {} as any);
87
+ const thirdStarted = lastNotification(ctx);
88
+ assert.equal(thirdStarted.level, "info");
89
+ assert.match(thirdStarted.message, /Debug session started: checkout-retries-spin-forever/);
90
+
91
+ const sessionsDir = debugSessionsDir(base);
92
+ const artifacts = readdirSync(sessionsDir).filter(name => name.endsWith(".json")).sort();
93
+ assert.deepEqual(artifacts, [
94
+ "api-returns-500-on-checkout-2.json",
95
+ "api-returns-500-on-checkout.json",
96
+ "checkout-retries-spin-forever.json",
97
+ ]);
98
+
99
+ await handleGSDCommand("debug list", ctx as any, {} as any);
100
+ const listed = lastNotification(ctx);
101
+ assert.equal(listed.level, "info");
102
+ assert.match(listed.message, /Debug sessions:/);
103
+ assert.match(listed.message, /api-returns-500-on-checkout/);
104
+ assert.match(listed.message, /api-returns-500-on-checkout-2/);
105
+ assert.match(listed.message, /checkout-retries-spin-forever/);
106
+ assert.match(listed.message, /mode=debug status=active phase=queued/);
107
+
108
+ await handleGSDCommand("debug status api-returns-500-on-checkout", ctx as any, {} as any);
109
+ const statusBeforeContinue = lastNotification(ctx);
110
+ assert.equal(statusBeforeContinue.level, "info");
111
+ assert.match(statusBeforeContinue.message, /^Debug session status: api-returns-500-on-checkout/m);
112
+ assert.match(statusBeforeContinue.message, /^mode=debug$/m);
113
+ assert.match(statusBeforeContinue.message, /^status=active$/m);
114
+ assert.match(statusBeforeContinue.message, /^phase=queued$/m);
115
+ assert.match(statusBeforeContinue.message, /^updated=\d{4}-\d{2}-\d{2}T/m);
116
+
117
+ await handleGSDCommand("debug continue api-returns-500-on-checkout-2", ctx as any, {} as any);
118
+ const resumed = lastNotification(ctx);
119
+ assert.equal(resumed.level, "info");
120
+ assert.match(resumed.message, /Resumed debug session: api-returns-500-on-checkout-2/);
121
+ assert.match(resumed.message, /status=active/);
122
+ assert.match(resumed.message, /phase=continued/);
123
+
124
+ await handleGSDCommand("debug status api-returns-500-on-checkout-2", ctx as any, {} as any);
125
+ const statusAfterContinue = lastNotification(ctx);
126
+ assert.equal(statusAfterContinue.level, "info");
127
+ assert.match(statusAfterContinue.message, /^phase=continued$/m);
128
+ assert.match(statusAfterContinue.message, /^updated=\d{4}-\d{2}-\d{2}T/m);
129
+ } finally {
130
+ process.chdir(saved);
131
+ rmSync(base, { recursive: true, force: true });
132
+ }
133
+ });
134
+
135
+ test("/gsd debug lifecycle integration handles invalid slugs and malformed artifacts with actionable diagnostics", async () => {
136
+ const base = makeBase();
137
+ const saved = process.cwd();
138
+ process.chdir(base);
139
+
140
+ try {
141
+ const ctx = createMockCtx();
142
+
143
+ await handleGSDCommand("debug Sync bug in checkout", ctx as any, {} as any);
144
+ const started = lastNotification(ctx);
145
+ assert.equal(started.level, "info");
146
+ assert.match(started.message, /Debug session started: sync-bug-in-checkout/);
147
+
148
+ await handleGSDCommand("debug status no-such-session", ctx as any, {} as any);
149
+ const missingStatus = lastNotification(ctx);
150
+ assert.equal(missingStatus.level, "warning");
151
+ assert.match(missingStatus.message, /Unknown debug session slug 'no-such-session'/);
152
+ assert.match(missingStatus.message, /Run \/gsd debug list/);
153
+
154
+ await handleGSDCommand("debug continue no-such-session", ctx as any, {} as any);
155
+ const missingContinue = lastNotification(ctx);
156
+ assert.equal(missingContinue.level, "warning");
157
+ assert.match(missingContinue.message, /Unknown debug session slug 'no-such-session'/);
158
+
159
+ const brokenArtifactPath = debugSessionArtifactPath(base, "broken-session");
160
+ writeFileSync(brokenArtifactPath, "{ definitely-not-valid-json", "utf-8");
161
+
162
+ await handleGSDCommand("debug status broken-session", ctx as any, {} as any);
163
+ const corruptedStatus = lastNotification(ctx);
164
+ assert.equal(corruptedStatus.level, "warning");
165
+ assert.match(corruptedStatus.message, /Unable to load debug session 'broken-session'/);
166
+ assert.match(corruptedStatus.message, /Try \/gsd debug --diagnose broken-session/);
167
+
168
+ await handleGSDCommand("debug list", ctx as any, {} as any);
169
+ const listed = lastNotification(ctx);
170
+ assert.equal(listed.level, "info");
171
+ assert.match(listed.message, /Malformed artifacts: 1/);
172
+ assert.match(listed.message, /broken-session\.json/);
173
+ assert.match(listed.message, /Run \/gsd debug --diagnose for remediation guidance/);
174
+
175
+ await handleGSDCommand("debug --diagnose", ctx as any, {} as any);
176
+ const diagnosed = lastNotification(ctx);
177
+ assert.equal(diagnosed.level, "warning");
178
+ assert.match(diagnosed.message, /Debug session diagnostics:/);
179
+ assert.match(diagnosed.message, /malformedArtifacts=1/);
180
+ assert.match(diagnosed.message, /Remediation: repair\/remove malformed JSON artifacts under \.gsd\/debug\/sessions\//);
181
+ } finally {
182
+ process.chdir(saved);
183
+ rmSync(base, { recursive: true, force: true });
184
+ }
185
+ });
186
+
187
+ test("/gsd debug lifecycle integration keeps session artifacts isolated from debug logs and preserves slug determinism", async () => {
188
+ const base = makeBase();
189
+ const saved = process.cwd();
190
+ process.chdir(base);
191
+
192
+ try {
193
+ const ctx = createMockCtx();
194
+
195
+ const debugDir = join(base, ".gsd", "debug");
196
+ mkdirSync(debugDir, { recursive: true });
197
+ writeFileSync(join(debugDir, "payment-timeout.log"), "log seed\n", "utf-8");
198
+
199
+ await handleGSDCommand("debug Payment timeout", ctx as any, {} as any);
200
+ const firstStarted = lastNotification(ctx);
201
+ assert.equal(firstStarted.level, "info");
202
+ assert.match(firstStarted.message, /Debug session started: payment-timeout/);
203
+
204
+ // Existing .log files must not reserve slug suffixes for session artifacts.
205
+ await handleGSDCommand("debug Payment timeout", ctx as any, {} as any);
206
+ const secondStarted = lastNotification(ctx);
207
+ assert.equal(secondStarted.level, "info");
208
+ assert.match(secondStarted.message, /Debug session started: payment-timeout-2/);
209
+
210
+ assert.equal(existsSync(join(base, ".gsd", "debug", "payment-timeout.json")), false);
211
+ assert.equal(existsSync(join(base, ".gsd", "debug", "sessions", "payment-timeout.json")), true);
212
+ assert.equal(existsSync(join(base, ".gsd", "debug", "sessions", "payment-timeout-2.json")), true);
213
+
214
+ await handleGSDCommand("logs debug", ctx as any, {} as any);
215
+ const logsListed = lastNotification(ctx);
216
+ assert.equal(logsListed.level, "info");
217
+ assert.match(logsListed.message, /Debug Logs \(\.gsd\/debug\/\):/);
218
+ assert.match(logsListed.message, /payment-timeout\.log/);
219
+ assert.doesNotMatch(logsListed.message, /payment-timeout\.json/);
220
+
221
+ await handleGSDCommand("debug list", ctx as any, {} as any);
222
+ const sessionsListed = lastNotification(ctx);
223
+ assert.equal(sessionsListed.level, "info");
224
+ assert.match(sessionsListed.message, /payment-timeout/);
225
+ assert.match(sessionsListed.message, /payment-timeout-2/);
226
+ assert.match(sessionsListed.message, /mode=debug status=active phase=queued/);
227
+ } finally {
228
+ process.chdir(saved);
229
+ rmSync(base, { recursive: true, force: true });
230
+ }
231
+ });
232
+
233
+ test("/gsd debug --diagnose <issue> dispatches find_root_cause_only goal and records mode=diagnose session", async () => {
234
+ const base = makeBase();
235
+ const saved = process.cwd();
236
+ process.chdir(base);
237
+
238
+ try {
239
+ const ctx = createMockCtx();
240
+ const { calls, pi } = createMockPiWithDispatch();
241
+
242
+ await handleDebug("--diagnose auth token rotation breaks sessions", ctx as any, pi as any);
243
+
244
+ const n = lastNotification(ctx);
245
+ assert.equal(n.level, "info");
246
+ assert.match(n.message, /Diagnose session started:/);
247
+ assert.match(n.message, /mode=diagnose/);
248
+ assert.match(n.message, /dispatchMode=find_root_cause_only/);
249
+
250
+ assert.equal(calls.length, 1, "should dispatch exactly one message");
251
+ const call = calls[0];
252
+ assert.equal(call.payload.customType, "gsd-debug-diagnose");
253
+ assert.match(call.payload.content, /find_root_cause_only/);
254
+ assert.match(call.payload.content, /auth token rotation breaks sessions/i);
255
+ assert.equal(call.options.triggerTurn, true);
256
+ } finally {
257
+ process.chdir(saved);
258
+ rmSync(base, { recursive: true, force: true });
259
+ }
260
+ });
261
+
262
+ test("/gsd debug continue <slug> dispatches find_and_fix goal scoped to target slug", async () => {
263
+ const base = makeBase();
264
+ const saved = process.cwd();
265
+ process.chdir(base);
266
+
267
+ try {
268
+ const ctx = createMockCtx();
269
+ const { calls, pi } = createMockPiWithDispatch();
270
+
271
+ // Start two sessions so we can verify continue targets only the right one.
272
+ await handleDebug("Race condition in payment handler", ctx as any, {} as any);
273
+ await handleDebug("Stale cache on checkout", ctx as any, {} as any);
274
+
275
+ calls.length = 0; // reset — only created without pi dispatch above
276
+
277
+ await handleDebug("continue race-condition-in-payment-handler", ctx as any, pi as any);
278
+
279
+ const n = lastNotification(ctx);
280
+ assert.equal(n.level, "info");
281
+ assert.match(n.message, /Resumed debug session: race-condition-in-payment-handler/);
282
+ assert.match(n.message, /phase=continued/);
283
+ assert.match(n.message, /dispatchMode=find_and_fix/);
284
+
285
+ assert.equal(calls.length, 1, "should dispatch exactly one message");
286
+ const call = calls[0];
287
+ assert.equal(call.payload.customType, "gsd-debug-continue");
288
+ assert.match(call.payload.content, /find_and_fix/);
289
+ // Content must reference the target slug, not the other session.
290
+ assert.match(call.payload.content, /race-condition-in-payment-handler/);
291
+ assert.doesNotMatch(call.payload.content, /stale-cache-on-checkout/);
292
+ assert.equal(call.options.triggerTurn, true);
293
+ } finally {
294
+ process.chdir(saved);
295
+ rmSync(base, { recursive: true, force: true });
296
+ }
297
+ });
298
+
299
+ test("/gsd debug --diagnose (zero-arg) with no pi still reports malformed artifact counts without dispatch", async () => {
300
+ const base = makeBase();
301
+ const saved = process.cwd();
302
+ process.chdir(base);
303
+
304
+ try {
305
+ const ctx = createMockCtx();
306
+ const { calls, pi } = createMockPiWithDispatch();
307
+
308
+ // Inject two broken artifacts.
309
+ const sessionsDir = debugSessionsDir(base);
310
+ mkdirSync(sessionsDir, { recursive: true });
311
+ writeFileSync(join(sessionsDir, "broken-a.json"), "{bad json", "utf-8");
312
+ writeFileSync(join(sessionsDir, "broken-b.json"), "null", "utf-8");
313
+
314
+ // Zero-arg --diagnose via dispatcher (no pi) — dispatch should NOT fire.
315
+ await handleGSDCommand("debug --diagnose", ctx as any, {} as any);
316
+
317
+ const n = lastNotification(ctx);
318
+ assert.equal(n.level, "warning");
319
+ assert.match(n.message, /Debug session diagnostics:/);
320
+ assert.match(n.message, /malformedArtifacts=2/);
321
+ assert.match(n.message, /Remediation:/);
322
+
323
+ // Now confirm no dispatch occurred even with pi present (zero-arg diagnose is advisory only).
324
+ await handleDebug("--diagnose", ctx as any, pi as any);
325
+ assert.equal(calls.length, 0, "zero-arg --diagnose must not dispatch even with pi present");
326
+ } finally {
327
+ process.chdir(saved);
328
+ rmSync(base, { recursive: true, force: true });
329
+ }
330
+ });
331
+
332
+ test("/gsd debug negative: continue unknown slug emits warning, continue resolved session emits warning", async () => {
333
+ const base = makeBase();
334
+ const saved = process.cwd();
335
+ process.chdir(base);
336
+
337
+ try {
338
+ const ctx = createMockCtx();
339
+ const { calls, pi } = createMockPiWithDispatch();
340
+
341
+ // Continue on non-existent slug.
342
+ await handleDebug("continue totally-nonexistent-slug", ctx as any, pi as any);
343
+ const notFound = lastNotification(ctx);
344
+ assert.equal(notFound.level, "warning");
345
+ assert.match(notFound.message, /Unknown debug session slug 'totally-nonexistent-slug'/);
346
+ assert.equal(calls.length, 0, "no dispatch for unknown slug");
347
+
348
+ // Start and manually check that invalid 2-token status (missing slug) emits error, not usage.
349
+ await handleDebug("status", ctx as any, {} as any);
350
+ const noSlug = lastNotification(ctx);
351
+ assert.equal(noSlug.level, "warning");
352
+ assert.match(noSlug.message, /Missing slug/);
353
+ } finally {
354
+ process.chdir(saved);
355
+ rmSync(base, { recursive: true, force: true });
356
+ }
357
+ });
358
+
359
+ test("/gsd debug negative: multiple sessions with similar slugs — status and continue target exact match only", async () => {
360
+ const base = makeBase();
361
+ const saved = process.cwd();
362
+ process.chdir(base);
363
+
364
+ try {
365
+ const ctx = createMockCtx();
366
+
367
+ await handleGSDCommand("debug Login token expires", ctx as any, {} as any);
368
+ await handleGSDCommand("debug Login token expires too fast", ctx as any, {} as any);
369
+
370
+ // list to confirm two distinct slugs exist.
371
+ await handleGSDCommand("debug list", ctx as any, {} as any);
372
+ const listed = lastNotification(ctx);
373
+ assert.match(listed.message, /login-token-expires\b/);
374
+ assert.match(listed.message, /login-token-expires-too-fast\b/);
375
+
376
+ // status on base slug must not accidentally describe the suffixed one.
377
+ await handleGSDCommand("debug status login-token-expires", ctx as any, {} as any);
378
+ const baseStatus = lastNotification(ctx);
379
+ assert.match(baseStatus.message, /^Debug session status: login-token-expires$/m);
380
+ assert.doesNotMatch(baseStatus.message, /login-token-expires-too-fast/);
381
+
382
+ // status on suffixed slug must describe that one.
383
+ await handleGSDCommand("debug status login-token-expires-too-fast", ctx as any, {} as any);
384
+ const suffixedStatus = lastNotification(ctx);
385
+ assert.match(suffixedStatus.message, /^Debug session status: login-token-expires-too-fast$/m);
386
+ } finally {
387
+ process.chdir(saved);
388
+ rmSync(base, { recursive: true, force: true });
389
+ }
390
+ });
391
+
392
+ // ── S03 tests: checkpoint/TDD gate dispatch and backward compat ──────────────
393
+
394
+ test("/gsd debug S03: checkpoint resume dispatches enriched payload via debug-session-manager template", async () => {
395
+ const base = makeBase();
396
+ const saved = process.cwd();
397
+ process.chdir(base);
398
+
399
+ try {
400
+ const ctx = createMockCtx();
401
+ const { calls, pi } = createMockPiWithDispatch();
402
+
403
+ const created = createDebugSession(base, { issue: "Login fails after deploy" });
404
+ const slug = created.session.slug;
405
+
406
+ updateDebugSession(base, slug, {
407
+ checkpoint: {
408
+ type: "human-verify",
409
+ summary: "Verify fix on staging",
410
+ awaitingResponse: true,
411
+ },
412
+ });
413
+
414
+ await handleDebug(`continue ${slug}`, ctx as any, pi as any);
415
+
416
+ const n = lastNotification(ctx);
417
+ assert.equal(n.level, "info");
418
+ assert.match(n.message, new RegExp(`Resumed debug session: ${slug}`));
419
+ assert.match(n.message, /phase=continued/);
420
+ assert.match(n.message, /dispatchMode=checkpointType=human-verify/);
421
+
422
+ assert.equal(calls.length, 1, "should dispatch exactly one message");
423
+ const call = calls[0];
424
+ assert.equal(call.payload.customType, "gsd-debug-continue");
425
+ // debug-session-manager template marker (absent from debug-diagnose)
426
+ assert.match(call.payload.content, /Structured Return Protocol/);
427
+ // Checkpoint context embedded
428
+ assert.match(call.payload.content, /## Active Checkpoint/);
429
+ assert.match(call.payload.content, /type: human-verify/);
430
+ assert.match(call.payload.content, /summary: Verify fix on staging/);
431
+ assert.match(call.payload.content, /awaitingResponse: true/);
432
+ assert.equal(call.options.triggerTurn, true);
433
+ } finally {
434
+ process.chdir(saved);
435
+ rmSync(base, { recursive: true, force: true });
436
+ }
437
+ });
438
+
439
+ test("/gsd debug S03: TDD gate pending dispatches find_root_cause_only with TDD instructions", async () => {
440
+ const base = makeBase();
441
+ const saved = process.cwd();
442
+ process.chdir(base);
443
+
444
+ try {
445
+ const ctx = createMockCtx();
446
+ const { calls, pi } = createMockPiWithDispatch();
447
+
448
+ const created = createDebugSession(base, { issue: "Auth refresh races on mobile" });
449
+ const slug = created.session.slug;
450
+
451
+ updateDebugSession(base, slug, {
452
+ tddGate: { enabled: true, phase: "pending" },
453
+ });
454
+
455
+ await handleDebug(`continue ${slug}`, ctx as any, pi as any);
456
+
457
+ const n = lastNotification(ctx);
458
+ assert.equal(n.level, "info");
459
+ assert.match(n.message, new RegExp(`Resumed debug session: ${slug}`));
460
+ assert.match(n.message, /dispatchMode=tddPhase=pending/);
461
+
462
+ assert.equal(calls.length, 1, "should dispatch exactly one message");
463
+ const call = calls[0];
464
+ assert.equal(call.payload.customType, "gsd-debug-continue");
465
+ // Active goal must be find_root_cause_only (not find_and_fix)
466
+ assert.match(call.payload.content, /## Goal\s+`find_root_cause_only`/);
467
+ assert.doesNotMatch(call.payload.content, /## Goal\s+`find_and_fix`/);
468
+ // TDD gate section present
469
+ assert.match(call.payload.content, /## TDD Gate/);
470
+ assert.match(call.payload.content, /phase: pending/);
471
+ assert.match(call.payload.content, /TDD mode is active/);
472
+ // debug-session-manager template marker
473
+ assert.match(call.payload.content, /Structured Return Protocol/);
474
+ assert.equal(call.options.triggerTurn, true);
475
+ } finally {
476
+ process.chdir(saved);
477
+ rmSync(base, { recursive: true, force: true });
478
+ }
479
+ });
480
+
481
+ test("/gsd debug S03: TDD gate red dispatches find_and_fix and advances phase to green", async () => {
482
+ const base = makeBase();
483
+ const saved = process.cwd();
484
+ process.chdir(base);
485
+
486
+ try {
487
+ const ctx = createMockCtx();
488
+ const { calls, pi } = createMockPiWithDispatch();
489
+
490
+ const created = createDebugSession(base, { issue: "Auth token expiry not handled" });
491
+ const slug = created.session.slug;
492
+
493
+ updateDebugSession(base, slug, {
494
+ tddGate: {
495
+ enabled: true,
496
+ phase: "red",
497
+ testFile: "auth.test.ts",
498
+ testName: "rejects expired token",
499
+ },
500
+ });
501
+
502
+ await handleDebug(`continue ${slug}`, ctx as any, pi as any);
503
+
504
+ const n = lastNotification(ctx);
505
+ assert.equal(n.level, "info");
506
+ assert.match(n.message, new RegExp(`Resumed debug session: ${slug}`));
507
+ assert.match(n.message, /dispatchMode=tddPhase=red/);
508
+
509
+ assert.equal(calls.length, 1, "should dispatch exactly one message");
510
+ const call = calls[0];
511
+ assert.equal(call.payload.customType, "gsd-debug-continue");
512
+ assert.match(call.payload.content, /## Goal\s+`find_and_fix`/);
513
+ assert.match(call.payload.content, /## TDD Gate/);
514
+ assert.match(call.payload.content, /phase: red/);
515
+ assert.match(call.payload.content, /testFile: auth\.test\.ts/);
516
+ assert.match(call.payload.content, /testName: rejects expired token/);
517
+ assert.equal(call.options.triggerTurn, true);
518
+
519
+ // Reload artifact from disk and verify tddGate.phase advanced to green
520
+ const reloaded = loadDebugSession(base, slug);
521
+ assert.ok(reloaded, "session should still exist after continue");
522
+ assert.equal(reloaded!.session.tddGate?.phase, "green", "tddGate.phase must advance red→green");
523
+ assert.equal(reloaded!.session.phase, "continued");
524
+ } finally {
525
+ process.chdir(saved);
526
+ rmSync(base, { recursive: true, force: true });
527
+ }
528
+ });
529
+
530
+ test("/gsd debug S03: backward compat — legacy session without checkpoint/TDD uses debug-diagnose template", async () => {
531
+ const base = makeBase();
532
+ const saved = process.cwd();
533
+ process.chdir(base);
534
+
535
+ try {
536
+ const ctx = createMockCtx();
537
+ const { calls, pi } = createMockPiWithDispatch();
538
+
539
+ // S02-era session — no checkpoint, no tddGate fields set
540
+ const created = createDebugSession(base, { issue: "Payment retries hang indefinitely" });
541
+ const slug = created.session.slug;
542
+
543
+ await handleDebug(`continue ${slug}`, ctx as any, pi as any);
544
+
545
+ const n = lastNotification(ctx);
546
+ assert.equal(n.level, "info");
547
+ assert.match(n.message, new RegExp(`Resumed debug session: ${slug}`));
548
+ assert.match(n.message, /phase=continued/);
549
+ assert.match(n.message, /dispatchMode=find_and_fix/);
550
+
551
+ assert.equal(calls.length, 1, "should dispatch exactly one message");
552
+ const call = calls[0];
553
+ assert.equal(call.payload.customType, "gsd-debug-continue");
554
+ // debug-diagnose template: no Structured Return Protocol, no checkpoint/TDD sections
555
+ assert.doesNotMatch(call.payload.content, /Structured Return Protocol/);
556
+ assert.doesNotMatch(call.payload.content, /## Active Checkpoint/);
557
+ assert.doesNotMatch(call.payload.content, /## TDD Gate/);
558
+ assert.match(call.payload.content, /find_and_fix/);
559
+ assert.equal(call.options.triggerTurn, true);
560
+ } finally {
561
+ process.chdir(saved);
562
+ rmSync(base, { recursive: true, force: true });
563
+ }
564
+ });
565
+
566
+ test("/gsd debug S03: round-trip — checkpoint with userResponse dispatches response and session transitions to continued", async () => {
567
+ const base = makeBase();
568
+ const saved = process.cwd();
569
+ process.chdir(base);
570
+
571
+ try {
572
+ const ctx = createMockCtx();
573
+ const { calls, pi } = createMockPiWithDispatch();
574
+
575
+ const created = createDebugSession(base, { issue: "Cache invalidation race on deploy" });
576
+ const slug = created.session.slug;
577
+
578
+ // Simulate agent setting checkpoint, then user providing a response
579
+ updateDebugSession(base, slug, {
580
+ checkpoint: {
581
+ type: "human-verify",
582
+ summary: "Check whether stale keys appear after deploy",
583
+ awaitingResponse: true,
584
+ userResponse: "Confirmed on staging",
585
+ },
586
+ });
587
+
588
+ await handleDebug(`continue ${slug}`, ctx as any, pi as any);
589
+
590
+ const n = lastNotification(ctx);
591
+ assert.equal(n.level, "info");
592
+ assert.match(n.message, new RegExp(`Resumed debug session: ${slug}`));
593
+ assert.match(n.message, /phase=continued/);
594
+
595
+ assert.equal(calls.length, 1, "should dispatch exactly one message");
596
+ const call = calls[0];
597
+ assert.equal(call.payload.customType, "gsd-debug-continue");
598
+ // userResponse embedded in DATA_START/DATA_END security wrapper
599
+ assert.match(call.payload.content, /DATA_START/);
600
+ assert.match(call.payload.content, /Confirmed on staging/);
601
+ assert.match(call.payload.content, /DATA_END/);
602
+ assert.equal(call.options.triggerTurn, true);
603
+
604
+ // Verify session state persisted to disk after continue
605
+ const reloaded = loadDebugSession(base, slug);
606
+ assert.ok(reloaded, "session should still exist");
607
+ assert.equal(reloaded!.session.phase, "continued");
608
+ assert.equal(reloaded!.session.status, "active");
609
+ } finally {
610
+ process.chdir(saved);
611
+ rmSync(base, { recursive: true, force: true });
612
+ }
613
+ });
614
+
615
+ // ── S04 tests: specialist review dispatch and disk-reload verification ────────
616
+
617
+ test("/gsd debug S04: specialist review round-trip through continue dispatch", async () => {
618
+ const base = makeBase();
619
+ const saved = process.cwd();
620
+ process.chdir(base);
621
+
622
+ try {
623
+ const ctx = createMockCtx();
624
+ const { calls, pi } = createMockPiWithDispatch();
625
+
626
+ const created = createDebugSession(base, { issue: "Unsafe type assertion in auth flow" });
627
+ const slug = created.session.slug;
628
+
629
+ // Need checkpoint to trigger debug-session-manager template (which includes specialistContext)
630
+ updateDebugSession(base, slug, {
631
+ checkpoint: {
632
+ type: "human-verify",
633
+ summary: "Verify type guard is safe on all auth paths",
634
+ awaitingResponse: true,
635
+ },
636
+ specialistReview: {
637
+ hint: "typescript",
638
+ skill: "typescript-expert",
639
+ verdict: "SUGGEST_CHANGE (use type guard)",
640
+ detail: "The current implementation uses unsafe type assertion",
641
+ reviewedAt: 1700000000000,
642
+ },
643
+ });
644
+
645
+ await handleDebug(`continue ${slug}`, ctx as any, pi as any);
646
+
647
+ const n = lastNotification(ctx);
648
+ assert.equal(n.level, "info");
649
+ assert.match(n.message, new RegExp(`Resumed debug session: ${slug}`));
650
+ assert.match(n.message, /phase=continued/);
651
+ // Notification must carry specialistHint label
652
+ assert.match(n.message, /specialistHint=typescript/);
653
+
654
+ assert.equal(calls.length, 1, "should dispatch exactly one message");
655
+ const call = calls[0];
656
+ assert.equal(call.payload.customType, "gsd-debug-continue");
657
+ // debug-session-manager template marker confirms correct template was used
658
+ assert.match(call.payload.content, /Structured Return Protocol/);
659
+ // Specialist context embedded in payload
660
+ assert.match(call.payload.content, /Prior Specialist Review/);
661
+ assert.match(call.payload.content, /hint: typescript/);
662
+ assert.match(call.payload.content, /SUGGEST_CHANGE \(use type guard\)/);
663
+ assert.match(call.payload.content, /The current implementation uses unsafe type assertion/);
664
+ assert.equal(call.options.triggerTurn, true);
665
+ } finally {
666
+ process.chdir(saved);
667
+ rmSync(base, { recursive: true, force: true });
668
+ }
669
+ });
670
+
671
+ test("/gsd debug S04: backward compat — session without specialistReview continues normally", async () => {
672
+ const base = makeBase();
673
+ const saved = process.cwd();
674
+ process.chdir(base);
675
+
676
+ try {
677
+ const ctx = createMockCtx();
678
+ const { calls, pi } = createMockPiWithDispatch();
679
+
680
+ // Checkpoint-only session — triggers debug-session-manager but has NO specialistReview
681
+ const created = createDebugSession(base, { issue: "Memory leak in event bus" });
682
+ const slug = created.session.slug;
683
+
684
+ updateDebugSession(base, slug, {
685
+ checkpoint: {
686
+ type: "human-verify",
687
+ summary: "Confirm leak disappears after fix",
688
+ awaitingResponse: true,
689
+ },
690
+ });
691
+
692
+ await handleDebug(`continue ${slug}`, ctx as any, pi as any);
693
+
694
+ const n = lastNotification(ctx);
695
+ assert.equal(n.level, "info");
696
+ assert.match(n.message, new RegExp(`Resumed debug session: ${slug}`));
697
+ assert.match(n.message, /phase=continued/);
698
+ // No specialistHint label in notification
699
+ assert.doesNotMatch(n.message, /specialistHint=/);
700
+
701
+ assert.equal(calls.length, 1, "should dispatch exactly one message");
702
+ const call = calls[0];
703
+ assert.equal(call.payload.customType, "gsd-debug-continue");
704
+ // debug-session-manager template is still used (checkpoint triggers it)
705
+ assert.match(call.payload.content, /Structured Return Protocol/);
706
+ // No specialist context section in payload (template's own Specialist Dispatch docs don't count)
707
+ assert.doesNotMatch(call.payload.content, /Prior Specialist Review/);
708
+ assert.equal(call.options.triggerTurn, true);
709
+ } finally {
710
+ process.chdir(saved);
711
+ rmSync(base, { recursive: true, force: true });
712
+ }
713
+ });
714
+
715
+ test("/gsd debug S04: specialist review persists through continue with disk reload", async () => {
716
+ const base = makeBase();
717
+ const saved = process.cwd();
718
+ process.chdir(base);
719
+
720
+ try {
721
+ const ctx = createMockCtx();
722
+ const { calls, pi } = createMockPiWithDispatch();
723
+
724
+ const created = createDebugSession(base, { issue: "Race condition in payment finalizer" });
725
+ const slug = created.session.slug;
726
+
727
+ // Checkpoint + specialistReview — continue updates status/phase/lastError but must preserve specialistReview
728
+ updateDebugSession(base, slug, {
729
+ checkpoint: {
730
+ type: "root-cause-found",
731
+ summary: "Race between finalizer and GC hook confirmed",
732
+ awaitingResponse: true,
733
+ },
734
+ specialistReview: {
735
+ hint: "typescript",
736
+ skill: "typescript-expert",
737
+ verdict: "LOOKS_GOOD",
738
+ detail: "WeakRef pattern correctly avoids the GC race",
739
+ reviewedAt: 1700000001000,
740
+ },
741
+ });
742
+
743
+ await handleDebug(`continue ${slug}`, ctx as any, pi as any);
744
+
745
+ assert.equal(calls.length, 1, "should dispatch exactly one message");
746
+
747
+ // Reload the artifact from disk and verify specialistReview survived the handler's updateDebugSession call
748
+ const reloaded = loadDebugSession(base, slug);
749
+ assert.ok(reloaded, "session must still exist on disk after continue");
750
+ assert.equal(reloaded!.session.phase, "continued", "phase must be updated to continued");
751
+ assert.equal(reloaded!.session.status, "active", "status must be active");
752
+ assert.ok(reloaded!.session.specialistReview != null, "specialistReview must be preserved (not wiped by continue)");
753
+ assert.equal(reloaded!.session.specialistReview!.hint, "typescript");
754
+ assert.equal(reloaded!.session.specialistReview!.verdict, "LOOKS_GOOD");
755
+ assert.equal(reloaded!.session.specialistReview!.skill, "typescript-expert");
756
+ } finally {
757
+ process.chdir(saved);
758
+ rmSync(base, { recursive: true, force: true });
759
+ }
760
+ });
761
+
762
+ // ── S05 tests: full lifecycle end-to-end parity ──────────────────────────────
763
+
764
+ test("/gsd debug S05: full happy-path lifecycle — start → list → status → continue → resolve → continue-blocked", async () => {
765
+ const base = makeBase();
766
+ const saved = process.cwd();
767
+ process.chdir(base);
768
+
769
+ try {
770
+ const ctx = createMockCtx();
771
+ const { calls, pi } = createMockPiWithDispatch();
772
+
773
+ // 1. Start session
774
+ await handleGSDCommand("debug Widget fails on mobile", ctx as any, {} as any);
775
+ const started = lastNotification(ctx);
776
+ assert.equal(started.level, "info");
777
+ assert.match(started.message, /Debug session started: widget-fails-on-mobile/);
778
+ const slug = "widget-fails-on-mobile";
779
+
780
+ // 2. List shows the new session
781
+ await handleGSDCommand("debug list", ctx as any, {} as any);
782
+ const listed = lastNotification(ctx);
783
+ assert.equal(listed.level, "info");
784
+ assert.match(listed.message, /Debug sessions:/);
785
+ assert.match(listed.message, /widget-fails-on-mobile/);
786
+ assert.match(listed.message, /mode=debug status=active phase=queued/);
787
+
788
+ // 3. Status shows expected fields
789
+ await handleGSDCommand(`debug status ${slug}`, ctx as any, {} as any);
790
+ const status = lastNotification(ctx);
791
+ assert.equal(status.level, "info");
792
+ assert.match(status.message, new RegExp(`^Debug session status: ${slug}`, "m"));
793
+ assert.match(status.message, /^mode=debug$/m);
794
+ assert.match(status.message, /^status=active$/m);
795
+ assert.match(status.message, /^phase=queued$/m);
796
+
797
+ // 4. Continue dispatches find_and_fix goal via debug-diagnose template (no checkpoint/TDD)
798
+ await handleDebug(`continue ${slug}`, ctx as any, pi as any);
799
+ const resumed = lastNotification(ctx);
800
+ assert.equal(resumed.level, "info");
801
+ assert.match(resumed.message, new RegExp(`Resumed debug session: ${slug}`));
802
+ assert.match(resumed.message, /dispatchMode=find_and_fix/);
803
+
804
+ assert.equal(calls.length, 1, "should dispatch exactly one message on continue");
805
+ const call = calls[0];
806
+ assert.equal(call.payload.customType, "gsd-debug-continue");
807
+ assert.match(call.payload.content, /find_and_fix/);
808
+ assert.equal(call.options.triggerTurn, true);
809
+
810
+ // 5. Mark session resolved; clear calls
811
+ updateDebugSession(base, slug, { status: "resolved" });
812
+ calls.length = 0;
813
+
814
+ // 6. Continue on resolved session emits warning and does not dispatch
815
+ await handleDebug(`continue ${slug}`, ctx as any, pi as any);
816
+ const blockedWarning = lastNotification(ctx);
817
+ assert.equal(blockedWarning.level, "warning");
818
+ assert.match(blockedWarning.message, new RegExp(`Session '${slug}' is resolved`));
819
+ assert.equal(calls.length, 0, "no dispatch for resolved session");
820
+ } finally {
821
+ process.chdir(saved);
822
+ rmSync(base, { recursive: true, force: true });
823
+ }
824
+ });
825
+
826
+ test("/gsd debug S05: diagnose-only full lifecycle — start → status(mode=diagnose) → continue uses debug-diagnose template", async () => {
827
+ const base = makeBase();
828
+ const saved = process.cwd();
829
+ process.chdir(base);
830
+
831
+ try {
832
+ const ctx = createMockCtx();
833
+ const { calls, pi } = createMockPiWithDispatch();
834
+
835
+ // 1. Start diagnose session via --diagnose <issue>
836
+ await handleDebug("--diagnose Memory leak in worker pool", ctx as any, pi as any);
837
+ const started = lastNotification(ctx);
838
+ assert.equal(started.level, "info");
839
+ assert.match(started.message, /Diagnose session started:/);
840
+ assert.match(started.message, /mode=diagnose/);
841
+ assert.match(started.message, /dispatchMode=find_root_cause_only/);
842
+
843
+ assert.equal(calls.length, 1, "should dispatch exactly one message on diagnose-start");
844
+ const diagnoseCall = calls[0];
845
+ assert.equal(diagnoseCall.payload.customType, "gsd-debug-diagnose");
846
+ assert.match(diagnoseCall.payload.content, /find_root_cause_only/);
847
+ assert.match(diagnoseCall.payload.content, /Memory leak in worker pool/i);
848
+ assert.equal(diagnoseCall.options.triggerTurn, true);
849
+
850
+ const slug = "memory-leak-in-worker-pool";
851
+
852
+ // 2. Status shows mode=diagnose
853
+ await handleGSDCommand(`debug status ${slug}`, ctx as any, {} as any);
854
+ const status = lastNotification(ctx);
855
+ assert.equal(status.level, "info");
856
+ assert.match(status.message, /^mode=diagnose$/m);
857
+ assert.match(status.message, /^status=active$/m);
858
+
859
+ // 3. Continue with no checkpoint/TDD uses debug-diagnose template (no Structured Return Protocol)
860
+ calls.length = 0;
861
+ await handleDebug(`continue ${slug}`, ctx as any, pi as any);
862
+ const resumed = lastNotification(ctx);
863
+ assert.equal(resumed.level, "info");
864
+ assert.match(resumed.message, new RegExp(`Resumed debug session: ${slug}`));
865
+ assert.match(resumed.message, /dispatchMode=find_and_fix/);
866
+
867
+ assert.equal(calls.length, 1, "should dispatch exactly one message on continue");
868
+ const continueCall = calls[0];
869
+ assert.equal(continueCall.payload.customType, "gsd-debug-continue");
870
+ // debug-diagnose template: no Structured Return Protocol (that marker is debug-session-manager only)
871
+ assert.doesNotMatch(continueCall.payload.content, /Structured Return Protocol/);
872
+ assert.match(continueCall.payload.content, /find_and_fix/);
873
+ assert.equal(continueCall.options.triggerTurn, true);
874
+ } finally {
875
+ process.chdir(saved);
876
+ rmSync(base, { recursive: true, force: true });
877
+ }
878
+ });
879
+
880
+ test("/gsd debug S05: TDD full cycle — pending → red → green with disk-reload verification at each phase", async () => {
881
+ const base = makeBase();
882
+ const saved = process.cwd();
883
+ process.chdir(base);
884
+
885
+ try {
886
+ const ctx = createMockCtx();
887
+ const { calls, pi } = createMockPiWithDispatch();
888
+
889
+ // Create session and set tddGate to pending
890
+ const created = createDebugSession(base, { issue: "Widget state resets on re-render" });
891
+ const slug = created.session.slug;
892
+
893
+ updateDebugSession(base, slug, {
894
+ tddGate: { enabled: true, phase: "pending" },
895
+ });
896
+
897
+ // Continue with pending: goal = find_root_cause_only, tddGate.phase stays pending
898
+ await handleDebug(`continue ${slug}`, ctx as any, pi as any);
899
+ const pendingNotif = lastNotification(ctx);
900
+ assert.match(pendingNotif.message, /dispatchMode=tddPhase=pending/);
901
+
902
+ assert.equal(calls.length, 1);
903
+ const pendingCall = calls[0];
904
+ assert.match(pendingCall.payload.content, /## Goal\s+`find_root_cause_only`/);
905
+ assert.match(pendingCall.payload.content, /phase: pending/);
906
+ assert.match(pendingCall.payload.content, /Structured Return Protocol/);
907
+
908
+ // Disk-reload: tddGate.phase must remain pending (pending does not advance)
909
+ const afterPending = loadDebugSession(base, slug);
910
+ assert.ok(afterPending, "session must exist after pending continue");
911
+ assert.equal(afterPending!.session.tddGate?.phase, "pending", "pending phase must not advance on disk");
912
+ assert.equal(afterPending!.session.phase, "continued");
913
+
914
+ // Advance to red with test metadata
915
+ updateDebugSession(base, slug, {
916
+ tddGate: { enabled: true, phase: "red", testFile: "widget.test.ts", testName: "resets on re-render" },
917
+ });
918
+ calls.length = 0;
919
+
920
+ // Continue with red: goal = find_and_fix, phase advances to green on disk
921
+ await handleDebug(`continue ${slug}`, ctx as any, pi as any);
922
+ const redNotif = lastNotification(ctx);
923
+ assert.match(redNotif.message, /dispatchMode=tddPhase=red/);
924
+
925
+ assert.equal(calls.length, 1);
926
+ const redCall = calls[0];
927
+ assert.match(redCall.payload.content, /## Goal\s+`find_and_fix`/);
928
+ assert.match(redCall.payload.content, /phase: red/);
929
+ assert.match(redCall.payload.content, /testFile: widget\.test\.ts/);
930
+ assert.match(redCall.payload.content, /testName: resets on re-render/);
931
+
932
+ // Disk-reload: tddGate.phase must advance to green
933
+ const afterRed = loadDebugSession(base, slug);
934
+ assert.ok(afterRed, "session must exist after red continue");
935
+ assert.equal(afterRed!.session.tddGate?.phase, "green", "tddGate.phase must advance red→green on disk");
936
+ assert.equal(afterRed!.session.phase, "continued");
937
+
938
+ calls.length = 0;
939
+
940
+ // Continue with green: goal = find_and_fix, notification shows tddPhase=green
941
+ await handleDebug(`continue ${slug}`, ctx as any, pi as any);
942
+ const greenNotif = lastNotification(ctx);
943
+ assert.match(greenNotif.message, /dispatchMode=tddPhase=green/);
944
+
945
+ assert.equal(calls.length, 1);
946
+ const greenCall = calls[0];
947
+ assert.match(greenCall.payload.content, /## Goal\s+`find_and_fix`/);
948
+ assert.match(greenCall.payload.content, /phase: green/);
949
+ } finally {
950
+ process.chdir(saved);
951
+ rmSync(base, { recursive: true, force: true });
952
+ }
953
+ });
954
+
955
+ test("/gsd debug S05: combined checkpoint + specialist review + TDD gate — all three sections present in dispatch payload", async () => {
956
+ const base = makeBase();
957
+ const saved = process.cwd();
958
+ process.chdir(base);
959
+
960
+ try {
961
+ const ctx = createMockCtx();
962
+ const { calls, pi } = createMockPiWithDispatch();
963
+
964
+ const created = createDebugSession(base, { issue: "Widget render loop detected" });
965
+ const slug = created.session.slug;
966
+
967
+ // Set all three enrichment fields simultaneously
968
+ updateDebugSession(base, slug, {
969
+ checkpoint: {
970
+ type: "root-cause-found",
971
+ summary: "Confirmed infinite re-render due to unstable reference",
972
+ awaitingResponse: true,
973
+ },
974
+ specialistReview: {
975
+ hint: "typescript",
976
+ skill: "typescript-expert",
977
+ verdict: "SUGGEST_CHANGE",
978
+ detail: "Use useMemo to stabilize the reference",
979
+ reviewedAt: 1700000002000,
980
+ },
981
+ tddGate: {
982
+ enabled: true,
983
+ phase: "red",
984
+ testFile: "widget.test.ts",
985
+ testName: "does not loop on stable props",
986
+ },
987
+ });
988
+
989
+ await handleDebug(`continue ${slug}`, ctx as any, pi as any);
990
+
991
+ const n = lastNotification(ctx);
992
+ assert.equal(n.level, "info");
993
+ assert.match(n.message, new RegExp(`Resumed debug session: ${slug}`));
994
+ assert.match(n.message, /phase=continued/);
995
+ // Notification must carry both tddPhase and specialistHint labels
996
+ assert.match(n.message, /specialistHint=typescript/);
997
+ assert.match(n.message, /tddPhase=red/);
998
+
999
+ assert.equal(calls.length, 1, "should dispatch exactly one message");
1000
+ const call = calls[0];
1001
+ assert.equal(call.payload.customType, "gsd-debug-continue");
1002
+ // debug-session-manager template marker
1003
+ assert.match(call.payload.content, /Structured Return Protocol/);
1004
+ // Active Checkpoint section
1005
+ assert.match(call.payload.content, /## Active Checkpoint/);
1006
+ assert.match(call.payload.content, /type: root-cause-found/);
1007
+ // Prior Specialist Review section (heading, not content values)
1008
+ assert.match(call.payload.content, /Prior Specialist Review/);
1009
+ assert.match(call.payload.content, /hint: typescript/);
1010
+ // TDD Gate section
1011
+ assert.match(call.payload.content, /## TDD Gate/);
1012
+ assert.match(call.payload.content, /phase: red/);
1013
+ assert.match(call.payload.content, /testFile: widget\.test\.ts/);
1014
+ assert.equal(call.options.triggerTurn, true);
1015
+
1016
+ // Disk-reload: tddGate.phase must advance red→green
1017
+ const reloaded = loadDebugSession(base, slug);
1018
+ assert.ok(reloaded, "session must exist after combined continue");
1019
+ assert.equal(reloaded!.session.tddGate?.phase, "green", "tddGate.phase must advance red→green on disk");
1020
+ assert.equal(reloaded!.session.phase, "continued");
1021
+ // specialistReview must be preserved
1022
+ assert.ok(reloaded!.session.specialistReview != null, "specialistReview must be preserved after continue");
1023
+ assert.equal(reloaded!.session.specialistReview!.hint, "typescript");
1024
+ } finally {
1025
+ process.chdir(saved);
1026
+ rmSync(base, { recursive: true, force: true });
1027
+ }
1028
+ });
1029
+
1030
+ test("/gsd debug S05: multi-session concurrent lifecycle — 3 sessions continue independently and list shows all as continued", async () => {
1031
+ const base = makeBase();
1032
+ const saved = process.cwd();
1033
+ process.chdir(base);
1034
+
1035
+ try {
1036
+ const ctx = createMockCtx();
1037
+
1038
+ // Start 3 sessions via handleGSDCommand
1039
+ await handleGSDCommand("debug Auth token expires silently", ctx as any, {} as any);
1040
+ assert.match(lastNotification(ctx).message, /Debug session started: auth-token-expires-silently/);
1041
+
1042
+ await handleGSDCommand("debug Cache misses on cold start", ctx as any, {} as any);
1043
+ assert.match(lastNotification(ctx).message, /Debug session started: cache-misses-on-cold-start/);
1044
+
1045
+ await handleGSDCommand("debug Payment webhook drops under load", ctx as any, {} as any);
1046
+ assert.match(lastNotification(ctx).message, /Debug session started: payment-webhook-drops-under-load/);
1047
+
1048
+ // Continue each session separately with its own dispatch mock
1049
+ const { calls: calls1, pi: pi1 } = createMockPiWithDispatch();
1050
+ await handleDebug("continue auth-token-expires-silently", ctx as any, pi1 as any);
1051
+ assert.equal(calls1.length, 1, "session 1 should dispatch exactly one message");
1052
+ // Content must reference session 1's slug, not the others
1053
+ assert.match(calls1[0].payload.content, /auth-token-expires-silently/);
1054
+ assert.doesNotMatch(calls1[0].payload.content, /cache-misses-on-cold-start/);
1055
+ assert.doesNotMatch(calls1[0].payload.content, /payment-webhook-drops-under-load/);
1056
+
1057
+ const { calls: calls2, pi: pi2 } = createMockPiWithDispatch();
1058
+ await handleDebug("continue cache-misses-on-cold-start", ctx as any, pi2 as any);
1059
+ assert.equal(calls2.length, 1, "session 2 should dispatch exactly one message");
1060
+ assert.match(calls2[0].payload.content, /cache-misses-on-cold-start/);
1061
+ assert.doesNotMatch(calls2[0].payload.content, /auth-token-expires-silently/);
1062
+
1063
+ const { calls: calls3, pi: pi3 } = createMockPiWithDispatch();
1064
+ await handleDebug("continue payment-webhook-drops-under-load", ctx as any, pi3 as any);
1065
+ assert.equal(calls3.length, 1, "session 3 should dispatch exactly one message");
1066
+ assert.match(calls3[0].payload.content, /payment-webhook-drops-under-load/);
1067
+ assert.doesNotMatch(calls3[0].payload.content, /auth-token-expires-silently/);
1068
+
1069
+ // debug list must show all 3 as phase=continued
1070
+ await handleGSDCommand("debug list", ctx as any, {} as any);
1071
+ const listed = lastNotification(ctx);
1072
+ assert.equal(listed.level, "info");
1073
+ assert.match(listed.message, /auth-token-expires-silently/);
1074
+ assert.match(listed.message, /cache-misses-on-cold-start/);
1075
+ assert.match(listed.message, /payment-webhook-drops-under-load/);
1076
+ assert.match(listed.message, /phase=continued/);
1077
+ } finally {
1078
+ process.chdir(saved);
1079
+ rmSync(base, { recursive: true, force: true });
1080
+ }
1081
+ });
1082
+
1083
+ test("/gsd debug S05: resolved session blocks continue via dispatcher route — warning emitted, zero dispatches", async () => {
1084
+ const base = makeBase();
1085
+ const saved = process.cwd();
1086
+ process.chdir(base);
1087
+
1088
+ try {
1089
+ const ctx = createMockCtx();
1090
+ const { calls, pi } = createMockPiWithDispatch();
1091
+
1092
+ // Start session via handleGSDCommand (dispatcher route)
1093
+ await handleGSDCommand("debug Stale lock file blocks deploy", ctx as any, {} as any);
1094
+ const started = lastNotification(ctx);
1095
+ assert.equal(started.level, "info");
1096
+ assert.match(started.message, /Debug session started: stale-lock-file-blocks-deploy/);
1097
+ const slug = "stale-lock-file-blocks-deploy";
1098
+
1099
+ // Mark as resolved via store API
1100
+ updateDebugSession(base, slug, { status: "resolved" });
1101
+
1102
+ // Attempt continue via dispatcher route (handleGSDCommand, not handleDebug directly)
1103
+ await handleGSDCommand(`debug continue ${slug}`, ctx as any, pi as any);
1104
+
1105
+ const warned = lastNotification(ctx);
1106
+ assert.equal(warned.level, "warning");
1107
+ assert.match(warned.message, new RegExp(`Session '${slug}' is resolved`));
1108
+ // Zero dispatch calls — guard must fire before sendMessage
1109
+ assert.equal(calls.length, 0, "no dispatch for resolved session via dispatcher route");
1110
+ } finally {
1111
+ process.chdir(saved);
1112
+ rmSync(base, { recursive: true, force: true });
1113
+ }
1114
+ });
1115
+
1116
+ test("/gsd debug S05: TDD gate green-phase continue dispatches find_and_fix with green context and 'test is now passing' text", async () => {
1117
+ const base = makeBase();
1118
+ const saved = process.cwd();
1119
+ process.chdir(base);
1120
+
1121
+ try {
1122
+ const ctx = createMockCtx();
1123
+ const { calls, pi } = createMockPiWithDispatch();
1124
+
1125
+ const created = createDebugSession(base, { issue: "Button click handler fires twice" });
1126
+ const slug = created.session.slug;
1127
+
1128
+ // Set tddGate directly to green (simulating that red phase was already completed)
1129
+ updateDebugSession(base, slug, {
1130
+ tddGate: {
1131
+ enabled: true,
1132
+ phase: "green",
1133
+ testFile: "button.test.ts",
1134
+ testName: "fires handler once per click",
1135
+ },
1136
+ });
1137
+
1138
+ await handleDebug(`continue ${slug}`, ctx as any, pi as any);
1139
+
1140
+ const n = lastNotification(ctx);
1141
+ assert.equal(n.level, "info");
1142
+ assert.match(n.message, new RegExp(`Resumed debug session: ${slug}`));
1143
+ assert.match(n.message, /phase=continued/);
1144
+ assert.match(n.message, /dispatchMode=tddPhase=green/);
1145
+
1146
+ assert.equal(calls.length, 1, "should dispatch exactly one message");
1147
+ const call = calls[0];
1148
+ assert.equal(call.payload.customType, "gsd-debug-continue");
1149
+ // find_and_fix goal for green phase
1150
+ assert.match(call.payload.content, /## Goal\s+`find_and_fix`/);
1151
+ // TDD Gate section with green phase
1152
+ assert.match(call.payload.content, /## TDD Gate/);
1153
+ assert.match(call.payload.content, /phase: green/);
1154
+ // "The test is now passing" text emitted by the handler for green phase
1155
+ assert.match(call.payload.content, /The test is now passing/);
1156
+ // test metadata present
1157
+ assert.match(call.payload.content, /testFile: button\.test\.ts/);
1158
+ assert.match(call.payload.content, /testName: fires handler once per click/);
1159
+ assert.equal(call.options.triggerTurn, true);
1160
+
1161
+ // Disk-reload: session persisted correctly
1162
+ const reloaded = loadDebugSession(base, slug);
1163
+ assert.ok(reloaded, "session must exist after green continue");
1164
+ assert.equal(reloaded!.session.phase, "continued");
1165
+ assert.equal(reloaded!.session.tddGate?.phase, "green", "green phase must remain green (no further advance)");
1166
+ } finally {
1167
+ process.chdir(saved);
1168
+ rmSync(base, { recursive: true, force: true });
1169
+ }
1170
+ });
1171
+
1172
+ test("/gsd debug S05: dispatch failure resilience — sendMessage throws, session remains resumable and retry succeeds", async () => {
1173
+ const base = makeBase();
1174
+ const saved = process.cwd();
1175
+ process.chdir(base);
1176
+
1177
+ try {
1178
+ const ctx = createMockCtx();
1179
+
1180
+ // Create session with checkpoint to engage debug-session-manager template
1181
+ const created = createDebugSession(base, { issue: "Payment processor timeout on retry" });
1182
+ const slug = created.session.slug;
1183
+
1184
+ updateDebugSession(base, slug, {
1185
+ checkpoint: {
1186
+ type: "human-verify",
1187
+ summary: "Confirm retry logic terminates",
1188
+ awaitingResponse: true,
1189
+ },
1190
+ });
1191
+
1192
+ // Mock pi whose sendMessage always throws
1193
+ const throwingPi = {
1194
+ sendMessage(_payload: any, _options: any) {
1195
+ throw new Error("Network error: sendMessage failed");
1196
+ },
1197
+ };
1198
+
1199
+ await handleDebug(`continue ${slug}`, ctx as any, throwingPi as any);
1200
+
1201
+ // Warning notification about dispatch failure (emitted after the session-update info notification)
1202
+ const failNotif = lastNotification(ctx);
1203
+ assert.equal(failNotif.level, "warning");
1204
+ assert.match(failNotif.message, /Continue dispatch failed/);
1205
+ assert.match(failNotif.message, new RegExp(slug));
1206
+
1207
+ // Session must be persisted with phase=continued (state is updated before dispatch attempt)
1208
+ const reloaded = loadDebugSession(base, slug);
1209
+ assert.ok(reloaded, "session must still exist on disk after dispatch failure");
1210
+ assert.equal(reloaded!.session.phase, "continued", "phase must be continued despite failed dispatch");
1211
+ assert.equal(reloaded!.session.status, "active");
1212
+
1213
+ // Retry with a working mock pi succeeds
1214
+ const { calls: retryCalls, pi: workingPi } = createMockPiWithDispatch();
1215
+ await handleDebug(`continue ${slug}`, ctx as any, workingPi as any);
1216
+
1217
+ const retryNotif = lastNotification(ctx);
1218
+ assert.equal(retryNotif.level, "info");
1219
+ assert.match(retryNotif.message, new RegExp(`Resumed debug session: ${slug}`));
1220
+
1221
+ assert.equal(retryCalls.length, 1, "retry should dispatch exactly one message");
1222
+ const retryCall = retryCalls[0];
1223
+ assert.equal(retryCall.payload.customType, "gsd-debug-continue");
1224
+ assert.equal(retryCall.options.triggerTurn, true);
1225
+ } finally {
1226
+ process.chdir(saved);
1227
+ rmSync(base, { recursive: true, force: true });
1228
+ }
1229
+ });