vskill 1.0.18 → 1.0.20

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 (98) hide show
  1. package/README.md +1 -1
  2. package/agents.json +1 -1
  3. package/dist/commands/auth.js +31 -1
  4. package/dist/commands/auth.js.map +1 -1
  5. package/dist/eval-server/active-root-store.d.ts +19 -0
  6. package/dist/eval-server/active-root-store.js +50 -0
  7. package/dist/eval-server/active-root-store.js.map +1 -0
  8. package/dist/eval-server/api-routes.d.ts +1 -1
  9. package/dist/eval-server/api-routes.js +43 -5
  10. package/dist/eval-server/api-routes.js.map +1 -1
  11. package/dist/eval-server/authoring-routes.d.ts +1 -1
  12. package/dist/eval-server/authoring-routes.js +9 -7
  13. package/dist/eval-server/authoring-routes.js.map +1 -1
  14. package/dist/eval-server/detect-engines-route.d.ts +1 -1
  15. package/dist/eval-server/detect-engines-route.js +3 -1
  16. package/dist/eval-server/detect-engines-route.js.map +1 -1
  17. package/dist/eval-server/eval-server.js +26 -24
  18. package/dist/eval-server/eval-server.js.map +1 -1
  19. package/dist/eval-server/git-routes.d.ts +6 -6
  20. package/dist/eval-server/git-routes.js +22 -11
  21. package/dist/eval-server/git-routes.js.map +1 -1
  22. package/dist/eval-server/improve-routes.d.ts +1 -1
  23. package/dist/eval-server/improve-routes.js +4 -1
  24. package/dist/eval-server/improve-routes.js.map +1 -1
  25. package/dist/eval-server/install-engine-routes.d.ts +1 -1
  26. package/dist/eval-server/install-engine-routes.js +1 -1
  27. package/dist/eval-server/install-engine-routes.js.map +1 -1
  28. package/dist/eval-server/install-skill-routes.d.ts +1 -1
  29. package/dist/eval-server/install-skill-routes.js +3 -1
  30. package/dist/eval-server/install-skill-routes.js.map +1 -1
  31. package/dist/eval-server/install-state-routes.d.ts +1 -1
  32. package/dist/eval-server/install-state-routes.js +3 -1
  33. package/dist/eval-server/install-state-routes.js.map +1 -1
  34. package/dist/eval-server/integration-routes.d.ts +1 -1
  35. package/dist/eval-server/integration-routes.js +6 -1
  36. package/dist/eval-server/integration-routes.js.map +1 -1
  37. package/dist/eval-server/model-compare-routes.d.ts +1 -1
  38. package/dist/eval-server/model-compare-routes.js +3 -1
  39. package/dist/eval-server/model-compare-routes.js.map +1 -1
  40. package/dist/eval-server/platform-proxy.d.ts +6 -1
  41. package/dist/eval-server/platform-proxy.js +60 -11
  42. package/dist/eval-server/platform-proxy.js.map +1 -1
  43. package/dist/eval-server/plugin-cli-routes.d.ts +1 -1
  44. package/dist/eval-server/plugin-cli-routes.js +10 -1
  45. package/dist/eval-server/plugin-cli-routes.js.map +1 -1
  46. package/dist/eval-server/remove-skill-routes.d.ts +1 -1
  47. package/dist/eval-server/remove-skill-routes.js +3 -1
  48. package/dist/eval-server/remove-skill-routes.js.map +1 -1
  49. package/dist/eval-server/skill-create-routes.d.ts +1 -1
  50. package/dist/eval-server/skill-create-routes.js +8 -1
  51. package/dist/eval-server/skill-create-routes.js.map +1 -1
  52. package/dist/eval-server/sweep-routes.d.ts +1 -1
  53. package/dist/eval-server/sweep-routes.js +5 -1
  54. package/dist/eval-server/sweep-routes.js.map +1 -1
  55. package/dist/eval-server/workspace-routes.d.ts +12 -0
  56. package/dist/eval-server/workspace-routes.js +57 -2
  57. package/dist/eval-server/workspace-routes.js.map +1 -1
  58. package/dist/eval-ui/assets/{AdvancedTab-D8zbE5fH.js → AdvancedTab-DOgbx7u0.js} +1 -1
  59. package/dist/eval-ui/assets/{CreateSkillPage-DOBhKdgr.js → CreateSkillPage-gG-MYioa.js} +1 -1
  60. package/dist/eval-ui/assets/{FindSkillsPalette-CyMmNPr-.js → FindSkillsPalette-DgVp_buC.js} +2 -2
  61. package/dist/eval-ui/assets/{GeneralTab-DYR9NWC4.js → GeneralTab-AwK9sIkP.js} +1 -1
  62. package/dist/eval-ui/assets/{PrivacyTab-CXIqQokl.js → PrivacyTab-BtNrxpVV.js} +1 -1
  63. package/dist/eval-ui/assets/{SearchPaletteCore-Dn5gQJS_.js → SearchPaletteCore-D2gKxOTT.js} +1 -1
  64. package/dist/eval-ui/assets/{SkillDetailPanel-DTrRnyyJ.js → SkillDetailPanel-Ioc5XaDA.js} +1 -1
  65. package/dist/eval-ui/assets/{UpdateDropdown-Cvr2fe0z.js → UpdateDropdown-B9rCyfnR.js} +1 -1
  66. package/dist/eval-ui/assets/{UpdatesTab-DwJIUDPX.js → UpdatesTab-DTmo-vVb.js} +1 -1
  67. package/dist/eval-ui/assets/core-DZjBCfjp.js +1 -0
  68. package/dist/eval-ui/assets/{event-CDYWU2X3.js → event-QtOCMXAv.js} +1 -1
  69. package/dist/eval-ui/assets/globals-Dpf9KmYH.css +1 -0
  70. package/dist/eval-ui/assets/{index-D7M0Jdss.js → index-CUEYzTVL.js} +1 -1
  71. package/dist/eval-ui/assets/index-DDNzcrhv.js +1 -0
  72. package/dist/eval-ui/assets/index-DhhmQddr.js +1 -0
  73. package/dist/eval-ui/assets/{lifecycle-DSleOV-l.js → lifecycle-o_IRibOa.js} +1 -1
  74. package/dist/eval-ui/assets/main-sUAgJ9SV.js +87 -0
  75. package/dist/eval-ui/assets/{preferences-BKv6X7fK.js → preferences-DCdw0Kvu.js} +2 -2
  76. package/dist/eval-ui/assets/{useDesktopBridge-DxVWbYqK.js → useDesktopBridge-9oZFQsrw.js} +2 -2
  77. package/dist/eval-ui/index.html +4 -4
  78. package/dist/eval-ui/lifecycle.html +3 -3
  79. package/dist/eval-ui/preferences.html +4 -4
  80. package/dist/lib/keychain.js +20 -3
  81. package/dist/lib/keychain.js.map +1 -1
  82. package/dist/studio/routes/index.d.ts +1 -1
  83. package/dist/studio/routes/index.js +10 -9
  84. package/dist/studio/routes/index.js.map +1 -1
  85. package/dist/studio/routes/promote.d.ts +1 -1
  86. package/dist/studio/routes/promote.js +3 -1
  87. package/dist/studio/routes/promote.js.map +1 -1
  88. package/dist/studio/routes/revert.d.ts +1 -1
  89. package/dist/studio/routes/revert.js +3 -1
  90. package/dist/studio/routes/revert.js.map +1 -1
  91. package/dist/studio/routes/test-install.d.ts +1 -1
  92. package/dist/studio/routes/test-install.js +3 -1
  93. package/dist/studio/routes/test-install.js.map +1 -1
  94. package/package.json +2 -1
  95. package/dist/eval-ui/assets/core-DZAvsxlC.js +0 -1
  96. package/dist/eval-ui/assets/globals-C3oEdsJh.css +0 -1
  97. package/dist/eval-ui/assets/main-D2shn1dH.js +0 -87
  98. /package/dist/eval-ui/assets/{globals-BRZwPAPF.js → globals-hm1COkXX.js} +0 -0
