@code-insights/cli 1.0.0

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 (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +287 -0
  3. package/dist/commands/connect.d.ts +8 -0
  4. package/dist/commands/connect.d.ts.map +1 -0
  5. package/dist/commands/connect.js +33 -0
  6. package/dist/commands/connect.js.map +1 -0
  7. package/dist/commands/init.d.ts +9 -0
  8. package/dist/commands/init.d.ts.map +1 -0
  9. package/dist/commands/init.js +176 -0
  10. package/dist/commands/init.js.map +1 -0
  11. package/dist/commands/insights.d.ts +13 -0
  12. package/dist/commands/insights.d.ts.map +1 -0
  13. package/dist/commands/insights.js +87 -0
  14. package/dist/commands/insights.js.map +1 -0
  15. package/dist/commands/install-hook.d.ts +9 -0
  16. package/dist/commands/install-hook.d.ts.map +1 -0
  17. package/dist/commands/install-hook.js +98 -0
  18. package/dist/commands/install-hook.js.map +1 -0
  19. package/dist/commands/link.d.ts +8 -0
  20. package/dist/commands/link.d.ts.map +1 -0
  21. package/dist/commands/link.js +39 -0
  22. package/dist/commands/link.js.map +1 -0
  23. package/dist/commands/reset.d.ts +3 -0
  24. package/dist/commands/reset.d.ts.map +1 -0
  25. package/dist/commands/reset.js +95 -0
  26. package/dist/commands/reset.js.map +1 -0
  27. package/dist/commands/status.d.ts +5 -0
  28. package/dist/commands/status.d.ts.map +1 -0
  29. package/dist/commands/status.js +107 -0
  30. package/dist/commands/status.js.map +1 -0
  31. package/dist/commands/sync.d.ts +13 -0
  32. package/dist/commands/sync.d.ts.map +1 -0
  33. package/dist/commands/sync.js +205 -0
  34. package/dist/commands/sync.js.map +1 -0
  35. package/dist/firebase/client.d.ts +35 -0
  36. package/dist/firebase/client.d.ts.map +1 -0
  37. package/dist/firebase/client.js +317 -0
  38. package/dist/firebase/client.js.map +1 -0
  39. package/dist/index.d.ts +3 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +48 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/parser/insights.d.ts +7 -0
  44. package/dist/parser/insights.d.ts.map +1 -0
  45. package/dist/parser/insights.js +271 -0
  46. package/dist/parser/insights.js.map +1 -0
  47. package/dist/parser/jsonl.d.ts +6 -0
  48. package/dist/parser/jsonl.d.ts.map +1 -0
  49. package/dist/parser/jsonl.js +305 -0
  50. package/dist/parser/jsonl.js.map +1 -0
  51. package/dist/parser/titles.d.ts +14 -0
  52. package/dist/parser/titles.d.ts.map +1 -0
  53. package/dist/parser/titles.js +258 -0
  54. package/dist/parser/titles.js.map +1 -0
  55. package/dist/types.d.ts +216 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +3 -0
  58. package/dist/types.js.map +1 -0
  59. package/dist/utils/config.d.ts +46 -0
  60. package/dist/utils/config.d.ts.map +1 -0
  61. package/dist/utils/config.js +106 -0
  62. package/dist/utils/config.js.map +1 -0
  63. package/dist/utils/device.d.ts +32 -0
  64. package/dist/utils/device.d.ts.map +1 -0
  65. package/dist/utils/device.js +132 -0
  66. package/dist/utils/device.js.map +1 -0
  67. package/dist/utils/firebase-json.d.ts +87 -0
  68. package/dist/utils/firebase-json.d.ts.map +1 -0
  69. package/dist/utils/firebase-json.js +206 -0
  70. package/dist/utils/firebase-json.js.map +1 -0
  71. package/dist/utils/pricing.d.ts +29 -0
  72. package/dist/utils/pricing.d.ts.map +1 -0
  73. package/dist/utils/pricing.js +66 -0
  74. package/dist/utils/pricing.js.map +1 -0
  75. package/package.json +56 -0
@@ -0,0 +1,258 @@
1
+ // Skip patterns - generic responses that make poor titles
2
+ const SKIP_PATTERNS = [
3
+ /^(yes|no|ok|okay|sure|thanks|thank you|continue|go ahead|sounds good|looks good|perfect|great|nice|cool|done|got it)\.?$/i,
4
+ /^(y|n|k)$/i,
5
+ /^```/, // Code blocks
6
+ ];
7
+ // Prefixes to remove from titles
8
+ const PREFIX_REMOVALS = [
9
+ /^(help me|can you|could you|please|i want to|i need to|i'd like to|let's)\s+/i,
10
+ /^(hi|hello|hey),?\s*/i,
11
+ ];
12
+ // Action verbs that indicate good title candidates
13
+ const ACTION_VERBS = /^(fix|add|create|build|implement|update|remove|delete|refactor|move|rename|change|modify|setup|configure|install|debug|test|write|make|get|set|find|search|check|review|analyze|optimize|improve|migrate|convert|integrate)/i;
14
+ /**
15
+ * Generate a smart title for a session
16
+ */
17
+ export function generateTitle(session) {
18
+ // 1. If Claude Code provided a summary, use it
19
+ if (session.summary && session.summary.trim().length > 0) {
20
+ return {
21
+ title: cleanTitle(session.summary),
22
+ source: 'claude',
23
+ character: null,
24
+ };
25
+ }
26
+ // 2. Try to extract from first user message
27
+ const userMessageCandidate = extractFromUserMessage(session.messages);
28
+ if (userMessageCandidate && userMessageCandidate.score >= 40) {
29
+ return {
30
+ title: cleanTitle(userMessageCandidate.text),
31
+ source: userMessageCandidate.source,
32
+ character: null,
33
+ };
34
+ }
35
+ // 3. Try session character-based title
36
+ const character = detectSessionCharacter(session);
37
+ if (character) {
38
+ const characterTitle = generateCharacterTitle(session, character);
39
+ return {
40
+ title: characterTitle,
41
+ source: 'character',
42
+ character,
43
+ };
44
+ }
45
+ // 4. Use user message even with lower score if available
46
+ if (userMessageCandidate) {
47
+ return {
48
+ title: cleanTitle(userMessageCandidate.text),
49
+ source: userMessageCandidate.source,
50
+ character: null,
51
+ };
52
+ }
53
+ // 5. Fallback
54
+ return {
55
+ title: `${session.projectName} session (${session.messageCount} messages)`,
56
+ source: 'fallback',
57
+ character: null,
58
+ };
59
+ }
60
+ /**
61
+ * Extract title candidate from first meaningful user message
62
+ */
63
+ function extractFromUserMessage(messages) {
64
+ const userMessages = messages.filter(m => m.type === 'user');
65
+ for (const msg of userMessages.slice(0, 3)) {
66
+ const content = msg.content.trim();
67
+ if (SKIP_PATTERNS.some(p => p.test(content))) {
68
+ continue;
69
+ }
70
+ const wordCount = content.split(/\s+/).length;
71
+ if (wordCount < 3) {
72
+ continue;
73
+ }
74
+ let text = content;
75
+ if (wordCount > 50) {
76
+ const firstSentence = content.split(/[.!?]/)[0];
77
+ text = firstSentence.length > 10 ? firstSentence : content.split(/\s+/).slice(0, 20).join(' ');
78
+ }
79
+ const score = scoreUserMessage(text);
80
+ if (score > 0) {
81
+ return { text, source: 'user_message', score };
82
+ }
83
+ }
84
+ return null;
85
+ }
86
+ /**
87
+ * Score a user message for title quality
88
+ */
89
+ function scoreUserMessage(text) {
90
+ const wordCount = text.split(/\s+/).length;
91
+ if (wordCount < 3)
92
+ return 0;
93
+ if (wordCount > 100)
94
+ return 0;
95
+ if (ACTION_VERBS.test(text)) {
96
+ if (wordCount >= 5 && wordCount <= 15)
97
+ return 80;
98
+ if (wordCount > 15 && wordCount <= 30)
99
+ return 70;
100
+ return 60;
101
+ }
102
+ if (text.includes('?')) {
103
+ if (wordCount >= 5 && wordCount <= 20)
104
+ return 70;
105
+ return 50;
106
+ }
107
+ if (wordCount >= 5 && wordCount <= 15)
108
+ return 60;
109
+ if (wordCount > 15 && wordCount <= 50)
110
+ return 40;
111
+ return 20;
112
+ }
113
+ /**
114
+ * Detect the session's character based on patterns
115
+ */
116
+ export function detectSessionCharacter(session) {
117
+ const { messages, toolCallCount, messageCount } = session;
118
+ const toolCounts = {};
119
+ const filesModified = new Set();
120
+ const filesCreated = new Set();
121
+ for (const msg of messages) {
122
+ for (const tc of msg.toolCalls) {
123
+ toolCounts[tc.name] = (toolCounts[tc.name] || 0) + 1;
124
+ if (tc.name === 'Edit' || tc.name === 'Write') {
125
+ const filePath = tc.input?.file_path;
126
+ if (filePath) {
127
+ filesModified.add(filePath);
128
+ if (tc.name === 'Write') {
129
+ filesCreated.add(filePath);
130
+ }
131
+ }
132
+ }
133
+ }
134
+ }
135
+ const editCount = (toolCounts['Edit'] || 0) + (toolCounts['Write'] || 0);
136
+ const readCount = (toolCounts['Read'] || 0) + (toolCounts['Grep'] || 0) + (toolCounts['Glob'] || 0);
137
+ if (messageCount >= 50 && filesModified.size <= 3 && filesModified.size > 0) {
138
+ return 'deep_focus';
139
+ }
140
+ const hasErrorPatterns = messages.some(m => /error|bug|fix|issue|broken|fail/i.test(m.content));
141
+ const hasFix = messages.some(m => /fixed|resolved|working now/i.test(m.content));
142
+ if (hasErrorPatterns && hasFix && editCount > 0) {
143
+ return 'bug_hunt';
144
+ }
145
+ if (filesCreated.size >= 3) {
146
+ return 'feature_build';
147
+ }
148
+ if (readCount > editCount * 3 && editCount < 5) {
149
+ return 'exploration';
150
+ }
151
+ if (editCount > 10 && filesCreated.size === 0) {
152
+ return 'refactor';
153
+ }
154
+ const questionCount = messages.filter(m => m.type === 'user' && m.content.includes('?')).length;
155
+ if (questionCount >= 3 && toolCallCount < messageCount) {
156
+ return 'learning';
157
+ }
158
+ if (messageCount < 10 && editCount > 0) {
159
+ return 'quick_task';
160
+ }
161
+ return null;
162
+ }
163
+ /**
164
+ * Generate title based on session character
165
+ */
166
+ function generateCharacterTitle(session, character) {
167
+ const fileCounts = {};
168
+ for (const msg of session.messages) {
169
+ for (const tc of msg.toolCalls) {
170
+ if (tc.name === 'Edit' || tc.name === 'Write') {
171
+ const filePath = tc.input?.file_path;
172
+ if (filePath) {
173
+ const fileName = filePath.split('/').pop() || filePath;
174
+ fileCounts[fileName] = (fileCounts[fileName] || 0) + 1;
175
+ }
176
+ }
177
+ }
178
+ }
179
+ const primaryFile = Object.entries(fileCounts)
180
+ .sort((a, b) => b[1] - a[1])[0]?.[0] || 'files';
181
+ const userContent = session.messages
182
+ .filter(m => m.type === 'user')
183
+ .map(m => m.content)
184
+ .join(' ')
185
+ .toLowerCase();
186
+ const topic = extractTopic(userContent) || session.projectName;
187
+ switch (character) {
188
+ case 'deep_focus':
189
+ return `Deep work: ${primaryFile}`;
190
+ case 'bug_hunt':
191
+ return `Fixed: ${extractBugDescription(session.messages) || primaryFile}`;
192
+ case 'feature_build':
193
+ return `Built: ${topic}`;
194
+ case 'exploration':
195
+ return `Explored: ${topic}`;
196
+ case 'refactor':
197
+ return `Refactored: ${primaryFile}`;
198
+ case 'learning':
199
+ return `Learned: ${topic}`;
200
+ case 'quick_task':
201
+ return `Updated: ${primaryFile}`;
202
+ default:
203
+ return `${session.projectName} session`;
204
+ }
205
+ }
206
+ /**
207
+ * Extract a topic from user content
208
+ */
209
+ function extractTopic(content) {
210
+ const patterns = [
211
+ /(?:about|for|with|using)\s+([a-z][a-z0-9\s-]{2,20})/i,
212
+ /([a-z][a-z0-9\s-]{2,15})\s+(?:feature|component|module|function|api)/i,
213
+ ];
214
+ for (const pattern of patterns) {
215
+ const match = content.match(pattern);
216
+ if (match) {
217
+ return match[1].trim();
218
+ }
219
+ }
220
+ return null;
221
+ }
222
+ /**
223
+ * Extract bug description from messages
224
+ */
225
+ function extractBugDescription(messages) {
226
+ for (const msg of messages) {
227
+ if (msg.type === 'user') {
228
+ const match = msg.content.match(/(?:fix|bug|error|issue)[:\s]+([^.!?\n]{5,40})/i);
229
+ if (match) {
230
+ return match[1].trim();
231
+ }
232
+ }
233
+ }
234
+ return null;
235
+ }
236
+ /**
237
+ * Clean and format a title
238
+ */
239
+ export function cleanTitle(raw) {
240
+ let title = raw;
241
+ for (const pattern of PREFIX_REMOVALS) {
242
+ title = title.replace(pattern, '');
243
+ }
244
+ title = title.replace(/[*_`#]/g, '');
245
+ title = title.replace(/\s+/g, ' ').trim();
246
+ if (title.length > 60) {
247
+ title = title.slice(0, 57) + '...';
248
+ }
249
+ title = title.charAt(0).toUpperCase() + title.slice(1);
250
+ return title;
251
+ }
252
+ /**
253
+ * Capitalize first letter of string
254
+ */
255
+ function capitalize(str) {
256
+ return str.charAt(0).toUpperCase() + str.slice(1);
257
+ }
258
+ //# sourceMappingURL=titles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"titles.js","sourceRoot":"","sources":["../../src/parser/titles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,216 @@
1
+ export interface ClaudeMessage {
2
+ type: 'user' | 'assistant' | 'system';
3
+ parentUuid?: string | null;
4
+ uuid: string;
5
+ sessionId: string;
6
+ timestamp: string;
7
+ cwd?: string;
8
+ gitBranch?: string;
9
+ version?: string;
10
+ isSidechain?: boolean;
11
+ isMeta?: boolean;
12
+ message: {
13
+ role: string;
14
+ content: string | MessageContent[];
15
+ model?: string;
16
+ usage?: {
17
+ input_tokens?: number;
18
+ output_tokens?: number;
19
+ cache_creation_input_tokens?: number;
20
+ cache_read_input_tokens?: number;
21
+ };
22
+ };
23
+ }
24
+ export interface MessageContent {
25
+ type: 'text' | 'thinking' | 'tool_use' | 'tool_result';
26
+ text?: string;
27
+ thinking?: string;
28
+ id?: string;
29
+ name?: string;
30
+ input?: Record<string, unknown>;
31
+ tool_use_id?: string;
32
+ content?: string | Array<{
33
+ type: string;
34
+ text: string;
35
+ }>;
36
+ }
37
+ export interface SessionSummary {
38
+ type: 'summary';
39
+ summary: string;
40
+ leafUuid: string;
41
+ }
42
+ export interface FileHistorySnapshot {
43
+ type: 'file-history-snapshot';
44
+ messageId: string;
45
+ snapshot: {
46
+ messageId: string;
47
+ trackedFileBackups: Record<string, unknown>;
48
+ timestamp: string;
49
+ };
50
+ isSnapshotUpdate: boolean;
51
+ }
52
+ export type JsonlEntry = ClaudeMessage | SessionSummary | FileHistorySnapshot;
53
+ export interface ParsedSession {
54
+ id: string;
55
+ projectPath: string;
56
+ projectName: string;
57
+ summary: string | null;
58
+ generatedTitle: string | null;
59
+ titleSource: TitleSource | null;
60
+ sessionCharacter: SessionCharacter | null;
61
+ startedAt: Date;
62
+ endedAt: Date;
63
+ messageCount: number;
64
+ userMessageCount: number;
65
+ assistantMessageCount: number;
66
+ toolCallCount: number;
67
+ customTitle?: string;
68
+ gitBranch: string | null;
69
+ claudeVersion: string | null;
70
+ usage?: SessionUsage;
71
+ messages: ParsedMessage[];
72
+ }
73
+ export interface ParsedMessage {
74
+ id: string;
75
+ sessionId: string;
76
+ type: 'user' | 'assistant' | 'system';
77
+ content: string;
78
+ thinking: string | null;
79
+ toolCalls: ToolCall[];
80
+ toolResults: ToolResult[];
81
+ usage: MessageUsage | null;
82
+ timestamp: Date;
83
+ parentId: string | null;
84
+ }
85
+ export interface SessionUsage {
86
+ totalInputTokens: number;
87
+ totalOutputTokens: number;
88
+ cacheCreationTokens: number;
89
+ cacheReadTokens: number;
90
+ estimatedCostUsd: number;
91
+ modelsUsed: string[];
92
+ primaryModel: string;
93
+ usageSource: 'jsonl';
94
+ }
95
+ export type SessionCharacter = 'deep_focus' | 'bug_hunt' | 'feature_build' | 'exploration' | 'refactor' | 'learning' | 'quick_task';
96
+ export type TitleSource = 'claude' | 'user_message' | 'insight' | 'character' | 'fallback';
97
+ export interface TitleCandidate {
98
+ text: string;
99
+ source: TitleSource;
100
+ score: number;
101
+ }
102
+ export interface GeneratedTitle {
103
+ title: string;
104
+ source: TitleSource;
105
+ character: SessionCharacter | null;
106
+ }
107
+ export interface ParsedInsightContent {
108
+ title: string;
109
+ summary: string;
110
+ bullets: string[];
111
+ rawContent: string;
112
+ }
113
+ export interface ToolCall {
114
+ id: string;
115
+ name: string;
116
+ input: Record<string, unknown>;
117
+ }
118
+ export interface ToolResult {
119
+ toolUseId: string;
120
+ output: string;
121
+ }
122
+ export interface MessageUsage {
123
+ inputTokens: number;
124
+ outputTokens: number;
125
+ cacheCreationTokens: number;
126
+ cacheReadTokens: number;
127
+ model: string;
128
+ estimatedCostUsd: number;
129
+ }
130
+ export type InsightType = 'summary' | 'decision' | 'learning' | 'technique' | 'prompt_quality';
131
+ export type InsightScope = 'session' | 'project' | 'overall';
132
+ export interface Insight {
133
+ id: string;
134
+ sessionId: string;
135
+ projectId: string;
136
+ projectName: string;
137
+ type: InsightType;
138
+ title: string;
139
+ content: string;
140
+ summary: string;
141
+ bullets: string[];
142
+ confidence: number;
143
+ source: 'llm';
144
+ metadata: InsightMetadata;
145
+ timestamp: Date;
146
+ createdAt?: Date;
147
+ scope: InsightScope;
148
+ analysisVersion: string;
149
+ }
150
+ export interface InsightMetadata {
151
+ alternatives?: string[];
152
+ reasoning?: string;
153
+ context?: string;
154
+ applicability?: string;
155
+ }
156
+ export interface ClaudeInsightConfig {
157
+ firebase: {
158
+ projectId: string;
159
+ clientEmail: string;
160
+ privateKey: string;
161
+ };
162
+ webConfig?: FirebaseWebConfig;
163
+ sync: {
164
+ claudeDir: string;
165
+ excludeProjects: string[];
166
+ };
167
+ dashboardUrl?: string;
168
+ }
169
+ export interface SyncState {
170
+ lastSync: string;
171
+ files: Record<string, FileSyncState>;
172
+ }
173
+ export interface FileSyncState {
174
+ lastModified: string;
175
+ lastSyncedLine: number;
176
+ sessionId: string;
177
+ }
178
+ export interface Project {
179
+ id: string;
180
+ name: string;
181
+ path: string;
182
+ sessionCount: number;
183
+ lastActivity: Date;
184
+ createdAt: Date;
185
+ }
186
+ /**
187
+ * Firebase Service Account JSON file structure
188
+ * Downloaded from Firebase Console > Project Settings > Service Accounts
189
+ */
190
+ export interface FirebaseServiceAccountJson {
191
+ type: 'service_account';
192
+ project_id: string;
193
+ private_key_id: string;
194
+ private_key: string;
195
+ client_email: string;
196
+ client_id: string;
197
+ auth_uri: string;
198
+ token_uri: string;
199
+ auth_provider_x509_cert_url: string;
200
+ client_x509_cert_url: string;
201
+ universe_domain?: string;
202
+ }
203
+ /**
204
+ * Firebase Web SDK config
205
+ * Found in Firebase Console > Project Settings > General > Your Apps > Web App
206
+ */
207
+ export interface FirebaseWebConfig {
208
+ apiKey: string;
209
+ authDomain: string;
210
+ projectId: string;
211
+ storageBucket: string;
212
+ messagingSenderId: string;
213
+ appId: string;
214
+ measurementId?: string;
215
+ }
216
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ // Core types for Code Insights
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,+BAA+B"}
@@ -0,0 +1,46 @@
1
+ import type { ClaudeInsightConfig, SyncState, FirebaseWebConfig } from '../types.js';
2
+ /**
3
+ * Ensure config directory exists
4
+ */
5
+ export declare function ensureConfigDir(): void;
6
+ /**
7
+ * Load configuration from file
8
+ */
9
+ export declare function loadConfig(): ClaudeInsightConfig | null;
10
+ /**
11
+ * Save configuration to file
12
+ */
13
+ export declare function saveConfig(config: ClaudeInsightConfig): void;
14
+ /**
15
+ * Load sync state
16
+ */
17
+ export declare function loadSyncState(): SyncState;
18
+ /**
19
+ * Save sync state
20
+ */
21
+ export declare function saveSyncState(state: SyncState): void;
22
+ /**
23
+ * Get default Claude directory
24
+ */
25
+ export declare function getClaudeDir(): string;
26
+ /**
27
+ * Check if config exists
28
+ */
29
+ export declare function isConfigured(): boolean;
30
+ /**
31
+ * Get config directory path
32
+ */
33
+ export declare function getConfigDir(): string;
34
+ /**
35
+ * Load web config from file
36
+ */
37
+ export declare function loadWebConfig(): Record<string, unknown> | null;
38
+ /**
39
+ * Save web config to file
40
+ */
41
+ export declare function saveWebConfig(config: FirebaseWebConfig): void;
42
+ /**
43
+ * Check if web config exists
44
+ */
45
+ export declare function hasWebConfig(): boolean;
46
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAOrF;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAItC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,mBAAmB,GAAG,IAAI,CAUvD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAG5D;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,SAAS,CAUzC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAGpD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAU9D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAG7D;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC"}
@@ -0,0 +1,106 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as os from 'os';
4
+ const CONFIG_DIR = path.join(os.homedir(), '.code-insights');
5
+ const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
6
+ const SYNC_STATE_FILE = path.join(CONFIG_DIR, 'sync-state.json');
7
+ const WEB_CONFIG_FILE = path.join(CONFIG_DIR, 'web-config.json');
8
+ /**
9
+ * Ensure config directory exists
10
+ */
11
+ export function ensureConfigDir() {
12
+ if (!fs.existsSync(CONFIG_DIR)) {
13
+ fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
14
+ }
15
+ }
16
+ /**
17
+ * Load configuration from file
18
+ */
19
+ export function loadConfig() {
20
+ try {
21
+ if (!fs.existsSync(CONFIG_FILE)) {
22
+ return null;
23
+ }
24
+ const content = fs.readFileSync(CONFIG_FILE, 'utf-8');
25
+ return JSON.parse(content);
26
+ }
27
+ catch {
28
+ return null;
29
+ }
30
+ }
31
+ /**
32
+ * Save configuration to file
33
+ */
34
+ export function saveConfig(config) {
35
+ ensureConfigDir();
36
+ fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), { mode: 0o600 });
37
+ }
38
+ /**
39
+ * Load sync state
40
+ */
41
+ export function loadSyncState() {
42
+ try {
43
+ if (!fs.existsSync(SYNC_STATE_FILE)) {
44
+ return { lastSync: '', files: {} };
45
+ }
46
+ const content = fs.readFileSync(SYNC_STATE_FILE, 'utf-8');
47
+ return JSON.parse(content);
48
+ }
49
+ catch {
50
+ return { lastSync: '', files: {} };
51
+ }
52
+ }
53
+ /**
54
+ * Save sync state
55
+ */
56
+ export function saveSyncState(state) {
57
+ ensureConfigDir();
58
+ fs.writeFileSync(SYNC_STATE_FILE, JSON.stringify(state, null, 2));
59
+ }
60
+ /**
61
+ * Get default Claude directory
62
+ */
63
+ export function getClaudeDir() {
64
+ return path.join(os.homedir(), '.claude', 'projects');
65
+ }
66
+ /**
67
+ * Check if config exists
68
+ */
69
+ export function isConfigured() {
70
+ return fs.existsSync(CONFIG_FILE);
71
+ }
72
+ /**
73
+ * Get config directory path
74
+ */
75
+ export function getConfigDir() {
76
+ return CONFIG_DIR;
77
+ }
78
+ /**
79
+ * Load web config from file
80
+ */
81
+ export function loadWebConfig() {
82
+ try {
83
+ if (!fs.existsSync(WEB_CONFIG_FILE)) {
84
+ return null;
85
+ }
86
+ const content = fs.readFileSync(WEB_CONFIG_FILE, 'utf-8');
87
+ return JSON.parse(content);
88
+ }
89
+ catch {
90
+ return null;
91
+ }
92
+ }
93
+ /**
94
+ * Save web config to file
95
+ */
96
+ export function saveWebConfig(config) {
97
+ ensureConfigDir();
98
+ fs.writeFileSync(WEB_CONFIG_FILE, JSON.stringify(config, null, 2), { mode: 0o600 });
99
+ }
100
+ /**
101
+ * Check if web config exists
102
+ */
103
+ export function hasWebConfig() {
104
+ return fs.existsSync(WEB_CONFIG_FILE);
105
+ }
106
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}