vibestats 1.0.4 → 1.0.5

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 (2) hide show
  1. package/dist/index.js +67 -0
  2. package/package.json +6 -7
package/dist/index.js CHANGED
@@ -1436,6 +1436,49 @@ function getModelAbbrevFromDisplayName(displayName) {
1436
1436
  };
1437
1437
  return map[displayName] || displayName.slice(0, 5).toLowerCase();
1438
1438
  }
1439
+ function encodeUsageToUrl(stats, baseUrl = "https://vibestats.wolfai.dev") {
1440
+ const params = new URLSearchParams();
1441
+ const aggMap = { daily: "d", monthly: "m", model: "mo", total: "t" };
1442
+ params.set("agg", aggMap[stats.aggregation] || "d");
1443
+ if (stats.source !== "claude") {
1444
+ params.set("src", stats.source);
1445
+ }
1446
+ const formatDateCompact = (d) => d.replace(/-/g, "");
1447
+ params.set("dr", `${formatDateCompact(stats.dateRange.start)}-${formatDateCompact(stats.dateRange.end)}`);
1448
+ const rows = stats.rows.slice(0, 31).map((row) => {
1449
+ let key = row.key;
1450
+ if (stats.aggregation === "daily" && row.key.length === 10) {
1451
+ key = row.key.slice(5).replace("-", "");
1452
+ }
1453
+ return [
1454
+ key,
1455
+ formatCompactNumber(row.inputTokens),
1456
+ formatCompactNumber(row.outputTokens),
1457
+ formatCompactNumber(row.cacheWriteTokens),
1458
+ formatCompactNumber(row.cacheReadTokens),
1459
+ formatCompactNumber(row.totalTokens),
1460
+ row.cost.toFixed(2)
1461
+ ].join(":");
1462
+ });
1463
+ params.set("rows", rows.join("|"));
1464
+ const t = stats.totals;
1465
+ params.set("tot", [
1466
+ formatCompactNumber(t.inputTokens),
1467
+ formatCompactNumber(t.outputTokens),
1468
+ formatCompactNumber(t.cacheWriteTokens),
1469
+ formatCompactNumber(t.cacheReadTokens),
1470
+ formatCompactNumber(t.totalTokens),
1471
+ t.cost.toFixed(2)
1472
+ ].join(":"));
1473
+ if (stats.modelBreakdown.length > 0) {
1474
+ const mb = stats.modelBreakdown.slice(0, 5).map((m) => {
1475
+ const abbr = getModelAbbrevFromDisplayName(m.model);
1476
+ return `${abbr}:${m.percentage}:${m.cost.toFixed(2)}`;
1477
+ });
1478
+ params.set("mb", mb.join(","));
1479
+ }
1480
+ return `${baseUrl}?${params.toString()}`;
1481
+ }
1439
1482
 
1440
1483
  // src/display.ts
1441
1484
  var colors2 = {
@@ -1704,6 +1747,13 @@ var main = defineCommand({
1704
1747
  description: "Use compact table format (hide cache columns)",
1705
1748
  default: false
1706
1749
  },
1750
+ // Share option for usage mode
1751
+ share: {
1752
+ type: "boolean",
1753
+ alias: "s",
1754
+ description: "Generate a shareable URL (usage mode)",
1755
+ default: false
1756
+ },
1707
1757
  // Wrapped-specific options
1708
1758
  url: {
1709
1759
  type: "string",
@@ -1769,6 +1819,19 @@ async function runUsage(args, config) {
1769
1819
  }
1770
1820
  process.exit(1);
1771
1821
  }
1822
+ const baseUrl = args.url || config.baseUrl || "https://vibestats.wolfai.dev";
1823
+ let shareUrl = null;
1824
+ if (args.share) {
1825
+ const fullUrl = encodeUsageToUrl(stats, baseUrl);
1826
+ if (!args["no-short"]) {
1827
+ shareUrl = await createShortlink(fullUrl, baseUrl);
1828
+ }
1829
+ shareUrl = shareUrl || fullUrl;
1830
+ }
1831
+ if (args.quiet && args.share && shareUrl) {
1832
+ console.log(shareUrl);
1833
+ return;
1834
+ }
1772
1835
  if (args.json) {
1773
1836
  console.log(JSON.stringify(stats, null, 2));
1774
1837
  } else if (args.quiet) {
@@ -1787,6 +1850,10 @@ async function runUsage(args, config) {
1787
1850
  showColors: config.theme?.enabled !== false
1788
1851
  });
1789
1852
  }
1853
+ if (args.share && shareUrl && !args.json) {
1854
+ console.log();
1855
+ console.log(`\u{1F517} ${shareUrl}`);
1856
+ }
1790
1857
  }
1791
1858
  async function runWrapped(args, config) {
1792
1859
  const options = resolveOptions(args, config);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibestats",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "AI coding stats - usage tracking and annual wrapped for Claude Code & Codex",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -18,11 +18,6 @@
18
18
  "files": [
19
19
  "dist"
20
20
  ],
21
- "scripts": {
22
- "dev": "tsx src/index.ts",
23
- "build": "tsup src/index.ts --format esm --dts --clean --shims",
24
- "prepublishOnly": "pnpm build"
25
- },
26
21
  "keywords": [
27
22
  "claude",
28
23
  "claude-code",
@@ -50,5 +45,9 @@
50
45
  },
51
46
  "engines": {
52
47
  "node": ">=18.0.0"
48
+ },
49
+ "scripts": {
50
+ "dev": "tsx src/index.ts",
51
+ "build": "tsup src/index.ts --format esm --dts --clean --shims"
53
52
  }
54
- }
53
+ }