package/README.md CHANGED
@@ -12,7 +12,7 @@
12
12
  <a href="https://github.com/anton-abyzov/vskill/actions/workflows/desktop-release.yml"><img src="https://img.shields.io/github/actions/workflow/status/anton-abyzov/vskill/desktop-release.yml?branch=main&label=desktop%20build&logo=githubactions" alt="desktop build" /></a>
13
13
  <img src="https://img.shields.io/badge/agents-54_platforms-0969DA" alt="54 agents" />
14
14
  <img src="https://img.shields.io/badge/plugins-9-8B5CF6" alt="9 plugins" />
15
- <img src="https://img.shields.io/badge/skills-16-10B981" alt="16 skills" />
15
+ <img src="https://img.shields.io/badge/skills-17-10B981" alt="17 skills" />
16
16
  <a href="https://verified-skill.com"><img src="https://img.shields.io/badge/registry-verified--skill.com-F59E0B" alt="registry" /></a>
17
17
  <a href="https://github.com/anton-abyzov/vskill/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-green" alt="MIT" /></a>
18
18
  </p>
package/agents.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 1,
3
- "generatedAt": "2026-05-31T02:13:32.450Z",
3
+ "generatedAt": "2026-06-02T13:48:25.738Z",
4
4
  "agentPrefixes": [
5
5
  ".adal",
6
6
  ".agent",
@@ -186,6 +186,10 @@ async function loginCmd(deps) {
186
186
  // 0839 F-004 — bust again so vsk_ replaces gho_ in the cache.
187
187
  if (deps.invalidateAuthCache)
188
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;
189
193
  }
190
194
  else {
191
195
  io.stdout.write(`\nLogged in as @${login} (legacy mode — exchange returned no token).\n`);
@@ -239,14 +243,40 @@ async function statusCmd(args, deps) {
239
243
  return 1;
240
244
  }
241
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;
242
251
  if (json) {
243
- 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");
244
258
  }
245
259
  else {
246
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
+ }
247
267
  }
248
268
  return 0;
249
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
+ }
250
280
  async function logoutCmd(deps) {
251
281
  const { io } = deps;
252
282
  const keychain = deps.keychain ?? getDefaultKeychain();
@@ -1 +1 @@
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;YAC3D,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,IAAI,IAAI,EAAE,CAAC;QACT,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACvF,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,CAAC,CAAC;AACX,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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export interface ActiveRootStore {
2
+ /** The scan root all route handlers should use, resolved per request. */
3
+ getRoot(): string;
4
+ /** Replace the active scan root (e.g. after a project switch). */
5
+ setRoot(root: string): void;
6
+ /**
7
+ * Re-derive the active root from `~/.vskill/workspace.json`'s active project.
8
+ * Updates the store and returns the new value; if no active project resolves,
9
+ * the current root is kept and returned.
10
+ */
11
+ reload(workspaceDir: string): string;
12
+ }
13
+ /**
14
+ * Resolve the active project's path from the workspace registry. Returns null
15
+ * when there is no workspace, no active project, or the active id is dangling.
16
+ * Shared by both boot resolution (eval-server) and runtime reloads (this store).
17
+ */
18
+ export declare function resolveActiveRoot(workspaceDir: string): string | null;
19
+ export declare function createActiveRootStore(initialRoot: string): ActiveRootStore;
@@ -0,0 +1,50 @@
1
+ // ---------------------------------------------------------------------------
2
+ // 0863 T-001: ActiveRootStore — runtime-mutable scan root.
3
+ //
4
+ // Before 0863, the eval-server resolved the scan root ONCE at boot and froze
5
+ // it into every route handler's closure, so switching the active project from
6
+ // the UI (POST /api/workspace/active) changed ~/.vskill/workspace.json but the
7
+ // running server kept serving the original folder's skills.
8
+ //
9
+ // This store holds the current scan root in memory and lets handlers read it
10
+ // per-request via `getRoot()`. `POST /api/workspace/active` calls `setRoot()`
11
+ // after persisting, so the next `GET /api/skills` scans the new folder — no
12
+ // process restart, no port change, no studio-token re-mint. The same code path
13
+ // works in `npx vskill studio` (single process) and the desktop Tauri sidecar.
14
+ // ---------------------------------------------------------------------------
15
+ import { loadWorkspace } from "./workspace-store.js";
16
+ /**
17
+ * Resolve the active project's path from the workspace registry. Returns null
18
+ * when there is no workspace, no active project, or the active id is dangling.
19
+ * Shared by both boot resolution (eval-server) and runtime reloads (this store).
20
+ */
21
+ export function resolveActiveRoot(workspaceDir) {
22
+ try {
23
+ const ws = loadWorkspace(workspaceDir);
24
+ if (!ws.activeProjectId)
25
+ return null;
26
+ const active = ws.projects.find((p) => p.id === ws.activeProjectId);
27
+ return active ? active.path : null;
28
+ }
29
+ catch {
30
+ return null;
31
+ }
32
+ }
33
+ export function createActiveRootStore(initialRoot) {
34
+ let current = initialRoot;
35
+ return {
36
+ getRoot() {
37
+ return current;
38
+ },
39
+ setRoot(root) {
40
+ current = root;
41
+ },
42
+ reload(workspaceDir) {
43
+ const resolved = resolveActiveRoot(workspaceDir);
44
+ if (resolved)
45
+ current = resolved;
46
+ return current;
47
+ },
48
+ };
49
+ }
50
+ //# sourceMappingURL=active-root-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"active-root-store.js","sourceRoot":"","sources":["../../src/eval-server/active-root-store.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,2DAA2D;AAC3D,EAAE;AACF,6EAA6E;AAC7E,8EAA8E;AAC9E,+EAA+E;AAC/E,4DAA4D;AAC5D,EAAE;AACF,6EAA6E;AAC7E,8EAA8E;AAC9E,4EAA4E;AAC5E,+EAA+E;AAC/E,+EAA+E;AAC/E,8EAA8E;AAE9E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAerD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,YAAoB;IACpD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;QACvC,IAAI,CAAC,EAAE,CAAC,eAAe;YAAE,OAAO,IAAI,CAAC;QACrC,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,eAAe,CAAC,CAAC;QACpE,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,WAAmB;IACvD,IAAI,OAAO,GAAG,WAAW,CAAC;IAC1B,OAAO;QACL,OAAO;YACL,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,CAAC,IAAY;YAClB,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QACD,MAAM,CAAC,YAAoB;YACzB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;YACjD,IAAI,QAAQ;gBAAE,OAAO,GAAG,QAAQ,CAAC;YACjC,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -214,4 +214,4 @@ export declare function detectAvailableProviders(): Promise<Array<{
214
214
  models: ModelOption[];
215
215
  resolvedModel?: string | null;
216
216
  }>>;
