gsd-pi 2.75.0-dev.063e5a3 → 2.75.0-dev.b6ad8c5f7

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 (718) hide show
  1. package/README.md +186 -149
  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/extensions/ask-user-questions.js +17 -5
  11. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  12. package/dist/resources/extensions/claude-code-cli/readiness.js +12 -2
  13. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +76 -4
  14. package/dist/resources/extensions/gsd/auto/detect-stuck.js +9 -0
  15. package/dist/resources/extensions/gsd/auto/loop.js +67 -4
  16. package/dist/resources/extensions/gsd/auto/phases.js +70 -47
  17. package/dist/resources/extensions/gsd/auto/resolve.js +1 -1
  18. package/dist/resources/extensions/gsd/auto/run-unit.js +10 -1
  19. package/dist/resources/extensions/gsd/auto/session.js +5 -0
  20. package/dist/resources/extensions/gsd/auto-artifact-paths.js +20 -0
  21. package/dist/resources/extensions/gsd/auto-dashboard.js +15 -7
  22. package/dist/resources/extensions/gsd/auto-dispatch.js +112 -6
  23. package/dist/resources/extensions/gsd/auto-loop.js +1 -1
  24. package/dist/resources/extensions/gsd/auto-model-selection.js +11 -3
  25. package/dist/resources/extensions/gsd/auto-post-unit.js +10 -8
  26. package/dist/resources/extensions/gsd/auto-prompts.js +173 -39
  27. package/dist/resources/extensions/gsd/auto-recovery.js +57 -0
  28. package/dist/resources/extensions/gsd/auto-start.js +5 -3
  29. package/dist/resources/extensions/gsd/auto-verification.js +3 -3
  30. package/dist/resources/extensions/gsd/auto-worktree.js +55 -1
  31. package/dist/resources/extensions/gsd/auto.js +57 -25
  32. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +8 -21
  33. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +45 -23
  34. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +29 -0
  35. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +22 -0
  36. package/dist/resources/extensions/gsd/commands/catalog.js +81 -9
  37. package/dist/resources/extensions/gsd/commands/handlers/core.js +64 -24
  38. package/dist/resources/extensions/gsd/commands/handlers/escalate.js +171 -0
  39. package/dist/resources/extensions/gsd/commands/handlers/onboarding.js +199 -0
  40. package/dist/resources/extensions/gsd/commands/handlers/ops.js +16 -0
  41. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +228 -29
  42. package/dist/resources/extensions/gsd/commands-cmux.js +5 -2
  43. package/dist/resources/extensions/gsd/commands-config.js +5 -0
  44. package/dist/resources/extensions/gsd/commands-debug.js +388 -0
  45. package/dist/resources/extensions/gsd/commands-do.js +1 -0
  46. package/dist/resources/extensions/gsd/commands-extract-learnings.js +233 -75
  47. package/dist/resources/extensions/gsd/commands-handlers.js +21 -2
  48. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +40 -12
  49. package/dist/resources/extensions/gsd/commands-scan.js +94 -0
  50. package/dist/resources/extensions/gsd/commands-workflow-templates.js +101 -2
  51. package/dist/resources/extensions/gsd/custom-workflow-engine.js +74 -54
  52. package/dist/resources/extensions/gsd/db-writer.js +1 -0
  53. package/dist/resources/extensions/gsd/debug-session-store.js +238 -0
  54. package/dist/resources/extensions/gsd/definition-loader.js +7 -0
  55. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -9
  56. package/dist/resources/extensions/gsd/doctor-environment.js +2 -1
  57. package/dist/resources/extensions/gsd/doctor-git-checks.js +5 -1
  58. package/dist/resources/extensions/gsd/doctor-proactive.js +4 -1
  59. package/dist/resources/extensions/gsd/doctor-providers.js +48 -20
  60. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +22 -4
  61. package/dist/resources/extensions/gsd/doctor.js +7 -1
  62. package/dist/resources/extensions/gsd/error-classifier.js +6 -3
  63. package/dist/resources/extensions/gsd/escalation.js +321 -0
  64. package/dist/resources/extensions/gsd/forensics.js +26 -29
  65. package/dist/resources/extensions/gsd/git-service.js +0 -1
  66. package/dist/resources/extensions/gsd/graph.js +26 -2
  67. package/dist/resources/extensions/gsd/gsd-db.js +254 -29
  68. package/dist/resources/extensions/gsd/health-widget-core.js +42 -14
  69. package/dist/resources/extensions/gsd/health-widget.js +7 -4
  70. package/dist/resources/extensions/gsd/init-wizard.js +86 -45
  71. package/dist/resources/extensions/gsd/markdown-renderer.js +5 -5
  72. package/dist/resources/extensions/gsd/metrics.js +1 -0
  73. package/dist/resources/extensions/gsd/model-cost-table.js +3 -1
  74. package/dist/resources/extensions/gsd/model-router.js +16 -6
  75. package/dist/resources/extensions/gsd/native-git-bridge.js +137 -5
  76. package/dist/resources/extensions/gsd/notification-overlay.js +7 -22
  77. package/dist/resources/extensions/gsd/notification-widget.js +24 -39
  78. package/dist/resources/extensions/gsd/notifications.js +4 -0
  79. package/dist/resources/extensions/gsd/onboarding-state.js +133 -0
  80. package/dist/resources/extensions/gsd/post-execution-checks.js +27 -11
  81. package/dist/resources/extensions/gsd/pre-execution-checks.js +97 -4
  82. package/dist/resources/extensions/gsd/preferences-models.js +1 -0
  83. package/dist/resources/extensions/gsd/preferences-types.js +2 -1
  84. package/dist/resources/extensions/gsd/preferences-validation.js +42 -8
  85. package/dist/resources/extensions/gsd/preferences.js +10 -10
  86. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
  87. package/dist/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
  88. package/dist/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
  89. package/dist/resources/extensions/gsd/prompts/execute-task.md +12 -0
  90. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  91. package/dist/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  92. package/dist/resources/extensions/gsd/prompts/scan.md +79 -0
  93. package/dist/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
  94. package/dist/resources/extensions/gsd/python-resolver.js +70 -0
  95. package/dist/resources/extensions/gsd/run-manager.js +37 -17
  96. package/dist/resources/extensions/gsd/setup-catalog.js +75 -0
  97. package/dist/resources/extensions/gsd/state.js +47 -3
  98. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
  99. package/dist/resources/extensions/gsd/tools/complete-task.js +80 -0
  100. package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -12
  101. package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -2
  102. package/dist/resources/extensions/gsd/tools/skip-slice.js +78 -0
  103. package/dist/resources/extensions/gsd/uok/flags.js +7 -7
  104. package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
  105. package/dist/resources/extensions/gsd/verification-gate.js +2 -1
  106. package/dist/resources/extensions/gsd/workflow-dispatch.js +64 -0
  107. package/dist/resources/extensions/gsd/workflow-install.js +327 -0
  108. package/dist/resources/extensions/gsd/workflow-manifest.js +8 -0
  109. package/dist/resources/extensions/gsd/workflow-mcp.js +1 -6
  110. package/dist/resources/extensions/gsd/workflow-plugins.js +346 -0
  111. package/dist/resources/extensions/gsd/workflow-projections.js +17 -15
  112. package/dist/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
  113. package/dist/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
  114. package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
  115. package/dist/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
  116. package/dist/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
  117. package/dist/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
  118. package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
  119. package/dist/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
  120. package/dist/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
  121. package/dist/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
  122. package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
  123. package/dist/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
  124. package/dist/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
  125. package/dist/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
  126. package/dist/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
  127. package/dist/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
  128. package/dist/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
  129. package/dist/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
  130. package/dist/resources/extensions/gsd/workflow-templates/registry.json +184 -0
  131. package/dist/resources/extensions/gsd/workflow-templates/release.md +118 -0
  132. package/dist/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
  133. package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
  134. package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
  135. package/dist/resources/extensions/gsd/workflow-templates/spike.md +1 -0
  136. package/dist/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
  137. package/dist/resources/extensions/gsd/worktree-resolver.js +42 -1
  138. package/dist/resources/extensions/remote-questions/commands.js +380 -0
  139. package/dist/resources/extensions/remote-questions/manager.js +39 -5
  140. package/dist/resources/extensions/remote-questions/telegram-adapter.js +79 -4
  141. package/dist/resources/extensions/shared/interview-ui.js +189 -1
  142. package/dist/resources/extensions/shared/layout-utils.js +17 -0
  143. package/dist/resources/extensions/shared/rtk-shared.js +47 -0
  144. package/dist/resources/extensions/shared/rtk.js +3 -46
  145. package/dist/resources/skills/create-workflow/SKILL.md +33 -6
  146. package/dist/rtk-shared.d.ts +10 -0
  147. package/dist/rtk-shared.js +47 -0
  148. package/dist/rtk.d.ts +2 -6
  149. package/dist/rtk.js +3 -48
  150. package/dist/shared/workspace-types.d.ts +52 -0
  151. package/dist/shared/workspace-types.js +1 -0
  152. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  153. package/dist/update-check.d.ts +10 -0
  154. package/dist/update-check.js +24 -3
  155. package/dist/web/standalone/.next/BUILD_ID +1 -1
  156. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  157. package/dist/web/standalone/.next/build-manifest.json +3 -3
  158. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  159. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  160. package/dist/web/standalone/.next/required-server-files.json +1 -1
  161. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  163. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  164. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  166. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  167. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  169. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  172. package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
  173. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  174. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  176. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  178. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  179. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  183. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  185. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  186. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  187. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  189. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  191. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  195. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  197. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  201. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  203. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  205. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  207. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  209. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  211. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  212. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  213. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  215. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  217. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  219. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  221. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  222. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  223. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  224. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  225. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  227. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  229. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  231. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  233. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  235. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  236. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  237. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  238. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  239. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  240. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  241. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  242. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  244. package/dist/web/standalone/.next/server/app/index.html +1 -1
  245. package/dist/web/standalone/.next/server/app/index.rsc +3 -3
  246. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  247. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
  248. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  249. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  250. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  251. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  252. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  253. package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
  254. package/dist/web/standalone/.next/server/chunks/7461.js +1 -0
  255. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  256. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  257. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  258. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  259. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  260. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  261. package/dist/web/standalone/.next/static/chunks/2826.e59e8578e2e28639.js +9 -0
  262. package/dist/web/standalone/.next/static/chunks/{2008.71ee9230ad78df21.js → 3621.fc7480022c972438.js} +2 -2
  263. package/dist/web/standalone/.next/static/chunks/app/{page-f1e30ab6bb269149.js → page-5b113fd32bc2a1c3.js} +1 -1
  264. package/dist/web/standalone/.next/static/chunks/{webpack-b868033a5834586d.js → webpack-5fc74f13a25fa1bb.js} +1 -1
  265. package/dist/web/standalone/.next/static/css/632cd626b1731d88.css +1 -0
  266. package/dist/web/standalone/server.js +1 -1
  267. package/dist/welcome-screen.js +48 -24
  268. package/dist/wizard.js +2 -2
  269. package/dist/worktree-cli.d.ts +6 -5
  270. package/dist/worktree-cli.js +23 -7
  271. package/package.json +3 -3
  272. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  273. package/packages/native/tsconfig.tsbuildinfo +1 -1
  274. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  275. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
  276. package/packages/pi-ai/dist/models/capability-patches.js +3 -2
  277. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
  278. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +68 -0
  279. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -1
  280. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +68 -0
  281. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -1
  282. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +17 -0
  283. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -1
  284. package/packages/pi-ai/dist/models/generated/anthropic.js +17 -0
  285. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -1
  286. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +17 -0
  287. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -1
  288. package/packages/pi-ai/dist/models/generated/google-antigravity.js +17 -0
  289. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -1
  290. package/packages/pi-ai/dist/models/generated/groq.d.ts +0 -153
  291. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -1
  292. package/packages/pi-ai/dist/models/generated/groq.js +0 -153
  293. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -1
  294. package/packages/pi-ai/dist/models/generated/index.d.ts +136 -153
  295. package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
  296. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
  297. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
  298. package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
  299. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
  300. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +17 -0
  301. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -1
  302. package/packages/pi-ai/dist/models/generated/openrouter.js +17 -0
  303. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -1
  304. package/packages/pi-ai/dist/models.generated.test.js +17 -0
  305. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  306. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts +22 -1
  307. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  308. package/packages/pi-ai/dist/providers/amazon-bedrock.js +40 -6
  309. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  310. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts +2 -0
  311. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts.map +1 -0
  312. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js +106 -0
  313. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js.map +1 -0
  314. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +42 -1
  315. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  316. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +20 -1
  317. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  318. package/packages/pi-ai/dist/providers/anthropic-shared.js +32 -2
  319. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  320. package/packages/pi-ai/dist/providers/anthropic-shared.test.js +12 -1
  321. package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -1
  322. package/packages/pi-ai/dist/providers/anthropic.d.ts +11 -0
  323. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  324. package/packages/pi-ai/dist/providers/anthropic.js +18 -1
  325. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  326. package/packages/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
  327. package/packages/pi-ai/dist/utils/oauth/openai-codex.js +12 -0
  328. package/packages/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
  329. package/packages/pi-ai/package.json +1 -1
  330. package/packages/pi-ai/scripts/generate-models.ts +50 -0
  331. package/packages/pi-ai/src/models/capability-patches.ts +5 -2
  332. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +68 -0
  333. package/packages/pi-ai/src/models/generated/anthropic.ts +17 -0
  334. package/packages/pi-ai/src/models/generated/google-antigravity.ts +17 -0
  335. package/packages/pi-ai/src/models/generated/groq.ts +0 -153
  336. package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
  337. package/packages/pi-ai/src/models/generated/openrouter.ts +17 -0
  338. package/packages/pi-ai/src/models.generated.test.ts +17 -0
  339. package/packages/pi-ai/src/providers/amazon-bedrock.test.ts +164 -0
  340. package/packages/pi-ai/src/providers/amazon-bedrock.ts +41 -7
  341. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +47 -1
  342. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +15 -1
  343. package/packages/pi-ai/src/providers/anthropic-shared.ts +36 -3
  344. package/packages/pi-ai/src/providers/anthropic.ts +19 -1
  345. package/packages/pi-ai/src/utils/oauth/openai-codex.ts +15 -0
  346. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  347. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts +2 -0
  348. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts.map +1 -0
  349. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +38 -0
  350. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -0
  351. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +14 -0
  352. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  353. package/packages/pi-coding-agent/dist/core/auth-storage.js +34 -0
  354. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  355. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +74 -0
  356. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +4 -1
  358. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  359. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +32 -0
  360. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  361. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  362. package/packages/pi-coding-agent/dist/core/sdk.js +32 -0
  363. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  364. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +2 -2
  365. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  366. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  367. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +17 -7
  368. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  369. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  370. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +48 -34
  371. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  372. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts +4 -0
  373. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  374. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +83 -33
  375. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  376. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
  377. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  378. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +77 -0
  379. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  380. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -66
  381. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  382. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +1 -75
  383. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  384. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts +1 -1
  385. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  386. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +192 -24
  387. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  388. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +56 -0
  389. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +83 -0
  390. package/packages/pi-coding-agent/src/core/auth-storage.ts +35 -0
  391. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +4 -1
  392. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +37 -1
  393. package/packages/pi-coding-agent/src/core/sdk.ts +41 -0
  394. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +2 -2
  395. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +19 -7
  396. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +53 -31
  397. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +88 -36
  398. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +83 -0
  399. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +2 -83
  400. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +208 -27
  401. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  402. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  403. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  404. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
  405. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  406. package/pkg/dist/modes/interactive/theme/theme-schema.js +77 -0
  407. package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  408. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -66
  409. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  410. package/pkg/dist/modes/interactive/theme/theme.js +1 -75
  411. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  412. package/pkg/dist/modes/interactive/theme/themes.d.ts +1 -1
  413. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  414. package/pkg/dist/modes/interactive/theme/themes.js +192 -24
  415. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  416. package/src/resources/extensions/ask-user-questions.ts +24 -6
  417. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  418. package/src/resources/extensions/claude-code-cli/readiness.ts +13 -2
  419. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +94 -4
  420. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +84 -0
  421. package/src/resources/extensions/gsd/auto/detect-stuck.ts +10 -0
  422. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  423. package/src/resources/extensions/gsd/auto/loop.ts +109 -3
  424. package/src/resources/extensions/gsd/auto/phases.ts +94 -60
  425. package/src/resources/extensions/gsd/auto/resolve.ts +1 -1
  426. package/src/resources/extensions/gsd/auto/run-unit.ts +11 -1
  427. package/src/resources/extensions/gsd/auto/session.ts +7 -0
  428. package/src/resources/extensions/gsd/auto-artifact-paths.ts +20 -0
  429. package/src/resources/extensions/gsd/auto-dashboard.ts +21 -4
  430. package/src/resources/extensions/gsd/auto-dispatch.ts +123 -5
  431. package/src/resources/extensions/gsd/auto-loop.ts +1 -1
  432. package/src/resources/extensions/gsd/auto-model-selection.ts +14 -3
  433. package/src/resources/extensions/gsd/auto-post-unit.ts +10 -8
  434. package/src/resources/extensions/gsd/auto-prompts.ts +201 -40
  435. package/src/resources/extensions/gsd/auto-recovery.ts +63 -1
  436. package/src/resources/extensions/gsd/auto-start.ts +8 -6
  437. package/src/resources/extensions/gsd/auto-verification.ts +3 -3
  438. package/src/resources/extensions/gsd/auto-worktree.ts +65 -0
  439. package/src/resources/extensions/gsd/auto.ts +61 -28
  440. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +8 -21
  441. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +46 -24
  442. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +31 -0
  443. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
  444. package/src/resources/extensions/gsd/commands/catalog.ts +74 -9
  445. package/src/resources/extensions/gsd/commands/handlers/core.ts +69 -27
  446. package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
  447. package/src/resources/extensions/gsd/commands/handlers/onboarding.ts +262 -0
  448. package/src/resources/extensions/gsd/commands/handlers/ops.ts +16 -0
  449. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +279 -29
  450. package/src/resources/extensions/gsd/commands-cmux.ts +6 -2
  451. package/src/resources/extensions/gsd/commands-config.ts +10 -0
  452. package/src/resources/extensions/gsd/commands-debug.ts +484 -0
  453. package/src/resources/extensions/gsd/commands-do.ts +1 -0
  454. package/src/resources/extensions/gsd/commands-extract-learnings.ts +295 -76
  455. package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
  456. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +49 -12
  457. package/src/resources/extensions/gsd/commands-scan.ts +125 -0
  458. package/src/resources/extensions/gsd/commands-workflow-templates.ts +129 -2
  459. package/src/resources/extensions/gsd/custom-workflow-engine.ts +85 -60
  460. package/src/resources/extensions/gsd/db-writer.ts +3 -0
  461. package/src/resources/extensions/gsd/debug-session-store.ts +377 -0
  462. package/src/resources/extensions/gsd/definition-loader.ts +7 -0
  463. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -9
  464. package/src/resources/extensions/gsd/doctor-environment.ts +2 -1
  465. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -1
  466. package/src/resources/extensions/gsd/doctor-proactive.ts +4 -1
  467. package/src/resources/extensions/gsd/doctor-providers.ts +52 -22
  468. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +23 -4
  469. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  470. package/src/resources/extensions/gsd/doctor.ts +7 -1
  471. package/src/resources/extensions/gsd/error-classifier.ts +6 -3
  472. package/src/resources/extensions/gsd/escalation.ts +367 -0
  473. package/src/resources/extensions/gsd/forensics.ts +25 -29
  474. package/src/resources/extensions/gsd/git-service.ts +0 -1
  475. package/src/resources/extensions/gsd/graph.ts +33 -3
  476. package/src/resources/extensions/gsd/gsd-db.ts +306 -29
  477. package/src/resources/extensions/gsd/health-widget-core.ts +43 -14
  478. package/src/resources/extensions/gsd/health-widget.ts +7 -3
  479. package/src/resources/extensions/gsd/init-wizard.ts +87 -54
  480. package/src/resources/extensions/gsd/markdown-renderer.ts +5 -5
  481. package/src/resources/extensions/gsd/metrics.ts +1 -0
  482. package/src/resources/extensions/gsd/model-cost-table.ts +3 -1
  483. package/src/resources/extensions/gsd/model-router.ts +25 -6
  484. package/src/resources/extensions/gsd/native-git-bridge.ts +134 -6
  485. package/src/resources/extensions/gsd/notification-overlay.ts +9 -19
  486. package/src/resources/extensions/gsd/notification-widget.ts +25 -43
  487. package/src/resources/extensions/gsd/notifications.ts +6 -0
  488. package/src/resources/extensions/gsd/onboarding-state.ts +146 -0
  489. package/src/resources/extensions/gsd/post-execution-checks.ts +37 -14
  490. package/src/resources/extensions/gsd/pre-execution-checks.ts +98 -8
  491. package/src/resources/extensions/gsd/preferences-models.ts +1 -0
  492. package/src/resources/extensions/gsd/preferences-types.ts +10 -2
  493. package/src/resources/extensions/gsd/preferences-validation.ts +33 -7
  494. package/src/resources/extensions/gsd/preferences.ts +10 -10
  495. package/src/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
  496. package/src/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
  497. package/src/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
  498. package/src/resources/extensions/gsd/prompts/execute-task.md +12 -0
  499. package/src/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  500. package/src/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  501. package/src/resources/extensions/gsd/prompts/scan.md +79 -0
  502. package/src/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
  503. package/src/resources/extensions/gsd/python-resolver.ts +76 -0
  504. package/src/resources/extensions/gsd/run-manager.ts +53 -19
  505. package/src/resources/extensions/gsd/setup-catalog.ts +105 -0
  506. package/src/resources/extensions/gsd/state.ts +50 -2
  507. package/src/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
  508. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +1 -34
  509. package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +7 -0
  510. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +45 -31
  511. package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +63 -0
  512. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +12 -0
  513. package/src/resources/extensions/gsd/tests/auto-prompts-fallback.test.ts +35 -0
  514. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +123 -1
  515. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +39 -0
  516. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +39 -0
  517. package/src/resources/extensions/gsd/tests/commands-do.test.ts +48 -0
  518. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +333 -21
  519. package/src/resources/extensions/gsd/tests/commands-scan.test.ts +351 -0
  520. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +8 -6
  521. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +6 -8
  522. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  523. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +63 -0
  524. package/src/resources/extensions/gsd/tests/debug-command-handler.test.ts +905 -0
  525. package/src/resources/extensions/gsd/tests/debug-command-lifecycle.integration.test.ts +1229 -0
  526. package/src/resources/extensions/gsd/tests/debug-session-store.test.ts +565 -0
  527. package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +64 -0
  528. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +67 -0
  529. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +62 -18
  530. package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +5 -0
  531. package/src/resources/extensions/gsd/tests/escalation.test.ts +818 -0
  532. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +29 -12
  533. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +106 -0
  534. package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +74 -0
  535. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +0 -4
  536. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -1
  537. package/src/resources/extensions/gsd/tests/health-widget.test.ts +8 -2
  538. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +190 -0
  539. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +39 -0
  540. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +44 -0
  541. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +68 -1
  542. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +109 -11
  543. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +51 -0
  544. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +2 -2
  545. package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
  546. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +171 -1
  547. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  548. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  549. package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +3 -2
  550. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +2 -2
  551. package/src/resources/extensions/gsd/tests/model-router.test.ts +51 -1
  552. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +59 -0
  553. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +56 -37
  554. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +1 -1
  555. package/src/resources/extensions/gsd/tests/onboarding-handler-loader.test.ts +41 -0
  556. package/src/resources/extensions/gsd/tests/onboarding-state.test.ts +105 -0
  557. package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +114 -0
  558. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +4 -5
  559. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +17 -0
  560. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -1
  561. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +275 -6
  562. package/src/resources/extensions/gsd/tests/preferences.test.ts +69 -1
  563. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +539 -0
  564. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +11 -2
  565. package/src/resources/extensions/gsd/tests/projection-regression.test.ts +7 -0
  566. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +27 -0
  567. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +24 -0
  568. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +1 -1
  569. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +33 -0
  570. package/src/resources/extensions/gsd/tests/python-resolver.test.ts +131 -0
  571. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +67 -0
  572. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +107 -0
  573. package/src/resources/extensions/gsd/tests/requirements.test.ts +9 -0
  574. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +153 -0
  575. package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +125 -0
  576. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +16 -4
  577. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -0
  578. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +15 -0
  579. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +5 -0
  580. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +2 -1
  581. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +31 -1
  582. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +166 -0
  583. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +35 -0
  584. package/src/resources/extensions/gsd/tests/workflow-install.test.ts +113 -0
  585. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +15 -6
  586. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  587. package/src/resources/extensions/gsd/tests/workflow-plugins.test.ts +310 -0
  588. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +7 -0
  589. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +8 -2
  590. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +2 -1
  591. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +77 -2
  592. package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
  593. package/src/resources/extensions/gsd/tools/plan-milestone.ts +42 -8
  594. package/src/resources/extensions/gsd/tools/plan-slice.ts +6 -1
  595. package/src/resources/extensions/gsd/tools/skip-slice.ts +133 -0
  596. package/src/resources/extensions/gsd/types.ts +62 -0
  597. package/src/resources/extensions/gsd/unit-runtime.ts +1 -0
  598. package/src/resources/extensions/gsd/uok/contracts.ts +2 -1
  599. package/src/resources/extensions/gsd/uok/flags.ts +7 -7
  600. package/src/resources/extensions/gsd/uok/kernel.ts +16 -4
  601. package/src/resources/extensions/gsd/verification-gate.ts +2 -1
  602. package/src/resources/extensions/gsd/workflow-dispatch.ts +106 -0
  603. package/src/resources/extensions/gsd/workflow-install.ts +423 -0
  604. package/src/resources/extensions/gsd/workflow-manifest.ts +8 -0
  605. package/src/resources/extensions/gsd/workflow-mcp.ts +1 -6
  606. package/src/resources/extensions/gsd/workflow-plugins.ts +403 -0
  607. package/src/resources/extensions/gsd/workflow-projections.ts +18 -16
  608. package/src/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
  609. package/src/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
  610. package/src/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
  611. package/src/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
  612. package/src/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
  613. package/src/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
  614. package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
  615. package/src/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
  616. package/src/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
  617. package/src/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
  618. package/src/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
  619. package/src/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
  620. package/src/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
  621. package/src/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
  622. package/src/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
  623. package/src/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
  624. package/src/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
  625. package/src/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
  626. package/src/resources/extensions/gsd/workflow-templates/registry.json +184 -0
  627. package/src/resources/extensions/gsd/workflow-templates/release.md +118 -0
  628. package/src/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
  629. package/src/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
  630. package/src/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
  631. package/src/resources/extensions/gsd/workflow-templates/spike.md +1 -0
  632. package/src/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
  633. package/src/resources/extensions/gsd/workflow-templates.ts +7 -0
  634. package/src/resources/extensions/gsd/workspace-index.ts +9 -4
  635. package/src/resources/extensions/gsd/worktree-resolver.ts +47 -1
  636. package/src/resources/extensions/remote-questions/commands.ts +480 -0
  637. package/src/resources/extensions/remote-questions/manager.ts +49 -4
  638. package/src/resources/extensions/remote-questions/telegram-adapter.ts +86 -4
  639. package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +246 -0
  640. package/src/resources/extensions/remote-questions/tests/remote-answer-normalization.test.ts +92 -0
  641. package/src/resources/extensions/remote-questions/tests/telegram-commands.test.ts +267 -0
  642. package/src/resources/extensions/shared/interview-ui.ts +195 -1
  643. package/src/resources/extensions/shared/layout-utils.ts +26 -0
  644. package/src/resources/extensions/shared/rtk-shared.ts +58 -0
  645. package/src/resources/extensions/shared/rtk.ts +12 -52
  646. package/src/resources/extensions/shared/tests/interview-preview.test.ts +177 -0
  647. package/src/resources/extensions/shared/tests/preview-layout.test.ts +120 -0
  648. package/src/resources/skills/create-workflow/SKILL.md +33 -6
  649. package/dist/web/standalone/.next/static/chunks/2826.dd3dc8bbd3025fa5.js +0 -9
  650. package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
  651. package/packages/native/dist/ps/types.d.ts +0 -5
  652. package/packages/native/dist/ps/types.js +0 -2
  653. package/packages/native/src/ps/types.ts +0 -5
  654. package/packages/pi-ai/node_modules/@smithy/node-http-handler/LICENSE +0 -201
  655. package/packages/pi-ai/node_modules/@smithy/node-http-handler/README.md +0 -9
  656. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-cjs/index.js +0 -762
  657. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/build-abort-error.js +0 -19
  658. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/constants.js +0 -1
  659. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/get-transformed-headers.js +0 -9
  660. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/index.js +0 -3
  661. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js +0 -230
  662. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-manager.js +0 -87
  663. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-pool.js +0 -32
  664. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-handler.js +0 -169
  665. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/readable.mock.js +0 -21
  666. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/server.mock.js +0 -88
  667. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-connection-timeout.js +0 -36
  668. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-request-timeout.js +0 -21
  669. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-keep-alive.js +0 -22
  670. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-timeout.js +0 -23
  671. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/collector.js +0 -8
  672. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/index.js +0 -41
  673. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/readable.mock.js +0 -21
  674. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/timing.js +0 -4
  675. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/write-request-body.js +0 -63
  676. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/build-abort-error.d.ts +0 -10
  677. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/constants.d.ts +0 -5
  678. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/get-transformed-headers.d.ts +0 -4
  679. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/index.d.ts +0 -3
  680. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http-handler.d.ts +0 -46
  681. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-manager.d.ts +0 -24
  682. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-pool.d.ts +0 -12
  683. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-handler.d.ts +0 -63
  684. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/readable.mock.d.ts +0 -13
  685. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/server.mock.d.ts +0 -12
  686. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-connection-timeout.d.ts +0 -2
  687. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-request-timeout.d.ts +0 -6
  688. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-keep-alive.d.ts +0 -6
  689. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-timeout.d.ts +0 -2
  690. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/collector.d.ts +0 -5
  691. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/index.d.ts +0 -6
  692. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/readable.mock.d.ts +0 -13
  693. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/timing.d.ts +0 -8
  694. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/build-abort-error.d.ts +0 -10
  695. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/constants.d.ts +0 -5
  696. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/get-transformed-headers.d.ts +0 -4
  697. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/index.d.ts +0 -3
  698. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http-handler.d.ts +0 -46
  699. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-manager.d.ts +0 -24
  700. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-pool.d.ts +0 -12
  701. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-handler.d.ts +0 -63
  702. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/readable.mock.d.ts +0 -13
  703. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/server.mock.d.ts +0 -12
  704. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-connection-timeout.d.ts +0 -2
  705. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-request-timeout.d.ts +0 -6
  706. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-keep-alive.d.ts +0 -6
  707. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-timeout.d.ts +0 -2
  708. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/collector.d.ts +0 -5
  709. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/index.d.ts +0 -6
  710. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/readable.mock.d.ts +0 -13
  711. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/timing.d.ts +0 -8
  712. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/write-request-body.d.ts +0 -12
  713. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/write-request-body.d.ts +0 -12
  714. package/packages/pi-ai/node_modules/@smithy/node-http-handler/package.json +0 -68
  715. package/packages/pi-ai/oauth.d.ts +0 -1
  716. package/packages/pi-ai/oauth.js +0 -1
  717. /package/dist/web/standalone/.next/static/{j7IBD35UgrL2b298GLK3V → J2z3GMC9QtSLr7gyoM38c}/_buildManifest.js +0 -0
  718. /package/dist/web/standalone/.next/static/{j7IBD35UgrL2b298GLK3V → J2z3GMC9QtSLr7gyoM38c}/_ssgManifest.js +0 -0
