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 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
+ ![copilot-lens effectiveness score](https://raw.githubusercontent.com/pavanvamsi3/copilot-lens/main/assets/copilot-lens-score.png)
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"));
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;;;AAKA,8BAqDC;AA1DD,sDAA8B;AAC9B,gDAAwB;AACxB,gDAAwB;AACxB,yCAAoE;AAEpE,SAAgB,SAAS;IACvB,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;IACtB,GAAG,CAAC,GAAG,CAAC,IAAA,cAAI,GAAE,CAAC,CAAC;IAEhB,8BAA8B;IAC9B,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,MAAM,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE9D,yBAAyB;IACzB,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAA,uBAAY,GAAE,CAAC;YAChC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,0BAA0B;IAC1B,GAAG,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACxC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAA,qBAAU,EAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;gBACrD,OAAO;YACT,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,iBAAiB;IACjB,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACtC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAA,uBAAY,GAAE,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,yCAAyC;IACzC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACpB,GAAG,CAAC,QAAQ,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,uBAAuB;IACvB,GAAG,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,IAAS,EAAE,GAAQ,EAAE,KAAU,EAAE,EAAE;QACpD,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;;;AAKA,8BA8EC;AAnFD,sDAA8B;AAC9B,gDAAwB;AACxB,gDAAwB;AACxB,yCAAuG;AAEvG,SAAgB,SAAS;IACvB,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;IACtB,GAAG,CAAC,GAAG,CAAC,IAAA,cAAI,GAAE,CAAC,CAAC;IAEhB,8BAA8B;IAC9B,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,MAAM,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE9D,yBAAyB;IACzB,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAA,uBAAY,GAAE,CAAC;YAChC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,0BAA0B;IAC1B,GAAG,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACxC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAA,qBAAU,EAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;gBACrD,OAAO;YACT,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,iBAAiB;IACjB,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACtC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAA,uBAAY,GAAE,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,8BAA8B;IAC9B,GAAG,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3C,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAA,8BAAmB,GAAE,CAAC;YACpC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,mCAAmC;IACnC,GAAG,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC1C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAc,CAAC;YACtC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC,CAAC;gBACjE,OAAO;YACT,CAAC;YACD,MAAM,KAAK,GAAG,IAAA,uBAAY,EAAC,IAAI,CAAC,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,yCAAyC;IACzC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACpB,GAAG,CAAC,QAAQ,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,uBAAuB;IACvB,GAAG,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,IAAS,EAAE,GAAQ,EAAE,KAAU,EAAE,EAAE;QACpD,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -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
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "copilot-lens",
3
- "version": "1.0.5",
3
+ "version": "1.0.8",
4
4
  "description": "A local dashboard to visualize and analyze your GitHub Copilot CLI sessions",
5
5
  "main": "dist/server.js",
6
6
  "bin": {
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
- .filter((e) => (e.type === "user.message" || e.type === "assistant.message") && (e.data?.content || "").trim())
186
- .map((e) => {
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
- // Truncate long messages
190
- const display = content.length > 2000 ? content.slice(0, 2000) + "\n...(truncated)" : content;
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
- ${escapeHtml(display)}
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: 16px;
335
+ gap: 6px;
336
336
  padding: 8px 0;
337
337
  }
338
338
 
339
339
  .message {
340
- max-width: 75%;
341
- padding: 12px 16px;
342
- border-radius: 12px;
343
- font-size: 0.85rem;
344
- line-height: 1.6;
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: 6px;
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; }