vskill 1.0.16 → 1.0.18

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 (206) hide show
  1. package/README.md +84 -9
  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/commands/add-lockfile.d.ts +6 -0
  10. package/dist/commands/add-lockfile.js +10 -0
  11. package/dist/commands/add-lockfile.js.map +1 -1
  12. package/dist/commands/add.d.ts +7 -0
  13. package/dist/commands/add.js +110 -2
  14. package/dist/commands/add.js.map +1 -1
  15. package/dist/commands/auth.d.ts +23 -0
  16. package/dist/commands/auth.js +105 -11
  17. package/dist/commands/auth.js.map +1 -1
  18. package/dist/commands/eval/serve.d.ts +2 -0
  19. package/dist/commands/eval/serve.js +126 -4
  20. package/dist/commands/eval/serve.js.map +1 -1
  21. package/dist/commands/orgs.d.ts +21 -0
  22. package/dist/commands/orgs.js +164 -0
  23. package/dist/commands/orgs.js.map +1 -0
  24. package/dist/commands/skill.js +14 -1
  25. package/dist/commands/skill.js.map +1 -1
  26. package/dist/commands/whoami.d.ts +29 -0
  27. package/dist/commands/whoami.js +119 -0
  28. package/dist/commands/whoami.js.map +1 -0
  29. package/dist/discovery/github-tree.d.ts +23 -3
  30. package/dist/discovery/github-tree.js +172 -24
  31. package/dist/discovery/github-tree.js.map +1 -1
  32. package/dist/eval/anthropic-catalog.js +32 -2
  33. package/dist/eval/anthropic-catalog.js.map +1 -1
  34. package/dist/eval/batch-judge.js +1 -0
  35. package/dist/eval/batch-judge.js.map +1 -1
  36. package/dist/eval/llm.d.ts +1 -1
  37. package/dist/eval/llm.js +104 -2
  38. package/dist/eval/llm.js.map +1 -1
  39. package/dist/eval-server/__tests__/helpers/studio-token-test-helpers.d.ts +2 -0
  40. package/dist/eval-server/__tests__/helpers/studio-token-test-helpers.js +20 -0
  41. package/dist/eval-server/__tests__/helpers/studio-token-test-helpers.js.map +1 -0
  42. package/dist/eval-server/active-tenant-routes.d.ts +15 -0
  43. package/dist/eval-server/active-tenant-routes.js +101 -0
  44. package/dist/eval-server/active-tenant-routes.js.map +1 -0
  45. package/dist/eval-server/api-routes.js +17 -2
  46. package/dist/eval-server/api-routes.js.map +1 -1
  47. package/dist/eval-server/desktop-open-routes.d.ts +8 -0
  48. package/dist/eval-server/desktop-open-routes.js +64 -0
  49. package/dist/eval-server/desktop-open-routes.js.map +1 -0
  50. package/dist/eval-server/eval-server.js +82 -5
  51. package/dist/eval-server/eval-server.js.map +1 -1
  52. package/dist/eval-server/export-skill-routes.d.ts +9 -0
  53. package/dist/eval-server/export-skill-routes.js +81 -0
  54. package/dist/eval-server/export-skill-routes.js.map +1 -0
  55. package/dist/eval-server/git-routes.d.ts +1 -0
  56. package/dist/eval-server/git-routes.js +101 -4
  57. package/dist/eval-server/git-routes.js.map +1 -1
  58. package/dist/eval-server/install-engine-routes.d.ts +3 -16
  59. package/dist/eval-server/install-engine-routes.js +9 -124
  60. package/dist/eval-server/install-engine-routes.js.map +1 -1
  61. package/dist/eval-server/install-jobs.d.ts +41 -0
  62. package/dist/eval-server/install-jobs.js +161 -0
  63. package/dist/eval-server/install-jobs.js.map +1 -0
  64. package/dist/eval-server/install-skill-routes.d.ts +74 -11
  65. package/dist/eval-server/install-skill-routes.js +506 -79
  66. package/dist/eval-server/install-skill-routes.js.map +1 -1
  67. package/dist/eval-server/install-state-routes.d.ts +4 -0
  68. package/dist/eval-server/install-state-routes.js +15 -1
  69. package/dist/eval-server/install-state-routes.js.map +1 -1
  70. package/dist/eval-server/oauth-github-routes.d.ts +2 -0
  71. package/dist/eval-server/oauth-github-routes.js +505 -0
  72. package/dist/eval-server/oauth-github-routes.js.map +1 -0
  73. package/dist/eval-server/platform-proxy.d.ts +17 -1
  74. package/dist/eval-server/platform-proxy.js +125 -13
  75. package/dist/eval-server/platform-proxy.js.map +1 -1
  76. package/dist/eval-server/plugin-cli-routes.js +9 -9
  77. package/dist/eval-server/plugin-cli-routes.js.map +1 -1
  78. package/dist/eval-server/remove-skill-routes.d.ts +18 -0
  79. package/dist/eval-server/remove-skill-routes.js +145 -0
  80. package/dist/eval-server/remove-skill-routes.js.map +1 -0
  81. package/dist/eval-server/router.d.ts +17 -3
  82. package/dist/eval-server/router.js +166 -9
  83. package/dist/eval-server/router.js.map +1 -1
  84. package/dist/eval-server/settings-store.js +1 -1
  85. package/dist/eval-server/settings-store.js.map +1 -1
  86. package/dist/eval-server/supported-agents-routes.d.ts +6 -0
  87. package/dist/eval-server/supported-agents-routes.js +41 -0
  88. package/dist/eval-server/supported-agents-routes.js.map +1 -0
  89. package/dist/eval-server/utils/spawn-env.d.ts +1 -0
  90. package/dist/eval-server/utils/spawn-env.js +47 -0
  91. package/dist/eval-server/utils/spawn-env.js.map +1 -0
  92. package/dist/eval-ui/assets/AdvancedTab-D8zbE5fH.js +1 -0
  93. package/dist/eval-ui/assets/{CreateSkillPage-CvdYq8Rr.js → CreateSkillPage-DOBhKdgr.js} +5 -5
  94. package/dist/eval-ui/assets/FindSkillsPalette-CyMmNPr-.js +2 -0
  95. package/dist/eval-ui/assets/GeneralTab-DYR9NWC4.js +1 -0
  96. package/dist/eval-ui/assets/PrivacyTab-CXIqQokl.js +1 -0
  97. package/dist/eval-ui/assets/{SearchPaletteCore-Bf3PBC64.js → SearchPaletteCore-Dn5gQJS_.js} +2 -2
  98. package/dist/eval-ui/assets/SkillDetailPanel-DTrRnyyJ.js +1 -0
  99. package/dist/eval-ui/assets/UpdateDropdown-Cvr2fe0z.js +1 -0
  100. package/dist/eval-ui/assets/UpdatesTab-DwJIUDPX.js +1 -0
  101. package/dist/eval-ui/assets/core-DZAvsxlC.js +1 -0
  102. package/dist/eval-ui/assets/event-CDYWU2X3.js +1 -0
  103. package/dist/eval-ui/assets/globals-BRZwPAPF.js +49 -0
  104. package/dist/eval-ui/assets/globals-C3oEdsJh.css +1 -0
  105. package/dist/eval-ui/assets/index-D7M0Jdss.js +1 -0
  106. package/dist/eval-ui/assets/lifecycle-DSleOV-l.js +1 -0
  107. package/dist/eval-ui/assets/lifecycle-d1Sm9Hts.css +1 -0
  108. package/dist/eval-ui/assets/main-D2shn1dH.js +87 -0
  109. package/dist/eval-ui/assets/preferences-BHZXB5dL.css +1 -0
  110. package/dist/eval-ui/assets/preferences-BKv6X7fK.js +2 -0
  111. package/dist/eval-ui/assets/useDesktopBridge-DxVWbYqK.js +2 -0
  112. package/dist/eval-ui/index.html +4 -2
  113. package/dist/eval-ui/lifecycle.html +33 -0
  114. package/dist/eval-ui/preferences.html +34 -0
  115. package/dist/index.js +47 -1
  116. package/dist/index.js.map +1 -1
  117. package/dist/installer/bundle-files.d.ts +4 -0
  118. package/dist/installer/bundle-files.js +97 -0
  119. package/dist/installer/bundle-files.js.map +1 -0
  120. package/dist/installer/canonical.d.ts +31 -6
  121. package/dist/installer/canonical.js +48 -12
  122. package/dist/installer/canonical.js.map +1 -1
  123. package/dist/installer/clipboard-export.d.ts +19 -0
  124. package/dist/installer/clipboard-export.js +88 -0
  125. package/dist/installer/clipboard-export.js.map +1 -0
  126. package/dist/installer/multi-install.d.ts +43 -0
  127. package/dist/installer/multi-install.js +237 -0
  128. package/dist/installer/multi-install.js.map +1 -0
  129. package/dist/installer/transformers/aider.d.ts +2 -0
  130. package/dist/installer/transformers/aider.js +32 -0
  131. package/dist/installer/transformers/aider.js.map +1 -0
  132. package/dist/installer/transformers/continue-dev.d.ts +2 -0
  133. package/dist/installer/transformers/continue-dev.js +6 -0
  134. package/dist/installer/transformers/continue-dev.js.map +1 -0
  135. package/dist/installer/transformers/cursor.d.ts +2 -0
  136. package/dist/installer/transformers/cursor.js +24 -0
  137. package/dist/installer/transformers/cursor.js.map +1 -0
  138. package/dist/installer/transformers/github-copilot.d.ts +2 -0
  139. package/dist/installer/transformers/github-copilot.js +17 -0
  140. package/dist/installer/transformers/github-copilot.js.map +1 -0
  141. package/dist/installer/transformers/index.d.ts +78 -0
  142. package/dist/installer/transformers/index.js +13 -0
  143. package/dist/installer/transformers/index.js.map +1 -0
  144. package/dist/installer/transformers/junie.d.ts +2 -0
  145. package/dist/installer/transformers/junie.js +6 -0
  146. package/dist/installer/transformers/junie.js.map +1 -0
  147. package/dist/installer/transformers/kiro.d.ts +2 -0
  148. package/dist/installer/transformers/kiro.js +6 -0
  149. package/dist/installer/transformers/kiro.js.map +1 -0
  150. package/dist/installer/transformers/trae.d.ts +2 -0
  151. package/dist/installer/transformers/trae.js +6 -0
  152. package/dist/installer/transformers/trae.js.map +1 -0
  153. package/dist/installer/transformers/windsurf.d.ts +2 -0
  154. package/dist/installer/transformers/windsurf.js +12 -0
  155. package/dist/installer/transformers/windsurf.js.map +1 -0
  156. package/dist/installer/yaml-safe-mutate.d.ts +19 -0
  157. package/dist/installer/yaml-safe-mutate.js +184 -0
  158. package/dist/installer/yaml-safe-mutate.js.map +1 -0
  159. package/dist/lib/active-tenant.d.ts +36 -0
  160. package/dist/lib/active-tenant.js +120 -0
  161. package/dist/lib/active-tenant.js.map +1 -0
  162. package/dist/lib/github-fetch.d.ts +1 -0
  163. package/dist/lib/github-fetch.js +11 -1
  164. package/dist/lib/github-fetch.js.map +1 -1
  165. package/dist/lib/keychain.d.ts +15 -2
  166. package/dist/lib/keychain.js +156 -8
  167. package/dist/lib/keychain.js.map +1 -1
  168. package/dist/lib/migration/keychain-migration.d.ts +35 -0
  169. package/dist/lib/migration/keychain-migration.js +189 -0
  170. package/dist/lib/migration/keychain-migration.js.map +1 -0
  171. package/dist/lib/tenant-resolver.d.ts +38 -0
  172. package/dist/lib/tenant-resolver.js +79 -0
  173. package/dist/lib/tenant-resolver.js.map +1 -0
  174. package/dist/lockfile/types.d.ts +8 -0
  175. package/dist/sidecar/eval-ui-manifest.json +1 -0
  176. package/dist/sidecar/sea-config.json +57 -0
  177. package/dist/sidecar/sea-prep.blob +0 -0
  178. package/dist/sidecar/server.cjs +141627 -0
  179. package/dist/sidecar/vskill-version.txt +1 -0
  180. package/dist/studio/lib/ops-log.js +140 -57
  181. package/dist/studio/lib/ops-log.js.map +1 -1
  182. package/dist/studio/lib/scope-transfer.d.ts +11 -1
  183. package/dist/studio/lib/scope-transfer.js +48 -24
  184. package/dist/studio/lib/scope-transfer.js.map +1 -1
  185. package/dist/studio/routes/index.js +10 -1
  186. package/dist/studio/routes/index.js.map +1 -1
  187. package/dist/studio/routes/ops.js +31 -7
  188. package/dist/studio/routes/ops.js.map +1 -1
  189. package/dist/studio/routes/promote.js +15 -8
  190. package/dist/studio/routes/promote.js.map +1 -1
  191. package/dist/studio/routes/revert.js +12 -1
  192. package/dist/studio/routes/revert.js.map +1 -1
  193. package/dist/studio/routes/test-install.js +13 -8
  194. package/dist/studio/routes/test-install.js.map +1 -1
  195. package/dist/studio-runtime/lockfile.d.ts +51 -0
  196. package/dist/studio-runtime/lockfile.js +216 -0
  197. package/dist/studio-runtime/lockfile.js.map +1 -0
  198. package/dist/updater/source-fetcher.js +2 -2
  199. package/dist/updater/source-fetcher.js.map +1 -1
  200. package/package.json +17 -1
  201. package/dist/eval-ui/assets/FindSkillsPalette-DsSgotS9.js +0 -2
  202. package/dist/eval-ui/assets/SkillDetailPanel-DAD2yJO-.js +0 -1
  203. package/dist/eval-ui/assets/UpdateDropdown-h5Hg3h7Z.js +0 -1
  204. package/dist/eval-ui/assets/index-CKLqBL52.css +0 -1
  205. package/dist/eval-ui/assets/index-JaDg6FlU.js +0 -124
  206. package/dist/eval-ui/assets/skill-studio-logo-CRyKgIrg.png +0 -0