217
- export declare function registerRoutes(router: Router, root: string, projectName?: string): void;
217
+ export declare function registerRoutes(router: Router, rootArg: string | (() => string), projectName?: string): void;
@@ -1154,7 +1154,8 @@ export async function detectAvailableProviders() {
1154
1154
  });
1155
1155
  return providers;
1156
1156
  }
1157
- export function registerRoutes(router, root, projectName) {
1157
+ export function registerRoutes(router, rootArg, projectName) {
1158
+ const getRoot = typeof rootArg === "function" ? rootArg : () => rootArg;
1158
1159
  // Health check
1159
1160
  router.get("/api/health", (_req, res) => {
1160
1161
  sendJson(res, { ok: true });
@@ -1173,6 +1174,7 @@ export function registerRoutes(router, root, projectName) {
1173
1174
  // shared-folder grouping. 30s detection cache (mirrors Ollama/LM Studio
1174
1175
  // probe pattern from 0677).
1175
1176
  router.get("/api/agents", async (req, res) => {
1177
+ const root = getRoot();
1176
1178
  try {
1177
1179
  const detected = await detectInstalledAgents();
1178
1180
  const detectedBinaries = new Set(detected.map((a) => a.id));
@@ -1373,6 +1375,7 @@ export function registerRoutes(router, root, projectName) {
1373
1375
  // (e.g. "claude-sonnet"). The frontend round-trips config.model back to
1374
1376
  // generate-evals and other endpoints, so it must be a valid CLI model ID.
1375
1377
  router.get("/api/config", async (_req, res) => {
1378
+ const root = getRoot();
1376
1379
  // 0682 F-001 — Boot-time restoration of .vskill/studio.json selection.
1377
1380
  // Use a dedicated `studioLoaded` flag rather than checking
1378
1381
  // `!currentOverrides.provider` because the module default
@@ -1442,6 +1445,7 @@ export function registerRoutes(router, root, projectName) {
1442
1445
  });
1443
1446
  // Update config — change provider/model at runtime and persist atomically.
1444
1447
  router.post("/api/config", async (req, res) => {
1448
+ const root = getRoot();
1445
1449
  const body = (await readBody(req));
1446
1450
  // 0682 F-001 (review iter 3): validate the incoming provider against the
1447
1451
  // ProviderName union BEFORE mutating currentOverrides. Pre-fix, an
@@ -1503,6 +1507,7 @@ export function registerRoutes(router, root, projectName) {
1503
1507
  // unknown/missing fields default to `null` (not undefined) so the shape
1504
1508
  // remains JSON-stable for all consumers.
1505
1509
  router.get("/api/skills", async (req, res) => {
1510
+ const root = getRoot();
1506
1511
  // 0686: ?scope=own|installed|global and ?agent=<id> query params.
1507
1512
  // When either is present, switch to tri-scope scanning so the response
1508
1513
  // carries the new `scope`/`isSymlink`/`symlinkTarget`/`installMethod`/
@@ -1657,6 +1662,7 @@ export function registerRoutes(router, root, projectName) {
1657
1662
  }
1658
1663
  });
1659
1664
  router.get("/api/skills/updates", async (req, res) => {
1665
+ const root = getRoot();
1660
1666
  try {
1661
1667
  const { getOutdatedJson } = await import("../commands/outdated.js");
1662
1668
  const { scanSkillInstallLocations } = await import("./utils/scan-install-locations.js");
@@ -1714,7 +1720,7 @@ export function registerRoutes(router, root, projectName) {
1714
1720
  * git remote parse for skills authored in this repo. See skill-name-resolver.ts.
1715
1721
  */
1716
1722
  function resolveSkillApiName(skill, plugin = null) {
1717
- return resolveSkillApiNameImpl(skill, root, plugin);
1723
+ return resolveSkillApiNameImpl(skill, getRoot(), plugin);
1718
1724
  }
1719
1725
  // T-009 (proxy) + 0707 T-021 (harden): Versions endpoint
1720
1726
  //
@@ -1733,7 +1739,7 @@ export function registerRoutes(router, root, projectName) {
1733
1739
  // Returns `{ apiPathRoot, origin }` — callers append `/versions` or
1734
1740
  // `/versions/diff` as needed.
1735
1741
  async function buildSkillApiPath(skill, plugin) {
1736
- const origin = await resolveSkillOrigin(skill, plugin, root);
1742
+ const origin = await resolveSkillOrigin(skill, plugin, getRoot());
1737
1743
  if (origin.owner && origin.repo) {
1738
1744
  return {
1739
1745
  apiPathRoot: `/api/v1/skills/${encodeURIComponent(origin.owner)}/${encodeURIComponent(origin.repo)}/${encodeURIComponent(skill)}`,
@@ -1750,6 +1756,7 @@ export function registerRoutes(router, root, projectName) {
1750
1756
  return { apiPathRoot, origin };
1751
1757
  }
1752
1758
  router.get("/api/skills/:plugin/:skill/versions", async (req, res, params) => {
1759
+ const root = getRoot();
1753
1760
  // 0823: comprehensive origin resolver via shared buildSkillApiPath.
1754
1761
  const { apiPathRoot, origin } = await buildSkillApiPath(params.skill, params.plugin);
1755
1762
  const apiPath = `${apiPathRoot}/versions`;
@@ -1912,6 +1919,7 @@ export function registerRoutes(router, root, projectName) {
1912
1919
  //
1913
1920
  // Idempotent + side-effect free on disk.
1914
1921
  router.post("/api/v1/skills/:id/rescan", async (req, res, params) => {
1922
+ const root = getRoot();
1915
1923
  const rawId = String(params.id ?? "");
1916
1924
  const decoded = (() => {
1917
1925
  try {
@@ -1998,6 +2006,7 @@ export function registerRoutes(router, root, projectName) {
1998
2006
  sendJson(res, { jobId }, 200, req);
1999
2007
  });
2000
2008
  router.post("/api/skills/:plugin/:skill/update", async (req, res, params) => {
2009
+ const root = getRoot();
2001
2010
  initSSE(res, req);
2002
2011
  const skillName = params.skill;
2003
2012
  // 0747 grill F-002: reject before doing anything so a malformed slug
@@ -2077,6 +2086,7 @@ export function registerRoutes(router, root, projectName) {
2077
2086
  // T-012: Batch update SSE + 409 conflict guard
2078
2087
  let batchUpdateInProgress = false;
2079
2088
  router.post("/api/skills/batch-update", async (req, res) => {
2089
+ const root = getRoot();
2080
2090
  if (batchUpdateInProgress) {
2081
2091
  sendJson(res, { error: "Update already in progress" }, 409, req);
2082
2092
  return;
@@ -2145,7 +2155,7 @@ export function registerRoutes(router, root, projectName) {
2145
2155
  const skillFsAllowedRoots = () => {
2146
2156
  const home = homedir();
2147
2157
  return [
2148
- root,
2158
+ getRoot(),
2149
2159
  join(home, ".claude/plugins/cache"),
2150
2160
  join(home, ".claude/plugins/marketplaces"),
2151
2161
  join(home, ".claude/skills"),
@@ -2162,7 +2172,7 @@ export function registerRoutes(router, root, projectName) {
2162
2172
  // path via setSkillDirEntry inside ensurePluginCacheEntry.
2163
2173
  const resolveSkillDirForFsRoute = async (plugin, skill) => {
2164
2174
  await ensurePluginCacheEntry(plugin, skill);
2165
- return resolveAllowedSkillDir(root, plugin, skill, skillFsAllowedRoots());
2175
+ return resolveAllowedSkillDir(getRoot(), plugin, skill, skillFsAllowedRoots());
2166
2176
  };
2167
2177
  // Get skill detail
2168
2178
  router.get("/api/skills/:plugin/:skill", async (req, res, params) => {
@@ -2348,6 +2358,7 @@ export function registerRoutes(router, root, projectName) {
2348
2358
  });
2349
2359
  // Save (create/overwrite) a file inside a skill directory
2350
2360
  router.put("/api/skills/:plugin/:skill/file", async (req, res, params) => {
2361
+ const root = getRoot();
2351
2362
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
2352
2363
  if (!resolve(skillDir).startsWith(resolve(root))) {
2353
2364
  sendJson(res, { error: "Invalid skill path" }, 400, req);
@@ -2377,6 +2388,7 @@ export function registerRoutes(router, root, projectName) {
2377
2388
  });
2378
2389
  // Delete a source skill (recursively removes its directory)
2379
2390
  router.delete("/api/skills/:plugin/:skill", async (req, res, params) => {
2391
+ const root = getRoot();
2380
2392
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
2381
2393
  // Path containment guard — prevent path traversal via ".." in params
2382
2394
  if (!resolve(skillDir).startsWith(resolve(root))) {
@@ -2417,6 +2429,7 @@ export function registerRoutes(router, root, projectName) {
2417
2429
  // this route is the canonical uninstall path for lockfile-tracked
2418
2430
  // installed skills.
2419
2431
  router.post("/api/skills/:plugin/:skill/uninstall", async (req, res, params) => {
2432
+ const root = getRoot();
2420
2433
  // Skill-name validation — same kebab-case regex used by skill-create
2421
2434
  // routes. Performed BEFORE any filesystem access to defang path-traversal
2422
2435
  // attempts (e.g. `../../etc/passwd`).
@@ -2505,6 +2518,7 @@ export function registerRoutes(router, root, projectName) {
2505
2518
  });
2506
2519
  // Get skill description (for activation testing preview)
2507
2520
  router.get("/api/skills/:plugin/:skill/description", async (req, res, params) => {
2521
+ const root = getRoot();
2508
2522
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
2509
2523
  const skillMdPath = join(skillDir, "SKILL.md");
2510
2524
  let skillContent = "";
@@ -2530,6 +2544,7 @@ export function registerRoutes(router, root, projectName) {
2530
2544
  // generic client errors — 422 Unprocessable Entity is the correct semantic
2531
2545
  // for well-formed requests whose payload fails validation.
2532
2546
  router.get("/api/skills/:plugin/:skill/evals", async (req, res, params) => {
2547
+ const root = getRoot();
2533
2548
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
2534
2549
  const evalsPath = join(skillDir, "evals", "evals.json");
2535
2550
  if (!existsSync(evalsPath)) {
@@ -2554,6 +2569,7 @@ export function registerRoutes(router, root, projectName) {
2554
2569
  });
2555
2570
  // Save evals.json
2556
2571
  router.put("/api/skills/:plugin/:skill/evals", async (req, res, params) => {
2572
+ const root = getRoot();
2557
2573
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
2558
2574
  const body = (await readBody(req));
2559
2575
  // Validate before writing
@@ -2571,6 +2587,7 @@ export function registerRoutes(router, root, projectName) {
2571
2587
  // Generate evals using AI — reads SKILL.md and returns generated EvalsFile
2572
2588
  // Accepts optional { provider, model, testType } in request body
2573
2589
  router.post("/api/skills/:plugin/:skill/generate-evals", async (req, res, params) => {
2590
+ const root = getRoot();
2574
2591
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
2575
2592
  const skillMdPath = join(skillDir, "SKILL.md");
2576
2593
  if (!existsSync(skillMdPath)) {
@@ -2680,6 +2697,7 @@ export function registerRoutes(router, root, projectName) {
2680
2697
  });
2681
2698
  // Run benchmark (SSE) — optionally accepts { eval_ids, concurrency, judgeModel, noCache }
2682
2699
  router.post("/api/skills/:plugin/:skill/benchmark", async (req, res, params) => {
2700
+ const root = getRoot();
2683
2701
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
2684
2702
  let aborted = false;
2685
2703
  res.on("close", () => { aborted = true; });
@@ -2731,6 +2749,7 @@ export function registerRoutes(router, root, projectName) {
2731
2749
  });
2732
2750
  // Run baseline (SSE) — same as benchmark but without skill content
2733
2751
  router.post("/api/skills/:plugin/:skill/baseline", async (req, res, params) => {
2752
+ const root = getRoot();
2734
2753
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
2735
2754
  let aborted = false;
2736
2755
  res.on("close", () => { aborted = true; });
@@ -2754,6 +2773,7 @@ export function registerRoutes(router, root, projectName) {
2754
2773
  });
2755
2774
  // Run single case (SSE) — per-case endpoint with semaphore
2756
2775
  router.post("/api/skills/:plugin/:skill/benchmark/case/:evalId", async (req, res, params) => {
2776
+ const root = getRoot();
2757
2777
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
2758
2778
  const evalId = parseInt(params.evalId, 10);
2759
2779
  if (isNaN(evalId)) {
@@ -2829,6 +2849,7 @@ export function registerRoutes(router, root, projectName) {
2829
2849
  });
2830
2850
  // Bulk save — client assembles result from per-case runs and saves as one history entry
2831
2851
  router.post("/api/skills/:plugin/:skill/benchmark/bulk-save", async (req, res, params) => {
2852
+ const root = getRoot();
2832
2853
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
2833
2854
  try {
2834
2855
  const body = await readBody(req);
@@ -2847,6 +2868,7 @@ export function registerRoutes(router, root, projectName) {
2847
2868
  });
2848
2869
  // Run comparison (SSE)
2849
2870
  router.post("/api/skills/:plugin/:skill/compare", async (req, res, params) => {
2871
+ const root = getRoot();
2850
2872
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
2851
2873
  let aborted = false;
2852
2874
  res.on("close", () => { aborted = true; });
@@ -3053,6 +3075,7 @@ export function registerRoutes(router, root, projectName) {
3053
3075
  });
3054
3076
  // List benchmark history (with optional filters)
3055
3077
  router.get("/api/skills/:plugin/:skill/history", async (req, res, params) => {
3078
+ const root = getRoot();
3056
3079
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
3057
3080
  const url = new URL(req.url, `http://localhost`);
3058
3081
  const filter = {};
@@ -3075,6 +3098,7 @@ export function registerRoutes(router, root, projectName) {
3075
3098
  });
3076
3099
  // Compare two history runs
3077
3100
  router.get("/api/skills/:plugin/:skill/history-compare", async (req, res, params) => {
3101
+ const root = getRoot();
3078
3102
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
3079
3103
  const url = new URL(req.url, `http://localhost`);
3080
3104
  const tsA = url.searchParams.get("a");
@@ -3138,6 +3162,7 @@ export function registerRoutes(router, root, projectName) {
3138
3162
  });
3139
3163
  // Per-case history
3140
3164
  router.get("/api/skills/:plugin/:skill/history/case/:evalId", async (req, res, params) => {
3165
+ const root = getRoot();
3141
3166
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
3142
3167
  const evalId = parseInt(params.evalId, 10);
3143
3168
  if (isNaN(evalId)) {
@@ -3151,6 +3176,7 @@ export function registerRoutes(router, root, projectName) {
3151
3176
  });
3152
3177
  // Get specific history entry
3153
3178
  router.get("/api/skills/:plugin/:skill/history/:timestamp", async (req, res, params) => {
3179
+ const root = getRoot();
3154
3180
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
3155
3181
  const entry = await readHistoryEntry(skillDir, params.timestamp);
3156
3182
  if (!entry) {
@@ -3161,6 +3187,7 @@ export function registerRoutes(router, root, projectName) {
3161
3187
  });
3162
3188
  // Delete history entry
3163
3189
  router.delete("/api/skills/:plugin/:skill/history/:timestamp", async (req, res, params) => {
3190
+ const root = getRoot();
3164
3191
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
3165
3192
  const deleted = await deleteHistoryEntry(skillDir, params.timestamp);
3166
3193
  if (!deleted) {
@@ -3171,6 +3198,7 @@ export function registerRoutes(router, root, projectName) {
3171
3198
  });
3172
3199
  // Get aggregated stats
3173
3200
  router.get("/api/skills/:plugin/:skill/stats", async (req, res, params) => {
3201
+ const root = getRoot();
3174
3202
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
3175
3203
  const stats = await computeStats(skillDir);
3176
3204
  sendJson(res, stats, 200, req);
@@ -3185,6 +3213,7 @@ export function registerRoutes(router, root, projectName) {
3185
3213
  // Works for any plugin slug (including dashes like `google-workspace`)
3186
3214
  // because routing uses `[^/]+` groups (see router.ts T-020).
3187
3215
  router.get("/api/skills/:plugin/:skill/benchmark/latest", async (req, res, params) => {
3216
+ const root = getRoot();
3188
3217
  // 0704: always 200; body null = no benchmark persisted yet.
3189
3218
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
3190
3219
  const benchmark = await readBenchmark(skillDir);
@@ -3192,6 +3221,7 @@ export function registerRoutes(router, root, projectName) {
3192
3221
  });
3193
3222
  // Run activation test (SSE)
3194
3223
  router.post("/api/skills/:plugin/:skill/activation-test", async (req, res, params) => {
3224
+ const root = getRoot();
3195
3225
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
3196
3226
  let aborted = false;
3197
3227
  res.on("close", () => { aborted = true; });
@@ -3262,6 +3292,7 @@ export function registerRoutes(router, root, projectName) {
3262
3292
  });
3263
3293
  // GET parsed `## Test Cases` block from SKILL.md (increment 0776)
3264
3294
  router.get("/api/skills/:plugin/:skill/test-cases", (req, res, params) => {
3295
+ const root = getRoot();
3265
3296
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
3266
3297
  const skillMdPath = join(skillDir, "SKILL.md");
3267
3298
  const content = existsSync(skillMdPath) ? readFileSync(skillMdPath, "utf-8") : "";
@@ -3272,6 +3303,7 @@ export function registerRoutes(router, root, projectName) {
3272
3303
  // Empty prompts array removes the section. Frontmatter and other body
3273
3304
  // sections are preserved verbatim.
3274
3305
  router.put("/api/skills/:plugin/:skill/test-cases", async (req, res, params) => {
3306
+ const root = getRoot();
3275
3307
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
3276
3308
  const skillMdPath = join(skillDir, "SKILL.md");
3277
3309
  const body = (await readBody(req));
@@ -3302,6 +3334,7 @@ export function registerRoutes(router, root, projectName) {
3302
3334
  });
3303
3335
  // AI-generate activation test prompts (SSE)
3304
3336
  router.post("/api/skills/:plugin/:skill/activation-prompts", async (req, res, params) => {
3337
+ const root = getRoot();
3305
3338
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
3306
3339
  let aborted = false;
3307
3340
  res.on("close", () => { aborted = true; });
@@ -3367,6 +3400,7 @@ Return ONLY the JSON lines, no other text.`;
3367
3400
  // 500 { error } only for unexpected I/O failures
3368
3401
  // (ENOENT is explicitly not one)
3369
3402
  router.get("/api/skills/:plugin/:skill/activation-history", async (req, res, params) => {
3403
+ const root = getRoot();
3370
3404
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
3371
3405
  try {
3372
3406
  const runs = await listActivationRuns(skillDir);
@@ -3385,6 +3419,7 @@ Return ONLY the JSON lines, no other text.`;
3385
3419
  });
3386
3420
  // Get full activation test run by ID
3387
3421
  router.get("/api/skills/:plugin/:skill/activation-history/:runId", async (req, res, params) => {
3422
+ const root = getRoot();
3388
3423
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
3389
3424
  const run = await getActivationRun(skillDir, params.runId);
3390
3425
  if (!run) {
@@ -3395,6 +3430,7 @@ Return ONLY the JSON lines, no other text.`;
3395
3430
  });
3396
3431
  // Get skill dependencies (MCP + skill-to-skill)
3397
3432
  router.get("/api/skills/:plugin/:skill/dependencies", async (req, res, params) => {
3433
+ const root = getRoot();
3398
3434
  const skillDir = resolveSkillDir(root, params.plugin, params.skill);
3399
3435
  const skillMdPath = join(skillDir, "SKILL.md");
3400
3436
  if (!existsSync(skillMdPath)) {
@@ -3412,6 +3448,7 @@ Return ONLY the JSON lines, no other text.`;
3412
3448
  // server-side via scanSkillInstallLocations and rejects any non-basename
3413
3449
  // `file`. Spawn is detached + unref'd so the response returns immediately.
3414
3450
  router.post("/api/skills/reveal-in-editor", async (req, res) => {
3451
+ const root = getRoot();
3415
3452
  let body;
3416
3453
  try {
3417
3454
  body = (await readBody(req));
@@ -3542,6 +3579,7 @@ Return ONLY the JSON lines, no other text.`;
3542
3579
  // 500 { error: "clone_failed", message: <stderr tail>, exitCode }
3543
3580
  // -------------------------------------------------------------------------
3544
3581
  router.post("/api/skills/clone", async (req, res) => {
3582
+ const root = getRoot();
3545
3583
  let body;
3546
3584
  try {
3547
3585
  body = (await readBody(req));