@@ -126,6 +126,43 @@ test("uses explicit tier_models when configured", () => {
126
126
  assert.equal(result.wasDowngraded, true);
127
127
  });
128
128
 
129
+ test("preserves explicit provider-qualified tier_models when duplicate bare IDs exist", () => {
130
+ const config: DynamicRoutingConfig = {
131
+ ...defaultRoutingConfig(),
132
+ enabled: true,
133
+ capability_routing: false,
134
+ tier_models: {
135
+ light: "custom-openai/gpt-5.3-codex-spark",
136
+ standard: "custom-openai/gpt-5.4",
137
+ },
138
+ };
139
+ const providerModels = [
140
+ "openai-codex/gpt-5.4",
141
+ "custom-openai/gpt-5.4",
142
+ "openai-codex/gpt-5.3-codex-spark",
143
+ "custom-openai/gpt-5.3-codex-spark",
144
+ "custom-anthropic/claude-opus-4-7",
145
+ ];
146
+
147
+ const standard = resolveModelForComplexity(
148
+ makeClassification("standard"),
149
+ { primary: "custom-anthropic/claude-opus-4-7", fallbacks: [] },
150
+ config,
151
+ providerModels,
152
+ );
153
+ assert.equal(standard.modelId, "custom-openai/gpt-5.4");
154
+ assert.equal(standard.wasDowngraded, true);
155
+
156
+ const light = resolveModelForComplexity(
157
+ makeClassification("light"),
158
+ { primary: "custom-anthropic/claude-opus-4-7", fallbacks: [] },
159
+ config,
160
+ providerModels,
161
+ );
162
+ assert.equal(light.modelId, "custom-openai/gpt-5.3-codex-spark");
163
+ assert.equal(light.wasDowngraded, true);
164
+ });
165
+
129
166
  // ─── Fallback chain construction ─────────────────────────────────────────────