@@ -16,7 +16,7 @@ import { getAvailablePlugins, getPluginSource, getPluginVersion, hasPlugin, disc
16
16
  import { checkInstallSafety } from "../blocklist/blocklist.js";
17
17
  import { getSkill, searchSkills } from "../api/client.js";
18
18
  import { checkPlatformSecurity } from "../security/index.js";
19
- import { discoverSkills, getDefaultBranch, checkRepoExists, warnRateLimitOnce } from "../discovery/github-tree.js";
19
+ import { discoverSkills, getDefaultBranch, getBranchHeadSha, checkRepoExists, warnRateLimitOnce } from "../discovery/github-tree.js";
20
20
  import { githubFetch } from "../lib/github-fetch.js";
21
21
  import { parseGitHubSource } from "../utils/validation.js";
22
22
  import { parseSkillsShUrl, isCompleteParsed, isIncompleteParsed, } from "../resolvers/url-resolver.js";
@@ -46,6 +46,12 @@ function isGitHubDownloadUrl(url) {
46
46
  return false;
47
47
  }
48
48
  }
49
+ function pluginNameFromSkillPath(path) {
50
+ if (!path)
51
+ return null;
52
+ const match = path.match(/^plugins\/([^/]+)\/skills\/[^/]+\/SKILL\.md$/);
53
+ return match?.[1] ?? null;
54
+ }
49
55
  async function parseManifestFromContentsApi(data) {
50
56
  // Prefer download_url for raw content — validate URL before fetching (SSRF prevention)
51
57
  if (data.download_url && isGitHubDownloadUrl(data.download_url)) {
@@ -1619,6 +1625,65 @@ async function installRepoPlugin(ownerRepo, pluginName, opts, overrideSource) {
1619
1625
  // Main entry point
1620
1626
  // ---------------------------------------------------------------------------
1621
1627
  export async function addCommand(source, opts) {
1628
+ // 0839 T-010 / ADR-002 / F-001 — apply explicit `--tenant` to the process
1629
+ // env so every downstream API call (apiRequest -> buildRequestHeaders)
1630
+ // sees it, then ALWAYS restore the prior value on exit. The flag wins
1631
+ // over VSKILL_TENANT and config.json by virtue of being applied last;
1632
+ // `invalidateAuthCache` is called so the read-once-per-process cache
1633
+ // refreshes against the new env value. Tenant resolution beyond the
1634
+ // flag (env > config > auto-pick) is handled at the API layer + by
1635
+ // error surfacing on the response side (401/402 below).
1636
+ //
1637
+ // The try/finally is critical: process.env mutation MUST NOT leak across
1638
+ // in-process re-invocations (test harness, future composite command,
1639
+ // install-all loop). The finally arm restores the prior value
1640
+ // (or `delete`s if no value existed) so the next caller sees a clean
1641
+ // env, exactly as documented in ADR-002 ("flag is per-call, env var is
1642
+ // for CI").
1643
+ const priorTenantEnv = process.env.VSKILL_TENANT;
1644
+ const priorTenantHadValue = "VSKILL_TENANT" in process.env;
1645
+ const tenantOverrideApplied = !!(opts.tenant && opts.tenant.length > 0);
1646
+ if (tenantOverrideApplied) {
1647
+ process.env.VSKILL_TENANT = opts.tenant;
1648
+ // The API client may have cached a previous (null) tenant on import.
1649
+ // Invalidate so the new override takes effect on the very next call.
1650
+ try {
1651
+ const mod = await import("../api/client.js");
1652
+ mod.invalidateAuthCache();
1653
+ }
1654
+ catch {
1655
+ /* non-fatal — fresh CLI run hasn't cached anything yet */
1656
+ }
1657
+ }
1658
+ try {
1659
+ return await addCommandInner(source, opts);
1660
+ }
1661
+ finally {
1662
+ // 0839 F-001 — always restore the prior process.env.VSKILL_TENANT so
1663
+ // `--tenant` does not leak. Run unconditionally so any path that
1664
+ // mutated env (whether explicitly via opts.tenant or via a nested
1665
+ // helper, present or future) is also cleaned up. Skip when nothing
1666
+ // changed to avoid cache thrash.
1667
+ if (tenantOverrideApplied) {
1668
+ if (priorTenantHadValue) {
1669
+ process.env.VSKILL_TENANT = priorTenantEnv;
1670
+ }
1671
+ else {
1672
+ delete process.env.VSKILL_TENANT;
1673
+ }
1674
+ // Invalidate the cache once more so any subsequent in-process call
1675
+ // re-reads the (now-restored) env state instead of the override.
1676
+ try {
1677
+ const mod = await import("../api/client.js");
1678
+ mod.invalidateAuthCache();
1679
+ }
1680
+ catch {
1681
+ /* non-fatal */
1682
+ }
1683
+ }
1684
+ }
1685
+ }
1686
+ async function addCommandInner(source, opts) {
1622
1687
  // Bulk repo mode: --repo with --all
1623
1688
  if (opts.repo && opts.all) {
1624
1689
  return installAllRepoPlugins(opts.repo, opts);
@@ -1806,6 +1871,8 @@ export async function addCommand(source, opts) {
1806
1871
  // `sourceSkillPath` are persisted alongside the legacy `source` string.
1807
1872
  const lockDir = lockfileRoot(opts);
1808
1873
  const lock = ensureLockfile(lockDir);
1874
+ const sourceBranch = await getDefaultBranch(owner, repo);
1875
+ const sourceCommitSha = await getBranchHeadSha(owner, repo, sourceBranch);
1809
1876
  for (const r of results) {
1810
1877
  if (r.installed && r.sha) {
1811
1878
  lock.skills[r.skillName] = buildGitHubInstallLockEntry({
@@ -1814,6 +1881,9 @@ export async function addCommand(source, opts) {
1814
1881
  owner,
1815
1882
  repo,
1816
1883
  sourceSkillPath: r.sourceSkillPath ?? null,
1884
+ branch: sourceBranch,
1885
+ commitSha: sourceCommitSha,
1886
+ pluginName: pluginNameFromSkillPath(r.sourceSkillPath),
1817
1887
  global: !!opts.global,
1818
1888
  });
1819
1889
  }
@@ -2002,8 +2072,42 @@ async function installFromRegistry(skillName, opts) {
2002
2072
  }
2003
2073
  }
2004
2074
  }
2005
- catch {
2075
+ catch (lookupErr) {
2006
2076
  spin.stop();
2077
+ // 0839 T-010 — surface auth + entitlement failures from the platform
2078
+ // (apiRequest annotates errors with .status and .parsedBody). These
2079
+ // are NOT "skill not found" misses; we must NOT swallow them into the
2080
+ // search-suggestion fallback.
2081
+ const e = lookupErr;
2082
+ if (e.status === 401) {
2083
+ // AC-US1-04 — anonymous or expired token. Do NOT clear the keychain
2084
+ // (only `auth logout` does that); the token may simply have expired
2085
+ // server-side, and the user should refresh, not lose their config.
2086
+ console.error(red(`Authentication required for "${skillName}".`) +
2087
+ "\n" +
2088
+ dim("Run `vskill auth login` to sign in."));
2089
+ process.exit(1);
2090
+ }
2091
+ if (e.status === 402) {
2092
+ // AC-US1-05 / AC-US2-04 — entitlement gate; the platform returns 402
2093
+ // with `{ upgradeUrl, message }` so the CLI can deep-link the user
2094
+ // straight to the right purchase page.
2095
+ const upgradeUrl = e.parsedBody?.upgradeUrl;
2096
+ const message = e.parsedBody?.message ?? "This skill requires a paid plan.";
2097
+ console.error(red(`${message}`));
2098
+ if (upgradeUrl) {
2099
+ console.error(dim(`Upgrade: ${cyan(upgradeUrl)}`));
2100
+ }
2101
+ process.exit(1);
2102
+ }
2103
+ if (e.status === 403) {
2104
+ // Membership/scope failure — different from 401. Print verbatim so
2105
+ // the platform's message reaches the user (e.g. "skill found in 2
2106
+ // tenants — pass --tenant <slug>").
2107
+ const msg = e.parsedBody?.message ?? e.message;
2108
+ console.error(red(msg));
2109
+ process.exit(1);
2110
+ }
2007
2111
  // Skill not in registry — check blocklist before showing generic "not found"
2008
2112
  const safety = await checkInstallSafety(skillName);
2009
2113
  if (safety.blocked) {
@@ -2209,6 +2313,7 @@ async function installSingleSkillLegacy(owner, repo, skill, opts, skillSubpathOv
2209
2313
  return process.exit(1);
2210
2314
  }
2211
2315
  const branch = await getDefaultBranch(owner, repo);
2316
+ const sourceCommitSha = await getBranchHeadSha(owner, repo, branch);
2212
2317
  const skillSubpath = skillSubpathOverride || (skill ? `skills/${skill}/SKILL.md` : "SKILL.md");
2213
2318
  const url = `https://raw.githubusercontent.com/${owner}/${repo}/${branch}/${skillSubpath}`;
2214
2319
  // Fetch SKILL.md
@@ -2350,6 +2455,9 @@ async function installSingleSkillLegacy(owner, repo, skill, opts, skillSubpathOv
2350
2455
  owner,
2351
2456
  repo,
2352
2457
  sourceSkillPath: skillSubpath,
2458
+ branch,
2459
+ commitSha: sourceCommitSha,
2460
+ pluginName: pluginNamespace ?? pluginNameFromSkillPath(skillSubpath),
2353
2461
  global: !!opts.global,
2354
2462
  });
2355
2463
  lock.agents = [...new Set([...(lock.agents || []), ...selectedAgents.map((a) => a.id)])];