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,421 @@
1
+ /**
2
+ * Teams service - Manages multi-agent team configurations
3
+ * Teams are stored in ~/.claude/teams/{name}/config.json
4
+ */
5
+ import path from 'node:path';
6
+ export class TeamsService {
7
+ claudeDir;
8
+ constructor(claudeDir) {
9
+ this.claudeDir = claudeDir;
10
+ }
11
+ /**
12
+ * Get the teams directory path
13
+ */
14
+ get teamsDir() {
15
+ return path.join(this.claudeDir.root, 'teams');
16
+ }
17
+ /**
18
+ * List all teams
19
+ */
20
+ async listTeams() {
21
+ const teams = [];
22
+ try {
23
+ const fs = await import('node:fs/promises');
24
+ const teamsDir = this.teamsDir;
25
+ // Check if teams directory exists
26
+ try {
27
+ await fs.access(teamsDir);
28
+ }
29
+ catch {
30
+ return teams;
31
+ }
32
+ const entries = await fs.readdir(teamsDir, { withFileTypes: true });
33
+ for (const entry of entries) {
34
+ if (entry.isDirectory()) {
35
+ const configPath = path.join(teamsDir, entry.name, 'config.json');
36
+ try {
37
+ await fs.access(configPath);
38
+ const content = await fs.readFile(configPath, 'utf-8');
39
+ const config = JSON.parse(content);
40
+ // Get file stats for dates
41
+ const stats = await fs.stat(configPath);
42
+ teams.push({
43
+ id: entry.name,
44
+ name: config.name || entry.name,
45
+ description: config.description || '',
46
+ leader: config.leader || { name: 'leader', role: 'Team leader' },
47
+ teammates: config.teammates || [],
48
+ planFile: config.planFile,
49
+ createdAt: config.createdAt || stats.birthtime.toISOString(),
50
+ modifiedAt: stats.mtime.toISOString(),
51
+ });
52
+ }
53
+ catch {
54
+ // config.json doesn't exist or invalid, skip
55
+ }
56
+ }
57
+ }
58
+ }
59
+ catch {
60
+ // Teams directory doesn't exist yet
61
+ }
62
+ // Sort by name
63
+ teams.sort((a, b) => a.name.localeCompare(b.name));
64
+ return teams;
65
+ }
66
+ /**
67
+ * Get a specific team by name/id
68
+ */
69
+ async getTeam(teamId) {
70
+ const configPath = path.join(this.teamsDir, teamId, 'config.json');
71
+ try {
72
+ const fs = await import('node:fs/promises');
73
+ const content = await fs.readFile(configPath, 'utf-8');
74
+ const config = JSON.parse(content);
75
+ const stats = await fs.stat(configPath);
76
+ return {
77
+ id: teamId,
78
+ name: config.name || teamId,
79
+ description: config.description || '',
80
+ leader: config.leader || { name: 'leader', role: 'Team leader' },
81
+ teammates: config.teammates || [],
82
+ planFile: config.planFile,
83
+ createdAt: config.createdAt || stats.birthtime.toISOString(),
84
+ modifiedAt: stats.mtime.toISOString(),
85
+ };
86
+ }
87
+ catch {
88
+ return null;
89
+ }
90
+ }
91
+ /**
92
+ * Create a new team
93
+ */
94
+ async createTeam(name, config) {
95
+ const validation = this.validateTeamName(name);
96
+ if (!validation.valid) {
97
+ return { success: false, error: validation.error };
98
+ }
99
+ const teamDir = path.join(this.teamsDir, name);
100
+ const configPath = path.join(teamDir, 'config.json');
101
+ const inboxesDir = path.join(teamDir, 'inboxes');
102
+ try {
103
+ const fs = await import('node:fs/promises');
104
+ // Check if team already exists
105
+ try {
106
+ await fs.access(configPath);
107
+ return { success: false, error: 'Team already exists' };
108
+ }
109
+ catch {
110
+ // Team doesn't exist, continue
111
+ }
112
+ // Create directories
113
+ await fs.mkdir(this.teamsDir, { recursive: true });
114
+ await fs.mkdir(teamDir, { recursive: true });
115
+ await fs.mkdir(inboxesDir, { recursive: true });
116
+ // Create config
117
+ const teamConfig = {
118
+ name,
119
+ description: config.description || '',
120
+ leader: config.leader || { name: 'leader', role: 'Team leader and coordinator' },
121
+ teammates: config.teammates || [],
122
+ planFile: config.planFile || 'MULTI_AGENT_PLAN.md',
123
+ createdAt: new Date().toISOString(),
124
+ };
125
+ await fs.writeFile(configPath, JSON.stringify(teamConfig, null, 2), 'utf-8');
126
+ // Create inbox files for leader and teammates
127
+ const allMembers = [teamConfig.leader, ...teamConfig.teammates];
128
+ for (const member of allMembers) {
129
+ const inboxPath = path.join(inboxesDir, `${member.name}.json`);
130
+ await fs.writeFile(inboxPath, JSON.stringify({ messages: [] }, null, 2), 'utf-8');
131
+ }
132
+ return { success: true };
133
+ }
134
+ catch (e) {
135
+ return { success: false, error: String(e) };
136
+ }
137
+ }
138
+ /**
139
+ * Update an existing team
140
+ */
141
+ async updateTeam(teamId, updates) {
142
+ const existing = await this.getTeam(teamId);
143
+ if (!existing) {
144
+ return { success: false, error: 'Team not found' };
145
+ }
146
+ const configPath = path.join(this.teamsDir, teamId, 'config.json');
147
+ try {
148
+ const fs = await import('node:fs/promises');
149
+ const updated = {
150
+ name: existing.name,
151
+ description: updates.description ?? existing.description,
152
+ leader: updates.leader ?? existing.leader,
153
+ teammates: updates.teammates ?? existing.teammates,
154
+ planFile: updates.planFile ?? existing.planFile,
155
+ createdAt: existing.createdAt,
156
+ };
157
+ await fs.writeFile(configPath, JSON.stringify(updated, null, 2), 'utf-8');
158
+ return { success: true };
159
+ }
160
+ catch (e) {
161
+ return { success: false, error: String(e) };
162
+ }
163
+ }
164
+ /**
165
+ * Delete a team
166
+ */
167
+ async deleteTeam(teamId) {
168
+ const teamDir = path.join(this.teamsDir, teamId);
169
+ try {
170
+ const fs = await import('node:fs/promises');
171
+ await fs.access(teamDir);
172
+ await fs.rm(teamDir, { recursive: true });
173
+ return { success: true };
174
+ }
175
+ catch {
176
+ return { success: false, error: 'Team not found' };
177
+ }
178
+ }
179
+ /**
180
+ * Export team as a shareable blueprint
181
+ */
182
+ async exportTeam(teamId) {
183
+ const team = await this.getTeam(teamId);
184
+ if (!team) {
185
+ return { success: false, error: 'Team not found' };
186
+ }
187
+ const blueprint = {
188
+ type: 'team',
189
+ name: team.name,
190
+ description: team.description,
191
+ leader: team.leader,
192
+ teammates: team.teammates,
193
+ planFile: team.planFile,
194
+ exportedAt: new Date().toISOString(),
195
+ };
196
+ return { success: true, blueprint: JSON.stringify(blueprint, null, 2) };
197
+ }
198
+ /**
199
+ * Validate team name
200
+ */
201
+ validateTeamName(name) {
202
+ if (!name) {
203
+ return { valid: false, error: 'Team name is required' };
204
+ }
205
+ if (!/^[a-z0-9-]+$/.test(name)) {
206
+ return { valid: false, error: 'Team name must contain only lowercase letters, numbers, and hyphens' };
207
+ }
208
+ if (name.length > 64) {
209
+ return { valid: false, error: 'Team name must be 64 characters or less' };
210
+ }
211
+ return { valid: true };
212
+ }
213
+ /**
214
+ * Get team templates with pre-configured structures
215
+ */
216
+ getTeamTemplates() {
217
+ return [
218
+ {
219
+ id: 'full-stack-team',
220
+ name: 'Full-Stack Development Team',
221
+ description: 'A balanced team for full-stack development with frontend, backend, and review roles',
222
+ config: {
223
+ name: 'dev-team',
224
+ description: 'Full-stack development team',
225
+ leader: { name: 'orchestrator', role: 'Coordinates tasks and reviews output', color: '#3B82F6' },
226
+ teammates: [
227
+ { name: 'frontend-dev', role: 'React/TypeScript UI development', color: '#10B981', agentRef: 'refactorer' },
228
+ { name: 'backend-dev', role: 'API and database work', color: '#F59E0B', agentRef: 'architect' },
229
+ { name: 'reviewer', role: 'Code review and testing', color: '#8B5CF6', agentRef: 'code-reviewer' },
230
+ ],
231
+ planFile: 'MULTI_AGENT_PLAN.md',
232
+ },
233
+ },
234
+ {
235
+ id: 'review-team',
236
+ name: 'Code Review Team',
237
+ description: 'Multiple reviewers for thorough code review',
238
+ config: {
239
+ name: 'review-team',
240
+ description: 'Multi-perspective code review team',
241
+ leader: { name: 'lead-reviewer', role: 'Coordinates review and consolidates feedback', color: '#3B82F6' },
242
+ teammates: [
243
+ { name: 'security-reviewer', role: 'Security vulnerability analysis', color: '#EF4444', agentRef: 'security-auditor' },
244
+ { name: 'performance-reviewer', role: 'Performance and optimization review', color: '#F59E0B' },
245
+ { name: 'style-reviewer', role: 'Code style and maintainability', color: '#10B981' },
246
+ ],
247
+ planFile: 'REVIEW_PLAN.md',
248
+ },
249
+ },
250
+ {
251
+ id: 'testing-team',
252
+ name: 'Testing Team',
253
+ description: 'Comprehensive testing with unit, integration, and E2E coverage',
254
+ config: {
255
+ name: 'testing-team',
256
+ description: 'Comprehensive testing team',
257
+ leader: { name: 'test-lead', role: 'Test strategy and coordination', color: '#3B82F6' },
258
+ teammates: [
259
+ { name: 'unit-tester', role: 'Unit test generation', color: '#10B981', agentRef: 'test-writer' },
260
+ { name: 'integration-tester', role: 'Integration test creation', color: '#F59E0B', agentRef: 'test-writer' },
261
+ { name: 'e2e-tester', role: 'End-to-end test scenarios', color: '#8B5CF6', agentRef: 'test-writer' },
262
+ ],
263
+ planFile: 'TEST_PLAN.md',
264
+ },
265
+ },
266
+ ];
267
+ }
268
+ /**
269
+ * List available agents that can be linked to team members
270
+ */
271
+ async listAvailableAgents() {
272
+ const agents = [];
273
+ const agentsDir = path.join(this.claudeDir.root, 'agents');
274
+ try {
275
+ const fs = await import('node:fs/promises');
276
+ try {
277
+ await fs.access(agentsDir);
278
+ }
279
+ catch {
280
+ return agents;
281
+ }
282
+ const entries = await fs.readdir(agentsDir, { withFileTypes: true });
283
+ for (const entry of entries) {
284
+ if (entry.isDirectory()) {
285
+ const agentPath = path.join(agentsDir, entry.name, 'AGENT.md');
286
+ try {
287
+ await fs.access(agentPath);
288
+ const content = await fs.readFile(agentPath, 'utf-8');
289
+ // Extract description from frontmatter or first paragraph
290
+ let description = '';
291
+ const descMatch = content.match(/description:\s*(.+)/);
292
+ if (descMatch) {
293
+ description = descMatch[1].trim();
294
+ }
295
+ agents.push({
296
+ name: entry.name,
297
+ path: entry.name,
298
+ description,
299
+ });
300
+ }
301
+ catch {
302
+ // AGENT.md doesn't exist, skip
303
+ }
304
+ }
305
+ }
306
+ }
307
+ catch {
308
+ // Agents directory doesn't exist
309
+ }
310
+ return agents;
311
+ }
312
+ /**
313
+ * Validate that referenced agents exist
314
+ */
315
+ async validateAgentRefs(teammates) {
316
+ const availableAgents = await this.listAvailableAgents();
317
+ const availableNames = new Set(availableAgents.map(a => a.name));
318
+ const missing = [];
319
+ for (const member of teammates) {
320
+ if (member.agentRef && !availableNames.has(member.agentRef)) {
321
+ missing.push(member.agentRef);
322
+ }
323
+ }
324
+ return { valid: missing.length === 0, missing };
325
+ }
326
+ /**
327
+ * Generate CLAUDE.md snippet for team invocation
328
+ * This creates instructions that can be added to a project's CLAUDE.md
329
+ */
330
+ generateClaudeMdSnippet(team) {
331
+ const memberList = [team.leader, ...team.teammates]
332
+ .map(m => `- **${m.name}**: ${m.role}${m.agentRef ? ` (uses @${m.agentRef})` : ''}`)
333
+ .join('\n');
334
+ return `## Team: ${team.name}
335
+
336
+ ${team.description}
337
+
338
+ ### Team Members
339
+ ${memberList}
340
+
341
+ ### How to Invoke
342
+ To spawn this team, use:
343
+ \`\`\`
344
+ /spawn-team ${team.id}
345
+ \`\`\`
346
+
347
+ Or invoke individual agents:
348
+ ${team.teammates.filter(t => t.agentRef).map(t => `- \`@${t.agentRef}\` for ${t.role}`).join('\n')}
349
+
350
+ ### Plan File
351
+ Team coordination uses: \`${team.planFile || 'MULTI_AGENT_PLAN.md'}\`
352
+ `;
353
+ }
354
+ /**
355
+ * Generate setup script that creates all necessary agent files for a team
356
+ */
357
+ async generateSetupScript(teamId) {
358
+ const team = await this.getTeam(teamId);
359
+ if (!team) {
360
+ return { success: false, error: 'Team not found' };
361
+ }
362
+ const claudeDir = this.claudeDir.root;
363
+ const lines = [
364
+ '#!/bin/bash',
365
+ '# Auto-generated setup script for team: ' + team.name,
366
+ '# Run this in your project directory to configure the team',
367
+ '',
368
+ '# Ensure directories exist',
369
+ `mkdir -p "${claudeDir}/teams/${team.id}/inboxes"`,
370
+ '',
371
+ ];
372
+ // Add agent creation commands for members with agentRef
373
+ const membersWithAgents = [...team.teammates.filter(t => t.agentRef)];
374
+ if (membersWithAgents.length > 0) {
375
+ lines.push('# Create agent directories if they don\'t exist');
376
+ for (const member of membersWithAgents) {
377
+ if (member.agentRef) {
378
+ lines.push(`mkdir -p "${claudeDir}/agents/${member.agentRef}"`);
379
+ }
380
+ }
381
+ lines.push('');
382
+ }
383
+ lines.push('echo "✅ Team setup complete!"');
384
+ lines.push(`echo "To invoke: /spawn-team ${team.id}"`);
385
+ return { success: true, script: lines.join('\n') };
386
+ }
387
+ /**
388
+ * Get invocation instructions for a team
389
+ */
390
+ async getInvocationInstructions(teamId) {
391
+ const team = await this.getTeam(teamId);
392
+ if (!team) {
393
+ return null;
394
+ }
395
+ const agentCommands = team.teammates
396
+ .filter(t => t.agentRef)
397
+ .map(t => ({
398
+ agent: t.name,
399
+ command: `@${t.agentRef}`,
400
+ }));
401
+ const projectSetup = `# Add to your project's CLAUDE.md:
402
+
403
+ ${this.generateClaudeMdSnippet(team)}
404
+
405
+ # Or add team reference to .claude/settings.local.json:
406
+ {
407
+ "teams": {
408
+ "${team.id}": {
409
+ "enabled": true
410
+ }
411
+ }
412
+ }`;
413
+ return {
414
+ slashCommand: `/spawn-team ${team.id}`,
415
+ claudeMdSnippet: this.generateClaudeMdSnippet(team),
416
+ agentCommands,
417
+ projectSetup,
418
+ };
419
+ }
420
+ }
421
+ //# sourceMappingURL=teams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teams.js","sourceRoot":"","sources":["../../src/services/teams.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Tech Stack Service - Aggregates technology usage across all Claude Code sessions
3
+ *
4
+ * This service scans session files to detect:
5
+ * - Programming languages used (via file extensions)
6
+ * - Frameworks and libraries (via file patterns and imports)
7
+ * - Cloud providers and DevOps tools
8
+ * - Databases and infrastructure
9
+ *
10
+ * It tracks Claude's contributions by analyzing Edit/Write tool calls.
11
+ * Also provides AI-powered insights via Claude CLI.
12
+ */
13
+ import type { ClaudeDir } from './claude-dir.js';
14
+ import type { TechStackSummary, ProjectTechStack, TechStackDeepInsights, TechStackAIInsight } from '../types.js';
15
+ export declare class TechStackService {
16
+ private claudeDir;
17
+ private cacheFile;
18
+ private cache;
19
+ constructor(claudeDir: ClaudeDir);
20
+ /**
21
+ * Get the global tech stack summary (uses cache if available)
22
+ */
23
+ getSummary(forceRefresh?: boolean): Promise<TechStackSummary>;
24
+ /**
25
+ * Force refresh the tech stack data by scanning all sessions
26
+ */
27
+ refresh(): Promise<TechStackSummary>;
28
+ /**
29
+ * Get tech stack breakdown for a specific project
30
+ */
31
+ getProjectBreakdown(projectPath: string): Promise<ProjectTechStack | null>;
32
+ /**
33
+ * Get deep insights including patterns, correlations, evolution, and similarity
34
+ */
35
+ getDeepInsights(forceRefresh?: boolean): Promise<TechStackDeepInsights>;
36
+ /**
37
+ * Generate AI-powered tech stack insight using Claude CLI
38
+ */
39
+ generateAIInsight(force?: boolean): Promise<TechStackAIInsight>;
40
+ /**
41
+ * Get cached AI insight without regenerating
42
+ */
43
+ getAIInsight(): Promise<TechStackAIInsight | null>;
44
+ /**
45
+ * Check if Claude Code CLI is available
46
+ */
47
+ private isClaudeCodeAvailable;
48
+ /**
49
+ * Build context string for Claude AI analysis
50
+ */
51
+ private buildAIContext;
52
+ /**
53
+ * Call Claude Code CLI with context
54
+ */
55
+ private callClaudeCode;
56
+ /**
57
+ * Parse Claude's JSON response into TechStackAIInsight fields
58
+ */
59
+ private parseAIResponse;
60
+ /**
61
+ * Generate fallback insight when AI fails
62
+ */
63
+ private generateFallbackAIInsight;
64
+ /**
65
+ * Build a map of project -> technologies for cross-project analysis
66
+ */
67
+ private buildProjectTechMap;
68
+ /**
69
+ * Detect common stack patterns across projects
70
+ */
71
+ private detectStackPatterns;
72
+ /**
73
+ * Calculate technology co-occurrence correlations
74
+ */
75
+ private calculateCorrelations;
76
+ /**
77
+ * Analyze technology evolution trends
78
+ */
79
+ private analyzeEvolution;
80
+ /**
81
+ * Compute project similarity based on shared technologies
82
+ */
83
+ private computeProjectSimilarity;
84
+ /**
85
+ * Generate human-readable highlights from insights
86
+ */
87
+ private generateHighlights;
88
+ private parseSessionFile;
89
+ private processMessage;
90
+ private detectTechnology;
91
+ private calculateProficiency;
92
+ private generateRecommendations;
93
+ private findMostActiveProject;
94
+ private findGrowthAreas;
95
+ private loadCache;
96
+ private saveCache;
97
+ }
98
+ //# sourceMappingURL=tech-stack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tech-stack.d.ts","sourceRoot":"","sources":["../../src/services/tech-stack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAEV,gBAAgB,EAChB,gBAAgB,EAMhB,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAmKrB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAiC;gBAElC,SAAS,EAAE,SAAS;IAKhC;;OAEG;IACG,UAAU,CAAC,YAAY,UAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAkBjE;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAgF1C;;OAEG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAsFhF;;OAEG;IACG,eAAe,CAAC,YAAY,UAAQ,GAAG,OAAO,CAAC,qBAAqB,CAAC;IA0B3E;;OAEG;IACG,iBAAiB,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmFnE;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAUxD;;OAEG;YACW,qBAAqB;IAQnC;;OAEG;IACH,OAAO,CAAC,cAAc;IAoDtB;;OAEG;YACW,cAAc;IA+H5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAgCvB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAqBjC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAe3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkG3B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAoD7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsDxB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAqChC;;OAEG;IACH,OAAO,CAAC,kBAAkB;YAuCZ,gBAAgB;IAuB9B,OAAO,CAAC,cAAc;IAmEtB,OAAO,CAAC,gBAAgB;IAyBxB,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,uBAAuB;IAyB/B,OAAO,CAAC,qBAAqB;IAqB7B,OAAO,CAAC,eAAe;YAOT,SAAS;YAmBT,SAAS;CAQxB"}