130
167
 
131
168
  test("fallback chain includes configured primary as last resort", () => {
@@ -218,6 +255,19 @@ test("defaultRoutingConfig includes capability_routing: true", () => {
218
255
  assert.equal(config.capability_routing, true);
219
256
  });
220
257
 
258
+ test("scoreEligibleModels uses bare capability profiles for provider-qualified IDs", () => {
259
+ const scored = scoreEligibleModels(
260
+ ["custom-openai/gpt-5.4", "custom-openai/gpt-5.3-codex-spark"],
261
+ { coding: 1 },
262
+ );
263
+
264
+ assert.equal(scored[0]?.modelId, "custom-openai/gpt-5.4");
265
+ assert.ok(
266
+ (scored[0]?.score ?? 0) > (scored[1]?.score ?? 0),
267
+ "provider-qualified IDs should still use the built-in bare model capability profile",
268
+ );
269
+ });
270
+
221
271
  test("scoreModel computes weighted average of capability × requirement", () => {
222
272
  const caps: ModelCapabilities = {
223
273
  coding: 90, debugging: 80, research: 70,
@@ -298,7 +348,7 @@ test("MODEL_CAPABILITY_PROFILES has entries for all tier-mapped models", () => {
298
348
 
299
349
  test("#2885: openai-codex light-tier models are recognized", () => {
300
350
  const config = { ...defaultRoutingConfig(), enabled: true };
301
- const lightModels = ["gpt-4.1-mini", "gpt-4.1-nano", "gpt-5-mini", "gpt-5-nano", "gpt-5.1-codex-mini", "gpt-5.3-codex-spark"];
351
+ const lightModels = ["gpt-4.1-mini", "gpt-4.1-nano", "gpt-5-mini", "gpt-5-nano", "gpt-5.1-codex-mini", "gpt-5.3-codex-spark", "gpt-5.4-mini"];
302
352
  for (const model of lightModels) {
303
353
  const result = resolveModelForComplexity(
304
354
  makeClassification("light"),
@@ -215,6 +215,65 @@ test("unitVerb handles discuss-slice", () => {
215
215
  // auto-artifact-paths.ts: artifact resolution
216
216
  // ═══════════════════════════════════════════════════════════════════════════
217
217
 
218
+ // ═══════════════════════════════════════════════════════════════════════════
219
+ // ADR-011: meta-test — every KNOWN_UNIT_TYPES entry must appear in all four
220
+ // downstream registries so a future unit type added to KNOWN_UNIT_TYPES can't
221
+ // silently fall through to wrong defaults in metrics/dashboard/artifacts/post-unit.
222
+ // ═══════════════════════════════════════════════════════════════════════════
223
+
224
+ // Intentional exceptions — unit types that legitimately rely on default/null
225
+ // behavior in a specific registry. Entries captured here reflect the current
226
+ // baseline at the time ADR-011 landed; adding to this allowlist for a NEW unit
227
+ // type requires explicit justification in the commit.
228
+ //
229
+ // Test intent: catch the case where someone adds a new unit type to
230
+ // KNOWN_UNIT_TYPES but forgets to wire it into one of the four registries.
231
+ // The allowlist freezes the baseline so pre-existing omissions do not block
232
+ // the test, but any brand-new addition must be either handled or justified.
233
+ const REGISTRY_EXCEPTIONS: Record<string, Set<string>> = {
234
+ // metrics.ts classifyUnitPhase uses default → "execution" for most unit types.
235
+ "metrics.ts": new Set([
236
+ "worktree-merge", "custom-step",
237
+ "rewrite-docs", "run-uat", "gate-evaluate", "replan-slice",
238
+ "reactive-execute", "validate-milestone", "complete-milestone",
239
+ ]),
240
+ "auto-dashboard.ts": new Set([
241
+ "worktree-merge",
242
+ "gate-evaluate", "reactive-execute", "validate-milestone", "complete-milestone",
243
+ ]),
244
+ "auto-artifact-paths.ts": new Set([
245
+ "rewrite-docs", "gate-evaluate", "reactive-execute", "discuss-slice", "worktree-merge",
246
+ ]),
247
+ "auto-post-unit.ts": new Set([
248
+ "execute-task", "reactive-execute", "gate-evaluate", "worktree-merge",
249
+ ]),
250
+ };
251
+
252
+ const REGISTRY_SOURCES: Array<[string, string]> = [
253
+ ["metrics.ts", metricsSrc],
254
+ ["auto-dashboard.ts", dashboardSrc],
255
+ ["auto-artifact-paths.ts", artifactSrc],
256
+ ["auto-post-unit.ts", postUnitSrc],
257
+ ];
258
+
259
+ test("ADR-011 meta: every KNOWN_UNIT_TYPES entry appears in all 4 downstream registries", () => {
260
+ const missing: Array<{ registry: string; unitType: string }> = [];
261
+ for (const [registry, src] of REGISTRY_SOURCES) {
262
+ for (const ut of ALL_KNOWN_UNIT_TYPES) {
263
+ if (REGISTRY_EXCEPTIONS[registry]?.has(ut)) continue;
264
+ if (!src.includes(`"${ut}"`)) {
265
+ missing.push({ registry, unitType: ut });
266
+ }
267
+ }
268
+ }
269
+ assert.deepEqual(
270
+ missing,
271
+ [],
272
+ "Each listed unit type is absent from the given registry — either add a handler or add to REGISTRY_EXCEPTIONS with justification:\n" +
273
+ missing.map((m) => ` ${m.registry}: "${m.unitType}"`).join("\n"),
274
+ );
275
+ });
276
+
218
277
  test("resolveExpectedArtifactPath handles discuss-slice", () => {
219
278
  assert.ok(artifactSrc.includes('"discuss-slice"'), "missing discuss-slice in artifact paths");
220
279
  });
@@ -1,31 +1,21 @@
1
1
  // GSD Extension — Notification Overlay Tests
2
- // Tests for message wrapping and content-fit sizing in the notification panel.
2
+ // Tests for message wrapping in the notification panel.
3
+ // Mirrors the private wrapText from notification-overlay.ts so its contract
4
+ // can be exercised without exporting internals.
3
5
 
4
6
  import { describe, test } from "node:test";
5
7
  import assert from "node:assert/strict";
6
8
 
7
- // The wrapText function is private to the module, so we test the overlay's
8
- // render output indirectly. We also extract and test wrapText logic directly.
9
+ import { truncateToWidth, visibleWidth, wrapTextWithAnsi } from "@gsd/pi-tui";
9
10
 
10
- // ── wrapText logic (mirrors the private function) ───────────────────────────
11
+ // ── wrapText logic (mirrors the private function in notification-overlay.ts) ──
11
12
 
12
13
  function wrapText(text: string, maxWidth: number): string[] {
13
- if (text.length <= maxWidth) return [text];
14
- const words = text.split(/\s+/);
15
- const lines: string[] = [];
16
- let current = "";
17
- for (const word of words) {
18
- if (current.length === 0) {
19
- current = word;
20
- } else if (current.length + 1 + word.length <= maxWidth) {
21
- current += " " + word;
22
- } else {
23
- lines.push(current);
24
- current = word;
25
- }
26
- }
27
- if (current.length > 0) lines.push(current);
28
- return lines.map((l) => l.length > maxWidth ? l.slice(0, maxWidth - 1) + "…" : l);
14
+ if (maxWidth <= 0) return [text];
15
+ const lines = wrapTextWithAnsi(text, maxWidth);
16
+ return lines.map((l) =>
17
+ visibleWidth(l) > maxWidth ? truncateToWidth(l, maxWidth, "") : l,
18
+ );
29
19
  }
30
20
 
31
21
  describe("notification overlay — wrapText", () => {
@@ -34,31 +24,26 @@ describe("notification overlay — wrapText", () => {
34
24
  assert.deepStrictEqual(result, ["hello world"]);
35
25
  });
36
26
 
37
- test("long text wraps at word boundaries", () => {
27
+ test("long text wraps at word boundaries without exceeding maxWidth", () => {
38
28
  const text = "This is a long notification message that should wrap across multiple lines";
39
29
  const result = wrapText(text, 40);
40
30
  assert.ok(result.length > 1, `expected multiple lines, got ${result.length}`);
41
31
  for (const line of result) {
42
- assert.ok(line.length <= 40, `line exceeds maxWidth: "${line}" (${line.length})`);
32
+ assert.ok(
33
+ visibleWidth(line) <= 40,
34
+ `line exceeds maxWidth: "${line}" (${visibleWidth(line)})`,
35
+ );
43
36
  }
44
37
  });
45
38
 
46
- test("single word exceeding maxWidth is truncated", () => {
39
+ test("single word exceeding maxWidth is broken to fit column budget", () => {
47
40
  const result = wrapText("superlongwordthatexceedsmaxwidth", 10);
48
- assert.equal(result.length, 1);
49
- assert.equal(result[0]!.length, 10);
50
- assert.ok(result[0]!.endsWith("…"));
51
- });
52
-
53
- test("empty string returns single empty line", () => {
54
- const result = wrapText("", 80);
55
- assert.deepStrictEqual(result, [""]);
56
- });
57
-
58
- test("exact-fit text returns single line", () => {
59
- const text = "exactly twenty chars";
60
- const result = wrapText(text, 20);
61
- assert.deepStrictEqual(result, [text]);
41
+ for (const line of result) {
42
+ assert.ok(
43
+ visibleWidth(line) <= 10,
44
+ `line exceeds maxWidth: "${line}" (${visibleWidth(line)})`,
45
+ );
46
+ }
62
47
  });
63
48
 
64
49
  test("preserves all words across wrapped lines", () => {
@@ -70,4 +55,38 @@ describe("notification overlay — wrapText", () => {
70
55
  assert.ok(rejoined.includes(w), `missing word: ${w}`);
71
56
  }
72
57
  });
58
+
59
+ // Regression for #4465 — the previous .length-based wrapper could allow
60
+ // lines to bleed past the panel border when measured in terminal columns.
61
+ // Verify that every wrapped line stays within the column budget, including
62
+ // for the real-world long multi-provider notification payload.
63
+ test("regression #4465: long notification stays within column budget", () => {
64
+ const msg =
65
+ "GSD API Key Manager LLM Providers ✗ anthropic — not configured " +
66
+ "(console.anthropic.com) ✗ openai — not configured " +
67
+ "(platform.openai.com/api-keys) ✓ github-copilot — OAuth (expires in 13m) " +
68
+ "✓ openai-codex — OAuth (expires in 99h 9m) ✓ google-gemini-cli — OAuth " +
69
+ "(expired — will auto-refresh) ✓ google-antigravity — OAuth " +
70
+ "(expired — will auto-refresh) ✗ google — not configured " +
71
+ "(aistudio.google.com/apikey) ✗ groq — not configured";
72
+ const maxWidth = 118;
73
+ const result = wrapText(msg, maxWidth);
74
+ for (const line of result) {
75
+ assert.ok(
76
+ visibleWidth(line) <= maxWidth,
77
+ `line exceeds column budget: visibleWidth=${visibleWidth(line)} max=${maxWidth}: "${line}"`,
78
+ );
79
+ }
80
+ });
81
+
82
+ test("unbreakable long token (URL) is clamped to maxWidth", () => {
83
+ const url = "https://example.com/" + "a".repeat(200);
84
+ const result = wrapText(url, 40);
85
+ for (const line of result) {
86
+ assert.ok(
87
+ visibleWidth(line) <= 40,
88
+ `line exceeds maxWidth: visibleWidth=${visibleWidth(line)} line="${line}"`,
89
+ );
90
+ }
91
+ });
73
92
  });
@@ -17,7 +17,7 @@ test("buildNotificationWidgetLines shows unread count with shortcut pair", () =>
17
17
 
18
18
  const lines = buildNotificationWidgetLines();
19
19
  assert.equal(lines.length, 1);
20
- assert.match(lines[0]!, /Notifications:\s+1 unread/);
20
+ assert.match(lines[0]!, /🔔\s+1 unread/);
21
21
  assert.match(lines[0]!, /\(.+\/.+\)/);
22
22
  } finally {
23
23
  _resetNotificationStore();
@@ -0,0 +1,41 @@
1
+ import test from "node:test"
2
+ import assert from "node:assert/strict"
3
+ import { readFileSync } from "node:fs"
4
+ import { join } from "node:path"
5
+
6
+ test("onboarding handler resolves wizard module from deployed runtime paths", () => {
7
+ const source = readFileSync(
8
+ join(import.meta.dirname, "..", "commands", "handlers", "onboarding.ts"),
9
+ "utf-8",
10
+ )
11
+
12
+ assert.match(
13
+ source,
14
+ /process\.env\.GSD_PKG_ROOT/,
15
+ "handler should probe GSD_PKG_ROOT for deployed dist\/onboarding.js",
16
+ )
17
+
18
+ assert.match(
19
+ source,
20
+ /process\.argv\[1\]/,
21
+ "handler should fall back to argv-derived package root when env is missing",
22
+ )
23
+
24
+ assert.match(
25
+ source,
26
+ /candidates\.push\("\.\.\/\.\.\/\.\.\/\.\.\/\.\.\/onboarding\.js"\)/,
27
+ "handler must keep the relative source\/dist fallback",
28
+ )
29
+
30
+ assert.match(
31
+ source,
32
+ /for \(const specifier of candidates\)/,
33
+ "handler should try candidates in order",
34
+ )
35
+
36
+ assert.match(
37
+ source,
38
+ /Failed to load onboarding wizard module/,
39
+ "handler should throw a diagnostic error when no candidate resolves",
40
+ )
41
+ })
@@ -0,0 +1,105 @@
1
+ // GSD — Onboarding state record tests.
2
+ // Verifies the explicit completion record (onboarding-state.ts) and step-evolution
3
+ // behavior in setup-catalog.ts, including stale-resume fallback and version semantics.
4
+
5
+ import test from "node:test";
6
+ import assert from "node:assert/strict";
7
+ import { mkdtempSync, rmSync } from "node:fs";
8
+ import { tmpdir } from "node:os";
9
+ import { join } from "node:path";
10
+
11
+ // Tests must isolate per-process to avoid clobbering the user's real ~/.gsd/agent/onboarding.json.
12
+ // We point GSD_HOME at a fresh tmp dir before importing the modules under test.
13
+ const tmpHome = mkdtempSync(join(tmpdir(), "gsd-onboarding-state-test-"));
14
+ process.env.GSD_HOME = tmpHome;
15
+
16
+ const state = await import("../onboarding-state.ts");
17
+ const catalog = await import("../setup-catalog.ts");
18
+
19
+ test.after(() => {
20
+ try { rmSync(tmpHome, { recursive: true, force: true }); } catch { /* ignore */ }
21
+ });
22
+
23
+ test("default record returns when no file exists", () => {
24
+ const r = state.readOnboardingRecord();
25
+ assert.equal(r.completedAt, null);
26
+ assert.deepEqual(r.completedSteps, []);
27
+ assert.equal(r.flowVersion, state.FLOW_VERSION);
28
+ });
29
+
30
+ test("isOnboardingComplete is false until markOnboardingComplete is called", () => {
31
+ state.resetOnboarding();
32
+ assert.equal(state.isOnboardingComplete(), false);
33
+ state.markOnboardingComplete(["llm"]);
34
+ assert.equal(state.isOnboardingComplete(), true);
35
+ });
36
+
37
+ test("markStepCompleted updates lastResumePoint and dedupes", () => {
38
+ state.resetOnboarding();
39
+ state.markStepCompleted("llm");
40
+ state.markStepCompleted("search");
41
+ state.markStepCompleted("llm"); // dup
42
+ const r = state.readOnboardingRecord();
43
+ assert.deepEqual(r.completedSteps.filter(s => s === "llm"), ["llm"]);
44
+ assert.equal(r.lastResumePoint, "llm"); // last write wins, even on dup
45
+ });
46
+
47
+ test("markStepSkipped excludes already-completed steps", () => {
48
+ state.resetOnboarding();
49
+ state.markStepCompleted("llm");
50
+ state.markStepSkipped("llm");
51
+ const r = state.readOnboardingRecord();
52
+ assert.equal(r.skippedSteps.includes("llm"), false);
53
+ });
54
+
55
+ test("resetOnboarding clears completion but preserves flowVersion", () => {
56
+ state.markOnboardingComplete(["llm", "search"]);
57
+ state.resetOnboarding();
58
+ const r = state.readOnboardingRecord();
59
+ assert.equal(r.completedAt, null);
60
+ assert.deepEqual(r.completedSteps, []);
61
+ assert.equal(r.flowVersion, state.FLOW_VERSION);
62
+ });
63
+
64
+ test("flowVersion mismatch invalidates completion (forces re-onboarding)", () => {
65
+ state.markOnboardingComplete(["llm"]);
66
+ // Simulate a flow version bump after the user completed an older flow.
67
+ state.writeOnboardingRecord({ flowVersion: state.FLOW_VERSION - 1 });
68
+ assert.equal(state.isOnboardingComplete(), false);
69
+ });
70
+
71
+ test("nearestResumeStep returns first incomplete when resume point is stale", () => {
72
+ // Stale ID — not in catalog
73
+ const next = catalog.nearestResumeStep("nonexistent-step", []);
74
+ assert.equal(next, "llm"); // first step in ONBOARDING_STEPS
75
+ });
76
+
77
+ test("nearestResumeStep skips already-completed steps from the resume point", () => {
78
+ const completed = ["llm", "model"];
79
+ const next = catalog.nearestResumeStep("llm", completed);
80
+ // First step at-or-after llm that isn't in completed
81
+ assert.equal(next, "search");
82
+ });
83
+
84
+ test("nearestResumeStep wraps to start when everything from the point is complete", () => {
85
+ const allDone = catalog.ONBOARDING_STEPS.map(s => s.id);
86
+ const next = catalog.nearestResumeStep("llm", allDone.slice(0, allDone.length - 1));
87
+ // Only the last step is incomplete
88
+ assert.equal(next, allDone[allDone.length - 1]);
89
+ });
90
+
91
+ test("isValidStepId accepts catalog ids and rejects others", () => {
92
+ assert.equal(catalog.isValidStepId("llm"), true);
93
+ assert.equal(catalog.isValidStepId("tool-keys"), true);
94
+ assert.equal(catalog.isValidStepId("garbage"), false);
95
+ });
96
+
97
+ test("corrupt onboarding.json falls back to defaults instead of crashing", async () => {
98
+ const { writeFileSync } = await import("node:fs");
99
+ const { join } = await import("node:path");
100
+ const filePath = join(tmpHome, "agent", "onboarding.json");
101
+ writeFileSync(filePath, "{ this is not json", "utf-8");
102
+ const r = state.readOnboardingRecord();
103
+ assert.equal(r.completedAt, null);
104
+ assert.deepEqual(r.completedSteps, []);
105
+ });
@@ -0,0 +1,114 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { mkdtempSync, mkdirSync, rmSync, readFileSync, existsSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import { tmpdir } from 'node:os';
6
+
7
+ import { openDatabase, closeDatabase } from '../gsd-db.ts';
8
+ import { handlePlanMilestone } from '../tools/plan-milestone.ts';
9
+
10
+ const boundaryMap = [
11
+ '| From | To | Produces | Consumes |',
12
+ '|------|----|----------|----------|',
13
+ '| S01 | S02 | roadmap | plan |',
14
+ '| S02 | S03 | plan | tasks |',
15
+ '',
16
+ '### S01 → S02',
17
+ '',
18
+ '- Produces: roadmap',
19
+ '- Consumes: plan',
20
+ '',
21
+ '### S02 → S03',
22
+ '',
23
+ '- Produces: plan',
24
+ '- Consumes: tasks',
25
+ ].join('\n');
26
+
27
+ function planParams() {
28
+ return {
29
+ milestoneId: 'M001',
30
+ title: 'Preserve Boundary Map',
31
+ vision: 'Roadmap survives projection hook.',
32
+ successCriteria: ['Boundary Map section survives post-mutation hook'],
33
+ keyRisks: [
34
+ { risk: 'Projection clobber', whyItMatters: 'Authoritative roadmap would be overwritten.' },
35
+ ],
36
+ proofStrategy: [
37
+ { riskOrUnknown: 'Roadmap overwrite', retireIn: 'S01', whatWillBeProven: 'ROADMAP.md still contains ## Boundary Map after plan-milestone.' },
38
+ ],
39
+ verificationContract: 'Contract check',
40
+ verificationIntegration: 'Integration check',
41
+ verificationOperational: 'Operational check',
42
+ verificationUat: 'UAT check',
43
+ definitionOfDone: ['Regression test green'],
44
+ requirementCoverage: 'Covers #4402.',
45
+ boundaryMapMarkdown: boundaryMap,
46
+ slices: [
47
+ {
48
+ sliceId: 'S01',
49
+ title: 'First',
50
+ risk: 'low',
51
+ depends: [] as string[],
52
+ demo: 'demo 1',
53
+ goal: 'goal 1',
54
+ successCriteria: 'sc 1',
55
+ proofLevel: 'unit',
56
+ integrationClosure: 'ic 1',
57
+ observabilityImpact: 'oi 1',
58
+ },
59
+ {
60
+ sliceId: 'S02',
61
+ title: 'Second',
62
+ risk: 'low',
63
+ depends: ['S01'],
64
+ demo: 'demo 2',
65
+ goal: 'goal 2',
66
+ successCriteria: 'sc 2',
67
+ proofLevel: 'unit',
68
+ integrationClosure: 'ic 2',
69
+ observabilityImpact: 'oi 2',
70
+ },
71
+ {
72
+ sliceId: 'S03',
73
+ title: 'Third',
74
+ risk: 'low',
75
+ depends: ['S02'],
76
+ demo: 'demo 3',
77
+ goal: 'goal 3',
78
+ successCriteria: 'sc 3',
79
+ proofLevel: 'unit',
80
+ integrationClosure: 'ic 3',
81
+ observabilityImpact: 'oi 3',
82
+ },
83
+ ],
84
+ };
85
+ }
86
+
87
+ test('#4402 plan-milestone preserves ## Boundary Map after post-mutation projections', async (t) => {
88
+ const base = mkdtempSync(join(tmpdir(), 'gsd-4402-'));
89
+ mkdirSync(join(base, '.gsd', 'milestones', 'M001'), { recursive: true });
90
+ openDatabase(join(base, '.gsd', 'gsd.db'));
91
+
92
+ t.after(() => {
93
+ try { closeDatabase(); } catch { /* noop */ }
94
+ rmSync(base, { recursive: true, force: true });
95
+ });
96
+
97
+ const result = await handlePlanMilestone(planParams(), base);
98
+ assert.ok(!('error' in result), `unexpected error: ${'error' in result ? result.error : ''}`);
99
+
100
+ const roadmapPath = join(base, '.gsd', 'milestones', 'M001', 'M001-ROADMAP.md');
101
+ assert.ok(existsSync(roadmapPath), 'ROADMAP.md must exist on disk');
102
+
103
+ const roadmap = readFileSync(roadmapPath, 'utf-8');
104
+
105
+ assert.match(
106
+ roadmap,
107
+ /^## Boundary Map$/m,
108
+ 'final on-disk ROADMAP.md must still contain the Boundary Map heading after projection hook',
109
+ );
110
+ assert.match(roadmap, /\| S01 \| S02 \| roadmap \| plan \|/, 'boundary map row S01→S02 must survive');
111
+ assert.match(roadmap, /\| S02 \| S03 \| plan \| tasks \|/, 'boundary map row S02→S03 must survive');
112
+ assert.match(roadmap, /^### S01 → S02$/m, 'boundary map edge subsection S01→S02 must survive');
113
+ assert.match(roadmap, /^### S02 → S03$/m, 'boundary map edge subsection S02→S03 must survive');
114
+ });
@@ -92,11 +92,10 @@ test('handlePlanMilestone writes milestone and slice planning state and renders
92
92
  assert.ok(existsSync(roadmapPath), 'roadmap should be rendered to disk');
93
93
  const roadmap = readFileSync(roadmapPath, 'utf-8');
94
94
  assert.match(roadmap, /# M001: DB-backed planning/);
95
- assert.match(roadmap, /## Vision/);
96
- assert.match(roadmap, /Make planning write through the database\./);
97
- assert.match(roadmap, /## Slice Overview/);
98
- assert.match(roadmap, /\| S01 \| Tool wiring \| medium \|/);
99
- assert.match(roadmap, /\| S02 \| Prompt migration \| low \| S01 \|/);
95
+ assert.match(roadmap, /\*\*Vision:\*\* Make planning write through the database\./);
96
+ assert.match(roadmap, /^## Slices$/m);
97
+ assert.match(roadmap, /- \[ \] \*\*S01: Tool wiring\*\* `risk:medium` `depends:\[\]`/);
98
+ assert.match(roadmap, /- \[ \] \*\*S02: Prompt migration\*\* `risk:low` `depends:\[S01\]`/);
100
99
  } finally {
101
100
  cleanup(base);
102
101
  }
@@ -148,6 +148,23 @@ test('handlePlanSlice surfaces render failures without changing parse-visible ta
148
148
  }
149
149
  });
150
150
 
151
+ test('handlePlanSlice reactivates a deferred parent slice to pending', async (t) => {
152
+ const base = makeTmpBase();
153
+ t.after(() => cleanup(base));
154
+ openDatabase(join(base, '.gsd', 'gsd.db'));
155
+
156
+ insertMilestone({ id: 'M001', title: 'Milestone', status: 'active' });
157
+ insertSlice({ id: 'S02', milestoneId: 'M001', title: 'Planning slice', status: 'deferred', demo: 'Rendered plans exist.' });
158
+
159
+ const result = await handlePlanSlice(validParams(), base);
160
+ assert.ok(!('error' in result), `unexpected error: ${'error' in result ? result.error : ''}`);
161
+
162
+ const slice = getSlice('M001', 'S02');
163
+ assert.ok(slice);
164
+ assert.equal(slice?.status, 'pending', 'deferred slice must be reactivated to pending so auto-mode can dispatch it');
165
+ assert.equal(slice?.goal, 'Persist slice planning through the DB.');
166
+ });
167
+
151
168
  test('handlePlanSlice reruns idempotently and refreshes parse-visible state', async () => {
152
169
  const base = makeTmpBase();
153
170
  openDatabase(join(base, '.gsd', 'gsd.db'));