vskill 1.0.16 → 1.0.19

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 (225) hide show
  1. package/README.md +27 -3
  2. package/agents.json +3 -1
  3. package/dist/agents/agents-registry.d.ts +61 -0
  4. package/dist/agents/agents-registry.js +203 -0
  5. package/dist/agents/agents-registry.js.map +1 -1
  6. package/dist/api/client.d.ts +85 -0
  7. package/dist/api/client.js +193 -24
  8. package/dist/api/client.js.map +1 -1
  9. package/dist/bin.js +0 -0
  10. package/dist/commands/add.d.ts +7 -0
  11. package/dist/commands/add.js +94 -1
  12. package/dist/commands/add.js.map +1 -1
  13. package/dist/commands/auth.d.ts +23 -0
  14. package/dist/commands/auth.js +136 -12
  15. package/dist/commands/auth.js.map +1 -1
  16. package/dist/commands/eval/serve.d.ts +2 -0
  17. package/dist/commands/eval/serve.js +126 -4
  18. package/dist/commands/eval/serve.js.map +1 -1
  19. package/dist/commands/orgs.d.ts +21 -0
  20. package/dist/commands/orgs.js +164 -0
  21. package/dist/commands/orgs.js.map +1 -0
  22. package/dist/commands/skill.js +14 -1
  23. package/dist/commands/skill.js.map +1 -1
  24. package/dist/commands/whoami.d.ts +29 -0
  25. package/dist/commands/whoami.js +119 -0
  26. package/dist/commands/whoami.js.map +1 -0
  27. package/dist/eval/anthropic-catalog.js +32 -2
  28. package/dist/eval/anthropic-catalog.js.map +1 -1
  29. package/dist/eval/batch-judge.js +1 -0
  30. package/dist/eval/batch-judge.js.map +1 -1
  31. package/dist/eval/llm.d.ts +1 -1
  32. package/dist/eval/llm.js +104 -2
  33. package/dist/eval/llm.js.map +1 -1
  34. package/dist/eval-server/__tests__/helpers/studio-token-test-helpers.d.ts +2 -0
  35. package/dist/eval-server/__tests__/helpers/studio-token-test-helpers.js +20 -0
  36. package/dist/eval-server/__tests__/helpers/studio-token-test-helpers.js.map +1 -0
  37. package/dist/eval-server/active-root-store.d.ts +19 -0
  38. package/dist/eval-server/active-root-store.js +50 -0
  39. package/dist/eval-server/active-root-store.js.map +1 -0
  40. package/dist/eval-server/active-tenant-routes.d.ts +15 -0
  41. package/dist/eval-server/active-tenant-routes.js +101 -0
  42. package/dist/eval-server/active-tenant-routes.js.map +1 -0
  43. package/dist/eval-server/api-routes.d.ts +1 -1
  44. package/dist/eval-server/api-routes.js +60 -7
  45. package/dist/eval-server/api-routes.js.map +1 -1
  46. package/dist/eval-server/authoring-routes.d.ts +1 -1
  47. package/dist/eval-server/authoring-routes.js +9 -7
  48. package/dist/eval-server/authoring-routes.js.map +1 -1
  49. package/dist/eval-server/desktop-open-routes.d.ts +8 -0
  50. package/dist/eval-server/desktop-open-routes.js +64 -0
  51. package/dist/eval-server/desktop-open-routes.js.map +1 -0
  52. package/dist/eval-server/detect-engines-route.d.ts +1 -1
  53. package/dist/eval-server/detect-engines-route.js +3 -1
  54. package/dist/eval-server/detect-engines-route.js.map +1 -1
  55. package/dist/eval-server/eval-server.js +108 -29
  56. package/dist/eval-server/eval-server.js.map +1 -1
  57. package/dist/eval-server/export-skill-routes.d.ts +9 -0
  58. package/dist/eval-server/export-skill-routes.js +81 -0
  59. package/dist/eval-server/export-skill-routes.js.map +1 -0
  60. package/dist/eval-server/git-routes.d.ts +7 -6
  61. package/dist/eval-server/git-routes.js +123 -15
  62. package/dist/eval-server/git-routes.js.map +1 -1
  63. package/dist/eval-server/improve-routes.d.ts +1 -1
  64. package/dist/eval-server/improve-routes.js +4 -1
  65. package/dist/eval-server/improve-routes.js.map +1 -1
  66. package/dist/eval-server/install-engine-routes.d.ts +4 -17
  67. package/dist/eval-server/install-engine-routes.js +10 -125
  68. package/dist/eval-server/install-engine-routes.js.map +1 -1
  69. package/dist/eval-server/install-jobs.d.ts +41 -0
  70. package/dist/eval-server/install-jobs.js +161 -0
  71. package/dist/eval-server/install-jobs.js.map +1 -0
  72. package/dist/eval-server/install-skill-routes.d.ts +74 -11
  73. package/dist/eval-server/install-skill-routes.js +508 -79
  74. package/dist/eval-server/install-skill-routes.js.map +1 -1
  75. package/dist/eval-server/install-state-routes.d.ts +5 -1
  76. package/dist/eval-server/install-state-routes.js +18 -2
  77. package/dist/eval-server/install-state-routes.js.map +1 -1
  78. package/dist/eval-server/integration-routes.d.ts +1 -1
  79. package/dist/eval-server/integration-routes.js +6 -1
  80. package/dist/eval-server/integration-routes.js.map +1 -1
  81. package/dist/eval-server/model-compare-routes.d.ts +1 -1
  82. package/dist/eval-server/model-compare-routes.js +3 -1
  83. package/dist/eval-server/model-compare-routes.js.map +1 -1
  84. package/dist/eval-server/oauth-github-routes.d.ts +2 -0
  85. package/dist/eval-server/oauth-github-routes.js +505 -0
  86. package/dist/eval-server/oauth-github-routes.js.map +1 -0
  87. package/dist/eval-server/platform-proxy.d.ts +22 -1
  88. package/dist/eval-server/platform-proxy.js +183 -22
  89. package/dist/eval-server/platform-proxy.js.map +1 -1
  90. package/dist/eval-server/plugin-cli-routes.d.ts +1 -1
  91. package/dist/eval-server/plugin-cli-routes.js +19 -10
  92. package/dist/eval-server/plugin-cli-routes.js.map +1 -1
  93. package/dist/eval-server/remove-skill-routes.d.ts +18 -0
  94. package/dist/eval-server/remove-skill-routes.js +147 -0
  95. package/dist/eval-server/remove-skill-routes.js.map +1 -0
  96. package/dist/eval-server/router.d.ts +17 -3
  97. package/dist/eval-server/router.js +166 -9
  98. package/dist/eval-server/router.js.map +1 -1
  99. package/dist/eval-server/settings-store.js +1 -1
  100. package/dist/eval-server/settings-store.js.map +1 -1
  101. package/dist/eval-server/skill-create-routes.d.ts +1 -1
  102. package/dist/eval-server/skill-create-routes.js +8 -1
  103. package/dist/eval-server/skill-create-routes.js.map +1 -1
  104. package/dist/eval-server/supported-agents-routes.d.ts +6 -0
  105. package/dist/eval-server/supported-agents-routes.js +41 -0
  106. package/dist/eval-server/supported-agents-routes.js.map +1 -0
  107. package/dist/eval-server/sweep-routes.d.ts +1 -1
  108. package/dist/eval-server/sweep-routes.js +5 -1
  109. package/dist/eval-server/sweep-routes.js.map +1 -1
  110. package/dist/eval-server/utils/spawn-env.d.ts +1 -0
  111. package/dist/eval-server/utils/spawn-env.js +47 -0
  112. package/dist/eval-server/utils/spawn-env.js.map +1 -0
  113. package/dist/eval-server/workspace-routes.d.ts +12 -0
  114. package/dist/eval-server/workspace-routes.js +57 -2
  115. package/dist/eval-server/workspace-routes.js.map +1 -1
  116. package/dist/eval-ui/assets/AdvancedTab-DOgbx7u0.js +1 -0
  117. package/dist/eval-ui/assets/{CreateSkillPage-CvdYq8Rr.js → CreateSkillPage-Cv93Croj.js} +3 -3
  118. package/dist/eval-ui/assets/FindSkillsPalette-BY9DAhHh.js +2 -0
  119. package/dist/eval-ui/assets/GeneralTab-AwK9sIkP.js +1 -0
  120. package/dist/eval-ui/assets/PrivacyTab-BtNrxpVV.js +1 -0
  121. package/dist/eval-ui/assets/{SearchPaletteCore-Bf3PBC64.js → SearchPaletteCore-DMVcq7UB.js} +2 -2
  122. package/dist/eval-ui/assets/SkillDetailPanel-B_lbhK6q.js +1 -0
  123. package/dist/eval-ui/assets/UpdateDropdown-4AbjZLpq.js +1 -0
  124. package/dist/eval-ui/assets/UpdatesTab-DTmo-vVb.js +1 -0
  125. package/dist/eval-ui/assets/core-DZjBCfjp.js +1 -0
  126. package/dist/eval-ui/assets/event-QtOCMXAv.js +1 -0
  127. package/dist/eval-ui/assets/globals-Dpf9KmYH.css +1 -0
  128. package/dist/eval-ui/assets/globals-hm1COkXX.js +49 -0
  129. package/dist/eval-ui/assets/index-CUEYzTVL.js +1 -0
  130. package/dist/eval-ui/assets/index-DDNzcrhv.js +1 -0
  131. package/dist/eval-ui/assets/index-DhhmQddr.js +1 -0
  132. package/dist/eval-ui/assets/lifecycle-d1Sm9Hts.css +1 -0
  133. package/dist/eval-ui/assets/lifecycle-o_IRibOa.js +1 -0
  134. package/dist/eval-ui/assets/main-tpOyw9SC.js +87 -0
  135. package/dist/eval-ui/assets/preferences-BHZXB5dL.css +1 -0
  136. package/dist/eval-ui/assets/preferences-DCdw0Kvu.js +2 -0
  137. package/dist/eval-ui/assets/useDesktopBridge-9oZFQsrw.js +2 -0
  138. package/dist/eval-ui/index.html +4 -2
  139. package/dist/eval-ui/lifecycle.html +33 -0
  140. package/dist/eval-ui/preferences.html +34 -0
  141. package/dist/index.js +47 -1
  142. package/dist/index.js.map +1 -1
  143. package/dist/installer/bundle-files.d.ts +4 -0
  144. package/dist/installer/bundle-files.js +97 -0
  145. package/dist/installer/bundle-files.js.map +1 -0
  146. package/dist/installer/canonical.d.ts +31 -6
  147. package/dist/installer/canonical.js +48 -12
  148. package/dist/installer/canonical.js.map +1 -1
  149. package/dist/installer/clipboard-export.d.ts +19 -0
  150. package/dist/installer/clipboard-export.js +88 -0
  151. package/dist/installer/clipboard-export.js.map +1 -0
  152. package/dist/installer/multi-install.d.ts +43 -0
  153. package/dist/installer/multi-install.js +237 -0
  154. package/dist/installer/multi-install.js.map +1 -0
  155. package/dist/installer/transformers/aider.d.ts +2 -0
  156. package/dist/installer/transformers/aider.js +32 -0
  157. package/dist/installer/transformers/aider.js.map +1 -0
  158. package/dist/installer/transformers/continue-dev.d.ts +2 -0
  159. package/dist/installer/transformers/continue-dev.js +6 -0
  160. package/dist/installer/transformers/continue-dev.js.map +1 -0
  161. package/dist/installer/transformers/cursor.d.ts +2 -0
  162. package/dist/installer/transformers/cursor.js +24 -0
  163. package/dist/installer/transformers/cursor.js.map +1 -0
  164. package/dist/installer/transformers/github-copilot.d.ts +2 -0
  165. package/dist/installer/transformers/github-copilot.js +17 -0
  166. package/dist/installer/transformers/github-copilot.js.map +1 -0
  167. package/dist/installer/transformers/index.d.ts +78 -0
  168. package/dist/installer/transformers/index.js +13 -0
  169. package/dist/installer/transformers/index.js.map +1 -0
  170. package/dist/installer/transformers/junie.d.ts +2 -0
  171. package/dist/installer/transformers/junie.js +6 -0
  172. package/dist/installer/transformers/junie.js.map +1 -0
  173. package/dist/installer/transformers/kiro.d.ts +2 -0
  174. package/dist/installer/transformers/kiro.js +6 -0
  175. package/dist/installer/transformers/kiro.js.map +1 -0
  176. package/dist/installer/transformers/trae.d.ts +2 -0
  177. package/dist/installer/transformers/trae.js +6 -0
  178. package/dist/installer/transformers/trae.js.map +1 -0
  179. package/dist/installer/transformers/windsurf.d.ts +2 -0
  180. package/dist/installer/transformers/windsurf.js +12 -0
  181. package/dist/installer/transformers/windsurf.js.map +1 -0
  182. package/dist/installer/yaml-safe-mutate.d.ts +19 -0
  183. package/dist/installer/yaml-safe-mutate.js +184 -0
  184. package/dist/installer/yaml-safe-mutate.js.map +1 -0
  185. package/dist/lib/active-tenant.d.ts +36 -0
  186. package/dist/lib/active-tenant.js +120 -0
  187. package/dist/lib/active-tenant.js.map +1 -0
  188. package/dist/lib/keychain.d.ts +15 -2
  189. package/dist/lib/keychain.js +173 -8
  190. package/dist/lib/keychain.js.map +1 -1
  191. package/dist/lib/migration/keychain-migration.d.ts +35 -0
  192. package/dist/lib/migration/keychain-migration.js +189 -0
  193. package/dist/lib/migration/keychain-migration.js.map +1 -0
  194. package/dist/lib/tenant-resolver.d.ts +38 -0
  195. package/dist/lib/tenant-resolver.js +79 -0
  196. package/dist/lib/tenant-resolver.js.map +1 -0
  197. package/dist/studio/lib/ops-log.js +140 -57
  198. package/dist/studio/lib/ops-log.js.map +1 -1
  199. package/dist/studio/lib/scope-transfer.d.ts +11 -1
  200. package/dist/studio/lib/scope-transfer.js +48 -24
  201. package/dist/studio/lib/scope-transfer.js.map +1 -1
  202. package/dist/studio/routes/index.d.ts +1 -1
  203. package/dist/studio/routes/index.js +18 -8
  204. package/dist/studio/routes/index.js.map +1 -1
  205. package/dist/studio/routes/ops.js +31 -7
  206. package/dist/studio/routes/ops.js.map +1 -1
  207. package/dist/studio/routes/promote.d.ts +1 -1
  208. package/dist/studio/routes/promote.js +18 -9
  209. package/dist/studio/routes/promote.js.map +1 -1
  210. package/dist/studio/routes/revert.d.ts +1 -1
  211. package/dist/studio/routes/revert.js +15 -2
  212. package/dist/studio/routes/revert.js.map +1 -1
  213. package/dist/studio/routes/test-install.d.ts +1 -1
  214. package/dist/studio/routes/test-install.js +16 -9
  215. package/dist/studio/routes/test-install.js.map +1 -1
  216. package/dist/studio-runtime/lockfile.d.ts +51 -0
  217. package/dist/studio-runtime/lockfile.js +216 -0
  218. package/dist/studio-runtime/lockfile.js.map +1 -0
  219. package/package.json +18 -1
  220. package/dist/eval-ui/assets/FindSkillsPalette-DsSgotS9.js +0 -2
  221. package/dist/eval-ui/assets/SkillDetailPanel-DAD2yJO-.js +0 -1
  222. package/dist/eval-ui/assets/UpdateDropdown-h5Hg3h7Z.js +0 -1
  223. package/dist/eval-ui/assets/index-CKLqBL52.css +0 -1
  224. package/dist/eval-ui/assets/index-JaDg6FlU.js +0 -124
  225. package/dist/eval-ui/assets/skill-studio-logo-CRyKgIrg.png +0 -0
