copilot-lens 1.0.5 → 1.0.8
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 +14 -0
- package/dist/server.js +25 -0
- package/dist/server.js.map +1 -1
- package/dist/sessions.d.ts +21 -0
- package/dist/sessions.js +358 -4
- package/dist/sessions.js.map +1 -1
- package/package.json +1 -1
- package/public/app.js +147 -8
- package/public/index.html +13 -0
- package/public/style.css +222 -7
package/README.md
CHANGED
|
@@ -91,6 +91,20 @@ Doughnut chart legends are interactive — click a label to toggle that segment'
|
|
|
91
91
|
- **Responsive layout** — works on any screen size
|
|
92
92
|
- **2-column grid layout** — compact charts with no wasted space
|
|
93
93
|
|
|
94
|
+
### 🏆 Copilot Effectiveness Score
|
|
95
|
+
|
|
96
|
+
Per-repo scoring (0-100) that measures how effectively you use Copilot CLI, with actionable improvement tips.
|
|
97
|
+
|
|
98
|
+
| Category | What It Measures |
|
|
99
|
+
|----------|-----------------|
|
|
100
|
+
| **Prompt Quality** | Average prompt length, how often Copilot needs clarification |
|
|
101
|
+
| **Tool Utilization** | Diversity of tools used (grep, glob, edit, task, etc.) |
|
|
102
|
+
| **Efficiency** | Tool success rate and turns per session |
|
|
103
|
+
| **MCP Utilization** | Configured MCP servers vs actually used (reads repo's `mcp.json`) |
|
|
104
|
+
| **Engagement** | Session duration sweet spot and usage consistency |
|
|
105
|
+
|
|
106
|
+

|
|
107
|
+
|
|
94
108
|
## How It Works
|
|
95
109
|
|
|
96
110
|
Copilot Lens reads session data from `~/.copilot/session-state/`, where GitHub Copilot CLI stores:
|
package/dist/server.js
CHANGED
|
@@ -47,6 +47,31 @@ function createApp() {
|
|
|
47
47
|
res.status(500).json({ error: err.message });
|
|
48
48
|
}
|
|
49
49
|
});
|
|
50
|
+
// API: List repos with scores
|
|
51
|
+
app.get("/api/insights/repos", (_req, res) => {
|
|
52
|
+
try {
|
|
53
|
+
const repos = (0, sessions_1.listReposWithScores)();
|
|
54
|
+
res.json(repos);
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
res.status(500).json({ error: err.message });
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
// API: Get score for specific repo
|
|
61
|
+
app.get("/api/insights/score", (req, res) => {
|
|
62
|
+
try {
|
|
63
|
+
const repo = req.query.repo;
|
|
64
|
+
if (!repo) {
|
|
65
|
+
res.status(400).json({ error: "repo query parameter required" });
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const score = (0, sessions_1.getRepoScore)(repo);
|
|
69
|
+
res.json(score);
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
res.status(500).json({ error: err.message });
|
|
73
|
+
}
|
|
74
|
+
});
|
|
50
75
|
// SPA fallback — only for non-API routes
|
|
51
76
|
app.use((_req, res) => {
|
|
52
77
|
res.sendFile(path_1.default.join(__dirname, "..", "public", "index.html"));
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;;;AAKA,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/sessions.d.ts
CHANGED
|
@@ -48,3 +48,24 @@ export interface AnalyticsData {
|
|
|
48
48
|
export declare function listSessions(): SessionMeta[];
|
|
49
49
|
export declare function getSession(sessionId: string): SessionDetail | null;
|
|
50
50
|
export declare function getAnalytics(): AnalyticsData;
|
|
51
|
+
export interface RepoScore {
|
|
52
|
+
repo: string;
|
|
53
|
+
totalScore: number;
|
|
54
|
+
sessionCount: number;
|
|
55
|
+
categories: {
|
|
56
|
+
promptQuality: CategoryScore;
|
|
57
|
+
toolUtilization: CategoryScore;
|
|
58
|
+
efficiency: CategoryScore;
|
|
59
|
+
mcpUtilization: CategoryScore;
|
|
60
|
+
engagement: CategoryScore;
|
|
61
|
+
};
|
|
62
|
+
tips: string[];
|
|
63
|
+
}
|
|
64
|
+
export interface CategoryScore {
|
|
65
|
+
score: number;
|
|
66
|
+
maxScore: number;
|
|
67
|
+
label: string;
|
|
68
|
+
detail: string;
|
|
69
|
+
}
|
|
70
|
+
export declare function getRepoScore(repoPath: string): RepoScore;
|
|
71
|
+
export declare function listReposWithScores(): RepoScore[];
|
package/dist/sessions.js
CHANGED
|
@@ -36,6 +36,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.listSessions = listSessions;
|
|
37
37
|
exports.getSession = getSession;
|
|
38
38
|
exports.getAnalytics = getAnalytics;
|
|
39
|
+
exports.getRepoScore = getRepoScore;
|
|
40
|
+
exports.listReposWithScores = listReposWithScores;
|
|
39
41
|
const fs = __importStar(require("fs"));
|
|
40
42
|
const path = __importStar(require("path"));
|
|
41
43
|
const os = __importStar(require("os"));
|
|
@@ -280,16 +282,16 @@ function getAnalytics() {
|
|
|
280
282
|
}
|
|
281
283
|
}
|
|
282
284
|
// Model usage
|
|
285
|
+
if (event.type === "session.model_change" && event.data?.newModel) {
|
|
286
|
+
const model = event.data.newModel;
|
|
287
|
+
modelUsage[model] = (modelUsage[model] || 0) + 1;
|
|
288
|
+
}
|
|
283
289
|
if (event.type === "session.info" && event.data?.infoType === "model") {
|
|
284
290
|
const msg = event.data?.message || "";
|
|
285
291
|
const match = msg.match(/Model changed to:\s*([^\s.]+(?:[-.][^\s.]+)*)/i);
|
|
286
292
|
if (match)
|
|
287
293
|
modelUsage[match[1]] = (modelUsage[match[1]] || 0) + 1;
|
|
288
294
|
}
|
|
289
|
-
if (event.type === "session.start" && event.data?.model) {
|
|
290
|
-
const model = event.data.model;
|
|
291
|
-
modelUsage[model] = (modelUsage[model] || 0) + 1;
|
|
292
|
-
}
|
|
293
295
|
// Turn counting
|
|
294
296
|
if (event.type === "assistant.turn_start")
|
|
295
297
|
turnCount++;
|
|
@@ -343,4 +345,356 @@ function getAnalytics() {
|
|
|
343
345
|
errorTypes,
|
|
344
346
|
};
|
|
345
347
|
}
|
|
348
|
+
function scanMcpConfig(repoPath) {
|
|
349
|
+
const configPaths = [
|
|
350
|
+
path.join(repoPath, ".vscode", "mcp.json"),
|
|
351
|
+
path.join(repoPath, ".github", "copilot", "mcp.json"),
|
|
352
|
+
];
|
|
353
|
+
for (const configPath of configPaths) {
|
|
354
|
+
try {
|
|
355
|
+
if (fs.existsSync(configPath)) {
|
|
356
|
+
let raw = fs.readFileSync(configPath, "utf-8");
|
|
357
|
+
// Strip trailing commas (JSONC / VS Code style)
|
|
358
|
+
raw = raw.replace(/,\s*([\]}])/g, "$1");
|
|
359
|
+
const config = JSON.parse(raw);
|
|
360
|
+
const servers = config.servers || config.mcpServers || {};
|
|
361
|
+
return Object.keys(servers);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
catch { }
|
|
365
|
+
}
|
|
366
|
+
return [];
|
|
367
|
+
}
|
|
368
|
+
function collectRepoData(repoPath) {
|
|
369
|
+
const sessions = listSessions();
|
|
370
|
+
const repoSessions = sessions.filter((s) => (s.gitRoot || s.cwd) === repoPath);
|
|
371
|
+
const data = {
|
|
372
|
+
msgLengths: [],
|
|
373
|
+
askUserCount: 0,
|
|
374
|
+
totalUserMsgs: 0,
|
|
375
|
+
toolsUsed: new Set(),
|
|
376
|
+
toolSuccess: 0,
|
|
377
|
+
toolTotal: 0,
|
|
378
|
+
turns: [],
|
|
379
|
+
durations: [],
|
|
380
|
+
mcpServersUsed: new Set(),
|
|
381
|
+
sessionDays: new Set(),
|
|
382
|
+
sessionCount: repoSessions.length,
|
|
383
|
+
};
|
|
384
|
+
const sessionDir = getSessionDir();
|
|
385
|
+
for (const s of repoSessions) {
|
|
386
|
+
const day = s.createdAt.slice(0, 10);
|
|
387
|
+
if (day)
|
|
388
|
+
data.sessionDays.add(day);
|
|
389
|
+
try {
|
|
390
|
+
const eventsPath = path.join(sessionDir, s.id, "events.jsonl");
|
|
391
|
+
if (!fs.existsSync(eventsPath))
|
|
392
|
+
continue;
|
|
393
|
+
const content = fs.readFileSync(eventsPath, "utf-8");
|
|
394
|
+
let turnCount = 0;
|
|
395
|
+
const timestamps = [];
|
|
396
|
+
for (const line of content.split("\n")) {
|
|
397
|
+
if (!line.trim())
|
|
398
|
+
continue;
|
|
399
|
+
try {
|
|
400
|
+
const event = JSON.parse(line);
|
|
401
|
+
if (event.timestamp) {
|
|
402
|
+
const t = new Date(event.timestamp).getTime();
|
|
403
|
+
if (t > 0)
|
|
404
|
+
timestamps.push(t);
|
|
405
|
+
}
|
|
406
|
+
if (event.type === "user.message") {
|
|
407
|
+
const msg = event.data?.content || event.data?.transformedContent || "";
|
|
408
|
+
data.msgLengths.push(msg.length);
|
|
409
|
+
data.totalUserMsgs++;
|
|
410
|
+
}
|
|
411
|
+
if (event.type === "tool.execution_start") {
|
|
412
|
+
const tool = event.data?.tool || event.data?.toolName || "";
|
|
413
|
+
if (tool)
|
|
414
|
+
data.toolsUsed.add(tool);
|
|
415
|
+
if (tool === "ask_user")
|
|
416
|
+
data.askUserCount++;
|
|
417
|
+
}
|
|
418
|
+
if (event.type === "tool.execution_complete") {
|
|
419
|
+
data.toolTotal++;
|
|
420
|
+
if (event.data?.success)
|
|
421
|
+
data.toolSuccess++;
|
|
422
|
+
}
|
|
423
|
+
if (event.type === "assistant.turn_start")
|
|
424
|
+
turnCount++;
|
|
425
|
+
if (event.type === "session.info" && event.data?.infoType === "mcp") {
|
|
426
|
+
const msg = event.data?.message || "";
|
|
427
|
+
const match = msg.match(/Configured MCP servers?:\s*(.+)/i);
|
|
428
|
+
if (match) {
|
|
429
|
+
for (const server of match[1].split(",").map((s) => s.trim())) {
|
|
430
|
+
if (server)
|
|
431
|
+
data.mcpServersUsed.add(server);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
catch { }
|
|
437
|
+
}
|
|
438
|
+
if (turnCount > 0)
|
|
439
|
+
data.turns.push(turnCount);
|
|
440
|
+
if (timestamps.length >= 2) {
|
|
441
|
+
timestamps.sort((a, b) => a - b);
|
|
442
|
+
let dur = 0;
|
|
443
|
+
for (let i = 1; i < timestamps.length; i++) {
|
|
444
|
+
dur += Math.min(timestamps[i] - timestamps[i - 1], 300000);
|
|
445
|
+
}
|
|
446
|
+
if (dur > 0)
|
|
447
|
+
data.durations.push(dur);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
catch { }
|
|
451
|
+
}
|
|
452
|
+
return data;
|
|
453
|
+
}
|
|
454
|
+
function scorePromptQuality(data) {
|
|
455
|
+
const avgLen = data.msgLengths.length
|
|
456
|
+
? data.msgLengths.reduce((a, b) => a + b, 0) / data.msgLengths.length
|
|
457
|
+
: 0;
|
|
458
|
+
const askRatio = data.totalUserMsgs > 0 ? data.askUserCount / data.totalUserMsgs : 0;
|
|
459
|
+
let score = 0;
|
|
460
|
+
let detail = "";
|
|
461
|
+
if (avgLen >= 100) {
|
|
462
|
+
score = 20;
|
|
463
|
+
detail = `Avg prompt length: ${Math.round(avgLen)} chars (excellent)`;
|
|
464
|
+
}
|
|
465
|
+
else if (avgLen >= 50) {
|
|
466
|
+
score = 15;
|
|
467
|
+
detail = `Avg prompt length: ${Math.round(avgLen)} chars (good)`;
|
|
468
|
+
}
|
|
469
|
+
else if (avgLen >= 20) {
|
|
470
|
+
score = 10;
|
|
471
|
+
detail = `Avg prompt length: ${Math.round(avgLen)} chars (fair)`;
|
|
472
|
+
}
|
|
473
|
+
else {
|
|
474
|
+
score = 5;
|
|
475
|
+
detail = `Avg prompt length: ${Math.round(avgLen)} chars (short)`;
|
|
476
|
+
}
|
|
477
|
+
// Penalty for high ask_user ratio (copilot needing clarification)
|
|
478
|
+
const penalty = Math.floor(askRatio * 30);
|
|
479
|
+
score = Math.max(0, score - penalty);
|
|
480
|
+
if (penalty > 0)
|
|
481
|
+
detail += ` | ${Math.round(askRatio * 100)}% needed clarification`;
|
|
482
|
+
return { score, maxScore: 20, label: "Prompt Quality", detail };
|
|
483
|
+
}
|
|
484
|
+
function scoreToolUtilization(data) {
|
|
485
|
+
const count = data.toolsUsed.size;
|
|
486
|
+
let score = 0;
|
|
487
|
+
let detail = `${count} distinct tools used`;
|
|
488
|
+
if (count >= 7) {
|
|
489
|
+
score = 20;
|
|
490
|
+
detail += " (excellent diversity)";
|
|
491
|
+
}
|
|
492
|
+
else if (count >= 5) {
|
|
493
|
+
score = 15;
|
|
494
|
+
detail += " (good diversity)";
|
|
495
|
+
}
|
|
496
|
+
else if (count >= 3) {
|
|
497
|
+
score = 10;
|
|
498
|
+
detail += " (moderate)";
|
|
499
|
+
}
|
|
500
|
+
else {
|
|
501
|
+
score = 5;
|
|
502
|
+
detail += " (limited)";
|
|
503
|
+
}
|
|
504
|
+
return { score, maxScore: 20, label: "Tool Utilization", detail };
|
|
505
|
+
}
|
|
506
|
+
function scoreEfficiency(data) {
|
|
507
|
+
const successRate = data.toolTotal > 0 ? data.toolSuccess / data.toolTotal : 1;
|
|
508
|
+
const avgTurns = data.turns.length
|
|
509
|
+
? data.turns.reduce((a, b) => a + b, 0) / data.turns.length
|
|
510
|
+
: 0;
|
|
511
|
+
let score = 0;
|
|
512
|
+
let detail = "";
|
|
513
|
+
if (successRate >= 0.9) {
|
|
514
|
+
score = 15;
|
|
515
|
+
detail = `${Math.round(successRate * 100)}% tool success rate`;
|
|
516
|
+
}
|
|
517
|
+
else if (successRate >= 0.8) {
|
|
518
|
+
score = 10;
|
|
519
|
+
detail = `${Math.round(successRate * 100)}% tool success rate`;
|
|
520
|
+
}
|
|
521
|
+
else if (successRate >= 0.7) {
|
|
522
|
+
score = 7;
|
|
523
|
+
detail = `${Math.round(successRate * 100)}% tool success rate`;
|
|
524
|
+
}
|
|
525
|
+
else {
|
|
526
|
+
score = 4;
|
|
527
|
+
detail = `${Math.round(successRate * 100)}% tool success rate`;
|
|
528
|
+
}
|
|
529
|
+
// Bonus for concise sessions
|
|
530
|
+
if (avgTurns > 0 && avgTurns < 15) {
|
|
531
|
+
score = Math.min(20, score + 5);
|
|
532
|
+
detail += ` | Avg ${Math.round(avgTurns)} turns/session (concise)`;
|
|
533
|
+
}
|
|
534
|
+
else if (avgTurns >= 15) {
|
|
535
|
+
detail += ` | Avg ${Math.round(avgTurns)} turns/session`;
|
|
536
|
+
}
|
|
537
|
+
return { score, maxScore: 20, label: "Efficiency", detail };
|
|
538
|
+
}
|
|
539
|
+
function scoreMcpUtilization(data, configuredServers) {
|
|
540
|
+
let score = 0;
|
|
541
|
+
let detail = "";
|
|
542
|
+
if (configuredServers.length === 0) {
|
|
543
|
+
score = 10;
|
|
544
|
+
detail = "No MCP servers configured (neutral)";
|
|
545
|
+
}
|
|
546
|
+
else {
|
|
547
|
+
// Fuzzy match: config name "bluebird-mcp" matches usage "bluebird" or tool "bluebird-engineering_copilot"
|
|
548
|
+
const usedServers = [...data.mcpServersUsed, ...data.toolsUsed];
|
|
549
|
+
const used = configuredServers.filter((configured) => {
|
|
550
|
+
const cfgLower = configured.toLowerCase().replace(/[-_\s]/g, "");
|
|
551
|
+
return usedServers.some((u) => {
|
|
552
|
+
const uLower = u.toLowerCase().replace(/[-_\s]/g, "");
|
|
553
|
+
return uLower.includes(cfgLower) || cfgLower.includes(uLower);
|
|
554
|
+
});
|
|
555
|
+
});
|
|
556
|
+
const ratio = used.length / configuredServers.length;
|
|
557
|
+
if (ratio >= 0.8) {
|
|
558
|
+
score = 20;
|
|
559
|
+
detail = `Using ${used.length}/${configuredServers.length} configured MCP servers`;
|
|
560
|
+
}
|
|
561
|
+
else if (ratio >= 0.5) {
|
|
562
|
+
score = 15;
|
|
563
|
+
detail = `Using ${used.length}/${configuredServers.length} configured MCP servers`;
|
|
564
|
+
}
|
|
565
|
+
else if (ratio > 0) {
|
|
566
|
+
score = 10;
|
|
567
|
+
detail = `Using ${used.length}/${configuredServers.length} configured MCP servers`;
|
|
568
|
+
}
|
|
569
|
+
else {
|
|
570
|
+
score = 5;
|
|
571
|
+
detail = `${configuredServers.length} MCP servers configured but none used`;
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
return { score, maxScore: 20, label: "MCP Utilization", detail };
|
|
575
|
+
}
|
|
576
|
+
function scoreEngagement(data) {
|
|
577
|
+
const avgDur = data.durations.length
|
|
578
|
+
? data.durations.reduce((a, b) => a + b, 0) / data.durations.length
|
|
579
|
+
: 0;
|
|
580
|
+
const avgMin = avgDur / 60000;
|
|
581
|
+
let score = 0;
|
|
582
|
+
let detail = "";
|
|
583
|
+
if (avgMin >= 5 && avgMin <= 30) {
|
|
584
|
+
score = 15;
|
|
585
|
+
detail = `Avg session: ${Math.round(avgMin)}min (ideal)`;
|
|
586
|
+
}
|
|
587
|
+
else if (avgMin > 30) {
|
|
588
|
+
score = 10;
|
|
589
|
+
detail = `Avg session: ${Math.round(avgMin)}min (long)`;
|
|
590
|
+
}
|
|
591
|
+
else if (avgMin > 0) {
|
|
592
|
+
score = 7;
|
|
593
|
+
detail = `Avg session: ${Math.round(avgMin)}min (brief)`;
|
|
594
|
+
}
|
|
595
|
+
else {
|
|
596
|
+
score = 3;
|
|
597
|
+
detail = "No session duration data";
|
|
598
|
+
}
|
|
599
|
+
// Bonus for consistency
|
|
600
|
+
const days = data.sessionDays.size;
|
|
601
|
+
if (days >= 7) {
|
|
602
|
+
score = Math.min(20, score + 5);
|
|
603
|
+
detail += ` | Active on ${days} days (consistent)`;
|
|
604
|
+
}
|
|
605
|
+
else if (days >= 3) {
|
|
606
|
+
score = Math.min(20, score + 3);
|
|
607
|
+
detail += ` | Active on ${days} days`;
|
|
608
|
+
}
|
|
609
|
+
else {
|
|
610
|
+
detail += ` | Active on ${days} day(s)`;
|
|
611
|
+
}
|
|
612
|
+
return { score, maxScore: 20, label: "Engagement", detail };
|
|
613
|
+
}
|
|
614
|
+
function generateTips(categories, data, configuredServers) {
|
|
615
|
+
const tips = [];
|
|
616
|
+
if (categories.promptQuality.score < 15) {
|
|
617
|
+
const avgLen = data.msgLengths.length
|
|
618
|
+
? Math.round(data.msgLengths.reduce((a, b) => a + b, 0) / data.msgLengths.length)
|
|
619
|
+
: 0;
|
|
620
|
+
tips.push(`Your prompts average ${avgLen} chars — try adding more context, expected behavior, and constraints to reduce back-and-forth.`);
|
|
621
|
+
}
|
|
622
|
+
if (categories.toolUtilization.score < 15) {
|
|
623
|
+
const used = [...data.toolsUsed];
|
|
624
|
+
const suggestions = ["grep", "glob", "edit", "task", "view"].filter((t) => !used.includes(t));
|
|
625
|
+
if (suggestions.length > 0) {
|
|
626
|
+
tips.push(`Try using ${suggestions.slice(0, 3).join(", ")} — these tools can speed up your workflow.`);
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
if (categories.efficiency.score < 15) {
|
|
630
|
+
const successRate = data.toolTotal > 0 ? Math.round((data.toolSuccess / data.toolTotal) * 100) : 100;
|
|
631
|
+
if (successRate < 85) {
|
|
632
|
+
tips.push(`Your tool success rate is ${successRate}% — review failing commands and provide clearer instructions.`);
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
if (categories.mcpUtilization.score < 15 && configuredServers.length > 0) {
|
|
636
|
+
const usedServers = [...data.mcpServersUsed, ...data.toolsUsed];
|
|
637
|
+
const unused = configuredServers.filter((configured) => {
|
|
638
|
+
const cfgLower = configured.toLowerCase().replace(/[-_\s]/g, "");
|
|
639
|
+
return !usedServers.some((u) => {
|
|
640
|
+
const uLower = u.toLowerCase().replace(/[-_\s]/g, "");
|
|
641
|
+
return uLower.includes(cfgLower) || cfgLower.includes(uLower);
|
|
642
|
+
});
|
|
643
|
+
});
|
|
644
|
+
if (unused.length > 0) {
|
|
645
|
+
tips.push(`You have unused MCP servers: ${unused.join(", ")}. Try leveraging them in your prompts.`);
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
else if (configuredServers.length === 0) {
|
|
649
|
+
tips.push("Consider adding MCP servers to your project for enhanced capabilities (e.g., database access, API integrations).");
|
|
650
|
+
}
|
|
651
|
+
if (categories.engagement.score < 15) {
|
|
652
|
+
const avgDur = data.durations.length
|
|
653
|
+
? data.durations.reduce((a, b) => a + b, 0) / data.durations.length / 60000
|
|
654
|
+
: 0;
|
|
655
|
+
if (avgDur < 5) {
|
|
656
|
+
tips.push("Your sessions are very brief — try tackling larger tasks with Copilot for more impactful results.");
|
|
657
|
+
}
|
|
658
|
+
if (data.sessionDays.size < 3) {
|
|
659
|
+
tips.push("Use Copilot more regularly to build momentum and improve your workflow.");
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
if (tips.length === 0) {
|
|
663
|
+
tips.push("Great job! You're using Copilot CLI effectively. Keep it up! 🎉");
|
|
664
|
+
}
|
|
665
|
+
return tips;
|
|
666
|
+
}
|
|
667
|
+
function getRepoScore(repoPath) {
|
|
668
|
+
const data = collectRepoData(repoPath);
|
|
669
|
+
const configuredServers = scanMcpConfig(repoPath);
|
|
670
|
+
const categories = {
|
|
671
|
+
promptQuality: scorePromptQuality(data),
|
|
672
|
+
toolUtilization: scoreToolUtilization(data),
|
|
673
|
+
efficiency: scoreEfficiency(data),
|
|
674
|
+
mcpUtilization: scoreMcpUtilization(data, configuredServers),
|
|
675
|
+
engagement: scoreEngagement(data),
|
|
676
|
+
};
|
|
677
|
+
const totalScore = Object.values(categories).reduce((sum, c) => sum + c.score, 0);
|
|
678
|
+
const tips = generateTips(categories, data, configuredServers);
|
|
679
|
+
return {
|
|
680
|
+
repo: repoPath,
|
|
681
|
+
totalScore,
|
|
682
|
+
sessionCount: data.sessionCount,
|
|
683
|
+
categories,
|
|
684
|
+
tips,
|
|
685
|
+
};
|
|
686
|
+
}
|
|
687
|
+
function listReposWithScores() {
|
|
688
|
+
const sessions = listSessions();
|
|
689
|
+
const repos = new Set();
|
|
690
|
+
for (const s of sessions) {
|
|
691
|
+
const repo = s.gitRoot || s.cwd;
|
|
692
|
+
if (repo)
|
|
693
|
+
repos.add(repo);
|
|
694
|
+
}
|
|
695
|
+
return [...repos]
|
|
696
|
+
.map((repo) => getRepoScore(repo))
|
|
697
|
+
.filter((r) => r.sessionCount >= 3) // minimum 3 sessions
|
|
698
|
+
.sort((a, b) => b.totalScore - a.totalScore);
|
|
699
|
+
}
|
|
346
700
|
//# sourceMappingURL=sessions.js.map
|
package/dist/sessions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/public/app.js
CHANGED
|
@@ -49,13 +49,19 @@ document.querySelectorAll(".nav-btn").forEach((btn) => {
|
|
|
49
49
|
btn.classList.add("active");
|
|
50
50
|
document.getElementById(btn.dataset.page + "Page").classList.add("active");
|
|
51
51
|
if (btn.dataset.page === "analytics") loadAnalytics();
|
|
52
|
+
if (btn.dataset.page === "insights") loadInsights();
|
|
52
53
|
});
|
|
53
54
|
});
|
|
54
55
|
|
|
55
56
|
// Modal
|
|
56
|
-
modalClose.addEventListener("click", () => detailModal.classList.add("hidden"));
|
|
57
|
+
modalClose.addEventListener("click", () => { detailModal.classList.add("hidden"); document.body.style.overflow = ""; });
|
|
57
58
|
detailModal.addEventListener("click", (e) => {
|
|
58
|
-
if (e.target === detailModal) detailModal.classList.add("hidden");
|
|
59
|
+
if (e.target === detailModal) { detailModal.classList.add("hidden"); document.body.style.overflow = ""; }
|
|
60
|
+
});
|
|
61
|
+
document.addEventListener("keydown", (e) => {
|
|
62
|
+
if (e.key === "Escape" && !detailModal.classList.contains("hidden")) {
|
|
63
|
+
detailModal.classList.add("hidden"); document.body.style.overflow = "";
|
|
64
|
+
}
|
|
59
65
|
});
|
|
60
66
|
|
|
61
67
|
// Format helpers
|
|
@@ -164,6 +170,7 @@ function renderSessions() {
|
|
|
164
170
|
async function openDetail(id) {
|
|
165
171
|
detailContent.innerHTML = '<div style="text-align:center;padding:40px;color:var(--text-dim)">Loading...</div>';
|
|
166
172
|
detailModal.classList.remove("hidden");
|
|
173
|
+
document.body.style.overflow = "hidden";
|
|
167
174
|
|
|
168
175
|
try {
|
|
169
176
|
const res = await fetch(`/api/sessions/${id}`);
|
|
@@ -180,17 +187,38 @@ function renderDetail(s) {
|
|
|
180
187
|
const toolCalls = s.events.filter((e) => e.type === "tool.execution_start");
|
|
181
188
|
const errors = s.events.filter((e) => e.type === "session.error");
|
|
182
189
|
|
|
190
|
+
// Track model changes for conversation display
|
|
191
|
+
let currentModel = "";
|
|
192
|
+
const startEvent = s.events.find((e) => e.type === "session.start");
|
|
193
|
+
if (startEvent?.data?.model) currentModel = startEvent.data.model;
|
|
194
|
+
|
|
195
|
+
// Build a map of model at each event index
|
|
196
|
+
const modelAtIndex = {};
|
|
197
|
+
for (let i = 0; i < s.events.length; i++) {
|
|
198
|
+
const e = s.events[i];
|
|
199
|
+
if (e.type === "session.model_change" && e.data?.newModel) {
|
|
200
|
+
currentModel = e.data.newModel;
|
|
201
|
+
}
|
|
202
|
+
if (e.type === "session.info" && e.data?.infoType === "model") {
|
|
203
|
+
const match = (e.data.message || "").match(/Model changed to:\s*([^\s.]+(?:[-.][^\s.]+)*)/i);
|
|
204
|
+
if (match) currentModel = match[1];
|
|
205
|
+
}
|
|
206
|
+
modelAtIndex[i] = currentModel;
|
|
207
|
+
}
|
|
208
|
+
|
|
183
209
|
// Interleave conversation messages in order
|
|
184
210
|
const conversation = s.events
|
|
185
|
-
.
|
|
186
|
-
.
|
|
211
|
+
.map((e, i) => ({ e, i }))
|
|
212
|
+
.filter(({ e }) => (e.type === "user.message" || e.type === "assistant.message") && (e.data?.content || "").trim())
|
|
213
|
+
.map(({ e, i }) => {
|
|
187
214
|
const isUser = e.type === "user.message";
|
|
188
215
|
const content = e.data?.content || "";
|
|
189
|
-
|
|
190
|
-
const
|
|
216
|
+
const display = content.length > 800 ? content.slice(0, 800) + "\n...(truncated)" : content;
|
|
217
|
+
const time = e.timestamp ? new Date(e.timestamp).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }) : "";
|
|
218
|
+
const model = !isUser && modelAtIndex[i] ? `<span class="message-model">${modelAtIndex[i]}</span>` : "";
|
|
191
219
|
return `<div class="message ${isUser ? "message-user" : "message-assistant"}">
|
|
192
|
-
<div class="message-label">${isUser ? "👤 You" : "🤖 Copilot"}</div>
|
|
193
|
-
|
|
220
|
+
<div class="message-label">${isUser ? "👤 You" : "🤖 Copilot"}${model}${time ? `<span class="message-time">${time}</span>` : ""}</div>
|
|
221
|
+
<div class="message-body">${escapeHtml(display)}</div>
|
|
194
222
|
</div>`;
|
|
195
223
|
})
|
|
196
224
|
.join("");
|
|
@@ -454,6 +482,9 @@ refreshBtn.addEventListener("click", () => {
|
|
|
454
482
|
if (document.getElementById("analyticsPage").classList.contains("active")) {
|
|
455
483
|
loadAnalytics();
|
|
456
484
|
}
|
|
485
|
+
if (document.getElementById("insightsPage").classList.contains("active")) {
|
|
486
|
+
loadInsights();
|
|
487
|
+
}
|
|
457
488
|
setTimeout(() => refreshBtn.classList.remove("spinning"), 600);
|
|
458
489
|
});
|
|
459
490
|
|
|
@@ -476,5 +507,113 @@ themeToggle.addEventListener("click", () => {
|
|
|
476
507
|
}
|
|
477
508
|
});
|
|
478
509
|
|
|
510
|
+
// ============ Insights ============
|
|
511
|
+
const repoSelector = document.getElementById("repoSelector");
|
|
512
|
+
const insightsContent = document.getElementById("insightsContent");
|
|
513
|
+
let insightsRepos = [];
|
|
514
|
+
|
|
515
|
+
async function loadInsights() {
|
|
516
|
+
try {
|
|
517
|
+
const res = await fetch("/api/insights/repos");
|
|
518
|
+
insightsRepos = await res.json();
|
|
519
|
+
renderRepoSelector();
|
|
520
|
+
if (insightsRepos.length > 0) {
|
|
521
|
+
const selected = insightsRepos.find((r) => r.repo === repoSelector.value) || insightsRepos[0];
|
|
522
|
+
repoSelector.value = selected.repo;
|
|
523
|
+
renderInsightsScore(selected);
|
|
524
|
+
}
|
|
525
|
+
} catch (err) {
|
|
526
|
+
insightsContent.innerHTML = `<div style="color:var(--danger);padding:20px">Failed to load insights: ${err.message}</div>`;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
function renderRepoSelector() {
|
|
531
|
+
if (insightsRepos.length === 0) {
|
|
532
|
+
repoSelector.innerHTML = '<option value="">No repos with enough data (need 3+ sessions)</option>';
|
|
533
|
+
insightsContent.innerHTML = '<div class="not-enough-data"><div class="nod-icon">📊</div><p>Need at least 3 sessions in a repository to generate a score.</p></div>';
|
|
534
|
+
return;
|
|
535
|
+
}
|
|
536
|
+
const current = repoSelector.value;
|
|
537
|
+
repoSelector.innerHTML = insightsRepos
|
|
538
|
+
.map((r) => `<option value="${r.repo}">${shortDir(r.repo)} — ${r.totalScore}/100</option>`)
|
|
539
|
+
.join("");
|
|
540
|
+
if (current && insightsRepos.find((r) => r.repo === current)) {
|
|
541
|
+
repoSelector.value = current;
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
repoSelector.addEventListener("change", () => {
|
|
546
|
+
const repo = insightsRepos.find((r) => r.repo === repoSelector.value);
|
|
547
|
+
if (repo) renderInsightsScore(repo);
|
|
548
|
+
});
|
|
549
|
+
|
|
550
|
+
function getScoreColor(score, max) {
|
|
551
|
+
const pct = score / max;
|
|
552
|
+
if (pct >= 0.7) return "var(--accent2)";
|
|
553
|
+
if (pct >= 0.4) return "var(--warning)";
|
|
554
|
+
return "var(--danger)";
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
function renderInsightsScore(data) {
|
|
558
|
+
const color = getScoreColor(data.totalScore, 100);
|
|
559
|
+
const circumference = 2 * Math.PI * 65;
|
|
560
|
+
const offset = circumference - (data.totalScore / 100) * circumference;
|
|
561
|
+
|
|
562
|
+
const catIcons = {
|
|
563
|
+
promptQuality: "💬",
|
|
564
|
+
toolUtilization: "🔧",
|
|
565
|
+
efficiency: "⚡",
|
|
566
|
+
mcpUtilization: "🔌",
|
|
567
|
+
engagement: "📈",
|
|
568
|
+
};
|
|
569
|
+
|
|
570
|
+
const categoryCards = Object.entries(data.categories)
|
|
571
|
+
.map(([key, cat]) => {
|
|
572
|
+
const pct = (cat.score / cat.maxScore) * 100;
|
|
573
|
+
const barColor = getScoreColor(cat.score, cat.maxScore);
|
|
574
|
+
return `
|
|
575
|
+
<div class="category-card">
|
|
576
|
+
<div class="cat-header">
|
|
577
|
+
<span class="cat-label">${catIcons[key] || "📊"} ${cat.label}</span>
|
|
578
|
+
<span class="cat-score" style="color:${barColor}">${cat.score}/${cat.maxScore}</span>
|
|
579
|
+
</div>
|
|
580
|
+
<div class="cat-bar"><div class="cat-bar-fill" style="width:${pct}%;background:${barColor}"></div></div>
|
|
581
|
+
<div class="cat-detail">${escapeHtml(cat.detail)}</div>
|
|
582
|
+
</div>`;
|
|
583
|
+
})
|
|
584
|
+
.join("");
|
|
585
|
+
|
|
586
|
+
const tipItems = data.tips
|
|
587
|
+
.map((tip) => `<div class="tip-item"><span class="tip-icon">💡</span><span>${escapeHtml(tip)}</span></div>`)
|
|
588
|
+
.join("");
|
|
589
|
+
|
|
590
|
+
insightsContent.innerHTML = `
|
|
591
|
+
<div class="score-overview">
|
|
592
|
+
<div class="score-circle">
|
|
593
|
+
<svg viewBox="0 0 160 160">
|
|
594
|
+
<circle class="track" cx="80" cy="80" r="65"></circle>
|
|
595
|
+
<circle class="progress" cx="80" cy="80" r="65"
|
|
596
|
+
stroke="${color}"
|
|
597
|
+
stroke-dasharray="${circumference}"
|
|
598
|
+
stroke-dashoffset="${offset}"></circle>
|
|
599
|
+
</svg>
|
|
600
|
+
<div class="score-text">
|
|
601
|
+
<span class="score-number" style="color:${color}">${data.totalScore}</span>
|
|
602
|
+
<span class="score-max">/ 100</span>
|
|
603
|
+
</div>
|
|
604
|
+
</div>
|
|
605
|
+
<div class="score-summary">
|
|
606
|
+
<h2>Copilot Effectiveness Score</h2>
|
|
607
|
+
<div class="repo-name">${escapeHtml(data.repo)}</div>
|
|
608
|
+
<div class="session-info">${data.sessionCount} sessions analyzed</div>
|
|
609
|
+
</div>
|
|
610
|
+
</div>
|
|
611
|
+
<div class="category-grid">${categoryCards}</div>
|
|
612
|
+
<div class="tips-section">
|
|
613
|
+
<h3>💡 Tips to Improve</h3>
|
|
614
|
+
${tipItems}
|
|
615
|
+
</div>`;
|
|
616
|
+
}
|
|
617
|
+
|
|
479
618
|
// Init
|
|
480
619
|
loadSessions();
|
package/public/index.html
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
<nav>
|
|
14
14
|
<button class="nav-btn active" data-page="sessions">Sessions</button>
|
|
15
15
|
<button class="nav-btn" data-page="analytics">Analytics</button>
|
|
16
|
+
<button class="nav-btn" data-page="insights">Insights</button>
|
|
16
17
|
</nav>
|
|
17
18
|
<button class="refresh-btn" id="refreshBtn" title="Refresh data">⟳ Refresh</button>
|
|
18
19
|
<button class="refresh-btn" id="themeToggle" title="Toggle light/dark mode">☀️</button>
|
|
@@ -82,6 +83,18 @@
|
|
|
82
83
|
</div>
|
|
83
84
|
</section>
|
|
84
85
|
|
|
86
|
+
<!-- Insights Page -->
|
|
87
|
+
<section id="insightsPage" class="page">
|
|
88
|
+
<div class="insights-header">
|
|
89
|
+
<select id="repoSelector">
|
|
90
|
+
<option value="">Loading repos...</option>
|
|
91
|
+
</select>
|
|
92
|
+
</div>
|
|
93
|
+
<div id="insightsContent">
|
|
94
|
+
<div style="color:var(--text-dim);padding:40px;text-align:center">Select a repository to view its effectiveness score</div>
|
|
95
|
+
</div>
|
|
96
|
+
</section>
|
|
97
|
+
|
|
85
98
|
<!-- Session Detail Modal -->
|
|
86
99
|
<div id="detailModal" class="modal hidden">
|
|
87
100
|
<div class="modal-content">
|
package/public/style.css
CHANGED
|
@@ -332,18 +332,24 @@ main { max-width: 1200px; margin: 0 auto; padding: 24px; }
|
|
|
332
332
|
.conversation-list {
|
|
333
333
|
display: flex;
|
|
334
334
|
flex-direction: column;
|
|
335
|
-
gap:
|
|
335
|
+
gap: 6px;
|
|
336
336
|
padding: 8px 0;
|
|
337
337
|
}
|
|
338
338
|
|
|
339
339
|
.message {
|
|
340
|
-
max-width:
|
|
341
|
-
padding: 12px
|
|
342
|
-
border-radius:
|
|
343
|
-
font-size: 0.
|
|
344
|
-
line-height: 1.
|
|
340
|
+
max-width: 85%;
|
|
341
|
+
padding: 8px 12px;
|
|
342
|
+
border-radius: 10px;
|
|
343
|
+
font-size: 0.83rem;
|
|
344
|
+
line-height: 1.45;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
.message-body {
|
|
345
348
|
white-space: pre-wrap;
|
|
346
349
|
word-break: break-word;
|
|
350
|
+
overflow-wrap: break-word;
|
|
351
|
+
max-height: 300px;
|
|
352
|
+
overflow-y: auto;
|
|
347
353
|
}
|
|
348
354
|
|
|
349
355
|
.message-user {
|
|
@@ -359,14 +365,35 @@ main { max-width: 1200px; margin: 0 auto; padding: 24px; }
|
|
|
359
365
|
}
|
|
360
366
|
|
|
361
367
|
.message-label {
|
|
368
|
+
display: flex;
|
|
369
|
+
justify-content: space-between;
|
|
370
|
+
align-items: center;
|
|
362
371
|
font-size: 0.7rem;
|
|
363
372
|
font-weight: 700;
|
|
364
373
|
text-transform: uppercase;
|
|
365
374
|
letter-spacing: 0.5px;
|
|
366
|
-
margin-bottom:
|
|
375
|
+
margin-bottom: 4px;
|
|
367
376
|
color: var(--text-dim);
|
|
368
377
|
}
|
|
369
378
|
|
|
379
|
+
.message-time {
|
|
380
|
+
font-weight: 400;
|
|
381
|
+
font-size: 0.68rem;
|
|
382
|
+
opacity: 0.7;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
.message-model {
|
|
386
|
+
font-weight: 500;
|
|
387
|
+
font-size: 0.65rem;
|
|
388
|
+
text-transform: none;
|
|
389
|
+
letter-spacing: 0;
|
|
390
|
+
padding: 1px 6px;
|
|
391
|
+
border-radius: 4px;
|
|
392
|
+
background: color-mix(in srgb, var(--accent2) 15%, var(--surface));
|
|
393
|
+
color: var(--accent2);
|
|
394
|
+
margin-left: 6px;
|
|
395
|
+
}
|
|
396
|
+
|
|
370
397
|
/* Tool calls */
|
|
371
398
|
.tool-item {
|
|
372
399
|
padding: 8px 12px;
|
|
@@ -407,4 +434,192 @@ main { max-width: 1200px; margin: 0 auto; padding: 24px; }
|
|
|
407
434
|
.charts-grid { grid-template-columns: 1fr; }
|
|
408
435
|
.stats-cards { grid-template-columns: repeat(2, 1fr); }
|
|
409
436
|
.detail-meta { grid-template-columns: 1fr; }
|
|
437
|
+
.category-grid { grid-template-columns: 1fr; }
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
/* Insights */
|
|
441
|
+
.insights-header {
|
|
442
|
+
margin-bottom: 24px;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
.insights-header select {
|
|
446
|
+
padding: 10px 14px;
|
|
447
|
+
background: var(--surface);
|
|
448
|
+
border: 1px solid var(--border);
|
|
449
|
+
color: var(--text);
|
|
450
|
+
border-radius: var(--radius);
|
|
451
|
+
font-size: 0.9rem;
|
|
452
|
+
min-width: 300px;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
.insights-header select:focus { outline: none; border-color: var(--accent); }
|
|
456
|
+
|
|
457
|
+
.score-overview {
|
|
458
|
+
display: flex;
|
|
459
|
+
align-items: center;
|
|
460
|
+
gap: 40px;
|
|
461
|
+
margin-bottom: 32px;
|
|
462
|
+
padding: 32px;
|
|
463
|
+
background: var(--surface);
|
|
464
|
+
border: 1px solid var(--border);
|
|
465
|
+
border-radius: var(--radius);
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
.score-circle {
|
|
469
|
+
position: relative;
|
|
470
|
+
width: 160px;
|
|
471
|
+
height: 160px;
|
|
472
|
+
flex-shrink: 0;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
.score-circle svg {
|
|
476
|
+
width: 160px;
|
|
477
|
+
height: 160px;
|
|
478
|
+
transform: rotate(-90deg);
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
.score-circle .track {
|
|
482
|
+
fill: none;
|
|
483
|
+
stroke: var(--surface2);
|
|
484
|
+
stroke-width: 10;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
.score-circle .progress {
|
|
488
|
+
fill: none;
|
|
489
|
+
stroke-width: 10;
|
|
490
|
+
stroke-linecap: round;
|
|
491
|
+
transition: stroke-dashoffset 0.8s ease;
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
.score-circle .score-text {
|
|
495
|
+
position: absolute;
|
|
496
|
+
inset: 0;
|
|
497
|
+
display: flex;
|
|
498
|
+
flex-direction: column;
|
|
499
|
+
align-items: center;
|
|
500
|
+
justify-content: center;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
.score-circle .score-number {
|
|
504
|
+
font-size: 2.5rem;
|
|
505
|
+
font-weight: 800;
|
|
506
|
+
line-height: 1;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
.score-circle .score-max {
|
|
510
|
+
font-size: 0.85rem;
|
|
511
|
+
color: var(--text-dim);
|
|
512
|
+
margin-top: 2px;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
.score-summary {
|
|
516
|
+
flex: 1;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
.score-summary h2 {
|
|
520
|
+
font-size: 1.3rem;
|
|
521
|
+
margin-bottom: 4px;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
.score-summary .repo-name {
|
|
525
|
+
font-size: 0.9rem;
|
|
526
|
+
color: var(--text-dim);
|
|
527
|
+
margin-bottom: 12px;
|
|
528
|
+
font-family: monospace;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
.score-summary .session-info {
|
|
532
|
+
font-size: 0.85rem;
|
|
533
|
+
color: var(--text-dim);
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
.category-grid {
|
|
537
|
+
display: grid;
|
|
538
|
+
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
|
539
|
+
gap: 12px;
|
|
540
|
+
margin-bottom: 24px;
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
.category-card {
|
|
544
|
+
background: var(--surface);
|
|
545
|
+
border: 1px solid var(--border);
|
|
546
|
+
border-radius: var(--radius);
|
|
547
|
+
padding: 20px;
|
|
410
548
|
}
|
|
549
|
+
|
|
550
|
+
.category-card .cat-header {
|
|
551
|
+
display: flex;
|
|
552
|
+
justify-content: space-between;
|
|
553
|
+
align-items: center;
|
|
554
|
+
margin-bottom: 10px;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
.category-card .cat-label {
|
|
558
|
+
font-weight: 600;
|
|
559
|
+
font-size: 0.95rem;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
.category-card .cat-score {
|
|
563
|
+
font-weight: 700;
|
|
564
|
+
font-size: 1.1rem;
|
|
565
|
+
color: var(--accent);
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
.category-card .cat-bar {
|
|
569
|
+
height: 8px;
|
|
570
|
+
background: var(--surface2);
|
|
571
|
+
border-radius: 4px;
|
|
572
|
+
overflow: hidden;
|
|
573
|
+
margin-bottom: 10px;
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
.category-card .cat-bar-fill {
|
|
577
|
+
height: 100%;
|
|
578
|
+
border-radius: 4px;
|
|
579
|
+
transition: width 0.6s ease;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
.category-card .cat-detail {
|
|
583
|
+
font-size: 0.8rem;
|
|
584
|
+
color: var(--text-dim);
|
|
585
|
+
line-height: 1.5;
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
.tips-section {
|
|
589
|
+
background: var(--surface);
|
|
590
|
+
border: 1px solid var(--border);
|
|
591
|
+
border-radius: var(--radius);
|
|
592
|
+
padding: 24px;
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
.tips-section h3 {
|
|
596
|
+
font-size: 1rem;
|
|
597
|
+
margin-bottom: 16px;
|
|
598
|
+
color: var(--text-dim);
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
.tip-item {
|
|
602
|
+
display: flex;
|
|
603
|
+
gap: 12px;
|
|
604
|
+
padding: 12px 0;
|
|
605
|
+
border-bottom: 1px solid var(--border);
|
|
606
|
+
font-size: 0.9rem;
|
|
607
|
+
line-height: 1.5;
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
.tip-item:last-child { border-bottom: none; }
|
|
611
|
+
|
|
612
|
+
.tip-icon {
|
|
613
|
+
font-size: 1.2rem;
|
|
614
|
+
flex-shrink: 0;
|
|
615
|
+
margin-top: 2px;
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
.not-enough-data {
|
|
619
|
+
text-align: center;
|
|
620
|
+
padding: 60px 20px;
|
|
621
|
+
color: var(--text-dim);
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
.not-enough-data .nod-icon { font-size: 3rem; margin-bottom: 16px; }
|
|
625
|
+
.not-enough-data p { font-size: 1rem; }
|