gsd-pi 2.75.0 → 2.76.0

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 (824) 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/onboarding.d.ts +20 -1
  8. package/dist/onboarding.js +99 -39
  9. package/dist/resources/extensions/ask-user-questions.js +17 -5
  10. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  11. package/dist/resources/extensions/claude-code-cli/readiness.js +12 -2
  12. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +76 -4
  13. package/dist/resources/extensions/gsd/auto/detect-stuck.js +9 -0
  14. package/dist/resources/extensions/gsd/auto/loop.js +67 -4
  15. package/dist/resources/extensions/gsd/auto/phases.js +72 -47
  16. package/dist/resources/extensions/gsd/auto/resolve.js +1 -1
  17. package/dist/resources/extensions/gsd/auto/run-unit.js +10 -1
  18. package/dist/resources/extensions/gsd/auto/session.js +5 -0
  19. package/dist/resources/extensions/gsd/auto-artifact-paths.js +20 -0
  20. package/dist/resources/extensions/gsd/auto-dashboard.js +37 -8
  21. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +8 -2
  22. package/dist/resources/extensions/gsd/auto-dispatch.js +120 -14
  23. package/dist/resources/extensions/gsd/auto-loop.js +1 -1
  24. package/dist/resources/extensions/gsd/auto-model-selection.js +14 -4
  25. package/dist/resources/extensions/gsd/auto-post-unit.js +10 -8
  26. package/dist/resources/extensions/gsd/auto-prompts.js +190 -46
  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 +71 -2
  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/memory-tools.js +128 -0
  35. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +29 -0
  36. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
  37. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +22 -0
  38. package/dist/resources/extensions/gsd/bootstrap/system-context.js +17 -4
  39. package/dist/resources/extensions/gsd/commands/catalog.js +81 -9
  40. package/dist/resources/extensions/gsd/commands/handlers/core.js +64 -24
  41. package/dist/resources/extensions/gsd/commands/handlers/escalate.js +171 -0
  42. package/dist/resources/extensions/gsd/commands/handlers/onboarding.js +159 -0
  43. package/dist/resources/extensions/gsd/commands/handlers/ops.js +21 -0
  44. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +228 -29
  45. package/dist/resources/extensions/gsd/commands-cmux.js +5 -2
  46. package/dist/resources/extensions/gsd/commands-config.js +5 -0
  47. package/dist/resources/extensions/gsd/commands-debug.js +388 -0
  48. package/dist/resources/extensions/gsd/commands-do.js +1 -0
  49. package/dist/resources/extensions/gsd/commands-extract-learnings.js +233 -75
  50. package/dist/resources/extensions/gsd/commands-handlers.js +21 -2
  51. package/dist/resources/extensions/gsd/commands-memory.js +462 -0
  52. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +40 -12
  53. package/dist/resources/extensions/gsd/commands-scan.js +94 -0
  54. package/dist/resources/extensions/gsd/commands-workflow-templates.js +101 -2
  55. package/dist/resources/extensions/gsd/custom-workflow-engine.js +74 -54
  56. package/dist/resources/extensions/gsd/db-writer.js +1 -0
  57. package/dist/resources/extensions/gsd/debug-session-store.js +238 -0
  58. package/dist/resources/extensions/gsd/definition-loader.js +7 -0
  59. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -9
  60. package/dist/resources/extensions/gsd/doctor-environment.js +2 -1
  61. package/dist/resources/extensions/gsd/doctor-git-checks.js +27 -3
  62. package/dist/resources/extensions/gsd/doctor-proactive.js +4 -1
  63. package/dist/resources/extensions/gsd/doctor-providers.js +48 -20
  64. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +22 -4
  65. package/dist/resources/extensions/gsd/doctor.js +7 -1
  66. package/dist/resources/extensions/gsd/error-classifier.js +6 -3
  67. package/dist/resources/extensions/gsd/escalation.js +321 -0
  68. package/dist/resources/extensions/gsd/forensics.js +26 -29
  69. package/dist/resources/extensions/gsd/git-service.js +0 -1
  70. package/dist/resources/extensions/gsd/graph.js +26 -2
  71. package/dist/resources/extensions/gsd/gsd-db.js +490 -32
  72. package/dist/resources/extensions/gsd/health-widget-core.js +42 -14
  73. package/dist/resources/extensions/gsd/health-widget.js +7 -4
  74. package/dist/resources/extensions/gsd/init-wizard.js +86 -45
  75. package/dist/resources/extensions/gsd/markdown-renderer.js +5 -5
  76. package/dist/resources/extensions/gsd/memory-embeddings.js +219 -0
  77. package/dist/resources/extensions/gsd/memory-extractor.js +78 -27
  78. package/dist/resources/extensions/gsd/memory-ingest.js +218 -0
  79. package/dist/resources/extensions/gsd/memory-relations.js +189 -0
  80. package/dist/resources/extensions/gsd/memory-source-store.js +113 -0
  81. package/dist/resources/extensions/gsd/memory-store.js +299 -6
  82. package/dist/resources/extensions/gsd/metrics.js +1 -0
  83. package/dist/resources/extensions/gsd/model-cost-table.js +3 -1
  84. package/dist/resources/extensions/gsd/model-router.js +16 -6
  85. package/dist/resources/extensions/gsd/native-git-bridge.js +137 -5
  86. package/dist/resources/extensions/gsd/notification-overlay.js +7 -22
  87. package/dist/resources/extensions/gsd/notification-widget.js +24 -39
  88. package/dist/resources/extensions/gsd/notifications.js +4 -0
  89. package/dist/resources/extensions/gsd/onboarding-state.js +133 -0
  90. package/dist/resources/extensions/gsd/post-execution-checks.js +27 -11
  91. package/dist/resources/extensions/gsd/pre-execution-checks.js +105 -8
  92. package/dist/resources/extensions/gsd/preferences-models.js +1 -0
  93. package/dist/resources/extensions/gsd/preferences-types.js +2 -1
  94. package/dist/resources/extensions/gsd/preferences-validation.js +42 -8
  95. package/dist/resources/extensions/gsd/preferences.js +10 -10
  96. package/dist/resources/extensions/gsd/prompts/add-tests.md +1 -0
  97. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
  98. package/dist/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
  99. package/dist/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
  100. package/dist/resources/extensions/gsd/prompts/execute-task.md +13 -1
  101. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  102. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -0
  103. package/dist/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  104. package/dist/resources/extensions/gsd/prompts/scan.md +79 -0
  105. package/dist/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
  106. package/dist/resources/extensions/gsd/python-resolver.js +70 -0
  107. package/dist/resources/extensions/gsd/run-manager.js +37 -17
  108. package/dist/resources/extensions/gsd/setup-catalog.js +75 -0
  109. package/dist/resources/extensions/gsd/state.js +47 -3
  110. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
  111. package/dist/resources/extensions/gsd/tools/complete-task.js +80 -0
  112. package/dist/resources/extensions/gsd/tools/memory-tools.js +306 -0
  113. package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -12
  114. package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -2
  115. package/dist/resources/extensions/gsd/tools/skip-slice.js +78 -0
  116. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +14 -0
  117. package/dist/resources/extensions/gsd/uok/flags.js +7 -7
  118. package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
  119. package/dist/resources/extensions/gsd/verification-gate.js +2 -1
  120. package/dist/resources/extensions/gsd/workflow-dispatch.js +64 -0
  121. package/dist/resources/extensions/gsd/workflow-install.js +327 -0
  122. package/dist/resources/extensions/gsd/workflow-manifest.js +8 -0
  123. package/dist/resources/extensions/gsd/workflow-mcp.js +1 -6
  124. package/dist/resources/extensions/gsd/workflow-plugins.js +346 -0
  125. package/dist/resources/extensions/gsd/workflow-projections.js +17 -15
  126. package/dist/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
  127. package/dist/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
  128. package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
  129. package/dist/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
  130. package/dist/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
  131. package/dist/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
  132. package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
  133. package/dist/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
  134. package/dist/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
  135. package/dist/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
  136. package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
  137. package/dist/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
  138. package/dist/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
  139. package/dist/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
  140. package/dist/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
  141. package/dist/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
  142. package/dist/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
  143. package/dist/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
  144. package/dist/resources/extensions/gsd/workflow-templates/registry.json +184 -0
  145. package/dist/resources/extensions/gsd/workflow-templates/release.md +118 -0
  146. package/dist/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
  147. package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
  148. package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
  149. package/dist/resources/extensions/gsd/workflow-templates/spike.md +1 -0
  150. package/dist/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
  151. package/dist/resources/extensions/gsd/worktree-resolver.js +42 -1
  152. package/dist/resources/extensions/remote-questions/commands.js +380 -0
  153. package/dist/resources/extensions/remote-questions/manager.js +39 -5
  154. package/dist/resources/extensions/remote-questions/telegram-adapter.js +79 -4
  155. package/dist/resources/extensions/search-the-web/command-search-provider.js +4 -1
  156. package/dist/resources/extensions/search-the-web/native-search.js +13 -2
  157. package/dist/resources/extensions/shared/interview-ui.js +189 -1
  158. package/dist/resources/extensions/shared/layout-utils.js +17 -0
  159. package/dist/resources/extensions/shared/rtk-shared.js +47 -0
  160. package/dist/resources/extensions/shared/rtk.js +3 -46
  161. package/dist/resources/skills/create-workflow/SKILL.md +33 -6
  162. package/dist/rtk-shared.d.ts +10 -0
  163. package/dist/rtk-shared.js +47 -0
  164. package/dist/rtk.d.ts +2 -6
  165. package/dist/rtk.js +3 -48
  166. package/dist/shared/workspace-types.d.ts +52 -0
  167. package/dist/shared/workspace-types.js +1 -0
  168. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  169. package/dist/update-check.d.ts +10 -0
  170. package/dist/update-check.js +24 -3
  171. package/dist/web/standalone/.next/BUILD_ID +1 -1
  172. package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
  173. package/dist/web/standalone/.next/build-manifest.json +3 -3
  174. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  175. package/dist/web/standalone/.next/required-server-files.json +1 -1
  176. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  178. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  179. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  180. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  181. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  182. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  183. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  184. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  185. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  187. package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
  188. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  189. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  190. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  191. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  192. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  193. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  194. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  201. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  202. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  204. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  208. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  210. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  212. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  214. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  216. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  218. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  220. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  224. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  226. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  227. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  228. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  230. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  232. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  234. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  235. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  236. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  238. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  239. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  240. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  241. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  242. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  244. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  245. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  246. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  247. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  248. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  249. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  250. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  251. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  252. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  253. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  254. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  255. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  256. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  257. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  258. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  259. package/dist/web/standalone/.next/server/app/index.html +1 -1
  260. package/dist/web/standalone/.next/server/app/index.rsc +3 -3
  261. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  262. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
  263. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  264. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  265. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  266. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  267. package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
  268. package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
  269. package/dist/web/standalone/.next/server/chunks/7461.js +1 -0
  270. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  271. package/dist/web/standalone/.next/server/middleware-manifest.json +1 -1
  272. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  273. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  274. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  275. package/dist/web/standalone/.next/static/chunks/2826.e59e8578e2e28639.js +9 -0
  276. package/dist/web/standalone/.next/static/chunks/{2008.71ee9230ad78df21.js → 3621.fc7480022c972438.js} +2 -2
  277. package/dist/web/standalone/.next/static/chunks/app/{page-7115e62689b5fd84.js → page-151349214571e2b6.js} +1 -1
  278. package/dist/web/standalone/.next/static/chunks/{webpack-b868033a5834586d.js → webpack-5fc74f13a25fa1bb.js} +1 -1
  279. package/dist/web/standalone/.next/static/css/632cd626b1731d88.css +1 -0
  280. package/dist/web/standalone/server.js +1 -1
  281. package/dist/welcome-screen.js +48 -24
  282. package/dist/wizard.js +2 -2
  283. package/dist/worktree-cli.d.ts +6 -5
  284. package/dist/worktree-cli.js +23 -7
  285. package/package.json +3 -3
  286. package/packages/daemon/package.json +2 -2
  287. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  288. package/packages/mcp-server/dist/server.js +12 -10
  289. package/packages/mcp-server/dist/server.js.map +1 -1
  290. package/packages/mcp-server/dist/session-manager.d.ts.map +1 -1
  291. package/packages/mcp-server/dist/session-manager.js +8 -1
  292. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  293. package/packages/mcp-server/dist/workflow-tools.d.ts +1 -0
  294. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  295. package/packages/mcp-server/dist/workflow-tools.js +207 -71
  296. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  297. package/packages/mcp-server/package.json +2 -2
  298. package/packages/mcp-server/src/mcp-server.test.ts +40 -4
  299. package/packages/mcp-server/src/server.ts +12 -10
  300. package/packages/mcp-server/src/session-manager.ts +10 -3
  301. package/packages/mcp-server/src/workflow-tools.test.ts +346 -1
  302. package/packages/mcp-server/src/workflow-tools.ts +228 -75
  303. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  304. package/packages/native/package.json +1 -1
  305. package/packages/native/tsconfig.tsbuildinfo +1 -1
  306. package/packages/pi-agent-core/package.json +1 -1
  307. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  308. package/packages/pi-ai/dist/index.d.ts +1 -0
  309. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  310. package/packages/pi-ai/dist/index.js +1 -0
  311. package/packages/pi-ai/dist/index.js.map +1 -1
  312. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
  313. package/packages/pi-ai/dist/models/capability-patches.js +3 -2
  314. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
  315. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +68 -0
  316. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -1
  317. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +68 -0
  318. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -1
  319. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +17 -0
  320. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -1
  321. package/packages/pi-ai/dist/models/generated/anthropic.js +17 -0
  322. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -1
  323. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +17 -0
  324. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -1
  325. package/packages/pi-ai/dist/models/generated/google-antigravity.js +17 -0
  326. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -1
  327. package/packages/pi-ai/dist/models/generated/groq.d.ts +0 -153
  328. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -1
  329. package/packages/pi-ai/dist/models/generated/groq.js +0 -153
  330. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -1
  331. package/packages/pi-ai/dist/models/generated/index.d.ts +136 -153
  332. package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
  333. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
  334. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
  335. package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
  336. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
  337. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +17 -0
  338. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -1
  339. package/packages/pi-ai/dist/models/generated/openrouter.js +17 -0
  340. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -1
  341. package/packages/pi-ai/dist/models.generated.test.js +17 -0
  342. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  343. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts +22 -1
  344. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  345. package/packages/pi-ai/dist/providers/amazon-bedrock.js +40 -6
  346. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  347. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts +2 -0
  348. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts.map +1 -0
  349. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js +106 -0
  350. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js.map +1 -0
  351. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +42 -1
  352. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  353. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +20 -1
  354. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  355. package/packages/pi-ai/dist/providers/anthropic-shared.js +32 -2
  356. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  357. package/packages/pi-ai/dist/providers/anthropic-shared.test.js +12 -1
  358. package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -1
  359. package/packages/pi-ai/dist/providers/anthropic.d.ts +11 -0
  360. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  361. package/packages/pi-ai/dist/providers/anthropic.js +18 -1
  362. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  363. package/packages/pi-ai/dist/providers/api-family.d.ts +27 -0
  364. package/packages/pi-ai/dist/providers/api-family.d.ts.map +1 -0
  365. package/packages/pi-ai/dist/providers/api-family.js +47 -0
  366. package/packages/pi-ai/dist/providers/api-family.js.map +1 -0
  367. package/packages/pi-ai/dist/providers/api-family.test.d.ts +2 -0
  368. package/packages/pi-ai/dist/providers/api-family.test.d.ts.map +1 -0
  369. package/packages/pi-ai/dist/providers/api-family.test.js +101 -0
  370. package/packages/pi-ai/dist/providers/api-family.test.js.map +1 -0
  371. package/packages/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
  372. package/packages/pi-ai/dist/utils/oauth/openai-codex.js +12 -0
  373. package/packages/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
  374. package/packages/pi-ai/package.json +2 -2
  375. package/packages/pi-ai/scripts/generate-models.ts +50 -0
  376. package/packages/pi-ai/src/index.ts +1 -0
  377. package/packages/pi-ai/src/models/capability-patches.ts +5 -2
  378. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +68 -0
  379. package/packages/pi-ai/src/models/generated/anthropic.ts +17 -0
  380. package/packages/pi-ai/src/models/generated/google-antigravity.ts +17 -0
  381. package/packages/pi-ai/src/models/generated/groq.ts +0 -153
  382. package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
  383. package/packages/pi-ai/src/models/generated/openrouter.ts +17 -0
  384. package/packages/pi-ai/src/models.generated.test.ts +17 -0
  385. package/packages/pi-ai/src/providers/amazon-bedrock.test.ts +164 -0
  386. package/packages/pi-ai/src/providers/amazon-bedrock.ts +41 -7
  387. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +47 -1
  388. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +15 -1
  389. package/packages/pi-ai/src/providers/anthropic-shared.ts +36 -3
  390. package/packages/pi-ai/src/providers/anthropic.ts +19 -1
  391. package/packages/pi-ai/src/providers/api-family.test.ts +129 -0
  392. package/packages/pi-ai/src/providers/api-family.ts +57 -0
  393. package/packages/pi-ai/src/utils/oauth/openai-codex.ts +15 -0
  394. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  395. package/packages/pi-coding-agent/dist/cli/args.d.ts +6 -0
  396. package/packages/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
  397. package/packages/pi-coding-agent/dist/cli/args.js +14 -4
  398. package/packages/pi-coding-agent/dist/cli/args.js.map +1 -1
  399. package/packages/pi-coding-agent/dist/cli/args.test.d.ts +2 -0
  400. package/packages/pi-coding-agent/dist/cli/args.test.d.ts.map +1 -0
  401. package/packages/pi-coding-agent/dist/cli/args.test.js +38 -0
  402. package/packages/pi-coding-agent/dist/cli/args.test.js.map +1 -0
  403. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts +2 -0
  404. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts.map +1 -0
  405. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +38 -0
  406. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -0
  407. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +14 -0
  408. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  409. package/packages/pi-coding-agent/dist/core/auth-storage.js +34 -0
  410. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  411. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +74 -0
  412. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  413. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +4 -1
  414. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  415. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +1 -0
  416. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  417. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  418. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +2 -1
  419. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  420. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  421. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +32 -0
  422. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  423. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  424. package/packages/pi-coding-agent/dist/core/retry-handler.js +4 -1
  425. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  426. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -0
  427. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  428. package/packages/pi-coding-agent/dist/core/sdk.js +39 -1
  429. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  430. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +2 -2
  431. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  432. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  433. package/packages/pi-coding-agent/dist/main.js +3 -0
  434. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  435. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  436. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +17 -7
  437. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  438. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  439. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +48 -34
  440. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  441. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts +4 -0
  442. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  443. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +83 -33
  444. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  445. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
  446. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  447. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +77 -0
  448. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  449. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -66
  450. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  451. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +1 -75
  452. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  453. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts +1 -1
  454. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  455. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +192 -24
  456. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  457. package/packages/pi-coding-agent/package.json +1 -1
  458. package/packages/pi-coding-agent/src/cli/args.test.ts +44 -0
  459. package/packages/pi-coding-agent/src/cli/args.ts +21 -6
  460. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +56 -0
  461. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +83 -0
  462. package/packages/pi-coding-agent/src/core/auth-storage.ts +35 -0
  463. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +4 -1
  464. package/packages/pi-coding-agent/src/core/extensions/runner.ts +4 -1
  465. package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -2
  466. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +37 -1
  467. package/packages/pi-coding-agent/src/core/retry-handler.ts +4 -1
  468. package/packages/pi-coding-agent/src/core/sdk.ts +58 -1
  469. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +2 -2
  470. package/packages/pi-coding-agent/src/main.ts +4 -0
  471. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +19 -7
  472. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +53 -31
  473. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +88 -36
  474. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +83 -0
  475. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +2 -83
  476. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +208 -27
  477. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  478. package/packages/pi-tui/package.json +1 -1
  479. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  480. package/packages/rpc-client/package.json +1 -1
  481. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  482. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
  483. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  484. package/pkg/dist/modes/interactive/theme/theme-schema.js +77 -0
  485. package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  486. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -66
  487. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  488. package/pkg/dist/modes/interactive/theme/theme.js +1 -75
  489. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  490. package/pkg/dist/modes/interactive/theme/themes.d.ts +1 -1
  491. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  492. package/pkg/dist/modes/interactive/theme/themes.js +192 -24
  493. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  494. package/pkg/package.json +1 -1
  495. package/src/resources/extensions/ask-user-questions.ts +24 -6
  496. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  497. package/src/resources/extensions/claude-code-cli/readiness.ts +13 -2
  498. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +94 -4
  499. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +84 -0
  500. package/src/resources/extensions/gsd/auto/detect-stuck.ts +10 -0
  501. package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -9
  502. package/src/resources/extensions/gsd/auto/loop.ts +109 -3
  503. package/src/resources/extensions/gsd/auto/phases.ts +97 -60
  504. package/src/resources/extensions/gsd/auto/resolve.ts +1 -1
  505. package/src/resources/extensions/gsd/auto/run-unit.ts +11 -1
  506. package/src/resources/extensions/gsd/auto/session.ts +7 -0
  507. package/src/resources/extensions/gsd/auto-artifact-paths.ts +20 -0
  508. package/src/resources/extensions/gsd/auto-dashboard.ts +46 -5
  509. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
  510. package/src/resources/extensions/gsd/auto-dispatch.ts +141 -9
  511. package/src/resources/extensions/gsd/auto-loop.ts +1 -1
  512. package/src/resources/extensions/gsd/auto-model-selection.ts +17 -4
  513. package/src/resources/extensions/gsd/auto-post-unit.ts +10 -8
  514. package/src/resources/extensions/gsd/auto-prompts.ts +232 -47
  515. package/src/resources/extensions/gsd/auto-recovery.ts +63 -1
  516. package/src/resources/extensions/gsd/auto-start.ts +8 -6
  517. package/src/resources/extensions/gsd/auto-verification.ts +3 -3
  518. package/src/resources/extensions/gsd/auto-worktree.ts +81 -1
  519. package/src/resources/extensions/gsd/auto.ts +61 -28
  520. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +8 -21
  521. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +46 -24
  522. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +158 -0
  523. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +31 -0
  524. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
  525. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
  526. package/src/resources/extensions/gsd/bootstrap/system-context.ts +20 -4
  527. package/src/resources/extensions/gsd/commands/catalog.ts +74 -9
  528. package/src/resources/extensions/gsd/commands/handlers/core.ts +69 -27
  529. package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
  530. package/src/resources/extensions/gsd/commands/handlers/onboarding.ts +196 -0
  531. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  532. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +279 -29
  533. package/src/resources/extensions/gsd/commands-cmux.ts +6 -2
  534. package/src/resources/extensions/gsd/commands-config.ts +10 -0
  535. package/src/resources/extensions/gsd/commands-debug.ts +484 -0
  536. package/src/resources/extensions/gsd/commands-do.ts +1 -0
  537. package/src/resources/extensions/gsd/commands-extract-learnings.ts +295 -76
  538. package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
  539. package/src/resources/extensions/gsd/commands-memory.ts +551 -0
  540. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +49 -12
  541. package/src/resources/extensions/gsd/commands-scan.ts +125 -0
  542. package/src/resources/extensions/gsd/commands-workflow-templates.ts +129 -2
  543. package/src/resources/extensions/gsd/custom-workflow-engine.ts +85 -60
  544. package/src/resources/extensions/gsd/db-writer.ts +3 -0
  545. package/src/resources/extensions/gsd/debug-session-store.ts +377 -0
  546. package/src/resources/extensions/gsd/definition-loader.ts +7 -0
  547. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -9
  548. package/src/resources/extensions/gsd/doctor-environment.ts +2 -1
  549. package/src/resources/extensions/gsd/doctor-git-checks.ts +28 -3
  550. package/src/resources/extensions/gsd/doctor-proactive.ts +4 -1
  551. package/src/resources/extensions/gsd/doctor-providers.ts +52 -22
  552. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +23 -4
  553. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  554. package/src/resources/extensions/gsd/doctor.ts +7 -1
  555. package/src/resources/extensions/gsd/error-classifier.ts +6 -3
  556. package/src/resources/extensions/gsd/escalation.ts +367 -0
  557. package/src/resources/extensions/gsd/forensics.ts +25 -29
  558. package/src/resources/extensions/gsd/git-service.ts +0 -1
  559. package/src/resources/extensions/gsd/graph.ts +33 -3
  560. package/src/resources/extensions/gsd/gsd-db.ts +578 -32
  561. package/src/resources/extensions/gsd/health-widget-core.ts +43 -14
  562. package/src/resources/extensions/gsd/health-widget.ts +7 -3
  563. package/src/resources/extensions/gsd/init-wizard.ts +87 -54
  564. package/src/resources/extensions/gsd/markdown-renderer.ts +5 -5
  565. package/src/resources/extensions/gsd/memory-embeddings.ts +235 -0
  566. package/src/resources/extensions/gsd/memory-extractor.ts +100 -34
  567. package/src/resources/extensions/gsd/memory-ingest.ts +286 -0
  568. package/src/resources/extensions/gsd/memory-relations.ts +240 -0
  569. package/src/resources/extensions/gsd/memory-source-store.ts +138 -0
  570. package/src/resources/extensions/gsd/memory-store.ts +351 -7
  571. package/src/resources/extensions/gsd/metrics.ts +1 -0
  572. package/src/resources/extensions/gsd/model-cost-table.ts +3 -1
  573. package/src/resources/extensions/gsd/model-router.ts +25 -6
  574. package/src/resources/extensions/gsd/native-git-bridge.ts +134 -6
  575. package/src/resources/extensions/gsd/notification-overlay.ts +9 -19
  576. package/src/resources/extensions/gsd/notification-widget.ts +25 -43
  577. package/src/resources/extensions/gsd/notifications.ts +6 -0
  578. package/src/resources/extensions/gsd/onboarding-state.ts +146 -0
  579. package/src/resources/extensions/gsd/post-execution-checks.ts +37 -14
  580. package/src/resources/extensions/gsd/pre-execution-checks.ts +106 -12
  581. package/src/resources/extensions/gsd/preferences-models.ts +1 -0
  582. package/src/resources/extensions/gsd/preferences-types.ts +10 -2
  583. package/src/resources/extensions/gsd/preferences-validation.ts +33 -7
  584. package/src/resources/extensions/gsd/preferences.ts +10 -10
  585. package/src/resources/extensions/gsd/prompts/add-tests.md +1 -0
  586. package/src/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
  587. package/src/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
  588. package/src/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
  589. package/src/resources/extensions/gsd/prompts/execute-task.md +13 -1
  590. package/src/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  591. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -0
  592. package/src/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  593. package/src/resources/extensions/gsd/prompts/scan.md +79 -0
  594. package/src/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
  595. package/src/resources/extensions/gsd/python-resolver.ts +76 -0
  596. package/src/resources/extensions/gsd/run-manager.ts +53 -19
  597. package/src/resources/extensions/gsd/setup-catalog.ts +105 -0
  598. package/src/resources/extensions/gsd/state.ts +50 -2
  599. package/src/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
  600. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +1 -34
  601. package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +7 -0
  602. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +49 -0
  603. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +45 -31
  604. package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +63 -0
  605. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +12 -0
  606. package/src/resources/extensions/gsd/tests/auto-prompts-fallback.test.ts +35 -0
  607. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +123 -1
  608. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +39 -0
  609. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +39 -0
  610. package/src/resources/extensions/gsd/tests/commands-do.test.ts +48 -0
  611. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +333 -21
  612. package/src/resources/extensions/gsd/tests/commands-scan.test.ts +351 -0
  613. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +8 -6
  614. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +6 -8
  615. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  616. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +63 -0
  617. package/src/resources/extensions/gsd/tests/debug-command-handler.test.ts +905 -0
  618. package/src/resources/extensions/gsd/tests/debug-command-lifecycle.integration.test.ts +1229 -0
  619. package/src/resources/extensions/gsd/tests/debug-session-store.test.ts +565 -0
  620. package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +64 -0
  621. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +67 -0
  622. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +62 -18
  623. package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +5 -0
  624. package/src/resources/extensions/gsd/tests/escalation.test.ts +818 -0
  625. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +29 -12
  626. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +106 -0
  627. package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +74 -0
  628. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +0 -4
  629. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -1
  630. package/src/resources/extensions/gsd/tests/health-widget.test.ts +8 -2
  631. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +190 -0
  632. package/src/resources/extensions/gsd/tests/integration/doctor-git-symlink-cwd.test.ts +79 -0
  633. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +39 -0
  634. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +44 -0
  635. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +68 -1
  636. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +109 -11
  637. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +51 -0
  638. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +2 -2
  639. package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
  640. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +171 -1
  641. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  642. package/src/resources/extensions/gsd/tests/memory-embeddings.test.ts +213 -0
  643. package/src/resources/extensions/gsd/tests/memory-ingest.test.ts +153 -0
  644. package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +107 -0
  645. package/src/resources/extensions/gsd/tests/memory-relations.test.ts +175 -0
  646. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  647. package/src/resources/extensions/gsd/tests/memory-tools.test.ts +295 -0
  648. package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +3 -2
  649. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +2 -2
  650. package/src/resources/extensions/gsd/tests/model-router.test.ts +51 -1
  651. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +59 -0
  652. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +56 -37
  653. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +1 -1
  654. package/src/resources/extensions/gsd/tests/onboarding-state.test.ts +105 -0
  655. package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +114 -0
  656. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +4 -5
  657. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +17 -0
  658. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -1
  659. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +341 -6
  660. package/src/resources/extensions/gsd/tests/preferences.test.ts +69 -1
  661. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +539 -0
  662. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +11 -2
  663. package/src/resources/extensions/gsd/tests/projection-regression.test.ts +7 -0
  664. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +159 -8
  665. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +24 -0
  666. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +1 -1
  667. package/src/resources/extensions/gsd/tests/prompts-no-gitignored-test-refs.test.ts +56 -0
  668. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +33 -0
  669. package/src/resources/extensions/gsd/tests/python-resolver.test.ts +131 -0
  670. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +67 -0
  671. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +107 -0
  672. package/src/resources/extensions/gsd/tests/requirements.test.ts +9 -0
  673. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +153 -0
  674. package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +125 -0
  675. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +16 -4
  676. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +54 -0
  677. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -0
  678. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +15 -0
  679. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +5 -0
  680. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +2 -1
  681. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +31 -1
  682. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +166 -0
  683. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +35 -0
  684. package/src/resources/extensions/gsd/tests/workflow-install.test.ts +113 -0
  685. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +15 -6
  686. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  687. package/src/resources/extensions/gsd/tests/workflow-plugins.test.ts +310 -0
  688. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +7 -0
  689. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +8 -2
  690. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +97 -0
  691. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +2 -1
  692. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +77 -2
  693. package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
  694. package/src/resources/extensions/gsd/tools/memory-tools.ts +380 -0
  695. package/src/resources/extensions/gsd/tools/plan-milestone.ts +42 -8
  696. package/src/resources/extensions/gsd/tools/plan-slice.ts +6 -1
  697. package/src/resources/extensions/gsd/tools/skip-slice.ts +133 -0
  698. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +14 -0
  699. package/src/resources/extensions/gsd/types.ts +62 -0
  700. package/src/resources/extensions/gsd/unit-runtime.ts +1 -0
  701. package/src/resources/extensions/gsd/uok/contracts.ts +2 -1
  702. package/src/resources/extensions/gsd/uok/flags.ts +7 -7
  703. package/src/resources/extensions/gsd/uok/kernel.ts +16 -4
  704. package/src/resources/extensions/gsd/verification-gate.ts +2 -1
  705. package/src/resources/extensions/gsd/workflow-dispatch.ts +106 -0
  706. package/src/resources/extensions/gsd/workflow-install.ts +423 -0
  707. package/src/resources/extensions/gsd/workflow-logger.ts +3 -1
  708. package/src/resources/extensions/gsd/workflow-manifest.ts +8 -0
  709. package/src/resources/extensions/gsd/workflow-mcp.ts +1 -6
  710. package/src/resources/extensions/gsd/workflow-plugins.ts +403 -0
  711. package/src/resources/extensions/gsd/workflow-projections.ts +18 -16
  712. package/src/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
  713. package/src/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
  714. package/src/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
  715. package/src/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
  716. package/src/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
  717. package/src/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
  718. package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
  719. package/src/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
  720. package/src/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
  721. package/src/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
  722. package/src/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
  723. package/src/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
  724. package/src/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
  725. package/src/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
  726. package/src/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
  727. package/src/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
  728. package/src/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
  729. package/src/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
  730. package/src/resources/extensions/gsd/workflow-templates/registry.json +184 -0
  731. package/src/resources/extensions/gsd/workflow-templates/release.md +118 -0
  732. package/src/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
  733. package/src/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
  734. package/src/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
  735. package/src/resources/extensions/gsd/workflow-templates/spike.md +1 -0
  736. package/src/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
  737. package/src/resources/extensions/gsd/workflow-templates.ts +7 -0
  738. package/src/resources/extensions/gsd/workspace-index.ts +9 -4
  739. package/src/resources/extensions/gsd/worktree-resolver.ts +47 -1
  740. package/src/resources/extensions/remote-questions/commands.ts +480 -0
  741. package/src/resources/extensions/remote-questions/manager.ts +49 -4
  742. package/src/resources/extensions/remote-questions/telegram-adapter.ts +86 -4
  743. package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +246 -0
  744. package/src/resources/extensions/remote-questions/tests/remote-answer-normalization.test.ts +92 -0
  745. package/src/resources/extensions/remote-questions/tests/telegram-commands.test.ts +267 -0
  746. package/src/resources/extensions/search-the-web/command-search-provider.ts +4 -1
  747. package/src/resources/extensions/search-the-web/native-search.ts +13 -3
  748. package/src/resources/extensions/shared/interview-ui.ts +195 -1
  749. package/src/resources/extensions/shared/layout-utils.ts +26 -0
  750. package/src/resources/extensions/shared/rtk-shared.ts +58 -0
  751. package/src/resources/extensions/shared/rtk.ts +12 -52
  752. package/src/resources/extensions/shared/tests/interview-preview.test.ts +177 -0
  753. package/src/resources/extensions/shared/tests/preview-layout.test.ts +120 -0
  754. package/src/resources/skills/create-workflow/SKILL.md +33 -6
  755. package/dist/web/standalone/.next/static/chunks/2826.dd3dc8bbd3025fa5.js +0 -9
  756. package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
  757. package/packages/native/dist/ps/types.d.ts +0 -5
  758. package/packages/native/dist/ps/types.js +0 -2
  759. package/packages/native/src/ps/types.ts +0 -5
  760. package/packages/pi-ai/node_modules/@smithy/node-http-handler/LICENSE +0 -201
  761. package/packages/pi-ai/node_modules/@smithy/node-http-handler/README.md +0 -9
  762. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-cjs/index.js +0 -762
  763. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/build-abort-error.js +0 -19
  764. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/constants.js +0 -1
  765. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/get-transformed-headers.js +0 -9
  766. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/index.js +0 -3
  767. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js +0 -230
  768. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-manager.js +0 -87
  769. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-pool.js +0 -32
  770. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-handler.js +0 -169
  771. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/readable.mock.js +0 -21
  772. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/server.mock.js +0 -88
  773. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-connection-timeout.js +0 -36
  774. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-request-timeout.js +0 -21
  775. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-keep-alive.js +0 -22
  776. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-timeout.js +0 -23
  777. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/collector.js +0 -8
  778. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/index.js +0 -41
  779. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/readable.mock.js +0 -21
  780. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/timing.js +0 -4
  781. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/write-request-body.js +0 -63
  782. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/build-abort-error.d.ts +0 -10
  783. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/constants.d.ts +0 -5
  784. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/get-transformed-headers.d.ts +0 -4
  785. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/index.d.ts +0 -3
  786. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http-handler.d.ts +0 -46
  787. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-manager.d.ts +0 -24
  788. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-pool.d.ts +0 -12
  789. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-handler.d.ts +0 -63
  790. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/readable.mock.d.ts +0 -13
  791. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/server.mock.d.ts +0 -12
  792. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-connection-timeout.d.ts +0 -2
  793. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-request-timeout.d.ts +0 -6
  794. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-keep-alive.d.ts +0 -6
  795. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-timeout.d.ts +0 -2
  796. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/collector.d.ts +0 -5
  797. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/index.d.ts +0 -6
  798. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/readable.mock.d.ts +0 -13
  799. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/timing.d.ts +0 -8
  800. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/build-abort-error.d.ts +0 -10
  801. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/constants.d.ts +0 -5
  802. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/get-transformed-headers.d.ts +0 -4
  803. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/index.d.ts +0 -3
  804. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http-handler.d.ts +0 -46
  805. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-manager.d.ts +0 -24
  806. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-pool.d.ts +0 -12
  807. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-handler.d.ts +0 -63
  808. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/readable.mock.d.ts +0 -13
  809. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/server.mock.d.ts +0 -12
  810. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-connection-timeout.d.ts +0 -2
  811. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-request-timeout.d.ts +0 -6
  812. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-keep-alive.d.ts +0 -6
  813. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-timeout.d.ts +0 -2
  814. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/collector.d.ts +0 -5
  815. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/index.d.ts +0 -6
  816. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/readable.mock.d.ts +0 -13
  817. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/timing.d.ts +0 -8
  818. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/write-request-body.d.ts +0 -12
  819. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/write-request-body.d.ts +0 -12
  820. package/packages/pi-ai/node_modules/@smithy/node-http-handler/package.json +0 -68
  821. package/packages/pi-ai/oauth.d.ts +0 -1
  822. package/packages/pi-ai/oauth.js +0 -1
  823. /package/dist/web/standalone/.next/static/{prkokVQFxWtUVIku57_0z → ssX7BLv3Dw9Fb4CtrCGeR}/_buildManifest.js +0 -0
  824. /package/dist/web/standalone/.next/static/{prkokVQFxWtUVIku57_0z → ssX7BLv3Dw9Fb4CtrCGeR}/_ssgManifest.js +0 -0
