claudecto 0.1.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 (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +275 -0
  3. package/dist/__tests__/package.test.d.ts +2 -0
  4. package/dist/__tests__/package.test.d.ts.map +1 -0
  5. package/dist/__tests__/package.test.js +53 -0
  6. package/dist/__tests__/package.test.js.map +1 -0
  7. package/dist/cli.d.ts +6 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +200 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/index.d.ts +12 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +12 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/server/index.d.ts +11 -0
  16. package/dist/server/index.d.ts.map +1 -0
  17. package/dist/server/index.js +1207 -0
  18. package/dist/server/index.js.map +1 -0
  19. package/dist/services/advisor.d.ts +117 -0
  20. package/dist/services/advisor.d.ts.map +1 -0
  21. package/dist/services/advisor.js +2636 -0
  22. package/dist/services/advisor.js.map +1 -0
  23. package/dist/services/agent-generator.d.ts +71 -0
  24. package/dist/services/agent-generator.d.ts.map +1 -0
  25. package/dist/services/agent-generator.js +295 -0
  26. package/dist/services/agent-generator.js.map +1 -0
  27. package/dist/services/agents.d.ts +67 -0
  28. package/dist/services/agents.d.ts.map +1 -0
  29. package/dist/services/agents.js +405 -0
  30. package/dist/services/agents.js.map +1 -0
  31. package/dist/services/analytics.d.ts +145 -0
  32. package/dist/services/analytics.d.ts.map +1 -0
  33. package/dist/services/analytics.js +609 -0
  34. package/dist/services/analytics.js.map +1 -0
  35. package/dist/services/blueprints.d.ts +31 -0
  36. package/dist/services/blueprints.d.ts.map +1 -0
  37. package/dist/services/blueprints.js +317 -0
  38. package/dist/services/blueprints.js.map +1 -0
  39. package/dist/services/claude-dir.d.ts +50 -0
  40. package/dist/services/claude-dir.d.ts.map +1 -0
  41. package/dist/services/claude-dir.js +193 -0
  42. package/dist/services/claude-dir.js.map +1 -0
  43. package/dist/services/hooks.d.ts +38 -0
  44. package/dist/services/hooks.d.ts.map +1 -0
  45. package/dist/services/hooks.js +165 -0
  46. package/dist/services/hooks.js.map +1 -0
  47. package/dist/services/insights.d.ts +52 -0
  48. package/dist/services/insights.d.ts.map +1 -0
  49. package/dist/services/insights.js +1035 -0
  50. package/dist/services/insights.js.map +1 -0
  51. package/dist/services/memory.d.ts +14 -0
  52. package/dist/services/memory.d.ts.map +1 -0
  53. package/dist/services/memory.js +25 -0
  54. package/dist/services/memory.js.map +1 -0
  55. package/dist/services/plans.d.ts +20 -0
  56. package/dist/services/plans.d.ts.map +1 -0
  57. package/dist/services/plans.js +149 -0
  58. package/dist/services/plans.js.map +1 -0
  59. package/dist/services/project-intelligence.d.ts +75 -0
  60. package/dist/services/project-intelligence.d.ts.map +1 -0
  61. package/dist/services/project-intelligence.js +731 -0
  62. package/dist/services/project-intelligence.js.map +1 -0
  63. package/dist/services/search.d.ts +32 -0
  64. package/dist/services/search.d.ts.map +1 -0
  65. package/dist/services/search.js +203 -0
  66. package/dist/services/search.js.map +1 -0
  67. package/dist/services/sessions.d.ts +25 -0
  68. package/dist/services/sessions.d.ts.map +1 -0
  69. package/dist/services/sessions.js +248 -0
  70. package/dist/services/sessions.js.map +1 -0
  71. package/dist/services/skills.d.ts +30 -0
  72. package/dist/services/skills.d.ts.map +1 -0
  73. package/dist/services/skills.js +197 -0
  74. package/dist/services/skills.js.map +1 -0
  75. package/dist/services/stats.d.ts +23 -0
  76. package/dist/services/stats.d.ts.map +1 -0
  77. package/dist/services/stats.js +88 -0
  78. package/dist/services/stats.js.map +1 -0
  79. package/dist/services/teams.d.ts +115 -0
  80. package/dist/services/teams.d.ts.map +1 -0
  81. package/dist/services/teams.js +421 -0
  82. package/dist/services/teams.js.map +1 -0
  83. package/dist/services/tech-stack.d.ts +98 -0
  84. package/dist/services/tech-stack.d.ts.map +1 -0
  85. package/dist/services/tech-stack.js +1088 -0
  86. package/dist/services/tech-stack.js.map +1 -0
  87. package/dist/services/terminal.d.ts +75 -0
  88. package/dist/services/terminal.d.ts.map +1 -0
  89. package/dist/services/terminal.js +224 -0
  90. package/dist/services/terminal.js.map +1 -0
  91. package/dist/types.d.ts +1095 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +18 -0
  94. package/dist/types.js.map +1 -0
  95. package/dist/ui/assets/index-BiH4Nhdk.css +1 -0
  96. package/dist/ui/assets/index-Brv-K8bd.css +1 -0
  97. package/dist/ui/assets/index-BwMBEdQz.js +3108 -0
  98. package/dist/ui/assets/index-BwMBEdQz.js.map +1 -0
  99. package/dist/ui/assets/index-CEWz7ABD.js +3108 -0
  100. package/dist/ui/assets/index-CEWz7ABD.js.map +1 -0
  101. package/dist/ui/assets/index-CIZ3vvc-.css +1 -0
  102. package/dist/ui/assets/index-CsU3cI0n.js +3108 -0
  103. package/dist/ui/assets/index-CsU3cI0n.js.map +1 -0
  104. package/dist/ui/assets/index-D3AY6iCS.js +3133 -0
  105. package/dist/ui/assets/index-D3AY6iCS.js.map +1 -0
  106. package/dist/ui/assets/index-D8lNZ0Ye.css +1 -0
  107. package/dist/ui/assets/index-DmgeppSA.js +3108 -0
  108. package/dist/ui/assets/index-DmgeppSA.js.map +1 -0
  109. package/dist/ui/favicon.svg +43 -0
  110. package/dist/ui/index.html +23 -0
  111. package/dist/utils/jsonl.d.ts +16 -0
  112. package/dist/utils/jsonl.d.ts.map +1 -0
  113. package/dist/utils/jsonl.js +51 -0
  114. package/dist/utils/jsonl.js.map +1 -0
  115. package/package.json +106 -0
@@ -0,0 +1,405 @@
1
+ /**
2
+ * Agents service - reads and manages custom agents from ~/.claude/agents/
3
+ * Custom agents are subagents that Claude can delegate tasks to.
4
+ */
5
+ import path from 'node:path';
6
+ import { parse as parseYaml } from 'yaml';
7
+ export class AgentsService {
8
+ claudeDir;
9
+ constructor(claudeDir) {
10
+ this.claudeDir = claudeDir;
11
+ }
12
+ /**
13
+ * Get the agents directory path
14
+ */
15
+ get agentsDir() {
16
+ return path.join(this.claudeDir.root, 'agents');
17
+ }
18
+ /**
19
+ * List all agents (user-level from ~/.claude/agents/)
20
+ */
21
+ async listAgents() {
22
+ const agents = [];
23
+ try {
24
+ const fs = await import('node:fs/promises');
25
+ const agentsDir = this.agentsDir;
26
+ // Check if agents directory exists
27
+ try {
28
+ await fs.access(agentsDir);
29
+ }
30
+ catch {
31
+ return agents; // Directory doesn't exist yet
32
+ }
33
+ const entries = await fs.readdir(agentsDir, { withFileTypes: true });
34
+ for (const entry of entries) {
35
+ if (entry.isDirectory()) {
36
+ const agentPath = path.join(agentsDir, entry.name, 'AGENT.md');
37
+ try {
38
+ await fs.access(agentPath);
39
+ const agent = await this.parseAgent(agentPath, 'user');
40
+ if (agent) {
41
+ agents.push(agent);
42
+ }
43
+ }
44
+ catch {
45
+ // AGENT.md doesn't exist in this directory, skip
46
+ }
47
+ }
48
+ }
49
+ }
50
+ catch {
51
+ // Agents directory doesn't exist yet
52
+ }
53
+ // Sort by name
54
+ agents.sort((a, b) => a.name.localeCompare(b.name));
55
+ return agents;
56
+ }
57
+ /**
58
+ * Get a specific agent by path
59
+ */
60
+ async getAgent(agentPath) {
61
+ const fullPath = path.join(this.agentsDir, agentPath, 'AGENT.md');
62
+ if (!(await this.claudeDir.fileExists(fullPath))) {
63
+ return null;
64
+ }
65
+ return this.parseAgent(fullPath, 'user');
66
+ }
67
+ /**
68
+ * Create a new agent
69
+ */
70
+ async createAgent(name, content) {
71
+ const validation = this.validateAgent(content);
72
+ if (!validation.valid) {
73
+ return { success: false, error: validation.errors.join(', ') };
74
+ }
75
+ const agentDir = path.join(this.agentsDir, name);
76
+ const agentFile = path.join(agentDir, 'AGENT.md');
77
+ try {
78
+ const fs = await import('node:fs/promises');
79
+ // Ensure agents directory exists
80
+ await fs.mkdir(this.agentsDir, { recursive: true });
81
+ // Create agent directory
82
+ await fs.mkdir(agentDir, { recursive: true });
83
+ // Write agent file
84
+ await fs.writeFile(agentFile, content, 'utf-8');
85
+ return { success: true };
86
+ }
87
+ catch (e) {
88
+ return { success: false, error: String(e) };
89
+ }
90
+ }
91
+ /**
92
+ * Update an existing agent
93
+ */
94
+ async updateAgent(agentPath, content) {
95
+ const validation = this.validateAgent(content);
96
+ if (!validation.valid) {
97
+ return { success: false, error: validation.errors.join(', ') };
98
+ }
99
+ const fullPath = path.join(this.agentsDir, agentPath, 'AGENT.md');
100
+ if (!(await this.claudeDir.fileExists(fullPath))) {
101
+ return { success: false, error: 'Agent not found' };
102
+ }
103
+ try {
104
+ const fs = await import('node:fs/promises');
105
+ await fs.writeFile(fullPath, content, 'utf-8');
106
+ return { success: true };
107
+ }
108
+ catch (e) {
109
+ return { success: false, error: String(e) };
110
+ }
111
+ }
112
+ /**
113
+ * Delete an agent
114
+ */
115
+ async deleteAgent(agentPath) {
116
+ const fullPath = path.join(this.agentsDir, agentPath, 'AGENT.md');
117
+ if (!(await this.claudeDir.fileExists(fullPath))) {
118
+ return { success: false, error: 'Agent not found' };
119
+ }
120
+ try {
121
+ const fs = await import('node:fs/promises');
122
+ await fs.rm(path.dirname(fullPath), { recursive: true });
123
+ return { success: true };
124
+ }
125
+ catch (e) {
126
+ return { success: false, error: String(e) };
127
+ }
128
+ }
129
+ /**
130
+ * Validate agent content
131
+ */
132
+ validateAgent(content) {
133
+ const errors = [];
134
+ // Check frontmatter exists
135
+ if (!content.startsWith('---')) {
136
+ errors.push('Missing YAML frontmatter (must start with ---)');
137
+ return { valid: false, errors };
138
+ }
139
+ // Find end of frontmatter
140
+ const endIndex = content.indexOf('---', 3);
141
+ if (endIndex === -1) {
142
+ errors.push('Unclosed frontmatter (missing closing ---)');
143
+ return { valid: false, errors };
144
+ }
145
+ const frontmatterStr = content.slice(3, endIndex).trim();
146
+ try {
147
+ const frontmatter = parseYaml(frontmatterStr);
148
+ // Validate name if present
149
+ if (frontmatter.name) {
150
+ if (!/^[a-z0-9-]+$/.test(frontmatter.name)) {
151
+ errors.push('name must contain only lowercase letters, numbers, and hyphens');
152
+ }
153
+ if (frontmatter.name.length > 64) {
154
+ errors.push('name must be 64 characters or less');
155
+ }
156
+ }
157
+ // Validate context if present
158
+ if (frontmatter.context && frontmatter.context !== 'fork') {
159
+ errors.push('context must be "fork" if specified');
160
+ }
161
+ // Validate user-invocable is boolean
162
+ if (frontmatter['user-invocable'] !== undefined &&
163
+ typeof frontmatter['user-invocable'] !== 'boolean') {
164
+ errors.push('user-invocable must be a boolean');
165
+ }
166
+ // Validate disable-model-invocation is boolean
167
+ if (frontmatter['disable-model-invocation'] !== undefined &&
168
+ typeof frontmatter['disable-model-invocation'] !== 'boolean') {
169
+ errors.push('disable-model-invocation must be a boolean');
170
+ }
171
+ }
172
+ catch (e) {
173
+ errors.push(`Invalid YAML: ${e}`);
174
+ }
175
+ // Check markdown content exists
176
+ const markdownContent = content.slice(endIndex + 3).trim();
177
+ if (!markdownContent) {
178
+ errors.push('Agent must have markdown content after frontmatter');
179
+ }
180
+ return { valid: errors.length === 0, errors };
181
+ }
182
+ /**
183
+ * Get agent template
184
+ */
185
+ getAgentTemplate(templateId) {
186
+ const templates = {
187
+ default: `---
188
+ name: my-agent
189
+ description: A custom agent for specific tasks
190
+ # Optional fields:
191
+ # allowed-tools: Read, Grep, Glob, Edit # Tools agent can use
192
+ # model: claude-sonnet-4-20250514 # Model to use
193
+ # context: fork # Run as subagent
194
+ # user-invocable: true # Allow manual invocation
195
+ ---
196
+
197
+ # My Agent
198
+
199
+ Instructions for this agent when invoked.
200
+
201
+ ## Purpose
202
+
203
+ Describe what this agent does and when it should be used.
204
+
205
+ ## Guidelines
206
+
207
+ - Follow these specific guidelines
208
+ - Use appropriate tools for the task
209
+ - Report back with clear summaries
210
+ `,
211
+ 'code-reviewer': `---
212
+ name: code-reviewer
213
+ description: Reviews code for bugs, security issues, and best practices
214
+ allowed-tools: Read, Grep, Glob
215
+ context: fork
216
+ ---
217
+
218
+ # Code Reviewer Agent
219
+
220
+ You are an expert code reviewer. Analyze code for:
221
+
222
+ ## Review Criteria
223
+
224
+ 1. **Bugs & Errors**: Look for logic errors, edge cases, null checks
225
+ 2. **Security**: Check for vulnerabilities, injection risks, auth issues
226
+ 3. **Performance**: Identify inefficient code, memory leaks, N+1 queries
227
+ 4. **Best Practices**: Verify coding standards, naming conventions
228
+ 5. **Maintainability**: Assess readability, modularity, documentation
229
+
230
+ ## Output Format
231
+
232
+ Provide a structured review with:
233
+ - 🔴 Critical issues (must fix)
234
+ - 🟡 Warnings (should fix)
235
+ - 🟢 Suggestions (nice to have)
236
+ `,
237
+ 'test-writer': `---
238
+ name: test-writer
239
+ description: Generates comprehensive unit and integration tests
240
+ allowed-tools: Read, Grep, Glob, Write, Edit
241
+ context: fork
242
+ ---
243
+
244
+ # Test Writer Agent
245
+
246
+ You are an expert test engineer. Generate comprehensive tests for code.
247
+
248
+ ## Testing Strategy
249
+
250
+ 1. **Unit Tests**: Test individual functions/methods in isolation
251
+ 2. **Edge Cases**: Cover boundary conditions and error paths
252
+ 3. **Integration Tests**: Test component interactions
253
+ 4. **Mocking**: Use appropriate mocks for external dependencies
254
+
255
+ ## Guidelines
256
+
257
+ - Follow the existing test patterns in the codebase
258
+ - Aim for high coverage of critical paths
259
+ - Write clear test descriptions
260
+ - Include setup and teardown as needed
261
+ `,
262
+ 'docs-generator': `---
263
+ name: docs-generator
264
+ description: Creates documentation, comments, and README files
265
+ allowed-tools: Read, Grep, Glob, Write, Edit
266
+ context: fork
267
+ ---
268
+
269
+ # Documentation Generator Agent
270
+
271
+ You are a technical writer. Generate clear, comprehensive documentation.
272
+
273
+ ## Documentation Types
274
+
275
+ 1. **Code Comments**: Add JSDoc/docstrings to functions
276
+ 2. **README Files**: Create project/feature READMEs
277
+ 3. **API Documentation**: Document endpoints and parameters
278
+ 4. **Architecture Docs**: Explain system design decisions
279
+
280
+ ## Style Guidelines
281
+
282
+ - Write for developers of varying experience levels
283
+ - Include code examples where helpful
284
+ - Keep explanations concise but complete
285
+ - Use consistent formatting
286
+ `,
287
+ 'security-auditor': `---
288
+ name: security-auditor
289
+ description: Scans code for security vulnerabilities
290
+ allowed-tools: Read, Grep, Glob
291
+ context: fork
292
+ ---
293
+
294
+ # Security Auditor Agent
295
+
296
+ You are a security expert. Audit code for vulnerabilities.
297
+
298
+ ## Security Checks
299
+
300
+ 1. **Injection**: SQL, XSS, command injection
301
+ 2. **Authentication**: Weak auth, session issues
302
+ 3. **Authorization**: Access control, privilege escalation
303
+ 4. **Data Exposure**: Sensitive data leaks, logging issues
304
+ 5. **Dependencies**: Known vulnerable packages
305
+ 6. **Configuration**: Hardcoded secrets, insecure defaults
306
+
307
+ ## Severity Levels
308
+
309
+ - 🔴 CRITICAL: Immediate exploitation risk
310
+ - 🟠 HIGH: Significant security risk
311
+ - 🟡 MEDIUM: Moderate risk, should address
312
+ - 🔵 LOW: Minor issues, best practice
313
+ `,
314
+ 'refactorer': `---
315
+ name: refactorer
316
+ description: Suggests and applies code refactoring improvements
317
+ allowed-tools: Read, Grep, Glob, Edit
318
+ context: fork
319
+ ---
320
+
321
+ # Refactoring Agent
322
+
323
+ You are a refactoring expert. Improve code quality without changing behavior.
324
+
325
+ ## Refactoring Focus
326
+
327
+ 1. **DRY**: Eliminate code duplication
328
+ 2. **SOLID**: Apply SOLID principles
329
+ 3. **Naming**: Improve variable/function names
330
+ 4. **Structure**: Simplify complex functions
331
+ 5. **Patterns**: Apply appropriate design patterns
332
+
333
+ ## Guidelines
334
+
335
+ - Make incremental, testable changes
336
+ - Preserve existing behavior
337
+ - Document the reasoning for changes
338
+ - Consider backwards compatibility
339
+ `,
340
+ };
341
+ return templates[templateId || 'default'] || templates.default;
342
+ }
343
+ /**
344
+ * Get all available template IDs with descriptions
345
+ */
346
+ getAgentTemplates() {
347
+ return [
348
+ { id: 'default', name: 'Basic Agent', description: 'A minimal agent template to start from' },
349
+ { id: 'code-reviewer', name: 'Code Reviewer', description: 'Reviews code for bugs, security, and best practices' },
350
+ { id: 'test-writer', name: 'Test Writer', description: 'Generates unit and integration tests' },
351
+ { id: 'docs-generator', name: 'Docs Generator', description: 'Creates documentation and comments' },
352
+ { id: 'security-auditor', name: 'Security Auditor', description: 'Scans code for security vulnerabilities' },
353
+ { id: 'refactorer', name: 'Refactorer', description: 'Suggests and applies code refactoring' },
354
+ ];
355
+ }
356
+ /**
357
+ * Parse an AGENT.md file into an Agent object
358
+ */
359
+ async parseAgent(filePath, scope) {
360
+ try {
361
+ const fs = await import('node:fs/promises');
362
+ const content = await fs.readFile(filePath, 'utf-8');
363
+ const validation = this.validateAgent(content);
364
+ // Extract frontmatter
365
+ const endIndex = content.indexOf('---', 3);
366
+ const frontmatterStr = content.slice(3, endIndex).trim();
367
+ let frontmatter = {};
368
+ try {
369
+ frontmatter = parseYaml(frontmatterStr) || {};
370
+ }
371
+ catch {
372
+ // Keep empty frontmatter
373
+ }
374
+ // Get name from frontmatter or directory name
375
+ const dirName = path.basename(path.dirname(filePath));
376
+ const name = frontmatter.name || dirName;
377
+ // Get description from frontmatter or first paragraph
378
+ let description = frontmatter.description || '';
379
+ if (!description) {
380
+ const markdownContent = content.slice(endIndex + 3).trim();
381
+ const lines = markdownContent.split('\n');
382
+ for (const line of lines) {
383
+ if (line.trim() && !line.startsWith('#')) {
384
+ description = line.trim().slice(0, 200);
385
+ break;
386
+ }
387
+ }
388
+ }
389
+ return {
390
+ name,
391
+ path: dirName,
392
+ scope,
393
+ frontmatter,
394
+ content,
395
+ description,
396
+ isValid: validation.valid,
397
+ errors: validation.errors,
398
+ };
399
+ }
400
+ catch {
401
+ return null;
402
+ }
403
+ }
404
+ }
405
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/services/agents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Analytics service - Real token usage and cost tracking from JSONL session data
3
+ */
4
+ import { ClaudeDir } from './claude-dir.js';
5
+ export declare const MODEL_PRICING: Record<string, {
6
+ input: number;
7
+ output: number;
8
+ cacheWrite: number;
9
+ cacheRead: number;
10
+ }>;
11
+ export interface TokenUsage {
12
+ inputTokens: number;
13
+ outputTokens: number;
14
+ cacheCreationTokens: number;
15
+ cacheReadTokens: number;
16
+ totalTokens: number;
17
+ }
18
+ export interface CostBreakdown {
19
+ inputCost: number;
20
+ outputCost: number;
21
+ cacheWriteCost: number;
22
+ cacheReadCost: number;
23
+ totalCost: number;
24
+ }
25
+ export interface ModelUsage {
26
+ model: string;
27
+ tokens: TokenUsage;
28
+ cost: CostBreakdown;
29
+ messageCount: number;
30
+ }
31
+ export interface ToolUsageStats {
32
+ toolName: string;
33
+ count: number;
34
+ successCount: number;
35
+ failureCount: number;
36
+ avgDuration?: number;
37
+ }
38
+ export interface DetailedToolCall {
39
+ toolName: string;
40
+ timestamp: string;
41
+ sessionId: string;
42
+ projectPath: string;
43
+ input: Record<string, unknown>;
44
+ filePath?: string;
45
+ command?: string;
46
+ pattern?: string;
47
+ }
48
+ export interface FileAccessStats {
49
+ filePath: string;
50
+ readCount: number;
51
+ editCount: number;
52
+ writeCount: number;
53
+ lastAccessed: string;
54
+ sessions: string[];
55
+ }
56
+ export interface CommandStats {
57
+ command: string;
58
+ count: number;
59
+ lastUsed: string;
60
+ }
61
+ export interface ToolAnalytics {
62
+ toolUsage: ToolUsageStats[];
63
+ fileAccess: FileAccessStats[];
64
+ commandPatterns: CommandStats[];
65
+ toolUsageByDay: {
66
+ date: string;
67
+ tools: Record<string, number>;
68
+ }[];
69
+ toolUsageByProject: {
70
+ projectName: string;
71
+ tools: Record<string, number>;
72
+ }[];
73
+ mostUsedFiles: FileAccessStats[];
74
+ mostUsedCommands: CommandStats[];
75
+ toolDistribution: {
76
+ toolName: string;
77
+ percentage: number;
78
+ count: number;
79
+ }[];
80
+ }
81
+ export interface SessionAnalytics {
82
+ sessionId: string;
83
+ projectPath: string;
84
+ projectName: string;
85
+ startedAt: string;
86
+ endedAt: string;
87
+ durationMinutes: number;
88
+ tokens: TokenUsage;
89
+ cost: CostBreakdown;
90
+ modelUsage: ModelUsage[];
91
+ toolUsage: ToolUsageStats[];
92
+ messageCount: number;
93
+ userMessageCount: number;
94
+ assistantMessageCount: number;
95
+ turnCount: number;
96
+ }
97
+ export interface ProjectAnalytics {
98
+ projectPath: string;
99
+ projectName: string;
100
+ sessionCount: number;
101
+ totalTokens: TokenUsage;
102
+ totalCost: CostBreakdown;
103
+ modelUsage: ModelUsage[];
104
+ toolUsage: ToolUsageStats[];
105
+ avgSessionDuration: number;
106
+ totalDurationMinutes: number;
107
+ firstSession: string;
108
+ lastSession: string;
109
+ }
110
+ export interface GlobalAnalytics {
111
+ totalTokens: TokenUsage;
112
+ totalCost: CostBreakdown;
113
+ modelUsage: ModelUsage[];
114
+ toolUsage: ToolUsageStats[];
115
+ projectCount: number;
116
+ sessionCount: number;
117
+ totalDurationMinutes: number;
118
+ avgCostPerSession: number;
119
+ avgCostPerDay: number;
120
+ dailyCosts: {
121
+ date: string;
122
+ cost: number;
123
+ tokens: number;
124
+ }[];
125
+ }
126
+ export interface DailyAnalytics {
127
+ date: string;
128
+ tokens: TokenUsage;
129
+ cost: CostBreakdown;
130
+ sessionCount: number;
131
+ modelUsage: ModelUsage[];
132
+ toolUsage: ToolUsageStats[];
133
+ }
134
+ export declare class AnalyticsService {
135
+ private claudeDir;
136
+ constructor(claudeDir: ClaudeDir);
137
+ private getPricing;
138
+ private calculateCost;
139
+ getSessionAnalytics(filePath: string, projectDir: string): Promise<SessionAnalytics | null>;
140
+ getProjectAnalytics(projectDir: string): Promise<ProjectAnalytics | null>;
141
+ getGlobalAnalytics(days?: number): Promise<GlobalAnalytics>;
142
+ getDailyAnalytics(days?: number): Promise<DailyAnalytics[]>;
143
+ getToolAnalytics(days?: number): Promise<ToolAnalytics>;
144
+ }
145
+ //# sourceMappingURL=analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/services/analytics.ts"],"names":[],"mappings":"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"}