tokentracker-cli 0.5.86 → 0.5.88

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 (36) hide show
  1. package/README.md +10 -1
  2. package/README.zh-CN.md +3 -1
  3. package/dashboard/dist/assets/{Card-D4LPt5pl.js → Card-Cwz-PEn8.js} +1 -1
  4. package/dashboard/dist/assets/DashboardPage-qwG6gudg.js +1 -0
  5. package/dashboard/dist/assets/FadeIn-CKfrd1Vn.js +1 -0
  6. package/dashboard/dist/assets/{IpCheckPage-BN6f0ZOs.js → IpCheckPage-D0qJYbXD.js} +1 -1
  7. package/dashboard/dist/assets/LeaderboardPage-Dkpcb_0Q.js +5 -0
  8. package/dashboard/dist/assets/LeaderboardProfilePage-DHxne8i3.js +1 -0
  9. package/dashboard/dist/assets/LimitsPage-Dvo_YUik.js +2 -0
  10. package/dashboard/dist/assets/PopoverPopup-CAeHe-sn.js +12 -0
  11. package/dashboard/dist/assets/{ProviderIcon-CTwz2lc9.js → ProviderIcon-Bz-JlVCc.js} +1 -1
  12. package/dashboard/dist/assets/SettingsPage-M4ONOKBT.js +1 -0
  13. package/dashboard/dist/assets/SkillsPage-QB4a2NKJ.js +1 -0
  14. package/dashboard/dist/assets/{WidgetsPage-C-VjXvcB.js → WidgetsPage-Dqd4z_tl.js} +1 -1
  15. package/dashboard/dist/assets/chevron-down-Bj2POypL.js +1 -0
  16. package/dashboard/dist/assets/{download-B8q-pUg6.js → download-1Kz0otkw.js} +1 -1
  17. package/dashboard/dist/assets/leaderboard-columns-DRc_1zw2.js +1 -0
  18. package/dashboard/dist/assets/main-PEflgXnj.css +1 -0
  19. package/dashboard/dist/assets/{main-Ry0vayW2.js → main-jua4nv-E.js} +237 -187
  20. package/dashboard/dist/assets/refresh-cw-Dpw9ponb.js +1 -0
  21. package/dashboard/dist/assets/{use-limits-display-prefs-mlXe4VuM.js → use-limits-display-prefs-CtpaNbnl.js} +1 -1
  22. package/dashboard/dist/assets/{use-usage-limits-CxmDpqkS.js → use-usage-limits-B0OYz2eA.js} +1 -1
  23. package/dashboard/dist/brand-logos/hermes.svg +11 -0
  24. package/dashboard/dist/index.html +2 -2
  25. package/dashboard/dist/share.html +2 -2
  26. package/package.json +1 -1
  27. package/src/lib/local-api.js +83 -0
  28. package/src/lib/skills-manager.js +739 -0
  29. package/dashboard/dist/assets/DashboardPage-B-2PxAXT.js +0 -12
  30. package/dashboard/dist/assets/FadeIn-Bw7pQont.js +0 -1
  31. package/dashboard/dist/assets/LeaderboardPage-DazS-BOp.js +0 -5
  32. package/dashboard/dist/assets/LeaderboardProfilePage-DQMr9vjY.js +0 -1
  33. package/dashboard/dist/assets/LimitsPage-BKaitxPe.js +0 -2
  34. package/dashboard/dist/assets/SettingsPage-CYpMYSR7.js +0 -1
  35. package/dashboard/dist/assets/leaderboard-columns-BUl7-rVO.js +0 -1
  36. package/dashboard/dist/assets/main-BP_tVIcC.css +0 -1
