wiggum-cli 0.2.5 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/README.md +73 -60
  2. package/dist/ai/agents/codebase-analyst.d.ts +11 -0
  3. package/dist/ai/agents/codebase-analyst.d.ts.map +1 -0
  4. package/dist/ai/agents/codebase-analyst.js +150 -0
  5. package/dist/ai/agents/codebase-analyst.js.map +1 -0
  6. package/dist/ai/agents/index.d.ts +16 -0
  7. package/dist/ai/agents/index.d.ts.map +1 -0
  8. package/dist/ai/agents/index.js +85 -0
  9. package/dist/ai/agents/index.js.map +1 -0
  10. package/dist/ai/agents/orchestrator.d.ts +15 -0
  11. package/dist/ai/agents/orchestrator.d.ts.map +1 -0
  12. package/dist/ai/agents/orchestrator.js +187 -0
  13. package/dist/ai/agents/orchestrator.js.map +1 -0
  14. package/dist/ai/agents/stack-researcher.d.ts +15 -0
  15. package/dist/ai/agents/stack-researcher.d.ts.map +1 -0
  16. package/dist/ai/agents/stack-researcher.js +274 -0
  17. package/dist/ai/agents/stack-researcher.js.map +1 -0
  18. package/dist/ai/agents/types.d.ts +123 -0
  19. package/dist/ai/agents/types.d.ts.map +1 -0
  20. package/dist/ai/agents/types.js +6 -0
  21. package/dist/ai/agents/types.js.map +1 -0
  22. package/dist/ai/enhancer.d.ts +39 -1
  23. package/dist/ai/enhancer.d.ts.map +1 -1
  24. package/dist/ai/enhancer.js +105 -9
  25. package/dist/ai/enhancer.js.map +1 -1
  26. package/dist/ai/index.d.ts +4 -2
  27. package/dist/ai/index.d.ts.map +1 -1
  28. package/dist/ai/index.js +5 -1
  29. package/dist/ai/index.js.map +1 -1
  30. package/dist/ai/prompts.d.ts +2 -2
  31. package/dist/ai/prompts.d.ts.map +1 -1
  32. package/dist/ai/prompts.js +66 -4
  33. package/dist/ai/prompts.js.map +1 -1
  34. package/dist/ai/providers.d.ts +28 -0
  35. package/dist/ai/providers.d.ts.map +1 -1
  36. package/dist/ai/providers.js +40 -0
  37. package/dist/ai/providers.js.map +1 -1
  38. package/dist/ai/tools/context7.d.ts +34 -0
  39. package/dist/ai/tools/context7.d.ts.map +1 -0
  40. package/dist/ai/tools/context7.js +135 -0
  41. package/dist/ai/tools/context7.js.map +1 -0
  42. package/dist/ai/tools/index.d.ts +7 -0
  43. package/dist/ai/tools/index.d.ts.map +1 -0
  44. package/dist/ai/tools/index.js +7 -0
  45. package/dist/ai/tools/index.js.map +1 -0
  46. package/dist/ai/tools/tavily.d.ts +27 -0
  47. package/dist/ai/tools/tavily.d.ts.map +1 -0
  48. package/dist/ai/tools/tavily.js +75 -0
  49. package/dist/ai/tools/tavily.js.map +1 -0
  50. package/dist/cli.d.ts.map +1 -1
  51. package/dist/cli.js +14 -12
  52. package/dist/cli.js.map +1 -1
  53. package/dist/commands/init.d.ts +2 -5
  54. package/dist/commands/init.d.ts.map +1 -1
  55. package/dist/commands/init.js +233 -154
  56. package/dist/commands/init.js.map +1 -1
  57. package/dist/utils/colors.d.ts.map +1 -1
  58. package/dist/utils/colors.js +10 -3
  59. package/dist/utils/colors.js.map +1 -1
  60. package/dist/utils/header.d.ts +1 -1
  61. package/dist/utils/header.js +3 -3
  62. package/dist/utils/header.js.map +1 -1
  63. package/package.json +3 -3
  64. package/src/ai/agents/codebase-analyst.ts +172 -0
  65. package/src/ai/agents/index.ts +147 -0
  66. package/src/ai/agents/orchestrator.ts +222 -0
  67. package/src/ai/agents/stack-researcher.ts +298 -0
  68. package/src/ai/agents/types.ts +132 -0
  69. package/src/ai/enhancer.ts +159 -9
  70. package/src/ai/index.ts +31 -1
  71. package/src/ai/prompts.ts +67 -4
  72. package/src/ai/providers.ts +48 -0
  73. package/src/ai/tools/context7.ts +167 -0
  74. package/src/ai/tools/index.ts +17 -0
  75. package/src/ai/tools/tavily.ts +101 -0
  76. package/src/cli.ts +14 -12
  77. package/src/commands/init.ts +278 -173
  78. package/src/utils/colors.ts +11 -3
  79. package/src/utils/header.ts +3 -3
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Orchestrator Agent
3
+ * Coordinates the multi-agent analysis and merges results
4
+ */
5
+ import { generateText } from 'ai';
6
+ import { isReasoningModel } from '../providers.js';
7
+ import { logger } from '../../utils/logger.js';
8
+ /**
9
+ * System prompt for the Orchestrator
10
+ */
11
+ const ORCHESTRATOR_SYSTEM_PROMPT = `You are an Orchestrator agent that merges analysis results into final recommendations.
12
+
13
+ Your job is to:
14
+ 1. Review the codebase analysis and stack research
15
+ 2. Recommend appropriate MCP servers for the stack
16
+ 3. Produce a final merged recommendation
17
+
18
+ ## MCP Server Selection Guidelines
19
+ Based on the detected stack, recommend these MCP servers:
20
+
21
+ **Always Essential:**
22
+ - filesystem: For file operations (all projects)
23
+ - git: For version control (all projects)
24
+
25
+ **By Project Type:**
26
+ - MCP Server: memory (for context)
27
+ - REST API: fetch (external APIs), postgres/sqlite (databases)
28
+ - React/Next.js: fetch (data fetching), memory (state persistence)
29
+ - CLI Tool: filesystem (primary), memory (caching)
30
+ - Library: git (versioning)
31
+
32
+ **By Technology:**
33
+ - Docker in use → docker MCP server
34
+ - PostgreSQL → postgres MCP server
35
+ - SQLite → sqlite MCP server
36
+ - AWS services → aws-kb-retrieval MCP server
37
+ - GitHub workflows → github MCP server
38
+
39
+ ## Output Format
40
+ Output ONLY valid JSON:
41
+ {
42
+ "mcpServers": {
43
+ "essential": ["filesystem", "git"],
44
+ "recommended": ["docker", "postgres"]
45
+ }
46
+ }`;
47
+ /**
48
+ * Run the Orchestrator to merge results and recommend MCP servers
49
+ */
50
+ export async function runOrchestrator(model, modelId, input, verbose = false) {
51
+ const prompt = createOrchestratorPrompt(input);
52
+ try {
53
+ const result = await generateText({
54
+ model,
55
+ system: ORCHESTRATOR_SYSTEM_PROMPT,
56
+ prompt,
57
+ maxOutputTokens: 1000,
58
+ ...(isReasoningModel(modelId) ? {} : { temperature: 0.2 }),
59
+ });
60
+ const mcpServers = parseMcpRecommendations(result.text, input.stack, verbose);
61
+ return mcpServers;
62
+ }
63
+ catch (error) {
64
+ if (verbose) {
65
+ logger.error(`Orchestrator error: ${error instanceof Error ? error.message : String(error)}`);
66
+ }
67
+ // Return default recommendations based on project type
68
+ return getDefaultMcpRecommendations(input.codebaseAnalysis.projectContext.projectType, input.stack);
69
+ }
70
+ }
71
+ /**
72
+ * Create the orchestrator prompt
73
+ */
74
+ function createOrchestratorPrompt(input) {
75
+ const { codebaseAnalysis, stackResearch, stack } = input;
76
+ // Summarize the stack
77
+ const stackSummary = [];
78
+ if (stack.framework)
79
+ stackSummary.push(`Framework: ${stack.framework.name}`);
80
+ if (stack.database)
81
+ stackSummary.push(`Database: ${stack.database.name}`);
82
+ if (stack.orm)
83
+ stackSummary.push(`ORM: ${stack.orm.name}`);
84
+ if (stack.deployment?.length)
85
+ stackSummary.push(`Deployment: ${stack.deployment.map(d => d.name).join(', ')}`);
86
+ if (stack.mcp?.isProject)
87
+ stackSummary.push('This is an MCP Server project');
88
+ return `Analyze these results and recommend MCP servers:
89
+
90
+ ## Project Type
91
+ ${codebaseAnalysis.projectContext.projectType}
92
+
93
+ ## Detected Stack
94
+ ${stackSummary.join('\n') || 'Unknown'}
95
+
96
+ ## Testing Tools Identified
97
+ ${stackResearch.testingTools.join(', ') || 'None identified'}
98
+
99
+ ## Debugging Tools
100
+ ${stackResearch.debuggingTools.join(', ') || 'None identified'}
101
+
102
+ Based on this analysis, recommend essential and optional MCP servers.
103
+ Output as JSON with "mcpServers" containing "essential" and "recommended" arrays.`;
104
+ }
105
+ /**
106
+ * Parse MCP recommendations from orchestrator response
107
+ */
108
+ function parseMcpRecommendations(text, stack, verbose) {
109
+ if (!text || text.trim() === '') {
110
+ return getDefaultMcpRecommendations('Unknown', stack);
111
+ }
112
+ try {
113
+ // Remove markdown code blocks
114
+ let jsonText = text;
115
+ const jsonMatch = text.match(/```(?:json)?\s*([\s\S]*?)```/);
116
+ if (jsonMatch) {
117
+ jsonText = jsonMatch[1];
118
+ }
119
+ // Find JSON object
120
+ const objectMatch = jsonText.match(/\{[\s\S]*\}/);
121
+ if (objectMatch) {
122
+ jsonText = objectMatch[0];
123
+ }
124
+ const parsed = JSON.parse(jsonText);
125
+ if (parsed.mcpServers) {
126
+ return {
127
+ essential: parsed.mcpServers.essential || ['filesystem', 'git'],
128
+ recommended: parsed.mcpServers.recommended || [],
129
+ };
130
+ }
131
+ return getDefaultMcpRecommendations('Unknown', stack);
132
+ }
133
+ catch (error) {
134
+ if (verbose) {
135
+ logger.warn(`Orchestrator: Failed to parse JSON - ${error instanceof Error ? error.message : String(error)}`);
136
+ }
137
+ return getDefaultMcpRecommendations('Unknown', stack);
138
+ }
139
+ }
140
+ /**
141
+ * Get default MCP recommendations based on project type and stack
142
+ */
143
+ function getDefaultMcpRecommendations(projectType, stack) {
144
+ const essential = ['filesystem', 'git'];
145
+ const recommended = [];
146
+ // Add based on project type
147
+ const lowerType = projectType.toLowerCase();
148
+ if (lowerType.includes('mcp')) {
149
+ recommended.push('memory');
150
+ }
151
+ if (lowerType.includes('api') || lowerType.includes('server')) {
152
+ recommended.push('fetch');
153
+ }
154
+ // Add based on detected stack
155
+ if (stack.database) {
156
+ const dbName = stack.database.name.toLowerCase();
157
+ if (dbName.includes('postgres')) {
158
+ recommended.push('postgres');
159
+ }
160
+ else if (dbName.includes('sqlite')) {
161
+ recommended.push('sqlite');
162
+ }
163
+ }
164
+ if (stack.deployment?.some(d => d.name.toLowerCase().includes('docker'))) {
165
+ recommended.push('docker');
166
+ }
167
+ // Add from existing MCP recommendations in stack
168
+ if (stack.mcp?.recommended) {
169
+ for (const rec of stack.mcp.recommended) {
170
+ if (!essential.includes(rec) && !recommended.includes(rec)) {
171
+ recommended.push(rec);
172
+ }
173
+ }
174
+ }
175
+ return { essential, recommended };
176
+ }
177
+ /**
178
+ * Merge all agent results into a final MultiAgentAnalysis
179
+ */
180
+ export function mergeAgentResults(codebaseAnalysis, stackResearch, mcpServers) {
181
+ return {
182
+ codebaseAnalysis,
183
+ stackResearch,
184
+ mcpServers,
185
+ };
186
+ }
187
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/ai/agents/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Stack Researcher Agent
3
+ * Researches best practices and tools for the detected stack
4
+ * Gracefully degrades when optional services are unavailable
5
+ */
6
+ import { type LanguageModel } from 'ai';
7
+ import type { StackResearch, StackResearcherInput } from './types.js';
8
+ /**
9
+ * Run the Stack Researcher agent
10
+ */
11
+ export declare function runStackResearcher(model: LanguageModel, modelId: string, input: StackResearcherInput, options: {
12
+ tavilyApiKey?: string;
13
+ context7ApiKey?: string;
14
+ }, verbose?: boolean): Promise<StackResearch | null>;
15
+ //# sourceMappingURL=stack-researcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-researcher.d.ts","sourceRoot":"","sources":["../../../src/ai/agents/stack-researcher.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAA6B,KAAK,aAAa,EAAa,MAAM,IAAI,CAAC;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAqB,MAAM,YAAY,CAAC;AAiKzF;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,oBAAoB,EAC3B,OAAO,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,EAC3D,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA2C/B"}
@@ -0,0 +1,274 @@
1
+ /**
2
+ * Stack Researcher Agent
3
+ * Researches best practices and tools for the detected stack
4
+ * Gracefully degrades when optional services are unavailable
5
+ */
6
+ import { generateText, stepCountIs } from 'ai';
7
+ import { createTavilySearchTool } from '../tools/tavily.js';
8
+ import { createContext7Tool } from '../tools/context7.js';
9
+ import { isReasoningModel } from '../providers.js';
10
+ import { logger } from '../../utils/logger.js';
11
+ /**
12
+ * System prompt for Stack Researcher with tools
13
+ */
14
+ const STACK_RESEARCHER_WITH_TOOLS_PROMPT = `You are a Stack Researcher agent with access to web search and documentation lookup tools.
15
+
16
+ ## Your Mission
17
+ Research the detected technology stack to find:
18
+ 1. Current best practices
19
+ 2. Common anti-patterns to avoid
20
+ 3. Testing tools and patterns
21
+ 4. Debugging approaches
22
+ 5. Useful documentation links
23
+
24
+ ## Tools Available
25
+ - tavilySearch: Search the web for current best practices and patterns
26
+ - context7Lookup: Look up library documentation
27
+
28
+ ## Research Strategy
29
+ 1. Search for "[technology] best practices 2024"
30
+ 2. Search for "[project type] testing patterns"
31
+ 3. Look up documentation for key dependencies
32
+ 4. Search for "[framework] anti-patterns"
33
+
34
+ ## Output Format
35
+ After research, output ONLY valid JSON with this structure:
36
+ {
37
+ "bestPractices": [
38
+ "Use TypeScript strict mode",
39
+ "Implement proper error boundaries"
40
+ ],
41
+ "antiPatterns": [
42
+ "Don't use any type",
43
+ "Avoid prop drilling"
44
+ ],
45
+ "testingTools": [
46
+ "npx vitest",
47
+ "npx playwright test"
48
+ ],
49
+ "debuggingTools": [
50
+ "React DevTools",
51
+ "DEBUG=* npm run dev"
52
+ ],
53
+ "documentationHints": [
54
+ "React docs: react.dev",
55
+ "Vitest: vitest.dev"
56
+ ],
57
+ "researchMode": "full"
58
+ }
59
+
60
+ Keep each item concise (5-15 words max). Max 5 items per array.`;
61
+ /**
62
+ * System prompt for Stack Researcher without tools (knowledge-only)
63
+ */
64
+ const STACK_RESEARCHER_KNOWLEDGE_ONLY_PROMPT = `You are a Stack Researcher agent. You don't have web access, so rely on your training knowledge.
65
+
66
+ ## Your Mission
67
+ Based on your knowledge, provide:
68
+ 1. Best practices for the detected technologies
69
+ 2. Common anti-patterns to avoid
70
+ 3. Testing tools commonly used with this stack
71
+ 4. Debugging approaches
72
+ 5. Documentation hints
73
+
74
+ ## Important Notes
75
+ - Be explicit about what you're confident about vs uncertain
76
+ - Focus on well-established practices from your training
77
+ - Mention if something might be outdated
78
+
79
+ ## Output Format
80
+ Output ONLY valid JSON with this structure:
81
+ {
82
+ "bestPractices": [
83
+ "Use TypeScript strict mode",
84
+ "Implement proper error boundaries"
85
+ ],
86
+ "antiPatterns": [
87
+ "Don't use any type",
88
+ "Avoid prop drilling"
89
+ ],
90
+ "testingTools": [
91
+ "npm test",
92
+ "npx vitest"
93
+ ],
94
+ "debuggingTools": [
95
+ "console.log debugging",
96
+ "Node.js inspector"
97
+ ],
98
+ "documentationHints": [
99
+ "Check official docs for updates",
100
+ "Framework docs: [URL]"
101
+ ],
102
+ "researchMode": "knowledge-only"
103
+ }
104
+
105
+ Keep each item concise (5-15 words max). Max 5 items per array.
106
+ Note: Research mode should reflect that you're using training knowledge only.`;
107
+ /**
108
+ * Create the research prompt based on stack and project type
109
+ */
110
+ function createResearchPrompt(stack, projectType, hasTools) {
111
+ const technologies = [];
112
+ // Collect all detected technologies
113
+ if (stack.framework)
114
+ technologies.push(stack.framework.name);
115
+ if (stack.testing?.unit)
116
+ technologies.push(stack.testing.unit.name);
117
+ if (stack.testing?.e2e)
118
+ technologies.push(stack.testing.e2e.name);
119
+ if (stack.orm)
120
+ technologies.push(stack.orm.name);
121
+ if (stack.database)
122
+ technologies.push(stack.database.name);
123
+ if (stack.stateManagement)
124
+ technologies.push(stack.stateManagement.name);
125
+ if (stack.auth)
126
+ technologies.push(stack.auth.name);
127
+ if (stack.mcp?.isProject)
128
+ technologies.push('MCP Server');
129
+ const techList = technologies.length > 0 ? technologies.join(', ') : 'Unknown stack';
130
+ if (hasTools) {
131
+ return `Research best practices for this stack:
132
+
133
+ Project Type: ${projectType}
134
+ Technologies: ${techList}
135
+
136
+ Use the available tools to search for:
137
+ 1. Current best practices for ${projectType} projects
138
+ 2. Testing patterns for ${techList}
139
+ 3. Common anti-patterns to avoid
140
+
141
+ Then produce your research findings as JSON.`;
142
+ }
143
+ return `Based on your knowledge, provide best practices for this stack:
144
+
145
+ Project Type: ${projectType}
146
+ Technologies: ${techList}
147
+
148
+ Provide:
149
+ 1. Best practices for ${projectType} projects
150
+ 2. Testing tools commonly used with ${techList}
151
+ 3. Anti-patterns to avoid
152
+ 4. Debugging approaches
153
+
154
+ Output your findings as JSON. Be clear this is based on training knowledge.`;
155
+ }
156
+ /**
157
+ * Determine research mode based on capabilities
158
+ */
159
+ function getResearchMode(capabilities) {
160
+ if (capabilities.hasTavily && capabilities.hasContext7)
161
+ return 'full';
162
+ if (capabilities.hasTavily)
163
+ return 'web-only';
164
+ if (capabilities.hasContext7)
165
+ return 'docs-only';
166
+ return 'knowledge-only';
167
+ }
168
+ /**
169
+ * Run the Stack Researcher agent
170
+ */
171
+ export async function runStackResearcher(model, modelId, input, options, verbose = false) {
172
+ const tools = {};
173
+ // Add tools based on available keys
174
+ if (options.tavilyApiKey) {
175
+ tools.tavilySearch = createTavilySearchTool(options.tavilyApiKey);
176
+ }
177
+ if (options.context7ApiKey) {
178
+ tools.context7Lookup = createContext7Tool(options.context7ApiKey);
179
+ }
180
+ const hasTools = Object.keys(tools).length > 0;
181
+ const researchMode = getResearchMode(input.capabilities);
182
+ if (verbose) {
183
+ logger.info(`Stack Researcher running in ${researchMode} mode`);
184
+ }
185
+ const systemPrompt = hasTools
186
+ ? STACK_RESEARCHER_WITH_TOOLS_PROMPT
187
+ : STACK_RESEARCHER_KNOWLEDGE_ONLY_PROMPT;
188
+ const prompt = createResearchPrompt(input.stack, input.projectType, hasTools);
189
+ try {
190
+ const result = await generateText({
191
+ model,
192
+ system: systemPrompt,
193
+ prompt,
194
+ ...(hasTools ? { tools, stopWhen: stepCountIs(8) } : {}),
195
+ maxOutputTokens: 2000,
196
+ ...(isReasoningModel(modelId) ? {} : { temperature: 0.3 }),
197
+ });
198
+ // Parse the response
199
+ const research = parseStackResearch(result.text, result.steps, researchMode, verbose);
200
+ return research;
201
+ }
202
+ catch (error) {
203
+ if (verbose) {
204
+ logger.error(`Stack Researcher error: ${error instanceof Error ? error.message : String(error)}`);
205
+ }
206
+ return null;
207
+ }
208
+ }
209
+ /**
210
+ * Parse the stack research from agent response
211
+ */
212
+ function parseStackResearch(text, steps, researchMode, verbose) {
213
+ // Try to get text from the result or steps
214
+ let textToParse = text;
215
+ if (!textToParse || textToParse.trim() === '') {
216
+ const stepsList = steps || [];
217
+ for (let i = stepsList.length - 1; i >= 0; i--) {
218
+ const step = stepsList[i];
219
+ if (step.text && step.text.trim() !== '') {
220
+ textToParse = step.text;
221
+ break;
222
+ }
223
+ }
224
+ }
225
+ if (!textToParse || textToParse.trim() === '') {
226
+ if (verbose) {
227
+ logger.warn('Stack Researcher: No text output found');
228
+ }
229
+ return getDefaultStackResearch(researchMode);
230
+ }
231
+ try {
232
+ // Remove markdown code blocks if present
233
+ let jsonText = textToParse;
234
+ const jsonMatch = textToParse.match(/```(?:json)?\s*([\s\S]*?)```/);
235
+ if (jsonMatch) {
236
+ jsonText = jsonMatch[1];
237
+ }
238
+ // Find JSON object
239
+ const objectMatch = jsonText.match(/\{[\s\S]*\}/);
240
+ if (objectMatch) {
241
+ jsonText = objectMatch[0];
242
+ }
243
+ const parsed = JSON.parse(jsonText);
244
+ // Build result with defaults for missing fields
245
+ return {
246
+ bestPractices: parsed.bestPractices || [],
247
+ antiPatterns: parsed.antiPatterns || [],
248
+ testingTools: parsed.testingTools || [],
249
+ debuggingTools: parsed.debuggingTools || [],
250
+ documentationHints: parsed.documentationHints || [],
251
+ researchMode: researchMode,
252
+ };
253
+ }
254
+ catch (error) {
255
+ if (verbose) {
256
+ logger.warn(`Stack Researcher: Failed to parse JSON - ${error instanceof Error ? error.message : String(error)}`);
257
+ }
258
+ return getDefaultStackResearch(researchMode);
259
+ }
260
+ }
261
+ /**
262
+ * Get default stack research when parsing fails
263
+ */
264
+ function getDefaultStackResearch(researchMode) {
265
+ return {
266
+ bestPractices: ['Follow project conventions', 'Write tests for new code'],
267
+ antiPatterns: ['Avoid skipping tests', 'Don\'t ignore type errors'],
268
+ testingTools: ['npm test'],
269
+ debuggingTools: ['console.log', 'debugger statement'],
270
+ documentationHints: ['Check package.json for dependencies'],
271
+ researchMode,
272
+ };
273
+ }
274
+ //# sourceMappingURL=stack-researcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-researcher.js","sourceRoot":"","sources":["../../../src/ai/agents/stack-researcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Agent Types and Interfaces
3
+ * Defines the structure for multi-agent analysis
4
+ */
5
+ import type { ScanResult, DetectedStack } from '../../scanner/types.js';
6
+ /**
7
+ * Codebase analysis result from the Codebase Analyst agent
8
+ */
9
+ export interface CodebaseAnalysis {
10
+ /** Project structure and context */
11
+ projectContext: {
12
+ /** Key entry point files */
13
+ entryPoints: string[];
14
+ /** Important directories and their purposes */
15
+ keyDirectories: Record<string, string>;
16
+ /** Naming conventions used */
17
+ namingConventions?: string;
18
+ /** The primary project type (MCP Server, REST API, React SPA, CLI, Library) */
19
+ projectType: string;
20
+ };
21
+ /** Detected commands from package.json */
22
+ commands: {
23
+ test?: string;
24
+ lint?: string;
25
+ typecheck?: string;
26
+ build?: string;
27
+ dev?: string;
28
+ format?: string;
29
+ };
30
+ /** Short, actionable implementation guidelines */
31
+ implementationGuidelines: string[];
32
+ /** Additional technologies that may have been missed */
33
+ possibleMissedTechnologies?: string[];
34
+ }
35
+ /**
36
+ * Stack research result from the Stack Researcher agent
37
+ */
38
+ export interface StackResearch {
39
+ /** Best practices for the detected stack */
40
+ bestPractices: string[];
41
+ /** Anti-patterns to avoid */
42
+ antiPatterns: string[];
43
+ /** Technology-specific testing tools */
44
+ testingTools: string[];
45
+ /** Technology-specific debugging tools */
46
+ debuggingTools: string[];
47
+ /** Documentation hints and links */
48
+ documentationHints: string[];
49
+ /** Whether research was performed with tools or knowledge-only */
50
+ researchMode: 'full' | 'web-only' | 'docs-only' | 'knowledge-only';
51
+ }
52
+ /**
53
+ * MCP server recommendations
54
+ */
55
+ export interface McpRecommendations {
56
+ /** Essential MCP servers for this stack */
57
+ essential: string[];
58
+ /** Recommended but optional MCP servers */
59
+ recommended: string[];
60
+ }
61
+ /**
62
+ * Combined result from all agents
63
+ */
64
+ export interface MultiAgentAnalysis {
65
+ /** Codebase analysis from the Codebase Analyst */
66
+ codebaseAnalysis: CodebaseAnalysis;
67
+ /** Stack research from the Stack Researcher */
68
+ stackResearch: StackResearch;
69
+ /** MCP server recommendations (merged from both agents) */
70
+ mcpServers: McpRecommendations;
71
+ }
72
+ /**
73
+ * Agent capabilities based on available API keys
74
+ */
75
+ export interface AgentCapabilities {
76
+ /** Tavily web search available */
77
+ hasTavily: boolean;
78
+ /** Context7 documentation lookup available */
79
+ hasContext7: boolean;
80
+ }
81
+ /**
82
+ * Options for running agents
83
+ */
84
+ export interface AgentOptions {
85
+ /** Tavily API key (optional) */
86
+ tavilyApiKey?: string;
87
+ /** Context7 API key (optional) */
88
+ context7ApiKey?: string;
89
+ /** Enable verbose logging */
90
+ verbose?: boolean;
91
+ }
92
+ /**
93
+ * Input for the Codebase Analyst agent
94
+ */
95
+ export interface CodebaseAnalystInput {
96
+ /** The scan result from the scanner */
97
+ scanResult: ScanResult;
98
+ /** Project root directory */
99
+ projectRoot: string;
100
+ }
101
+ /**
102
+ * Input for the Stack Researcher agent
103
+ */
104
+ export interface StackResearcherInput {
105
+ /** The detected stack */
106
+ stack: DetectedStack;
107
+ /** The identified project type */
108
+ projectType: string;
109
+ /** Agent capabilities */
110
+ capabilities: AgentCapabilities;
111
+ }
112
+ /**
113
+ * Input for the Orchestrator agent
114
+ */
115
+ export interface OrchestratorInput {
116
+ /** Codebase analysis result */
117
+ codebaseAnalysis: CodebaseAnalysis;
118
+ /** Stack research result */
119
+ stackResearch: StackResearch;
120
+ /** The detected stack */
121
+ stack: DetectedStack;
122
+ }
123
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ai/agents/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,cAAc,EAAE;QACd,4BAA4B;QAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,+CAA+C;QAC/C,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvC,8BAA8B;QAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,+EAA+E;QAC/E,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,0CAA0C;IAC1C,QAAQ,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,kDAAkD;IAClD,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,wDAAwD;IACxD,0BAA0B,CAAC,EAAE,MAAM,EAAE,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,6BAA6B;IAC7B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,wCAAwC;IACxC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,0CAA0C;IAC1C,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,oCAAoC;IACpC,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,kEAAkE;IAClE,YAAY,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,gBAAgB,CAAC;CACpE;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,2CAA2C;IAC3C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,2CAA2C;IAC3C,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,kDAAkD;IAClD,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,+CAA+C;IAC/C,aAAa,EAAE,aAAa,CAAC;IAC7B,2DAA2D;IAC3D,UAAU,EAAE,kBAAkB,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kCAAkC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,gCAAgC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,uCAAuC;IACvC,UAAU,EAAE,UAAU,CAAC;IACvB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,yBAAyB;IACzB,KAAK,EAAE,aAAa,CAAC;IACrB,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,YAAY,EAAE,iBAAiB,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,+BAA+B;IAC/B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,4BAA4B;IAC5B,aAAa,EAAE,aAAa,CAAC;IAC7B,yBAAyB;IACzB,KAAK,EAAE,aAAa,CAAC;CACtB"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Agent Types and Interfaces
3
+ * Defines the structure for multi-agent analysis
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/ai/agents/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}