@code-insights/cli 2.1.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -0
- package/README.md +146 -156
- package/dashboard-dist/assets/index-BMhL7wL8.css +1 -0
- package/dashboard-dist/assets/index-CuCBzQyQ.js +548 -0
- package/dashboard-dist/dist/assets/index-BMhL7wL8.css +1 -0
- package/dashboard-dist/dist/assets/index-CUWKxcRo.js +548 -0
- package/dashboard-dist/dist/assets/index-CuCBzQyQ.js +548 -0
- package/dashboard-dist/dist/favicon.svg +4 -0
- package/dashboard-dist/dist/index.html +33 -0
- package/dashboard-dist/favicon.svg +4 -0
- package/dashboard-dist/index.html +33 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +188 -69
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/dashboard.d.ts +16 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +82 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/init.d.ts +3 -4
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +24 -201
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install-hook.d.ts.map +1 -1
- package/dist/commands/install-hook.js +4 -21
- package/dist/commands/install-hook.js.map +1 -1
- package/dist/commands/open.d.ts +2 -1
- package/dist/commands/open.d.ts.map +1 -1
- package/dist/commands/open.js +10 -21
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/reset.d.ts.map +1 -1
- package/dist/commands/reset.js +38 -69
- package/dist/commands/reset.js.map +1 -1
- package/dist/commands/stats/actions/error-handler.d.ts.map +1 -1
- package/dist/commands/stats/actions/error-handler.js +1 -11
- package/dist/commands/stats/actions/error-handler.js.map +1 -1
- package/dist/commands/stats/data/local.d.ts +0 -2
- package/dist/commands/stats/data/local.d.ts.map +1 -1
- package/dist/commands/stats/data/local.js +44 -44
- package/dist/commands/stats/data/local.js.map +1 -1
- package/dist/commands/stats/data/source.d.ts +3 -9
- package/dist/commands/stats/data/source.d.ts.map +1 -1
- package/dist/commands/stats/data/source.js +3 -35
- package/dist/commands/stats/data/source.js.map +1 -1
- package/dist/commands/stats/data/types.d.ts +1 -12
- package/dist/commands/stats/data/types.d.ts.map +1 -1
- package/dist/commands/stats/data/types.js +0 -16
- package/dist/commands/stats/data/types.js.map +1 -1
- package/dist/commands/stats/shared.d.ts.map +1 -1
- package/dist/commands/stats/shared.js +1 -5
- package/dist/commands/stats/shared.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +53 -92
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/sync.d.ts +5 -5
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +31 -39
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/telemetry.d.ts.map +1 -1
- package/dist/commands/telemetry.js +0 -1
- package/dist/commands/telemetry.js.map +1 -1
- package/dist/constants/llm-providers.d.ts +5 -0
- package/dist/constants/llm-providers.d.ts.map +1 -0
- package/dist/constants/llm-providers.js +56 -0
- package/dist/constants/llm-providers.js.map +1 -0
- package/dist/db/client.d.ts +17 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +53 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/migrate.d.ts +9 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +31 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/read.d.ts +42 -0
- package/dist/db/read.d.ts.map +1 -0
- package/dist/db/read.js +194 -0
- package/dist/db/read.js.map +1 -0
- package/dist/db/schema.d.ts +3 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +129 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/write.d.ts +24 -0
- package/dist/db/write.d.ts.map +1 -0
- package/dist/db/write.js +287 -0
- package/dist/db/write.js.map +1 -0
- package/dist/firebase/client.d.ts +5 -0
- package/dist/firebase/client.d.ts.map +1 -1
- package/dist/firebase/client.js +23 -0
- package/dist/firebase/client.js.map +1 -1
- package/dist/index.js +12 -12
- package/dist/index.js.map +1 -1
- package/dist/providers/context.d.ts +3 -0
- package/dist/providers/context.d.ts.map +1 -0
- package/dist/providers/context.js +13 -0
- package/dist/providers/context.js.map +1 -0
- package/dist/providers/copilot.d.ts +18 -0
- package/dist/providers/copilot.d.ts.map +1 -0
- package/dist/providers/copilot.js +289 -0
- package/dist/providers/copilot.js.map +1 -0
- package/dist/providers/cursor.d.ts.map +1 -1
- package/dist/providers/cursor.js +8 -3
- package/dist/providers/cursor.js.map +1 -1
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +3 -0
- package/dist/providers/registry.js.map +1 -1
- package/dist/types.d.ts +38 -47
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/browser.d.ts +6 -0
- package/dist/utils/browser.d.ts.map +1 -0
- package/dist/utils/browser.js +23 -0
- package/dist/utils/browser.js.map +1 -0
- package/dist/utils/config.d.ts +9 -21
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +23 -50
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/telemetry.js +2 -7
- package/dist/utils/telemetry.js.map +1 -1
- package/dist/utils/tips.js +1 -1
- package/dist/utils/tips.js.map +1 -1
- package/package.json +19 -5
- package/server-dist/dist/index.d.ts +12 -0
- package/server-dist/dist/index.d.ts.map +1 -0
- package/server-dist/dist/index.js +92 -0
- package/server-dist/dist/index.js.map +1 -0
- package/server-dist/dist/llm/analysis.d.ts +80 -0
- package/server-dist/dist/llm/analysis.d.ts.map +1 -0
- package/server-dist/dist/llm/analysis.js +509 -0
- package/server-dist/dist/llm/analysis.js.map +1 -0
- package/server-dist/dist/llm/client.d.ts +27 -0
- package/server-dist/dist/llm/client.d.ts.map +1 -0
- package/server-dist/dist/llm/client.js +71 -0
- package/server-dist/dist/llm/client.js.map +1 -0
- package/server-dist/dist/llm/index.d.ts +7 -0
- package/server-dist/dist/llm/index.d.ts.map +1 -0
- package/server-dist/dist/llm/index.js +5 -0
- package/server-dist/dist/llm/index.js.map +1 -0
- package/server-dist/dist/llm/prompts.d.ts +73 -0
- package/server-dist/dist/llm/prompts.d.ts.map +1 -0
- package/server-dist/dist/llm/prompts.js +242 -0
- package/server-dist/dist/llm/prompts.js.map +1 -0
- package/server-dist/dist/llm/providers/anthropic.d.ts +3 -0
- package/server-dist/dist/llm/providers/anthropic.d.ts.map +1 -0
- package/server-dist/dist/llm/providers/anthropic.js +45 -0
- package/server-dist/dist/llm/providers/anthropic.js.map +1 -0
- package/server-dist/dist/llm/providers/gemini.d.ts +3 -0
- package/server-dist/dist/llm/providers/gemini.d.ts.map +1 -0
- package/server-dist/dist/llm/providers/gemini.js +51 -0
- package/server-dist/dist/llm/providers/gemini.js.map +1 -0
- package/server-dist/dist/llm/providers/ollama.d.ts +12 -0
- package/server-dist/dist/llm/providers/ollama.d.ts.map +1 -0
- package/server-dist/dist/llm/providers/ollama.js +61 -0
- package/server-dist/dist/llm/providers/ollama.js.map +1 -0
- package/server-dist/dist/llm/providers/openai.d.ts +3 -0
- package/server-dist/dist/llm/providers/openai.d.ts.map +1 -0
- package/server-dist/dist/llm/providers/openai.js +39 -0
- package/server-dist/dist/llm/providers/openai.js.map +1 -0
- package/server-dist/dist/llm/types.d.ts +22 -0
- package/server-dist/dist/llm/types.d.ts.map +1 -0
- package/server-dist/dist/llm/types.js +5 -0
- package/server-dist/dist/llm/types.js.map +1 -0
- package/server-dist/dist/routes/analysis.d.ts +4 -0
- package/server-dist/dist/routes/analysis.d.ts.map +1 -0
- package/server-dist/dist/routes/analysis.js +103 -0
- package/server-dist/dist/routes/analysis.js.map +1 -0
- package/server-dist/dist/routes/analytics.d.ts +4 -0
- package/server-dist/dist/routes/analytics.d.ts.map +1 -0
- package/server-dist/dist/routes/analytics.js +47 -0
- package/server-dist/dist/routes/analytics.js.map +1 -0
- package/server-dist/dist/routes/config.d.ts +4 -0
- package/server-dist/dist/routes/config.d.ts.map +1 -0
- package/server-dist/dist/routes/config.js +108 -0
- package/server-dist/dist/routes/config.js.map +1 -0
- package/server-dist/dist/routes/export.d.ts +4 -0
- package/server-dist/dist/routes/export.d.ts.map +1 -0
- package/server-dist/dist/routes/export.js +52 -0
- package/server-dist/dist/routes/export.js.map +1 -0
- package/server-dist/dist/routes/insights.d.ts +4 -0
- package/server-dist/dist/routes/insights.d.ts.map +1 -0
- package/server-dist/dist/routes/insights.js +80 -0
- package/server-dist/dist/routes/insights.js.map +1 -0
- package/server-dist/dist/routes/messages.d.ts +4 -0
- package/server-dist/dist/routes/messages.d.ts.map +1 -0
- package/server-dist/dist/routes/messages.js +19 -0
- package/server-dist/dist/routes/messages.js.map +1 -0
- package/server-dist/dist/routes/projects.d.ts +4 -0
- package/server-dist/dist/routes/projects.d.ts.map +1 -0
- package/server-dist/dist/routes/projects.js +32 -0
- package/server-dist/dist/routes/projects.js.map +1 -0
- package/server-dist/dist/routes/sessions.d.ts +4 -0
- package/server-dist/dist/routes/sessions.d.ts.map +1 -0
- package/server-dist/dist/routes/sessions.js +65 -0
- package/server-dist/dist/routes/sessions.js.map +1 -0
- package/server-dist/dist/utils.d.ts +6 -0
- package/server-dist/dist/utils.d.ts.map +1 -0
- package/server-dist/dist/utils.js +9 -0
- package/server-dist/dist/utils.js.map +1 -0
- package/server-dist/index.d.ts +12 -0
- package/server-dist/index.d.ts.map +1 -0
- package/server-dist/index.js +92 -0
- package/server-dist/index.js.map +1 -0
- package/server-dist/llm/analysis.d.ts +80 -0
- package/server-dist/llm/analysis.d.ts.map +1 -0
- package/server-dist/llm/analysis.js +509 -0
- package/server-dist/llm/analysis.js.map +1 -0
- package/server-dist/llm/client.d.ts +27 -0
- package/server-dist/llm/client.d.ts.map +1 -0
- package/server-dist/llm/client.js +71 -0
- package/server-dist/llm/client.js.map +1 -0
- package/server-dist/llm/index.d.ts +7 -0
- package/server-dist/llm/index.d.ts.map +1 -0
- package/server-dist/llm/index.js +5 -0
- package/server-dist/llm/index.js.map +1 -0
- package/server-dist/llm/prompts.d.ts +73 -0
- package/server-dist/llm/prompts.d.ts.map +1 -0
- package/server-dist/llm/prompts.js +242 -0
- package/server-dist/llm/prompts.js.map +1 -0
- package/server-dist/llm/providers/anthropic.d.ts +3 -0
- package/server-dist/llm/providers/anthropic.d.ts.map +1 -0
- package/server-dist/llm/providers/anthropic.js +45 -0
- package/server-dist/llm/providers/anthropic.js.map +1 -0
- package/server-dist/llm/providers/gemini.d.ts +3 -0
- package/server-dist/llm/providers/gemini.d.ts.map +1 -0
- package/server-dist/llm/providers/gemini.js +51 -0
- package/server-dist/llm/providers/gemini.js.map +1 -0
- package/server-dist/llm/providers/ollama.d.ts +12 -0
- package/server-dist/llm/providers/ollama.d.ts.map +1 -0
- package/server-dist/llm/providers/ollama.js +61 -0
- package/server-dist/llm/providers/ollama.js.map +1 -0
- package/server-dist/llm/providers/openai.d.ts +3 -0
- package/server-dist/llm/providers/openai.d.ts.map +1 -0
- package/server-dist/llm/providers/openai.js +39 -0
- package/server-dist/llm/providers/openai.js.map +1 -0
- package/server-dist/llm/types.d.ts +22 -0
- package/server-dist/llm/types.d.ts.map +1 -0
- package/server-dist/llm/types.js +5 -0
- package/server-dist/llm/types.js.map +1 -0
- package/server-dist/routes/analysis.d.ts +4 -0
- package/server-dist/routes/analysis.d.ts.map +1 -0
- package/server-dist/routes/analysis.js +103 -0
- package/server-dist/routes/analysis.js.map +1 -0
- package/server-dist/routes/analytics.d.ts +4 -0
- package/server-dist/routes/analytics.d.ts.map +1 -0
- package/server-dist/routes/analytics.js +47 -0
- package/server-dist/routes/analytics.js.map +1 -0
- package/server-dist/routes/config.d.ts +4 -0
- package/server-dist/routes/config.d.ts.map +1 -0
- package/server-dist/routes/config.js +108 -0
- package/server-dist/routes/config.js.map +1 -0
- package/server-dist/routes/export.d.ts +4 -0
- package/server-dist/routes/export.d.ts.map +1 -0
- package/server-dist/routes/export.js +52 -0
- package/server-dist/routes/export.js.map +1 -0
- package/server-dist/routes/insights.d.ts +4 -0
- package/server-dist/routes/insights.d.ts.map +1 -0
- package/server-dist/routes/insights.js +80 -0
- package/server-dist/routes/insights.js.map +1 -0
- package/server-dist/routes/messages.d.ts +4 -0
- package/server-dist/routes/messages.d.ts.map +1 -0
- package/server-dist/routes/messages.js +19 -0
- package/server-dist/routes/messages.js.map +1 -0
- package/server-dist/routes/projects.d.ts +4 -0
- package/server-dist/routes/projects.d.ts.map +1 -0
- package/server-dist/routes/projects.js +32 -0
- package/server-dist/routes/projects.js.map +1 -0
- package/server-dist/routes/sessions.d.ts +4 -0
- package/server-dist/routes/sessions.d.ts.map +1 -0
- package/server-dist/routes/sessions.js +65 -0
- package/server-dist/routes/sessions.js.map +1 -0
- package/server-dist/utils.d.ts +6 -0
- package/server-dist/utils.d.ts.map +1 -0
- package/server-dist/utils.js +9 -0
- package/server-dist/utils.js.map +1 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ──────────────────────────────────────────────────────
|
|
2
2
|
// Shared error handler for all stats action handlers
|
|
3
3
|
// ──────────────────────────────────────────────────────
|
|
4
|
-
import { ProjectNotFoundError,
|
|
4
|
+
import { ProjectNotFoundError, InvalidPeriodError, } from '../data/types.js';
|
|
5
5
|
import { colors } from '../render/colors.js';
|
|
6
6
|
/**
|
|
7
7
|
* Handle known stats errors with user-friendly output.
|
|
@@ -13,10 +13,6 @@ export function handleStatsError(err) {
|
|
|
13
13
|
console.log(colors.hint('Expected: 7d, 30d, 90d, or all'));
|
|
14
14
|
process.exit(1);
|
|
15
15
|
}
|
|
16
|
-
if (err instanceof ConfigNotFoundError) {
|
|
17
|
-
console.error(`\n ${colors.error('\u2717')} ${err.message}`);
|
|
18
|
-
process.exit(1);
|
|
19
|
-
}
|
|
20
16
|
if (err instanceof ProjectNotFoundError) {
|
|
21
17
|
console.error(`\n ${colors.error(`Project "${err.projectName}" not found.`)}`);
|
|
22
18
|
if (err.suggestions.length > 0) {
|
|
@@ -31,12 +27,6 @@ export function handleStatsError(err) {
|
|
|
31
27
|
}
|
|
32
28
|
process.exit(1);
|
|
33
29
|
}
|
|
34
|
-
if (err instanceof FirestoreIndexError) {
|
|
35
|
-
console.error(`\n ${colors.error('\u2717')} Failed to load stats`);
|
|
36
|
-
console.log(`\n ${colors.error('Error:')} Missing Firestore index for sessions query.`);
|
|
37
|
-
console.log(` Create it here: ${err.indexUrl}`);
|
|
38
|
-
process.exit(1);
|
|
39
|
-
}
|
|
40
30
|
throw err;
|
|
41
31
|
}
|
|
42
32
|
//# sourceMappingURL=error-handler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../../../src/commands/stats/actions/error-handler.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,qDAAqD;AACrD,yDAAyD;AAEzD,OAAO,EACL,oBAAoB,EACpB,
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../../../src/commands/stats/actions/error-handler.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,qDAAqD;AACrD,yDAAyD;AAEzD,OAAO,EACL,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,IAAI,GAAG,YAAY,kBAAkB,EAAE,CAAC;QACtC,OAAO,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,GAAG,YAAY,oBAAoB,EAAE,CAAC;QACxC,OAAO,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,WAAW,cAAc,CAAC,EAAE,CAAC,CAAC;QAChF,IAAI,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,GAAG,CAAC;AACZ,CAAC"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import type { StatsDataSource, SessionRow, SessionQueryOptions, UsageStatsDoc, ProjectResolution, PrepareResult, StatsFlags } from './types.js';
|
|
2
2
|
export declare class LocalDataSource implements StatsDataSource {
|
|
3
3
|
readonly name = "local";
|
|
4
|
-
private cache;
|
|
5
|
-
constructor();
|
|
6
4
|
prepare(flags: StatsFlags): Promise<PrepareResult>;
|
|
7
5
|
getSessions(opts: SessionQueryOptions): Promise<SessionRow[]>;
|
|
8
6
|
getUsageStats(): Promise<UsageStatsDoc | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../../../src/commands/stats/data/local.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../../../src/commands/stats/data/local.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,UAAU,EACX,MAAM,YAAY,CAAC;AAUpB,qBAAa,eAAgB,YAAW,eAAe;IACrD,QAAQ,CAAC,IAAI,WAAW;IAElB,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IA2BlD,WAAW,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAI7D,aAAa,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IA6B9C,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;CAG/G"}
|
|
@@ -1,60 +1,67 @@
|
|
|
1
1
|
// ──────────────────────────────────────────────────────
|
|
2
2
|
// Local data source for stats commands
|
|
3
3
|
//
|
|
4
|
-
// Reads from the
|
|
5
|
-
//
|
|
6
|
-
// parsing local session files from all providers.
|
|
4
|
+
// Reads directly from the local SQLite database.
|
|
5
|
+
// Auto-syncs on prepare() unless --no-sync is passed.
|
|
7
6
|
// ──────────────────────────────────────────────────────
|
|
8
7
|
import { ProjectNotFoundError } from './types.js';
|
|
9
8
|
import { findSimilarNames } from './fuzzy-match.js';
|
|
10
|
-
import {
|
|
9
|
+
import { getSessions, getSessionCount, getLastSession, getProjectList } from '../../../db/read.js';
|
|
10
|
+
import { getDb } from '../../../db/client.js';
|
|
11
11
|
// ──────────────────────────────────────────────────────
|
|
12
12
|
// LocalDataSource
|
|
13
13
|
// ──────────────────────────────────────────────────────
|
|
14
14
|
export class LocalDataSource {
|
|
15
15
|
name = 'local';
|
|
16
|
-
cache;
|
|
17
|
-
constructor() {
|
|
18
|
-
this.cache = new StatsCache();
|
|
19
|
-
}
|
|
20
16
|
async prepare(flags) {
|
|
17
|
+
// Initialize the DB (runs migrations if first use)
|
|
18
|
+
getDb();
|
|
21
19
|
if (flags.noSync) {
|
|
22
|
-
const
|
|
23
|
-
return { message: `${
|
|
20
|
+
const count = getSessionCount();
|
|
21
|
+
return { message: `${count} sessions in database`, dataChanged: false };
|
|
22
|
+
}
|
|
23
|
+
// Auto-sync before showing stats
|
|
24
|
+
try {
|
|
25
|
+
const { runSync } = await import('../../sync.js');
|
|
26
|
+
const result = await runSync({ quiet: true });
|
|
27
|
+
if (result.syncedCount > 0) {
|
|
28
|
+
return {
|
|
29
|
+
message: `Synced ${result.syncedCount} new sessions`,
|
|
30
|
+
dataChanged: true,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const total = getSessionCount();
|
|
34
|
+
return { message: `${total} sessions`, dataChanged: false };
|
|
24
35
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return {
|
|
28
|
-
message: `Parsed ${result.newSessions} new sessions (${result.totalSessions} total)`,
|
|
29
|
-
dataChanged: true,
|
|
30
|
-
};
|
|
36
|
+
catch {
|
|
37
|
+
const total = getSessionCount();
|
|
38
|
+
return { message: `${total} sessions (sync failed)`, dataChanged: false };
|
|
31
39
|
}
|
|
32
|
-
return { message: `${result.totalSessions} sessions cached`, dataChanged: false };
|
|
33
40
|
}
|
|
34
41
|
async getSessions(opts) {
|
|
35
|
-
|
|
36
|
-
if (opts.periodStart)
|
|
37
|
-
rows = rows.filter((r) => r.startedAt >= opts.periodStart);
|
|
38
|
-
if (opts.projectId)
|
|
39
|
-
rows = rows.filter((r) => r.projectId === opts.projectId);
|
|
40
|
-
if (opts.sourceTool)
|
|
41
|
-
rows = rows.filter((r) => r.sourceTool === opts.sourceTool);
|
|
42
|
-
rows.sort((a, b) => b.startedAt.getTime() - a.startedAt.getTime());
|
|
43
|
-
return rows;
|
|
42
|
+
return getSessions(opts);
|
|
44
43
|
}
|
|
45
44
|
async getUsageStats() {
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
const db = getDb();
|
|
46
|
+
const row = db.prepare(`
|
|
47
|
+
SELECT total_input_tokens, total_output_tokens, cache_creation_tokens,
|
|
48
|
+
cache_read_tokens, estimated_cost_usd, sessions_with_usage, last_updated_at
|
|
49
|
+
FROM usage_stats WHERE id = 1
|
|
50
|
+
`).get();
|
|
51
|
+
if (!row)
|
|
52
|
+
return null;
|
|
53
|
+
return {
|
|
54
|
+
totalInputTokens: row.total_input_tokens,
|
|
55
|
+
totalOutputTokens: row.total_output_tokens,
|
|
56
|
+
cacheCreationTokens: row.cache_creation_tokens,
|
|
57
|
+
cacheReadTokens: row.cache_read_tokens,
|
|
58
|
+
estimatedCostUsd: row.estimated_cost_usd,
|
|
59
|
+
sessionsWithUsage: row.sessions_with_usage,
|
|
60
|
+
lastUpdatedAt: new Date(row.last_updated_at),
|
|
61
|
+
};
|
|
48
62
|
}
|
|
49
63
|
async resolveProjectId(name) {
|
|
50
|
-
const
|
|
51
|
-
const projects = new Map();
|
|
52
|
-
for (const row of rows) {
|
|
53
|
-
if (!projects.has(row.projectId)) {
|
|
54
|
-
projects.set(row.projectId, { id: row.projectId, name: row.projectName });
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
const projectList = [...projects.values()];
|
|
64
|
+
const projectList = getProjectList();
|
|
58
65
|
// Exact match (case-insensitive)
|
|
59
66
|
const exact = projectList.find((p) => p.name.toLowerCase() === name.toLowerCase());
|
|
60
67
|
if (exact)
|
|
@@ -68,14 +75,7 @@ export class LocalDataSource {
|
|
|
68
75
|
throw new ProjectNotFoundError(`Project "${name}" not found.`, name, projectList.map((p) => ({ name: p.name })), suggestions);
|
|
69
76
|
}
|
|
70
77
|
async getLastSession(opts) {
|
|
71
|
-
|
|
72
|
-
if (opts?.sourceTool)
|
|
73
|
-
rows = rows.filter(r => r.sourceTool === opts.sourceTool);
|
|
74
|
-
if (opts?.projectId)
|
|
75
|
-
rows = rows.filter(r => r.projectId === opts.projectId);
|
|
76
|
-
if (rows.length === 0)
|
|
77
|
-
return null;
|
|
78
|
-
return rows.reduce((latest, row) => (row.startedAt > latest.startedAt ? row : latest));
|
|
78
|
+
return getLastSession(opts);
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
//# sourceMappingURL=local.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../../../src/commands/stats/data/local.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,uCAAuC;AACvC,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../../../src/commands/stats/data/local.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
import type { StatsDataSource, StatsFlags } from './types.js';
|
|
2
2
|
/**
|
|
3
|
-
* Resolve
|
|
4
|
-
*
|
|
5
|
-
* Priority (highest to lowest):
|
|
6
|
-
* 1. --local flag -> always LocalDataSource
|
|
7
|
-
* 2. --remote flag -> always FirestoreDataSource (error if not configured)
|
|
8
|
-
* 3. config.dataSource -> as configured ('local' or 'firebase')
|
|
9
|
-
* 4. No config, Firebase creds present -> FirestoreDataSource (backward compat)
|
|
10
|
-
* 5. No config at all -> LocalDataSource (zero-config first run)
|
|
3
|
+
* Resolve the data source for stats commands.
|
|
4
|
+
* Phase 2: always local SQLite — Firebase is removed.
|
|
11
5
|
*/
|
|
12
|
-
export declare function resolveDataSource(
|
|
6
|
+
export declare function resolveDataSource(_flags: StatsFlags): Promise<StatsDataSource>;
|
|
13
7
|
//# sourceMappingURL=source.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../../../src/commands/stats/data/source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../../../src/commands/stats/data/source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE9D;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,CAGpF"}
|
|
@@ -1,40 +1,8 @@
|
|
|
1
|
-
import { loadConfig } from '../../../utils/config.js';
|
|
2
|
-
import { ConfigNotFoundError } from './types.js';
|
|
3
1
|
/**
|
|
4
|
-
* Resolve
|
|
5
|
-
*
|
|
6
|
-
* Priority (highest to lowest):
|
|
7
|
-
* 1. --local flag -> always LocalDataSource
|
|
8
|
-
* 2. --remote flag -> always FirestoreDataSource (error if not configured)
|
|
9
|
-
* 3. config.dataSource -> as configured ('local' or 'firebase')
|
|
10
|
-
* 4. No config, Firebase creds present -> FirestoreDataSource (backward compat)
|
|
11
|
-
* 5. No config at all -> LocalDataSource (zero-config first run)
|
|
2
|
+
* Resolve the data source for stats commands.
|
|
3
|
+
* Phase 2: always local SQLite — Firebase is removed.
|
|
12
4
|
*/
|
|
13
|
-
export async function resolveDataSource(
|
|
14
|
-
if (flags.local) {
|
|
15
|
-
const { LocalDataSource } = await import('./local.js');
|
|
16
|
-
return new LocalDataSource();
|
|
17
|
-
}
|
|
18
|
-
if (flags.remote) {
|
|
19
|
-
const config = loadConfig();
|
|
20
|
-
if (!config?.firebase) {
|
|
21
|
-
throw new ConfigNotFoundError('Firebase not configured. Run `code-insights init` first, or use `stats --local` for local-only stats.');
|
|
22
|
-
}
|
|
23
|
-
const { FirestoreDataSource } = await import('./firestore.js');
|
|
24
|
-
return new FirestoreDataSource(config);
|
|
25
|
-
}
|
|
26
|
-
const config = loadConfig();
|
|
27
|
-
if (!config) {
|
|
28
|
-
const { LocalDataSource } = await import('./local.js');
|
|
29
|
-
return new LocalDataSource();
|
|
30
|
-
}
|
|
31
|
-
// Explicit dataSource preference or backward-compat inference
|
|
32
|
-
const useFirebase = config.dataSource === 'firebase' ||
|
|
33
|
-
(!config.dataSource && config.firebase?.projectId);
|
|
34
|
-
if (useFirebase && config.firebase) {
|
|
35
|
-
const { FirestoreDataSource } = await import('./firestore.js');
|
|
36
|
-
return new FirestoreDataSource(config);
|
|
37
|
-
}
|
|
5
|
+
export async function resolveDataSource(_flags) {
|
|
38
6
|
const { LocalDataSource } = await import('./local.js');
|
|
39
7
|
return new LocalDataSource();
|
|
40
8
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../../../src/commands/stats/data/source.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../../../src/commands/stats/data/source.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAkB;IACxD,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IACvD,OAAO,IAAI,eAAe,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -34,7 +34,7 @@ export interface SessionRow {
|
|
|
34
34
|
customTitle?: string;
|
|
35
35
|
summary?: string;
|
|
36
36
|
sessionCharacter?: string;
|
|
37
|
-
sourceTool
|
|
37
|
+
sourceTool: string;
|
|
38
38
|
usageSource?: string;
|
|
39
39
|
}
|
|
40
40
|
/** Resolved project identity */
|
|
@@ -68,8 +68,6 @@ export interface StatsFlags {
|
|
|
68
68
|
project?: string;
|
|
69
69
|
source?: string;
|
|
70
70
|
noSync: boolean;
|
|
71
|
-
local: boolean;
|
|
72
|
-
remote: boolean;
|
|
73
71
|
}
|
|
74
72
|
/**
|
|
75
73
|
* Contract that every data source must implement.
|
|
@@ -202,10 +200,6 @@ export interface ModelStatsEntry {
|
|
|
202
200
|
export declare class StatsError extends Error {
|
|
203
201
|
constructor(message: string);
|
|
204
202
|
}
|
|
205
|
-
/** Thrown when required configuration is missing */
|
|
206
|
-
export declare class ConfigNotFoundError extends StatsError {
|
|
207
|
-
constructor(message: string);
|
|
208
|
-
}
|
|
209
203
|
/** Thrown when a project name cannot be resolved */
|
|
210
204
|
export declare class ProjectNotFoundError extends StatsError {
|
|
211
205
|
readonly projectName: string;
|
|
@@ -217,11 +211,6 @@ export declare class ProjectNotFoundError extends StatsError {
|
|
|
217
211
|
name: string;
|
|
218
212
|
}[], suggestions: string[]);
|
|
219
213
|
}
|
|
220
|
-
/** Thrown when a Firestore composite index is required but missing */
|
|
221
|
-
export declare class FirestoreIndexError extends StatsError {
|
|
222
|
-
readonly indexUrl: string;
|
|
223
|
-
constructor(message: string, indexUrl: string);
|
|
224
|
-
}
|
|
225
214
|
/** Thrown when an invalid period value is provided */
|
|
226
215
|
export declare class InvalidPeriodError extends StatsError {
|
|
227
216
|
constructor(message: string);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/commands/stats/data/types.ts"],"names":[],"mappings":"AAIA,yCAAyC;AACzC,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAElD,kDAAkD;AAClD,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IAEzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IAGpB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;IAGd,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IAGtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/commands/stats/data/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,13 +11,6 @@ export class StatsError extends Error {
|
|
|
11
11
|
this.name = 'StatsError';
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
|
-
/** Thrown when required configuration is missing */
|
|
15
|
-
export class ConfigNotFoundError extends StatsError {
|
|
16
|
-
constructor(message) {
|
|
17
|
-
super(message);
|
|
18
|
-
this.name = 'ConfigNotFoundError';
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
14
|
/** Thrown when a project name cannot be resolved */
|
|
22
15
|
export class ProjectNotFoundError extends StatsError {
|
|
23
16
|
projectName;
|
|
@@ -31,15 +24,6 @@ export class ProjectNotFoundError extends StatsError {
|
|
|
31
24
|
this.suggestions = suggestions;
|
|
32
25
|
}
|
|
33
26
|
}
|
|
34
|
-
/** Thrown when a Firestore composite index is required but missing */
|
|
35
|
-
export class FirestoreIndexError extends StatsError {
|
|
36
|
-
indexUrl;
|
|
37
|
-
constructor(message, indexUrl) {
|
|
38
|
-
super(message);
|
|
39
|
-
this.name = 'FirestoreIndexError';
|
|
40
|
-
this.indexUrl = indexUrl;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
27
|
/** Thrown when an invalid period value is provided */
|
|
44
28
|
export class InvalidPeriodError extends StatsError {
|
|
45
29
|
constructor(message) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/commands/stats/data/types.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,mCAAmC;AACnC,yDAAyD;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/commands/stats/data/types.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,mCAAmC;AACnC,yDAAyD;AAyOzD,yDAAyD;AACzD,gBAAgB;AAChB,yDAAyD;AAEzD,gDAAgD;AAChD,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,oDAAoD;AACpD,MAAM,OAAO,oBAAqB,SAAQ,UAAU;IAClC,WAAW,CAAS;IACpB,iBAAiB,CAAqB;IACtC,WAAW,CAAW;IAEtC,YACE,OAAe,EACf,WAAmB,EACnB,iBAAqC,EACrC,WAAqB;QAErB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAC3C,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;CACF;AAED,sDAAsD;AACtD,MAAM,OAAO,kBAAmB,SAAQ,UAAU;IAChD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/commands/stats/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAU,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAK1D,YAAY,EAAE,UAAU,EAAE,CAAC;AAE3B,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/commands/stats/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAU,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAK1D,YAAY,EAAE,UAAU,EAAE,CAAC;AAE3B,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAMtD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAWvE"}
|
|
@@ -5,9 +5,7 @@ export function applySharedFlags(cmd) {
|
|
|
5
5
|
.option('-p, --period <period>', 'Time range: 7d, 30d, 90d, all', '7d')
|
|
6
6
|
.option('--project <name>', 'Scope to a single project')
|
|
7
7
|
.option('--source <tool>', 'Filter by source tool (claude-code, cursor, etc.)')
|
|
8
|
-
.option('--no-sync', 'Skip auto-sync before displaying stats')
|
|
9
|
-
.option('--local', 'Use local session files (no Firebase required)')
|
|
10
|
-
.option('--remote', 'Force Firestore data source (requires Firebase config)');
|
|
8
|
+
.option('--no-sync', 'Skip auto-sync before displaying stats');
|
|
11
9
|
}
|
|
12
10
|
export function parseFlags(options) {
|
|
13
11
|
const period = options.period || '7d';
|
|
@@ -19,8 +17,6 @@ export function parseFlags(options) {
|
|
|
19
17
|
project: options.project,
|
|
20
18
|
source: options.source,
|
|
21
19
|
noSync: !options.sync, // Commander's --no-sync sets sync=false
|
|
22
|
-
local: !!options.local,
|
|
23
|
-
remote: !!options.remote,
|
|
24
20
|
};
|
|
25
21
|
}
|
|
26
22
|
//# sourceMappingURL=shared.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/commands/stats/shared.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAIlD,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,OAAO,GAAG;SACP,MAAM,CAAC,uBAAuB,EAAE,+BAA+B,EAAE,IAAI,CAAC;SACtE,MAAM,CAAC,kBAAkB,EAAE,2BAA2B,CAAC;SACvD,MAAM,CAAC,iBAAiB,EAAE,mDAAmD,CAAC;SAC9E,MAAM,CAAC,WAAW,EAAE,wCAAwC,CAAC
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/commands/stats/shared.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAIlD,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,OAAO,GAAG;SACP,MAAM,CAAC,uBAAuB,EAAE,+BAA+B,EAAE,IAAI,CAAC;SACtE,MAAM,CAAC,kBAAkB,EAAE,2BAA2B,CAAC;SACvD,MAAM,CAAC,iBAAiB,EAAE,mDAAmD,CAAC;SAC9E,MAAM,CAAC,WAAW,EAAE,wCAAwC,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAgC;IACzD,MAAM,MAAM,GAAI,OAAO,CAAC,MAAiB,IAAI,IAAI,CAAC;IAClD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,kBAAkB,CAAC,mBAAmB,MAAM,gBAAgB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpG,CAAC;IACD,OAAO;QACL,MAAM,EAAE,MAAgB;QACxB,OAAO,EAAE,OAAO,CAAC,OAA6B;QAC9C,MAAM,EAAE,OAAO,CAAC,MAA4B;QAC5C,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,EAAG,wCAAwC;KACjE,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAuEnD"}
|
package/dist/commands/status.js
CHANGED
|
@@ -1,40 +1,50 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { loadSyncState } from '../utils/config.js';
|
|
3
|
+
import { getDb, getDbPath } from '../db/client.js';
|
|
4
|
+
import { getProjects } from '../db/read.js';
|
|
5
|
+
import { getAllProviders } from '../providers/registry.js';
|
|
4
6
|
import { trackEvent } from '../utils/telemetry.js';
|
|
5
|
-
import * as fs from 'fs';
|
|
6
7
|
/**
|
|
7
8
|
* Show Code Insights status
|
|
8
9
|
*/
|
|
9
10
|
export async function statusCommand() {
|
|
10
|
-
console.log(chalk.cyan('\n
|
|
11
|
-
// Check
|
|
12
|
-
console.log(chalk.white('
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
11
|
+
console.log(chalk.cyan('\n Code Insights Status\n'));
|
|
12
|
+
// Check database
|
|
13
|
+
console.log(chalk.white('Database:'));
|
|
14
|
+
try {
|
|
15
|
+
getDb(); // ensures migrations run
|
|
16
|
+
const dbPath = getDbPath();
|
|
17
|
+
console.log(chalk.green(` Connected: ${dbPath}`));
|
|
18
|
+
const projects = getProjects();
|
|
19
|
+
if (projects.length > 0) {
|
|
20
|
+
const totalSessions = projects.reduce((sum, p) => sum + p.session_count, 0);
|
|
21
|
+
console.log(chalk.gray(` ${projects.length} projects, ${totalSessions} sessions synced`));
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
console.log(chalk.gray(' No sessions synced yet. Run `code-insights sync`'));
|
|
19
25
|
}
|
|
20
|
-
console.log(chalk.gray(` Data source: ${preference}`));
|
|
21
26
|
}
|
|
22
|
-
|
|
23
|
-
console.log(chalk.
|
|
24
|
-
console.log(chalk.gray(' Stats work without config: code-insights stats'));
|
|
25
|
-
console.log(chalk.gray(' To configure Firebase: code-insights init'));
|
|
27
|
+
catch (error) {
|
|
28
|
+
console.log(chalk.red(` Database error: ${error instanceof Error ? error.message : 'Unknown'}`));
|
|
26
29
|
}
|
|
27
|
-
//
|
|
28
|
-
console.log(chalk.white('\
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
// Discover local sessions across all providers
|
|
31
|
+
console.log(chalk.white('\nLocal Sessions:'));
|
|
32
|
+
const providers = getAllProviders();
|
|
33
|
+
let totalLocal = 0;
|
|
34
|
+
for (const provider of providers) {
|
|
35
|
+
try {
|
|
36
|
+
const files = await provider.discover();
|
|
37
|
+
if (files.length > 0) {
|
|
38
|
+
console.log(chalk.green(` ${provider.getProviderName()}: ${files.length} sessions`));
|
|
39
|
+
totalLocal += files.length;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Provider not available on this machine (e.g., no Cursor installed)
|
|
44
|
+
}
|
|
35
45
|
}
|
|
36
|
-
|
|
37
|
-
console.log(chalk.yellow(
|
|
46
|
+
if (totalLocal === 0) {
|
|
47
|
+
console.log(chalk.yellow(' No sessions found from any tool'));
|
|
38
48
|
}
|
|
39
49
|
// Check sync state
|
|
40
50
|
console.log(chalk.white('\nSync State:'));
|
|
@@ -42,79 +52,30 @@ export async function statusCommand() {
|
|
|
42
52
|
if (syncState.lastSync) {
|
|
43
53
|
const lastSync = new Date(syncState.lastSync);
|
|
44
54
|
const syncedFiles = Object.keys(syncState.files).length;
|
|
45
|
-
console.log(chalk.green(`
|
|
46
|
-
console.log(chalk.gray(`
|
|
55
|
+
console.log(chalk.green(` Last sync: ${lastSync.toLocaleString()}`));
|
|
56
|
+
console.log(chalk.gray(` ${syncedFiles} files tracked`));
|
|
47
57
|
}
|
|
48
58
|
else {
|
|
49
|
-
console.log(chalk.yellow('
|
|
50
|
-
console.log(chalk.gray('
|
|
59
|
+
console.log(chalk.yellow(' Never synced'));
|
|
60
|
+
console.log(chalk.gray(' Run `code-insights sync` to sync'));
|
|
51
61
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
else {
|
|
60
|
-
// Check Firebase connection
|
|
61
|
-
console.log(chalk.white('\nFirebase:'));
|
|
62
|
-
const config = loadConfig();
|
|
63
|
-
if (config) {
|
|
64
|
-
try {
|
|
65
|
-
initializeFirebase(config);
|
|
66
|
-
const projects = await getProjects();
|
|
67
|
-
console.log(chalk.green(' ✓ Connected'));
|
|
68
|
-
console.log(chalk.gray(` ${projects.length} projects in Firestore`));
|
|
69
|
-
if (projects.length > 0) {
|
|
70
|
-
console.log(chalk.white('\nSynced Projects:'));
|
|
71
|
-
for (const project of projects.slice(0, 5)) {
|
|
72
|
-
console.log(chalk.gray(` ${project.name} (${project.sessionCount} sessions)`));
|
|
73
|
-
}
|
|
74
|
-
if (projects.length > 5) {
|
|
75
|
-
console.log(chalk.gray(` ... and ${projects.length - 5} more`));
|
|
76
|
-
}
|
|
77
|
-
}
|
|
62
|
+
// Synced projects list
|
|
63
|
+
try {
|
|
64
|
+
const projects = getProjects();
|
|
65
|
+
if (projects.length > 0) {
|
|
66
|
+
console.log(chalk.white('\nSynced Projects:'));
|
|
67
|
+
for (const project of projects.slice(0, 5)) {
|
|
68
|
+
console.log(chalk.gray(` ${project.name} (${project.session_count} sessions)`));
|
|
78
69
|
}
|
|
79
|
-
|
|
80
|
-
console.log(chalk.
|
|
81
|
-
console.log(chalk.gray(` ${error instanceof Error ? error.message : 'Unknown error'}`));
|
|
70
|
+
if (projects.length > 5) {
|
|
71
|
+
console.log(chalk.gray(` ... and ${projects.length - 5} more`));
|
|
82
72
|
}
|
|
83
73
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
const webConfig = loadWebConfig();
|
|
88
|
-
console.log(chalk.green(' ✓ Configured'));
|
|
89
|
-
if (webConfig && typeof webConfig.projectId === 'string') {
|
|
90
|
-
console.log(chalk.gray(` Project: ${webConfig.projectId}`));
|
|
91
|
-
}
|
|
92
|
-
console.log(chalk.gray(' Run "code-insights connect" to get dashboard URL'));
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
console.log(chalk.yellow(' ○ Not configured'));
|
|
96
|
-
console.log(chalk.gray(' Run "code-insights init" to configure'));
|
|
97
|
-
}
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// DB not ready yet
|
|
98
77
|
}
|
|
99
78
|
console.log('');
|
|
100
79
|
trackEvent('status', true);
|
|
101
80
|
}
|
|
102
|
-
/**
|
|
103
|
-
* Count JSONL files in Claude directory
|
|
104
|
-
*/
|
|
105
|
-
function countJsonlFiles(baseDir) {
|
|
106
|
-
let count = 0;
|
|
107
|
-
const dirs = fs.readdirSync(baseDir);
|
|
108
|
-
for (const dir of dirs) {
|
|
109
|
-
if (dir.startsWith('.'))
|
|
110
|
-
continue;
|
|
111
|
-
const projectPath = `${baseDir}/${dir}`;
|
|
112
|
-
const stat = fs.statSync(projectPath);
|
|
113
|
-
if (!stat.isDirectory())
|
|
114
|
-
continue;
|
|
115
|
-
const files = fs.readdirSync(projectPath);
|
|
116
|
-
count += files.filter((f) => f.endsWith('.jsonl')).length;
|
|
117
|
-
}
|
|
118
|
-
return count;
|
|
119
|
-
}
|
|
120
81
|
//# sourceMappingURL=status.js.map
|