wiggum-cli 0.3.2 → 0.4.1

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 (84) hide show
  1. package/README.md +6 -4
  2. package/dist/ai/agents/codebase-analyst.d.ts +3 -0
  3. package/dist/ai/agents/codebase-analyst.d.ts.map +1 -1
  4. package/dist/ai/agents/codebase-analyst.js +3 -0
  5. package/dist/ai/agents/codebase-analyst.js.map +1 -1
  6. package/dist/ai/agents/context-enricher.d.ts +11 -0
  7. package/dist/ai/agents/context-enricher.d.ts.map +1 -0
  8. package/dist/ai/agents/context-enricher.js +163 -0
  9. package/dist/ai/agents/context-enricher.js.map +1 -0
  10. package/dist/ai/agents/evaluator-optimizer.d.ts +13 -0
  11. package/dist/ai/agents/evaluator-optimizer.d.ts.map +1 -0
  12. package/dist/ai/agents/evaluator-optimizer.js +231 -0
  13. package/dist/ai/agents/evaluator-optimizer.js.map +1 -0
  14. package/dist/ai/agents/index.d.ts +21 -3
  15. package/dist/ai/agents/index.d.ts.map +1 -1
  16. package/dist/ai/agents/index.js +148 -86
  17. package/dist/ai/agents/index.js.map +1 -1
  18. package/dist/ai/agents/mcp-detector.d.ts +26 -0
  19. package/dist/ai/agents/mcp-detector.d.ts.map +1 -0
  20. package/dist/ai/agents/mcp-detector.js +186 -0
  21. package/dist/ai/agents/mcp-detector.js.map +1 -0
  22. package/dist/ai/agents/orchestrator.d.ts +3 -0
  23. package/dist/ai/agents/orchestrator.d.ts.map +1 -1
  24. package/dist/ai/agents/orchestrator.js +3 -0
  25. package/dist/ai/agents/orchestrator.js.map +1 -1
  26. package/dist/ai/agents/planning-orchestrator.d.ts +12 -0
  27. package/dist/ai/agents/planning-orchestrator.d.ts.map +1 -0
  28. package/dist/ai/agents/planning-orchestrator.js +133 -0
  29. package/dist/ai/agents/planning-orchestrator.js.map +1 -0
  30. package/dist/ai/agents/stack-researcher.d.ts +3 -0
  31. package/dist/ai/agents/stack-researcher.d.ts.map +1 -1
  32. package/dist/ai/agents/stack-researcher.js +3 -0
  33. package/dist/ai/agents/stack-researcher.js.map +1 -1
  34. package/dist/ai/agents/stack-utils.d.ts +11 -0
  35. package/dist/ai/agents/stack-utils.d.ts.map +1 -0
  36. package/dist/ai/agents/stack-utils.js +27 -0
  37. package/dist/ai/agents/stack-utils.js.map +1 -0
  38. package/dist/ai/agents/synthesis-agent.d.ts +11 -0
  39. package/dist/ai/agents/synthesis-agent.d.ts.map +1 -0
  40. package/dist/ai/agents/synthesis-agent.js +202 -0
  41. package/dist/ai/agents/synthesis-agent.js.map +1 -0
  42. package/dist/ai/agents/tech-researcher.d.ts +16 -0
  43. package/dist/ai/agents/tech-researcher.d.ts.map +1 -0
  44. package/dist/ai/agents/tech-researcher.js +208 -0
  45. package/dist/ai/agents/tech-researcher.js.map +1 -0
  46. package/dist/ai/agents/types.d.ts +127 -0
  47. package/dist/ai/agents/types.d.ts.map +1 -1
  48. package/dist/ai/agents/types.js +6 -0
  49. package/dist/ai/agents/types.js.map +1 -1
  50. package/dist/ai/enhancer.d.ts +4 -0
  51. package/dist/ai/enhancer.d.ts.map +1 -1
  52. package/dist/ai/enhancer.js +3 -0
  53. package/dist/ai/enhancer.js.map +1 -1
  54. package/dist/ai/index.d.ts +1 -1
  55. package/dist/ai/index.d.ts.map +1 -1
  56. package/dist/ai/index.js +14 -2
  57. package/dist/ai/index.js.map +1 -1
  58. package/dist/commands/init.d.ts.map +1 -1
  59. package/dist/commands/init.js +20 -4
  60. package/dist/commands/init.js.map +1 -1
  61. package/dist/utils/tracing.d.ts +5 -0
  62. package/dist/utils/tracing.d.ts.map +1 -1
  63. package/dist/utils/tracing.js +40 -1
  64. package/dist/utils/tracing.js.map +1 -1
  65. package/package.json +5 -2
  66. package/src/ai/agents/codebase-analyst.ts +3 -0
  67. package/src/ai/agents/context-enricher.ts +189 -0
  68. package/src/ai/agents/evaluator-optimizer.ts +277 -0
  69. package/src/ai/agents/index.ts +198 -111
  70. package/src/ai/agents/mcp-detector.test.ts +290 -0
  71. package/src/ai/agents/mcp-detector.ts +210 -0
  72. package/src/ai/agents/orchestrator.ts +3 -0
  73. package/src/ai/agents/planning-orchestrator.ts +140 -0
  74. package/src/ai/agents/stack-researcher.ts +3 -0
  75. package/src/ai/agents/stack-utils.ts +34 -0
  76. package/src/ai/agents/synthesis-agent.ts +240 -0
  77. package/src/ai/agents/tech-researcher.ts +262 -0
  78. package/src/ai/agents/types.ts +160 -0
  79. package/src/ai/enhancer.ts +6 -1
  80. package/src/ai/index.ts +26 -5
  81. package/src/commands/init.ts +20 -4
  82. package/src/utils/tracing.ts +44 -1
  83. package/tsconfig.json +1 -1
  84. package/vitest.config.ts +7 -0