@@ -0,0 +1 @@
1
+ import{e}from"./main-jua4nv-E.js";const t=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],c=e("refresh-cw",t);export{c as R};
@@ -1 +1 @@
1
- import{r as a}from"./main-Ry0vayW2.js";const d=["claude","codex","cursor","gemini","kiro","copilot","antigravity"],v={claude:"Claude",codex:"Codex",cursor:"Cursor",gemini:"Gemini",kiro:"Kiro",copilot:"GitHub Copilot",antigravity:"Antigravity"},k={claude:"/brand-logos/claude-code.svg",codex:"/brand-logos/codex.svg",cursor:"/brand-logos/cursor.svg",gemini:"/brand-logos/gemini.svg",kiro:"/brand-logos/kiro.svg",copilot:"/brand-logos/copilot.svg",antigravity:"/brand-logos/antigravity.svg"},l="tt.limits.providerOrder",g="tt.limits.providerVisibility";function y(){if(typeof window>"u")return[...d];try{const r=window.localStorage.getItem(l);if(!r)return[...d];const s=JSON.parse(r);if(!Array.isArray(s))return[...d];const n=s.filter(c=>d.includes(c));for(const c of d)n.includes(c)||n.push(c);return n}catch{return[...d]}}function m(){const r=Object.fromEntries(d.map(s=>[s,!0]));if(typeof window>"u")return r;try{const s=window.localStorage.getItem(g);if(!s)return r;const n=JSON.parse(s);if(!n||typeof n!="object")return r;const c={...r};for(const u of d)typeof n[u]=="boolean"&&(c[u]=n[u]);return c}catch{return r}}function C(){const[r,s]=a.useState(y),[n,c]=a.useState(m);a.useEffect(()=>{if(!(typeof window>"u"))try{window.localStorage.setItem(l,JSON.stringify(r))}catch{}},[r]),a.useEffect(()=>{if(!(typeof window>"u"))try{window.localStorage.setItem(g,JSON.stringify(n))}catch{}},[n]),a.useEffect(()=>{if(typeof window>"u")return;const o=t=>{t.key===l&&s(y()),t.key===g&&c(m())};return window.addEventListener("storage",o),()=>window.removeEventListener("storage",o)},[]);const u=a.useCallback(o=>{c(t=>({...t,[o]:!t[o]}))},[]),b=a.useCallback(o=>{s(t=>{const e=t.indexOf(o);if(e<=0)return t;const i=[...t];return[i[e-1],i[e]]=[i[e],i[e-1]],i})},[]),p=a.useCallback(o=>{s(t=>{const e=t.indexOf(o);if(e<0||e>=t.length-1)return t;const i=[...t];return[i[e],i[e+1]]=[i[e+1],i[e]],i})},[]),O=a.useCallback((o,t)=>{o!==t&&s(e=>{const i=e.indexOf(o),w=e.indexOf(t);if(i<0||w<0)return e;const f=[...e],[E]=f.splice(i,1);return f.splice(w,0,E),f})},[]),x=a.useCallback(()=>{s([...d]),c(Object.fromEntries(d.map(o=>[o,!0])))},[]),I=a.useMemo(()=>r.filter(o=>n[o]!==!1),[r,n]);return{order:r,visibility:n,visibleOrdered:I,toggle:u,moveUp:b,moveDown:p,moveToward:O,reset:x}}export{k as L,v as a,C as u};
1
+ import{r as a}from"./main-jua4nv-E.js";const d=["claude","codex","cursor","gemini","kiro","copilot","antigravity"],v={claude:"Claude",codex:"Codex",cursor:"Cursor",gemini:"Gemini",kiro:"Kiro",copilot:"GitHub Copilot",antigravity:"Antigravity"},k={claude:"/brand-logos/claude-code.svg",codex:"/brand-logos/codex.svg",cursor:"/brand-logos/cursor.svg",gemini:"/brand-logos/gemini.svg",kiro:"/brand-logos/kiro.svg",copilot:"/brand-logos/copilot.svg",antigravity:"/brand-logos/antigravity.svg"},l="tt.limits.providerOrder",g="tt.limits.providerVisibility";function y(){if(typeof window>"u")return[...d];try{const r=window.localStorage.getItem(l);if(!r)return[...d];const s=JSON.parse(r);if(!Array.isArray(s))return[...d];const n=s.filter(c=>d.includes(c));for(const c of d)n.includes(c)||n.push(c);return n}catch{return[...d]}}function m(){const r=Object.fromEntries(d.map(s=>[s,!0]));if(typeof window>"u")return r;try{const s=window.localStorage.getItem(g);if(!s)return r;const n=JSON.parse(s);if(!n||typeof n!="object")return r;const c={...r};for(const u of d)typeof n[u]=="boolean"&&(c[u]=n[u]);return c}catch{return r}}function C(){const[r,s]=a.useState(y),[n,c]=a.useState(m);a.useEffect(()=>{if(!(typeof window>"u"))try{window.localStorage.setItem(l,JSON.stringify(r))}catch{}},[r]),a.useEffect(()=>{if(!(typeof window>"u"))try{window.localStorage.setItem(g,JSON.stringify(n))}catch{}},[n]),a.useEffect(()=>{if(typeof window>"u")return;const o=t=>{t.key===l&&s(y()),t.key===g&&c(m())};return window.addEventListener("storage",o),()=>window.removeEventListener("storage",o)},[]);const u=a.useCallback(o=>{c(t=>({...t,[o]:!t[o]}))},[]),b=a.useCallback(o=>{s(t=>{const e=t.indexOf(o);if(e<=0)return t;const i=[...t];return[i[e-1],i[e]]=[i[e],i[e-1]],i})},[]),p=a.useCallback(o=>{s(t=>{const e=t.indexOf(o);if(e<0||e>=t.length-1)return t;const i=[...t];return[i[e],i[e+1]]=[i[e+1],i[e]],i})},[]),O=a.useCallback((o,t)=>{o!==t&&s(e=>{const i=e.indexOf(o),w=e.indexOf(t);if(i<0||w<0)return e;const f=[...e],[E]=f.splice(i,1);return f.splice(w,0,E),f})},[]),x=a.useCallback(()=>{s([...d]),c(Object.fromEntries(d.map(o=>[o,!0])))},[]),I=a.useMemo(()=>r.filter(o=>n[o]!==!1),[r,n]);return{order:r,visibility:n,visibleOrdered:I,toggle:u,moveUp:b,moveDown:p,moveToward:O,reset:x}}export{k as L,v as a,C as u};
@@ -1 +1 @@
1
- import{r,aN as l}from"./main-Ry0vayW2.js";function y(i){const[o,a]=r.useState(null),[u,s]=r.useState(null),[c,f]=r.useState(!0),n=!!i?.initialRefresh,g=r.useCallback(async()=>{try{const e=await l({refresh:!0});a(e&&typeof e=="object"?e:null),s(null)}catch(e){s(e?.message||String(e))}},[]);return r.useEffect(()=>{let e=!1;return(async()=>{try{const t=await l(n?{refresh:!0}:{});if(e)return;a(t&&typeof t=="object"?t:null),s(null)}catch(t){if(e)return;s(t?.message||String(t))}finally{e||f(!1)}})(),()=>{e=!0}},[n]),{data:o,error:u,isLoading:c,refresh:g}}export{y as u};
1
+ import{r,ak as l}from"./main-jua4nv-E.js";function y(i){const[o,a]=r.useState(null),[u,s]=r.useState(null),[c,f]=r.useState(!0),n=!!i?.initialRefresh,g=r.useCallback(async()=>{try{const e=await l({refresh:!0});a(e&&typeof e=="object"?e:null),s(null)}catch(e){s(e?.message||String(e))}},[]);return r.useEffect(()=>{let e=!1;return(async()=>{try{const t=await l(n?{refresh:!0}:{});if(e)return;a(t&&typeof t=="object"?t:null),s(null)}catch(t){if(e)return;s(t?.message||String(t))}finally{e||f(!1)}})(),()=>{e=!0}},[n]),{data:o,error:u,isLoading:c,refresh:g}}export{y as u};
@@ -0,0 +1,11 @@
1
+ <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
2
+ <defs>
3
+ <linearGradient id="hermes-a" x1="3" x2="21" y1="3" y2="21" gradientUnits="userSpaceOnUse">
4
+ <stop stop-color="#A855F7"/>
5
+ <stop offset=".48" stop-color="#6366F1"/>
6
+ <stop offset="1" stop-color="#06B6D4"/>
7
+ </linearGradient>
8
+ </defs>
9
+ <rect width="20" height="20" x="2" y="2" rx="5" fill="url(#hermes-a)"/>
10
+ <path fill="#fff" d="M7 6.5h2.35v4.1h5.3V6.5H17v11h-2.35v-4.55h-5.3v4.55H7z"/>
11
+ </svg>
@@ -135,8 +135,8 @@
135
135
  ]
