cc-proficiency 0.2.10 → 0.3.1
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.
- package/README.md +79 -3
- package/dist/cli/commands/ai-grade.d.ts +2 -0
- package/dist/cli/commands/ai-grade.d.ts.map +1 -0
- package/dist/cli/commands/ai-grade.js +139 -0
- package/dist/cli/commands/ai-grade.js.map +1 -0
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +2 -0
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/explain.d.ts.map +1 -1
- package/dist/cli/commands/explain.js +18 -0
- package/dist/cli/commands/explain.js.map +1 -1
- package/dist/cli/commands/process.d.ts.map +1 -1
- package/dist/cli/commands/process.js +30 -0
- package/dist/cli/commands/process.js.map +1 -1
- package/dist/cli/index.js +6 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/services/publishing.d.ts +1 -0
- package/dist/cli/services/publishing.d.ts.map +1 -1
- package/dist/cli/services/publishing.js +43 -13
- package/dist/cli/services/publishing.js.map +1 -1
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +28 -1
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +28 -1
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +27 -0
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +27 -0
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/ko.d.ts.map +1 -1
- package/dist/i18n/locales/ko.js +27 -0
- package/dist/i18n/locales/ko.js.map +1 -1
- package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
- package/dist/i18n/locales/zh-CN.js +27 -0
- package/dist/i18n/locales/zh-CN.js.map +1 -1
- package/dist/i18n/types.d.ts +21 -0
- package/dist/i18n/types.d.ts.map +1 -1
- package/dist/renderer/ai-animated-svg.d.ts +11 -0
- package/dist/renderer/ai-animated-svg.d.ts.map +1 -0
- package/dist/renderer/ai-animated-svg.js +206 -0
- package/dist/renderer/ai-animated-svg.js.map +1 -0
- package/dist/scoring/ai-evidence.d.ts +108 -0
- package/dist/scoring/ai-evidence.d.ts.map +1 -0
- package/dist/scoring/ai-evidence.js +305 -0
- package/dist/scoring/ai-evidence.js.map +1 -0
- package/dist/scoring/ai-grader.d.ts +64 -0
- package/dist/scoring/ai-grader.d.ts.map +1 -0
- package/dist/scoring/ai-grader.js +229 -0
- package/dist/scoring/ai-grader.js.map +1 -0
- package/dist/scoring/rubric-loader.d.ts +4 -0
- package/dist/scoring/rubric-loader.d.ts.map +1 -0
- package/dist/scoring/rubric-loader.js +102 -0
- package/dist/scoring/rubric-loader.js.map +1 -0
- package/dist/store/achievements.d.ts.map +1 -1
- package/dist/store/achievements.js +25 -0
- package/dist/store/achievements.js.map +1 -1
- package/dist/store/local-store.d.ts +2 -0
- package/dist/store/local-store.d.ts.map +1 -1
- package/dist/store/local-store.js +11 -0
- package/dist/store/local-store.js.map +1 -1
- package/dist/store/queue.d.ts +8 -0
- package/dist/store/queue.d.ts.map +1 -1
- package/dist/store/queue.js +44 -0
- package/dist/store/queue.js.map +1 -1
- package/dist/store/remote-store.d.ts.map +1 -1
- package/dist/store/remote-store.js +3 -0
- package/dist/store/remote-store.js.map +1 -1
- package/dist/types.d.ts +51 -0
- package/dist/types.d.ts.map +1 -1
- package/docs/ai-grading/README.md +39 -0
- package/docs/ai-grading/anti-gaming.md +11 -0
- package/docs/ai-grading/collaboration-quality.md +25 -0
- package/docs/ai-grading/goal-achievement.md +25 -0
- package/docs/ai-grading/growth-learning.md +25 -0
- package/docs/ai-grading/system-prompt-header.md +32 -0
- package/docs/ai-grading/verification-quality.md +25 -0
- package/docs/ai-grading/workflow-mastery.md +25 -0
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
<a href="#install">Install</a> ·
|
|
27
27
|
<a href="#usage">Usage</a> ·
|
|
28
28
|
<a href="#embed-in-your-readme">Embed</a> ·
|
|
29
|
+
<a href="#ai-grading">AI Grading</a> ·
|
|
29
30
|
<a href="#how-scoring-works">Scoring</a> ·
|
|
30
31
|
<a href="#privacy">Privacy</a> ·
|
|
31
32
|
<a href="#localization">Localization</a> ·
|
|
@@ -36,7 +37,7 @@
|
|
|
36
37
|
|
|
37
38
|
## What it does
|
|
38
39
|
|
|
39
|
-
Analyzes your Claude Code session transcripts **locally** with a rule-based engine, scoring usage patterns across 5 domains
|
|
40
|
+
Analyzes your Claude Code session transcripts **locally** with a rule-based engine, scoring usage patterns across 5 domains. Optionally adds [AI-powered grading](#ai-grading) across 5 outcome-focused domains using Claude's `/insights` data.
|
|
40
41
|
|
|
41
42
|
| Domain | Weight | What it measures |
|
|
42
43
|
|--------|--------|-----------------|
|
|
@@ -54,6 +55,12 @@ Also shows **8 feature mini-bars** (Hooks, Plugins, Skills, MCP, Agents, Plan, M
|
|
|
54
55
|
</a>
|
|
55
56
|
<br />
|
|
56
57
|
<a href="https://gist.githubusercontent.com/Z-M-Huang/2717fa94690c459d5093650c87f49868/raw/cc-proficiency-animated.svg">Click to see animated version</a>
|
|
58
|
+
<br />
|
|
59
|
+
<a href="https://github.com/Z-M-Huang/cc-proficiency">
|
|
60
|
+
<img src="https://gist.githubusercontent.com/Z-M-Huang/2717fa94690c459d5093650c87f49868/raw/cc-proficiency-animated-ai-graded.svg" alt="CC Proficiency Badge — AI Graded" />
|
|
61
|
+
</a>
|
|
62
|
+
<br />
|
|
63
|
+
<a href="https://gist.githubusercontent.com/Z-M-Huang/2717fa94690c459d5093650c87f49868/raw/cc-proficiency-animated-ai-graded.svg">Click to see animated version</a>
|
|
57
64
|
</p>
|
|
58
65
|
|
|
59
66
|
> **Disclaimer:** This is an unofficial usage estimate, not an actual Anthropic certification score. Not affiliated with or endorsed by Anthropic.
|
|
@@ -218,12 +225,80 @@ The **[Gamification Guide](https://github.com/Z-M-Huang/cc-proficiency/wiki/Gami
|
|
|
218
225
|
|
|
219
226
|
- First day through expert-level progression path
|
|
220
227
|
- Tips for each of the 5 domains
|
|
221
|
-
- How to unlock all
|
|
228
|
+
- How to unlock all 18 achievements (including 3 AI achievements)
|
|
222
229
|
- What drives each feature mini-bar from 0 to 100
|
|
223
230
|
- Streak system and leaderboard
|
|
224
231
|
|
|
225
232
|
> **[Gamification Guide](https://github.com/Z-M-Huang/cc-proficiency/wiki/Gamification-Guide)** | **[游戏化攻略(中文)](https://github.com/Z-M-Huang/cc-proficiency/wiki/Gamification-Guide-zh)**
|
|
226
233
|
|
|
234
|
+
## AI Grading
|
|
235
|
+
|
|
236
|
+
In addition to the rule-based engine, cc-proficiency offers **AI-powered grading** that evaluates your usage patterns across 5 outcome-focused domains using Claude's `/insights` data (facets + session metadata).
|
|
237
|
+
|
|
238
|
+
### AI Domains
|
|
239
|
+
|
|
240
|
+
| Domain | What it measures |
|
|
241
|
+
|--------|-----------------|
|
|
242
|
+
| **Goal Achievement** | Goal clarity, achievement rate, complexity progression, session purposefulness |
|
|
243
|
+
| **Collaboration Quality** | Friction recovery, direction clarity, feedback quality, outcome satisfaction |
|
|
244
|
+
| **Workflow Mastery** | Session strategy diversity, output-to-effort ratio, multi-session coordination |
|
|
245
|
+
| **Growth & Learning** | Friction trajectory, outcome trajectory, capability expansion, resilience |
|
|
246
|
+
| **Verification & Quality** | Outcome reliability, error handling, iterative refinement, course-correction |
|
|
247
|
+
|
|
248
|
+
Each domain is scored 0–100% with levels: **Novice** (<34%), **Proficient** (34–66%), **Expert** (67%+).
|
|
249
|
+
|
|
250
|
+
### How it works
|
|
251
|
+
|
|
252
|
+
1. Reads `/insights` facets and session-meta from `~/.claude/usage-data/`
|
|
253
|
+
2. Precomputes stats locally (outcome rates, friction trends, tool distributions)
|
|
254
|
+
3. Sends stats + rubric to `claude -p` (via stdin — no data leaves your machine except to Claude API)
|
|
255
|
+
4. AI returns only per-criterion scores (1–5); totals, levels, and achievements are computed **locally**
|
|
256
|
+
5. Renders an animated SVG badge with "AI Graded" indicator
|
|
257
|
+
|
|
258
|
+
The grading rubric is stored as editable markdown files in `docs/ai-grading/` — you can review and customize the criteria.
|
|
259
|
+
|
|
260
|
+
### Usage
|
|
261
|
+
|
|
262
|
+
```bash
|
|
263
|
+
# Enable AI grading
|
|
264
|
+
cc-proficiency config aiGrading true
|
|
265
|
+
|
|
266
|
+
# Run AI grading (requires Claude CLI ≥ 2.1.0)
|
|
267
|
+
cc-proficiency ai-grade # uses sonnet by default
|
|
268
|
+
cc-proficiency ai-grade --model opus # use a specific model
|
|
269
|
+
cc-proficiency ai-grade --full # force re-grade (ignore cache)
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Results are cached based on evidence hash — re-running without new data returns the cached result instantly.
|
|
273
|
+
|
|
274
|
+
### Auto-trigger
|
|
275
|
+
|
|
276
|
+
When `aiGrading` is enabled, the `process` command automatically triggers AI grading weekly (after releasing the queue lock). No manual steps needed.
|
|
277
|
+
|
|
278
|
+
### Phase system
|
|
279
|
+
|
|
280
|
+
| Phase | Facets | Behavior |
|
|
281
|
+
|-------|--------|----------|
|
|
282
|
+
| **Insufficient** | <10 | Refuses to grade — not enough data |
|
|
283
|
+
| **Early Assessment** | 10–30 | Grades with a warning note on the badge |
|
|
284
|
+
| **Full** | 30+ | Standard AI grading |
|
|
285
|
+
|
|
286
|
+
### AI Achievements
|
|
287
|
+
|
|
288
|
+
Three achievements unlock based on your `/insights` data (deterministic, not AI judgment):
|
|
289
|
+
|
|
290
|
+
| Achievement | Requirement |
|
|
291
|
+
|------------|-------------|
|
|
292
|
+
| **Goal Crusher** | ≥90% achievement rate across 20+ sessions |
|
|
293
|
+
| **Recovery Artist** | Recover from friction with satisfied outcome 5+ times |
|
|
294
|
+
| **Prompt Evolution** | Measurable improvement in prompt quality over time |
|
|
295
|
+
|
|
296
|
+
### Privacy
|
|
297
|
+
|
|
298
|
+
AI grading sends **precomputed statistics** to Claude, not raw transcripts. Project paths are sanitized to slugs. The `report.html` narrative is excluded to avoid AI grading AI-generated text.
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
227
302
|
## How scoring works
|
|
228
303
|
|
|
229
304
|
### Rule-based engine
|
|
@@ -331,6 +406,7 @@ To add a new language, copy `src/i18n/locales/en.ts` to `src/i18n/locales/<code>
|
|
|
331
406
|
| `cc-proficiency achievements` | View achievement progress |
|
|
332
407
|
| `cc-proficiency status` | Show hook activity, queue, and config |
|
|
333
408
|
| `cc-proficiency config [key] [value]` | View/set configuration |
|
|
409
|
+
| `cc-proficiency ai-grade [--model m] [--full]` | AI-powered proficiency grading |
|
|
334
410
|
| `cc-proficiency share [--remove]` | Join or leave the community leaderboard |
|
|
335
411
|
| `cc-proficiency leaderboard` | View community rankings |
|
|
336
412
|
| `cc-proficiency update` | Update to the latest version |
|
|
@@ -377,7 +453,7 @@ Contributions welcome! Please open an issue first to discuss what you'd like to
|
|
|
377
453
|
git clone https://github.com/Z-M-Huang/cc-proficiency.git
|
|
378
454
|
cd cc-proficiency
|
|
379
455
|
npm install
|
|
380
|
-
npm test #
|
|
456
|
+
npm test # 433 tests
|
|
381
457
|
npm run build # compile to dist/
|
|
382
458
|
npm run typecheck # tsc --noEmit
|
|
383
459
|
npm run lint # eslint
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-grade.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/ai-grade.ts"],"names":[],"mappings":"AAmDA,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsG9D"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cmdAIGrade = cmdAIGrade;
|
|
4
|
+
const node_fs_1 = require("node:fs");
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
6
|
+
const node_os_1 = require("node:os");
|
|
7
|
+
const node_crypto_1 = require("node:crypto");
|
|
8
|
+
const local_store_js_1 = require("../../store/local-store.js");
|
|
9
|
+
const rubric_loader_js_1 = require("../../scoring/rubric-loader.js");
|
|
10
|
+
const ai_evidence_js_1 = require("../../scoring/ai-evidence.js");
|
|
11
|
+
const ai_grader_js_1 = require("../../scoring/ai-grader.js");
|
|
12
|
+
const ai_animated_svg_js_1 = require("../../renderer/ai-animated-svg.js");
|
|
13
|
+
const queue_js_1 = require("../../store/queue.js");
|
|
14
|
+
const config_parser_js_1 = require("../../parsers/config-parser.js");
|
|
15
|
+
const index_js_1 = require("../../i18n/index.js");
|
|
16
|
+
const FACETS_DIR = (0, node_path_1.join)((0, node_os_1.homedir)(), ".claude", "usage-data", "facets");
|
|
17
|
+
const META_DIR = (0, node_path_1.join)((0, node_os_1.homedir)(), ".claude", "usage-data", "session-meta");
|
|
18
|
+
function parseFlags(args) {
|
|
19
|
+
let model;
|
|
20
|
+
let full = false;
|
|
21
|
+
for (let i = 0; i < args.length; i++) {
|
|
22
|
+
if (args[i] === "--model" && i + 1 < args.length) {
|
|
23
|
+
model = args[++i];
|
|
24
|
+
}
|
|
25
|
+
else if (args[i] === "--full") {
|
|
26
|
+
full = true;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return { model, full };
|
|
30
|
+
}
|
|
31
|
+
function getLatestMtime(dir) {
|
|
32
|
+
try {
|
|
33
|
+
const stat = (0, node_fs_1.statSync)(dir);
|
|
34
|
+
return stat.mtime.toISOString();
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return "";
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function printResults(result) {
|
|
41
|
+
const strings = (0, index_js_1.t)().cli.aiGrade;
|
|
42
|
+
console.log(strings.gradingComplete);
|
|
43
|
+
for (const domain of result.domains) {
|
|
44
|
+
const label = (0, index_js_1.t)().aiBadge.aiDomainLabels[domain.id] ?? domain.id;
|
|
45
|
+
console.log(strings.domainResult(label, domain.total, domain.level));
|
|
46
|
+
}
|
|
47
|
+
console.log(`\n ${result.overall}`);
|
|
48
|
+
}
|
|
49
|
+
async function cmdAIGrade(args) {
|
|
50
|
+
const strings = (0, index_js_1.t)().cli.aiGrade;
|
|
51
|
+
const { model, full } = parseFlags(args);
|
|
52
|
+
// Check prerequisites: Claude CLI
|
|
53
|
+
if (!(0, ai_grader_js_1.checkClaudeVersion)()) {
|
|
54
|
+
console.log(strings.claudeNotFound);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
// Check prerequisites: session-meta data exists
|
|
58
|
+
if (!(0, node_fs_1.existsSync)(META_DIR)) {
|
|
59
|
+
console.log(strings.insufficientFacets(0, 10));
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
// Acquire AI grade lock (separate from queue lock)
|
|
63
|
+
if (!(0, queue_js_1.acquireAIGradeLock)()) {
|
|
64
|
+
console.log("Another AI grading process is already running.");
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
console.log(strings.running);
|
|
69
|
+
// Load rubric and build prompt
|
|
70
|
+
const rubric = (0, rubric_loader_js_1.loadRubric)();
|
|
71
|
+
const rubricText = (0, rubric_loader_js_1.buildPromptFromRubric)(rubric);
|
|
72
|
+
const rubricVersion = (0, node_crypto_1.createHash)("sha256").update(rubricText).digest("hex").slice(0, 12);
|
|
73
|
+
// Assemble evidence
|
|
74
|
+
const evidence = (0, ai_evidence_js_1.assembleEvidence)(META_DIR, FACETS_DIR);
|
|
75
|
+
if (!evidence) {
|
|
76
|
+
console.log(strings.insufficientFacets(0, 10));
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// Check phase
|
|
80
|
+
const phase = (0, ai_evidence_js_1.getAIPhase)(evidence.metaCount);
|
|
81
|
+
if (phase === "insufficient") {
|
|
82
|
+
console.log(strings.insufficientFacets(evidence.metaCount, 10));
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// Precompute stats and build payload
|
|
86
|
+
const stats = (0, ai_evidence_js_1.precomputeStats)(evidence);
|
|
87
|
+
const configSignals = (0, config_parser_js_1.parseClaudeConfig)();
|
|
88
|
+
const store = (0, local_store_js_1.loadStore)();
|
|
89
|
+
const ruleScores = store.lastResult?.domains;
|
|
90
|
+
const features = store.lastResult?.features;
|
|
91
|
+
const payload = (0, ai_evidence_js_1.buildEvidencePayload)(stats, configSignals, ruleScores, features);
|
|
92
|
+
// Check cache
|
|
93
|
+
const metaMtime = getLatestMtime(META_DIR);
|
|
94
|
+
const ruleScoresHash = ruleScores
|
|
95
|
+
? (0, node_crypto_1.createHash)("sha256").update(JSON.stringify(ruleScores.map(d => `${d.id}=${d.percentage}`))).digest("hex").slice(0, 12)
|
|
96
|
+
: "";
|
|
97
|
+
const cacheKey = (0, ai_grader_js_1.computeCacheKey)(metaMtime, rubricText, evidence.metaCount, JSON.stringify(configSignals), ruleScoresHash);
|
|
98
|
+
if (!full && store.lastAIResult?.cacheKey === cacheKey) {
|
|
99
|
+
console.log(strings.cacheHit);
|
|
100
|
+
printResults(store.lastAIResult);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
// Grade with Claude
|
|
104
|
+
const gradeResult = (0, ai_grader_js_1.gradeWithClaude)(rubricText, payload, model);
|
|
105
|
+
if (!gradeResult) {
|
|
106
|
+
console.log(strings.gradingFailed("Claude returned no result"));
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
// Post-process (use actual model ID from claude response, not the alias)
|
|
110
|
+
let result;
|
|
111
|
+
try {
|
|
112
|
+
result = (0, ai_grader_js_1.postProcess)(gradeResult.response, rubric, gradeResult.actualModel, rubricVersion);
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
console.log(strings.gradingFailed(String(err)));
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
result.cacheKey = cacheKey;
|
|
119
|
+
// Render and save badge (uses proficiency result for shared header/footer)
|
|
120
|
+
if (!store.lastResult) {
|
|
121
|
+
console.log(strings.gradingFailed("No proficiency data yet. Run 'cc-proficiency process' first."));
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const tokenWindows = (0, local_store_js_1.computeTokenWindows)(store.tokenLog);
|
|
125
|
+
const svg = (0, ai_animated_svg_js_1.renderAIAnimatedBadge)(result, phase, store.lastResult, tokenWindows);
|
|
126
|
+
const badgePath = (0, local_store_js_1.saveAIBadge)(svg);
|
|
127
|
+
// Save to store (including AI evidence for achievements)
|
|
128
|
+
store.lastAIResult = result;
|
|
129
|
+
store.aiEvidence = (0, ai_evidence_js_1.computeAIEvidence)(evidence, stats);
|
|
130
|
+
(0, local_store_js_1.saveStore)(store);
|
|
131
|
+
// Print results
|
|
132
|
+
printResults(result);
|
|
133
|
+
console.log(strings.badgeSaved(badgePath));
|
|
134
|
+
}
|
|
135
|
+
finally {
|
|
136
|
+
(0, queue_js_1.releaseAIGradeLock)();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=ai-grade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-grade.js","sourceRoot":"","sources":["../../../src/cli/commands/ai-grade.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"AAGA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"AAGA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsC9C"}
|
|
@@ -38,6 +38,8 @@ function cmdConfig(args) {
|
|
|
38
38
|
config.leaderboard = value === "true";
|
|
39
39
|
else if (key === "publicGistId")
|
|
40
40
|
config.publicGistId = value;
|
|
41
|
+
else if (key === "aiGrading")
|
|
42
|
+
config.aiGrading = value === "true";
|
|
41
43
|
else {
|
|
42
44
|
console.log((0, index_js_1.t)().common.unknownKey(key));
|
|
43
45
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":";;AAGA,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":";;AAGA,8BAsCC;AAzCD,+DAAoE;AACpE,kDAA0E;AAE1E,SAAgB,SAAS,CAAC,IAAc;IACtC,MAAM,MAAM,GAAG,IAAA,2BAAU,GAAE,CAAC;IAE5B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAwB,CAAC;QAC3C,IAAI,GAAG,IAAI,MAAM,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,IAAA,YAAC,GAAE,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC;IAC1B,IAAI,GAAG,KAAK,QAAQ,IAAI,CAAC,IAAA,wBAAa,EAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,IAAA,YAAC,GAAE,CAAC,MAAM,CAAC,aAAa,CAAC,KAAM,EAAE,4BAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,UAAU;QAAE,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC;SAC3C,IAAI,GAAG,KAAK,QAAQ;QAAE,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;SAC5C,IAAI,GAAG,KAAK,YAAY;QAAE,MAAM,CAAC,UAAU,GAAG,KAAK,KAAK,MAAM,CAAC;SAC/D,IAAI,GAAG,KAAK,QAAQ;QAAE,MAAM,CAAC,MAAM,GAAG,KAAK,KAAK,MAAM,CAAC;SACvD,IAAI,GAAG,KAAK,QAAQ;QAAE,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;SAC5C,IAAI,GAAG,KAAK,aAAa;QAAE,MAAM,CAAC,WAAW,GAAG,KAAK,KAAK,MAAM,CAAC;SACjE,IAAI,GAAG,KAAK,cAAc;QAAE,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC;SACxD,IAAI,GAAG,KAAK,WAAW;QAAE,MAAM,CAAC,SAAS,GAAG,KAAK,KAAK,MAAM,CAAC;SAC7D,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,IAAA,YAAC,GAAE,CAAC,MAAM,CAAC,UAAU,CAAC,GAAI,CAAC,CAAC,CAAC;QACzC,OAAO;IACT,CAAC;IAED,IAAA,2BAAU,EAAC,MAAM,CAAC,CAAC;IACnB,OAAO,CAAC,GAAG,CAAC,IAAA,YAAC,GAAE,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAI,EAAE,KAAM,CAAC,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explain.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/explain.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"explain.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/explain.ts"],"names":[],"mappings":"AAKA,wBAAgB,UAAU,IAAI,IAAI,CAoDjC"}
|
|
@@ -44,5 +44,23 @@ function cmdExplain() {
|
|
|
44
44
|
console.log(` ${s.toolsLabel} ${f.topTools.map((tl) => `${tl.name} (${tl.count})`).join(", ")} +${f.uniqueToolCount - f.topTools.length} ${s.more}`);
|
|
45
45
|
console.log(` ${s.flagsLabel} ${f.usedPlanMode ? `\u2713 ${fl.plan}` : `\u2717 ${fl.plan}`} ${f.hasMemory ? `\u2713 ${fl.memory}` : `\u2717 ${fl.memory}`} ${f.hasRules ? `\u2713 ${fl.rules}` : `\u2717 ${fl.rules}`} ${f.hasAgents ? `\u2713 ${fl.agents}` : `\u2717 ${fl.agents}`} ${f.hasSkills ? `\u2713 ${fl.skills}` : `\u2717 ${fl.skills}`}`);
|
|
46
46
|
console.log(`\n${s.sessionsSummary(result.sessionCount, result.projectCount)}\n`);
|
|
47
|
+
if (store.lastAIResult) {
|
|
48
|
+
printAIAssessment(store.lastAIResult);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function printAIAssessment(ai) {
|
|
52
|
+
console.log(" AI Assessment:");
|
|
53
|
+
console.log("");
|
|
54
|
+
for (const d of ai.domains) {
|
|
55
|
+
const levelTag = d.level === "expert" ? "\u2605" : d.level === "proficient" ? "\u25cb" : "\u25b7";
|
|
56
|
+
console.log(` ${levelTag} ${d.id.padEnd(24)} ${d.total}% (${d.level})`);
|
|
57
|
+
if (d.summary) {
|
|
58
|
+
console.log(` ${d.summary}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (ai.overall) {
|
|
62
|
+
console.log(`\n ${ai.overall}`);
|
|
63
|
+
}
|
|
64
|
+
console.log("");
|
|
47
65
|
}
|
|
48
66
|
//# sourceMappingURL=explain.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explain.js","sourceRoot":"","sources":["../../../src/cli/commands/explain.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"explain.js","sourceRoot":"","sources":["../../../src/cli/commands/explain.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/process.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/process.ts"],"names":[],"mappings":"AAwBA,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CA8HhD"}
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.cmdProcess = cmdProcess;
|
|
4
4
|
const node_fs_1 = require("node:fs");
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
6
|
+
const node_child_process_1 = require("node:child_process");
|
|
5
7
|
const transcript_parser_js_1 = require("../../parsers/transcript-parser.js");
|
|
6
8
|
const config_parser_js_1 = require("../../parsers/config-parser.js");
|
|
7
9
|
const engine_js_1 = require("../../scoring/engine.js");
|
|
@@ -13,11 +15,19 @@ const sessions_js_1 = require("../services/sessions.js");
|
|
|
13
15
|
const publishing_js_1 = require("../services/publishing.js");
|
|
14
16
|
const config_sync_js_1 = require("../../store/config-sync.js");
|
|
15
17
|
const index_js_1 = require("../../i18n/index.js");
|
|
18
|
+
const AUTO_GRADE_STALE_MS = 7 * 24 * 60 * 60 * 1000; // 7 days
|
|
19
|
+
function shouldAutoGrade(store) {
|
|
20
|
+
if (!store.lastAIResult)
|
|
21
|
+
return true;
|
|
22
|
+
const elapsed = Date.now() - new Date(store.lastAIResult.gradedAt).getTime();
|
|
23
|
+
return elapsed > AUTO_GRADE_STALE_MS;
|
|
24
|
+
}
|
|
16
25
|
async function cmdProcess() {
|
|
17
26
|
if (!(0, queue_js_1.acquireLock)()) {
|
|
18
27
|
console.log((0, index_js_1.t)().cli.process.anotherRunning);
|
|
19
28
|
return;
|
|
20
29
|
}
|
|
30
|
+
let shouldTriggerAI = false;
|
|
21
31
|
try {
|
|
22
32
|
const queue = (0, queue_js_1.readQueue)();
|
|
23
33
|
if (queue.length === 0) {
|
|
@@ -85,6 +95,10 @@ async function cmdProcess() {
|
|
|
85
95
|
}
|
|
86
96
|
}
|
|
87
97
|
console.log((0, index_js_1.t)().cli.process.processed(newSessions.length, badgePath));
|
|
98
|
+
// Check if AI grading should auto-trigger (evaluated before lock release)
|
|
99
|
+
if (userConfig.aiGrading && shouldAutoGrade(store)) {
|
|
100
|
+
shouldTriggerAI = true;
|
|
101
|
+
}
|
|
88
102
|
}
|
|
89
103
|
(0, queue_js_1.writeQueue)(new Set(processed));
|
|
90
104
|
(0, local_store_js_1.saveStore)(store);
|
|
@@ -92,5 +106,21 @@ async function cmdProcess() {
|
|
|
92
106
|
finally {
|
|
93
107
|
(0, queue_js_1.releaseLock)();
|
|
94
108
|
}
|
|
109
|
+
// Spawn detached AI grading AFTER lock release to avoid deadlock
|
|
110
|
+
if (shouldTriggerAI) {
|
|
111
|
+
try {
|
|
112
|
+
const processorPath = (0, node_path_1.join)(__dirname, "..", "index.js");
|
|
113
|
+
if ((0, node_fs_1.existsSync)(processorPath)) {
|
|
114
|
+
const child = (0, node_child_process_1.spawn)("node", [processorPath, "ai-grade"], {
|
|
115
|
+
detached: true,
|
|
116
|
+
stdio: "ignore",
|
|
117
|
+
});
|
|
118
|
+
child.unref();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// AI grade trigger is best-effort — never crash process
|
|
123
|
+
}
|
|
124
|
+
}
|
|
95
125
|
}
|
|
96
126
|
//# sourceMappingURL=process.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../../src/cli/commands/process.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../../src/cli/commands/process.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -36,6 +36,7 @@ Commands:
|
|
|
36
36
|
explain ${c.explain}
|
|
37
37
|
status ${c.status}
|
|
38
38
|
config [key] [value] ${c.config}
|
|
39
|
+
ai-grade [--model m] AI-powered proficiency grading
|
|
39
40
|
share [--remove] ${c.share}
|
|
40
41
|
leaderboard ${c.leaderboard}
|
|
41
42
|
update ${c.update}
|
|
@@ -79,6 +80,11 @@ async function main() {
|
|
|
79
80
|
break;
|
|
80
81
|
case "config":
|
|
81
82
|
return (0, config_js_1.cmdConfig)(args.slice(1));
|
|
83
|
+
case "ai-grade": {
|
|
84
|
+
const { cmdAIGrade } = await import("./commands/ai-grade.js");
|
|
85
|
+
await cmdAIGrade(args.slice(1));
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
82
88
|
case "share":
|
|
83
89
|
return (0, share_js_1.cmdShare)(args);
|
|
84
90
|
case "leaderboard":
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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;AAChD,+CAAiD;AACjD,4DAAqD;AAErD,SAAS,UAAU;IACjB,MAAM,CAAC,GAAG,IAAA,YAAC,GAAE,CAAC,GAAG,CAAC,IAAI,CAAC;IACvB,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;IACrB,OAAO,CAAC,GAAG,CAAC;EACZ,CAAC,CAAC,WAAW;;;0BAGW,CAAC,CAAC,IAAI;0BACN,CAAC,CAAC,OAAO;0BACT,CAAC,CAAC,OAAO;0BACT,CAAC,CAAC,KAAK;0BACP,CAAC,CAAC,IAAI;0BACN,CAAC,CAAC,OAAO;0BACT,CAAC,CAAC,OAAO;0BACT,CAAC,CAAC,MAAM;0BACR,CAAC,CAAC,MAAM
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ export interface MergeAndPushResult {
|
|
|
9
9
|
projects: number;
|
|
10
10
|
};
|
|
11
11
|
}
|
|
12
|
+
export declare function buildRecentSessionsForRemote(store: LocalStore, result: ProficiencyResult): RemoteStore["recentSessions"];
|
|
12
13
|
/**
|
|
13
14
|
* Read remote store, merge local data, check achievements, re-render badge,
|
|
14
15
|
* and push SVG + JSON atomically. Used by both cmdPush and cmdProcess.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publishing.d.ts","sourceRoot":"","sources":["../../../src/cli/services/publishing.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"publishing.d.ts","sourceRoot":"","sources":["../../../src/cli/services/publishing.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAe,MAAM,gBAAgB,CAAC;AAE9F,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAChE;AAMD,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,iBAAiB,GACxB,WAAW,CAAC,gBAAgB,CAAC,CAsB/B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,OAAe,EACxB,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,GACjC,kBAAkB,CA4FpB;AAED,wBAAgB,UAAU,IAAI,IAAI,CA2CjC"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildRecentSessionsForRemote = buildRecentSessionsForRemote;
|
|
3
4
|
exports.mergeAndPush = mergeAndPush;
|
|
4
5
|
exports.pushToGist = pushToGist;
|
|
6
|
+
const node_fs_1 = require("node:fs");
|
|
5
7
|
const svg_js_1 = require("../../renderer/svg.js");
|
|
6
8
|
const animated_svg_js_1 = require("../../renderer/animated-svg.js");
|
|
7
9
|
const local_store_js_1 = require("../../store/local-store.js");
|
|
@@ -12,6 +14,32 @@ const public_profile_js_1 = require("../../store/public-profile.js");
|
|
|
12
14
|
const config_parser_js_1 = require("../../parsers/config-parser.js");
|
|
13
15
|
const config_sync_js_1 = require("../../store/config-sync.js");
|
|
14
16
|
const index_js_1 = require("../../i18n/index.js");
|
|
17
|
+
function isValidTimestamp(timestamp) {
|
|
18
|
+
return typeof timestamp === "string" && !Number.isNaN(Date.parse(timestamp));
|
|
19
|
+
}
|
|
20
|
+
function buildRecentSessionsForRemote(store, result) {
|
|
21
|
+
const avgHours = result.features.totalHours / Math.max(store.processedSessionIds.length, 1);
|
|
22
|
+
const snapshotMap = new Map(store.snapshots.map((s) => [s.sessionId, s]));
|
|
23
|
+
const tokenMap = new Map((store.tokenLog ?? []).map((t) => [t.sessionId, t]));
|
|
24
|
+
return store.processedSessionIds
|
|
25
|
+
.map((id) => {
|
|
26
|
+
const snap = snapshotMap.get(id);
|
|
27
|
+
const tokenEntry = tokenMap.get(id);
|
|
28
|
+
const endTimestamp = isValidTimestamp(tokenEntry?.timestamp) ? tokenEntry.timestamp : undefined;
|
|
29
|
+
const snapshotTimestamp = isValidTimestamp(snap?.timestamp) ? snap.timestamp : undefined;
|
|
30
|
+
const timestamp = endTimestamp ?? snapshotTimestamp;
|
|
31
|
+
if (!timestamp)
|
|
32
|
+
return null;
|
|
33
|
+
return {
|
|
34
|
+
id,
|
|
35
|
+
date: (0, remote_store_js_1.getUTCDate)(timestamp),
|
|
36
|
+
hours: avgHours,
|
|
37
|
+
tokens: tokenEntry?.tokens,
|
|
38
|
+
endTimestamp,
|
|
39
|
+
};
|
|
40
|
+
})
|
|
41
|
+
.filter((s) => s !== null);
|
|
42
|
+
}
|
|
15
43
|
/**
|
|
16
44
|
* Read remote store, merge local data, check achievements, re-render badge,
|
|
17
45
|
* and push SVG + JSON atomically. Used by both cmdPush and cmdProcess.
|
|
@@ -21,19 +49,7 @@ function mergeAndPush(store, result, gistId, username, verbose = false, configSn
|
|
|
21
49
|
let remote = remoteJson ? (0, remote_store_js_1.parseRemoteStore)(remoteJson) : null;
|
|
22
50
|
if (!remote)
|
|
23
51
|
remote = (0, remote_store_js_1.emptyRemoteStore)(username);
|
|
24
|
-
const
|
|
25
|
-
const tokenMap = new Map((store.tokenLog ?? []).map((t) => [t.sessionId, t]));
|
|
26
|
-
const localSessions = store.processedSessionIds.map((id) => {
|
|
27
|
-
const snap = store.snapshots.find((s) => s.sessionId === id);
|
|
28
|
-
const tokenEntry = tokenMap.get(id);
|
|
29
|
-
return {
|
|
30
|
-
id,
|
|
31
|
-
date: snap ? (0, remote_store_js_1.getUTCDate)(snap.timestamp) : new Date().toISOString().slice(0, 10),
|
|
32
|
-
hours: avgHours,
|
|
33
|
-
tokens: tokenEntry?.tokens,
|
|
34
|
-
endTimestamp: tokenEntry?.timestamp,
|
|
35
|
-
};
|
|
36
|
-
});
|
|
52
|
+
const localSessions = buildRecentSessionsForRemote(store, result);
|
|
37
53
|
const merged = (0, remote_store_js_1.mergeIntoRemote)(remote, localSessions, result);
|
|
38
54
|
const totals = (0, remote_store_js_1.getTotalStats)(merged);
|
|
39
55
|
const cfg = (0, local_store_js_1.loadConfig)();
|
|
@@ -46,6 +62,7 @@ function mergeAndPush(store, result, gistId, username, verbose = false, configSn
|
|
|
46
62
|
features: result.features,
|
|
47
63
|
activeDates: merged.streak.activeDates,
|
|
48
64
|
leaderboard: cfg.leaderboard ?? false,
|
|
65
|
+
aiEvidence: store.aiEvidence,
|
|
49
66
|
};
|
|
50
67
|
const newAchievements = (0, achievements_js_1.checkAchievements)(ctx, merged.achievements.map((a) => a.id));
|
|
51
68
|
for (const id of newAchievements) {
|
|
@@ -77,6 +94,15 @@ function mergeAndPush(store, result, gistId, username, verbose = false, configSn
|
|
|
77
94
|
if (configSnapshotJson) {
|
|
78
95
|
files["config-snapshots.json"] = configSnapshotJson;
|
|
79
96
|
}
|
|
97
|
+
const aiBadgePath = (0, local_store_js_1.getAIBadgePath)();
|
|
98
|
+
if ((0, node_fs_1.existsSync)(aiBadgePath)) {
|
|
99
|
+
try {
|
|
100
|
+
files["cc-proficiency-animated-ai-graded.svg"] = (0, node_fs_1.readFileSync)(aiBadgePath, "utf-8");
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// skip if unreadable
|
|
104
|
+
}
|
|
105
|
+
}
|
|
80
106
|
const pushResult = (0, uploader_js_1.pushGistFiles)(gistId, files);
|
|
81
107
|
if (!pushResult.success) {
|
|
82
108
|
return { success: false, error: pushResult.error };
|
|
@@ -87,6 +113,10 @@ function mergeAndPush(store, result, gistId, username, verbose = false, configSn
|
|
|
87
113
|
console.log((0, index_js_1.t)().services.publishing.pushedToGist);
|
|
88
114
|
console.log((0, index_js_1.t)().services.publishing.staticUrl(rawUrl));
|
|
89
115
|
console.log((0, index_js_1.t)().services.publishing.animatedUrl(animatedUrl));
|
|
116
|
+
if ((0, node_fs_1.existsSync)((0, local_store_js_1.getAIBadgePath)())) {
|
|
117
|
+
const aiGradedUrl = (0, uploader_js_1.getGistRawUrl)(username, gistId, "cc-proficiency-animated-ai-graded.svg");
|
|
118
|
+
console.log((0, index_js_1.t)().services.publishing.aiGradedUrl(aiGradedUrl));
|
|
119
|
+
}
|
|
90
120
|
console.log((0, index_js_1.t)().services.publishing.pushSummary(totals.sessions, totals.hours.toFixed(1), merged.achievements.length, merged.streak.current));
|
|
91
121
|
}
|
|
92
122
|
// Auto-update public profile if leaderboard is enabled
|