cc-proficiency 0.2.3 → 0.2.4

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 (84) hide show
  1. package/README.md +2 -0
  2. package/dist/cli/commands/achievements.d.ts +2 -0
  3. package/dist/cli/commands/achievements.d.ts.map +1 -0
  4. package/dist/cli/commands/achievements.js +51 -0
  5. package/dist/cli/commands/achievements.js.map +1 -0
  6. package/dist/cli/commands/analyze.d.ts +2 -0
  7. package/dist/cli/commands/analyze.d.ts.map +1 -0
  8. package/dist/cli/commands/analyze.js +27 -0
  9. package/dist/cli/commands/analyze.js.map +1 -0
  10. package/dist/cli/commands/badge.d.ts +2 -0
  11. package/dist/cli/commands/badge.d.ts.map +1 -0
  12. package/dist/cli/commands/badge.js +25 -0
  13. package/dist/cli/commands/badge.js.map +1 -0
  14. package/dist/cli/commands/config.d.ts +2 -0
  15. package/dist/cli/commands/config.d.ts.map +1 -0
  16. package/dist/cli/commands/config.js +39 -0
  17. package/dist/cli/commands/config.js.map +1 -0
  18. package/dist/cli/commands/explain.d.ts +2 -0
  19. package/dist/cli/commands/explain.d.ts.map +1 -0
  20. package/dist/cli/commands/explain.js +44 -0
  21. package/dist/cli/commands/explain.js.map +1 -0
  22. package/dist/cli/commands/init.d.ts +2 -0
  23. package/dist/cli/commands/init.d.ts.map +1 -0
  24. package/dist/cli/commands/init.js +63 -0
  25. package/dist/cli/commands/init.js.map +1 -0
  26. package/dist/cli/commands/process.d.ts +2 -0
  27. package/dist/cli/commands/process.d.ts.map +1 -0
  28. package/dist/cli/commands/process.js +76 -0
  29. package/dist/cli/commands/process.js.map +1 -0
  30. package/dist/cli/commands/push.d.ts +2 -0
  31. package/dist/cli/commands/push.d.ts.map +1 -0
  32. package/dist/cli/commands/push.js +8 -0
  33. package/dist/cli/commands/push.js.map +1 -0
  34. package/dist/cli/commands/status.d.ts +2 -0
  35. package/dist/cli/commands/status.d.ts.map +1 -0
  36. package/dist/cli/commands/status.js +53 -0
  37. package/dist/cli/commands/status.js.map +1 -0
  38. package/dist/cli/commands/uninstall.d.ts +2 -0
  39. package/dist/cli/commands/uninstall.d.ts.map +1 -0
  40. package/dist/cli/commands/uninstall.js +27 -0
  41. package/dist/cli/commands/uninstall.js.map +1 -0
  42. package/dist/cli/index.d.ts +3 -0
  43. package/dist/cli/index.d.ts.map +1 -0
  44. package/dist/cli/index.js +86 -0
  45. package/dist/cli/index.js.map +1 -0
  46. package/dist/cli/services/hooks.d.ts +3 -0
  47. package/dist/cli/services/hooks.d.ts.map +1 -0
  48. package/dist/cli/services/hooks.js +68 -0
  49. package/dist/cli/services/hooks.js.map +1 -0
  50. package/dist/cli/services/publishing.d.ts +2 -0
  51. package/dist/cli/services/publishing.d.ts.map +1 -0
  52. package/dist/cli/services/publishing.js +87 -0
  53. package/dist/cli/services/publishing.js.map +1 -0
  54. package/dist/cli/services/sessions.d.ts +11 -0
  55. package/dist/cli/services/sessions.d.ts.map +1 -0
  56. package/dist/cli/services/sessions.js +78 -0
  57. package/dist/cli/services/sessions.js.map +1 -0
  58. package/dist/cli/utils/formatting.d.ts +5 -0
  59. package/dist/cli/utils/formatting.d.ts.map +1 -0
  60. package/dist/cli/utils/formatting.js +64 -0
  61. package/dist/cli/utils/formatting.js.map +1 -0
  62. package/dist/cli/utils/locale.d.ts +3 -0
  63. package/dist/cli/utils/locale.d.ts.map +1 -0
  64. package/dist/cli/utils/locale.js +14 -0
  65. package/dist/cli/utils/locale.js.map +1 -0
  66. package/dist/hooks/session-end.js +3 -2
  67. package/dist/parsers/config-parser.d.ts.map +1 -1
  68. package/dist/parsers/config-parser.js +170 -164
  69. package/dist/parsers/config-parser.js.map +1 -1
  70. package/dist/scoring/engine.d.ts.map +1 -1
  71. package/dist/scoring/engine.js.map +1 -1
  72. package/dist/scoring/rule-engine.d.ts.map +1 -1
  73. package/dist/scoring/rule-engine.js.map +1 -1
  74. package/dist/scoring/signals.js +2 -2
  75. package/dist/scoring/signals.js.map +1 -1
  76. package/dist/store/local-store.d.ts.map +1 -1
  77. package/dist/store/remote-store.d.ts.map +1 -1
  78. package/hooks/session-end.ts +4 -3
  79. package/package.json +8 -3
  80. package/dist/cli.d.ts +0 -3
  81. package/dist/cli.d.ts.map +0 -1
  82. package/dist/cli.js +0 -722
  83. package/dist/cli.js.map +0 -1
  84. package/skills/proficiency/SKILL.md +0 -15
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const node_fs_1 = require("node:fs");
5
+ const node_path_1 = require("node:path");
6
+ const engine_js_1 = require("../scoring/engine.js");
7
+ const init_js_1 = require("./commands/init.js");
8
+ const analyze_js_1 = require("./commands/analyze.js");
9
+ const process_js_1 = require("./commands/process.js");
10
+ const badge_js_1 = require("./commands/badge.js");
11
+ const push_js_1 = require("./commands/push.js");
12
+ const explain_js_1 = require("./commands/explain.js");
13
+ const achievements_js_1 = require("./commands/achievements.js");
14
+ const status_js_1 = require("./commands/status.js");
15
+ const config_js_1 = require("./commands/config.js");
16
+ 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
+ }
27
+ function printUsage() {
28
+ console.log(`
29
+ cc-proficiency \u2014 Claude Code Proficiency Badge Generator
30
+
31
+ Commands:
32
+ init Set up configuration and hooks
33
+ analyze [--full] Analyze sessions and compute scores
34
+ process Process queued sessions from hook
35
+ badge [--output <f>] Generate SVG badge
36
+ push Upload badge to GitHub Gist
37
+ explain Show score drivers and improvement tips
38
+ status Show hook activity, queue, and config
39
+ config [key] [value] View or set configuration
40
+ uninstall Remove hooks and clean up
41
+ version Show version info
42
+
43
+ Examples:
44
+ cc-proficiency init
45
+ cc-proficiency analyze --full
46
+ cc-proficiency badge --output badge.svg
47
+ cc-proficiency explain
48
+ `);
49
+ }
50
+ async function main() {
51
+ const args = process.argv.slice(2);
52
+ const command = args[0];
53
+ switch (command) {
54
+ case "init":
55
+ return await (0, init_js_1.cmdInit)();
56
+ case "analyze":
57
+ return (0, analyze_js_1.cmdAnalyze)(args);
58
+ case "process":
59
+ return (0, process_js_1.cmdProcess)();
60
+ case "badge":
61
+ return (0, badge_js_1.cmdBadge)(args);
62
+ case "push":
63
+ return (0, push_js_1.cmdPush)();
64
+ case "explain":
65
+ return (0, explain_js_1.cmdExplain)();
66
+ case "achievements":
67
+ return (0, achievements_js_1.cmdAchievements)();
68
+ case "status":
69
+ return (0, status_js_1.cmdStatus)();
70
+ case "config":
71
+ return (0, config_js_1.cmdConfig)(args.slice(1));
72
+ case "uninstall":
73
+ return (0, uninstall_js_1.cmdUninstall)();
74
+ case "version":
75
+ console.log(`cc-proficiency v${getVersion()} (scoring ${engine_js_1.SCORING_VERSION})`);
76
+ return;
77
+ default:
78
+ printUsage();
79
+ return;
80
+ }
81
+ }
82
+ main().catch((err) => {
83
+ console.error("Error:", err);
84
+ process.exit(1);
85
+ });
86
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"}
@@ -0,0 +1,3 @@
1
+ export declare function injectHook(): void;
2
+ export declare function removeHook(): void;
3
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.injectHook = injectHook;
4
+ exports.removeHook = removeHook;
5
+ const node_fs_1 = require("node:fs");
6
+ const node_path_1 = require("node:path");
7
+ const node_os_1 = require("node:os");
8
+ const CLAUDE_DIR = (0, node_path_1.join)((0, node_os_1.homedir)(), ".claude");
9
+ function injectHook() {
10
+ const settingsPath = (0, node_path_1.join)(CLAUDE_DIR, "settings.json");
11
+ let settings = {};
12
+ if ((0, node_fs_1.existsSync)(settingsPath)) {
13
+ try {
14
+ settings = JSON.parse((0, node_fs_1.readFileSync)(settingsPath, "utf-8"));
15
+ }
16
+ catch {
17
+ console.log(" \u26A0 Could not parse settings.json, creating new hooks section");
18
+ }
19
+ }
20
+ const hooks = (settings.hooks ?? {});
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
+ if (!(0, node_fs_1.existsSync)(CLAUDE_DIR)) {
28
+ (0, node_fs_1.mkdirSync)(CLAUDE_DIR, { recursive: true });
29
+ }
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
+ });
42
+ hooks.Stop = stopHooks;
43
+ settings.hooks = hooks;
44
+ (0, node_fs_1.writeFileSync)(settingsPath, JSON.stringify(settings, null, 2), "utf-8");
45
+ }
46
+ function removeHook() {
47
+ const settingsPath = (0, node_path_1.join)(CLAUDE_DIR, "settings.json");
48
+ if (!(0, node_fs_1.existsSync)(settingsPath))
49
+ return;
50
+ try {
51
+ const settings = JSON.parse((0, node_fs_1.readFileSync)(settingsPath, "utf-8"));
52
+ if (settings.hooks?.Stop) {
53
+ settings.hooks.Stop = settings.hooks.Stop.filter((group) => !group.hooks?.some((h) => h.command?.includes("cc-proficiency")));
54
+ if (settings.hooks.Stop.length === 0) {
55
+ delete settings.hooks.Stop;
56
+ }
57
+ if (Object.keys(settings.hooks).length === 0) {
58
+ delete settings.hooks;
59
+ }
60
+ (0, node_fs_1.writeFileSync)(settingsPath, JSON.stringify(settings, null, 2), "utf-8");
61
+ console.log(" \u2713 Hook removed from settings.json");
62
+ }
63
+ }
64
+ catch {
65
+ console.log(" \u26A0 Could not update settings.json");
66
+ }
67
+ }
68
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/cli/services/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function pushToGist(): void;
2
+ //# sourceMappingURL=publishing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publishing.d.ts","sourceRoot":"","sources":["../../../src/cli/services/publishing.ts"],"names":[],"mappings":"AAQA,wBAAgB,UAAU,IAAI,IAAI,CAoFjC"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pushToGist = pushToGist;
4
+ const svg_js_1 = require("../../renderer/svg.js");
5
+ const local_store_js_1 = require("../../store/local-store.js");
6
+ const uploader_js_1 = require("../../gist/uploader.js");
7
+ const remote_store_js_1 = require("../../store/remote-store.js");
8
+ const achievements_js_1 = require("../../store/achievements.js");
9
+ const locale_js_1 = require("../utils/locale.js");
10
+ function pushToGist() {
11
+ const config = (0, local_store_js_1.loadConfig)();
12
+ const store = (0, local_store_js_1.loadStore)();
13
+ if (!store.lastResult) {
14
+ console.log("No analysis data. Run 'cc-proficiency analyze' first.");
15
+ return;
16
+ }
17
+ const svg = (0, svg_js_1.renderBadge)(store.lastResult, (0, locale_js_1.getConfigLocale)());
18
+ (0, local_store_js_1.saveBadge)(svg);
19
+ if (!(0, uploader_js_1.isGhAuthenticated)() || !config.gistId) {
20
+ if (!(0, uploader_js_1.isGhAuthenticated)()) {
21
+ console.log("\u26A0 GitHub CLI not authenticated.");
22
+ console.log("To enable: gh auth login && cc-proficiency init");
23
+ }
24
+ if (!config.gistId) {
25
+ console.log("No Gist configured. Run 'cc-proficiency init' first.");
26
+ }
27
+ console.log("Badge saved locally to: " + (0, local_store_js_1.getBadgePath)());
28
+ return;
29
+ }
30
+ const remoteJson = (0, uploader_js_1.readGistFile)(config.gistId, "cc-proficiency.json");
31
+ let remote = remoteJson ? (0, remote_store_js_1.parseRemoteStore)(remoteJson) : null;
32
+ if (!remote)
33
+ remote = (0, remote_store_js_1.emptyRemoteStore)(config.username ?? "unknown");
34
+ const avgHours = store.lastResult.features.totalHours / Math.max(store.processedSessionIds.length, 1);
35
+ const localSessions = store.processedSessionIds.map((id) => {
36
+ const snap = store.snapshots.find((s) => s.sessionId === id);
37
+ return {
38
+ id,
39
+ date: snap ? (0, remote_store_js_1.getUTCDate)(snap.timestamp) : new Date().toISOString().slice(0, 10),
40
+ hours: avgHours,
41
+ };
42
+ });
43
+ const merged = (0, remote_store_js_1.mergeIntoRemote)(remote, localSessions, store.lastResult);
44
+ const totals = (0, remote_store_js_1.getTotalStats)(merged);
45
+ const ctx = {
46
+ totalSessions: totals.sessions,
47
+ totalHours: totals.hours,
48
+ totalProjects: totals.projects,
49
+ domains: merged.domains,
50
+ streak: merged.streak,
51
+ features: store.lastResult.features,
52
+ activeDates: merged.streak.activeDates,
53
+ };
54
+ const newAchievements = (0, achievements_js_1.checkAchievements)(ctx, merged.achievements.map((a) => a.id));
55
+ for (const id of newAchievements) {
56
+ merged.achievements.push({ id, unlockedAt: new Date().toISOString() });
57
+ const def = (0, achievements_js_1.getAchievementDef)(id);
58
+ if (def)
59
+ console.log(` \uD83C\uDFC6 Achievement unlocked: ${def.icon} ${def.name}`);
60
+ }
61
+ const thisWeek = (0, remote_store_js_1.getWeekMonday)(new Date().toISOString());
62
+ const localTrend = {
63
+ week: thisWeek,
64
+ domains: Object.fromEntries(store.lastResult.domains.map((d) => [d.id, d.score])),
65
+ hours: store.lastResult.features.totalHours,
66
+ sessions: store.lastResult.sessionCount,
67
+ };
68
+ merged.weeklyTrends = (0, remote_store_js_1.mergeWeeklyTrends)(merged.weeklyTrends, [localTrend]);
69
+ store.lastResult.streak = merged.streak.current;
70
+ store.lastResult.achievementCount = merged.achievements.length;
71
+ const finalSvg = (0, svg_js_1.renderBadge)(store.lastResult, (0, locale_js_1.getConfigLocale)());
72
+ (0, local_store_js_1.saveBadge)(finalSvg);
73
+ const pushResult = (0, uploader_js_1.pushGistFiles)(config.gistId, {
74
+ "cc-proficiency.svg": finalSvg,
75
+ "cc-proficiency.json": JSON.stringify(merged, null, 2),
76
+ });
77
+ if (pushResult.success) {
78
+ const rawUrl = (0, uploader_js_1.getGistRawUrl)(config.username ?? "", config.gistId);
79
+ console.log("\u2713 Badge + data pushed to Gist");
80
+ console.log(` ${rawUrl}`);
81
+ console.log(` ${totals.sessions} sessions \u00B7 ${totals.hours.toFixed(1)}h \u00B7 ${merged.achievements.length} achievements \u00B7 \uD83D\uDD25 ${merged.streak.current}d streak`);
82
+ }
83
+ else {
84
+ console.log(`\u2717 Push failed: ${pushResult.error}`);
85
+ }
86
+ }
87
+ //# sourceMappingURL=publishing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publishing.js","sourceRoot":"","sources":["../../../src/cli/services/publishing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { computeProficiency } from "../../scoring/engine.js";
2
+ import { loadStore } from "../../store/local-store.js";
3
+ import type { ParsedSession } from "../../types.js";
4
+ import type { ConfigSignals } from "../../parsers/config-parser.js";
5
+ export declare function gatherData(full: boolean): Promise<{
6
+ sessions: ParsedSession[];
7
+ config: ConfigSignals;
8
+ }>;
9
+ export declare function gatherAllProcessedSessions(store: ReturnType<typeof loadStore>): Promise<ParsedSession[]>;
10
+ export declare function runAnalysis(sessions: ParsedSession[], config: ConfigSignals, username: string): ReturnType<typeof computeProficiency>;
11
+ //# sourceMappingURL=sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../../src/cli/services/sessions.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAsB,MAAM,4BAA4B,CAAC;AAC3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAIpE,wBAAsB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAAC,CAiC7G;AAED,wBAAsB,0BAA0B,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAuB9G;AAED,wBAAgB,WAAW,CACzB,QAAQ,EAAE,aAAa,EAAE,EACzB,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,MAAM,GACf,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAGvC"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.gatherData = gatherData;
4
+ exports.gatherAllProcessedSessions = gatherAllProcessedSessions;
5
+ exports.runAnalysis = runAnalysis;
6
+ const node_fs_1 = require("node:fs");
7
+ const node_path_1 = require("node:path");
8
+ const node_os_1 = require("node:os");
9
+ const transcript_parser_js_1 = require("../../parsers/transcript-parser.js");
10
+ const config_parser_js_1 = require("../../parsers/config-parser.js");
11
+ const engine_js_1 = require("../../scoring/engine.js");
12
+ const local_store_js_1 = require("../../store/local-store.js");
13
+ const CLAUDE_DIR = (0, node_path_1.join)((0, node_os_1.homedir)(), ".claude");
14
+ async function gatherData(full) {
15
+ const config = (0, config_parser_js_1.parseClaudeConfig)();
16
+ const sessions = [];
17
+ const store = full ? { processedSessionIds: [] } : (0, local_store_js_1.loadStore)();
18
+ const projectsDir = (0, node_path_1.join)(CLAUDE_DIR, "projects");
19
+ if (!(0, node_fs_1.existsSync)(projectsDir))
20
+ return { sessions, config };
21
+ const projects = (0, node_fs_1.readdirSync)(projectsDir);
22
+ for (const proj of projects) {
23
+ const projDir = (0, node_path_1.join)(projectsDir, proj);
24
+ try {
25
+ const files = (0, node_fs_1.readdirSync)(projDir).filter((f) => f.endsWith(".jsonl"));
26
+ for (const file of files) {
27
+ const sessionId = file.replace(".jsonl", "");
28
+ if (!full && (0, local_store_js_1.isSessionProcessed)(store, sessionId)) {
29
+ continue;
30
+ }
31
+ try {
32
+ const session = await (0, transcript_parser_js_1.parseTranscript)((0, node_path_1.join)(projDir, file));
33
+ if (session.events.length > 0) {
34
+ sessions.push(session);
35
+ }
36
+ }
37
+ catch {
38
+ // skip unreadable files
39
+ }
40
+ }
41
+ }
42
+ catch {
43
+ // skip unreadable project dirs
44
+ }
45
+ }
46
+ return { sessions, config };
47
+ }
48
+ async function gatherAllProcessedSessions(store) {
49
+ const sessions = [];
50
+ const projectsDir = (0, node_path_1.join)(CLAUDE_DIR, "projects");
51
+ if (!(0, node_fs_1.existsSync)(projectsDir))
52
+ return sessions;
53
+ const projects = (0, node_fs_1.readdirSync)(projectsDir);
54
+ for (const proj of projects) {
55
+ const projDir = (0, node_path_1.join)(projectsDir, proj);
56
+ try {
57
+ const files = (0, node_fs_1.readdirSync)(projDir).filter((f) => f.endsWith(".jsonl"));
58
+ for (const file of files) {
59
+ const sessionId = file.replace(".jsonl", "");
60
+ if (store.processedSessionIds.includes(sessionId)) {
61
+ try {
62
+ const session = await (0, transcript_parser_js_1.parseTranscript)((0, node_path_1.join)(projDir, file));
63
+ if (session.events.length > 0)
64
+ sessions.push(session);
65
+ }
66
+ catch { /* skip */ }
67
+ }
68
+ }
69
+ }
70
+ catch { /* skip */ }
71
+ }
72
+ return sessions;
73
+ }
74
+ function runAnalysis(sessions, config, username) {
75
+ const setupChecklist = (0, config_parser_js_1.buildSetupChecklist)(config);
76
+ return (0, engine_js_1.computeProficiency)(sessions, config, username, setupChecklist);
77
+ }
78
+ //# sourceMappingURL=sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/cli/services/sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ProficiencyResult, SetupChecklist } from "../../types.js";
2
+ export declare function progressBar(score: number, width: number): string;
3
+ export declare function printResult(result: ProficiencyResult): void;
4
+ export declare function printSetupChecklist(cl: SetupChecklist): void;
5
+ //# sourceMappingURL=formatting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/formatting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAExE,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CA4C3D;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI,CAc5D"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.progressBar = progressBar;
4
+ exports.printResult = printResult;
5
+ exports.printSetupChecklist = printSetupChecklist;
6
+ function progressBar(score, width) {
7
+ const filled = Math.round((score / 100) * width);
8
+ const empty = width - filled;
9
+ return "\u2588".repeat(filled) + "\u2591".repeat(empty);
10
+ }
11
+ function printResult(result) {
12
+ console.log(` Claude Code Proficiency \u2014 @${result.username}`);
13
+ console.log(" " + "\u2500".repeat(40));
14
+ if (result.phase === "calibrating") {
15
+ const needed = Math.max(0, 3 - result.sessionCount);
16
+ console.log(` \u23F3 Calibrating... (${result.sessionCount} sessions, need ${needed} more)`);
17
+ console.log("");
18
+ printSetupChecklist(result.setupChecklist);
19
+ return;
20
+ }
21
+ for (const d of result.domains) {
22
+ const bar = progressBar(d.score, 20);
23
+ const conf = d.confidence === "high" ? "\u25CF" : d.confidence === "medium" ? "\u25D0" : "\u25CB";
24
+ console.log(` ${d.label.padEnd(14)} ${bar} ${String(d.score).padStart(3)} ${conf}`);
25
+ }
26
+ console.log(" " + "\u2500".repeat(40));
27
+ const f = result.features;
28
+ if (f.hooks.length > 0) {
29
+ const shown = f.hooks.slice(0, 3).map((h) => `${h.name} (${h.count}x)`).join(", ");
30
+ const more = f.hooks.length > 3 ? ` +${f.hooks.length - 3}` : "";
31
+ console.log(` Hooks ${shown}${more}`);
32
+ }
33
+ if (f.skills.length > 0) {
34
+ const shown = f.skills.slice(0, 3).map((s) => `${s.name} (${s.count}x)`).join(", ");
35
+ const more = f.skills.length > 3 ? ` +${f.skills.length - 3}` : "";
36
+ console.log(` Skills ${shown}${more}`);
37
+ }
38
+ if (f.mcpServers.length > 0) {
39
+ console.log(` MCP ${f.mcpServers.join(", ")}`);
40
+ }
41
+ const toolSummary = f.topTools.slice(0, 4).map((t) => `${t.name} ${t.count}`).join(" \u00B7 ");
42
+ console.log(` Tools ${toolSummary} (+${f.uniqueToolCount - Math.min(4, f.topTools.length)} more)`);
43
+ console.log(" " + "\u2500".repeat(40));
44
+ const hrs = result.features.totalHours >= 1000 ? (result.features.totalHours / 1000).toFixed(1) + "kh" : result.features.totalHours + "h";
45
+ console.log(` ${hrs} \u00B7 ${result.sessionCount} sessions \u00B7 ${result.projectCount} projects`);
46
+ if (result.phase === "early") {
47
+ console.log(` (early results \u2014 stabilizes at 10 sessions)`);
48
+ }
49
+ }
50
+ function printSetupChecklist(cl) {
51
+ const items = [
52
+ ["CLAUDE.md", cl.hasClaudeMd],
53
+ ["Hooks", cl.hasHooks],
54
+ ["Plugins", cl.hasPlugins],
55
+ ["MCP Servers", cl.hasMcpServers],
56
+ ["Memory", cl.hasMemory],
57
+ ["Rules", cl.hasRules],
58
+ ];
59
+ console.log(" Setup:");
60
+ for (const [label, ok] of items) {
61
+ console.log(` ${ok ? "\u2713" : "\u2717"} ${label}`);
62
+ }
63
+ }
64
+ //# sourceMappingURL=formatting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../../src/cli/utils/formatting.ts"],"names":[],"mappings":";;AAEA,kCAIC;AAED,kCA4CC;AAED,kDAcC;AAlED,SAAgB,WAAW,CAAC,KAAa,EAAE,KAAa;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAC7B,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,SAAgB,WAAW,CAAC,MAAyB;IACnD,OAAO,CAAC,GAAG,CAAC,qCAAqC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAExC,IAAI,MAAM,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,4BAA4B,MAAM,CAAC,YAAY,mBAAmB,MAAM,QAAQ,CAAC,CAAC;QAC9F,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,mBAAmB,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QAClG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAExC,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC1B,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnF,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,GAAG,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpF,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,GAAG,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,WAAW,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/F,OAAO,CAAC,GAAG,CAAC,aAAa,WAAW,MAAM,CAAC,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEtG,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC;IAC1I,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,WAAW,MAAM,CAAC,YAAY,oBAAoB,MAAM,CAAC,YAAY,WAAW,CAAC,CAAC;IAEtG,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED,SAAgB,mBAAmB,CAAC,EAAkB;IACpD,MAAM,KAAK,GAAG;QACZ,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC;QAC7B,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC;QACtB,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC;QAC1B,CAAC,aAAa,EAAE,EAAE,CAAC,aAAa,CAAC;QACjC,CAAC,QAAQ,EAAE,EAAE,CAAC,SAAS,CAAC;QACxB,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC;KACd,CAAC;IAEX,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,KAAK,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type Locale } from "../../i18n/locales.js";
2
+ export declare function getConfigLocale(): Locale;
3
+ //# sourceMappingURL=locale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locale.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/locale.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAElE,wBAAgB,eAAe,IAAI,MAAM,CAKxC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getConfigLocale = getConfigLocale;
4
+ const local_store_js_1 = require("../../store/local-store.js");
5
+ const locales_js_1 = require("../../i18n/locales.js");
6
+ function getConfigLocale() {
7
+ const config = (0, local_store_js_1.loadConfig)();
8
+ if (config.locale === "zh-CN")
9
+ return "zh-CN";
10
+ if (config.locale === "en")
11
+ return "en";
12
+ return (0, locales_js_1.detectLocale)();
13
+ }
14
+ //# sourceMappingURL=locale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locale.js","sourceRoot":"","sources":["../../../src/cli/utils/locale.ts"],"names":[],"mappings":";;AAGA,0CAKC;AARD,+DAAwD;AACxD,sDAAkE;AAElE,SAAgB,eAAe;IAC7B,MAAM,MAAM,GAAG,IAAA,2BAAU,GAAE,CAAC;IAC5B,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IAC9C,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,IAAA,yBAAY,GAAE,CAAC;AACxB,CAAC"}
@@ -32,6 +32,7 @@ function log(msg) {
32
32
  catch { /* logging must never crash the hook */ }
33
33
  }