136
136
  }
137
137
  </script>
138
- <script type="module" crossorigin src="/assets/main-Ry0vayW2.js"></script>
139
- <link rel="stylesheet" crossorigin href="/assets/main-BP_tVIcC.css">
138
+ <script type="module" crossorigin src="/assets/main-jua4nv-E.js"></script>
139
+ <link rel="stylesheet" crossorigin href="/assets/main-PEflgXnj.css">
140
140
  </head>
141
141
  <body>
142
142
  <main class="aeo-seed-content" aria-label="Token Tracker AI-readable summary">
@@ -51,8 +51,8 @@
51
51
  "description": "Shareable Token Tracker dashboard snapshot."
52
52
  }
53
53
  </script>
54
- <script type="module" crossorigin src="/assets/main-Ry0vayW2.js"></script>
55
- <link rel="stylesheet" crossorigin href="/assets/main-BP_tVIcC.css">
54
+ <script type="module" crossorigin src="/assets/main-jua4nv-E.js"></script>
55
+ <link rel="stylesheet" crossorigin href="/assets/main-PEflgXnj.css">
56
56
  </head>
57
57
  <body>
58
58
  <main class="aeo-seed-content" aria-label="Token Tracker share page summary">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tokentracker-cli",
3
- "version": "0.5.86",
3
+ "version": "0.5.88",
4
4
  "description": "Token usage tracker for AI agent CLIs (Claude Code, Codex, Cursor, Kiro, Gemini, OpenCode, OpenClaw, Hermes, GitHub Copilot)",