@@ -24,6 +24,11 @@ const DEVICE_CODE_URL = "https://github.com/login/device/code";
24
24
  const TOKEN_URL = "https://github.com/login/oauth/access_token";
25
25
  const USER_URL = "https://api.github.com/user";
26
26
  const DEFAULT_SCOPE = "read:user";
27
+ // Public OAuth client_id for the Skill Studio GitHub App
28
+ // (github.com/settings/applications/3406130). Safe to embed: OAuth client_ids
29
+ // are public identifiers, not secrets, and Device Flow does not require a
30
+ // client_secret. Override with VSKILL_GITHUB_CLIENT_ID for self-hosted variants.
31
+ const DEFAULT_CLIENT_ID = "Ov23li6H8OpvPfuhyDEt";
27
32
  function isPollError(r) {
28
33
  return typeof r.error === "string";
29
34
  }
@@ -69,12 +74,7 @@ async function getJson(fetchImpl, url, token, version) {
69
74
  async function loginCmd(deps) {
70
75
  const { io, fetchImpl, sleep, version } = deps;
71
76
  const keychain = deps.keychain ?? getDefaultKeychain();
72
- const clientId = deps.clientId ?? process.env.VSKILL_GITHUB_CLIENT_ID ?? "";
73
- if (!clientId) {
74
- io.stderr.write("vskill auth login: VSKILL_GITHUB_CLIENT_ID is not set. " +
75
- "Set it to the Skill Studio GitHub App's client_id, then retry.\n");
76
- return 2;
77
- }
77
+ const clientId = deps.clientId || process.env.VSKILL_GITHUB_CLIENT_ID || DEFAULT_CLIENT_ID;
78
78
  // --- Step 1: device code -------------------------------------------------
79
79
  let dcRes;
80
80
  try {
@@ -161,10 +161,46 @@ async function loginCmd(deps) {
161
161
  if (user.status !== 200 || !user.body || typeof user.body.login !== "string") {
162
162
  io.stderr.write(`vskill auth login: token saved but /user verification failed (HTTP ${user.status})\n`);
163
163
  keychain.setGitHubToken(accessToken);
164
+ // 0839 F-004 — invalidate cache so any subsequent in-process API call
165
+ // sees the new gho_ token rather than the pre-login (null) cache.
166
+ if (deps.invalidateAuthCache)
167
+ deps.invalidateAuthCache();
164
168
  return 1;
165
169
  }
166
170
  const login = user.body.login;
167
171
  keychain.setGitHubToken(accessToken);
172
+ // 0839 F-004 — bust the cache after writing a fresh gho_ to keychain.
173
+ if (deps.invalidateAuthCache)
174
+ deps.invalidateAuthCache();
175
+ // --- Step 4: exchange gho_* for vsk_* (0839 US-005) ---------------------
176
+ // Best-effort: failure is non-fatal — login still succeeds in "legacy
177
+ // mode" with just the gho_* token (AC-US5-05). The platform's
178
+ // `requireUserOrGithubBearer` already accepts gho_*, so all features
179
+ // continue to work; only entitlement-aware flows that strictly require
180
+ // a vsk_* token would degrade.
181
+ if (deps.exchangeForVskToken) {
182
+ try {
183
+ const resp = await deps.exchangeForVskToken(accessToken);
184
+ if (resp && typeof resp.token === "string" && resp.token.length > 0) {
185
+ keychain.setVskillToken(resp.token);
186
+ // 0839 F-004 — bust again so vsk_ replaces gho_ in the cache.
187
+ if (deps.invalidateAuthCache)
188
+ deps.invalidateAuthCache();
189
+ // 0855 — confirm the verified-skill token was minted so the user
190
+ // knows the in-app submit/queue is enabled.
191
+ io.stdout.write(`\nLogged in as @${login} (verified-skill token minted — in-app submit/queue enabled).\n`);
192
+ return 0;
193
+ }
194
+ else {
195
+ io.stdout.write(`\nLogged in as @${login} (legacy mode — exchange returned no token).\n`);
196
+ return 0;
197
+ }
198
+ }
199
+ catch (err) {
200
+ io.stdout.write(`\nLogged in as @${login} (legacy mode — some features unavailable: ${err.message}).\n`);
201
+ return 0;
202
+ }
203
+ }
168
204
  io.stdout.write(`\nLogged in as @${login}.\n`);
169
205
  return 0;
170
206
  }
@@ -207,23 +243,73 @@ async function statusCmd(args, deps) {
207
243
  return 1;
208
244
  }
209
245
  const u = user.body;
246
+ // 0855 — also report whether a verified-skill vsk_ token is present so the
247
+ // user knows the in-app submit/queue (which the eval-server proxy gates on
248
+ // vsk_) will work. Never print the token value — only a redacted prefix.
249
+ const vsk = keychain.getVskillToken();
250
+ const vskPresent = typeof vsk === "string" && vsk.length > 0;
210
251
  if (json) {
211
- io.stdout.write(JSON.stringify({ loggedIn: true, login: u.login, id: u.id }) + "\n");
252
+ io.stdout.write(JSON.stringify({
253
+ loggedIn: true,
254
+ login: u.login,
255
+ id: u.id,
256
+ vskToken: vskPresent,
257
+ }) + "\n");
212
258
  }
213
259
  else {
214
260
  io.stdout.write(`Logged in as @${u.login} (id=${u.id}).\n`);
261
+ if (vskPresent) {
262
+ io.stdout.write(`verified-skill token: present (${redactVsk(vsk)}).\n`);
263
+ }
264
+ else {
265
+ io.stdout.write("verified-skill token: absent (run `vskill auth login` to mint one; in-app submit/queue needs it).\n");
266
+ }
215
267
  }
216
268
  return 0;
217
269
  }
270
+ /**
271
+ * 0855 — log-safe rendering of a vsk_ token for `auth status`. Keeps the
272
+ * recognisable `vsk_` prefix + last 4 chars, masks the middle. Never emits
273
+ * the full secret.
274
+ */
275
+ function redactVsk(token) {
276
+ if (token.length <= 8)
277
+ return "vsk_****";
278
+ return `vsk_…${token.slice(-4)}`;
279
+ }
218
280
  async function logoutCmd(deps) {
219
281
  const { io } = deps;
220
282
  const keychain = deps.keychain ?? getDefaultKeychain();
221
- const had = keychain.clearGitHubToken();
283
+ // 0839 US-005 / AC-US5-06: clear BOTH local tokens AND best-effort
284
+ // revoke server-side. Server-side revoke runs BEFORE local clear so a
285
+ // network failure doesn't prevent us from logging the user out
286
+ // remotely — but its failure NEVER blocks the local clear.
287
+ if (deps.signOutAll) {
288
+ try {
289
+ await deps.signOutAll();
290
+ }
291
+ catch (err) {
292
+ // Soft-fail: local logout proceeds anyway. Surface the failure on
293
+ // stderr so power users running --debug see it.
294
+ if (process.env.VSKILL_DEBUG === "1") {
295
+ io.stderr.write(`vskill auth logout: server-side revoke failed (${err.message}); local clear continues.\n`);
296
+ }
297
+ }
298
+ }
299
+ const hadGh = keychain.clearGitHubToken();
300
+ const hadVsk = keychain.clearVskillToken();
301
+ // 0839 F-004 — invalidate the in-memory cache so a subsequent API call
302
+ // doesn't keep using a token we just revoked. We do this unconditionally
303
+ // because even if the keychain didn't carry a token, the cache could
304
+ // still hold a value from a prior session that hadn't been written back.
305
+ if (deps.invalidateAuthCache)
306
+ deps.invalidateAuthCache();
307
+ const had = hadGh || hadVsk;
222
308
  if (had) {
223
- io.stdout.write("Logged out. GitHub token cleared from keychain.\n");
309
+ io.stdout.write("Logged out. Tokens cleared from keychain.\n");
224
310
  return 0;
225
311
  }
226
- io.stdout.write("Logged out. (No GitHub token was stored.)\n");
312
+ io.stdout.write("Logged out. (No tokens were stored.)\n");
227
313
  return 0;
228
314
  }
229
315
  function usage(io) {
@@ -242,17 +328,55 @@ export async function authCommand(argv, deps) {
242
328
  const sleep = deps.sleep ?? defaultSleep;
243
329
  const version = deps.version ?? "vskill";
244
330
  const io = deps.io;
331
+ // 0839 US-005: default `exchangeForVskToken` and `signOutAll` to the
332
+ // production platform helpers when not injected. Lazy-imported so the
333
+ // unit tests that pass mocks don't trigger any real network code.
334
+ const exchangeForVskToken = deps.exchangeForVskToken ??
335
+ (async (githubToken) => {
336
+ const mod = await import("../api/client.js");
337
+ return mod.exchangeForVskToken(githubToken);
338
+ });
339
+ const signOutAll = deps.signOutAll ??
340
+ (async () => {
341
+ const mod = await import("../api/client.js");
342
+ return mod.signOutAll();
343
+ });
344
+ // 0839 F-004 — default cache invalidator ties auth.ts to the API client's
345
+ // `invalidateAuthCache`. Synchronous module reference is fine here: the
346
+ // client.ts module is already imported by anything that touches the
347
+ // auth path, and we only call it after a successful keychain mutation.
348
+ const invalidateAuthCache = deps.invalidateAuthCache ??
349
+ (() => {
350
+ // Best-effort: import lazily so test environments that mock
351
+ // ../api/client don't crash if the module shape differs.
352
+ void import("../api/client.js")
353
+ .then((mod) => {
354
+ if (typeof mod.invalidateAuthCache === "function") {
355
+ mod.invalidateAuthCache();
356
+ }
357
+ })
358
+ .catch(() => {
359
+ /* non-fatal — cache will fall stale until next process boot */
360
+ });
361
+ });
245
362
  const sub = argv[0];
246
363
  let exit = 0;
247
364
  switch (sub) {
248
365
  case "login":
249
- exit = await loginCmd({ ...deps, fetchImpl, sleep, version });
366
+ exit = await loginCmd({
367
+ ...deps,
368
+ fetchImpl,
369
+ sleep,
370
+ version,
371
+ exchangeForVskToken,
372
+ invalidateAuthCache,
373
+ });
250
374
  break;
251
375
  case "status":
252
376
  exit = await statusCmd(argv.slice(1), { ...deps, fetchImpl, sleep: deps.sleep ?? defaultSleep, version });
253
377
  break;
254
378
  case "logout":
255
- exit = await logoutCmd(deps);
379
+ exit = await logoutCmd({ ...deps, signOutAll, invalidateAuthCache });
256
380
  break;
257
381
  case undefined:
258
382
  case "--help":
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,iDAAiD;AACjD,EAAE;AACF,sDAAsD;AACtD,iDAAiD;AACjD,oEAAoE;AACpE,mFAAmF;AACnF,mEAAmE;AACnE,8DAA8D;AAC9D,iFAAiF;AACjF,sGAAsG;AACtG,6HAA6H;AAC7H,sCAAsC;AACtC,6CAA6C;AAC7C,8CAA8C;AAC9C,mFAAmF;AACnF,mCAAmC;AACnC,EAAE;AACF,6EAA6E;AAC7E,iCAAiC;AACjC,8EAA8E;AAE9E,OAAO,EAAE,kBAAkB,EAAiB,MAAM,oBAAoB,CAAC;AA0CvE,MAAM,eAAe,GAAG,sCAAsC,CAAC;AAC/D,MAAM,SAAS,GAAG,6CAA6C,CAAC;AAChE,MAAM,QAAQ,GAAG,6BAA6B,CAAC;AAE/C,MAAM,aAAa,GAAG,WAAW,CAAC;AAElC,yDAAyD;AACzD,8EAA8E;AAC9E,0EAA0E;AAC1E,iFAAiF;AACjF,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;AAmBjD,SAAS,WAAW,CAAC,CAAa;IAChC,OAAO,OAAQ,CAAe,CAAC,KAAK,KAAK,QAAQ,CAAC;AACpD,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,wEAAwE;IACxE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,SAAuB,EACvB,GAAW,EACX,IAA4B,EAC5B,OAAe;IAEf,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;IACzC,OAAO,SAAS,CAAC,GAAG,EAAE;QACpB,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,MAAM,EAAE,kBAAkB;YAC1B,cAAc,EAAE,mCAAmC;YACnD,YAAY,EAAE,UAAU,OAAO,EAAE;SAClC;QACD,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE;KACxB,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,SAAuB,EACvB,GAAW,EACX,KAAa,EACb,OAAe;IAEf,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;QAC/B,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,MAAM,EAAE,6BAA6B;YACrC,aAAa,EAAE,UAAU,KAAK,EAAE;YAChC,YAAY,EAAE,UAAU,OAAO,EAAE;SAClC;KACF,CAAC,CAAC;IACH,IAAI,IAAI,GAAY,IAAI,CAAC;IACzB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,GAAG,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAA0F;IAChH,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,kBAAkB,EAAE,CAAC;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,iBAAiB,CAAC;IAE3F,4EAA4E;IAC5E,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,eAAe,EAAE;YACjD,SAAS,EAAE,QAAQ;YACnB,KAAK,EAAE,aAAa;SACrB,EAAE,OAAO,CAAC,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,2DAA4D,GAAa,CAAC,OAAO,KAAK,CAAC,CAAC;QACxG,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACd,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,uDAAuD,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;QAC1F,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAmB,CAAC;IAElD,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,CAAC,gBAAgB,MAAM,CAAC,CAAC;IAC3E,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,cAAc,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC9E,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,2DAA2D,EAAE,CAAC,QAAQ,OAAO,CAAC,CAAC;IAE/F,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,+CAA+C;QACjD,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACrD,IAAI,WAAW,GAAkB,IAAI,CAAC;IAEtC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;QAC7B,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE;gBAC7C,SAAS,EAAE,QAAQ;gBACnB,WAAW,EAAE,EAAE,CAAC,WAAW;gBAC3B,UAAU,EAAE,8CAA8C;aAC3D,EAAE,OAAO,CAAC,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,oDAAqD,GAAa,CAAC,OAAO,KAAK,CAAC,CAAC;YACjG,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,IAAgB,CAAC;QACrB,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAe,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC;YACjF,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC5C,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC;YAChC,MAAM;QACR,CAAC;QACD,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;gBACnB,KAAK,uBAAuB;oBAC1B,SAAS;gBACX,KAAK,WAAW;oBACd,QAAQ,IAAI,CAAC,CAAC;oBACd,SAAS;gBACX,KAAK,eAAe;oBAClB,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,kFAAkF,CAAC,CAAC;oBACpG,OAAO,CAAC,CAAC;gBACX,KAAK,eAAe;oBAClB,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;oBACtE,OAAO,CAAC,CAAC;gBACX;oBACE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,wDAAwD,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;oBACxF,OAAO,CAAC,CAAC;YACb,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC7E,OAAO,CAAC,CAAC;IACX,CAAC;IAED,4EAA4E;IAC5E,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACtE,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,OAAQ,IAAI,CAAC,IAA2B,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACrG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,sEAAsE,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;QACxG,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QACrC,sEAAsE;QACtE,kEAAkE;QAClE,IAAI,IAAI,CAAC,mBAAmB;YAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,KAAK,GAAI,IAAI,CAAC,IAA0B,CAAC,KAAK,CAAC;IACrD,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IACrC,sEAAsE;IACtE,IAAI,IAAI,CAAC,mBAAmB;QAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAEzD,2EAA2E;IAC3E,sEAAsE;IACtE,8DAA8D;IAC9D,qEAAqE;IACrE,uEAAuE;IACvE,+BAA+B;IAC/B,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;YACzD,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpE,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpC,8DAA8D;gBAC9D,IAAI,IAAI,CAAC,mBAAmB;oBAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACzD,iEAAiE;gBACjE,4CAA4C;gBAC5C,EAAE,CAAC,MAAM,CAAC,KAAK,CACb,mBAAmB,KAAK,iEAAiE,CAC1F,CAAC;gBACF,OAAO,CAAC,CAAC;YACX,CAAC;iBAAM,CAAC;gBACN,EAAE,CAAC,MAAM,CAAC,KAAK,CACb,mBAAmB,KAAK,gDAAgD,CACzE,CAAC;gBACF,OAAO,CAAC,CAAC;YACX,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,EAAE,CAAC,MAAM,CAAC,KAAK,CACb,mBAAmB,KAAK,8CAA+C,GAAa,CAAC,OAAO,MAAM,CACnG,CAAC;YACF,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IACD,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,KAAK,KAAK,CAAC,CAAC;IAC/C,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAc,EAAE,IAAgF;IACvH,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,kBAAkB,EAAE,CAAC;IACvD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC1E,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;IAExC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,IAAI,EAAE,CAAC;YACT,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,4EAA4E;IAC5E,6EAA6E;IAC7E,sEAAsE;IACtE,KAAK,OAAO,CAAC;IACb,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAChE,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACxB,IAAI,IAAI,EAAE,CAAC;YACT,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACvF,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,IAAI,EAAE,CAAC;YACT,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACpG,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,IAAI,CAAC,MAAM,6BAA6B,CAAC,CAAC;QACrG,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAqC,CAAC;IACrD,2EAA2E;IAC3E,2EAA2E;IAC3E,yEAAyE;IACzE,MAAM,GAAG,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;IACtC,MAAM,UAAU,GAAG,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7D,IAAI,IAAI,EAAE,CAAC;QACT,EAAE,CAAC,MAAM,CAAC,KAAK,CACb,IAAI,CAAC,SAAS,CAAC;YACb,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,QAAQ,EAAE,UAAU;SACrB,CAAC,GAAG,IAAI,CACV,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC5D,IAAI,UAAU,EAAE,CAAC;YACf,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,SAAS,CAAC,GAAI,CAAC,MAAM,CAAC,CAAC;QAC3E,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,MAAM,CAAC,KAAK,CACb,qGAAqG,CACtG,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAAC,KAAa;IAC9B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,UAAU,CAAC;IACzC,OAAO,QAAQ,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACnC,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAqB;IAC5C,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;IACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,kBAAkB,EAAE,CAAC;IAEvD,mEAAmE;IACnE,sEAAsE;IACtE,+DAA+D;IAC/D,2DAA2D;IAC3D,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,kEAAkE;YAClE,gDAAgD;YAChD,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,GAAG,EAAE,CAAC;gBACrC,EAAE,CAAC,MAAM,CAAC,KAAK,CACb,kDAAmD,GAAa,CAAC,OAAO,6BAA6B,CACtG,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC;IAC3C,uEAAuE;IACvE,yEAAyE;IACzE,qEAAqE;IACrE,yEAAyE;IACzE,IAAI,IAAI,CAAC,mBAAmB;QAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC;IACzD,MAAM,GAAG,GAAG,KAAK,IAAI,MAAM,CAAC;IAC5B,IAAI,GAAG,EAAE,CAAC;QACR,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC/D,OAAO,CAAC,CAAC;IACX,CAAC;IACD,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC1D,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,KAAK,CAAC,EAAiB;IAC9B,EAAE,CAAC,MAAM,CAAC,KAAK,CACb;QACE,iCAAiC;QACjC,EAAE;QACF,cAAc;QACd,kDAAkD;QAClD,6DAA6D;QAC7D,mDAAmD;QACnD,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAc,EACd,IAAqB;IAErB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC;IACzC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;IAEnB,qEAAqE;IACrE,sEAAsE;IACtE,kEAAkE;IAClE,MAAM,mBAAmB,GACvB,IAAI,CAAC,mBAAmB;QACxB,CAAC,KAAK,EAAE,WAAmB,EAAE,EAAE;YAC7B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;YAC7C,OAAO,GAAG,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,MAAM,UAAU,GACd,IAAI,CAAC,UAAU;QACf,CAAC,KAAK,IAAI,EAAE;YACV,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;YAC7C,OAAO,GAAG,CAAC,UAAU,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,0EAA0E;IAC1E,wEAAwE;IACxE,oEAAoE;IACpE,uEAAuE;IACvE,MAAM,mBAAmB,GACvB,IAAI,CAAC,mBAAmB;QACxB,CAAC,GAAG,EAAE;YACJ,4DAA4D;YAC5D,yDAAyD;YACzD,KAAK,MAAM,CAAC,kBAAkB,CAAC;iBAC5B,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;gBACZ,IAAI,OAAO,GAAG,CAAC,mBAAmB,KAAK,UAAU,EAAE,CAAC;oBAClD,GAAG,CAAC,mBAAmB,EAAE,CAAC;gBAC5B,CAAC;YACH,CAAC,CAAC;iBACD,KAAK,CAAC,GAAG,EAAE;gBACV,+DAA+D;YACjE,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IAEL,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,OAAO;YACV,IAAI,GAAG,MAAM,QAAQ,CAAC;gBACpB,GAAG,IAAI;gBACP,SAAS;gBACT,KAAK;gBACL,OAAO;gBACP,mBAAmB;gBACnB,mBAAmB;aACpB,CAAC,CAAC;YACH,MAAM;QACR,KAAK,QAAQ;YACX,IAAI,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;YAC1G,MAAM;QACR,KAAK,QAAQ;YACX,IAAI,GAAG,MAAM,SAAS,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,mBAAmB,EAAE,CAAC,CAAC;YACrE,MAAM;QACR,KAAK,SAAS,CAAC;QACf,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,KAAK,CAAC,EAAE,CAAC,CAAC;YACV,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnB,MAAM;QACR;YACE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAAC;YAChD,KAAK,CAAC,EAAE,CAAC,CAAC;YACV,IAAI,GAAG,CAAC,CAAC;YACT,MAAM;IACV,CAAC;IAED,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI;QAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -12,4 +12,6 @@ export declare function projectPort(rootPath: string): number;
12
12
  export declare function requestShutdownAndWait(port: number): Promise<boolean>;
13
13
  export declare function runEvalServe(root: string, port: number | null, options?: {
14
14
  force?: boolean;
15
+ replace?: boolean;
16
+ status?: boolean;
15
17
  }): Promise<void>;
@@ -10,6 +10,8 @@ import * as net from "node:net";
10
10
  import { startEvalServer } from "../../eval-server/eval-server.js";
11
11
  import { yellow, dim, red, cyan, bold, green } from "../../utils/output.js";
12
12
  import { isSkillCreatorInstalled } from "../../utils/skill-creator-detection.js";
13
+ // 0832 T-002/T-003/T-004: studio runtime lock files for cross-process discovery.
14
+ import { isPidAlive, pruneStaleLocks, registerCleanup, removeLock, writeLock, } from "../../studio-runtime/lockfile.js";
13
15
  /**
14
16
  * Deterministic port for a project path.
15
17
  * Maps the absolute path to a port in range 3077-3177 using a hash.
@@ -170,8 +172,19 @@ async function handlePortConflict(port, resolvedRoot, force) {
170
172
  // Main entry point
171
173
  // ---------------------------------------------------------------------------
172
174
  export async function runEvalServe(root, port, options = {}) {
175
+ // 0832 T-003: --status is read-only; print every detected studio instance
176
+ // (lock-file fast path, stale entries auto-pruned) and exit 0. Honored
177
+ // before any other side-effect (no port resolution, no firstRunOnboarding).
178
+ if (options.status === true) {
179
+ printStatusAndExit();
180
+ return; // unreachable — printStatusAndExit calls process.exit(0).
181
+ }
173
182
  const resolvedRoot = resolve(root);
174
183
  const force = options.force === true;
184
+ // 0832 T-004: --replace forwards to the existing --force path AND additionally
185
+ // SIGTERMs every external (non-this-process) studio lock owner. Both behaviors
186
+ // ship together so --replace is "make space for me unconditionally".
187
+ const replace = options.replace === true;
175
188
  checkSkillCreator(resolvedRoot);
176
189
  if (!existsSync(resolvedRoot)) {
177
190
  console.error(red(`\n Directory not found: ${resolvedRoot}\n`) +
@@ -185,17 +198,43 @@ export async function runEvalServe(root, port, options = {}) {
185
198
  // Non-TTY / already-configured → silent skip.
186
199
  const { firstRunOnboarding } = await import("../../first-run-onboarding.js");
187
200
  await firstRunOnboarding();
188
- // Handle port conflicts gracefully. Returns true only on the --force
189
- // success path (existing vskill server gracefully shut down); every
190
- // other branch process.exit()s inside.
201
+ // 0832 T-004: --replace pre-flight kill of every external instance. Lock
202
+ // files only we never reach across machines, never touch foreign-user PIDs
203
+ // (kill returns EPERM, isPidAlive treats that as alive but we still attempt
204
+ // SIGTERM and let the OS reject it). Stale entries pruned implicitly.
205
+ if (replace) {
206
+ await killExternalInstances();
207
+ }
208
+ // Handle port conflicts gracefully. --replace implies --force semantics for
209
+ // the specific port we're about to bind. Returns true only on the success
210
+ // path; every other branch process.exit()s inside.
191
211
  if (await isPortInUse(effectivePort)) {
192
- await handlePortConflict(effectivePort, resolvedRoot, force);
212
+ await handlePortConflict(effectivePort, resolvedRoot, force || replace);
193
213
  }
194
214
  const server = await startEvalServer({
195
215
  port: effectivePort,
196
216
  root: resolvedRoot,
197
217
  projectName: name,
198
218
  });
219
+ // 0832 T-002: write the studio runtime lock now that the port is bound.
220
+ // The Tauri scanner reads ~/.vskill/runtime/studio-{port}.lock as fast path.
221
+ const lock = {
222
+ pid: process.pid,
223
+ port: effectivePort,
224
+ cmdline: process.argv.join(" "),
225
+ startedAt: new Date().toISOString(),
226
+ source: detectSource(),
227
+ };
228
+ try {
229
+ writeLock(lock);
230
+ // SIGINT/SIGTERM/exit handler removes the lock file. Idempotent across
231
+ // repeat calls — extending the existing shutdown handler below.
232
+ registerCleanup(effectivePort);
233
+ }
234
+ catch (e) {
235
+ console.warn(yellow(` ⚠ Could not write studio lock file: ${e.message}\n` +
236
+ ` Desktop app will fall back to platform-native enumeration.\n`));
237
+ }
199
238
  // Graceful shutdown — idempotent so SIGINT + SIGTERM (or two SIGINTs from
200
239
  // a parent shell forwarding) don't print the banner twice or race the
201
240
  // exit timer. 0826: previously a single ^C printed "Shutting down…" twice
@@ -206,10 +245,93 @@ export async function runEvalServe(root, port, options = {}) {
206
245
  return;
207
246
  shuttingDown = true;
208
247
  console.log("\nShutting down eval server...");
248
+ // 0832: best-effort lock removal in case registerCleanup ran but the
249
+ // signal handler chain reordered. Idempotent.
250
+ try {
251
+ removeLock(effectivePort);
252
+ }
253
+ catch {
254
+ /* swallow — process is exiting */
255
+ }
209
256
  server.close(() => process.exit(0));
210
257
  setTimeout(() => process.exit(0), 5000);
211
258
  };
212
259
  process.on("SIGINT", shutdown);
213
260
  process.on("SIGTERM", shutdown);
214
261
  }
262
+ // ---------------------------------------------------------------------------
263
+ // 0832 helpers — status print, replace-kill, source classification.
264
+ // ---------------------------------------------------------------------------
265
+ /** Detect whether this CLI run is `npx`/`npm exec`/direct-node. */
266
+ function detectSource() {
267
+ // npm-exec (`npx vskill studio`) sets npm_lifecycle_event/npm_execpath even
268
+ // when invoked via the new `npx` binary. Either of those + an `npx`-shaped
269
+ // path is a strong signal.
270
+ //
271
+ // 0832 F-009: npm 7+ runs `npx pkg@latest` from a one-shot install cache
272
+ // at `~/.npm/_npx/{hash}/node_modules/...`. argv[1] resolves to that path,
273
+ // so detect the `_npx/` segment as another strong signal.
274
+ const argv0 = process.argv[0] ?? "";
275
+ const argv1 = process.argv[1] ?? "";
276
+ if (process.env.npm_execpath ||
277
+ process.env.npm_config_user_agent?.includes("npm/") ||
278
+ argv0.includes("npx") ||
279
+ argv1.includes("npx") ||
280
+ argv1.includes("/_npx/")) {
281
+ return "npx-cli";
282
+ }
283
+ return "node-direct";
284
+ }
285
+ /**
286
+ * Print the current studio lock-file population to stdout, one tab-separated
287
+ * line per instance, then exit 0. No instances → empty stdout + exit 0.
288
+ *
289
+ * Format: `port\t{N}\tsource={src}\tpid={pid}\tstarted={iso8601}`
290
+ */
291
+ function printStatusAndExit() {
292
+ const live = pruneStaleLocks();
293
+ for (const lock of live) {
294
+ process.stdout.write(`port\t${lock.port}\tsource=${lock.source ?? "npx-cli"}\tpid=${lock.pid}\tstarted=${lock.startedAt}\n`);
295
+ }
296
+ process.exit(0);
297
+ }
298
+ /**
299
+ * 0832 T-004: SIGTERM every external instance, wait up to 3s for graceful
300
+ * exit, escalate to SIGKILL if still alive. "External" = pid != process.pid.
301
+ */
302
+ async function killExternalInstances() {
303
+ const live = pruneStaleLocks();
304
+ const targets = live.filter((l) => l.pid !== process.pid);
305
+ if (targets.length === 0)
306
+ return;
307
+ for (const t of targets) {
308
+ try {
309
+ process.kill(t.pid, "SIGTERM");
310
+ }
311
+ catch {
312
+ /* not-our-process or already-gone */
313
+ }
314
+ }
315
+ // Wait up to 3s for graceful exit.
316
+ const deadline = Date.now() + 3000;
317
+ while (Date.now() < deadline) {
318
+ const stillAlive = targets.filter((t) => isPidAlive(t.pid));
319
+ if (stillAlive.length === 0)
320
+ break;
321
+ await new Promise((r) => setTimeout(r, 100));
322
+ }
323
+ // Anything still alive → SIGKILL.
324
+ for (const t of targets) {
325
+ if (isPidAlive(t.pid)) {
326
+ try {
327
+ process.kill(t.pid, "SIGKILL");
328
+ }
329
+ catch {
330
+ /* swallow */
331
+ }
332
+ }
333
+ }
334
+ // Their lock files are removed by their own SIGTERM handler; if SIGKILL won,
335
+ // the next pruneStaleLocks() call will sweep them. Caller continues.
336
+ }
215
337
  //# sourceMappingURL=serve.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/commands/eval/serve.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/commands/eval/serve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type Keychain } from "../lib/keychain.js";
2
+ import { type ActiveTenantOptions } from "../lib/active-tenant.js";
3
+ import { type TenantSummary } from "../api/client.js";
4
+ export interface OrgsCommandIO {
5
+ stdout: {
6
+ write: (s: string) => boolean;
7
+ };
8
+ stderr: {
9
+ write: (s: string) => boolean;
10
+ };
11
+ exit?: (code: number) => void;
12
+ }
13
+ export interface OrgsCommandDeps {
14
+ io: OrgsCommandIO;
15
+ keychain?: Keychain;
16
+ /** 0839 — override for tests so we don't hit the network. */
17
+ listTenants?: () => Promise<TenantSummary[]>;
18
+ /** Override the config dir (tests). */
19
+ activeTenantOptions?: ActiveTenantOptions;
20
+ }
21
+ export declare function orgsCommand(argv: string[], deps: OrgsCommandDeps): Promise<number>;
@@ -0,0 +1,164 @@
1
+ // ---------------------------------------------------------------------------
2
+ // orgs.ts — `vskill orgs {list,use,current}` (0839 US-003 / T-008).
3
+ //
4
+ // Manages the active tenant slug stored at `~/.vskill/config.json`.
5
+ // `list` calls `GET /api/v1/account/tenants` (T-002) and prints the rows
6
+ // with `*` next to the active one. `use <slug>` validates the slug
7
+ // against the same listing before persisting. `current` prints the
8
+ // active slug or `(none)`.
9
+ //
10
+ // Anonymous-safe: `list` prints "Not logged in. Run `vskill auth login`."
11
+ // and exits 0 when no token is present (AC-US3-05). The other subcommands
12
+ // degrade gracefully too: `current` works without a token (it only reads
13
+ // the local config), `use` returns non-zero with a "log in first" hint.
14
+ //
15
+ // Output format is intentionally simple text so users can grep / pipe.
16
+ // `--json` is reserved for a follow-up; not required by the AC.
17
+ // ---------------------------------------------------------------------------
18
+ import { getDefaultKeychain, } from "../lib/keychain.js";
19
+ import { getActiveTenant, setActiveTenant, } from "../lib/active-tenant.js";
20
+ import { listTenants } from "../api/client.js";
21
+ function hasAnyToken(keychain) {
22
+ try {
23
+ return !!(keychain.getVskillToken() || keychain.getGitHubToken());
24
+ }
25
+ catch {
26
+ return false;
27
+ }
28
+ }
29
+ async function listCmd(deps) {
30
+ const { io } = deps;
31
+ const keychain = deps.keychain ?? getDefaultKeychain();
32
+ // AC-US3-05 — anonymous-safe `list`. We deliberately do NOT make the
33
+ // network call when no token is stored; the platform would reject with
34
+ // 401, but printing a generic "Not logged in" is friendlier than a
35
+ // raw HTTP error and keeps `orgs list` script-safe (exit 0).
36
+ if (!hasAnyToken(keychain)) {
37
+ io.stdout.write("Not logged in. Run `vskill auth login` to view tenants.\n");
38
+ return 0;
39
+ }
40
+ let tenants;
41
+ try {
42
+ tenants = await (deps.listTenants ?? listTenants)();
43
+ }
44
+ catch (err) {
45
+ const e = err;
46
+ if (e.status === 401) {
47
+ io.stderr.write("Token rejected by the platform. Run `vskill auth login` to refresh.\n");
48
+ return 1;
49
+ }
50
+ io.stderr.write(`vskill orgs list: failed to fetch tenants (${e.message ?? String(err)})\n`);
51
+ return 1;
52
+ }
53
+ if (tenants.length === 0) {
54
+ io.stdout.write("You have no tenants yet. Install the GitHub App to create one.\n");
55
+ return 0;
56
+ }
57
+ const active = getActiveTenant(deps.activeTenantOptions);
58
+ // Two-column ASCII table: marker + slug + name + role.
59
+ // Column widths chosen for readability without external deps.
60
+ const slugW = Math.max(4, ...tenants.map((t) => t.slug.length));
61
+ const nameW = Math.max(4, ...tenants.map((t) => t.name.length));
62
+ io.stdout.write(` ${"SLUG".padEnd(slugW)} ${"NAME".padEnd(nameW)} ROLE\n`);
63
+ for (const t of tenants) {
64
+ const marker = t.slug === active ? "*" : " ";
65
+ io.stdout.write(`${marker} ${t.slug.padEnd(slugW)} ${t.name.padEnd(nameW)} ${t.role}\n`);
66
+ }
67
+ return 0;
68
+ }
69
+ async function useCmd(slug, deps) {
70
+ const { io } = deps;
71
+ if (!slug || slug.length === 0) {
72
+ io.stderr.write("Usage: vskill orgs use <slug>\n");
73
+ return 2;
74
+ }
75
+ const keychain = deps.keychain ?? getDefaultKeychain();
76
+ if (!hasAnyToken(keychain)) {
77
+ io.stderr.write("Not logged in. Run `vskill auth login` before switching tenants.\n");
78
+ return 1;
79
+ }
80
+ let tenants;
81
+ try {
82
+ tenants = await (deps.listTenants ?? listTenants)();
83
+ }
84
+ catch (err) {
85
+ const e = err;
86
+ if (e.status === 401) {
87
+ io.stderr.write("Token rejected by the platform. Run `vskill auth login` to refresh.\n");
88
+ return 1;
89
+ }
90
+ io.stderr.write(`vskill orgs use: failed to validate tenant (${e.message ?? String(err)})\n`);
91
+ return 1;
92
+ }
93
+ const match = tenants.find((t) => t.slug === slug);
94
+ if (!match) {
95
+ io.stderr.write(`Unknown tenant: ${slug}\n`);
96
+ if (tenants.length > 0) {
97
+ io.stderr.write(`Available: ${tenants.map((t) => t.slug).join(", ")}\n`);
98
+ }
99
+ return 1;
100
+ }
101
+ try {
102
+ setActiveTenant(slug, deps.activeTenantOptions);
103
+ }
104
+ catch (err) {
105
+ io.stderr.write(`vskill orgs use: failed to write config (${err.message})\n`);
106
+ return 1;
107
+ }
108
+ io.stdout.write(`Active tenant set to ${slug} (${match.name}).\n`);
109
+ return 0;
110
+ }
111
+ function currentCmd(deps) {
112
+ const active = getActiveTenant(deps.activeTenantOptions);
113
+ if (active) {
114
+ deps.io.stdout.write(`${active}\n`);
115
+ }
116
+ else {
117
+ deps.io.stdout.write("(none)\n");
118
+ }
119
+ return 0;
120
+ }
121
+ function usage(io) {
122
+ io.stdout.write([
123
+ "Usage: vskill orgs <subcommand>",
124
+ "",
125
+ "Subcommands:",
126
+ " list List tenants you belong to (* marks active)",
127
+ " use <slug> Set the active tenant",
128
+ " current Print the active tenant slug, or (none)",
129
+ "",
130
+ ].join("\n"));
131
+ }
132
+ export async function orgsCommand(argv, deps) {
133
+ const sub = argv[0];
134
+ let exit = 0;
135
+ switch (sub) {
136
+ case "list":
137
+ case "ls":
138
+ exit = await listCmd(deps);
139
+ break;
140
+ case "use":
141
+ case "switch":
142
+ exit = await useCmd(argv[1], deps);
143
+ break;
144
+ case "current":
145
+ case "whoami-tenant":
146
+ exit = currentCmd(deps);
147
+ break;
148
+ case undefined:
149
+ case "--help":
150
+ case "-h":
151
+ usage(deps.io);
152
+ exit = sub ? 0 : 1;
153
+ break;
154
+ default:
155
+ deps.io.stderr.write(`unknown subcommand: ${sub}\n`);
156
+ usage(deps.io);
157
+ exit = 1;
158
+ break;
159
+ }
160
+ if (deps.io.exit)
161
+ deps.io.exit(exit);
162
+ return exit;
163
+ }
164
+ //# sourceMappingURL=orgs.js.map