34
34
  // CI/CD detection — skip if non-interactive
35
+ // Duplicated from src/utils/ci-detect.ts — keep in sync
35
36
  const CI_VARS = ["CI", "GITHUB_ACTIONS", "GITLAB_CI", "CODESPACES", "BUILDKITE", "CIRCLECI", "TRAVIS"];
36
37
  if (CI_VARS.some((v) => process.env[v] === "true") || process.env.JENKINS_URL) {
37
38
  log("SKIP: CI environment detected");
@@ -63,8 +64,8 @@ process.stdin.on("end", () => {
63
64
  log(`QUEUED: session=${entry.sessionId} cwd=${entry.cwd}`);
64
65
  // Spawn processor as detached child (fire-and-forget)
65
66
  try {
66
- // When compiled: dist/hooks/session-end.js dist/cli.js is at ../cli.js
67
- const processorPath = (0, node_path_1.join)(__dirname, "..", "cli.js");
67
+ // When compiled: dist/hooks/session-end.js -> dist/cli/index.js
68
+ const processorPath = (0, node_path_1.join)(__dirname, "..", "cli", "index.js");
68
69
  if ((0, node_fs_1.existsSync)(processorPath)) {
69
70
  const child = (0, node_child_process_1.spawn)("node", [processorPath, "process"], {
70
71
  detached: true,
@@ -1 +1 @@
1
- {"version":3,"file":"config-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/config-parser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,MAAM,WAAW,aAAa;IAC5B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,wBAAwB,EAAE,OAAO,CAAC;IAClC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,OAAO,CAAC;IACxB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,aAAa,CAkOjD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,CASzE"}
1
+ {"version":3,"file":"config-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/config-parser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,MAAM,WAAW,aAAa;IAC5B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,wBAAwB,EAAE,OAAO,CAAC;IAClC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,OAAO,CAAC;IACxB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;CACrB;AAiOD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,aAAa,CAWjD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,CASzE"}