@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.
Files changed (147) hide show
  1. package/dist/agents/formatters/claude-code-formatter.d.ts +37 -0
  2. package/dist/agents/formatters/claude-code-formatter.d.ts.map +1 -0
  3. package/dist/agents/formatters/claude-code-formatter.js +217 -0
  4. package/dist/agents/formatters/claude-code-formatter.js.map +1 -0
  5. package/dist/agents/formatters/formatter-factory.d.ts +25 -0
  6. package/dist/agents/formatters/formatter-factory.d.ts.map +1 -0
  7. package/dist/agents/formatters/formatter-factory.js +61 -0
  8. package/dist/agents/formatters/formatter-factory.js.map +1 -0
  9. package/dist/agents/types.d.ts +68 -0
  10. package/dist/agents/types.d.ts.map +1 -0
  11. package/dist/agents/types.js +12 -0
  12. package/dist/agents/types.js.map +1 -0
  13. package/dist/analyser/analyzers/script-analyzer.d.ts +10 -0
  14. package/dist/analyser/analyzers/script-analyzer.d.ts.map +1 -0
  15. package/dist/analyser/analyzers/script-analyzer.js +205 -0
  16. package/dist/analyser/analyzers/script-analyzer.js.map +1 -0
  17. package/dist/analyser/detectors/base-detector.d.ts +12 -0
  18. package/dist/analyser/detectors/base-detector.d.ts.map +1 -0
  19. package/dist/analyser/detectors/base-detector.js +50 -0
  20. package/dist/analyser/detectors/base-detector.js.map +1 -0
  21. package/dist/analyser/detectors/javascript-detector.d.ts +19 -0
  22. package/dist/analyser/detectors/javascript-detector.d.ts.map +1 -0
  23. package/dist/analyser/detectors/javascript-detector.js +347 -0
  24. package/dist/analyser/detectors/javascript-detector.js.map +1 -0
  25. package/dist/analyser/index.d.ts +5 -0
  26. package/dist/analyser/index.d.ts.map +1 -0
  27. package/dist/analyser/index.js +315 -0
  28. package/dist/analyser/index.js.map +1 -0
  29. package/dist/analyser/types.d.ts +2 -0
  30. package/dist/analyser/types.d.ts.map +1 -0
  31. package/dist/analyser/types.js +2 -0
  32. package/dist/analyser/types.js.map +1 -0
  33. package/dist/analyser/utils.d.ts +5 -0
  34. package/dist/analyser/utils.d.ts.map +1 -0
  35. package/dist/analyser/utils.js +24 -0
  36. package/dist/analyser/utils.js.map +1 -0
  37. package/dist/cli/cli-factory.d.ts.map +1 -1
  38. package/dist/cli/cli-factory.js +17 -0
  39. package/dist/cli/cli-factory.js.map +1 -1
  40. package/dist/cli/commands/analyse.command.d.ts +7 -0
  41. package/dist/cli/commands/analyse.command.d.ts.map +1 -0
  42. package/dist/cli/commands/analyse.command.js +130 -0
  43. package/dist/cli/commands/analyse.command.js.map +1 -0
  44. package/dist/cli/commands/status.command.d.ts.map +1 -1
  45. package/dist/cli/commands/status.command.js +3 -1
  46. package/dist/cli/commands/status.command.js.map +1 -1
  47. package/dist/core/mcp-server.d.ts +10 -8
  48. package/dist/core/mcp-server.d.ts.map +1 -1
  49. package/dist/core/mcp-server.js +93 -85
  50. package/dist/core/mcp-server.js.map +1 -1
  51. package/dist/index.d.ts +3 -0
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +33 -8
  54. package/dist/index.js.map +1 -1
  55. package/dist/prompts/persona/persona.prompt.js +8 -8
  56. package/dist/prompts/persona/persona.prompt.js.map +1 -1
  57. package/dist/prompts/planning/planning.prompt.d.ts +0 -8
  58. package/dist/prompts/planning/planning.prompt.d.ts.map +1 -1
  59. package/dist/prompts/planning/planning.prompt.js +0 -175
  60. package/dist/prompts/planning/planning.prompt.js.map +1 -1
  61. package/dist/services/agent-installation-service.d.ts +101 -0
  62. package/dist/services/agent-installation-service.d.ts.map +1 -0
  63. package/dist/services/agent-installation-service.js +328 -0
  64. package/dist/services/agent-installation-service.js.map +1 -0
  65. package/dist/services/agent-manager.d.ts +45 -0
  66. package/dist/services/agent-manager.d.ts.map +1 -0
  67. package/dist/services/agent-manager.js +154 -0
  68. package/dist/services/agent-manager.js.map +1 -0
  69. package/dist/services/agent-service.d.ts +70 -0
  70. package/dist/services/agent-service.d.ts.map +1 -0
  71. package/dist/services/agent-service.js +273 -0
  72. package/dist/services/agent-service.js.map +1 -0
  73. package/dist/services/analyse-service.d.ts +97 -0
  74. package/dist/services/analyse-service.d.ts.map +1 -0
  75. package/dist/services/analyse-service.js +370 -0
  76. package/dist/services/analyse-service.js.map +1 -0
  77. package/dist/services/dashboard-launcher.service.d.ts +20 -0
  78. package/dist/services/dashboard-launcher.service.d.ts.map +1 -0
  79. package/dist/services/dashboard-launcher.service.js +30 -0
  80. package/dist/services/dashboard-launcher.service.js.map +1 -0
  81. package/dist/services/persona-enhancer.d.ts +52 -0
  82. package/dist/services/persona-enhancer.d.ts.map +1 -0
  83. package/dist/services/persona-enhancer.js +252 -0
  84. package/dist/services/persona-enhancer.js.map +1 -0
  85. package/dist/services/persona-grouper.d.ts +29 -0
  86. package/dist/services/persona-grouper.d.ts.map +1 -0
  87. package/dist/services/persona-grouper.js +111 -0
  88. package/dist/services/persona-grouper.js.map +1 -0
  89. package/dist/services/persona-service.d.ts +52 -0
  90. package/dist/services/persona-service.d.ts.map +1 -0
  91. package/dist/services/{enhanced-persona-service.js → persona-service.js} +125 -7
  92. package/dist/services/persona-service.js.map +1 -0
  93. package/dist/services/remote/auth-token-service.d.ts.map +1 -1
  94. package/dist/services/remote/auth-token-service.js +10 -3
  95. package/dist/services/remote/auth-token-service.js.map +1 -1
  96. package/dist/services/remote/system-persona-service.d.ts.map +1 -1
  97. package/dist/services/remote/system-persona-service.js +41 -10
  98. package/dist/services/remote/system-persona-service.js.map +1 -1
  99. package/dist/services/repo-service.d.ts +195 -0
  100. package/dist/services/repo-service.d.ts.map +1 -0
  101. package/dist/services/repo-service.js +1023 -0
  102. package/dist/services/repo-service.js.map +1 -0
  103. package/dist/services/types/persona-types.d.ts +84 -0
  104. package/dist/services/types/persona-types.d.ts.map +1 -0
  105. package/dist/services/types/persona-types.js +5 -0
  106. package/dist/services/types/persona-types.js.map +1 -0
  107. package/dist/services/versioning-service.d.ts +79 -0
  108. package/dist/services/versioning-service.d.ts.map +1 -0
  109. package/dist/services/versioning-service.js +191 -0
  110. package/dist/services/versioning-service.js.map +1 -0
  111. package/dist/storage/local-filesystem-adapter.d.ts +1 -0
  112. package/dist/storage/local-filesystem-adapter.d.ts.map +1 -1
  113. package/dist/storage/local-filesystem-adapter.js +47 -3
  114. package/dist/storage/local-filesystem-adapter.js.map +1 -1
  115. package/dist/storage/platform-config-adapter.d.ts +9 -0
  116. package/dist/storage/platform-config-adapter.d.ts.map +1 -1
  117. package/dist/storage/platform-config-adapter.js +55 -1
  118. package/dist/storage/platform-config-adapter.js.map +1 -1
  119. package/dist/tools/analyse.tool.d.ts +17 -0
  120. package/dist/tools/analyse.tool.d.ts.map +1 -0
  121. package/dist/tools/analyse.tool.js +124 -0
  122. package/dist/tools/analyse.tool.js.map +1 -0
  123. package/dist/tools/persona/as.tool.d.ts +32 -11
  124. package/dist/tools/persona/as.tool.d.ts.map +1 -1
  125. package/dist/tools/persona/as.tool.js +452 -317
  126. package/dist/tools/persona/as.tool.js.map +1 -1
  127. package/dist/tools/persona/persona.tool.js +2 -2
  128. package/dist/tools/persona/persona.tool.js.map +1 -1
  129. package/dist/tools/plan/plan.tool.d.ts +3 -3
  130. package/dist/tools/plan/plan.tool.d.ts.map +1 -1
  131. package/dist/tools/plan/plan.tool.js +78 -55
  132. package/dist/tools/plan/plan.tool.js.map +1 -1
  133. package/dist/tools/tool-registry.d.ts.map +1 -1
  134. package/dist/tools/tool-registry.js +4 -0
  135. package/dist/tools/tool-registry.js.map +1 -1
  136. package/dist/utils/repo-utils.d.ts +10 -0
  137. package/dist/utils/repo-utils.d.ts.map +1 -0
  138. package/dist/utils/repo-utils.js +55 -0
  139. package/dist/utils/repo-utils.js.map +1 -0
  140. package/package.json +6 -2
  141. package/dist/services/enhanced-persona-service.d.ts +0 -22
  142. package/dist/services/enhanced-persona-service.d.ts.map +0 -1
  143. package/dist/services/enhanced-persona-service.js.map +0 -1
  144. package/dist/services/plan-watcher.service.d.ts +0 -141
  145. package/dist/services/plan-watcher.service.d.ts.map +0 -1
  146. package/dist/services/plan-watcher.service.js +0 -1010
  147. 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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"}