cc-proficiency 0.2.5 → 0.2.7

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 (87) hide show
  1. package/README.md +38 -18
  2. package/README.zh-CN.md +36 -10
  3. package/dist/cli/commands/analyze.d.ts.map +1 -1
  4. package/dist/cli/commands/analyze.js +8 -1
  5. package/dist/cli/commands/analyze.js.map +1 -1
  6. package/dist/cli/commands/badge.d.ts.map +1 -1
  7. package/dist/cli/commands/badge.js +8 -2
  8. package/dist/cli/commands/badge.js.map +1 -1
  9. package/dist/cli/commands/init.d.ts.map +1 -1
  10. package/dist/cli/commands/init.js +8 -1
  11. package/dist/cli/commands/init.js.map +1 -1
  12. package/dist/cli/commands/process.d.ts.map +1 -1
  13. package/dist/cli/commands/process.js +15 -3
  14. package/dist/cli/commands/process.js.map +1 -1
  15. package/dist/cli/commands/refresh.d.ts +7 -0
  16. package/dist/cli/commands/refresh.d.ts.map +1 -0
  17. package/dist/cli/commands/refresh.js +66 -0
  18. package/dist/cli/commands/refresh.js.map +1 -0
  19. package/dist/cli/commands/update.d.ts +2 -0
  20. package/dist/cli/commands/update.d.ts.map +1 -0
  21. package/dist/cli/commands/update.js +40 -0
  22. package/dist/cli/commands/update.js.map +1 -0
  23. package/dist/cli/index.js +11 -14
  24. package/dist/cli/index.js.map +1 -1
  25. package/dist/cli/services/hooks.d.ts.map +1 -1
  26. package/dist/cli/services/hooks.js +36 -18
  27. package/dist/cli/services/hooks.js.map +1 -1
  28. package/dist/cli/services/publishing.d.ts +1 -1
  29. package/dist/cli/services/publishing.d.ts.map +1 -1
  30. package/dist/cli/services/publishing.js +31 -7
  31. package/dist/cli/services/publishing.js.map +1 -1
  32. package/dist/cli/services/self-update.d.ts +14 -0
  33. package/dist/cli/services/self-update.d.ts.map +1 -0
  34. package/dist/cli/services/self-update.js +45 -0
  35. package/dist/cli/services/self-update.js.map +1 -0
  36. package/dist/cli/services/sessions.d.ts +1 -0
  37. package/dist/cli/services/sessions.d.ts.map +1 -1
  38. package/dist/cli/services/sessions.js +12 -1
  39. package/dist/cli/services/sessions.js.map +1 -1
  40. package/dist/cli/utils/formatting.d.ts +2 -2
  41. package/dist/cli/utils/formatting.d.ts.map +1 -1
  42. package/dist/cli/utils/formatting.js +5 -1
  43. package/dist/cli/utils/formatting.js.map +1 -1
  44. package/dist/cli/utils/update-check.d.ts +2 -0
  45. package/dist/cli/utils/update-check.d.ts.map +1 -1
  46. package/dist/cli/utils/update-check.js +3 -1
  47. package/dist/cli/utils/update-check.js.map +1 -1
  48. package/dist/cli/utils/version.d.ts +2 -0
  49. package/dist/cli/utils/version.d.ts.map +1 -0
  50. package/dist/cli/utils/version.js +16 -0
  51. package/dist/cli/utils/version.js.map +1 -0
  52. package/dist/hooks/token-refresh.js +72 -0
  53. package/dist/index.d.ts +2 -1
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +3 -1
  56. package/dist/index.js.map +1 -1
  57. package/dist/parsers/transcript-parser.d.ts.map +1 -1
  58. package/dist/parsers/transcript-parser.js +10 -0
  59. package/dist/parsers/transcript-parser.js.map +1 -1
  60. package/dist/renderer/animated-svg.d.ts +9 -0
  61. package/dist/renderer/animated-svg.d.ts.map +1 -0
  62. package/dist/renderer/animated-svg.js +125 -0
  63. package/dist/renderer/animated-svg.js.map +1 -0
  64. package/dist/renderer/svg.d.ts +33 -5
  65. package/dist/renderer/svg.d.ts.map +1 -1
  66. package/dist/renderer/svg.js +77 -57
  67. package/dist/renderer/svg.js.map +1 -1
  68. package/dist/store/config-sync.d.ts +36 -0
  69. package/dist/store/config-sync.d.ts.map +1 -0
  70. package/dist/store/config-sync.js +161 -0
  71. package/dist/store/config-sync.js.map +1 -0
  72. package/dist/store/local-store.d.ts +4 -1
  73. package/dist/store/local-store.d.ts.map +1 -1
  74. package/dist/store/local-store.js +53 -0
  75. package/dist/store/local-store.js.map +1 -1
  76. package/dist/store/remote-store.d.ts +8 -1
  77. package/dist/store/remote-store.d.ts.map +1 -1
  78. package/dist/store/remote-store.js +32 -4
  79. package/dist/store/remote-store.js.map +1 -1
  80. package/dist/types.d.ts +23 -0
  81. package/dist/types.d.ts.map +1 -1
  82. package/dist/utils/format.d.ts +6 -0
  83. package/dist/utils/format.d.ts.map +1 -0
  84. package/dist/utils/format.js +15 -0
  85. package/dist/utils/format.js.map +1 -0
  86. package/hooks/token-refresh.ts +75 -0
  87. package/package.json +1 -1
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Stop hook for token refresh.
5
+ * Checks if badge is stale (>30 min) and spawns a lightweight refresh.
6
+ * Must exit 0 in <1 second.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ const node_child_process_1 = require("node:child_process");
10
+ const node_path_1 = require("node:path");
11
+ const node_os_1 = require("node:os");
12
+ const node_fs_1 = require("node:fs");
13
+ const STORE_DIR = (0, node_path_1.join)((0, node_os_1.homedir)(), ".cc-proficiency");
14
+ const BADGE_FILE = (0, node_path_1.join)(STORE_DIR, "cc-proficiency.svg");
15
+ const HOOK_LOG = (0, node_path_1.join)(STORE_DIR, "hook.log");
16
+ const MAX_LOG_SIZE = 500_000;
17
+ const STALE_MS = 30 * 60 * 1000; // 30 minutes
18
+ function log(msg) {
19
+ try {
20
+ if (!(0, node_fs_1.existsSync)(STORE_DIR))
21
+ (0, node_fs_1.mkdirSync)(STORE_DIR, { recursive: true });
22
+ if ((0, node_fs_1.existsSync)(HOOK_LOG)) {
23
+ try {
24
+ if ((0, node_fs_1.statSync)(HOOK_LOG).size > MAX_LOG_SIZE)
25
+ (0, node_fs_1.writeFileSync)(HOOK_LOG, "", "utf-8");
26
+ }
27
+ catch { /* ignore */ }
28
+ }
29
+ const ts = new Date().toISOString();
30
+ (0, node_fs_1.appendFileSync)(HOOK_LOG, `[${ts}] ${msg}\n`, "utf-8");
31
+ }
32
+ catch { /* logging must never crash the hook */ }
33
+ }
34
+ // CI/CD detection — skip if non-interactive
35
+ // Duplicated from src/utils/ci-detect.ts — keep in sync
36
+ const CI_VARS = ["CI", "GITHUB_ACTIONS", "GITLAB_CI", "CODESPACES", "BUILDKITE", "CIRCLECI", "TRAVIS"];
37
+ if (CI_VARS.some((v) => process.env[v] === "true") || process.env.JENKINS_URL) {
38
+ process.exit(0);
39
+ }
40
+ // Read stdin (hook payload — consumed but not used for refresh)
41
+ process.stdin.setEncoding("utf-8");
42
+ process.stdin.on("data", () => { });
43
+ process.stdin.on("end", () => {
44
+ try {
45
+ // Check badge file staleness (mtime reflects actual render time)
46
+ if (!(0, node_fs_1.existsSync)(BADGE_FILE)) {
47
+ process.exit(0);
48
+ }
49
+ const age = Date.now() - (0, node_fs_1.statSync)(BADGE_FILE).mtimeMs;
50
+ if (age < STALE_MS) {
51
+ process.exit(0); // not stale
52
+ }
53
+ // Badge is stale — spawn refresh
54
+ const processorPath = (0, node_path_1.join)(__dirname, "..", "cli", "index.js");
55
+ if ((0, node_fs_1.existsSync)(processorPath)) {
56
+ const child = (0, node_child_process_1.spawn)("node", [processorPath, "refresh"], {
57
+ detached: true,
58
+ stdio: "ignore",
59
+ });
60
+ child.unref();
61
+ log(`REFRESH: badge stale (${Math.round(age / 60000)}m), spawned pid=${child.pid}`);
62
+ }
63
+ }
64
+ catch (err) {
65
+ log(`REFRESH-ERROR: ${err}`);
66
+ }
67
+ process.exit(0);
68
+ });
69
+ // Timeout safety
70
+ setTimeout(() => {
71
+ process.exit(0);
72
+ }, 4000);
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export type { ProficiencyResult, DomainScore, ExtractedSignals, SetupChecklist, FeatureInventory, CCProficiencyConfig, LocalStore, SessionSnapshot, QueueEntry, } from "./types.js";
1
+ export type { ProficiencyResult, DomainScore, ExtractedSignals, SetupChecklist, FeatureInventory, CCProficiencyConfig, LocalStore, SessionSnapshot, QueueEntry, TokenLogEntry, TokenWindows, } from "./types.js";
2
2
  export { parseTranscript, sanitizeProjectSlug } from "./parsers/transcript-parser.js";