@@ -213,25 +213,42 @@ function getRunFinalizeBody(phasesSource: string): string {
213
213
 
214
214
  const fnBody = getRunFinalizeBody(phasesSource);
215
215
 
216
- // Both timeout handlers should increment consecutiveFinalizeTimeouts
217
- const incrementCount = (fnBody.match(/consecutiveFinalizeTimeouts\+\+/g) || []).length;
216
+ const helperCallCount = (fnBody.match(/failClosedOnFinalizeTimeout\(/g) || []).length;
218
217
  assertTrue(
219
- incrementCount >= 2,
220
- `should increment consecutiveFinalizeTimeouts in both pre and post handlers (found ${incrementCount})`,
218
+ helperCallCount >= 2,
219
+ `runFinalize should route both timeout branches through failClosedOnFinalizeTimeout (found ${helperCallCount})`,
221
220
  );
222
221
 
223
- // Both timeout handlers should check MAX_FINALIZE_TIMEOUTS for escalation
224
- const escalationCount = (fnBody.match(/MAX_FINALIZE_TIMEOUTS/g) || []).length;
222
+ const helperStart = phasesSource.indexOf("async function failClosedOnFinalizeTimeout");
223
+ assertTrue(helperStart > 0, "failClosedOnFinalizeTimeout helper should exist");
224
+ const helperEnd = phasesSource.indexOf("// ─── runPreDispatch", helperStart);
225
+ const helperBody = phasesSource.slice(helperStart, helperEnd > helperStart ? helperEnd : undefined);
226
+
227
+ const incrementCount = (helperBody.match(/consecutiveFinalizeTimeouts\+\+/g) || []).length;
225
228
  assertTrue(
226
- escalationCount >= 2,
227
- `should check MAX_FINALIZE_TIMEOUTS in both handlers (found ${escalationCount})`,
229
+ incrementCount >= 1,
230
+ `timeout helper should increment consecutiveFinalizeTimeouts (found ${incrementCount})`,
228
231
  );
229
232
 
230
- // Both timeout handlers should null out s.currentUnit to prevent late mutations
231
- const detachCount = (fnBody.match(/s\.currentUnit\s*=\s*null/g) || []).length;
233
+ const detachCount = (helperBody.match(/s\.currentUnit\s*=\s*null/g) || []).length;
234
+ assertTrue(
235
+ detachCount >= 1,
236
+ `timeout helper should detach s.currentUnit (found ${detachCount})`,
237
+ );
238
+
239
+ const pauseCount = (helperBody.match(/pauseAuto\(/g) || []).length;
240
+ assertTrue(
241
+ pauseCount >= 1,
242
+ `timeout helper should pause auto-mode (found ${pauseCount})`,
243
+ );
244
+
245
+ assertTrue(
246
+ helperBody.includes('eventType: "unit-end"'),
247
+ "timeout helper should emit a terminal unit-end event",
248
+ );
232
249
  assertTrue(
233
- detachCount >= 2,
234
- `should detach s.currentUnit in both timeout handlers (found ${detachCount})`,
250
+ helperBody.includes('phase: "finalize-timeout"'),
251
+ "timeout helper should persist finalize-timeout runtime state",
235
252
  );
236
253
 
237
254
  // Successful finalize should reset the counter
@@ -6,8 +6,14 @@
6
6
 
7
7
  import { describe, test } from "node:test";
8
8
  import assert from "node:assert/strict";
9
+ import { mkdtempSync, mkdirSync, writeFileSync, readFileSync, rmSync } from "node:fs";
10
+ import { tmpdir } from "node:os";
11
+ import { dirname, join } from "node:path";
12
+ import { fileURLToPath } from "node:url";
9
13
  import { buildFlatRateContext, isFlatRateProvider, resolvePreferredModelConfig } from "../auto-model-selection.ts";
10
14
 
15
+ const __dirname_4386 = dirname(fileURLToPath(import.meta.url));
16
+
11
17
  describe("flat-rate provider routing guard (#3453)", () => {
12
18
 
13
19
  test("isFlatRateProvider returns true for github-copilot", () => {
@@ -184,3 +190,103 @@ describe("buildFlatRateContext()", () => {
184
190
  assert.equal(result.authMode, undefined);
185
191
  });
186
192
  });
193
+
194
+ // ─── #4386: allow_flat_rate_providers opt-in ────────────────────────────────
195
+
196
+ describe("flat-rate routing opt-in (#4386)", () => {
197
+ function withPrefs(prefsYaml: string, fn: () => void): void {
198
+ const originalCwd = process.cwd();
199
+ const originalGsdHome = process.env.GSD_HOME;
200
+ const tempProject = mkdtempSync(join(tmpdir(), "gsd-4386-project-"));
201
+ const tempGsdHome = mkdtempSync(join(tmpdir(), "gsd-4386-home-"));
202
+ try {
203
+ mkdirSync(join(tempProject, ".gsd"), { recursive: true });
204
+ writeFileSync(
205
+ join(tempProject, ".gsd", "PREFERENCES.md"),
206
+ ["---", "version: 1", prefsYaml, "---"].join("\n"),
207
+ "utf-8",
208
+ );
209
+ process.env.GSD_HOME = tempGsdHome;
210
+ process.chdir(tempProject);
211
+ fn();
212
+ } finally {
213
+ process.chdir(originalCwd);
214
+ if (originalGsdHome === undefined) delete process.env.GSD_HOME;
215
+ else process.env.GSD_HOME = originalGsdHome;
216
+ rmSync(tempProject, { recursive: true, force: true });
217
+ rmSync(tempGsdHome, { recursive: true, force: true });
218
+ }
219
+ }
220
+
221
+ test("default (opt-in absent): flat-rate start model still returns undefined", () => {
222
+ withPrefs(
223
+ [
224
+ "dynamic_routing:",
225
+ " enabled: true",
226
+ " tier_models:",
227
+ " heavy: claude-opus-4-6",
228
+ ].join("\n"),
229
+ () => {
230
+ const result = resolvePreferredModelConfig("execute-task", {
231
+ provider: "claude-code",
232
+ id: "claude-opus-4-6",
233
+ });
234
+ assert.equal(result, undefined, "default must preserve #3453 bypass");
235
+ },
236
+ );
237
+ });
238
+
239
+ test("opt-in: synthesizes a routing config for flat-rate start model", () => {
240
+ withPrefs(
241
+ [
242
+ "dynamic_routing:",
243
+ " enabled: true",
244
+ " allow_flat_rate_providers: true",
245
+ " tier_models:",
246
+ " heavy: claude-opus-4-6",
247
+ ].join("\n"),
248
+ () => {
249
+ const result = resolvePreferredModelConfig("execute-task", {
250
+ provider: "claude-code",
251
+ id: "claude-opus-4-6",
252
+ });
253
+ assert.ok(result, "routing config should be synthesized");
254
+ assert.equal(result!.primary, "claude-opus-4-6");
255
+ },
256
+ );
257
+ });
258
+
259
+ test("explicit opt-out: flat-rate bypass still fires", () => {
260
+ withPrefs(
261
+ [
262
+ "dynamic_routing:",
263
+ " enabled: true",
264
+ " allow_flat_rate_providers: false",
265
+ " tier_models:",
266
+ " heavy: claude-opus-4-6",
267
+ ].join("\n"),
268
+ () => {
269
+ const result = resolvePreferredModelConfig("execute-task", {
270
+ provider: "claude-code",
271
+ id: "claude-opus-4-6",
272
+ });
273
+ assert.equal(result, undefined, "explicit opt-out behaves like default");
274
+ },
275
+ );
276
+ });
277
+ });
278
+
279
+ // ─── Banner transparency: auto-start respects the opt-in (#4386) ────────────
280
+
281
+ describe("auto-start banner respects allow_flat_rate_providers (#4386)", () => {
282
+ test("banner expression gates flat-rate disable on allow_flat_rate_providers", () => {
283
+ const src = readFileSync(
284
+ join(__dirname_4386, "..", "auto-start.ts"),
285
+ "utf-8",
286
+ );
287
+ assert.ok(
288
+ src.includes("routingConfig.allow_flat_rate_providers"),
289
+ "auto-start banner must read allow_flat_rate_providers so the banner reflects the opt-in",
290
+ );
291
+ });
292
+ });
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Regression test for #2826: detectMissingArtifacts must parse hook/
3
+ * compound unit types correctly, not just the first slash segment.
4
+ *
5
+ * Keys like "hook/telegram-progress/M007/S01" must yield:
6
+ * unitType = "hook/telegram-progress" (not "hook")
7
+ * unitId = "M007/S01" (not "telegram-progress/M007/S01")
8
+ *
9
+ * The fix extracts a shared splitCompletedKey() helper used by both
10
+ * forensics.ts and doctor-runtime-checks.ts.
11
+ */
12
+ import { describe, it } from "node:test";
13
+ import assert from "node:assert/strict";
14
+ import { readFileSync } from "node:fs";
15
+ import { join, dirname } from "node:path";
16
+ import { fileURLToPath } from "node:url";
17
+
18
+ const __dirname = dirname(fileURLToPath(import.meta.url));
19
+ const gsdDir = join(__dirname, "..");
20
+
21
+ describe("forensics hook compound key parsing (#2826)", () => {
22
+ const forensicsSrc = readFileSync(join(gsdDir, "forensics.ts"), "utf-8");
23
+ const doctorSrc = readFileSync(join(gsdDir, "doctor-runtime-checks.ts"), "utf-8");
24
+
25
+ it("forensics.ts exports splitCompletedKey helper", () => {
26
+ assert.ok(
27
+ forensicsSrc.includes("export function splitCompletedKey("),
28
+ "forensics.ts must export splitCompletedKey()",
29
+ );
30
+ });
31
+
32
+ it("splitCompletedKey handles hook/ prefix by splitting on the second slash", () => {
33
+ assert.ok(
34
+ forensicsSrc.includes('key.startsWith("hook/")'),
35
+ 'splitCompletedKey must branch on key.startsWith("hook/")',
36
+ );
37
+ assert.ok(
38
+ forensicsSrc.includes('key.indexOf("/", 5)'),
39
+ 'splitCompletedKey must use indexOf("/", 5) to find second slash past "hook/"',
40
+ );
41
+ });
42
+
43
+ it("detectMissingArtifacts delegates to splitCompletedKey", () => {
44
+ const fnStart = forensicsSrc.indexOf("function detectMissingArtifacts(");
45
+ assert.ok(fnStart !== -1, "detectMissingArtifacts must exist in forensics.ts");
46
+ const fnBody = forensicsSrc.slice(fnStart, fnStart + 1000);
47
+ assert.ok(
48
+ fnBody.includes("splitCompletedKey("),
49
+ "detectMissingArtifacts must call splitCompletedKey() rather than inline the split logic",
50
+ );
51
+ });
52
+
53
+ it("doctor-runtime-checks.ts imports and uses splitCompletedKey", () => {
54
+ assert.ok(
55
+ doctorSrc.includes('from "./forensics.js"'),
56
+ 'doctor-runtime-checks.ts must import from "./forensics.js"',
57
+ );
58
+ assert.ok(
59
+ doctorSrc.includes("splitCompletedKey"),
60
+ "doctor-runtime-checks.ts must use splitCompletedKey()",
61
+ );
62
+ });
63
+
64
+ it("splitCompletedKey unit: plain type", () => {
65
+ // Inline test of the helper logic to guard against future regressions
66
+ // without needing a filesystem setup.
67
+ const src = forensicsSrc;
68
+ // Confirm the plain-type branch also exists
69
+ assert.ok(
70
+ src.includes('slashIdx = key.indexOf("/")') || src.includes("key.indexOf(\"/\")"),
71
+ "splitCompletedKey must handle plain (non-hook) keys via first-slash split",
72
+ );
73
+ });
74
+ });
@@ -19,7 +19,6 @@ import {
19
19
  markStepComplete,
20
20
  expandIteration,
21
21
  initializeGraph,
22
- graphFromDefinition,
23
22
  type WorkflowGraph,
24
23
  type GraphStep,
25
24
  } from "../graph.ts";
@@ -459,9 +458,6 @@ describe("initializeGraph", () => {
459
458
  assert.deepStrictEqual(graph.steps[2].dependsOn, ["s1", "s2"]);
460
459
  });
461
460
 
462
- it("is also exported as graphFromDefinition (backward compat)", (t) => {
463
- assert.equal(graphFromDefinition, initializeGraph);
464
- });
465
461
  });
466
462
 
467
463
  // ─── Atomic write safety ─────────────────────────────────────────────────
@@ -23,6 +23,7 @@ import {
23
23
  insertTask,
24
24
  getTask,
25
25
  getSliceTasks,
26
+ checkpointDatabase,
26
27
  } from '../gsd-db.ts';
27
28
 
28
29
  // ═══════════════════════════════════════════════════════════════════════════
@@ -80,7 +81,7 @@ describe('gsd-db', () => {
80
81
  // Check schema_version table
81
82
  const adapter = _getAdapter()!;
82
83
  const version = adapter.prepare('SELECT MAX(version) as version FROM schema_version').get();
83
- assert.deepStrictEqual(version?.['version'], 15, 'schema version should be 15');
84
+ assert.deepStrictEqual(version?.['version'], 20, 'schema version should be 20');
84
85
 
85
86
  // Check tables exist by querying them
86
87
  const dRows = adapter.prepare('SELECT count(*) as cnt FROM decisions').get();
@@ -518,6 +519,48 @@ describe('gsd-db', () => {
518
519
  closeDatabase();
519
520
  });
520
521
 
522
+ // ─── checkpointDatabase ────────────────────────────────────────────────────
523
+
524
+ describe('checkpointDatabase', () => {
525
+ test('checkpointDatabase: flushes WAL into base file (TRUNCATE)', (t) => {
526
+ const dbPath = tempDbPath();
527
+ t.after(() => cleanup(dbPath));
528
+
529
+ openDatabase(dbPath);
530
+
531
+ // Write enough data to ensure WAL has content
532
+ transaction(() => {
533
+ insertDecision({
534
+ id: 'D001',
535
+ when_context: 'test',
536
+ scope: 'global',
537
+ decision: 'WAL flush test',
538
+ choice: 'checkpoint',
539
+ rationale: 'WAL checkpoint regression test — #4418',
540
+ revisable: 'yes',
541
+ made_by: 'agent',
542
+ superseded_by: null,
543
+ });
544
+ });
545
+
546
+ const walPath = dbPath + '-wal';
547
+ assert.ok(fs.existsSync(walPath), 'WAL file should exist after write');
548
+ const walSizeBefore = fs.statSync(walPath).size;
549
+ assert.ok(walSizeBefore > 0, 'WAL file should be non-empty after write');
550
+
551
+ checkpointDatabase();
552
+
553
+ const walSizeAfter = fs.existsSync(walPath) ? fs.statSync(walPath).size : 0;
554
+ assert.equal(walSizeAfter, 0, 'WAL file should be truncated to 0 after checkpoint');
555
+ });
556
+
557
+ test('checkpointDatabase: is a no-op when no database is open', () => {
558
+ closeDatabase();
559
+ // Must not throw
560
+ assert.doesNotThrow(() => checkpointDatabase());
561
+ });
562
+ });
563
+
521
564
  // ─── Final Report ──────────────────────────────────────────────────────────
522
565
 
523
566
  });
@@ -191,6 +191,7 @@ test("session_start bootstraps the health widget alongside notifications", async
191
191
  });
192
192
 
193
193
  const widgets: string[] = [];
194
+ const statuses: string[] = [];
194
195
  const handlers = new Map<string, (event: unknown, ctx: any) => Promise<void> | void>();
195
196
  const pi = {
196
197
  on(event: string, handler: (event: unknown, ctx: any) => Promise<void> | void) {
@@ -206,7 +207,9 @@ test("session_start bootstraps the health widget alongside notifications", async
206
207
  hasUI: true,
207
208
  ui: {
208
209
  notify: () => {},
209
- setStatus: () => {},
210
+ setStatus: (key: string) => {
211
+ statuses.push(key);
212
+ },
210
213
  setWorkingMessage: () => {},
211
214
  onTerminalInput: () => () => {},
212
215
  setWidget: (key: string) => {
@@ -220,5 +223,8 @@ test("session_start bootstraps the health widget alongside notifications", async
220
223
  } as any);
221
224
 
222
225
  assert.ok(widgets.includes("gsd-health"), "health widget is bootstrapped");
223
- assert.ok(widgets.includes("gsd-notifications"), "notification widget still boots");
226
+ assert.ok(
227
+ statuses.some((k) => k.includes("notifications")),
228
+ "notification status chip is registered",
229
+ );
224
230
  });
@@ -0,0 +1,190 @@
1
+ // GSD — /gsd init → unified preferences-write routing tests.
2
+ //
3
+ // Verifies the refactor that routes init's preferences write through the same
4
+ // writePreferencesFile helper used by handlePrefsWizard, and that the typed
5
+ // ProjectPreferences shape maps correctly into the wizard's
6
+ // Record<string, unknown> shape.
7
+
8
+ import test from "node:test";
9
+ import assert from "node:assert/strict";
10
+ import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
11
+ import { tmpdir } from "node:os";
12
+ import { join } from "node:path";
13
+
14
+ import { mapInitPrefsToWizardShape } from "../init-wizard.ts";
15
+ import { writePreferencesFile } from "../commands-prefs-wizard.ts";
16
+
17
+ test("mapInitPrefsToWizardShape — full roundtrip with all fields", () => {
18
+ const out = mapInitPrefsToWizardShape({
19
+ mode: "team",
20
+ gitIsolation: "branch",
21
+ mainBranch: "develop",
22
+ verificationCommands: ["npm test", "npm run lint"],
23
+ customInstructions: ["Use TypeScript strict mode", "Always write tests"],
24
+ tokenProfile: "quality",
25
+ skipResearch: true,
26
+ autoPush: false,
27
+ });
28
+
29
+ assert.equal(out.mode, "team");
30
+ assert.deepEqual(out.git, { isolation: "branch", main_branch: "develop", auto_push: false });
31
+ assert.deepEqual(out.verification_commands, ["npm test", "npm run lint"]);
32
+ assert.deepEqual(out.custom_instructions, ["Use TypeScript strict mode", "Always write tests"]);
33
+ assert.equal(out.token_profile, "quality");
34
+ assert.deepEqual(out.phases, { skip_research: true });
35
+ });
36
+
37
+ test("mapInitPrefsToWizardShape — omits defaults to keep YAML clean", () => {
38
+ const out = mapInitPrefsToWizardShape({
39
+ mode: "solo",
40
+ gitIsolation: "worktree",
41
+ mainBranch: "main",
42
+ verificationCommands: [],
43
+ customInstructions: [],
44
+ tokenProfile: "balanced",
45
+ skipResearch: false,
46
+ autoPush: true,
47
+ });
48
+
49
+ // tokenProfile=balanced is the default — should not be serialized.
50
+ assert.equal(out.token_profile, undefined);
51
+ // skipResearch=false is the default — phases should not appear.
52
+ assert.equal(out.phases, undefined);
53
+ // Empty arrays should not be serialized.
54
+ assert.equal(out.verification_commands, undefined);
55
+ assert.equal(out.custom_instructions, undefined);
56
+ });
57
+
58
+ test("writePreferencesFile — writes valid frontmatter from prefill", async () => {
59
+ const tmp = mkdtempSync(join(tmpdir(), "gsd-init-prefs-routing-"));
60
+ const path = join(tmp, "PREFERENCES.md");
61
+
62
+ try {
63
+ const prefs = mapInitPrefsToWizardShape({
64
+ mode: "solo",
65
+ gitIsolation: "worktree",
66
+ mainBranch: "main",
67
+ verificationCommands: ["npm test"],
68
+ customInstructions: [],
69
+ tokenProfile: "balanced",
70
+ skipResearch: false,
71
+ autoPush: true,
72
+ });
73
+
74
+ await writePreferencesFile(path, prefs, null, { scope: "project" });
75
+
76
+ const content = readFileSync(path, "utf-8");
77
+ assert.match(content, /^---/);
78
+ assert.match(content, /mode: solo/);
79
+ assert.match(content, /git:/);
80
+ assert.match(content, /isolation: worktree/);
81
+ assert.match(content, /main_branch: main/);
82
+ assert.match(content, /auto_push: true/);
83
+ assert.match(content, /verification_commands:/);
84
+ assert.match(content, /- npm test/);
85
+ // version: 1 is added by writePreferencesFile if missing
86
+ assert.match(content, /version: 1/);
87
+ } finally {
88
+ rmSync(tmp, { recursive: true, force: true });
89
+ }
90
+ });
91
+
92
+ test("writePreferencesFile — preserves existing markdown body", async () => {
93
+ const tmp = mkdtempSync(join(tmpdir(), "gsd-init-prefs-routing-"));
94
+ const path = join(tmp, "PREFERENCES.md");
95
+ const customBody = "\n# My Custom Notes\n\nUser-edited content here.\n";
96
+
97
+ try {
98
+ // Seed file with frontmatter + custom body
99
+ writeFileSync(path, `---\nmode: solo\nversion: 1\n---${customBody}`, "utf-8");
100
+
101
+ await writePreferencesFile(path, { mode: "team", version: 1 }, null);
102
+
103
+ const content = readFileSync(path, "utf-8");
104
+ assert.match(content, /mode: team/);
105
+ assert.match(content, /My Custom Notes/);
106
+ assert.match(content, /User-edited content here/);
107
+ } finally {
108
+ rmSync(tmp, { recursive: true, force: true });
109
+ }
110
+ });
111
+
112
+ test("writePreferencesFile — falls back to default body for new files", async () => {
113
+ const tmp = mkdtempSync(join(tmpdir(), "gsd-init-prefs-routing-"));
114
+ const path = join(tmp, "PREFERENCES.md");
115
+ const initBody = "\n# Init body marker\n";
116
+
117
+ try {
118
+ await writePreferencesFile(path, { mode: "solo" }, null, { defaultBody: initBody });
119
+ const content = readFileSync(path, "utf-8");
120
+ assert.match(content, /Init body marker/);
121
+ } finally {
122
+ rmSync(tmp, { recursive: true, force: true });
123
+ }
124
+ });
125
+
126
+ // ─── Regression tests from #4457 codex adversarial review ──────────────────
127
+
128
+ test("init — Step 9b shape: 'not_yet' option is recognized as defer (#4457 review)", async () => {
129
+ // The init wizard relies on showNextAction always appending a `not_yet` action
130
+ // and mapping Escape to it. The Step 9b code must explicitly handle `not_yet`
131
+ // as defer (return without bootstrapping or persisting prefs). This test
132
+ // documents the contract — it doesn't drive the full wizard, but it locks in
133
+ // that "not_yet" is the canonical defer signal so a future refactor can't
134
+ // silently drop the explicit branch.
135
+ const { showNextAction } = await import("../../shared/tui.ts") as { showNextAction: unknown };
136
+ assert.equal(typeof showNextAction, "function");
137
+
138
+ // Read the source to assert Step 9b explicitly handles not_yet — a static
139
+ // smoke test cheaper than spinning up the full wizard with a mocked ctx.
140
+ const src = readFileSync(
141
+ new URL("../init-wizard.ts", import.meta.url),
142
+ "utf-8",
143
+ );
144
+ assert.match(
145
+ src,
146
+ /reviewChoice === "not_yet"[\s\S]*?return \{ completed: false, bootstrapped: false \}/,
147
+ "init Step 9b must short-circuit on not_yet without writing preferences",
148
+ );
149
+ });
150
+
151
+ test("init — preferences path is basePath-derived, not cwd-derived (#4457 review)", async () => {
152
+ // If basePath !== process.cwd(), preferences must still write to
153
+ // join(gsdRoot(basePath), "PREFERENCES.md"), not the cwd-derived path.
154
+ // Static check: the post-#4457-review code constructs the path from gsdRoot(basePath).
155
+ const src = readFileSync(
156
+ new URL("../init-wizard.ts", import.meta.url),
157
+ "utf-8",
158
+ );
159
+ assert.match(
160
+ src,
161
+ /projectPrefsPath\s*=\s*join\(gsdRoot\(basePath\),\s*"PREFERENCES\.md"\)/,
162
+ "init must derive the project preferences path from basePath",
163
+ );
164
+ // And neither write site should call getProjectGSDPreferencesPath() (which
165
+ // resolves from process.cwd()).
166
+ assert.doesNotMatch(
167
+ src,
168
+ /getProjectGSDPreferencesPath\s*\(/,
169
+ "init must not use the cwd-derived getProjectGSDPreferencesPath()",
170
+ );
171
+ });
172
+
173
+ test("handlePrefsWizard — accepts pathOverride to target a non-cwd location", async () => {
174
+ // The wizard's signature must support pathOverride so /gsd init can route
175
+ // both the review and skip branches to the basePath-derived path.
176
+ const { handlePrefsWizard } = await import("../commands-prefs-wizard.ts");
177
+ assert.equal(handlePrefsWizard.length >= 2, true);
178
+ // Read source to confirm the opts.pathOverride wiring exists — calling
179
+ // handlePrefsWizard end-to-end requires a full ExtensionCommandContext
180
+ // mock, which is heavier than this contract check warrants.
181
+ const src = readFileSync(
182
+ new URL("../commands-prefs-wizard.ts", import.meta.url),
183
+ "utf-8",
184
+ );
185
+ assert.match(
186
+ src,
187
+ /opts\?\.pathOverride[\s\S]*?\?\?[\s\S]*?(getProjectGSDPreferencesPath|getGlobalGSDPreferencesPath)/,
188
+ "handlePrefsWizard must honor opts.pathOverride before falling back to scope-derived path",
189
+ );
190
+ });
@@ -0,0 +1,79 @@
1
+ import assert from "node:assert/strict";
2
+ import { execSync } from "node:child_process";
3
+ import { mkdtempSync, mkdirSync, realpathSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { test } from "node:test";
7
+
8
+ import { runGSDDoctor } from "../../doctor.ts";
9
+
10
+ function run(cmd: string, cwd: string): string {
11
+ return execSync(cmd, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
12
+ }
13
+
14
+ function createRepoWithCompletedMilestone(): string {
15
+ const dir = realpathSync(mkdtempSync(join(tmpdir(), "doc-git-symlink-cwd-")));
16
+ run("git init", dir);
17
+ run("git config user.email test@test.com", dir);
18
+ run("git config user.name Test", dir);
19
+
20
+ writeFileSync(join(dir, "README.md"), "# test\n");
21
+ run("git add .", dir);
22
+ run("git commit -m init", dir);
23
+ run("git branch -M main", dir);
24
+
25
+ const milestoneDir = join(dir, ".gsd", "milestones", "M001");
26
+ mkdirSync(milestoneDir, { recursive: true });
27
+ writeFileSync(join(milestoneDir, "ROADMAP.md"), `---
28
+ id: M001
29
+ title: "Test Milestone"
30
+ ---
31
+
32
+ # M001: Test Milestone
33
+
34
+ ## Vision
35
+ Test
36
+
37
+ ## Success Criteria
38
+ - Done
39
+
40
+ ## Slices
41
+ - [x] **S01: Test slice** \`risk:low\` \`depends:[]\`
42
+ > After this: done
43
+
44
+ ## Boundary Map
45
+ _None_
46
+ `);
47
+
48
+ run("git add -A", dir);
49
+ run("git commit -m \"add milestone\"", dir);
50
+
51
+ return dir;
52
+ }
53
+
54
+ test("doctor removes orphaned milestone worktree when cwd uses a symlink alias", { skip: process.platform === "win32" }, async (t) => {
55
+ const previousCwd = process.cwd();
56
+ const dir = createRepoWithCompletedMilestone();
57
+ const alias = join(tmpdir(), `doc-git-alias-${Date.now()}-${Math.random().toString(16).slice(2)}`);
58
+
59
+ t.after(() => {
60
+ try { process.chdir(previousCwd); } catch { process.chdir(tmpdir()); }
61
+ rmSync(alias, { recursive: true, force: true });
62
+ rmSync(dir, { recursive: true, force: true });
63
+ });
64
+
65
+ mkdirSync(join(dir, ".gsd", "worktrees"), { recursive: true });
66
+ run("git worktree add -b milestone/M001 .gsd/worktrees/M001", dir);
67
+
68
+ symlinkSync(dir, alias);
69
+ process.chdir(join(alias, ".gsd", "worktrees", "M001"));
70
+
71
+ const fixed = await runGSDDoctor(dir, { fix: true, isolationMode: "worktree" });
72
+ assert.ok(
73
+ fixed.fixesApplied.some(f => f.includes("removed orphaned worktree")),
74
+ `removes orphaned worktree even when cwd uses a symlink alias (got: ${JSON.stringify(fixed.fixesApplied)})`,
75
+ );
76
+
77
+ const wtList = run("git worktree list", dir);
78
+ assert.ok(!wtList.includes("milestone/M001"), "worktree removed after symlink-cwd fix");
79
+ });
@@ -696,6 +696,45 @@ describe('doctor-git', async () => {
696
696
  assert.deepStrictEqual(staleIssues.length, 0, "recent commit with dirty tree NOT flagged as stale");
697
697
  });
698
698
 
699
+ // ─── Test: stale_uncommitted_changes suppressed by git.snapshots:false (#4420) ──
700
+ test('stale_uncommitted_changes (suppressed by git.snapshots:false)', async () => {
701
+ const dir = createRepoWithActiveMilestone();
702
+ cleanups.push(dir);
703
+
704
+ const pastDate = new Date(Date.now() - 45 * 60 * 1000).toISOString();
705
+ run(`git commit --amend --no-edit --date="${pastDate}"`, dir);
706
+ execSync(`git commit --amend --no-edit`, {
707
+ cwd: dir,
708
+ stdio: ["ignore", "pipe", "pipe"],
709
+ encoding: "utf-8",
710
+ env: { ...process.env, GIT_COMMITTER_DATE: pastDate },
711
+ });
712
+
713
+ writeFileSync(join(dir, "README.md"), "# test\nmodified content\n");
714
+ writeFileSync(join(dir, ".gsd", "PREFERENCES.md"), `---\ngit:\n snapshots: false\n---\n`);
715
+
716
+ const commitsBefore = run("git rev-list --count HEAD", dir);
717
+
718
+ const previousCwd = process.cwd();
719
+ process.chdir(dir);
720
+ try {
721
+ const detect = await runGSDDoctor(dir);
722
+ const staleIssues = detect.issues.filter(i => i.code === "stale_uncommitted_changes");
723
+ assert.deepStrictEqual(staleIssues.length, 0, "git.snapshots:false suppresses stale detection");
724
+
725
+ const fixed = await runGSDDoctor(dir, { fix: true });
726
+ assert.ok(
727
+ !fixed.fixesApplied.some(f => f.includes("gsd snapshot")),
728
+ `git.snapshots:false suppresses snapshot fix (got: ${JSON.stringify(fixed.fixesApplied)})`,
729
+ );
730
+ } finally {
731
+ process.chdir(previousCwd);
732
+ }
733
+
734
+ const commitsAfter = run("git rev-list --count HEAD", dir);
735
+ assert.strictEqual(commitsAfter, commitsBefore, "no snapshot commit was created when git.snapshots:false");
736
+ });
737
+
699
738
  // ─── Test: stale_uncommitted_changes NOT flagged when tree is clean ──
700
739
  test('stale_uncommitted_changes (no false positive on clean tree)', async () => {
701
740
  const dir = createRepoWithActiveMilestone();