cc-proficiency 0.2.4 → 0.2.6

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 (151) hide show
  1. package/README.md +59 -18
  2. package/README.zh-CN.md +36 -10
  3. package/dist/cli/commands/achievements.d.ts.map +1 -1
  4. package/dist/cli/commands/achievements.js +1 -0
  5. package/dist/cli/commands/achievements.js.map +1 -1
  6. package/dist/cli/commands/analyze.d.ts.map +1 -1
  7. package/dist/cli/commands/analyze.js +14 -2
  8. package/dist/cli/commands/analyze.js.map +1 -1
  9. package/dist/cli/commands/badge.d.ts.map +1 -1
  10. package/dist/cli/commands/badge.js +8 -2
  11. package/dist/cli/commands/badge.js.map +1 -1
  12. package/dist/cli/commands/config.d.ts.map +1 -1
  13. package/dist/cli/commands/config.js +4 -0
  14. package/dist/cli/commands/config.js.map +1 -1
  15. package/dist/cli/commands/explain.js +1 -1
  16. package/dist/cli/commands/explain.js.map +1 -1
  17. package/dist/cli/commands/init.d.ts.map +1 -1
  18. package/dist/cli/commands/init.js +7 -1
  19. package/dist/cli/commands/init.js.map +1 -1
  20. package/dist/cli/commands/leaderboard.d.ts +2 -0
  21. package/dist/cli/commands/leaderboard.d.ts.map +1 -0
  22. package/dist/cli/commands/leaderboard.js +58 -0
  23. package/dist/cli/commands/leaderboard.js.map +1 -0
  24. package/dist/cli/commands/process.d.ts.map +1 -1
  25. package/dist/cli/commands/process.js +25 -5
  26. package/dist/cli/commands/process.js.map +1 -1
  27. package/dist/cli/commands/refresh.d.ts +7 -0
  28. package/dist/cli/commands/refresh.d.ts.map +1 -0
  29. package/dist/cli/commands/refresh.js +66 -0
  30. package/dist/cli/commands/refresh.js.map +1 -0
  31. package/dist/cli/commands/share.d.ts +2 -0
  32. package/dist/cli/commands/share.d.ts.map +1 -0
  33. package/dist/cli/commands/share.js +129 -0
  34. package/dist/cli/commands/share.js.map +1 -0
  35. package/dist/cli/commands/status.d.ts.map +1 -1
  36. package/dist/cli/commands/status.js +1 -0
  37. package/dist/cli/commands/status.js.map +1 -1
  38. package/dist/cli/commands/update.d.ts +2 -0
  39. package/dist/cli/commands/update.d.ts.map +1 -0
  40. package/dist/cli/commands/update.js +40 -0
  41. package/dist/cli/commands/update.js.map +1 -0
  42. package/dist/cli/index.js +38 -19
  43. package/dist/cli/index.js.map +1 -1
  44. package/dist/cli/services/hooks.d.ts.map +1 -1
  45. package/dist/cli/services/hooks.js +36 -18
  46. package/dist/cli/services/hooks.js.map +1 -1
  47. package/dist/cli/services/leaderboard.d.ts +11 -0
  48. package/dist/cli/services/leaderboard.d.ts.map +1 -0
  49. package/dist/cli/services/leaderboard.js +120 -0
  50. package/dist/cli/services/leaderboard.js.map +1 -0
  51. package/dist/cli/services/publishing.d.ts +16 -0
  52. package/dist/cli/services/publishing.d.ts.map +1 -1
  53. package/dist/cli/services/publishing.js +88 -39
  54. package/dist/cli/services/publishing.js.map +1 -1
  55. package/dist/cli/services/self-update.d.ts +14 -0
  56. package/dist/cli/services/self-update.d.ts.map +1 -0
  57. package/dist/cli/services/self-update.js +45 -0
  58. package/dist/cli/services/self-update.js.map +1 -0
  59. package/dist/cli/services/sessions.d.ts +1 -0
  60. package/dist/cli/services/sessions.d.ts.map +1 -1
  61. package/dist/cli/services/sessions.js +15 -2
  62. package/dist/cli/services/sessions.js.map +1 -1
  63. package/dist/cli/utils/formatting.d.ts +2 -2
  64. package/dist/cli/utils/formatting.d.ts.map +1 -1
  65. package/dist/cli/utils/formatting.js +7 -1
  66. package/dist/cli/utils/formatting.js.map +1 -1
  67. package/dist/cli/utils/update-check.d.ts +9 -0
  68. package/dist/cli/utils/update-check.d.ts.map +1 -0
  69. package/dist/cli/utils/update-check.js +124 -0
  70. package/dist/cli/utils/update-check.js.map +1 -0
  71. package/dist/cli/utils/version.d.ts +2 -0
  72. package/dist/cli/utils/version.d.ts.map +1 -0
  73. package/dist/cli/utils/version.js +16 -0
  74. package/dist/cli/utils/version.js.map +1 -0
  75. package/dist/gist/registry.d.ts +26 -0
  76. package/dist/gist/registry.d.ts.map +1 -0
  77. package/dist/gist/registry.js +101 -0
  78. package/dist/gist/registry.js.map +1 -0
  79. package/dist/gist/uploader.d.ts +9 -1
  80. package/dist/gist/uploader.d.ts.map +1 -1
  81. package/dist/gist/uploader.js +47 -1
  82. package/dist/gist/uploader.js.map +1 -1
  83. package/dist/hooks/token-refresh.js +72 -0
  84. package/dist/i18n/locales.d.ts.map +1 -1
  85. package/dist/i18n/locales.js +2 -1
  86. package/dist/i18n/locales.js.map +1 -1
  87. package/dist/index.d.ts +3 -1
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +5 -1
  90. package/dist/index.js.map +1 -1
  91. package/dist/parsers/config-detectors.d.ts +29 -0
  92. package/dist/parsers/config-detectors.d.ts.map +1 -0
  93. package/dist/parsers/config-detectors.js +367 -0
  94. package/dist/parsers/config-detectors.js.map +1 -0
  95. package/dist/parsers/config-parser.d.ts +7 -2
  96. package/dist/parsers/config-parser.d.ts.map +1 -1
  97. package/dist/parsers/config-parser.js +31 -229
  98. package/dist/parsers/config-parser.js.map +1 -1
  99. package/dist/parsers/transcript-parser.d.ts.map +1 -1
  100. package/dist/parsers/transcript-parser.js +10 -0
  101. package/dist/parsers/transcript-parser.js.map +1 -1
  102. package/dist/renderer/animated-svg.d.ts +9 -0
  103. package/dist/renderer/animated-svg.d.ts.map +1 -0
  104. package/dist/renderer/animated-svg.js +125 -0
  105. package/dist/renderer/animated-svg.js.map +1 -0
  106. package/dist/renderer/svg.d.ts +33 -5
  107. package/dist/renderer/svg.d.ts.map +1 -1
  108. package/dist/renderer/svg.js +77 -55
  109. package/dist/renderer/svg.js.map +1 -1
  110. package/dist/scoring/engine.d.ts +1 -1
  111. package/dist/scoring/engine.d.ts.map +1 -1
  112. package/dist/scoring/engine.js +30 -8
  113. package/dist/scoring/engine.js.map +1 -1
  114. package/dist/scoring/feature-scores.d.ts +27 -0
  115. package/dist/scoring/feature-scores.d.ts.map +1 -0
  116. package/dist/scoring/feature-scores.js +63 -0
  117. package/dist/scoring/feature-scores.js.map +1 -0
  118. package/dist/scoring/rules.d.ts.map +1 -1
  119. package/dist/scoring/rules.js +12 -0
  120. package/dist/scoring/rules.js.map +1 -1
  121. package/dist/scoring/signals.js +2 -0
  122. package/dist/scoring/signals.js.map +1 -1
  123. package/dist/store/achievements.d.ts.map +1 -1
  124. package/dist/store/achievements.js +8 -0
  125. package/dist/store/achievements.js.map +1 -1
  126. package/dist/store/config-sync.d.ts +36 -0
  127. package/dist/store/config-sync.d.ts.map +1 -0
  128. package/dist/store/config-sync.js +161 -0
  129. package/dist/store/config-sync.js.map +1 -0
  130. package/dist/store/local-store.d.ts +6 -1
  131. package/dist/store/local-store.d.ts.map +1 -1
  132. package/dist/store/local-store.js +74 -3
  133. package/dist/store/local-store.js.map +1 -1
  134. package/dist/store/public-profile.d.ts +12 -0
  135. package/dist/store/public-profile.d.ts.map +1 -0
  136. package/dist/store/public-profile.js +50 -0
  137. package/dist/store/public-profile.js.map +1 -0
  138. package/dist/store/queue.js +1 -1
  139. package/dist/store/queue.js.map +1 -1
  140. package/dist/store/remote-store.d.ts +8 -1
  141. package/dist/store/remote-store.d.ts.map +1 -1
  142. package/dist/store/remote-store.js +32 -4
  143. package/dist/store/remote-store.js.map +1 -1
  144. package/dist/types.d.ts +77 -0
  145. package/dist/types.d.ts.map +1 -1
  146. package/dist/utils/format.d.ts +6 -0
  147. package/dist/utils/format.d.ts.map +1 -0
  148. package/dist/utils/format.js +15 -0
  149. package/dist/utils/format.js.map +1 -0
  150. package/hooks/token-refresh.ts +75 -0
  151. package/package.json +1 -1