3
3
  export { normalizeEntry } from "./parsers/normalizer.js";
4
4
  export { parseClaudeConfig, buildSetupChecklist } from "./parsers/config-parser.js";
@@ -10,4 +10,5 @@ export { RULES } from "./scoring/rules.js";
10
10
  export { computeFeatureDepthScores } from "./scoring/feature-scores.js";
11
11
  export { logCurve, cappedRatio, binary, ratioToScore, weightedSum } from "./scoring/curves.js";
12
12
  export { isCIEnvironment } from "./utils/ci-detect.js";
13
+ export { formatTokens } from "./utils/format.js";
13
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,EACV,eAAe,EACf,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,QAAQ,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC9I,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,EACV,eAAe,EACf,UAAU,EACV,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,QAAQ,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC9I,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isCIEnvironment = exports.weightedSum = exports.ratioToScore = exports.binary = exports.cappedRatio = exports.logCurve = exports.computeFeatureDepthScores = exports.RULES = exports.extractFeatureScores = exports.bucketsToScores = exports.aggregateToBuckets = exports.fireRules = exports.SCORING_VERSION = exports.getRecencyWeight = exports.getConfidence = exports.getPhase = exports.extractFeatureInventory = exports.computeProficiency = exports.extractSignals = exports.parseHistory = exports.buildSetupChecklist = exports.parseClaudeConfig = exports.normalizeEntry = exports.sanitizeProjectSlug = exports.parseTranscript = void 0;
3
+ exports.formatTokens = exports.isCIEnvironment = exports.weightedSum = exports.ratioToScore = exports.binary = exports.cappedRatio = exports.logCurve = exports.computeFeatureDepthScores = exports.RULES = exports.extractFeatureScores = exports.bucketsToScores = exports.aggregateToBuckets = exports.fireRules = exports.SCORING_VERSION = exports.getRecencyWeight = exports.getConfidence = exports.getPhase = exports.extractFeatureInventory = exports.computeProficiency = exports.extractSignals = exports.parseHistory = exports.buildSetupChecklist = exports.parseClaudeConfig = exports.normalizeEntry = exports.sanitizeProjectSlug = exports.parseTranscript = void 0;
4
4
  var transcript_parser_js_1 = require("./parsers/transcript-parser.js");
