@magic-ingredients/tiny-brain-local 0.8.0 → 0.10.2
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/dist/agents/formatters/claude-code-formatter.d.ts +37 -0
- package/dist/agents/formatters/claude-code-formatter.d.ts.map +1 -0
- package/dist/agents/formatters/claude-code-formatter.js +217 -0
- package/dist/agents/formatters/claude-code-formatter.js.map +1 -0
- package/dist/agents/formatters/formatter-factory.d.ts +25 -0
- package/dist/agents/formatters/formatter-factory.d.ts.map +1 -0
- package/dist/agents/formatters/formatter-factory.js +61 -0
- package/dist/agents/formatters/formatter-factory.js.map +1 -0
- package/dist/agents/types.d.ts +68 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +12 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/analyser/analyzers/script-analyzer.d.ts +10 -0
- package/dist/analyser/analyzers/script-analyzer.d.ts.map +1 -0
- package/dist/analyser/analyzers/script-analyzer.js +205 -0
- package/dist/analyser/analyzers/script-analyzer.js.map +1 -0
- package/dist/analyser/detectors/base-detector.d.ts +12 -0
- package/dist/analyser/detectors/base-detector.d.ts.map +1 -0
- package/dist/analyser/detectors/base-detector.js +50 -0
- package/dist/analyser/detectors/base-detector.js.map +1 -0
- package/dist/analyser/detectors/javascript-detector.d.ts +19 -0
- package/dist/analyser/detectors/javascript-detector.d.ts.map +1 -0
- package/dist/analyser/detectors/javascript-detector.js +347 -0
- package/dist/analyser/detectors/javascript-detector.js.map +1 -0
- package/dist/analyser/index.d.ts +5 -0
- package/dist/analyser/index.d.ts.map +1 -0
- package/dist/analyser/index.js +315 -0
- package/dist/analyser/index.js.map +1 -0
- package/dist/analyser/types.d.ts +2 -0
- package/dist/analyser/types.d.ts.map +1 -0
- package/dist/analyser/types.js +2 -0
- package/dist/analyser/types.js.map +1 -0
- package/dist/analyser/utils.d.ts +5 -0
- package/dist/analyser/utils.d.ts.map +1 -0
- package/dist/analyser/utils.js +24 -0
- package/dist/analyser/utils.js.map +1 -0
- package/dist/cli/cli-factory.d.ts.map +1 -1
- package/dist/cli/cli-factory.js +17 -0
- package/dist/cli/cli-factory.js.map +1 -1
- package/dist/cli/commands/analyse.command.d.ts +7 -0
- package/dist/cli/commands/analyse.command.d.ts.map +1 -0
- package/dist/cli/commands/analyse.command.js +130 -0
- package/dist/cli/commands/analyse.command.js.map +1 -0
- package/dist/cli/commands/status.command.d.ts.map +1 -1
- package/dist/cli/commands/status.command.js +3 -1
- package/dist/cli/commands/status.command.js.map +1 -1
- package/dist/core/mcp-server.d.ts +10 -8
- package/dist/core/mcp-server.d.ts.map +1 -1
- package/dist/core/mcp-server.js +93 -85
- package/dist/core/mcp-server.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +33 -8
- package/dist/index.js.map +1 -1
- package/dist/prompts/persona/persona.prompt.js +8 -8
- package/dist/prompts/persona/persona.prompt.js.map +1 -1
- package/dist/prompts/planning/planning.prompt.d.ts +0 -8
- package/dist/prompts/planning/planning.prompt.d.ts.map +1 -1
- package/dist/prompts/planning/planning.prompt.js +0 -175
- package/dist/prompts/planning/planning.prompt.js.map +1 -1
- package/dist/services/agent-installation-service.d.ts +101 -0
- package/dist/services/agent-installation-service.d.ts.map +1 -0
- package/dist/services/agent-installation-service.js +328 -0
- package/dist/services/agent-installation-service.js.map +1 -0
- package/dist/services/agent-manager.d.ts +45 -0
- package/dist/services/agent-manager.d.ts.map +1 -0
- package/dist/services/agent-manager.js +154 -0
- package/dist/services/agent-manager.js.map +1 -0
- package/dist/services/agent-service.d.ts +70 -0
- package/dist/services/agent-service.d.ts.map +1 -0
- package/dist/services/agent-service.js +273 -0
- package/dist/services/agent-service.js.map +1 -0
- package/dist/services/analyse-service.d.ts +97 -0
- package/dist/services/analyse-service.d.ts.map +1 -0
- package/dist/services/analyse-service.js +370 -0
- package/dist/services/analyse-service.js.map +1 -0
- package/dist/services/dashboard-launcher.service.d.ts +20 -0
- package/dist/services/dashboard-launcher.service.d.ts.map +1 -0
- package/dist/services/dashboard-launcher.service.js +30 -0
- package/dist/services/dashboard-launcher.service.js.map +1 -0
- package/dist/services/persona-enhancer.d.ts +52 -0
- package/dist/services/persona-enhancer.d.ts.map +1 -0
- package/dist/services/persona-enhancer.js +252 -0
- package/dist/services/persona-enhancer.js.map +1 -0
- package/dist/services/persona-grouper.d.ts +29 -0
- package/dist/services/persona-grouper.d.ts.map +1 -0
- package/dist/services/persona-grouper.js +111 -0
- package/dist/services/persona-grouper.js.map +1 -0
- package/dist/services/persona-service.d.ts +52 -0
- package/dist/services/persona-service.d.ts.map +1 -0
- package/dist/services/{enhanced-persona-service.js → persona-service.js} +125 -7
- package/dist/services/persona-service.js.map +1 -0
- package/dist/services/remote/auth-token-service.d.ts.map +1 -1
- package/dist/services/remote/auth-token-service.js +10 -3
- package/dist/services/remote/auth-token-service.js.map +1 -1
- package/dist/services/remote/system-persona-service.d.ts.map +1 -1
- package/dist/services/remote/system-persona-service.js +41 -10
- package/dist/services/remote/system-persona-service.js.map +1 -1
- package/dist/services/repo-service.d.ts +195 -0
- package/dist/services/repo-service.d.ts.map +1 -0
- package/dist/services/repo-service.js +1023 -0
- package/dist/services/repo-service.js.map +1 -0
- package/dist/services/types/persona-types.d.ts +84 -0
- package/dist/services/types/persona-types.d.ts.map +1 -0
- package/dist/services/types/persona-types.js +5 -0
- package/dist/services/types/persona-types.js.map +1 -0
- package/dist/services/versioning-service.d.ts +79 -0
- package/dist/services/versioning-service.d.ts.map +1 -0
- package/dist/services/versioning-service.js +191 -0
- package/dist/services/versioning-service.js.map +1 -0
- package/dist/storage/local-filesystem-adapter.d.ts +1 -0
- package/dist/storage/local-filesystem-adapter.d.ts.map +1 -1
- package/dist/storage/local-filesystem-adapter.js +47 -3
- package/dist/storage/local-filesystem-adapter.js.map +1 -1
- package/dist/storage/platform-config-adapter.d.ts +9 -0
- package/dist/storage/platform-config-adapter.d.ts.map +1 -1
- package/dist/storage/platform-config-adapter.js +55 -1
- package/dist/storage/platform-config-adapter.js.map +1 -1
- package/dist/tools/analyse.tool.d.ts +17 -0
- package/dist/tools/analyse.tool.d.ts.map +1 -0
- package/dist/tools/analyse.tool.js +124 -0
- package/dist/tools/analyse.tool.js.map +1 -0
- package/dist/tools/persona/as.tool.d.ts +32 -11
- package/dist/tools/persona/as.tool.d.ts.map +1 -1
- package/dist/tools/persona/as.tool.js +452 -317
- package/dist/tools/persona/as.tool.js.map +1 -1
- package/dist/tools/persona/persona.tool.js +2 -2
- package/dist/tools/persona/persona.tool.js.map +1 -1
- package/dist/tools/plan/plan.tool.d.ts +3 -3
- package/dist/tools/plan/plan.tool.d.ts.map +1 -1
- package/dist/tools/plan/plan.tool.js +78 -55
- package/dist/tools/plan/plan.tool.js.map +1 -1
- package/dist/tools/tool-registry.d.ts.map +1 -1
- package/dist/tools/tool-registry.js +4 -0
- package/dist/tools/tool-registry.js.map +1 -1
- package/dist/utils/repo-utils.d.ts +10 -0
- package/dist/utils/repo-utils.d.ts.map +1 -0
- package/dist/utils/repo-utils.js +55 -0
- package/dist/utils/repo-utils.js.map +1 -0
- package/package.json +6 -2
- package/dist/services/enhanced-persona-service.d.ts +0 -22
- package/dist/services/enhanced-persona-service.d.ts.map +0 -1
- package/dist/services/enhanced-persona-service.js.map +0 -1
- package/dist/services/plan-watcher.service.d.ts +0 -141
- package/dist/services/plan-watcher.service.d.ts.map +0 -1
- package/dist/services/plan-watcher.service.js +0 -1010
- package/dist/services/plan-watcher.service.js.map +0 -1
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Installation Service
|
|
3
|
+
*
|
|
4
|
+
* Dedicated service for managing agent operations:
|
|
5
|
+
* - Downloading agent content from library
|
|
6
|
+
* - Installing agents to .claude/agents/
|
|
7
|
+
* - Updating existing agents
|
|
8
|
+
* - Removing deprecated agents
|
|
9
|
+
* - Batch operations and validation
|
|
10
|
+
*/
|
|
11
|
+
import type { LocalRequestContext } from '../types/local-context.js';
|
|
12
|
+
export interface AgentContentResult {
|
|
13
|
+
content: string;
|
|
14
|
+
version: string;
|
|
15
|
+
checksum?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface AgentInstallInfo {
|
|
18
|
+
name: string;
|
|
19
|
+
version: string;
|
|
20
|
+
description: string;
|
|
21
|
+
content?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface AgentUpdateResult {
|
|
24
|
+
updated: boolean;
|
|
25
|
+
hadCustomizations: boolean;
|
|
26
|
+
backupCreated: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface AgentInstallResult {
|
|
29
|
+
success: boolean;
|
|
30
|
+
error?: string;
|
|
31
|
+
suggestion?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface BatchInstallResults {
|
|
34
|
+
successful: string[];
|
|
35
|
+
failed: string[];
|
|
36
|
+
}
|
|
37
|
+
export interface AgentValidation {
|
|
38
|
+
isValid: boolean;
|
|
39
|
+
hasRequiredSections: boolean;
|
|
40
|
+
hasMetadata: boolean;
|
|
41
|
+
checksumValid: boolean;
|
|
42
|
+
}
|
|
43
|
+
export interface InstalledAgentInfo {
|
|
44
|
+
name: string;
|
|
45
|
+
version: string;
|
|
46
|
+
lastUpdated: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Service for managing agent installation operations
|
|
50
|
+
*/
|
|
51
|
+
export declare class AgentInstallationService {
|
|
52
|
+
private context;
|
|
53
|
+
private libraryClient;
|
|
54
|
+
constructor(context: LocalRequestContext);
|
|
55
|
+
/**
|
|
56
|
+
* Download agent content from the library
|
|
57
|
+
* Note: This is a placeholder implementation since getAgentContent doesn't exist in LibraryClient yet
|
|
58
|
+
*/
|
|
59
|
+
downloadAgentContent(agentName: string, version: string): Promise<AgentContentResult>;
|
|
60
|
+
/**
|
|
61
|
+
* Generate mock agent content (placeholder until API is available)
|
|
62
|
+
*/
|
|
63
|
+
private generateMockAgentContent;
|
|
64
|
+
/**
|
|
65
|
+
* Install an agent to .claude/agents/
|
|
66
|
+
*/
|
|
67
|
+
installAgent(agentInfo: AgentInstallInfo): Promise<AgentInstallResult>;
|
|
68
|
+
/**
|
|
69
|
+
* Update an existing agent, preserving customizations
|
|
70
|
+
*/
|
|
71
|
+
updateAgent(agentInfo: AgentInstallInfo): Promise<AgentUpdateResult>;
|
|
72
|
+
/**
|
|
73
|
+
* Remove an agent safely
|
|
74
|
+
*/
|
|
75
|
+
removeAgent(agentName: string): Promise<void>;
|
|
76
|
+
/**
|
|
77
|
+
* Install multiple agents efficiently
|
|
78
|
+
*/
|
|
79
|
+
batchInstall(agentsToInstall: AgentInstallInfo[]): Promise<BatchInstallResults>;
|
|
80
|
+
/**
|
|
81
|
+
* Validate agent content integrity
|
|
82
|
+
*/
|
|
83
|
+
validateAgentContent(content: string, expectedChecksum?: string): Promise<AgentValidation>;
|
|
84
|
+
/**
|
|
85
|
+
* Get list of installed agents with metadata
|
|
86
|
+
*/
|
|
87
|
+
getInstalledAgents(): Promise<InstalledAgentInfo[]>;
|
|
88
|
+
/**
|
|
89
|
+
* Detect if agent content has customizations
|
|
90
|
+
*/
|
|
91
|
+
private detectCustomizations;
|
|
92
|
+
/**
|
|
93
|
+
* Update agent metadata (version and timestamp)
|
|
94
|
+
*/
|
|
95
|
+
private updateAgentMetadata;
|
|
96
|
+
/**
|
|
97
|
+
* Extract agent metadata from content
|
|
98
|
+
*/
|
|
99
|
+
private extractAgentMetadata;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=agent-installation-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-installation-service.d.ts","sourceRoot":"","sources":["../../src/services/agent-installation-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAGrE,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,wBAAwB;IAGvB,OAAO,CAAC,OAAO;IAF3B,OAAO,CAAC,aAAa,CAAgB;gBAEjB,OAAO,EAAE,mBAAmB;IAOhD;;;OAGG;IACG,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAkB3F;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA6BhC;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAyC5E;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA+C1E;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBnD;;OAEG;IACG,YAAY,CAAC,eAAe,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA+BrF;;OAEG;IACG,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAsChG;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAyCzD;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAoB5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAc3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAiB7B"}
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Installation Service
|
|
3
|
+
*
|
|
4
|
+
* Dedicated service for managing agent operations:
|
|
5
|
+
* - Downloading agent content from library
|
|
6
|
+
* - Installing agents to .claude/agents/
|
|
7
|
+
* - Updating existing agents
|
|
8
|
+
* - Removing deprecated agents
|
|
9
|
+
* - Batch operations and validation
|
|
10
|
+
*/
|
|
11
|
+
import * as fs from 'fs/promises';
|
|
12
|
+
import * as path from 'path';
|
|
13
|
+
import * as crypto from 'crypto';
|
|
14
|
+
import { LibraryClient } from '@magic-ingredients/tiny-brain-core';
|
|
15
|
+
import { getRepoRoot } from '../utils/repo-utils.js';
|
|
16
|
+
/**
|
|
17
|
+
* Service for managing agent installation operations
|
|
18
|
+
*/
|
|
19
|
+
export class AgentInstallationService {
|
|
20
|
+
context;
|
|
21
|
+
libraryClient;
|
|
22
|
+
constructor(context) {
|
|
23
|
+
this.context = context;
|
|
24
|
+
this.libraryClient = new LibraryClient();
|
|
25
|
+
// LibraryClient will be used when getAgentContent API is available
|
|
26
|
+
// Suppress unused warning
|
|
27
|
+
void this.libraryClient;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Download agent content from the library
|
|
31
|
+
* Note: This is a placeholder implementation since getAgentContent doesn't exist in LibraryClient yet
|
|
32
|
+
*/
|
|
33
|
+
async downloadAgentContent(agentName, version) {
|
|
34
|
+
try {
|
|
35
|
+
// For now, generate mock content since getAgentContent API doesn't exist yet
|
|
36
|
+
// This can be replaced with actual API call when available
|
|
37
|
+
const content = this.generateMockAgentContent(agentName, version);
|
|
38
|
+
return {
|
|
39
|
+
content,
|
|
40
|
+
version,
|
|
41
|
+
checksum: crypto.createHash('sha256').update(content).digest('hex')
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
46
|
+
this.context.logger.error(`Failed to download agent ${agentName}:`, error);
|
|
47
|
+
throw new Error(`Failed to download agent content: ${message}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Generate mock agent content (placeholder until API is available)
|
|
52
|
+
*/
|
|
53
|
+
generateMockAgentContent(agentName, version) {
|
|
54
|
+
const title = agentName.split('-').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' ');
|
|
55
|
+
return `# ${title}
|
|
56
|
+
|
|
57
|
+
Downloaded agent from library.
|
|
58
|
+
|
|
59
|
+
## Your Single Purpose
|
|
60
|
+
Specialized ${agentName.replace(/-/g, ' ')} functionality
|
|
61
|
+
|
|
62
|
+
## What You Will Do
|
|
63
|
+
- Implement ${agentName.replace(/-/g, ' ')} features
|
|
64
|
+
- Follow best practices
|
|
65
|
+
- Write comprehensive tests
|
|
66
|
+
|
|
67
|
+
## What You Won't Do
|
|
68
|
+
- Work outside specialization
|
|
69
|
+
- Skip documentation
|
|
70
|
+
- Ignore error handling
|
|
71
|
+
|
|
72
|
+
<!-- Agent Metadata -->
|
|
73
|
+
<!-- Version: ${version} -->
|
|
74
|
+
<!-- Generated: ${new Date().toISOString()} -->
|
|
75
|
+
<!-- Source: tiny-brain-library -->
|
|
76
|
+
`;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Install an agent to .claude/agents/
|
|
80
|
+
*/
|
|
81
|
+
async installAgent(agentInfo) {
|
|
82
|
+
try {
|
|
83
|
+
const repoRoot = getRepoRoot();
|
|
84
|
+
const agentsDir = path.join(repoRoot, '.claude', 'agents');
|
|
85
|
+
// Ensure agents directory exists
|
|
86
|
+
await fs.mkdir(agentsDir, { recursive: true });
|
|
87
|
+
// Download content if not provided
|
|
88
|
+
let content = agentInfo.content;
|
|
89
|
+
if (!content) {
|
|
90
|
+
const downloaded = await this.downloadAgentContent(agentInfo.name, agentInfo.version);
|
|
91
|
+
content = downloaded.content;
|
|
92
|
+
}
|
|
93
|
+
// Write agent file
|
|
94
|
+
const filePath = path.join(agentsDir, `${agentInfo.name}.md`);
|
|
95
|
+
await fs.writeFile(filePath, content, 'utf-8');
|
|
96
|
+
this.context.logger.info(`Successfully installed agent: ${agentInfo.name}`);
|
|
97
|
+
return { success: true };
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
const errorMsg = error instanceof Error ? error.message : 'Unknown error';
|
|
101
|
+
this.context.logger.error(`Failed to install ${agentInfo.name}:`, error);
|
|
102
|
+
if (errorMsg.includes('permission denied') || errorMsg.includes('EACCES')) {
|
|
103
|
+
return {
|
|
104
|
+
success: false,
|
|
105
|
+
error: errorMsg,
|
|
106
|
+
suggestion: 'Check directory permissions for .claude/agents/'
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
success: false,
|
|
111
|
+
error: errorMsg
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Update an existing agent, preserving customizations
|
|
117
|
+
*/
|
|
118
|
+
async updateAgent(agentInfo) {
|
|
119
|
+
try {
|
|
120
|
+
const repoRoot = getRepoRoot();
|
|
121
|
+
const filePath = path.join(repoRoot, '.claude', 'agents', `${agentInfo.name}.md`);
|
|
122
|
+
// Read existing content
|
|
123
|
+
const existingContent = await fs.readFile(filePath, 'utf-8');
|
|
124
|
+
// Check if agent has customizations
|
|
125
|
+
const hasCustomizations = this.detectCustomizations(existingContent);
|
|
126
|
+
let backupCreated = false;
|
|
127
|
+
if (hasCustomizations) {
|
|
128
|
+
// Create backup
|
|
129
|
+
const backupPath = `${filePath}.backup.${Date.now()}`;
|
|
130
|
+
await fs.writeFile(backupPath, existingContent, 'utf-8');
|
|
131
|
+
backupCreated = true;
|
|
132
|
+
this.context.logger.info(`Created backup of customized agent: ${backupPath}`);
|
|
133
|
+
}
|
|
134
|
+
// Download new content if not provided
|
|
135
|
+
let newContent = agentInfo.content;
|
|
136
|
+
if (!newContent) {
|
|
137
|
+
const downloaded = await this.downloadAgentContent(agentInfo.name, agentInfo.version);
|
|
138
|
+
newContent = downloaded.content;
|
|
139
|
+
}
|
|
140
|
+
// Update metadata in new content
|
|
141
|
+
const updatedContent = this.updateAgentMetadata(newContent, agentInfo.version);
|
|
142
|
+
// Write updated content
|
|
143
|
+
await fs.writeFile(filePath, updatedContent, 'utf-8');
|
|
144
|
+
this.context.logger.info(`Successfully updated agent: ${agentInfo.name} to v${agentInfo.version}`);
|
|
145
|
+
return {
|
|
146
|
+
updated: true,
|
|
147
|
+
hadCustomizations: hasCustomizations,
|
|
148
|
+
backupCreated
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
this.context.logger.error(`Failed to update agent ${agentInfo.name}:`, error);
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Remove an agent safely
|
|
158
|
+
*/
|
|
159
|
+
async removeAgent(agentName) {
|
|
160
|
+
try {
|
|
161
|
+
const repoRoot = getRepoRoot();
|
|
162
|
+
const filePath = path.join(repoRoot, '.claude', 'agents', `${agentName}.md`);
|
|
163
|
+
// Check if file exists
|
|
164
|
+
await fs.access(filePath);
|
|
165
|
+
// Remove the file
|
|
166
|
+
await fs.unlink(filePath);
|
|
167
|
+
this.context.logger.info(`Successfully removed agent: ${agentName}`);
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
if (error.code === 'ENOENT') {
|
|
171
|
+
this.context.logger.warn(`Agent file not found: ${agentName}.md`);
|
|
172
|
+
return; // Don't throw for non-existent files
|
|
173
|
+
}
|
|
174
|
+
this.context.logger.error(`Failed to remove agent ${agentName}:`, error);
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Install multiple agents efficiently
|
|
180
|
+
*/
|
|
181
|
+
async batchInstall(agentsToInstall) {
|
|
182
|
+
const results = {
|
|
183
|
+
successful: [],
|
|
184
|
+
failed: []
|
|
185
|
+
};
|
|
186
|
+
// Ensure directory exists once
|
|
187
|
+
const repoRoot = getRepoRoot();
|
|
188
|
+
const agentsDir = path.join(repoRoot, '.claude', 'agents');
|
|
189
|
+
await fs.mkdir(agentsDir, { recursive: true });
|
|
190
|
+
// Install agents sequentially
|
|
191
|
+
for (const agent of agentsToInstall) {
|
|
192
|
+
try {
|
|
193
|
+
const result = await this.installAgent(agent);
|
|
194
|
+
if (result.success) {
|
|
195
|
+
results.successful.push(agent.name);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
results.failed.push(agent.name);
|
|
199
|
+
this.context.logger.error(`Batch install failed for ${agent.name}: ${result.error}`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
results.failed.push(agent.name);
|
|
204
|
+
this.context.logger.error(`Batch install error for ${agent.name}:`, error);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
this.context.logger.info(`Batch install complete: ${results.successful.length} successful, ${results.failed.length} failed`);
|
|
208
|
+
return results;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Validate agent content integrity
|
|
212
|
+
*/
|
|
213
|
+
async validateAgentContent(content, expectedChecksum) {
|
|
214
|
+
const validation = {
|
|
215
|
+
isValid: false,
|
|
216
|
+
hasRequiredSections: false,
|
|
217
|
+
hasMetadata: false,
|
|
218
|
+
checksumValid: true
|
|
219
|
+
};
|
|
220
|
+
// Check for required sections
|
|
221
|
+
const requiredSections = [
|
|
222
|
+
'## Your Single Purpose',
|
|
223
|
+
'## What You Will Do',
|
|
224
|
+
'## What You Won\'t Do'
|
|
225
|
+
];
|
|
226
|
+
validation.hasRequiredSections = requiredSections.every(section => content.includes(section));
|
|
227
|
+
// Check for metadata
|
|
228
|
+
validation.hasMetadata = content.includes('<!-- Agent Metadata -->') &&
|
|
229
|
+
content.includes('<!-- Version:') &&
|
|
230
|
+
content.includes('<!-- Generated:');
|
|
231
|
+
// Validate checksum if provided
|
|
232
|
+
if (expectedChecksum) {
|
|
233
|
+
const actualChecksum = crypto.createHash('sha256').update(content).digest('hex');
|
|
234
|
+
validation.checksumValid = actualChecksum === expectedChecksum;
|
|
235
|
+
}
|
|
236
|
+
// Overall validation
|
|
237
|
+
validation.isValid = validation.hasRequiredSections &&
|
|
238
|
+
validation.hasMetadata &&
|
|
239
|
+
validation.checksumValid;
|
|
240
|
+
return validation;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Get list of installed agents with metadata
|
|
244
|
+
*/
|
|
245
|
+
async getInstalledAgents() {
|
|
246
|
+
try {
|
|
247
|
+
const repoRoot = getRepoRoot();
|
|
248
|
+
const agentsDir = path.join(repoRoot, '.claude', 'agents');
|
|
249
|
+
const files = await fs.readdir(agentsDir);
|
|
250
|
+
const agentFiles = files.filter(file => file.endsWith('.md'));
|
|
251
|
+
const installedAgents = [];
|
|
252
|
+
for (const file of agentFiles) {
|
|
253
|
+
try {
|
|
254
|
+
const filePath = path.join(agentsDir, file);
|
|
255
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
256
|
+
const agentName = file.replace('.md', '');
|
|
257
|
+
const metadata = this.extractAgentMetadata(content);
|
|
258
|
+
installedAgents.push({
|
|
259
|
+
name: agentName,
|
|
260
|
+
version: metadata.version || '1.0.0',
|
|
261
|
+
lastUpdated: metadata.generated || new Date().toISOString()
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
this.context.logger.warn(`Failed to read agent metadata from ${file}:`, error);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return installedAgents.sort((a, b) => a.name.localeCompare(b.name));
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
if (error.code === 'ENOENT') {
|
|
272
|
+
// No agents directory exists
|
|
273
|
+
return [];
|
|
274
|
+
}
|
|
275
|
+
this.context.logger.error('Failed to get installed agents:', error);
|
|
276
|
+
throw error;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Detect if agent content has customizations
|
|
281
|
+
*/
|
|
282
|
+
detectCustomizations(content) {
|
|
283
|
+
// Check for customization markers
|
|
284
|
+
if (content.includes('<!-- Customized: true -->')) {
|
|
285
|
+
return true;
|
|
286
|
+
}
|
|
287
|
+
// Look for common signs of customization
|
|
288
|
+
const customizationSignals = [
|
|
289
|
+
'Custom modifications',
|
|
290
|
+
'Custom purpose',
|
|
291
|
+
'Custom functionality',
|
|
292
|
+
'User-modified',
|
|
293
|
+
'Local changes'
|
|
294
|
+
];
|
|
295
|
+
return customizationSignals.some(signal => content.toLowerCase().includes(signal.toLowerCase()));
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Update agent metadata (version and timestamp)
|
|
299
|
+
*/
|
|
300
|
+
updateAgentMetadata(content, version) {
|
|
301
|
+
let updatedContent = content;
|
|
302
|
+
// Update version
|
|
303
|
+
const versionRegex = /<!-- Version: (.+?) -->/;
|
|
304
|
+
updatedContent = updatedContent.replace(versionRegex, `<!-- Version: ${version} -->`);
|
|
305
|
+
// Update timestamp
|
|
306
|
+
const timestampRegex = /<!-- Generated: (.+?) -->/;
|
|
307
|
+
updatedContent = updatedContent.replace(timestampRegex, `<!-- Generated: ${new Date().toISOString()} -->`);
|
|
308
|
+
return updatedContent;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Extract agent metadata from content
|
|
312
|
+
*/
|
|
313
|
+
extractAgentMetadata(content) {
|
|
314
|
+
const metadata = {};
|
|
315
|
+
// Extract version
|
|
316
|
+
const versionMatch = content.match(/<!-- Version: (.+?) -->/);
|
|
317
|
+
if (versionMatch) {
|
|
318
|
+
metadata.version = versionMatch[1];
|
|
319
|
+
}
|
|
320
|
+
// Extract generation timestamp
|
|
321
|
+
const generatedMatch = content.match(/<!-- Generated: (.+?) -->/);
|
|
322
|
+
if (generatedMatch) {
|
|
323
|
+
metadata.generated = generatedMatch[1];
|
|
324
|
+
}
|
|
325
|
+
return metadata;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
//# sourceMappingURL=agent-installation-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-installation-service.js","sourceRoot":"","sources":["../../src/services/agent-installation-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Manager
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates agent recommendation execution by coordinating:
|
|
5
|
+
* - Fetching full agent data from TBR
|
|
6
|
+
* - Installing/updating agents via AgentService
|
|
7
|
+
* - Removing deprecated agents via AgentService
|
|
8
|
+
* - Updating repository context via RepoService
|
|
9
|
+
*/
|
|
10
|
+
import type { RequestContext } from '../types/request-context.js';
|
|
11
|
+
import type { RepoAnalysis } from '@magic-ingredients/tiny-brain-core';
|
|
12
|
+
import type { UserSelections } from './analyse-service.js';
|
|
13
|
+
export interface ExecutionResult {
|
|
14
|
+
installed: string[];
|
|
15
|
+
updated: string[];
|
|
16
|
+
removed: string[];
|
|
17
|
+
skipped: string[];
|
|
18
|
+
errors: Array<{
|
|
19
|
+
operation: string;
|
|
20
|
+
message: string;
|
|
21
|
+
}>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Orchestrates agent recommendation execution
|
|
25
|
+
*/
|
|
26
|
+
export declare class AgentManager {
|
|
27
|
+
private context;
|
|
28
|
+
private agentService;
|
|
29
|
+
private repoService;
|
|
30
|
+
private libraryClient;
|
|
31
|
+
constructor(context: RequestContext);
|
|
32
|
+
/**
|
|
33
|
+
* Execute agent recommendations (install/update/remove)
|
|
34
|
+
*/
|
|
35
|
+
executeRecommendations(selections: UserSelections, repoAnalysis: RepoAnalysis): Promise<ExecutionResult>;
|
|
36
|
+
/**
|
|
37
|
+
* Fetch full agent data from TBR
|
|
38
|
+
*/
|
|
39
|
+
private fetchAgentData;
|
|
40
|
+
/**
|
|
41
|
+
* Update repository context with current agent state
|
|
42
|
+
*/
|
|
43
|
+
private updateRepositoryContext;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=agent-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-manager.d.ts","sourceRoot":"","sources":["../../src/services/agent-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAKlE,OAAO,KAAK,EAGV,YAAY,EACb,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvD;AAED;;GAEG;AACH,qBAAa,YAAY;IAKX,OAAO,CAAC,OAAO;IAJ3B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAAgB;gBAEjB,OAAO,EAAE,cAAc;IAM3C;;OAEG;IACG,sBAAsB,CAC1B,UAAU,EAAE,cAAc,EAC1B,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,eAAe,CAAC;IAqE3B;;OAEG;YACW,cAAc;IA0D5B;;OAEG;YACW,uBAAuB;CA2BtC"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Manager
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates agent recommendation execution by coordinating:
|
|
5
|
+
* - Fetching full agent data from TBR
|
|
6
|
+
* - Installing/updating agents via AgentService
|
|
7
|
+
* - Removing deprecated agents via AgentService
|
|
8
|
+
* - Updating repository context via RepoService
|
|
9
|
+
*/
|
|
10
|
+
import { AgentService } from './agent-service.js';
|
|
11
|
+
import { RepoService } from './repo-service.js';
|
|
12
|
+
import { LibraryClient } from '@magic-ingredients/tiny-brain-core';
|
|
13
|
+
/**
|
|
14
|
+
* Orchestrates agent recommendation execution
|
|
15
|
+
*/
|
|
16
|
+
export class AgentManager {
|
|
17
|
+
context;
|
|
18
|
+
agentService;
|
|
19
|
+
repoService;
|
|
20
|
+
libraryClient;
|
|
21
|
+
constructor(context) {
|
|
22
|
+
this.context = context;
|
|
23
|
+
this.agentService = new AgentService(context);
|
|
24
|
+
this.repoService = new RepoService(context);
|
|
25
|
+
this.libraryClient = new LibraryClient();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Execute agent recommendations (install/update/remove)
|
|
29
|
+
*/
|
|
30
|
+
async executeRecommendations(selections, repoAnalysis) {
|
|
31
|
+
const result = {
|
|
32
|
+
installed: [],
|
|
33
|
+
updated: [],
|
|
34
|
+
removed: [],
|
|
35
|
+
skipped: [],
|
|
36
|
+
errors: []
|
|
37
|
+
};
|
|
38
|
+
try {
|
|
39
|
+
// Step 1: Fetch full agent data from TBR
|
|
40
|
+
const agentsToProcess = await this.fetchAgentData(selections, repoAnalysis, result);
|
|
41
|
+
// Step 2: Install/update agents via AgentService
|
|
42
|
+
if (agentsToProcess.length > 0) {
|
|
43
|
+
const installResult = await this.agentService.installAgentsWithVersionCheck(agentsToProcess, {
|
|
44
|
+
overwriteStrategy: 'version-check',
|
|
45
|
+
backupExisting: true
|
|
46
|
+
});
|
|
47
|
+
// Collect results
|
|
48
|
+
result.installed.push(...installResult.installed);
|
|
49
|
+
result.updated.push(...installResult.updated);
|
|
50
|
+
result.skipped.push(...installResult.skipped);
|
|
51
|
+
installResult.errors.forEach(e => {
|
|
52
|
+
result.errors.push({
|
|
53
|
+
operation: 'install/update',
|
|
54
|
+
message: `${e.agent}: ${e.error}`
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
// Step 3: Remove deprecated agents
|
|
59
|
+
if (selections.remove.length > 0) {
|
|
60
|
+
// Extract agent names from removal recommendations
|
|
61
|
+
const agentNamesToRemove = selections.remove.map(r => r.name);
|
|
62
|
+
const removeResult = await this.agentService.removeAgents(agentNamesToRemove);
|
|
63
|
+
result.removed.push(...removeResult.removed);
|
|
64
|
+
removeResult.errors.forEach(e => {
|
|
65
|
+
result.errors.push({
|
|
66
|
+
operation: 'remove',
|
|
67
|
+
message: e
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
// Step 4: Update repository context with current state
|
|
72
|
+
const installedAgents = await this.agentService.getInstalledAgents();
|
|
73
|
+
await this.updateRepositoryContext(repoAnalysis, installedAgents);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
77
|
+
result.errors.push({
|
|
78
|
+
operation: 'general',
|
|
79
|
+
message
|
|
80
|
+
});
|
|
81
|
+
this.context.logger.error('Error executing recommendations:', error);
|
|
82
|
+
}
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Fetch full agent data from TBR
|
|
87
|
+
*/
|
|
88
|
+
async fetchAgentData(selections, repoAnalysis, result) {
|
|
89
|
+
const agentsNeeded = [...selections.install, ...selections.update];
|
|
90
|
+
if (agentsNeeded.length === 0) {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
const localContext = this.context;
|
|
94
|
+
// Fetch agents from TBR - this now returns full AgentDefinition[]
|
|
95
|
+
const agentResponse = await this.libraryClient.getAgents(repoAnalysis, localContext.authToken?.token || '');
|
|
96
|
+
// Create lookup map from the full agent definitions
|
|
97
|
+
const agentMap = new Map(agentResponse.agents.map(agent => [agent.name, agent]));
|
|
98
|
+
// Collect agents with full data
|
|
99
|
+
const agentsToProcess = [];
|
|
100
|
+
// Process install selections
|
|
101
|
+
for (const rec of selections.install) {
|
|
102
|
+
const agentData = agentMap.get(rec.name);
|
|
103
|
+
if (agentData) {
|
|
104
|
+
agentsToProcess.push(agentData);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
result.errors.push({
|
|
108
|
+
operation: 'fetch',
|
|
109
|
+
message: `Agent not found: ${rec.name}`
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Process update selections
|
|
114
|
+
for (const rec of selections.update) {
|
|
115
|
+
const agentData = agentMap.get(rec.name);
|
|
116
|
+
if (agentData) {
|
|
117
|
+
// Override version for updates
|
|
118
|
+
agentData.details.version = rec.to;
|
|
119
|
+
agentsToProcess.push(agentData);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
result.errors.push({
|
|
123
|
+
operation: 'fetch',
|
|
124
|
+
message: `Agent not found: ${rec.name}`
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return agentsToProcess;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Update repository context with current agent state
|
|
132
|
+
*/
|
|
133
|
+
async updateRepositoryContext(repoAnalysis, installedAgents) {
|
|
134
|
+
try {
|
|
135
|
+
// Convert to AgentInfo format expected by RepoService
|
|
136
|
+
const agentInfos = installedAgents.map(agent => ({
|
|
137
|
+
name: agent.name,
|
|
138
|
+
description: `Agent ${agent.name}`,
|
|
139
|
+
details: {
|
|
140
|
+
version: agent.version,
|
|
141
|
+
description: `Agent ${agent.name}`
|
|
142
|
+
}
|
|
143
|
+
}));
|
|
144
|
+
// Update context file via RepoService
|
|
145
|
+
await this.repoService.writeRepoBlockToContextFile(repoAnalysis, agentInfos);
|
|
146
|
+
this.context.logger.info('Updated repository context with installed agents');
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
// Log but don't fail the operation
|
|
150
|
+
this.context.logger.warn('Failed to update repository context:', error);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=agent-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-manager.js","sourceRoot":"","sources":["../../src/services/agent-manager.ts"],"names":[],"mappings":"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"}
|