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,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"}
|