5
5
  "main": "src/cli.js",
6
6
  "bin": {
@@ -1201,6 +1201,89 @@ function createLocalApiHandler({ queuePath }) {
1201
1201
  return true;
1202
1202
  }
1203
1203
 
1204
+ // --- skills manager ---
1205
+ if (p === "/functions/tokentracker-skills") {
1206
+ const method = String(req.method || "GET").toUpperCase();
1207
+ const skills = require("./skills-manager");
1208
+ try {
1209
+ if (method === "GET") {
1210
+ const mode = url.searchParams.get("mode") || "installed";
1211
+ if (mode === "installed") {
1212
+ json(res, { targets: skills.targetList(), skills: skills.listInstalledSkills() });
1213
+ return true;
1214
+ }
1215
+ if (mode === "repos") {
1216
+ json(res, { repos: skills.listRepos() });
1217
+ return true;
1218
+ }
1219
+ if (mode === "discover") {
1220
+ const force = url.searchParams.get("force") === "1";
1221
+ json(res, await skills.discoverSkills({ force }));
1222
+ return true;
1223
+ }
1224
+ if (mode === "search") {
1225
+ const data = await skills.searchSkillsSh(
1226
+ url.searchParams.get("q") || "",
1227
+ Number(url.searchParams.get("limit") || 20),
1228
+ Number(url.searchParams.get("offset") || 0),
1229
+ );
1230
+ json(res, data);
1231
+ return true;
1232
+ }
1233
+ json(res, { error: "Unknown skills mode" }, 400);
1234
+ return true;
1235
+ }
1236
+
1237
+ if (method === "POST") {
1238
+ if (!isAuthorizedLocalMutation(req)) {
1239
+ json(res, { ok: false, error: "Unauthorized" }, 401);
1240
+ return true;
1241
+ }
1242
+ const body = await readJsonBody(req);
1243
+ const action = String(body?.action || "");
1244
+ if (action === "install") {
1245
+ json(res, { ok: true, skill: await skills.installSkill(body.skill, body.targets || ["claude", "codex"]) });
1246
+ return true;
1247
+ }
1248
+ if (action === "uninstall") {
1249
+ json(res, { ok: true, ...(skills.uninstallSkill(body.id) || {}) });
1250
+ return true;
1251
+ }
1252
+ if (action === "restore") {
1253
+ json(res, { ok: true, skill: skills.restoreSkill(body.id) });
1254
+ return true;
1255
+ }
1256
+ if (action === "set_targets") {
1257
+ json(res, { ok: true, skill: skills.setSkillTargets(body.id, body.targets || []) });
1258
+ return true;
1259
+ }
1260
+ if (action === "import_local") {
1261
+ json(res, { ok: true, skill: skills.importLocalSkill(body.directory, body.targets || []) });
1262
+ return true;
1263
+ }
1264
+ if (action === "delete_local") {
1265
+ json(res, { ok: true, ...(skills.deleteLocalSkill(body.directory, body.targets || []) || {}) });
1266
+ return true;
1267
+ }
1268
+ if (action === "add_repo") {
1269
+ json(res, { ok: true, repo: skills.addRepo(body.repo) });
1270
+ return true;
1271
+ }
1272
+ if (action === "remove_repo") {
1273
+ json(res, { ok: true, ...(skills.removeRepo(body.owner, body.name) || {}) });
1274
+ return true;
1275
+ }
1276
+ json(res, { ok: false, error: "Unknown skills action" }, 400);
1277
+ return true;
1278
+ }
1279
+
1280
+ json(res, { ok: false, error: "Method Not Allowed" }, 405);
1281
+ } catch (e) {
1282
+ json(res, { ok: false, error: e?.message || "Unknown skills error" }, 500);
1283
+ }
1284
+ return true;
1285
+ }
1286
+
1204
1287
  // --- usage-limits ---
1205
1288
  if (p === "/functions/tokentracker-usage-limits") {
1206
1289
  const { getUsageLimits, resetUsageLimitsCache } = require("./usage-limits");