@opengsd/gsd-pi 1.0.2-dev.867e002 → 1.0.2-dev.cce3612

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 (318) hide show
  1. package/dist/onboarding.js +22 -3
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/extensions/context7/index.js +12 -2
  4. package/dist/resources/extensions/get-secrets-from-user.js +16 -16
  5. package/dist/resources/extensions/google-cli/index.js +30 -0
  6. package/dist/resources/extensions/google-cli/models.js +55 -0
  7. package/dist/resources/extensions/google-cli/package.json +11 -0
  8. package/dist/resources/extensions/google-cli/readiness.js +12 -0
  9. package/dist/resources/extensions/google-cli/stream-adapter.js +191 -0
  10. package/dist/resources/extensions/gsd/auto/loop.js +62 -1
  11. package/dist/resources/extensions/gsd/auto/orchestrator.js +4 -2
  12. package/dist/resources/extensions/gsd/auto/phases.js +37 -0
  13. package/dist/resources/extensions/gsd/auto/run-unit.js +8 -0
  14. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  15. package/dist/resources/extensions/gsd/auto-dispatch.js +17 -7
  16. package/dist/resources/extensions/gsd/auto-post-unit.js +18 -2
  17. package/dist/resources/extensions/gsd/auto-prompts.js +5 -236
  18. package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
  19. package/dist/resources/extensions/gsd/auto-start.js +232 -49
  20. package/dist/resources/extensions/gsd/auto.js +6 -1
  21. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +4 -3
  22. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +39 -5
  23. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +17 -7
  24. package/dist/resources/extensions/gsd/bootstrap/system-context.js +3 -27
  25. package/dist/resources/extensions/gsd/closeout-recovery.js +7 -1
  26. package/dist/resources/extensions/gsd/commands/handlers/auto.js +9 -1
  27. package/dist/resources/extensions/gsd/commands-usage.js +105 -1
  28. package/dist/resources/extensions/gsd/config-overlay.js +20 -14
  29. package/dist/resources/extensions/gsd/context-overlay.js +22 -16
  30. package/dist/resources/extensions/gsd/dashboard-overlay.js +10 -23
  31. package/dist/resources/extensions/gsd/doctor-engine-checks.js +87 -0
  32. package/dist/resources/extensions/gsd/doctor-providers.js +54 -24
  33. package/dist/resources/extensions/gsd/doctor.js +6 -1
  34. package/dist/resources/extensions/gsd/git-conflict-state.js +26 -1
  35. package/dist/resources/extensions/gsd/guided-flow.js +5 -6
  36. package/dist/resources/extensions/gsd/key-manager.js +45 -13
  37. package/dist/resources/extensions/gsd/milestone-reopen-events.js +28 -0
  38. package/dist/resources/extensions/gsd/notification-overlay.js +8 -9
  39. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +15 -13
  40. package/dist/resources/extensions/gsd/preferences-skills.js +11 -4
  41. package/dist/resources/extensions/gsd/preferences.js +14 -2
  42. package/dist/resources/extensions/gsd/prompt-loader.js +2 -0
  43. package/dist/resources/extensions/gsd/prompts/discuss.md +4 -2
  44. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
  45. package/dist/resources/extensions/gsd/prompts/system.md +1 -3
  46. package/dist/resources/extensions/gsd/queue-reorder-ui.js +28 -18
  47. package/dist/resources/extensions/gsd/repository-registry.js +3 -1
  48. package/dist/resources/extensions/gsd/skill-activation.js +233 -0
  49. package/dist/resources/extensions/gsd/skill-catalog.data.js +820 -0
  50. package/dist/resources/extensions/gsd/skill-catalog.install.js +179 -0
  51. package/dist/resources/extensions/gsd/skill-catalog.js +5 -1028
  52. package/dist/resources/extensions/gsd/skill-discovery.js +121 -79
  53. package/dist/resources/extensions/gsd/skill-scope.js +52 -0
  54. package/dist/resources/extensions/gsd/skill-telemetry.js +6 -39
  55. package/dist/resources/extensions/gsd/skills.js +60 -0
  56. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +351 -0
  57. package/dist/resources/extensions/gsd/state-reconciliation/index.js +41 -0
  58. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +4 -0
  59. package/dist/resources/extensions/gsd/tools/complete-task.js +9 -0
  60. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +63 -2
  61. package/dist/resources/extensions/gsd/tui/render-kit.js +51 -0
  62. package/dist/resources/extensions/gsd/unit-context-manifest.js +35 -26
  63. package/dist/resources/extensions/gsd/user-input-boundary.js +1 -1
  64. package/dist/resources/extensions/gsd/vision-ask.js +22 -0
  65. package/dist/resources/extensions/gsd/visualizer-overlay.js +8 -36
  66. package/dist/resources/extensions/gsd/worktree-lifecycle.js +24 -3
  67. package/dist/resources/extensions/search-the-web/native-search.js +57 -8
  68. package/dist/resources/extensions/shared/confirm-ui.js +9 -6
  69. package/dist/resources/extensions/shared/dialog-frame.js +42 -0
  70. package/dist/resources/extensions/shared/interview-ui.js +42 -30
  71. package/dist/resources/extensions/shared/next-action-ui.js +6 -6
  72. package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +1 -1
  73. package/dist/web/standalone/.next/BUILD_ID +1 -1
  74. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  75. package/dist/web/standalone/.next/build-manifest.json +2 -2
  76. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  77. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  78. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  79. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  80. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  81. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  82. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  83. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  86. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  91. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/index.html +1 -1
  94. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  100. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  101. package/dist/web/standalone/.next/server/chunks/1834.js +2 -2
  102. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  103. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  104. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  105. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  106. package/package.json +1 -1
  107. package/packages/cloud-mcp-gateway/package.json +2 -2
  108. package/packages/contracts/package.json +1 -1
  109. package/packages/daemon/package.json +4 -4
  110. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +1 -0
  111. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
  112. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +22 -8
  113. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
  114. package/packages/gsd-agent-core/package.json +5 -5
  115. package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.d.ts +12 -0
  116. package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.d.ts.map +1 -0
  117. package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.js +45 -0
  118. package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.js.map +1 -0
  119. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts +3 -2
  120. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  121. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js +11 -11
  122. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js.map +1 -1
  123. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts +3 -3
  124. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  125. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js +13 -11
  126. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js.map +1 -1
  127. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts +3 -3
  128. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  129. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js +12 -10
  130. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js.map +1 -1
  131. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts +1 -0
  132. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts.map +1 -1
  133. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js +1 -0
  134. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js.map +1 -1
  135. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +1 -1
  136. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  137. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +2 -2
  138. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
  139. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts +6 -1
  140. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  141. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js +9 -6
  142. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  143. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  144. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +0 -1
  145. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  146. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts +3 -0
  147. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  148. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +144 -2
  149. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  150. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.d.ts.map +1 -1
  151. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.js +2 -14
  152. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.js.map +1 -1
  153. package/packages/gsd-agent-modes/package.json +7 -7
  154. package/packages/mcp-server/dist/workflow-tools.js +1 -1
  155. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  156. package/packages/mcp-server/package.json +3 -3
  157. package/packages/native/package.json +1 -1
  158. package/packages/pi-agent-core/dist/harness/skills.d.ts.map +1 -1
  159. package/packages/pi-agent-core/dist/harness/skills.js +6 -0
  160. package/packages/pi-agent-core/dist/harness/skills.js.map +1 -1
  161. package/packages/pi-agent-core/dist/harness/system-prompt.d.ts +7 -0
  162. package/packages/pi-agent-core/dist/harness/system-prompt.d.ts.map +1 -1
  163. package/packages/pi-agent-core/dist/harness/system-prompt.js +7 -0
  164. package/packages/pi-agent-core/dist/harness/system-prompt.js.map +1 -1
  165. package/packages/pi-agent-core/package.json +1 -1
  166. package/packages/pi-ai/dist/models.generated.d.ts +8 -59
  167. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  168. package/packages/pi-ai/dist/models.generated.js +21 -72
  169. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  170. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  171. package/packages/pi-ai/dist/providers/anthropic.js +50 -0
  172. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  173. package/packages/pi-ai/dist/providers/openai-responses-shared.d.ts.map +1 -1
  174. package/packages/pi-ai/dist/providers/openai-responses-shared.js +28 -4
  175. package/packages/pi-ai/dist/providers/openai-responses-shared.js.map +1 -1
  176. package/packages/pi-ai/dist/types.d.ts +2 -0
  177. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  178. package/packages/pi-ai/dist/types.js.map +1 -1
  179. package/packages/pi-ai/package.json +1 -1
  180. package/packages/pi-coding-agent/README.md +1 -1
  181. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +2 -2
  182. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
  183. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
  184. package/packages/pi-coding-agent/dist/core/extensions/loader.js +1 -1
  185. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  186. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  187. package/packages/pi-coding-agent/dist/core/extensions/runner.js +8 -2
  188. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  189. package/packages/pi-coding-agent/dist/core/skills.d.ts +3 -0
  190. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  191. package/packages/pi-coding-agent/dist/core/skills.js +3 -0
  192. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  193. package/packages/pi-coding-agent/package.json +7 -7
  194. package/packages/pi-tui/package.json +1 -1
  195. package/packages/rpc-client/package.json +2 -2
  196. package/pkg/package.json +1 -1
  197. package/src/resources/extensions/context7/index.ts +15 -2
  198. package/src/resources/extensions/get-secrets-from-user.ts +17 -16
  199. package/src/resources/extensions/google-cli/index.ts +34 -0
  200. package/src/resources/extensions/google-cli/models.ts +57 -0
  201. package/src/resources/extensions/google-cli/package.json +11 -0
  202. package/src/resources/extensions/google-cli/readiness.ts +15 -0
  203. package/src/resources/extensions/google-cli/stream-adapter.ts +245 -0
  204. package/src/resources/extensions/gsd/auto/loop.ts +74 -1
  205. package/src/resources/extensions/gsd/auto/orchestrator.ts +4 -2
  206. package/src/resources/extensions/gsd/auto/phases.ts +46 -0
  207. package/src/resources/extensions/gsd/auto/run-unit.ts +10 -0
  208. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  209. package/src/resources/extensions/gsd/auto-dispatch.ts +31 -11
  210. package/src/resources/extensions/gsd/auto-post-unit.ts +37 -2
  211. package/src/resources/extensions/gsd/auto-prompts.ts +4 -284
  212. package/src/resources/extensions/gsd/auto-recovery.ts +10 -7
  213. package/src/resources/extensions/gsd/auto-start.ts +307 -56
  214. package/src/resources/extensions/gsd/auto.ts +6 -1
  215. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +4 -3
  216. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +42 -5
  217. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +18 -6
  218. package/src/resources/extensions/gsd/bootstrap/system-context.ts +3 -28
  219. package/src/resources/extensions/gsd/closeout-recovery.ts +6 -1
  220. package/src/resources/extensions/gsd/commands/handlers/auto.ts +9 -1
  221. package/src/resources/extensions/gsd/commands-usage.ts +110 -5
  222. package/src/resources/extensions/gsd/config-overlay.ts +19 -16
  223. package/src/resources/extensions/gsd/context-overlay.ts +24 -19
  224. package/src/resources/extensions/gsd/dashboard-overlay.ts +14 -27
  225. package/src/resources/extensions/gsd/doctor-engine-checks.ts +99 -0
  226. package/src/resources/extensions/gsd/doctor-providers.ts +55 -27
  227. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  228. package/src/resources/extensions/gsd/doctor.ts +6 -1
  229. package/src/resources/extensions/gsd/git-conflict-state.ts +25 -1
  230. package/src/resources/extensions/gsd/guided-flow.ts +5 -6
  231. package/src/resources/extensions/gsd/key-manager.ts +57 -14
  232. package/src/resources/extensions/gsd/milestone-reopen-events.ts +28 -0
  233. package/src/resources/extensions/gsd/notification-overlay.ts +12 -11
  234. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +16 -12
  235. package/src/resources/extensions/gsd/preferences-skills.ts +11 -4
  236. package/src/resources/extensions/gsd/preferences.ts +17 -2
  237. package/src/resources/extensions/gsd/prompt-loader.ts +2 -0
  238. package/src/resources/extensions/gsd/prompts/discuss.md +4 -2
  239. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
  240. package/src/resources/extensions/gsd/prompts/system.md +1 -3
  241. package/src/resources/extensions/gsd/queue-reorder-ui.ts +29 -20
  242. package/src/resources/extensions/gsd/repository-registry.ts +3 -1
  243. package/src/resources/extensions/gsd/skill-activation.ts +292 -0
  244. package/src/resources/extensions/gsd/skill-catalog.data.ts +858 -0
  245. package/src/resources/extensions/gsd/skill-catalog.install.ts +205 -0
  246. package/src/resources/extensions/gsd/skill-catalog.ts +16 -1087
  247. package/src/resources/extensions/gsd/skill-discovery.ts +134 -78
  248. package/src/resources/extensions/gsd/skill-scope.ts +63 -0
  249. package/src/resources/extensions/gsd/skill-telemetry.ts +6 -40
  250. package/src/resources/extensions/gsd/skills.ts +75 -0
  251. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +499 -0
  252. package/src/resources/extensions/gsd/state-reconciliation/index.ts +40 -0
  253. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +8 -0
  254. package/src/resources/extensions/gsd/state-reconciliation/types.ts +30 -0
  255. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +328 -2
  256. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +21 -0
  257. package/src/resources/extensions/gsd/tests/auto-post-unit-artifact-diagnostic.test.ts +28 -2
  258. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +41 -0
  259. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +436 -0
  260. package/src/resources/extensions/gsd/tests/closeout-recovery.test.ts +15 -0
  261. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +31 -0
  262. package/src/resources/extensions/gsd/tests/commands-context.test.ts +5 -3
  263. package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +15 -2
  264. package/src/resources/extensions/gsd/tests/commands-usage.test.ts +97 -0
  265. package/src/resources/extensions/gsd/tests/context-chart.test.ts +9 -0
  266. package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +25 -0
  267. package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +1 -0
  268. package/src/resources/extensions/gsd/tests/discuss-prompt.test.ts +4 -2
  269. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +1 -1
  270. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +105 -0
  271. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +101 -1
  272. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +6 -0
  273. package/src/resources/extensions/gsd/tests/key-manager.test.ts +23 -4
  274. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +6 -1
  275. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +70 -10
  276. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +7 -1
  277. package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +93 -0
  278. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +46 -0
  279. package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +116 -11
  280. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +30 -1
  281. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +4 -0
  282. package/src/resources/extensions/gsd/tests/skill-discovery.test.ts +111 -0
  283. package/src/resources/extensions/gsd/tests/skill-scope-auto.test.ts +67 -0
  284. package/src/resources/extensions/gsd/tests/skills.test.ts +55 -0
  285. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +13 -2
  286. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +303 -0
  287. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +19 -0
  288. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +24 -1
  289. package/src/resources/extensions/gsd/tests/tui-border-assertions.ts +28 -0
  290. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +14 -0
  291. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +18 -0
  292. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +26 -0
  293. package/src/resources/extensions/gsd/tests/vision-ask.test.ts +23 -0
  294. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -1
  295. package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +74 -1
  296. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +82 -0
  297. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +16 -1
  298. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +28 -0
  299. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +45 -1
  300. package/src/resources/extensions/gsd/tools/complete-task.ts +9 -0
  301. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +82 -5
  302. package/src/resources/extensions/gsd/tui/render-kit.ts +82 -0
  303. package/src/resources/extensions/gsd/unit-context-manifest.ts +37 -26
  304. package/src/resources/extensions/gsd/user-input-boundary.ts +1 -1
  305. package/src/resources/extensions/gsd/vision-ask.ts +28 -0
  306. package/src/resources/extensions/gsd/visualizer-overlay.ts +12 -40
  307. package/src/resources/extensions/gsd/worktree-lifecycle.ts +37 -2
  308. package/src/resources/extensions/search-the-web/native-search.ts +60 -8
  309. package/src/resources/extensions/shared/confirm-ui.ts +8 -12
  310. package/src/resources/extensions/shared/dialog-frame.ts +71 -0
  311. package/src/resources/extensions/shared/interview-ui.ts +43 -42
  312. package/src/resources/extensions/shared/next-action-ui.ts +6 -6
  313. package/src/resources/extensions/shared/tests/confirm-ui.test.ts +57 -0
  314. package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +163 -0
  315. package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +55 -0
  316. package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +1 -1
  317. /package/dist/web/standalone/.next/static/{praHP_OATcjBkvAVejjGK → orfEoZqDIo6Be_Z9ZFipD}/_buildManifest.js +0 -0
  318. /package/dist/web/standalone/.next/static/{praHP_OATcjBkvAVejjGK → orfEoZqDIo6Be_Z9ZFipD}/_ssgManifest.js +0 -0