package/README.md CHANGED
@@ -253,10 +253,12 @@ wiggum init --provider anthropic
253
253
 
254
254
  ### AI Analysis Features
255
255
 
256
- Wiggum's multi-agent system provides:
257
- - **Codebase Analyst:** Explores project structure, entry points, and patterns
258
- - **Stack Researcher:** Finds best practices, testing tools, and anti-patterns
259
- - **Orchestrator:** Merges results and recommends MCP servers
256
+ Wiggum uses a 4-phase multi-agent architecture:
257
+
258
+ 1. **Planning Orchestrator:** Creates a focused analysis plan based on the detected stack
259
+ 2. **Parallel Workers:** Context Enricher explores the codebase while Tech Researchers gather best practices (runs concurrently)
260
+ 3. **Synthesis:** Merges worker results and detects essential MCP servers (Playwright, database)
261
+ 4. **Evaluator-Optimizer:** QA loop that validates and improves the analysis (max 2 iterations)
260
262
 
261
263
  ## Configuration
262
264
 
@@ -1,6 +1,9 @@
1
1
  /**
2
2
  * Codebase Analyst Agent
3
3
  * Explores the codebase to understand its structure and patterns
4
+ *
5
+ * @deprecated Use runContextEnricher from context-enricher.ts instead.
6
+ * This agent is kept for backward compatibility.
4
7
  */
5
8
  import { type LanguageModel } from 'ai';
6
9
  import type { CodebaseAnalysis, CodebaseAnalystInput } from './types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"codebase-analyst.d.ts","sourceRoot":"","sources":["../../../src/ai/agents/codebase-analyst.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,IAAI,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AA8DzE;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,oBAAoB,EAC3B,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAmClC"}
