@code-insights/cli 3.0.3 → 3.1.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.
Files changed (62) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dashboard-dist/assets/{index-CUWKxcRo.js → index-BuJps5yp.js} +40 -40
  3. package/dashboard-dist/index.html +1 -1
  4. package/dist/commands/connect.d.ts +5 -0
  5. package/dist/commands/connect.d.ts.map +1 -0
  6. package/dist/commands/connect.js +39 -0
  7. package/dist/commands/connect.js.map +1 -0
  8. package/dist/commands/insights.d.ts +13 -0
  9. package/dist/commands/insights.d.ts.map +1 -0
  10. package/dist/commands/insights.js +87 -0
  11. package/dist/commands/insights.js.map +1 -0
  12. package/dist/commands/link.d.ts +8 -0
  13. package/dist/commands/link.d.ts.map +1 -0
  14. package/dist/commands/link.js +39 -0
  15. package/dist/commands/link.js.map +1 -0
  16. package/dist/commands/stats/data/cache.d.ts +29 -0
  17. package/dist/commands/stats/data/cache.d.ts.map +1 -0
  18. package/dist/commands/stats/data/cache.js +197 -0
  19. package/dist/commands/stats/data/cache.js.map +1 -0
  20. package/dist/commands/stats/data/firestore.d.ts +13 -0
  21. package/dist/commands/stats/data/firestore.d.ts.map +1 -0
  22. package/dist/commands/stats/data/firestore.js +170 -0
  23. package/dist/commands/stats/data/firestore.js.map +1 -0
  24. package/dist/commands/sync.d.ts +1 -0
  25. package/dist/commands/sync.d.ts.map +1 -1
  26. package/dist/commands/sync.js +52 -23
  27. package/dist/commands/sync.js.map +1 -1
  28. package/dist/db/schema.d.ts +1 -0
  29. package/dist/db/schema.d.ts.map +1 -1
  30. package/dist/db/schema.js +1 -0
  31. package/dist/db/schema.js.map +1 -1
  32. package/dist/db/write.d.ts +5 -0
  33. package/dist/db/write.d.ts.map +1 -1
  34. package/dist/db/write.js +11 -0
  35. package/dist/db/write.js.map +1 -1
  36. package/dist/firebase/client.d.ts +45 -0
  37. package/dist/firebase/client.d.ts.map +1 -0
  38. package/dist/firebase/client.js +344 -0
  39. package/dist/firebase/client.js.map +1 -0
  40. package/dist/index.js +0 -0
  41. package/dist/parser/insights.d.ts +7 -0
  42. package/dist/parser/insights.d.ts.map +1 -0
  43. package/dist/parser/insights.js +271 -0
  44. package/dist/parser/insights.js.map +1 -0
  45. package/dist/providers/codex.js +31 -0
  46. package/dist/providers/codex.js.map +1 -1
  47. package/dist/providers/copilot-cli.js +14 -2
  48. package/dist/providers/copilot-cli.js.map +1 -1
  49. package/dist/providers/cursor.js +44 -2
  50. package/dist/providers/cursor.js.map +1 -1
  51. package/dist/utils/firebase-json.d.ts +87 -0
  52. package/dist/utils/firebase-json.d.ts.map +1 -0
  53. package/dist/utils/firebase-json.js +207 -0
  54. package/dist/utils/firebase-json.js.map +1 -0
  55. package/dist/utils/telemetry.d.ts.map +1 -1
  56. package/dist/utils/telemetry.js +28 -3
  57. package/dist/utils/telemetry.js.map +1 -1
  58. package/package.json +3 -1
  59. package/server-dist/index.d.ts +9 -1
  60. package/server-dist/index.d.ts.map +1 -1
  61. package/server-dist/index.js +15 -5
  62. package/server-dist/index.js.map +1 -1
@@ -24,7 +24,7 @@
24
24
  document.documentElement.classList.add(resolved);
25
25
  })();
26
26
  </script>
27
- <script type="module" crossorigin src="/assets/index-CUWKxcRo.js"></script>
27
+ <script type="module" crossorigin src="/assets/index-BuJps5yp.js"></script>
28
28
  <link rel="stylesheet" crossorigin href="/assets/index-BMhL7wL8.css">