@@ -44,6 +44,7 @@
44
44
  import type { ExtensionCommandContext } from "@gsd/pi-coding-agent";
45
45
  import { type Theme } from "@gsd/pi-coding-agent";
46
46
  import { Key, matchesKey, type TUI } from "@gsd/pi-tui";
47
+ import { renderSharedDialogFrame } from "./dialog-frame.js";
47
48
  import { makeUI } from "./ui.js";
48
49
 
49
50
  // ─── Public API ───────────────────────────────────────────────────────────────
@@ -142,14 +143,14 @@ export async function showNextAction(
142
143
 
143
144
  function render(width: number): string[] {
144
145
  if (cachedLines) return cachedLines;
145
- const ui = makeUI(theme, width);
146
+ const contentWidth = Math.max(1, width - 4);
147
+ const ui = makeUI(theme, contentWidth);
146
148
  const lines: string[] = [];
147
149
  const push = (...rows: string[][]) => { for (const r of rows) lines.push(...r); };
148
150
 
149
151
  // ── Header — uses success colour to signal completion ────────────
150
152
  // Note: next-action intentionally uses "success" for its bar/title
151
153
  // to distinguish it from regular accent-coloured screens.
152
- push(ui.bar());
153
154
  push(ui.blank());
154
155
  push(ui.header(` ✓ ${opts.title}`));
155
156
 
@@ -192,11 +193,10 @@ export async function showNextAction(
192
193
 
193
194
  // ── Footer ────────────────────────────────────────────────────────
194
195
  const numHint = allActions.map((_, i) => `${i + 1}`).join("/");
195
- push(ui.hints([`↑/↓ to choose`, `${numHint} to quick-select`, `enter to confirm`]));
196
- push(ui.bar());
196
+ const footer = ui.hints([`↑/↓ to choose`, `${numHint} to quick-select`, `enter to confirm`])[0] ?? "";
197
197
 
198
- cachedLines = lines;
199
- return lines;
198
+ cachedLines = renderSharedDialogFrame(theme, "GSD Next Action", lines, width, { footer });
199
+ return cachedLines;
200
200
  }
201
201
 
202
202
  return { render, invalidate: () => { cachedLines = undefined; }, handleInput };
@@ -0,0 +1,57 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { stripVTControlCharacters } from "node:util";
4
+
5
+ import { visibleWidth } from "@gsd/pi-tui";
6
+
7
+ import { showConfirm } from "../confirm-ui.js";
8
+
9
+ function assertFullOuterBorder(lines: string[], width: number): void {
10
+ assert.ok(lines.length >= 2, "dialog must include top and bottom borders");
11
+ for (const [index, line] of lines.entries()) {
12
+ assert.equal(visibleWidth(line), width, `line ${index} must fill dialog width`);
13
+ }
14
+ const top = stripVTControlCharacters(lines[0] ?? "");
15
+ const bottom = stripVTControlCharacters(lines.at(-1) ?? "");
16
+ assert.match(top, /^[╭┌].*[╮┐]$/);
17
+ assert.match(bottom, /^[╰└].*[╯┘]$/);
18
+ for (let index = 1; index < lines.length - 1; index++) {
19
+ const line = stripVTControlCharacters(lines[index] ?? "");
20
+ assert.match(line, /^[│┃├]/, `line ${index} missing left border: ${line}`);
21
+ assert.match(line, /[│┃┤]$/, `line ${index} missing right border: ${line}`);
22
+ }
23
+ }
24
+
25
+ describe("showConfirm", () => {
26
+ it("renders the confirmation prompt inside a full border", async () => {
27
+ let rendered: string[] = [];
28
+ const theme = {
29
+ fg: (_color: string, text: string) => text,
30
+ bold: (text: string) => text,
31
+ };
32
+
33
+ const ctx = {
34
+ hasUI: true,
35
+ ui: {
36
+ custom: async (factory: any) => {
37
+ let resolved: boolean | undefined;
38
+ const component = factory({ requestRender() {} }, theme, null, (value: boolean) => {
39
+ resolved = value;
40
+ });
41
+ rendered = component.render(80);
42
+ component.handleInput("\r");
43
+ return resolved as never;
44
+ },
45
+ },
46
+ };
47
+
48
+ const result = await showConfirm(ctx as any, {
49
+ title: "Confirm action",
50
+ message: "Proceed with the change?",
51
+ });
52
+
53
+ assert.equal(result, true);
54
+ assertFullOuterBorder(rendered, 80);
55
+ assert.match(stripVTControlCharacters(rendered[0] ?? ""), /Confirm action/);
56
+ });
57
+ });
@@ -0,0 +1,163 @@
1
+ // gsd-pi — Shared interview UI dialog border contract
2
+
3
+ import assert from "node:assert/strict";
4
+ import { before, describe, it } from "node:test";
5
+
6
+ import { visibleWidth } from "@gsd/pi-tui";
7
+ import { initTheme } from "@gsd/pi-coding-agent";
8
+ import {
9
+ showInterviewRound,
10
+ showWrapUpScreen,
11
+ type Question,
12
+ type RoundResult,
13
+ type WrapUpResult,
14
+ } from "../interview-ui.js";
15
+
16
+ const ANSI_PATTERN = /\x1b\[[0-9;?]*[ -/]*[@-~]/g;
17
+ const ENTER = "\r";
18
+ const ESC = "\x1b";
19
+
20
+ before(() => { initTheme(); });
21
+
22
+ type RenderWidget = {
23
+ render(width: number): string[];
24
+ handleInput(input: string): void;
25
+ };
26
+
27
+ function stripAnsi(text: string): string {
28
+ return text.replace(ANSI_PATTERN, "");
29
+ }
30
+
31
+ function assertFullOuterBorder(lines: string[], width: number): void {
32
+ assert.ok(lines.length >= 2, "dialog must include top and bottom borders");
33
+
34
+ for (const [index, line] of lines.entries()) {
35
+ assert.equal(visibleWidth(line), width, `line ${index} must fill dialog width`);
36
+ }
37
+
38
+ const top = stripAnsi(lines[0] ?? "");
39
+ const bottom = stripAnsi(lines.at(-1) ?? "");
40
+ assert.match(top, /^╭.*╮$/, `top border missing full corners: ${top}`);
41
+ assert.match(bottom, /^╰.*╯$/, `bottom border missing full corners: ${bottom}`);
42
+
43
+ for (let index = 1; index < lines.length - 1; index++) {
44
+ const line = stripAnsi(lines[index] ?? "");
45
+ assert.match(line, /^[│├]/, `line ${index} missing left border: ${line}`);
46
+ assert.match(line, /[│┤]$/, `line ${index} missing right border: ${line}`);
47
+ }
48
+ }
49
+
50
+ function mockTheme() {
51
+ return {
52
+ fg: (_color: string, text: string) => text,
53
+ bold: (text: string) => text,
54
+ dim: (text: string) => text,
55
+ italic: (text: string) => text,
56
+ strikethrough: (text: string) => text,
57
+ accent: (text: string) => text,
58
+ success: (text: string) => text,
59
+ warning: (text: string) => text,
60
+ error: (text: string) => text,
61
+ info: (text: string) => text,
62
+ muted: (text: string) => text,
63
+ dimmed: (text: string) => text,
64
+ };
65
+ }
66
+
67
+ async function captureInterviewWidget(
68
+ questions: Question[],
69
+ ): Promise<RenderWidget> {
70
+ let widget: RenderWidget | undefined;
71
+
72
+ await showInterviewRound(questions, {}, {
73
+ ui: {
74
+ custom: (factory: any) => {
75
+ widget = factory(
76
+ { requestRender: () => {} },
77
+ mockTheme(),
78
+ {},
79
+ (_result: RoundResult) => {},
80
+ );
81
+ return Promise.resolve({ endInterview: false, answers: {} });
82
+ },
83
+ },
84
+ } as any);
85
+
86
+ assert.ok(widget, "interview widget should be created");
87
+ return widget;
88
+ }
89
+
90
+ async function captureWrapUpWidget(): Promise<RenderWidget> {
91
+ let widget: RenderWidget | undefined;
92
+
93
+ await showWrapUpScreen({
94
+ headline: "Ready to wrap up?",
95
+ progress: "4 questions answered",
96
+ keepGoingLabel: "Keep going",
97
+ satisfiedLabel: "I'm satisfied",
98
+ }, {
99
+ ui: {
100
+ custom: (factory: any) => {
101
+ widget = factory(
102
+ { requestRender: () => {} },
103
+ mockTheme(),
104
+ {},
105
+ (_result: WrapUpResult) => {},
106
+ );
107
+ return Promise.resolve({ satisfied: false });
108
+ },
109
+ },
110
+ } as any);
111
+
112
+ assert.ok(widget, "wrap-up widget should be created");
113
+ return widget;
114
+ }
115
+
116
+ describe("interview-ui dialog borders", () => {
117
+ const questions: Question[] = [
118
+ {
119
+ id: "project_type",
120
+ header: "Project Type",
121
+ question: "What type of project?",
122
+ options: [
123
+ { label: "Web App", description: "Frontend or full-stack" },
124
+ { label: "CLI Tool", description: "Command-line utility" },
125
+ ],
126
+ },
127
+ ];
128
+
129
+ it("renders the main question screen with a full border", async () => {
130
+ const widget = await captureInterviewWidget(questions);
131
+ assertFullOuterBorder(widget.render(80), 80);
132
+ });
133
+
134
+ it("renders the preview split screen with a full border", async () => {
135
+ const widget = await captureInterviewWidget([{
136
+ ...questions[0],
137
+ options: [
138
+ {
139
+ label: "Web App",
140
+ description: "Frontend or full-stack",
141
+ preview: "### Stack\n\nUse React with a typed API boundary.",
142
+ },
143
+ ],
144
+ }]);
145
+ assertFullOuterBorder(widget.render(100), 100);
146
+ });
147
+
148
+ it("renders review and exit confirmation screens with full borders", async () => {
149
+ const widget = await captureInterviewWidget(questions);
150
+
151
+ widget.handleInput(ENTER);
152
+ assertFullOuterBorder(widget.render(80), 80);
153
+
154
+ const exitWidget = await captureInterviewWidget(questions);
155
+ exitWidget.handleInput(ESC);
156
+ assertFullOuterBorder(exitWidget.render(80), 80);
157
+ });
158
+
159
+ it("renders the wrap-up screen with a full border", async () => {
160
+ const widget = await captureWrapUpWidget();
161
+ assertFullOuterBorder(widget.render(80), 80);
162
+ });
163
+ });
@@ -15,9 +15,27 @@
15
15
 
16
16
  import { describe, it } from "node:test";
17
17
  import assert from "node:assert/strict";
18
+ import { stripVTControlCharacters } from "node:util";
19
+ import { visibleWidth } from "@gsd/pi-tui";
18
20
 
19
21
  import { showNextAction } from "../next-action-ui.js";
20
22
 
23
+ function assertFullOuterBorder(lines: string[], width: number): void {
24
+ assert.ok(lines.length >= 2, "dialog must include top and bottom borders");
25
+ for (const [index, line] of lines.entries()) {
26
+ assert.equal(visibleWidth(line), width, `line ${index} must fill dialog width`);
27
+ }
28
+ const top = stripVTControlCharacters(lines[0] ?? "");
29
+ const bottom = stripVTControlCharacters(lines.at(-1) ?? "");
30
+ assert.match(top, /^[╭┌].*[╮┐]$/);
31
+ assert.match(bottom, /^[╰└].*[╯┘]$/);
32
+ for (let index = 1; index < lines.length - 1; index++) {
33
+ const line = stripVTControlCharacters(lines[index] ?? "");
34
+ assert.match(line, /^[│┃├]/, `line ${index} missing left border: ${line}`);
35
+ assert.match(line, /[│┃┤]$/, `line ${index} missing right border: ${line}`);
36
+ }
37
+ }
38
+
21
39
  describe("showNextAction ctx.hasUI guard (#5125 lockup root protection)", () => {
22
40
  it("returns 'not_yet' immediately when ctx.hasUI is false (no UI calls)", async () => {
23
41
  let customCalled = 0;
@@ -152,4 +170,41 @@ describe("showNextAction ctx.hasUI guard (#5125 lockup root protection)", () =>
152
170
  assert.equal(result, "beta", "TUI selection should be returned verbatim");
153
171
  assert.equal(selectCalled, 0, "ctx.ui.select fallback must NOT fire when custom returns a value");
154
172
  });
173
+
174
+ it("renders the interactive next-action menu inside a full border", async () => {
175
+ let rendered: string[] = [];
176
+ const theme = {
177
+ fg: (_color: string, text: string) => text,
178
+ bold: (text: string) => text,
179
+ };
180
+
181
+ const ctx = {
182
+ hasUI: true,
183
+ ui: {
184
+ custom: async (factory: any) => {
185
+ let resolved: string | undefined;
186
+ const component = factory({ requestRender() {} }, theme, null, (value: string) => {
187
+ resolved = value;
188
+ });
189
+ rendered = component.render(80);
190
+ component.handleInput("\r");
191
+ return resolved as never;
192
+ },
193
+ select: async () => undefined,
194
+ },
195
+ };
196
+
197
+ const result = await showNextAction(ctx as any, {
198
+ title: "GSD — test",
199
+ summary: ["summary"],
200
+ actions: [
201
+ { id: "alpha", label: "Alpha", description: "first", recommended: true },
202
+ { id: "beta", label: "Beta", description: "second" },
203
+ ],
204
+ });
205
+
206
+ assert.equal(result, "alpha");
207
+ assertFullOuterBorder(rendered, 80);
208
+ assert.match(stripVTControlCharacters(rendered[0] ?? ""), /GSD Next Action/);
209
+ });
155
210
  });
@@ -31,7 +31,7 @@ GSD auto-discovers skills at session start and during auto-mode:
31
31
 
32
32
  **Session start:** All discovered skills are enumerated and their names + descriptions are injected into the system prompt as `<available_skills>`.
33
33
 
34
- **Auto-mode discovery:** `skill-discovery.ts` takes a snapshot of the skills directory at auto-mode start. On each unit boundary it diffs against the snapshot. Any new skills found are injected via a `<newly_discovered_skills>` XML block so the LLM sees them without requiring `/reload`.
34
+ **Auto-mode discovery:** `skill-discovery.ts` snapshots installed skill names at auto-mode start. When new skills appear mid-run, GSD reloads the resource catalog so they appear in the standard `<available_skills>` block (no separate XML injection).
35
35
 
36
36
  **Manual reload:** Running `/reload` re-scans the skill directories and updates the available skills list mid-session.
37
37
  </skill_discovery>