5
5
  Object.defineProperty(exports, "parseTranscript", { enumerable: true, get: function () { return transcript_parser_js_1.parseTranscript; } });
6
6
  Object.defineProperty(exports, "sanitizeProjectSlug", { enumerable: true, get: function () { return transcript_parser_js_1.sanitizeProjectSlug; } });
@@ -37,4 +37,6 @@ Object.defineProperty(exports, "ratioToScore", { enumerable: true, get: function
37
37
  Object.defineProperty(exports, "weightedSum", { enumerable: true, get: function () { return curves_js_1.weightedSum; } });
38
38
  var ci_detect_js_1 = require("./utils/ci-detect.js");
39
39
  Object.defineProperty(exports, "isCIEnvironment", { enumerable: true, get: function () { return ci_detect_js_1.isCIEnvironment; } });
40
+ var format_js_1 = require("./utils/format.js");
41
+ Object.defineProperty(exports, "formatTokens", { enumerable: true, get: function () { return format_js_1.formatTokens; } });
40
42
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAYA,uEAAsF;AAA7E,uHAAA,eAAe,OAAA;AAAE,2HAAA,mBAAmB,OAAA;AAC7C,yDAAyD;AAAhD,+GAAA,cAAc,OAAA;AACvB,+DAAoF;AAA3E,qHAAA,iBAAiB,OAAA;AAAE,uHAAA,mBAAmB,OAAA;AAC/C,iEAA2D;AAAlD,iHAAA,YAAY,OAAA;AACrB,mDAAsD;AAA7C,4GAAA,cAAc,OAAA;AACvB,iDAA8I;AAArI,+GAAA,kBAAkB,OAAA;AAAE,oHAAA,uBAAuB,OAAA;AAAE,qGAAA,QAAQ,OAAA;AAAE,0GAAA,aAAa,OAAA;AAAE,6GAAA,gBAAgB,OAAA;AAAE,4GAAA,eAAe,OAAA;AAChH,2DAAgH;AAAvG,2GAAA,SAAS,OAAA;AAAE,oHAAA,kBAAkB,OAAA;AAAE,iHAAA,eAAe,OAAA;AAAE,sHAAA,oBAAoB,OAAA;AAC7E,+CAA2C;AAAlC,iGAAA,KAAK,OAAA;AACd,iEAAwE;AAA/D,8HAAA,yBAAyB,OAAA;AAClC,iDAA+F;AAAtF,qGAAA,QAAQ,OAAA;AAAE,wGAAA,WAAW,OAAA;AAAE,mGAAA,MAAM,OAAA;AAAE,yGAAA,YAAY,OAAA;AAAE,wGAAA,WAAW,OAAA;AACjE,qDAAuD;AAA9C,+GAAA,eAAe,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAcA,uEAAsF;AAA7E,uHAAA,eAAe,OAAA;AAAE,2HAAA,mBAAmB,OAAA;AAC7C,yDAAyD;AAAhD,+GAAA,cAAc,OAAA;AACvB,+DAAoF;AAA3E,qHAAA,iBAAiB,OAAA;AAAE,uHAAA,mBAAmB,OAAA;AAC/C,iEAA2D;AAAlD,iHAAA,YAAY,OAAA;AACrB,mDAAsD;AAA7C,4GAAA,cAAc,OAAA;AACvB,iDAA8I;AAArI,+GAAA,kBAAkB,OAAA;AAAE,oHAAA,uBAAuB,OAAA;AAAE,qGAAA,QAAQ,OAAA;AAAE,0GAAA,aAAa,OAAA;AAAE,6GAAA,gBAAgB,OAAA;AAAE,4GAAA,eAAe,OAAA;AAChH,2DAAgH;AAAvG,2GAAA,SAAS,OAAA;AAAE,oHAAA,kBAAkB,OAAA;AAAE,iHAAA,eAAe,OAAA;AAAE,sHAAA,oBAAoB,OAAA;AAC7E,+CAA2C;AAAlC,iGAAA,KAAK,OAAA;AACd,iEAAwE;AAA/D,8HAAA,yBAAyB,OAAA;AAClC,iDAA+F;AAAtF,qGAAA,QAAQ,OAAA;AAAE,wGAAA,WAAW,OAAA;AAAE,mGAAA,MAAM,OAAA;AAAE,yGAAA,YAAY,OAAA;AAAE,wGAAA,WAAW,OAAA;AACjE,qDAAuD;AAA9C,+GAAA,eAAe,OAAA;AACxB,+CAAiD;AAAxC,yGAAA,YAAY,OAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"transcript-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/transcript-parser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAsB,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGtF;;;GAGG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAmD9E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAmBxE;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAoB1E"}
1
+ {"version":3,"file":"transcript-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/transcript-parser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAsB,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGtF;;;GAGG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA8D9E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAmBxE;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAoB1E"}
@@ -18,6 +18,7 @@ async function parseTranscript(filePath) {
18
18
  let project = "";
19
19
  let firstTimestamp = "";
20
20
  let lastTimestamp = "";
21
+ let totalTokens = 0;
21
22
  const rl = (0, node_readline_1.createInterface)({
22
23
  input: (0, node_fs_1.createReadStream)(filePath, { encoding: "utf-8" }),
23
24
  crlfDelay: Infinity,
@@ -43,6 +44,14 @@ async function parseTranscript(filePath) {
43
44
  if (raw.timestamp) {
44
45
  lastTimestamp = raw.timestamp;
45
46
  }
47
+ // Sum token usage from assistant messages
48
+ if (raw.type === "assistant" && raw.message?.usage) {
49
+ const u = raw.message.usage;
50
+ totalTokens += (u.input_tokens ?? 0)
51
+ + (u.cache_creation_input_tokens ?? 0)
52
+ + (u.cache_read_input_tokens ?? 0)
53
+ + (u.output_tokens ?? 0);
54
+ }
46
55
  const normalized = (0, normalizer_js_1.normalizeEntry)(raw);
47
56
  events.push(...normalized);
48
57
  }
@@ -57,6 +66,7 @@ async function parseTranscript(filePath) {
57
66
  project,
58
67
  events,
59
68
  version,
69
+ totalTokens,
60
70
  };
61
71
  }
62
72
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"transcript-parser.js","sourceRoot":"","sources":["../../src/parsers/transcript-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transcript-parser.js","sourceRoot":"","sources":["../../src/parsers/transcript-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ProficiencyResult, TokenWindows } from "../types.js";
2
+ import { type Locale } from "../i18n/locales.js";
3
+ export declare function renderAnimatedFullBadge(result: ProficiencyResult, locale?: Locale, tokenWindows?: TokenWindows): string;
4
+ /**
5
+ * Render animated badge. Falls back to static calibrating badge
6
+ * (no animation needed for the calibrating phase).
7
+ */
8
+ export declare function renderAnimatedBadge(result: ProficiencyResult, locale?: Locale, tokenWindows?: TokenWindows): string;
9
+ //# sourceMappingURL=animated-svg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animated-svg.d.ts","sourceRoot":"","sources":["../../src/renderer/animated-svg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAe,YAAY,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAa,KAAK,MAAM,EAAsB,MAAM,oBAAoB,CAAC;AAwFhF,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAE,MAAa,EAAE,YAAY,CAAC,EAAE,YAAY,GAAG,MAAM,CAiD7H;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAE,MAAa,EAAE,YAAY,CAAC,EAAE,YAAY,GAAG,MAAM,CAKzH"}
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderAnimatedFullBadge = renderAnimatedFullBadge;
4
+ exports.renderAnimatedBadge = renderAnimatedBadge;
5
+ const locales_js_1 = require("../i18n/locales.js");
6
+ const svg_js_1 = require("./svg.js");
7
+ const format_js_1 = require("../utils/format.js");
8
+ // ── Animation timing ──
9
+ const BAR_DUR = "1s";
10
+ const BAR_EASING = `calcMode="spline" keySplines="0.25 0.1 0.25 1"`;
11
+ const FADE_DUR = "0.25s";
12
+ function barDelay(i) {
13
+ return (0.3 + i * 0.2).toFixed(1);
14
+ }
15
+ function numberDelay(i) {
16
+ return (0.3 + i * 0.2 + 0.8).toFixed(1);
17
+ }
18
+ // ── Animated domain row ──
19
+ function renderAnimatedDomainRow(d, y, i, t) {
20
+ const label = (0, svg_js_1.escapeXml)((0, svg_js_1.domainLabel)(d.id, t));
21
+ const color = svg_js_1.DOMAIN_COLORS[d.id] ?? svg_js_1.C.textDim;
22
+ const barWidth = 220;
23
+ const filledWidth = Math.round((d.score / 100) * barWidth);
24
+ const bDelay = barDelay(i);
25
+ const nDelay = numberDelay(i);
26
+ return `<g transform="translate(25, ${y})">
27
+ <text x="0" y="14" fill="${svg_js_1.C.textDim}" font-size="13" font-family="${svg_js_1.SANS}" font-weight="500">${label}</text>
28
+ <g transform="translate(120, 3)">
29
+ <rect width="${barWidth}" height="12" rx="6" fill="${svg_js_1.C.barBg}" opacity="0.5"/>
30
+ <rect width="0" height="12" rx="6" fill="${color}" filter="url(#glow)">
31
+ <animate attributeName="width" from="0" to="${filledWidth}" dur="${BAR_DUR}" begin="${bDelay}s" fill="freeze" ${BAR_EASING}/>
32
+ </rect>
33
+ </g>
34
+ <text x="${120 + barWidth + 10}" y="14" fill="${svg_js_1.C.text}" font-size="14" font-family="${svg_js_1.MONO}" font-weight="700" opacity="0">${d.score}<animate attributeName="opacity" from="0" to="1" dur="${FADE_DUR}" begin="${nDelay}s" fill="freeze"/></text>
35
+ <text x="${120 + barWidth + 42}" y="14" fill="${color}" font-size="12" font-family="${svg_js_1.MONO}" opacity="0">${(0, svg_js_1.confidenceSymbol)(d.confidence)}<animate attributeName="opacity" from="0" to="1" dur="${FADE_DUR}" begin="${nDelay}s" fill="freeze"/></text>
36
+ </g>`;
37
+ }
38
+ // ── Animated mini-bar grid ──
39
+ function renderAnimatedMiniBarGrid(featureScores, y, baseDelay, t) {
40
+ const scores = featureScores ?? {};
41
+ const totalFeatures = svg_js_1.MINI_BAR_KEYS.length;
42
+ const gap = 4;
43
+ const startX = 25;
44
+ const availableWidth = 445;
45
+ const colWidth = Math.floor((availableWidth - gap * (totalFeatures - 1)) / totalFeatures);
46
+ const barHeight = 24;
47
+ const lines = [];
48
+ for (let i = 0; i < totalFeatures; i++) {
49
+ const feat = svg_js_1.MINI_BAR_KEYS[i];
50
+ const score = scores[feat.key] ?? 0;
51
+ const label = (0, svg_js_1.escapeXml)(String(t[feat.localeKey]));
52
+ const x = startX + i * (colWidth + gap);
53
+ const fillColor = (0, svg_js_1.miniBarColor)(score, feat.color);
54
+ const opacity = (0, svg_js_1.miniBarOpacity)(score);
55
+ const fadeDelay = (baseDelay + i * 0.06).toFixed(2);
56
+ lines.push(`<g transform="translate(${x}, ${y})" opacity="0">`);
57
+ lines.push(` <animate attributeName="opacity" from="0" to="1" dur="0.3s" begin="${fadeDelay}s" fill="freeze"/>`);
58
+ lines.push(` <rect width="${colWidth}" height="${barHeight}" rx="4" fill="${fillColor}" opacity="${opacity}"/>`);
59
+ lines.push(` <text x="${colWidth / 2}" y="${barHeight / 2 + 1}" fill="${score > 0 ? '#fff' : svg_js_1.C.textMuted}" font-size="10" font-family="${svg_js_1.MONO}" font-weight="600" text-anchor="middle" dominant-baseline="middle">${score}</text>`);
60
+ lines.push(` <text x="${colWidth / 2}" y="${barHeight + 13}" fill="${svg_js_1.C.textMuted}" font-size="9" font-family="${svg_js_1.SANS}" text-anchor="middle">${label}</text>`);
61
+ lines.push(`</g>`);
62
+ }
63
+ return lines.join("\n");
64
+ }
65
+ // ── Full animated badge ──
66
+ function hasTokens(tw) {
67
+ return tw != null && (tw.tokens24h > 0 || tw.tokens30d > 0);
68
+ }
69
+ function renderAnimatedFullBadge(result, locale = "en", tokenWindows) {
70
+ const t = (0, locales_js_1.getLocale)(locale);
71
+ const width = 495;
72
+ const rows = result.domains.length;
73
+ const separatorY = 62 + rows * 28 + 6;
74
+ const miniBarY = separatorY + 14;
75
+ const footerY = miniBarY + svg_js_1.MINI_BAR_SECTION_HEIGHT + 6;
76
+ const showTokens = hasTokens(tokenWindows);
77
+ const tokenOffset = showTokens ? 16 : 0;
78
+ const height = footerY + 40 + tokenOffset;
79
+ const u = (0, svg_js_1.escapeXml)(result.username);
80
+ // Timing: last domain bar finishes at barDelay(rows-1) + 1.0s
81
+ const lastBarEnd = parseFloat(numberDelay(rows - 1));
82
+ const miniDelay = lastBarEnd + 0.3;
83
+ const footerDelay = (miniDelay + 0.6).toFixed(1);
84
+ const footerDelay2 = (miniDelay + 0.8).toFixed(1);
85
+ const domainSvg = result.domains
86
+ .map((d, i) => renderAnimatedDomainRow(d, 62 + i * 28, i, t))
87
+ .join("\n");
88
+ const phaseLabel = result.phase === "early"
89
+ ? `<text x="${width - 25}" y="${footerY + 16}" fill="#d29922" font-size="10" font-family="${svg_js_1.MONO}" text-anchor="end" opacity="0">${(0, svg_js_1.escapeXml)(t.earlyResults)}<animate attributeName="opacity" from="0" to="1" dur="${FADE_DUR}" begin="${footerDelay}s" fill="freeze"/></text>`
90
+ : "";
91
+ return `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="0 0 ${width} ${height}" role="img" aria-labelledby="cc-title cc-desc">
92
+ <title id="cc-title">${(0, svg_js_1.escapeXml)(t.title)} \u2014 @${u}</title>
93
+ <desc id="cc-desc">${result.sessionCount} ${(0, svg_js_1.escapeXml)(t.sessions)}, ${result.projectCount} ${(0, svg_js_1.escapeXml)(t.projects)}</desc>
94
+ ${(0, svg_js_1.svgDefs)()}
95
+ <rect width="${width}" height="${height}" rx="12" fill="${svg_js_1.C.bg}"/>
96
+ <rect x="0.5" y="0.5" width="${width - 1}" height="${height - 1}" rx="11.5" fill="${svg_js_1.C.card}" stroke="${svg_js_1.C.border}"/>
97
+ <text x="25" y="34" fill="${svg_js_1.C.text}" font-size="18" font-family="${svg_js_1.SANS}" font-weight="600">${(0, svg_js_1.escapeXml)(t.title)}</text>
98
+ <a href="https://github.com/${u}" target="_blank"><text x="${width - 25}" y="34" fill="${svg_js_1.C.textDim}" font-size="13" font-family="${svg_js_1.MONO}" text-anchor="end">@${u}</text></a>
99
+ <line x1="25" y1="48" x2="${width - 25}" y2="48" stroke="${svg_js_1.C.border}"/>
100
+
101
+ ${domainSvg}
102
+
103
+ <line x1="25" y1="${separatorY}" x2="${width - 25}" y2="${separatorY}" stroke="${svg_js_1.C.border}"/>
104
+
105
+ ${renderAnimatedMiniBarGrid(result.features.featureScores, miniBarY, miniDelay, t)}
106
+
107
+ <line x1="25" y1="${footerY}" x2="${width - 25}" y2="${footerY}" stroke="${svg_js_1.C.border}"/>
108
+ <text x="25" y="${footerY + 16}" fill="${svg_js_1.C.textMuted}" font-size="11" font-family="${svg_js_1.MONO}" opacity="0">${(0, svg_js_1.formatHours)(result.features.totalHours)} \u00B7 ${result.sessionCount} ${(0, svg_js_1.escapeXml)(t.sessions)} \u00B7 ${result.projectCount} ${(0, svg_js_1.escapeXml)(t.projects)}${result.streak ? ` \u00B7 \uD83D\uDD25 ${result.streak}d` : ""}${result.achievementCount ? ` \u00B7 \uD83C\uDFC6 ${result.achievementCount}` : ""}<animate attributeName="opacity" from="0" to="1" dur="0.4s" begin="${footerDelay}s" fill="freeze"/></text>
109
+ ${showTokens ? `<text x="25" y="${footerY + 30}" fill="${svg_js_1.C.textDim}" font-size="10" font-family="${svg_js_1.MONO}" opacity="0">tokens ${(0, format_js_1.formatTokens)(tokenWindows.tokens24h)}/24h \u00B7 ${(0, format_js_1.formatTokens)(tokenWindows.tokens30d)}/30d<animate attributeName="opacity" from="0" to="1" dur="0.4s" begin="${footerDelay}s" fill="freeze"/></text>` : ""}
110
+ <text x="25" y="${footerY + 16 + tokenOffset + 16}" fill="${svg_js_1.C.textMuted}" font-size="9" font-family="${svg_js_1.MONO}" opacity="0">${result.timestamp.slice(0, 10)}<animate attributeName="opacity" from="0" to="1" dur="0.4s" begin="${footerDelay2}s" fill="freeze"/></text>
111
+ <text x="${width - 25}" y="${footerY + 16 + tokenOffset + 16}" fill="${svg_js_1.C.textMuted}" font-size="9" font-family="${svg_js_1.MONO}" text-anchor="end" opacity="0">github.com/Z-M-Huang/cc-proficiency<animate attributeName="opacity" from="0" to="1" dur="0.4s" begin="${footerDelay2}s" fill="freeze"/></text>
112
+ ${phaseLabel}
113
+ </svg>`;
114
+ }
115
+ /**
116
+ * Render animated badge. Falls back to static calibrating badge
117
+ * (no animation needed for the calibrating phase).
118
+ */
119
+ function renderAnimatedBadge(result, locale = "en", tokenWindows) {
120
+ if (result.phase === "calibrating") {
121
+ return (0, svg_js_1.renderCalibratingBadge)(result, locale, tokenWindows);
122
+ }
123
+ return renderAnimatedFullBadge(result, locale, tokenWindows);
124
+ }
125
+ //# sourceMappingURL=animated-svg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animated-svg.js","sourceRoot":"","sources":["../../src/renderer/animated-svg.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,36 @@
1
- import type { ProficiencyResult } from "../types.js";
2
- import { type Locale } from "../i18n/locales.js";
3
- export declare function renderCalibratingBadge(result: ProficiencyResult, locale?: Locale): string;
4
- export declare function renderFullBadge(result: ProficiencyResult, locale?: Locale): string;
5
- export declare function renderBadge(result: ProficiencyResult, locale?: Locale): string;
1
+ import type { ProficiencyResult, ConfidenceLevel, TokenWindows } from "../types.js";
2
+ import { type Locale, type LocaleStrings } from "../i18n/locales.js";
3
+ export declare const C: {
4
+ bg: string;
5
+ card: string;
6
+ border: string;
7
+ text: string;
8
+ textDim: string;
9
+ textMuted: string;
10
+ barBg: string;
11
+ red: string;
12
+ green: string;
13
+ blue: string;
14
+ };
15
+ export declare const DOMAIN_COLORS: Record<string, string>;
16
+ export declare const SANS = "'Segoe UI', system-ui, -apple-system, sans-serif";
17
+ export declare const MONO = "ui-monospace, 'SF Mono', SFMono-Regular, monospace";
18
+ export declare function escapeXml(str: string): string;
19
+ export declare function confidenceSymbol(c: ConfidenceLevel): string;
20
+ export declare function svgDefs(): string;
21
+ export declare function domainLabel(id: string, t: LocaleStrings): string;
22
+ export declare function formatHours(h: number): string;
23
+ export declare const MINI_BAR_KEYS: Array<{
24
+ key: string;
25
+ localeKey: keyof LocaleStrings;
26
+ color: string;
27
+ }>;
28
+ export declare function miniBarColor(score: number, baseColor: string): string;
29
+ export declare function miniBarOpacity(score: number): string;
30
+ export declare const MINI_BAR_SECTION_HEIGHT = 42;
31
+ export declare function renderCalibratingBadge(result: ProficiencyResult, locale?: Locale, tokenWindows?: TokenWindows): string;
32
+ export declare function renderFullBadge(result: ProficiencyResult, locale?: Locale, tokenWindows?: TokenWindows): string;
33
+ export declare function renderBadge(result: ProficiencyResult, locale?: Locale, tokenWindows?: TokenWindows): string;
6
34
  export declare function getInsights(result: ProficiencyResult): {
7
35
  topStrength: string;
8
36
  nextAction: string;
@@ -1 +1 @@
1
- {"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["../../src/renderer/svg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAgC,MAAM,aAAa,CAAC;AACnF,OAAO,EAAa,KAAK,MAAM,EAAsB,MAAM,oBAAoB,CAAC;AAgIhF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAE,MAAa,GAAG,MAAM,CAgC/F;AAGD,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAE,MAAa,GAAG,MAAM,CAoCxF;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAE,MAAa,GAAG,MAAM,CAGpF;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAqBlG"}
1
+ {"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["../../src/renderer/svg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAe,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEjG,OAAO,EAAa,KAAK,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEhF,eAAO,MAAM,CAAC;;;;;;;;;;;CAWb,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMhD,CAAC;AAEF,eAAO,MAAM,IAAI,qDAAqD,CAAC;AACvE,eAAO,MAAM,IAAI,uDAAuD,CAAC;AAEzE,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CAM3D;AAED,wBAAgB,OAAO,IAAI,MAAM,CAIhC;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,GAAG,MAAM,CAOhE;AAgBD,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG7C;AAID,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAS/F,CAAC;AAEF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGrE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKpD;AA8BD,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAW1C,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAE,MAAa,EAAE,YAAY,CAAC,EAAE,YAAY,GAAG,MAAM,CAkC5H;AAGD,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAE,MAAa,EAAE,YAAY,CAAC,EAAE,YAAY,GAAG,MAAM,CAuCrH;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAE,MAAa,EAAE,YAAY,CAAC,EAAE,YAAY,GAAG,MAAM,CAGjH;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAqBlG"}