29
29
  </head>
30
30
  <body>
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generate and display the dashboard connection URL
3
+ */
4
+ export declare function connectCommand(): Promise<void>;
5
+ //# sourceMappingURL=connect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAkCpD"}
@@ -0,0 +1,39 @@
1
+ import chalk from 'chalk';
2
+ import { isConfigured, loadWebConfig, hasWebConfig } from '../utils/config.js';
3
+ import { trackEvent } from '../utils/telemetry.js';
4
+ import { generateDashboardUrl, validateWebConfig } from '../utils/firebase-json.js';
5
+ /**
6
+ * Generate and display the dashboard connection URL
7
+ */
8
+ export async function connectCommand() {
9
+ if (!isConfigured()) {
10
+ console.log(chalk.red('\n❌ Code Insights is not configured.'));
11
+ console.log(chalk.gray('The connect command requires Firebase setup.\n'));
12
+ console.log(chalk.white(' To set up Firebase:'));
13
+ console.log(chalk.gray(' code-insights init\n'));
14
+ console.log(chalk.white(' For local-only analytics (no setup needed):'));
15
+ console.log(chalk.gray(' code-insights stats\n'));
16
+ return;
17
+ }
18
+ if (!hasWebConfig()) {
19
+ console.log(chalk.yellow('\n⚠ No web config found.'));
20
+ console.log(chalk.gray('\nRe-run "code-insights init" to add your web config.'));
21
+ console.log(chalk.gray('Or visit the dashboard and configure Firebase manually:'));
22
+ console.log(chalk.white(' https://code-insights.app\n'));
23
+ return;
24
+ }
25
+ const webConfigData = loadWebConfig();
26
+ if (!webConfigData || !validateWebConfig(webConfigData)) {
27
+ console.log(chalk.red('\n❌ Invalid web config stored.'));
28
+ console.log(chalk.gray('Run "code-insights init" to reconfigure.\n'));
29
+ return;
30
+ }
31
+ const webConfig = webConfigData;
32
+ const url = generateDashboardUrl(webConfig);
33
+ console.log(chalk.cyan('\n🔗 Dashboard Connection URL\n'));
34
+ console.log(chalk.white('Open this URL to connect the dashboard to your Firebase:'));
35
+ console.log(chalk.bold.underline(url));
36
+ console.log('');
37
+ trackEvent('connect', true);
38
+ }
39
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGpF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,aAAa,EAAE,CAAC;IACtC,IAAI,CAAC,aAAa,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,EAAE,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;QACtE,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,aAAkC,CAAC;IACrD,MAAM,GAAG,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAE5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { InsightType } from '../types.js';
2
+ interface InsightsOptions {
3
+ type?: InsightType;
4
+ project?: string;
5
+ today?: boolean;
6
+ limit?: number;
7
+ }
8
+ /**
9
+ * Display recent insights from Firestore
10
+ */
11
+ export declare function insightsCommand(options?: InsightsOptions): Promise<void>;
12
+ export {};
13
+ //# sourceMappingURL=insights.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insights.d.ts","sourceRoot":"","sources":["../../src/commands/insights.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAW,WAAW,EAAE,MAAM,aAAa,CAAC;AAExD,UAAU,eAAe;IACvB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8ElF"}
@@ -0,0 +1,87 @@
1
+ import chalk from 'chalk';
2
+ import { format } from 'date-fns';
3
+ import { loadConfig, isConfigured } from '../utils/config.js';
4
+ import { initializeFirebase, getRecentInsights } from '../firebase/client.js';
5
+ /**
6
+ * Display recent insights from Firestore
7
+ */
8
+ export async function insightsCommand(options = {}) {
9
+ // Check if configured
10
+ if (!isConfigured()) {
11
+ console.log(chalk.red('Not configured. Run `claudeinsight init` first.'));
12
+ process.exit(1);
13
+ }
14
+ // Load config and initialize Firebase
15
+ const config = loadConfig();
16
+ if (!config) {
17
+ console.log(chalk.red('Configuration error.'));
18
+ process.exit(1);
19
+ }
20
+ try {
21
+ initializeFirebase(config);
22
+ }
23
+ catch (error) {
24
+ console.log(chalk.red('Failed to connect to Firebase.'));
25
+ console.error(error instanceof Error ? error.message : 'Unknown error');
26
+ process.exit(1);
27
+ }
28
+ const limit = options.limit || 20;
29
+ // Fetch insights
30
+ const insights = await getRecentInsights(limit, {
31
+ type: options.type,
32
+ project: options.project,
33
+ todayOnly: options.today,
34
+ });
35
+ if (insights.length === 0) {
36
+ console.log(chalk.yellow('\nNo insights found.'));
37
+ if (options.today) {
38
+ console.log(chalk.gray('Try running without --today to see older insights.'));
39
+ }
40
+ return;
41
+ }
42
+ console.log(chalk.cyan(`\n📊 Recent Insights (${insights.length})\n`));
43
+ // Group by type
44
+ const summaries = insights.filter((i) => i.type === 'summary');
45
+ const decisions = insights.filter((i) => i.type === 'decision');
46
+ const learnings = insights.filter((i) => i.type === 'learning');
47
+ const techniques = insights.filter((i) => i.type === 'technique');
48
+ if (summaries.length > 0) {
49
+ console.log(chalk.bold.magenta('📝 Summaries'));
50
+ for (const insight of summaries) {
51
+ printInsight(insight);
52
+ }
53
+ console.log();
54
+ }
55
+ if (decisions.length > 0) {
56
+ console.log(chalk.bold.blue('🎯 Decisions'));
57
+ for (const insight of decisions) {
58
+ printInsight(insight);
59
+ }
60
+ console.log();
61
+ }
62
+ if (learnings.length > 0) {
63
+ console.log(chalk.bold.green('💡 Learnings'));
64
+ for (const insight of learnings) {
65
+ printInsight(insight);
66
+ }
67
+ console.log();
68
+ }
69
+ if (techniques.length > 0) {
70
+ console.log(chalk.bold.yellow('🔧 Techniques'));
71
+ for (const insight of techniques) {
72
+ printInsight(insight);
73
+ }
74
+ console.log();
75
+ }
76
+ }
77
+ function printInsight(insight) {
78
+ const date = insight.timestamp
79
+ ? format(new Date(insight.timestamp), 'MMM d')
80
+ : 'Unknown';
81
+ console.log(chalk.white(` • ${insight.title}`));
82
+ console.log(chalk.gray(` ${insight.projectName} | ${date}`));
83
+ if (insight.content && insight.content.length < 100) {
84
+ console.log(chalk.gray(` ${insight.content}`));
85
+ }
86
+ }
87
+ //# sourceMappingURL=insights.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insights.js","sourceRoot":"","sources":["../../src/commands/insights.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface LinkOptions {
2
+ qr?: boolean;
3
+ }
4
+ /**
5
+ * Generate and display dashboard link
6
+ */
7
+ export declare function linkCommand(options: LinkOptions): Promise<void>;
8
+ //# sourceMappingURL=link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,OAAO,CAAC;CACd;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCrE"}
@@ -0,0 +1,39 @@
1
+ import chalk from 'chalk';
2
+ import qrcode from 'qrcode-terminal';
3
+ import { isConfigured, loadWebConfig, hasWebConfig } from '../utils/config.js';
4
+ import { generateDashboardUrl, validateWebConfig } from '../utils/firebase-json.js';
5
+ /**
6
+ * Generate and display dashboard link
7
+ */
8
+ export async function linkCommand(options) {
9
+ if (!isConfigured()) {
10
+ console.log(chalk.red('\n❌ Code Insights is not configured.'));
11
+ console.log(chalk.gray('Run "code-insights init" first.\n'));
12
+ return;
13
+ }
14
+ if (!hasWebConfig()) {
15
+ console.log(chalk.yellow('\n⚠ No web config found.'));
16
+ console.log(chalk.gray('\nTo generate a dashboard link, add web config:'));
17
+ console.log(chalk.white(' code-insights init --web-config <path-to-config.json>\n'));
18
+ console.log(chalk.gray('Or visit the dashboard and configure Firebase manually:'));
19
+ console.log(chalk.white(' https://code-insights.app\n'));
20
+ return;
21
+ }
22
+ const webConfigData = loadWebConfig();
23
+ if (!webConfigData || !validateWebConfig(webConfigData)) {
24
+ console.log(chalk.red('\n❌ Invalid web config stored.'));
25
+ console.log(chalk.gray('Run "code-insights init --web-config <path>" to reconfigure.\n'));
26
+ return;
27
+ }
28
+ const webConfig = webConfigData;
29
+ const url = generateDashboardUrl(webConfig);
30
+ console.log(chalk.cyan('\n🔗 Dashboard Link\n'));
31
+ console.log(chalk.white('Open this URL to connect the dashboard:'));
32
+ console.log(chalk.bold.underline(url));
33
+ if (options.qr !== false) {
34
+ console.log(chalk.gray('\n📱 QR Code:\n'));
35
+ qrcode.generate(url, { small: true });
36
+ }
37
+ console.log('');
38
+ }
39
+ //# sourceMappingURL=link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAOpF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAoB;IACpD,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;QAC7D,OAAO;IACT,CAAC;IAED,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC,CAAC;QACtF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,aAAa,EAAE,CAAC;IACtC,IAAI,CAAC,aAAa,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,EAAE,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC,CAAC;QAC1F,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,aAAkC,CAAC;IACrD,MAAM,GAAG,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAE5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAEvC,IAAI,OAAO,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { ParsedSession } from '../../../types.js';
2
+ import type { SessionRow } from './types.js';
3
+ /**
4
+ * Transform the CLI's ParsedSession into the stats SessionRow shape.
5
+ * Uses a module-level cache for projectId to avoid repeated git spawns.
6
+ */
7
+ export declare function parsedSessionToRow(session: ParsedSession): SessionRow;
8
+ export declare class StatsCache {
9
+ private data;
10
+ private dirty;
11
+ constructor();
12
+ /**
13
+ * Refresh the cache by discovering and parsing sessions from all providers.
14
+ * Returns counts of new and total sessions.
15
+ */
16
+ refresh(): Promise<{
17
+ newSessions: number;
18
+ totalSessions: number;
19
+ }>;
20
+ /**
21
+ * Return all cached session rows with dates properly deserialized.
22
+ * JSON serialization turns Date objects into ISO strings — reconstruct them.
23
+ */
24
+ getAllRows(): SessionRow[];
25
+ private load;
26
+ private save;
27
+ private empty;
28
+ }
29
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../../src/commands/stats/data/cache.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA+C7C;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,UAAU,CAoCrE;AAMD,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,KAAK,CAAU;;IAOvB;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IA2ExE;;;OAGG;IACH,UAAU,IAAI,UAAU,EAAE;IAkB1B,OAAO,CAAC,IAAI;IAgBZ,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,KAAK;CAGd"}
@@ -0,0 +1,197 @@
1
+ // ──────────────────────────────────────────────────────
2
+ // Stats cache — disk-based parsed session store
3
+ //
4
+ // Stores pre-parsed SessionRow[] keyed by source file path
5
+ // with mtime-based invalidation. Lives at:
6
+ // ~/.code-insights/stats-cache.json
7
+ // ──────────────────────────────────────────────────────
8
+ import * as fs from 'fs';
9
+ import * as path from 'path';
10
+ import * as os from 'os';
11
+ import { generateStableProjectId } from '../../../utils/device.js';
12
+ import { ensureConfigDir } from '../../../utils/config.js';
13
+ import { splitVirtualPath } from '../../../utils/paths.js';
14
+ import { getAllProviders } from '../../../providers/registry.js';
15
+ // ──────────────────────────────────────────────────────
16
+ // Constants
17
+ // ──────────────────────────────────────────────────────
18
+ const CACHE_PATH = path.join(os.homedir(), '.code-insights', 'stats-cache.json');
19
+ // ──────────────────────────────────────────────────────
20
+ // Module-level projectId cache — avoids repeated git
21
+ // process spawns for the same project path
22
+ // ──────────────────────────────────────────────────────
23
+ const projectIdCache = new Map();
24
+ function getCachedProjectId(projectPath) {
25
+ const existing = projectIdCache.get(projectPath);
26
+ if (existing)
27
+ return existing;
28
+ const { projectId } = generateStableProjectId(projectPath);
29
+ projectIdCache.set(projectPath, projectId);
30
+ return projectId;
31
+ }
32
+ // ──────────────────────────────────────────────────────
33
+ // Exported helpers
34
+ // ──────────────────────────────────────────────────────
35
+ /**
36
+ * Transform the CLI's ParsedSession into the stats SessionRow shape.
37
+ * Uses a module-level cache for projectId to avoid repeated git spawns.
38
+ */
39
+ export function parsedSessionToRow(session) {
40
+ const projectId = getCachedProjectId(session.projectPath);
41
+ return {
42
+ // identity
43
+ id: session.id,
44
+ projectId,
45
+ projectName: session.projectName,
46
+ // timing
47
+ startedAt: session.startedAt,
48
+ endedAt: session.endedAt,
49
+ // counts
50
+ messageCount: session.messageCount,
51
+ userMessageCount: session.userMessageCount,
52
+ assistantMessageCount: session.assistantMessageCount,
53
+ toolCallCount: session.toolCallCount,
54
+ // cost / usage (optional)
55
+ estimatedCostUsd: session.usage?.estimatedCostUsd,
56
+ totalInputTokens: session.usage?.totalInputTokens,
57
+ totalOutputTokens: session.usage?.totalOutputTokens,
58
+ cacheCreationTokens: session.usage?.cacheCreationTokens,
59
+ cacheReadTokens: session.usage?.cacheReadTokens,
60
+ // metadata
61
+ primaryModel: session.usage?.primaryModel,
62
+ modelsUsed: session.usage?.modelsUsed,
63
+ generatedTitle: session.generatedTitle ?? undefined,
64
+ customTitle: session.customTitle,
65
+ summary: session.summary ?? undefined,
66
+ sessionCharacter: session.sessionCharacter ?? undefined,
67
+ sourceTool: session.sourceTool,
68
+ usageSource: session.usage?.usageSource,
69
+ };
70
+ }
71
+ // ──────────────────────────────────────────────────────
72
+ // StatsCache class
73
+ // ──────────────────────────────────────────────────────
74
+ export class StatsCache {
75
+ data;
76
+ dirty;
77
+ constructor() {
78
+ this.dirty = false;
79
+ this.data = this.load();
80
+ }
81
+ /**
82
+ * Refresh the cache by discovering and parsing sessions from all providers.
83
+ * Returns counts of new and total sessions.
84
+ */
85
+ async refresh() {
86
+ const providers = getAllProviders();
87
+ let newSessions = 0;
88
+ // Collect all discovered file paths (keyed by provider name for metadata)
89
+ const allDiscoveredPaths = new Set();
90
+ for (const provider of providers) {
91
+ const providerName = provider.getProviderName();
92
+ let filePaths;
93
+ try {
94
+ filePaths = await provider.discover();
95
+ }
96
+ catch {
97
+ // If discovery fails for a provider, skip it
98
+ continue;
99
+ }
100
+ for (const filePath of filePaths) {
101
+ allDiscoveredPaths.add(filePath);
102
+ // Check mtime for cache invalidation
103
+ const { realPath } = splitVirtualPath(filePath);
104
+ let currentMtime;
105
+ try {
106
+ currentMtime = fs.statSync(realPath).mtime.toISOString();
107
+ }
108
+ catch {
109
+ // File no longer accessible, skip
110
+ continue;
111
+ }
112
+ const cached = this.data.entries[filePath];
113
+ if (cached && cached.lastModified === currentMtime) {
114
+ // Cache hit — mtime unchanged
115
+ continue;
116
+ }
117
+ // Cache miss — parse the file
118
+ let session;
119
+ try {
120
+ session = await provider.parse(filePath);
121
+ }
122
+ catch {
123
+ // Parse error — skip this file
124
+ continue;
125
+ }
126
+ if (!session)
127
+ continue;
128
+ const row = parsedSessionToRow(session);
129
+ this.data.entries[filePath] = {
130
+ lastModified: currentMtime,
131
+ provider: providerName,
132
+ rows: [row],
133
+ };
134
+ this.dirty = true;
135
+ newSessions++;
136
+ }
137
+ }
138
+ // Prune entries for file paths that no longer exist in any provider's discovery
139
+ for (const cachedPath of Object.keys(this.data.entries)) {
140
+ if (!allDiscoveredPaths.has(cachedPath)) {
141
+ delete this.data.entries[cachedPath];
142
+ this.dirty = true;
143
+ }
144
+ }
145
+ // Persist if anything changed
146
+ if (this.dirty) {
147
+ this.data.lastRefresh = new Date().toISOString();
148
+ this.save();
149
+ }
150
+ return { newSessions, totalSessions: this.getAllRows().length };
151
+ }
152
+ /**
153
+ * Return all cached session rows with dates properly deserialized.
154
+ * JSON serialization turns Date objects into ISO strings — reconstruct them.
155
+ */
156
+ getAllRows() {
157
+ const rows = [];
158
+ for (const entry of Object.values(this.data.entries)) {
159
+ for (const row of entry.rows) {
160
+ rows.push({
161
+ ...row,
162
+ startedAt: new Date(row.startedAt),
163
+ endedAt: new Date(row.endedAt),
164
+ });
165
+ }
166
+ }
167
+ return rows;
168
+ }
169
+ // ──────────────────────────────────────────────────────
170
+ // Private methods
171
+ // ──────────────────────────────────────────────────────
172
+ load() {
173
+ try {
174
+ if (!fs.existsSync(CACHE_PATH)) {
175
+ return this.empty();
176
+ }
177
+ const content = fs.readFileSync(CACHE_PATH, 'utf-8');
178
+ const parsed = JSON.parse(content);
179
+ if (parsed.version !== 1) {
180
+ return this.empty();
181
+ }
182
+ return parsed;
183
+ }
184
+ catch {
185
+ return this.empty();
186
+ }
187
+ }
188
+ save() {
189
+ ensureConfigDir();
190
+ fs.writeFileSync(CACHE_PATH, JSON.stringify(this.data, null, 2));
191
+ this.dirty = false;
192
+ }
193
+ empty() {
194
+ return { version: 1, lastRefresh: '', entries: {} };
195
+ }
196
+ }
197
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../../src/commands/stats/data/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { ClaudeInsightConfig } from '../../../types.js';
2
+ import type { StatsDataSource, SessionRow, SessionQueryOptions, UsageStatsDoc, ProjectResolution, PrepareResult, StatsFlags } from './types.js';
3
+ export declare class FirestoreDataSource implements StatsDataSource {
4
+ private config;
5
+ readonly name = "firestore";
6
+ constructor(config: ClaudeInsightConfig);
7
+ prepare(flags: StatsFlags): Promise<PrepareResult>;
8
+ getSessions(opts: SessionQueryOptions): Promise<SessionRow[]>;
9
+ getUsageStats(): Promise<UsageStatsDoc | null>;
10
+ resolveProjectId(name: string): Promise<ProjectResolution>;
11
+ getLastSession(opts?: Pick<SessionQueryOptions, 'sourceTool' | 'projectId'>): Promise<SessionRow | null>;
12
+ }
13
+ //# sourceMappingURL=firestore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firestore.d.ts","sourceRoot":"","sources":["../../../../src/commands/stats/data/firestore.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,UAAU,EACX,MAAM,YAAY,CAAC;AAgEpB,qBAAa,mBAAoB,YAAW,eAAe;IAG7C,OAAO,CAAC,MAAM;IAF1B,QAAQ,CAAC,IAAI,eAAe;gBAER,MAAM,EAAE,mBAAmB;IAEzC,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IAkBlD,WAAW,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAiC7D,aAAa,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAgB9C,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAqB1D,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,mBAAmB,EAAE,YAAY,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;CA8B/G"}