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.
- package/LICENSE +21 -0
- package/README.md +275 -0
- package/dist/__tests__/package.test.d.ts +2 -0
- package/dist/__tests__/package.test.d.ts.map +1 -0
- package/dist/__tests__/package.test.js +53 -0
- package/dist/__tests__/package.test.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +200 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/server/index.d.ts +11 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +1207 -0
- package/dist/server/index.js.map +1 -0
- package/dist/services/advisor.d.ts +117 -0
- package/dist/services/advisor.d.ts.map +1 -0
- package/dist/services/advisor.js +2636 -0
- package/dist/services/advisor.js.map +1 -0
- package/dist/services/agent-generator.d.ts +71 -0
- package/dist/services/agent-generator.d.ts.map +1 -0
- package/dist/services/agent-generator.js +295 -0
- package/dist/services/agent-generator.js.map +1 -0
- package/dist/services/agents.d.ts +67 -0
- package/dist/services/agents.d.ts.map +1 -0
- package/dist/services/agents.js +405 -0
- package/dist/services/agents.js.map +1 -0
- package/dist/services/analytics.d.ts +145 -0
- package/dist/services/analytics.d.ts.map +1 -0
- package/dist/services/analytics.js +609 -0
- package/dist/services/analytics.js.map +1 -0
- package/dist/services/blueprints.d.ts +31 -0
- package/dist/services/blueprints.d.ts.map +1 -0
- package/dist/services/blueprints.js +317 -0
- package/dist/services/blueprints.js.map +1 -0
- package/dist/services/claude-dir.d.ts +50 -0
- package/dist/services/claude-dir.d.ts.map +1 -0
- package/dist/services/claude-dir.js +193 -0
- package/dist/services/claude-dir.js.map +1 -0
- package/dist/services/hooks.d.ts +38 -0
- package/dist/services/hooks.d.ts.map +1 -0
- package/dist/services/hooks.js +165 -0
- package/dist/services/hooks.js.map +1 -0
- package/dist/services/insights.d.ts +52 -0
- package/dist/services/insights.d.ts.map +1 -0
- package/dist/services/insights.js +1035 -0
- package/dist/services/insights.js.map +1 -0
- package/dist/services/memory.d.ts +14 -0
- package/dist/services/memory.d.ts.map +1 -0
- package/dist/services/memory.js +25 -0
- package/dist/services/memory.js.map +1 -0
- package/dist/services/plans.d.ts +20 -0
- package/dist/services/plans.d.ts.map +1 -0
- package/dist/services/plans.js +149 -0
- package/dist/services/plans.js.map +1 -0
- package/dist/services/project-intelligence.d.ts +75 -0
- package/dist/services/project-intelligence.d.ts.map +1 -0
- package/dist/services/project-intelligence.js +731 -0
- package/dist/services/project-intelligence.js.map +1 -0
- package/dist/services/search.d.ts +32 -0
- package/dist/services/search.d.ts.map +1 -0
- package/dist/services/search.js +203 -0
- package/dist/services/search.js.map +1 -0
- package/dist/services/sessions.d.ts +25 -0
- package/dist/services/sessions.d.ts.map +1 -0
- package/dist/services/sessions.js +248 -0
- package/dist/services/sessions.js.map +1 -0
- package/dist/services/skills.d.ts +30 -0
- package/dist/services/skills.d.ts.map +1 -0
- package/dist/services/skills.js +197 -0
- package/dist/services/skills.js.map +1 -0
- package/dist/services/stats.d.ts +23 -0
- package/dist/services/stats.d.ts.map +1 -0
- package/dist/services/stats.js +88 -0
- package/dist/services/stats.js.map +1 -0
- package/dist/services/teams.d.ts +115 -0
- package/dist/services/teams.d.ts.map +1 -0
- package/dist/services/teams.js +421 -0
- package/dist/services/teams.js.map +1 -0
- package/dist/services/tech-stack.d.ts +98 -0
- package/dist/services/tech-stack.d.ts.map +1 -0
- package/dist/services/tech-stack.js +1088 -0
- package/dist/services/tech-stack.js.map +1 -0
- package/dist/services/terminal.d.ts +75 -0
- package/dist/services/terminal.d.ts.map +1 -0
- package/dist/services/terminal.js +224 -0
- package/dist/services/terminal.js.map +1 -0
- package/dist/types.d.ts +1095 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +18 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/assets/index-BiH4Nhdk.css +1 -0
- package/dist/ui/assets/index-Brv-K8bd.css +1 -0
- package/dist/ui/assets/index-BwMBEdQz.js +3108 -0
- package/dist/ui/assets/index-BwMBEdQz.js.map +1 -0
- package/dist/ui/assets/index-CEWz7ABD.js +3108 -0
- package/dist/ui/assets/index-CEWz7ABD.js.map +1 -0
- package/dist/ui/assets/index-CIZ3vvc-.css +1 -0
- package/dist/ui/assets/index-CsU3cI0n.js +3108 -0
- package/dist/ui/assets/index-CsU3cI0n.js.map +1 -0
- package/dist/ui/assets/index-D3AY6iCS.js +3133 -0
- package/dist/ui/assets/index-D3AY6iCS.js.map +1 -0
- package/dist/ui/assets/index-D8lNZ0Ye.css +1 -0
- package/dist/ui/assets/index-DmgeppSA.js +3108 -0
- package/dist/ui/assets/index-DmgeppSA.js.map +1 -0
- package/dist/ui/favicon.svg +43 -0
- package/dist/ui/index.html +23 -0
- package/dist/utils/jsonl.d.ts +16 -0
- package/dist/utils/jsonl.d.ts.map +1 -0
- package/dist/utils/jsonl.js +51 -0
- package/dist/utils/jsonl.js.map +1 -0
- 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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"}
|