@@ -10,7 +10,9 @@ const local_store_js_1 = require("../../store/local-store.js");
10
10
  const queue_js_1 = require("../../store/queue.js");
11
11
  const uploader_js_1 = require("../../gist/uploader.js");
12
12
  const sessions_js_1 = require("../services/sessions.js");
13
+ const publishing_js_1 = require("../services/publishing.js");
13
14
  const locale_js_1 = require("../utils/locale.js");
15
+ const config_sync_js_1 = require("../../store/config-sync.js");
14
16
  async function cmdProcess() {
15
17
  if (!(0, queue_js_1.acquireLock)()) {
16
18
  console.log("Another process is running. Skipping.");
@@ -48,20 +50,38 @@ async function cmdProcess() {
48
50
  processed.push(entry.sessionId);
49
51
  }
50
52
  }
53
+ // Always persist queue cwds, even if no new sessions scored
54
+ const queueCwds = queue.map((e) => e.cwd).filter(Boolean);
55
+ const knownCwds = store.knownProjectCwds ?? [];
56
+ const allCwds = [...new Set([...knownCwds, ...queueCwds])];
57
+ store.knownProjectCwds = allCwds;
51
58
  if (newSessions.length > 0) {
52
- const config = (0, config_parser_js_1.parseClaudeConfig)();
59
+ // Build token log entries from newly parsed sessions
60
+ (0, local_store_js_1.upsertTokenLog)(store, newSessions.map((s) => ({
61
+ sessionId: s.sessionId,
62
+ timestamp: s.endTime,
63
+ tokens: s.totalTokens,
64
+ })));
65
+ const config = (0, sessions_js_1.getConfigWithSync)(allCwds.length > 0 ? allCwds : undefined);
53
66
  const allSessions = await (0, sessions_js_1.gatherAllProcessedSessions)(store);
54
67
  const sessionsToScore = allSessions.length > 0 ? allSessions : newSessions;
55
68
  const setupChecklist = (0, config_parser_js_1.buildSetupChecklist)(config);
56
69
  const userConfig = (0, local_store_js_1.loadConfig)();
57
70
  const result = (0, engine_js_1.computeProficiency)(sessionsToScore, config, userConfig.username ?? "unknown", setupChecklist);
58
71
  store.lastResult = result;
59
- const svg = (0, svg_js_1.renderBadge)(result, (0, locale_js_1.getConfigLocale)());
72
+ // Save local badge first (always works, even offline)
73
+ const tokenWindows = (0, local_store_js_1.computeTokenWindows)(store.tokenLog);
74
+ const svg = (0, svg_js_1.renderBadge)(result, (0, locale_js_1.getConfigLocale)(), tokenWindows);
60
75
  const badgePath = (0, local_store_js_1.saveBadge)(svg);
76
+ // Push SVG + JSON atomically (preserves achievements/streak)
61
77
  if (userConfig.autoUpload && userConfig.gistId && (0, uploader_js_1.isGhAuthenticated)()) {
62
- const gistResult = (0, uploader_js_1.updateGist)(userConfig.gistId, svg);
63
- if (!gistResult.success) {
64
- (0, local_store_js_1.logError)(`Gist push failed: ${gistResult.error}`);
78
+ // Build config snapshot from already-computed config (no re-scan)
79
+ const existing = (0, uploader_js_1.readGistFile)(userConfig.gistId, "config-snapshots.json");
80
+ const parsed = existing ? (0, config_sync_js_1.parseSnapshotsFile)(existing) : null;
81
+ const configSnapshotJson = JSON.stringify((0, config_sync_js_1.buildSnapshotPayload)(parsed, config));
82
+ const pushResult = (0, publishing_js_1.mergeAndPush)(store, result, userConfig.gistId, userConfig.username ?? "unknown", false, configSnapshotJson);
83
+ if (!pushResult.success) {
84
+ (0, local_store_js_1.logError)(`Gist push failed: ${pushResult.error}`);
65
85
  }
66
86
  }
67
87
  console.log(`Processed ${newSessions.length} session(s). Badge saved to ${badgePath}`);
@@ -1 +1 @@
1
- {"version":3,"file":"process.js","sourceRoot":"","sources":["../../../src/cli/commands/process.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../../src/cli/commands/process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Refresh token windows and re-render badge.
3
+ * Lightweight — no transcript parsing, just re-compute rolling windows.
4
+ * Skips if badge file was written <30 min ago (unless --force).
5
+ */
6
+ export declare function cmdRefresh(args: string[]): void;
7
+ //# sourceMappingURL=refresh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/refresh.ts"],"names":[],"mappings":"AAoBA;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA2C/C"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cmdRefresh = cmdRefresh;
4
+ const node_fs_1 = require("node:fs");
5
+ const svg_js_1 = require("../../renderer/svg.js");
6
+ const animated_svg_js_1 = require("../../renderer/animated-svg.js");
7
+ const local_store_js_1 = require("../../store/local-store.js");
8
+ const uploader_js_1 = require("../../gist/uploader.js");
9
+ const remote_store_js_1 = require("../../store/remote-store.js");
10
+ const locale_js_1 = require("../utils/locale.js");
11
+ const STALE_MS = 30 * 60 * 1000; // 30 minutes
12
+ function badgeAge() {
13
+ const path = (0, local_store_js_1.getBadgePath)();
14
+ if (!(0, node_fs_1.existsSync)(path))
15
+ return Infinity;
16
+ try {
17
+ return Date.now() - (0, node_fs_1.statSync)(path).mtimeMs;
18
+ }
19
+ catch {
20
+ return Infinity;
21
+ }
22
+ }
23
+ /**
24
+ * Refresh token windows and re-render badge.
25
+ * Lightweight — no transcript parsing, just re-compute rolling windows.
26
+ * Skips if badge file was written <30 min ago (unless --force).
27
+ */
28
+ function cmdRefresh(args) {
29
+ const force = args.includes("--force");
30
+ const store = (0, local_store_js_1.loadStore)();
31
+ if (!store.lastResult) {
32
+ return; // nothing to refresh — silent exit for hook usage
33
+ }
34
+ // Skip if badge file was recently written (unless forced)
35
+ if (!force && badgeAge() < STALE_MS) {
36
+ return;
37
+ }
38
+ const config = (0, local_store_js_1.loadConfig)();
39
+ const locale = (0, locale_js_1.getConfigLocale)();
40
+ // Compute fresh token windows — prefer merged remote data if available,
41
+ // but only if it actually has token entries (avoids zeroing out on legacy gists)
42
+ let tokenWindows = (0, local_store_js_1.computeTokenWindows)(store.tokenLog);
43
+ if (config.gistId && (0, uploader_js_1.isGhAuthenticated)()) {
44
+ const remoteJson = (0, uploader_js_1.readGistFile)(config.gistId, "cc-proficiency.json");
45
+ const remote = remoteJson ? (0, remote_store_js_1.parseRemoteStore)(remoteJson) : null;
46
+ if (remote) {
47
+ const remoteWindows = (0, remote_store_js_1.computeTokenWindowsFromRemote)(remote.recentSessions);
48
+ if (remoteWindows.tokens24h > 0 || remoteWindows.tokens30d > 0) {
49
+ tokenWindows = remoteWindows;
50
+ }
51
+ }
52
+ }
53
+ // Re-render badges with fresh windows
54
+ const svg = (0, svg_js_1.renderBadge)(store.lastResult, locale, tokenWindows);
55
+ const animatedSvg = (0, animated_svg_js_1.renderAnimatedBadge)(store.lastResult, locale, tokenWindows);
56
+ (0, local_store_js_1.saveBadge)(svg);
57
+ (0, local_store_js_1.saveAnimatedBadge)(animatedSvg);
58
+ // Push to gist if configured
59
+ if (config.autoUpload && config.gistId && (0, uploader_js_1.isGhAuthenticated)()) {
60
+ (0, uploader_js_1.pushGistFiles)(config.gistId, {
61
+ "cc-proficiency.svg": svg,
62
+ "cc-proficiency-animated.svg": animatedSvg,
63
+ });
64
+ }
65
+ }
66
+ //# sourceMappingURL=refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../../src/cli/commands/refresh.ts"],"names":[],"mappings":";;AAyBA,gCA2CC;AApED,qCAA+C;AAC/C,kDAAoD;AACpD,oEAAqE;AACrE,+DAAoI;AACpI,wDAAwF;AACxF,iEAA8F;AAC9F,kDAAqD;AAErD,MAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;AAE9C,SAAS,QAAQ;IACf,MAAM,IAAI,GAAG,IAAA,6BAAY,GAAE,CAAC;IAC5B,IAAI,CAAC,IAAA,oBAAU,EAAC,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IACvC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAA,kBAAQ,EAAC,IAAI,CAAC,CAAC,OAAO,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,UAAU,CAAC,IAAc;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,IAAA,0BAAS,GAAE,CAAC;IAE1B,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,CAAC,kDAAkD;IAC5D,CAAC;IAED,0DAA0D;IAC1D,IAAI,CAAC,KAAK,IAAI,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;QACpC,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,2BAAU,GAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,IAAA,2BAAe,GAAE,CAAC;IAEjC,wEAAwE;IACxE,iFAAiF;IACjF,IAAI,YAAY,GAAG,IAAA,oCAAmB,EAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvD,IAAI,MAAM,CAAC,MAAM,IAAI,IAAA,+BAAiB,GAAE,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,IAAA,0BAAY,EAAC,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,IAAA,kCAAgB,EAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChE,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,aAAa,GAAG,IAAA,+CAA6B,EAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YAC3E,IAAI,aAAa,CAAC,SAAS,GAAG,CAAC,IAAI,aAAa,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;gBAC/D,YAAY,GAAG,aAAa,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,MAAM,GAAG,GAAG,IAAA,oBAAW,EAAC,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IAChE,MAAM,WAAW,GAAG,IAAA,qCAAmB,EAAC,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IAChF,IAAA,0BAAS,EAAC,GAAG,CAAC,CAAC;IACf,IAAA,kCAAiB,EAAC,WAAW,CAAC,CAAC;IAE/B,6BAA6B;IAC7B,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,IAAI,IAAA,+BAAiB,GAAE,EAAE,CAAC;QAC9D,IAAA,2BAAa,EAAC,MAAM,CAAC,MAAM,EAAE;YAC3B,oBAAoB,EAAE,GAAG;YACzB,6BAA6B,EAAE,WAAW;SAC3C,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function cmdShare(args: string[]): void;
2
+ //# sourceMappingURL=share.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/share.ts"],"names":[],"mappings":"AAMA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAK7C"}
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cmdShare = cmdShare;
4
+ const uploader_js_1 = require("../../gist/uploader.js");
5
+ const registry_js_1 = require("../../gist/registry.js");
6
+ const local_store_js_1 = require("../../store/local-store.js");
7
+ const public_profile_js_1 = require("../../store/public-profile.js");
8
+ const publishing_js_1 = require("../services/publishing.js");
9
+ function cmdShare(args) {
10
+ if (args.includes("--remove")) {
11
+ return doLeave();
12
+ }
13
+ return doJoin();
14
+ }
15
+ function doJoin() {
16
+ const config = (0, local_store_js_1.loadConfig)();
17
+ const store = (0, local_store_js_1.loadStore)();
18
+ // Prerequisites
19
+ if (!(0, uploader_js_1.isGhAuthenticated)()) {
20
+ console.log("\u26A0 GitHub CLI not authenticated. Run: gh auth login");
21
+ return;
22
+ }
23
+ if (!config.gistId) {
24
+ console.log("No Gist configured. Run: cc-proficiency init");
25
+ return;
26
+ }
27
+ if (!store.lastResult) {
28
+ console.log("No analysis data. Run: cc-proficiency analyze");
29
+ return;
30
+ }
31
+ // Idempotent check
32
+ if (config.leaderboard && config.publicGistId) {
33
+ console.log("Already on the leaderboard. Profile auto-updates on push.");
34
+ return;
35
+ }
36
+ // Privacy notice
37
+ console.log(" Joining the cc-proficiency leaderboard...\n");
38
+ console.log(" This will share publicly:");
39
+ console.log(" - GitHub username, domain scores, streak, achievement count");
40
+ console.log(" - Total sessions and hours, member since date\n");
41
+ console.log(" NOT shared: session details, project names, file paths, tools\n");
42
+ // Ensure fresh data via mergeAndPush
43
+ const pushResult = (0, publishing_js_1.mergeAndPush)(store, store.lastResult, config.gistId, config.username ?? "unknown", false);
44
+ if (!pushResult.success) {
45
+ console.log(`\u2717 Failed to sync data: ${pushResult.error}`);
46
+ return;
47
+ }
48
+ // Build public profile from merged data
49
+ if (!pushResult.merged) {
50
+ console.log("\u2717 Failed to build public profile — no merged data");
51
+ return;
52
+ }
53
+ const publicProfile = (0, public_profile_js_1.buildPublicProfile)(pushResult.merged);
54
+ const profileJson = JSON.stringify(publicProfile, null, 2);
55
+ // Create or reuse public gist
56
+ let publicGistId = config.publicGistId;
57
+ let newlyCreated = false;
58
+ if (!publicGistId) {
59
+ console.log(" Creating public profile gist...");
60
+ const gistResult = (0, uploader_js_1.createPublicGist)(profileJson);
61
+ if (!gistResult.success || !gistResult.url) {
62
+ console.log(`\u2717 Failed to create public gist: ${gistResult.error}`);
63
+ return;
64
+ }
65
+ publicGistId = gistResult.url;
66
+ newlyCreated = true;
67
+ console.log(` \u2713 Public gist created: ${publicGistId}`);
68
+ }
69
+ else {
70
+ // Update existing public gist
71
+ const updateResult = (0, uploader_js_1.pushGistFiles)(publicGistId, {
72
+ "cc-proficiency-public.json": profileJson,
73
+ });
74
+ if (!updateResult.success) {
75
+ console.log(`\u2717 Failed to update public gist: ${updateResult.error}`);
76
+ return;
77
+ }
78
+ console.log(` \u2713 Public gist updated: ${publicGistId}`);
79
+ }
80
+ // Open registration issue
81
+ console.log(" Registering on leaderboard...");
82
+ const issueResult = (0, registry_js_1.openJoinIssue)(config.username ?? "unknown", publicGistId);
83
+ if (!issueResult.success) {
84
+ // Rollback: delete newly created gist to prevent orphans
85
+ if (newlyCreated) {
86
+ (0, uploader_js_1.deleteGist)(publicGistId);
87
+ }
88
+ console.log(`\u2717 Failed to register: ${issueResult.error}`);
89
+ return;
90
+ }
91
+ // Save config on success only
92
+ config.leaderboard = true;
93
+ config.publicGistId = publicGistId;
94
+ (0, local_store_js_1.saveConfig)(config);
95
+ console.log(` \u2713 Registration issue created`);
96
+ console.log(` ${issueResult.issueUrl}`);
97
+ console.log("\n Your profile will appear once the issue is processed.");
98
+ }
99
+ function doLeave() {
100
+ const config = (0, local_store_js_1.loadConfig)();
101
+ if (!(0, uploader_js_1.isGhAuthenticated)()) {
102
+ console.log("\u26A0 GitHub CLI not authenticated. Run: gh auth login");
103
+ return;
104
+ }
105
+ console.log(" Leaving the cc-proficiency leaderboard...\n");
106
+ // Open removal issue FIRST — don't delete gist until issue is confirmed
107
+ const issueResult = (0, registry_js_1.openLeaveIssue)(config.username ?? "unknown");
108
+ if (!issueResult.success) {
109
+ console.log(`\u2717 Could not create removal issue: ${issueResult.error}`);
110
+ console.log(" Your leaderboard entry and public gist are unchanged.");
111
+ return;
112
+ }
113
+ console.log(` \u2713 Removal issue created: ${issueResult.issueUrl}`);
114
+ // Only delete gist + clear config after issue is confirmed
115
+ if (config.publicGistId) {
116
+ const delResult = (0, uploader_js_1.deleteGist)(config.publicGistId);
117
+ if (delResult.success) {
118
+ console.log(" \u2713 Public profile gist deleted");
119
+ }
120
+ else {
121
+ console.log(` \u26A0 Could not delete public gist: ${delResult.error}`);
122
+ }
123
+ }
124
+ config.leaderboard = false;
125
+ config.publicGistId = undefined;
126
+ (0, local_store_js_1.saveConfig)(config);
127
+ console.log("\n Removed from leaderboard.");
128
+ }
129
+ //# sourceMappingURL=share.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share.js","sourceRoot":"","sources":["../../../src/cli/commands/share.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAKA,wBAAgB,SAAS,IAAI,IAAI,CAiDhC"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAKA,wBAAgB,SAAS,IAAI,IAAI,CAkDhC"}
@@ -14,6 +14,7 @@ function cmdStatus() {
14
14
  console.log(` Gist ID: ${config.gistId ?? "(not set)"}`);
15
15
  console.log(` Auto-upload: ${config.autoUpload}`);
16
16
  console.log(` Locale: ${config.locale ?? "en"}`);
17
+ console.log(` Leaderboard: ${config.leaderboard ? `joined (${config.publicGistId ?? "pending"})` : "not joined"}`);
17
18
  console.log(`\n Sessions processed: ${store.processedSessionIds.length}`);
18
19
  console.log(` Last updated: ${store.lastUpdated ?? "never"}`);
19
20
  const queue = (0, queue_js_1.readQueue)();
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function cmdUpdate(): Promise<void>;
2
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAGA,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAkC/C"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cmdUpdate = cmdUpdate;
4
+ const version_js_1 = require("../utils/version.js");
5
+ const self_update_js_1 = require("../services/self-update.js");
6
+ async function cmdUpdate() {
7
+ console.log("Checking for updates...");
8
+ const check = await (0, self_update_js_1.checkForUpdate)((0, version_js_1.getVersion)());
9
+ if (check.fetchFailed) {
10
+ console.log("Could not reach the npm registry. Check your internet connection.");
11
+ return;
12
+ }
13
+ if (!check.available) {
14
+ console.log(`Already on the latest version (v${check.current}).`);
15
+ return;
16
+ }
17
+ console.log(`Update available: v${check.current} \u2192 v${check.latest}\n`);
18
+ console.log("Updating cc-proficiency...");
19
+ const result = (0, self_update_js_1.runNpmInstall)(check.latest);
20
+ if (result.success) {
21
+ console.log(`\u2713 Updated to v${check.latest}`);
22
+ }
23
+ else if (result.error === "permission") {
24
+ console.log("\u2717 Permission denied.");
25
+ if (process.platform === "win32") {
26
+ console.log("Run this command in an Administrator terminal.");
27
+ }
28
+ else {
29
+ console.log(`Run: sudo npm install -g cc-proficiency@${check.latest}`);
30
+ }
31
+ }
32
+ else if (result.error === "not-found") {
33
+ console.log("\u2717 npm not found. Install Node.js/npm first.");
34
+ }
35
+ else {
36
+ console.log(`\u2717 Update failed: ${result.error}`);
37
+ console.log(`Try manually: npm install -g cc-proficiency@${check.latest}`);
38
+ }
39
+ }
40
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":";;AAGA,8BAkCC;AArCD,oDAAiD;AACjD,+DAA2E;AAEpE,KAAK,UAAU,SAAS;IAC7B,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,MAAM,IAAA,+BAAc,EAAC,IAAA,uBAAU,GAAE,CAAC,CAAC;IAEjD,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;QACjF,OAAO;IACT,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,mCAAmC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;QAClE,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,CAAC,OAAO,YAAY,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAE1C,MAAM,MAAM,GAAG,IAAA,8BAAa,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAE3C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACpD,CAAC;SAAM,IAAI,MAAM,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,2CAA2C,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;SAAM,IAAI,MAAM,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAClE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,yBAAyB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,+CAA+C,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC"}
package/dist/cli/index.js CHANGED
@@ -1,8 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- const node_fs_1 = require("node:fs");
5
- const node_path_1 = require("node:path");
6
4
  const engine_js_1 = require("../scoring/engine.js");
7
5
  const init_js_1 = require("./commands/init.js");
8
6
  const analyze_js_1 = require("./commands/analyze.js");
@@ -14,16 +12,12 @@ const achievements_js_1 = require("./commands/achievements.js");
14
12
  const status_js_1 = require("./commands/status.js");
15
13
  const config_js_1 = require("./commands/config.js");
16
14
  const uninstall_js_1 = require("./commands/uninstall.js");
17
- function getVersion() {
18
- try {
19
- // dist/cli/index.js -> ../../package.json
20
- const pkg = JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.join)(__dirname, "..", "..", "package.json"), "utf-8"));
21
- return pkg.version ?? "0.1.0";
22
- }
23
- catch {
24
- return "0.1.0";
25
- }
26
- }
15
+ const share_js_1 = require("./commands/share.js");
16
+ const leaderboard_js_1 = require("./commands/leaderboard.js");
17
+ const update_js_1 = require("./commands/update.js");
18
+ const refresh_js_1 = require("./commands/refresh.js");
19
+ const update_check_js_1 = require("./utils/update-check.js");
20
+ const version_js_1 = require("./utils/version.js");
27
21
  function printUsage() {
28
22
  console.log(`
29
23
  cc-proficiency \u2014 Claude Code Proficiency Badge Generator
@@ -34,9 +28,13 @@ Commands:
34
28
  process Process queued sessions from hook
35
29
  badge [--output <f>] Generate SVG badge
36
30
  push Upload badge to GitHub Gist
31
+ refresh [--force] Refresh token stats and re-render badge
37
32
  explain Show score drivers and improvement tips
38
33
  status Show hook activity, queue, and config
39
34
  config [key] [value] View or set configuration
35
+ share [--remove] Join or leave the community leaderboard
36
+ leaderboard View community rankings
37
+ update Update to the latest version
40
38
  uninstall Remove hooks and clean up
41
39
  version Show version info
42
40
 
@@ -47,6 +45,10 @@ Examples:
47
45
  cc-proficiency explain
48
46
  `);
49
47
  }
48
+ // Commands that should check for updates (interactive, not hook-spawned)
49
+ const UPDATE_CHECK_COMMANDS = new Set([
50
+ "analyze", "explain", "badge", "status", "version", "achievements", "leaderboard",
51
+ ]);
50
52
  async function main() {
51
53
  const args = process.argv.slice(2);
52
54
  const command = args[0];
@@ -54,30 +56,47 @@ async function main() {
54
56
  case "init":
55
57
  return await (0, init_js_1.cmdInit)();
56
58
  case "analyze":
57
- return (0, analyze_js_1.cmdAnalyze)(args);
59
+ await (0, analyze_js_1.cmdAnalyze)(args);
60
+ break;
58
61
  case "process":
59
62
  return (0, process_js_1.cmdProcess)();
60
63
  case "badge":
61
- return (0, badge_js_1.cmdBadge)(args);
64
+ await (0, badge_js_1.cmdBadge)(args);
65
+ break;
62
66
  case "push":
63
67
  return (0, push_js_1.cmdPush)();
64
68
  case "explain":
65
- return (0, explain_js_1.cmdExplain)();
69
+ await (0, explain_js_1.cmdExplain)();
70
+ break;
66
71
  case "achievements":
67
- return (0, achievements_js_1.cmdAchievements)();
72
+ await (0, achievements_js_1.cmdAchievements)();
73
+ break;
68
74
  case "status":
69
- return (0, status_js_1.cmdStatus)();
75
+ await (0, status_js_1.cmdStatus)();
76
+ break;
70
77
  case "config":
71
78
  return (0, config_js_1.cmdConfig)(args.slice(1));
79
+ case "share":
80
+ return (0, share_js_1.cmdShare)(args);
81
+ case "leaderboard":
82
+ await (0, leaderboard_js_1.cmdLeaderboard)(args);
83
+ break;
84
+ case "refresh":
85
+ return (0, refresh_js_1.cmdRefresh)(args);
86
+ case "update":
87
+ return (0, update_js_1.cmdUpdate)();
72
88
  case "uninstall":
73
89
  return (0, uninstall_js_1.cmdUninstall)();
74
90
  case "version":
75
- console.log(`cc-proficiency v${getVersion()} (scoring ${engine_js_1.SCORING_VERSION})`);
76
- return;
91
+ console.log(`cc-proficiency v${(0, version_js_1.getVersion)()} (scoring ${engine_js_1.SCORING_VERSION})`);
92
+ break;
77
93
  default:
78
94
  printUsage();
79
95
  return;
80
96
  }
97
+ if (command && UPDATE_CHECK_COMMANDS.has(command)) {
98
+ await (0, update_check_js_1.checkForUpdates)((0, version_js_1.getVersion)()).catch(() => { });
99
+ }
81
100
  }
82
101
  main().catch((err) => {
83
102
  console.error("Error:", err);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;AAEA,qCAAuC;AACvC,yCAAiC;AACjC,oDAAuD;AACvD,gDAA6C;AAC7C,sDAAmD;AACnD,sDAAmD;AACnD,kDAA+C;AAC/C,gDAA6C;AAC7C,sDAAmD;AACnD,gEAA6D;AAC7D,oDAAiD;AACjD,oDAAiD;AACjD,0DAAuD;AAEvD,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,0CAA0C;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,IAAA,gBAAI,EAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3F,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;CAoBb,CAAC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,MAAM,IAAA,iBAAO,GAAE,CAAC;QACzB,KAAK,SAAS;YACZ,OAAO,IAAA,uBAAU,EAAC,IAAI,CAAC,CAAC;QAC1B,KAAK,SAAS;YACZ,OAAO,IAAA,uBAAU,GAAE,CAAC;QACtB,KAAK,OAAO;YACV,OAAO,IAAA,mBAAQ,EAAC,IAAI,CAAC,CAAC;QACxB,KAAK,MAAM;YACT,OAAO,IAAA,iBAAO,GAAE,CAAC;QACnB,KAAK,SAAS;YACZ,OAAO,IAAA,uBAAU,GAAE,CAAC;QACtB,KAAK,cAAc;YACjB,OAAO,IAAA,iCAAe,GAAE,CAAC;QAC3B,KAAK,QAAQ;YACX,OAAO,IAAA,qBAAS,GAAE,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,IAAA,qBAAS,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,KAAK,WAAW;YACd,OAAO,IAAA,2BAAY,GAAE,CAAC;QACxB,KAAK,SAAS;YACZ,OAAO,CAAC,GAAG,CAAC,mBAAmB,UAAU,EAAE,aAAa,2BAAe,GAAG,CAAC,CAAC;YAC5E,OAAO;QACT;YACE,UAAU,EAAE,CAAC;YACb,OAAO;IACX,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;AAEA,oDAAuD;AACvD,gDAA6C;AAC7C,sDAAmD;AACnD,sDAAmD;AACnD,kDAA+C;AAC/C,gDAA6C;AAC7C,sDAAmD;AACnD,gEAA6D;AAC7D,oDAAiD;AACjD,oDAAiD;AACjD,0DAAuD;AACvD,kDAA+C;AAC/C,8DAA2D;AAC3D,oDAAiD;AACjD,sDAAmD;AACnD,6DAA0D;AAC1D,mDAAgD;AAEhD,SAAS,UAAU;IACjB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;CAwBb,CAAC,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa;CAClF,CAAC,CAAC;AAEH,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,MAAM,IAAA,iBAAO,GAAE,CAAC;QACzB,KAAK,SAAS;YACZ,MAAM,IAAA,uBAAU,EAAC,IAAI,CAAC,CAAC;YACvB,MAAM;QACR,KAAK,SAAS;YACZ,OAAO,IAAA,uBAAU,GAAE,CAAC;QACtB,KAAK,OAAO;YACV,MAAM,IAAA,mBAAQ,EAAC,IAAI,CAAC,CAAC;YACrB,MAAM;QACR,KAAK,MAAM;YACT,OAAO,IAAA,iBAAO,GAAE,CAAC;QACnB,KAAK,SAAS;YACZ,MAAM,IAAA,uBAAU,GAAE,CAAC;YACnB,MAAM;QACR,KAAK,cAAc;YACjB,MAAM,IAAA,iCAAe,GAAE,CAAC;YACxB,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,IAAA,qBAAS,GAAE,CAAC;YAClB,MAAM;QACR,KAAK,QAAQ;YACX,OAAO,IAAA,qBAAS,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,KAAK,OAAO;YACV,OAAO,IAAA,mBAAQ,EAAC,IAAI,CAAC,CAAC;QACxB,KAAK,aAAa;YAChB,MAAM,IAAA,+BAAc,EAAC,IAAI,CAAC,CAAC;YAC3B,MAAM;QACR,KAAK,SAAS;YACZ,OAAO,IAAA,uBAAU,EAAC,IAAI,CAAC,CAAC;QAC1B,KAAK,QAAQ;YACX,OAAO,IAAA,qBAAS,GAAE,CAAC;QACrB,KAAK,WAAW;YACd,OAAO,IAAA,2BAAY,GAAE,CAAC;QACxB,KAAK,SAAS;YACZ,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAA,uBAAU,GAAE,aAAa,2BAAe,GAAG,CAAC,CAAC;YAC5E,MAAM;QACR;YACE,UAAU,EAAE,CAAC;YACb,OAAO;IACX,CAAC;IAED,IAAI,OAAO,IAAI,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAClD,MAAM,IAAA,iCAAe,EAAC,IAAA,uBAAU,GAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/cli/services/hooks.ts"],"names":[],"mappings":"AAMA,wBAAgB,UAAU,IAAI,IAAI,CA8CjC;AAED,wBAAgB,UAAU,IAAI,IAAI,CAsBjC"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/cli/services/hooks.ts"],"names":[],"mappings":"AAMA,wBAAgB,UAAU,IAAI,IAAI,CAkEjC;AAED,wBAAgB,UAAU,IAAI,IAAI,CAsBjC"}
@@ -19,26 +19,44 @@ function injectHook() {
19
19
  }
20
20
  const hooks = (settings.hooks ?? {});
21
21
  const stopHooks = (hooks.Stop ?? []);
22
- const alreadyInstalled = stopHooks.some((group) => group.hooks?.some((h) => h.command?.includes("cc-proficiency")));
23
- if (alreadyInstalled) {
24
- console.log(" Hook already installed (skipping)");
25
- return;
26
- }
27
22
  if (!(0, node_fs_1.existsSync)(CLAUDE_DIR)) {
28
23
  (0, node_fs_1.mkdirSync)(CLAUDE_DIR, { recursive: true });
29
24
  }
30
- // When compiled: dist/cli/services/hooks.js -> dist/hooks/session-end.js
31
- const hookScript = (0, node_path_1.join)(__dirname, "..", "..", "hooks", "session-end.js");
32
- const hookCommand = `node "${hookScript}"`;
33
- stopHooks.push({
34
- hooks: [
35
- {
36
- type: "command",
37
- command: hookCommand,
38
- timeout: 5,
39
- },
40
- ],
41
- });
25
+ let changed = false;
26
+ // Session-end hook (queue + process)
27
+ const sessionEndInstalled = stopHooks.some((group) => group.hooks?.some((h) => h.command?.includes("session-end")));
28
+ if (!sessionEndInstalled) {
29
+ const hookScript = (0, node_path_1.join)(__dirname, "..", "..", "hooks", "session-end.js");
30
+ stopHooks.push({
31
+ hooks: [
32
+ {
33
+ type: "command",
34
+ command: `node "${hookScript}"`,
35
+ timeout: 5,
36
+ },
37
+ ],
38
+ });
39
+ changed = true;
40
+ }
41
+ // Token refresh hook (staleness check + re-render)
42
+ const refreshInstalled = stopHooks.some((group) => group.hooks?.some((h) => h.command?.includes("token-refresh")));
43
+ if (!refreshInstalled) {
44
+ const refreshScript = (0, node_path_1.join)(__dirname, "..", "..", "hooks", "token-refresh.js");
45
+ stopHooks.push({
46
+ hooks: [
47
+ {
48
+ type: "command",
49
+ command: `node "${refreshScript}"`,
50
+ timeout: 5,
51
+ },
52
+ ],
53
+ });
54
+ changed = true;
55
+ }
56
+ if (!changed) {
57
+ console.log(" Hook already installed (skipping)");
58
+ return;
59
+ }
42
60
  hooks.Stop = stopHooks;
43
61
  settings.hooks = hooks;
44
62
  (0, node_fs_1.writeFileSync)(settingsPath, JSON.stringify(settings, null, 2), "utf-8");
@@ -50,7 +68,7 @@ function removeHook() {
50
68
  try {
51
69
  const settings = JSON.parse((0, node_fs_1.readFileSync)(settingsPath, "utf-8"));
52
70
  if (settings.hooks?.Stop) {
53
- settings.hooks.Stop = settings.hooks.Stop.filter((group) => !group.hooks?.some((h) => h.command?.includes("cc-proficiency")));
71
+ settings.hooks.Stop = settings.hooks.Stop.filter((group) => !group.hooks?.some((h) => h.command?.includes("cc-proficiency") || h.command?.includes("token-refresh")));
54
72
  if (settings.hooks.Stop.length === 0) {
55
73
  delete settings.hooks.Stop;
56
74
  }
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/cli/services/hooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/cli/services/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { LeaderboardEntry } from "../../types.js";
2
+ /**
3
+ * Fetch leaderboard from registry gist + individual public profiles.
4
+ * Falls back to cache if offline.
5
+ */
6
+ export declare function fetchLeaderboard(sortBy?: string, limit?: number): {
7
+ entries: LeaderboardEntry[];
8
+ fromCache: boolean;
9
+ skipped: number;
10
+ };
11
+ //# sourceMappingURL=leaderboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leaderboard.d.ts","sourceRoot":"","sources":["../../../src/cli/services/leaderboard.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAoB,MAAM,gBAAgB,CAAC;AAkCzE;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,GAAE,MAAc,EACtB,KAAK,GAAE,MAAW,GACjB;IAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAwDtE"}