1
+ {"version":3,"file":"codebase-analyst.d.ts","sourceRoot":"","sources":["../../../src/ai/agents/codebase-analyst.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,IAAI,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AA8DzE;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,oBAAoB,EAC3B,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAmClC"}
@@ -1,6 +1,9 @@
1
1
  /**
2
2
  * Codebase Analyst Agent
3
3
  * Explores the codebase to understand its structure and patterns
4
+ *
5
+ * @deprecated Use runContextEnricher from context-enricher.ts instead.
6
+ * This agent is kept for backward compatibility.
4
7
  */
5
8
  import { stepCountIs } from 'ai';
6
9
  import { createExplorationTools } from '../tools.js';
@@ -1 +1 @@
1
- {"version":3,"file":"codebase-analyst.js","sourceRoot":"","sources":["../../../src/ai/agents/codebase-analyst.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codebase-analyst.js","sourceRoot":"","sources":["../../../src/ai/agents/codebase-analyst.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Context Enricher Worker (Phase 2)
3
+ * Explores the codebase to gather enriched context based on the analysis plan
4
+ */
5
+ import { type LanguageModel } from 'ai';
6
+ import type { ContextEnricherInput, EnrichedContext } from './types.js';
7
+ /**
8
+ * Run the Context Enricher worker
9
+ */
10
+ export declare function runContextEnricher(model: LanguageModel, modelId: string, input: ContextEnricherInput, verbose?: boolean): Promise<EnrichedContext>;
11
+ //# sourceMappingURL=context-enricher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-enricher.d.ts","sourceRoot":"","sources":["../../../src/ai/agents/context-enricher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,IAAI,CAAC;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAoDxE;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,oBAAoB,EAC3B,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,eAAe,CAAC,CAoD1B"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Context Enricher Worker (Phase 2)
3
+ * Explores the codebase to gather enriched context based on the analysis plan
4
+ */
5
+ import { stepCountIs } from 'ai';
6
+ import { createExplorationTools } from '../tools.js';
7
+ import { isReasoningModel } from '../providers.js';
8
+ import { logger } from '../../utils/logger.js';
9
+ import { parseJsonSafe } from '../../utils/json-repair.js';
10
+ import { getTracedAI } from '../../utils/tracing.js';
11
+ import { detectProjectType } from './stack-utils.js';
12
+ /**
13
+ * System prompt for the Context Enricher worker
14
+ */
15
+ const CONTEXT_ENRICHER_SYSTEM_PROMPT = `You are a Context Enricher worker. Your job is to explore specific areas of a codebase and answer specific questions.
16
+
17
+ ## Your Mission
18
+ Based on the analysis plan, explore the codebase to:
19
+ 1. Identify entry points and key files
20
+ 2. Understand directory structure and purposes
21
+ 3. Detect naming conventions
22
+ 4. Find available commands (from package.json)
23
+ 5. Answer the specific questions provided
24
+
25
+ ## Tools Available
26
+ - searchCode: Search using ripgrep patterns
27
+ - readFile: Read file contents
28
+ - listDirectory: List directory structure
29
+ - getPackageInfo: Get package.json info
30
+
31
+ ## Exploration Strategy
32
+ 1. List the areas specified in the plan
33
+ 2. Read package.json to understand scripts and dependencies
34
+ 3. Search for patterns to answer the specific questions
35
+ 4. Identify the project type based on structure
36
+
37
+ ## Project Types
38
+ - MCP Server: Has @modelcontextprotocol dependencies
39
+ - REST API: Express/Fastify/Hono with route handlers
40
+ - React SPA: React with components, no server-side rendering
41
+ - Next.js App: Next.js with app or pages directory
42
+ - CLI Tool: Has bin entry in package.json
43
+ - Library: Published package without app entry
44
+
45
+ ## Output Format
46
+ After exploration, output ONLY valid JSON:
47
+ {
48
+ "entryPoints": ["src/index.ts"],
49
+ "keyDirectories": {"src/routes": "API routes", "src/components": "UI components"},
50
+ "namingConventions": "camelCase files, PascalCase components",
51
+ "commands": {"test": "npm test", "build": "npm run build"},
52
+ "answeredQuestions": {"What is the auth strategy?": "NextAuth with JWT"},
53
+ "projectType": "Next.js App"
54
+ }`;
55
+ /**
56
+ * Run the Context Enricher worker
57
+ */
58
+ export async function runContextEnricher(model, modelId, input, verbose = false) {
59
+ const tools = createExplorationTools(input.scanResult.projectRoot);
60
+ const prompt = `Explore this codebase and gather enriched context.
61
+
62
+ Project: ${input.scanResult.projectRoot}
63
+
64
+ ## Areas to Explore
65
+ ${input.areasToExplore.map(a => `- ${a}`).join('\n')}
66
+
67
+ ## Questions to Answer
68
+ ${input.questionsToAnswer.map(q => `- ${q}`).join('\n')}
69
+
70
+ Start by exploring the specified areas, then answer the questions and produce your analysis as JSON.`;
71
+ try {
72
+ const { generateText } = getTracedAI();
73
+ const result = await generateText({
74
+ model,
75
+ system: CONTEXT_ENRICHER_SYSTEM_PROMPT,
76
+ prompt,
77
+ tools,
78
+ stopWhen: stepCountIs(5),
79
+ maxOutputTokens: 3000,
80
+ ...(isReasoningModel(modelId) ? {} : { temperature: 0.3 }),
81
+ experimental_telemetry: {
82
+ isEnabled: true,
83
+ metadata: {
84
+ agent: 'context-enricher',
85
+ projectRoot: input.scanResult.projectRoot,
86
+ areasCount: input.areasToExplore.length,
87
+ questionsCount: input.questionsToAnswer.length,
88
+ },
89
+ },
90
+ });
91
+ // Parse the response
92
+ const context = parseEnrichedContext(result.text, result.steps, verbose);
93
+ if (verbose) {
94
+ logger.info(`Context Enricher: Found ${context.entryPoints.length} entry points, answered ${Object.keys(context.answeredQuestions).length} questions`);
95
+ }
96
+ return context;
97
+ }
98
+ catch (error) {
99
+ if (verbose) {
100
+ logger.error(`Context Enricher error: ${error instanceof Error ? error.message : String(error)}`);
101
+ }
102
+ return getDefaultEnrichedContext(input);
103
+ }
104
+ }
105
+ /**
106
+ * Parse the enriched context from agent response
107
+ */
108
+ function parseEnrichedContext(text, steps, verbose) {
109
+ // Try to get text from the result or steps
110
+ let textToParse = text;
111
+ if (!textToParse || textToParse.trim() === '') {
112
+ const stepsList = steps || [];
113
+ for (let i = stepsList.length - 1; i >= 0; i--) {
114
+ const step = stepsList[i];
115
+ if (step.text && step.text.trim() !== '') {
116
+ textToParse = step.text;
117
+ break;
118
+ }
119
+ }
120
+ }
121
+ if (!textToParse || textToParse.trim() === '') {
122
+ if (verbose) {
123
+ logger.warn('Context Enricher: No text output found');
124
+ }
125
+ return getDefaultEnrichedContext();
126
+ }
127
+ // Use safe JSON parser with repair capabilities
128
+ const parsed = parseJsonSafe(textToParse);
129
+ if (!parsed) {
130
+ if (verbose) {
131
+ logger.warn('Context Enricher: Failed to parse JSON response');
132
+ }
133
+ return getDefaultEnrichedContext();
134
+ }
135
+ // Build result with defaults for missing fields
136
+ return {
137
+ entryPoints: parsed.entryPoints || ['src/index.ts'],
138
+ keyDirectories: parsed.keyDirectories || { src: 'Source code' },
139
+ namingConventions: parsed.namingConventions || 'camelCase',
140
+ commands: parsed.commands || { build: 'npm run build' },
141
+ answeredQuestions: parsed.answeredQuestions || {},
142
+ projectType: parsed.projectType || 'Unknown',
143
+ };
144
+ }
145
+ /**
146
+ * Get default enriched context when parsing fails
147
+ */
148
+ function getDefaultEnrichedContext(input) {
149
+ const projectType = detectProjectType(input?.scanResult.stack);
150
+ return {
151
+ entryPoints: ['src/index.ts'],
152
+ keyDirectories: { src: 'Source code' },
153
+ namingConventions: 'camelCase',
154
+ commands: {
155
+ test: 'npm test',
156
+ build: 'npm run build',
157
+ dev: 'npm run dev',
158
+ },
159
+ answeredQuestions: {},
160
+ projectType,
161
+ };
162
+ }
163
+ //# sourceMappingURL=context-enricher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-enricher.js","sourceRoot":"","sources":["../../../src/ai/agents/context-enricher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Evaluator-Optimizer Agent (Phase 4)
3
+ * QA loop that validates and improves the analysis result
4
+ * Max 2 iterations to ensure quality without endless loops
5
+ */
6
+ import { type LanguageModel } from 'ai';
7
+ import type { ScanResult } from '../../scanner/types.js';
8
+ import type { MultiAgentAnalysis } from './types.js';
9
+ /**
10
+ * Run the Evaluator-Optimizer QA loop
11
+ */
12
+ export declare function runEvaluatorOptimizer(model: LanguageModel, modelId: string, result: MultiAgentAnalysis, scanResult: ScanResult, maxIterations?: number, verbose?: boolean): Promise<MultiAgentAnalysis>;
13
+ //# sourceMappingURL=evaluator-optimizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator-optimizer.d.ts","sourceRoot":"","sources":["../../../src/ai/agents/evaluator-optimizer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,IAAI,CAAC;AAExC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAoB,MAAM,YAAY,CAAC;AA2EvE;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,kBAAkB,EAC1B,UAAU,EAAE,UAAU,EACtB,aAAa,GAAE,MAAU,EACzB,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAqC7B"}
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Evaluator-Optimizer Agent (Phase 4)
3
+ * QA loop that validates and improves the analysis result
4
+ * Max 2 iterations to ensure quality without endless loops
5
+ */
6
+ import { z } from 'zod';
7
+ import { isReasoningModel } from '../providers.js';
8
+ import { logger } from '../../utils/logger.js';
9
+ import { getTracedAI } from '../../utils/tracing.js';
10
+ /**
11
+ * Quality threshold for passing evaluation (1-10 scale)
12
+ * Results with score >= this value skip optimization
13
+ */
14
+ const QUALITY_THRESHOLD = 7;
15
+ /**
16
+ * Schema for evaluation output
17
+ */
18
+ const evaluationSchema = z.object({
19
+ qualityScore: z.number().min(1).max(10).describe('Overall quality score from 1-10'),
20
+ hasEntryPoints: z.boolean().describe('Whether entry points are identified'),
21
+ hasImplementationGuidelines: z.boolean().describe('Whether implementation guidelines are provided'),
22
+ hasRelevantMcpServers: z.boolean().describe('Whether relevant MCP servers are recommended'),
23
+ specificIssues: z.array(z.string()).describe('Specific issues found in the analysis'),
24
+ improvementSuggestions: z.array(z.string()).describe('Suggestions for improving the analysis'),
25
+ });
26
+ /**
27
+ * Schema for optimizer output
28
+ */
29
+ const optimizerOutputSchema = z.object({
30
+ improvedGuidelines: z.array(z.string()).describe('Improved implementation guidelines'),
31
+ additionalEntryPoints: z.array(z.string()).describe('Additional entry points to add (empty array if none)'),
32
+ additionalMcpServers: z.array(z.string()).describe('Additional MCP servers to recommend (empty array if none)'),
33
+ });
34
+ /**
35
+ * System prompt for the Evaluator
36
+ */
37
+ const EVALUATOR_SYSTEM_PROMPT = `You are a QA Evaluator for AI-generated codebase analysis.
38
+
39
+ ## Your Mission
40
+ Evaluate the analysis result for:
41
+ 1. Completeness - Are all important areas covered?
42
+ 2. Accuracy - Do the recommendations match the detected stack?
43
+ 3. Actionability - Are the guidelines specific and useful?
44
+ 4. MCP relevance - Are the right MCP servers recommended?
45
+
46
+ ## Scoring Guidelines
47
+ - 9-10: Excellent, comprehensive, highly actionable
48
+ - 7-8: Good, covers main areas, useful guidelines
49
+ - 5-6: Adequate but missing some important details
50
+ - 3-4: Incomplete, vague, or partially incorrect
51
+ - 1-2: Poor, missing critical information
52
+
53
+ ## Quality Checks
54
+ - Entry points should identify actual files, not just "src/"
55
+ - Guidelines should be specific (e.g., "Run npm test" not "Test your code")
56
+ - MCP servers should match the detected database and deployment
57
+
58
+ Be constructive but honest. If it's good, say so. If it needs work, explain why.`;
59
+ /**
60
+ * System prompt for the Optimizer
61
+ */
62
+ const OPTIMIZER_SYSTEM_PROMPT = `You are an Optimizer that improves AI-generated codebase analysis based on evaluation feedback.
63
+
64
+ ## Your Mission
65
+ Based on the evaluation feedback, improve:
66
+ 1. Implementation guidelines - make them more specific and actionable
67
+ 2. Entry points - add any obvious ones that were missed
68
+ 3. MCP servers - add any that would be useful
69
+
70
+ ## Guidelines for Improvement
71
+ - Keep guidelines to 5-10 words
72
+ - Start with action verbs
73
+ - Be specific to the detected stack
74
+ - Don't remove good content, only add or improve`;
75
+ /**
76
+ * Run the Evaluator-Optimizer QA loop
77
+ */
78
+ export async function runEvaluatorOptimizer(model, modelId, result, scanResult, maxIterations = 2, verbose = false) {
79
+ let currentResult = result;
80
+ let iterations = 0;
81
+ while (iterations < maxIterations) {
82
+ // Evaluate current result
83
+ const evaluation = await evaluateResult(model, modelId, currentResult, scanResult, verbose);
84
+ if (verbose) {
85
+ logger.info(`Evaluator (iteration ${iterations + 1}): Score ${evaluation.qualityScore}/10`);
86
+ if (evaluation.specificIssues.length > 0) {
87
+ logger.info(`Issues: ${evaluation.specificIssues.join(', ')}`);
88
+ }
89
+ }
90
+ // Check if quality meets threshold
91
+ if (evaluation.qualityScore >= QUALITY_THRESHOLD &&
92
+ evaluation.hasEntryPoints &&
93
+ evaluation.hasImplementationGuidelines) {
94
+ if (verbose) {
95
+ logger.info('Evaluator: Quality threshold met, skipping optimization');
96
+ }
97
+ break;
98
+ }
99
+ // Optimize based on feedback
100
+ if (verbose) {
101
+ logger.info('Evaluator: Running optimizer to improve result');
102
+ }
103
+ currentResult = await optimizeResult(model, modelId, currentResult, evaluation, verbose);
104
+ iterations++;
105
+ }
106
+ return currentResult;
107
+ }
108
+ /**
109
+ * Evaluate the analysis result
110
+ */
111
+ async function evaluateResult(model, modelId, result, scanResult, verbose) {
112
+ const prompt = `Evaluate this codebase analysis:
113
+
114
+ ## Analysis Result
115
+ Project Type: ${result.codebaseAnalysis.projectContext.projectType}
116
+ Entry Points: ${result.codebaseAnalysis.projectContext.entryPoints.join(', ') || 'None'}
117
+ Key Directories: ${Object.keys(result.codebaseAnalysis.projectContext.keyDirectories).join(', ') || 'None'}
118
+ Guidelines: ${result.codebaseAnalysis.implementationGuidelines.length} items
119
+ - ${result.codebaseAnalysis.implementationGuidelines.slice(0, 3).join('\n- ')}
120
+ MCP Essential: ${result.mcpServers.essential.join(', ')}
121
+ MCP Recommended: ${result.mcpServers.recommended.join(', ') || 'None'}
122
+
123
+ ## Original Project Context
124
+ Framework: ${scanResult.stack.framework?.name || 'Unknown'}
125
+ Database: ${scanResult.stack.database?.name || 'None detected'}
126
+ Testing: ${scanResult.stack.testing?.unit?.name || 'None detected'}
127
+
128
+ Evaluate the quality and completeness of this analysis.`;
129
+ try {
130
+ const { generateObject } = getTracedAI();
131
+ const { object: evaluation } = await generateObject({
132
+ model,
133
+ schema: evaluationSchema,
134
+ system: EVALUATOR_SYSTEM_PROMPT,
135
+ prompt,
136
+ ...(isReasoningModel(modelId) ? {} : { temperature: 0.2 }),
137
+ experimental_telemetry: {
138
+ isEnabled: true,
139
+ metadata: {
140
+ agent: 'evaluator',
141
+ projectType: result.codebaseAnalysis.projectContext.projectType,
142
+ },
143
+ },
144
+ });
145
+ return evaluation;
146
+ }
147
+ catch (error) {
148
+ if (verbose) {
149
+ logger.error(`Evaluator error: ${error instanceof Error ? error.message : String(error)}`);
150
+ }
151
+ // Return a passing evaluation on error to avoid blocking
152
+ return {
153
+ qualityScore: 7,
154
+ hasEntryPoints: result.codebaseAnalysis.projectContext.entryPoints.length > 0,
155
+ hasImplementationGuidelines: result.codebaseAnalysis.implementationGuidelines.length > 0,
156
+ hasRelevantMcpServers: result.mcpServers.essential.length > 0,
157
+ specificIssues: [],
158
+ improvementSuggestions: [],
159
+ };
160
+ }
161
+ }
162
+ /**
163
+ * Optimize the result based on evaluation feedback
164
+ */
165
+ async function optimizeResult(model, modelId, result, evaluation, verbose) {
166
+ const prompt = `Improve this codebase analysis based on the evaluation feedback.
167
+
168
+ ## Current Analysis
169
+ Project Type: ${result.codebaseAnalysis.projectContext.projectType}
170
+ Entry Points: ${result.codebaseAnalysis.projectContext.entryPoints.join(', ')}
171
+ Current Guidelines:
172
+ ${result.codebaseAnalysis.implementationGuidelines.map(g => `- ${g}`).join('\n')}
173
+
174
+ ## Evaluation Feedback
175
+ Score: ${evaluation.qualityScore}/10
176
+ Issues: ${evaluation.specificIssues.join(', ') || 'None'}
177
+ Suggestions: ${evaluation.improvementSuggestions.join(', ') || 'None'}
178
+
179
+ Provide improved guidelines and any additional entry points or MCP servers.`;
180
+ try {
181
+ const { generateObject } = getTracedAI();
182
+ const { object: improvements } = await generateObject({
183
+ model,
184
+ schema: optimizerOutputSchema,
185
+ system: OPTIMIZER_SYSTEM_PROMPT,
186
+ prompt,
187
+ ...(isReasoningModel(modelId) ? {} : { temperature: 0.3 }),
188
+ experimental_telemetry: {
189
+ isEnabled: true,
190
+ metadata: {
191
+ agent: 'optimizer',
192
+ previousScore: evaluation.qualityScore,
193
+ },
194
+ },
195
+ });
196
+ // Apply improvements to the result
197
+ const improved = {
198
+ ...result,
199
+ codebaseAnalysis: {
200
+ ...result.codebaseAnalysis,
201
+ implementationGuidelines: improvements.improvedGuidelines.length > 0
202
+ ? improvements.improvedGuidelines
203
+ : result.codebaseAnalysis.implementationGuidelines,
204
+ projectContext: {
205
+ ...result.codebaseAnalysis.projectContext,
206
+ entryPoints: improvements.additionalEntryPoints.length > 0
207
+ ? [...new Set([...result.codebaseAnalysis.projectContext.entryPoints, ...improvements.additionalEntryPoints])]
208
+ : result.codebaseAnalysis.projectContext.entryPoints,
209
+ },
210
+ },
211
+ mcpServers: {
212
+ ...result.mcpServers,
213
+ recommended: improvements.additionalMcpServers.length > 0
214
+ ? [...new Set([...result.mcpServers.recommended, ...improvements.additionalMcpServers])]
215
+ : result.mcpServers.recommended,
216
+ },
217
+ };
218
+ if (verbose) {
219
+ logger.info(`Optimizer: Updated ${improvements.improvedGuidelines.length} guidelines`);
220
+ }
221
+ return improved;
222
+ }
223
+ catch (error) {
224
+ if (verbose) {
225
+ logger.error(`Optimizer error: ${error instanceof Error ? error.message : String(error)}`);
226
+ }
227
+ // Return original result on error
228
+ return result;
229
+ }
230
+ }
231
+ //# sourceMappingURL=evaluator-optimizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator-optimizer.js","sourceRoot":"","sources":["../../../src/ai/agents/evaluator-optimizer.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,21 @@
1
1
  /**
2
2
  * Agents Index
3
- * Exports all agent types and functions
3
+ * Multi-agent analysis with Orchestrator-Worker + Evaluator-Optimizer pattern
4
+ *
5
+ * Architecture:
6
+ * Phase 1: Planning Orchestrator (creates analysis plan)
7
+ * Phase 2: Parallel Workers (context enricher + tech researchers)
8
+ * Phase 3: Synthesis (merge results + MCP detection)
9
+ * Phase 4: Evaluator-Optimizer (QA loop)
4
10
  */
5
- export type { CodebaseAnalysis, StackResearch, McpRecommendations, MultiAgentAnalysis, AgentCapabilities, AgentOptions, CodebaseAnalystInput, StackResearcherInput, OrchestratorInput, } from './types.js';
11
+ export type { AnalysisPlan, EnrichedContext, TechResearchResult, RalphMcpServers, EvaluationResult, ContextEnricherInput, TechResearcherInput, SynthesisInput, ProgressCallback, CodebaseAnalysis, StackResearch, McpRecommendations, MultiAgentAnalysis, AgentCapabilities, AgentOptions, CodebaseAnalystInput, StackResearcherInput, OrchestratorInput, } from './types.js';
12
+ export { runPlanningOrchestrator } from './planning-orchestrator.js';
13
+ export { runContextEnricher } from './context-enricher.js';
14
+ export { runTechResearcher, runTechResearchPool } from './tech-researcher.js';
15
+ export { detectRalphMcpServers, convertToLegacyMcpRecommendations } from './mcp-detector.js';
16
+ export { runSynthesisAgent } from './synthesis-agent.js';
17
+ export { runEvaluatorOptimizer } from './evaluator-optimizer.js';
18
+ export { detectProjectType } from './stack-utils.js';
6
19
  export { runCodebaseAnalyst } from './codebase-analyst.js';
7
20
  export { runStackResearcher } from './stack-researcher.js';
8
21
  export { runOrchestrator, mergeAgentResults } from './orchestrator.js';
@@ -10,7 +23,12 @@ import type { LanguageModel } from 'ai';
10
23
  import type { ScanResult } from '../../scanner/types.js';
11
24
  import type { MultiAgentAnalysis, AgentOptions } from './types.js';
12
25
  /**
13
- * Run the full multi-agent analysis pipeline
26
+ * Run the full multi-agent analysis pipeline (new architecture)
27
+ *
28
+ * Phase 1: Planning Orchestrator - Creates focused analysis plan
29
+ * Phase 2: Parallel Workers - Context enricher + tech researchers run concurrently
30
+ * Phase 3: Synthesis - Merges results + detects MCPs
31
+ * Phase 4: Evaluator-Optimizer - QA loop (max 2 iterations)
14
32
  */
15
33
  export declare function runMultiAgentAnalysis(model: LanguageModel, modelId: string, scanResult: ScanResult, options?: AgentOptions): Promise<MultiAgentAnalysis | null>;
16
34
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ai/agents/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,wBAAwB,CAAC;AACxE,OAAO,KAAK,EACV,kBAAkB,EAElB,YAAY,EACb,MAAM,YAAY,CAAC;AAMpB;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAyFpC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ai/agents/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,YAAY,EAEV,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAEhB,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,iCAAiC,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EACV,kBAAkB,EAElB,YAAY,EAEb,MAAM,YAAY,CAAC;AAUpB;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CA8HpC"}