atlas-pipeline-mcp 1.0.19 → 1.0.21

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 (43) hide show
  1. package/dist/mcp.js +191 -0
  2. package/dist/mcp.js.map +1 -1
  3. package/dist/tools/context.d.ts +33 -7
  4. package/dist/tools/context.d.ts.map +1 -1
  5. package/dist/tools/context.js +167 -82
  6. package/dist/tools/context.js.map +1 -1
  7. package/dist/tools/dashboard.d.ts +107 -0
  8. package/dist/tools/dashboard.d.ts.map +1 -0
  9. package/dist/tools/dashboard.js +544 -0
  10. package/dist/tools/dashboard.js.map +1 -0
  11. package/dist/tools/dependencies.d.ts +105 -0
  12. package/dist/tools/dependencies.d.ts.map +1 -0
  13. package/dist/tools/dependencies.js +410 -0
  14. package/dist/tools/dependencies.js.map +1 -0
  15. package/dist/tools/git.d.ts +27 -4
  16. package/dist/tools/git.d.ts.map +1 -1
  17. package/dist/tools/git.js +156 -59
  18. package/dist/tools/git.js.map +1 -1
  19. package/dist/tools/profiler.d.ts +83 -0
  20. package/dist/tools/profiler.d.ts.map +1 -0
  21. package/dist/tools/profiler.js +385 -0
  22. package/dist/tools/profiler.js.map +1 -0
  23. package/dist/tools/refactor.d.ts +63 -0
  24. package/dist/tools/refactor.d.ts.map +1 -0
  25. package/dist/tools/refactor.js +308 -0
  26. package/dist/tools/refactor.js.map +1 -0
  27. package/dist/tools/resource-manager.d.ts +167 -0
  28. package/dist/tools/resource-manager.d.ts.map +1 -0
  29. package/dist/tools/resource-manager.js +352 -0
  30. package/dist/tools/resource-manager.js.map +1 -0
  31. package/dist/tools/review.d.ts +98 -0
  32. package/dist/tools/review.d.ts.map +1 -0
  33. package/dist/tools/review.js +428 -0
  34. package/dist/tools/review.js.map +1 -0
  35. package/dist/tools/test-utils.d.ts +170 -0
  36. package/dist/tools/test-utils.d.ts.map +1 -0
  37. package/dist/tools/test-utils.js +490 -0
  38. package/dist/tools/test-utils.js.map +1 -0
  39. package/dist/tools/validation.d.ts +237 -0
  40. package/dist/tools/validation.d.ts.map +1 -0
  41. package/dist/tools/validation.js +323 -0
  42. package/dist/tools/validation.js.map +1 -0
  43. package/package.json +1 -1
@@ -0,0 +1,428 @@
1
+ /**
2
+ * Atlas Server - AI Code Review Assistant
3
+ *
4
+ * Comprehensive AI-powered code review capabilities:
5
+ * - Multi-dimensional code quality analysis
6
+ * - Best practices enforcement
7
+ * - Architectural pattern validation
8
+ * - Security vulnerability detection
9
+ * - Performance optimization suggestions
10
+ * - Test coverage recommendations
11
+ * - Documentation quality assessment
12
+ * - Team coding standards compliance
13
+ *
14
+ * @module review
15
+ * @author Nishant Unavane
16
+ * @version 1.0.0
17
+ */
18
+ import { getActiveProvider, isNoLLMMode } from '../providers/index.js';
19
+ import { logger, createTimer } from '../utils.js';
20
+ import { z } from 'zod';
21
+ // ============================================================================
22
+ // Validation Schema
23
+ // ============================================================================
24
+ const CodeReviewOptionsSchema = z.object({
25
+ code: z.string().min(1).max(500000),
26
+ language: z.string().min(1),
27
+ filePath: z.string().optional(),
28
+ checkQuality: z.boolean().optional(),
29
+ checkSecurity: z.boolean().optional(),
30
+ checkPerformance: z.boolean().optional(),
31
+ checkArchitecture: z.boolean().optional(),
32
+ checkTests: z.boolean().optional(),
33
+ checkDocumentation: z.boolean().optional(),
34
+ framework: z.string().optional(),
35
+ teamStandards: z.string().optional(),
36
+ pullRequestContext: z.string().optional(),
37
+ changedFiles: z.array(z.string()).optional(),
38
+ });
39
+ // ============================================================================
40
+ // Static Analysis
41
+ // ============================================================================
42
+ /**
43
+ * Calculate quality metrics from code
44
+ */
45
+ function calculateQualityMetrics(code, language) {
46
+ const lines = code.split('\n');
47
+ const codeLines = lines.filter(l => {
48
+ const trimmed = l.trim();
49
+ return trimmed.length > 0 && !trimmed.startsWith('//') && !trimmed.startsWith('/*') && !trimmed.startsWith('*') && !trimmed.startsWith('#');
50
+ });
51
+ const commentLines = lines.filter(l => {
52
+ const trimmed = l.trim();
53
+ return trimmed.startsWith('//') || trimmed.startsWith('/*') || trimmed.startsWith('*') || trimmed.startsWith('#');
54
+ });
55
+ const blankLines = lines.filter(l => l.trim().length === 0);
56
+ // Calculate average complexity (simplified)
57
+ const decisionPoints = (code.match(/\b(if|else|for|while|case|catch|\?|&&|\|\|)\b/g) || []).length;
58
+ const functions = (code.match(/\b(function|def|fn|func)\s+\w+/g) || []).length || 1;
59
+ const averageComplexity = decisionPoints / functions;
60
+ // Detect duplicated code (very simplified - just looks for repeated lines)
61
+ const lineSet = new Set(codeLines.map(l => l.trim()));
62
+ const duplicatedCodeRatio = 1 - (lineSet.size / (codeLines.length || 1));
63
+ // Check documentation coverage (count documented functions vs total)
64
+ const totalFunctions = (code.match(/\b(function|def|fn|func|class|interface)\s+\w+/g) || []).length;
65
+ const documentedFunctions = (code.match(/\/\*\*[\s\S]*?\*\/\s*(?:export\s+)?(?:async\s+)?(?:function|class|interface)\s+\w+/g) || []).length;
66
+ const documentationCoverage = totalFunctions > 0 ? documentedFunctions / totalFunctions : 0;
67
+ return {
68
+ totalLines: lines.length,
69
+ codeLines: codeLines.length,
70
+ commentLines: commentLines.length,
71
+ blankLines: blankLines.length,
72
+ commentRatio: commentLines.length / (codeLines.length || 1),
73
+ averageComplexity,
74
+ duplicatedCodeRatio,
75
+ documentationCoverage,
76
+ };
77
+ }
78
+ /**
79
+ * Detect common code issues automatically
80
+ */
81
+ function detectIssues(code, language) {
82
+ const findings = [];
83
+ // Security: SQL Injection risk
84
+ if (code.match(/\bquery\s*\+\s*\w+|SELECT.*\+|sql\s*=\s*['"`].*\+/i)) {
85
+ findings.push({
86
+ severity: 'critical',
87
+ category: 'security',
88
+ title: 'Potential SQL Injection',
89
+ description: 'String concatenation detected in SQL queries',
90
+ suggestion: 'Use parameterized queries or prepared statements',
91
+ autoFixable: false,
92
+ references: ['https://owasp.org/www-community/attacks/SQL_Injection'],
93
+ });
94
+ }
95
+ // Security: Eval usage
96
+ if (code.match(/\beval\s*\(/)) {
97
+ findings.push({
98
+ severity: 'critical',
99
+ category: 'security',
100
+ title: 'Dangerous eval() usage',
101
+ description: 'eval() can execute arbitrary code and is a security risk',
102
+ suggestion: 'Avoid eval() - use safer alternatives like JSON.parse() or Function constructor',
103
+ autoFixable: false,
104
+ });
105
+ }
106
+ // Performance: Console.log in production
107
+ if (code.match(/console\.(log|debug|info)/)) {
108
+ findings.push({
109
+ severity: 'minor',
110
+ category: 'performance',
111
+ title: 'Console logging in code',
112
+ description: 'Console statements can impact performance in production',
113
+ suggestion: 'Use a proper logger with log levels or remove before production',
114
+ autoFixable: true,
115
+ });
116
+ }
117
+ // Correctness: Comparison with ==
118
+ if (language === 'javascript' || language === 'typescript') {
119
+ if (code.match(/[^=!]={2}[^=]/)) {
120
+ findings.push({
121
+ severity: 'minor',
122
+ category: 'best-practices',
123
+ title: 'Loose equality (==) instead of strict equality (===)',
124
+ description: 'Using == can lead to unexpected type coercion',
125
+ suggestion: 'Use === for strict equality checks',
126
+ autoFixable: true,
127
+ });
128
+ }
129
+ }
130
+ // Maintainability: Magic numbers
131
+ const magicNumbers = code.match(/\b\d{3,}\b/g) || [];
132
+ if (magicNumbers.length > 5) {
133
+ findings.push({
134
+ severity: 'minor',
135
+ category: 'maintainability',
136
+ title: 'Too many magic numbers',
137
+ description: `${magicNumbers.length} numeric literals found without explanation`,
138
+ suggestion: 'Extract magic numbers to named constants',
139
+ autoFixable: false,
140
+ });
141
+ }
142
+ // Reliability: Missing error handling
143
+ if (code.match(/\bawait\s+\w+/) && !code.match(/try\s*{[\s\S]*}catch/)) {
144
+ findings.push({
145
+ severity: 'major',
146
+ category: 'reliability',
147
+ title: 'Missing error handling for async code',
148
+ description: 'Async operations without try-catch can cause unhandled rejections',
149
+ suggestion: 'Wrap async code in try-catch blocks',
150
+ autoFixable: false,
151
+ });
152
+ }
153
+ // Architecture: God function
154
+ const functionBodies = code.match(/(?:function|def|fn)\s+\w+[^{]*{([^}]{1000,})}/gs) || [];
155
+ if (functionBodies.length > 0) {
156
+ findings.push({
157
+ severity: 'major',
158
+ category: 'architecture',
159
+ title: 'Overly long function(s)',
160
+ description: `${functionBodies.length} function(s) exceed 50 lines`,
161
+ suggestion: 'Break down large functions into smaller, focused ones',
162
+ autoFixable: false,
163
+ });
164
+ }
165
+ // Documentation: Missing JSDoc
166
+ const publicFunctions = (code.match(/\bexport\s+(?:async\s+)?function\s+\w+/g) || []).length;
167
+ const documentedExports = (code.match(/\/\*\*[\s\S]*?\*\/\s*export\s+(?:async\s+)?function\s+\w+/g) || []).length;
168
+ if (publicFunctions > documentedExports && publicFunctions > 0) {
169
+ findings.push({
170
+ severity: 'minor',
171
+ category: 'documentation',
172
+ title: 'Missing documentation for public APIs',
173
+ description: `${publicFunctions - documentedExports} exported functions lack documentation`,
174
+ suggestion: 'Add JSDoc comments to all public functions',
175
+ autoFixable: false,
176
+ });
177
+ }
178
+ return findings;
179
+ }
180
+ /**
181
+ * Calculate grade from score
182
+ */
183
+ function scoreToGrade(score) {
184
+ if (score >= 97)
185
+ return 'A+';
186
+ if (score >= 90)
187
+ return 'A';
188
+ if (score >= 80)
189
+ return 'B';
190
+ if (score >= 70)
191
+ return 'C';
192
+ if (score >= 60)
193
+ return 'D';
194
+ return 'F';
195
+ }
196
+ // ============================================================================
197
+ // Main Review Function
198
+ // ============================================================================
199
+ /**
200
+ * Comprehensive AI-powered code review
201
+ */
202
+ export async function reviewCode(options) {
203
+ const timer = createTimer();
204
+ const { code, language, filePath, checkQuality = true, checkSecurity = true, checkPerformance = true, checkArchitecture = true, checkTests = false, checkDocumentation = true, framework, teamStandards, pullRequestContext, } = CodeReviewOptionsSchema.parse(options);
205
+ logger.info({ language, filePath }, 'Starting code review');
206
+ const warnings = [];
207
+ // Static analysis
208
+ const metrics = calculateQualityMetrics(code, language);
209
+ const staticFindings = detectIssues(code, language);
210
+ // Build review prompt
211
+ const aspects = [];
212
+ if (checkQuality)
213
+ aspects.push('code quality');
214
+ if (checkSecurity)
215
+ aspects.push('security vulnerabilities');
216
+ if (checkPerformance)
217
+ aspects.push('performance optimization');
218
+ if (checkArchitecture)
219
+ aspects.push('architecture and design patterns');
220
+ if (checkTests)
221
+ aspects.push('test coverage and quality');
222
+ if (checkDocumentation)
223
+ aspects.push('documentation quality');
224
+ const prompt = `You are a senior code reviewer with 50 years of experience conducting PR reviews. Review this ${language} code.
225
+
226
+ **Code:**
227
+ \`\`\`${language}
228
+ ${code}
229
+ \`\`\`
230
+
231
+ **Context:**
232
+ ${filePath ? `- File: ${filePath}` : ''}
233
+ ${framework ? `- Framework: ${framework}` : ''}
234
+ ${pullRequestContext ? `- PR Context: ${pullRequestContext}` : ''}
235
+ ${teamStandards ? `- Team Standards:\n${teamStandards}` : ''}
236
+
237
+ **Metrics:**
238
+ - Total Lines: ${metrics.totalLines}
239
+ - Code Lines: ${metrics.codeLines}
240
+ - Comment Ratio: ${(metrics.commentRatio * 100).toFixed(1)}%
241
+ - Average Complexity: ${metrics.averageComplexity.toFixed(1)}
242
+ - Documentation Coverage: ${(metrics.documentationCoverage * 100).toFixed(1)}%
243
+
244
+ **Review Focus:** ${aspects.join(', ')}
245
+
246
+ **Static Analysis Findings:** ${staticFindings.length} issues detected
247
+
248
+ **Instructions:**
249
+ Provide a comprehensive code review covering:
250
+ 1. **Quality** (readability, maintainability, complexity)
251
+ 2. **Security** (vulnerabilities, input validation, auth)
252
+ 3. **Performance** (algorithmic efficiency, resource usage)
253
+ 4. **Architecture** (design patterns, separation of concerns)
254
+ 5. **Testing** (testability, edge cases)
255
+ 6. **Documentation** (clarity, completeness)
256
+
257
+ For each aspect, provide:
258
+ - Score (0-100)
259
+ - Key strengths
260
+ - Key weaknesses
261
+ - Specific findings with severity
262
+
263
+ **Format your response as:**
264
+
265
+ QUALITY: [score]
266
+ Strengths: [strength 1], [strength 2]
267
+ Weaknesses: [weakness 1], [weakness 2]
268
+
269
+ SECURITY: [score]
270
+ Strengths: [strength 1]
271
+ Weaknesses: [weakness 1]
272
+
273
+ PERFORMANCE: [score]
274
+ Strengths: [strength 1]
275
+ Weaknesses: [weakness 1]
276
+
277
+ ARCHITECTURE: [score]
278
+ Strengths: [strength 1]
279
+ Weaknesses: [weakness 1]
280
+
281
+ TESTS: [score]
282
+ Strengths: [strength 1]
283
+ Weaknesses: [weakness 1]
284
+
285
+ DOCUMENTATION: [score]
286
+ Strengths: [strength 1]
287
+ Weaknesses: [weakness 1]
288
+
289
+ FINDINGS:
290
+ - [SEVERITY] [CATEGORY]: [description] - Suggestion: [fix]
291
+ ...
292
+
293
+ SUMMARY:
294
+ [2-3 sentence overall assessment]`;
295
+ let allFindings = [...staticFindings];
296
+ let suggestions = [];
297
+ let grades = {
298
+ quality: { score: 70, letter: 'C', issues: 0, strengths: [], weaknesses: [] },
299
+ security: { score: 70, letter: 'C', issues: 0, strengths: [], weaknesses: [] },
300
+ performance: { score: 70, letter: 'C', issues: 0, strengths: [], weaknesses: [] },
301
+ architecture: { score: 70, letter: 'C', issues: 0, strengths: [], weaknesses: [] },
302
+ tests: { score: 0, letter: 'F', issues: 0, strengths: [], weaknesses: [] },
303
+ documentation: { score: Math.round(metrics.documentationCoverage * 100), letter: scoreToGrade(metrics.documentationCoverage * 100), issues: 0, strengths: [], weaknesses: [] },
304
+ };
305
+ let summary = 'Code review completed with static analysis only.';
306
+ if (isNoLLMMode()) {
307
+ warnings.push('No LLM provider - using static analysis only');
308
+ summary = `Static analysis detected ${staticFindings.length} issues. Install an LLM provider for comprehensive AI-powered review.`;
309
+ }
310
+ else {
311
+ const provider = await getActiveProvider();
312
+ try {
313
+ const response = await provider.complete(prompt, {
314
+ maxTokens: 3000,
315
+ temperature: 0.3,
316
+ });
317
+ const responseText = response.text;
318
+ // Parse grades
319
+ const gradePattern = /(\w+):\s*(\d+)\s*Strengths:\s*([^\n]+)\s*Weaknesses:\s*([^\n]+)/gi;
320
+ let match;
321
+ while ((match = gradePattern.exec(responseText)) !== null) {
322
+ const aspect = match[1]?.toLowerCase() || '';
323
+ const score = parseInt(match[2] || '70');
324
+ const strengths = (match[3] || '').split(',').map(s => s.trim()).filter(Boolean);
325
+ const weaknesses = (match[4] || '').split(',').map(s => s.trim()).filter(Boolean);
326
+ const grade = {
327
+ score,
328
+ letter: scoreToGrade(score),
329
+ issues: weaknesses.length,
330
+ strengths,
331
+ weaknesses,
332
+ };
333
+ if (aspect in grades) {
334
+ grades[aspect] = grade;
335
+ }
336
+ }
337
+ // Parse findings
338
+ const findingsSection = responseText.match(/FINDINGS:\s*([\s\S]*?)(?:SUMMARY:|$)/i);
339
+ if (findingsSection && findingsSection[1]) {
340
+ const findingLines = findingsSection[1].trim().split('\n')
341
+ .filter((line) => line.trim().startsWith('-'));
342
+ for (const line of findingLines) {
343
+ const cleanLine = line.replace(/^-\s*/, '').trim();
344
+ const parts = cleanLine.split(' - Suggestion: ');
345
+ if (parts.length >= 2 && parts[0]) {
346
+ const [firstPart, suggestion] = parts;
347
+ const [severityCategory, ...descParts] = firstPart.split(': ');
348
+ const [severityStr, categoryStr] = (severityCategory || '').split(' ');
349
+ allFindings.push({
350
+ severity: severityStr?.toLowerCase() || 'minor',
351
+ category: categoryStr?.toLowerCase() || 'best-practices',
352
+ title: descParts.join(': '),
353
+ description: descParts.join(': '),
354
+ suggestion: suggestion || '',
355
+ autoFixable: false,
356
+ });
357
+ }
358
+ }
359
+ }
360
+ // Parse summary
361
+ const summaryMatch = responseText.match(/SUMMARY:\s*([\s\S]+?)$/i);
362
+ if (summaryMatch && summaryMatch[1]) {
363
+ summary = summaryMatch[1].trim();
364
+ }
365
+ // Generate suggestions
366
+ const criticalIssues = allFindings.filter(f => f.severity === 'blocker' || f.severity === 'critical');
367
+ if (criticalIssues.length > 0) {
368
+ suggestions.push({
369
+ priority: 'must',
370
+ category: 'Critical Issues',
371
+ description: `Fix ${criticalIssues.length} critical/blocker issues before merging`,
372
+ rationale: 'These issues pose security or correctness risks',
373
+ });
374
+ }
375
+ if (metrics.averageComplexity > 10) {
376
+ suggestions.push({
377
+ priority: 'should',
378
+ category: 'Complexity',
379
+ description: 'Reduce cyclomatic complexity',
380
+ rationale: 'High complexity makes code harder to test and maintain',
381
+ });
382
+ }
383
+ if (metrics.documentationCoverage < 0.5) {
384
+ suggestions.push({
385
+ priority: 'should',
386
+ category: 'Documentation',
387
+ description: 'Improve documentation coverage',
388
+ rationale: 'Well-documented code is easier for team members to understand',
389
+ });
390
+ }
391
+ }
392
+ catch (error) {
393
+ logger.error({ error }, 'Review failed');
394
+ warnings.push(`LLM error: ${error instanceof Error ? error.message : 'Unknown'}`);
395
+ }
396
+ }
397
+ // Calculate overall score
398
+ const scores = [
399
+ grades.quality.score,
400
+ grades.security.score,
401
+ grades.performance.score,
402
+ grades.architecture.score,
403
+ grades.documentation.score,
404
+ ];
405
+ const overallScore = Math.round(scores.reduce((a, b) => a + b, 0) / scores.length);
406
+ const executionTimeMs = timer.elapsed();
407
+ logger.info({
408
+ overallScore,
409
+ findings: allFindings.length,
410
+ executionTimeMs
411
+ }, 'Code review completed');
412
+ return {
413
+ code,
414
+ overallScore,
415
+ grades,
416
+ findings: allFindings,
417
+ suggestions,
418
+ metrics,
419
+ summary,
420
+ executionTimeMs,
421
+ warnings,
422
+ };
423
+ }
424
+ // ============================================================================
425
+ // Export
426
+ // ============================================================================
427
+ export default reviewCode;
428
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/tools/review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Atlas Server - Testing Utilities and Fixtures
3
+ *
4
+ * Comprehensive testing infrastructure for all tools:
5
+ * - Mock data generators
6
+ * - Test fixtures and helpers
7
+ * - Performance benchmarking
8
+ * - Integration test utilities
9
+ * - Assertion helpers
10
+ *
11
+ * @module test-utils
12
+ * @version 1.0.0
13
+ */
14
+ import type { IntentAnalysis, PipelineContext, GitContext, ProjectInfo, CodeSnippet, DecompositionResult, SolutionVariant, Critique } from '../types.js';
15
+ /**
16
+ * Generate mock intent analysis for testing
17
+ */
18
+ export declare function mockIntentAnalysis(overrides?: Partial<IntentAnalysis>): IntentAnalysis;
19
+ /**
20
+ * Generate mock project info for testing
21
+ */
22
+ export declare function mockProjectInfo(overrides?: Partial<ProjectInfo>): ProjectInfo;
23
+ /**
24
+ * Generate mock git context for testing
25
+ */
26
+ export declare function mockGitContext(overrides?: Partial<GitContext>): GitContext;
27
+ /**
28
+ * Generate mock code snippet for testing
29
+ */
30
+ export declare function mockCodeSnippet(overrides?: Partial<CodeSnippet>): CodeSnippet;
31
+ /**
32
+ * Generate mock pipeline context for testing
33
+ */
34
+ export declare function mockPipelineContext(overrides?: Partial<PipelineContext>): PipelineContext;
35
+ /**
36
+ * Generate mock decomposition result for testing
37
+ */
38
+ export declare function mockDecompositionResult(overrides?: Partial<DecompositionResult>): DecompositionResult;
39
+ /**
40
+ * Generate mock solution variant for testing
41
+ */
42
+ export declare function mockSolutionVariant(overrides?: Partial<SolutionVariant>): SolutionVariant;
43
+ /**
44
+ * Generate mock critique for testing
45
+ */
46
+ export declare function mockCritique(overrides?: Partial<Critique>): Critique;
47
+ /**
48
+ * Measure async function execution time
49
+ */
50
+ export declare function measureTime<T>(fn: () => Promise<T>): Promise<{
51
+ result: T;
52
+ durationMs: number;
53
+ }>;
54
+ /**
55
+ * Assert that a function throws with a specific message
56
+ */
57
+ export declare function assertThrows(fn: () => Promise<unknown> | unknown, expectedMessage?: string | RegExp): Promise<Error>;
58
+ /**
59
+ * Wait for a condition to be true
60
+ */
61
+ export declare function waitFor(condition: () => boolean | Promise<boolean>, options?: {
62
+ timeout?: number;
63
+ interval?: number;
64
+ }): Promise<void>;
65
+ /**
66
+ * Create a spy function that tracks calls
67
+ */
68
+ export declare function createSpy<T extends (...args: any[]) => any>(): {
69
+ spy: T;
70
+ calls: Array<{
71
+ args: Parameters<T>;
72
+ result?: ReturnType<T>;
73
+ error?: Error;
74
+ }>;
75
+ reset: () => void;
76
+ };
77
+ export interface BenchmarkResult {
78
+ name: string;
79
+ iterations: number;
80
+ totalMs: number;
81
+ avgMs: number;
82
+ minMs: number;
83
+ maxMs: number;
84
+ opsPerSecond: number;
85
+ }
86
+ /**
87
+ * Benchmark a function performance
88
+ */
89
+ export declare function benchmark(name: string, fn: () => Promise<void> | void, iterations?: number): Promise<BenchmarkResult>;
90
+ /**
91
+ * Compare multiple function implementations
92
+ */
93
+ export declare function benchmarkCompare(tests: Array<{
94
+ name: string;
95
+ fn: () => Promise<void> | void;
96
+ }>, iterations?: number): Promise<BenchmarkResult[]>;
97
+ /**
98
+ * Print benchmark results to console
99
+ */
100
+ export declare function printBenchmarkResults(results: BenchmarkResult[]): void;
101
+ /**
102
+ * Create a temporary directory for testing
103
+ */
104
+ export declare function createTempDir(): Promise<string>;
105
+ /**
106
+ * Cleanup a temporary directory
107
+ */
108
+ export declare function cleanupTempDir(dir: string): Promise<void>;
109
+ /**
110
+ * Write test file to a directory
111
+ */
112
+ export declare function writeTestFile(dir: string, filename: string, content: string): Promise<string>;
113
+ /**
114
+ * Execute test with automatic cleanup
115
+ */
116
+ export declare function withTestDir<T>(fn: (dir: string) => Promise<T>): Promise<T>;
117
+ /**
118
+ * Assert that two values are deeply equal
119
+ */
120
+ export declare function assertEqual<T>(actual: T, expected: T, message?: string): void;
121
+ /**
122
+ * Assert that a value is truthy
123
+ */
124
+ export declare function assertTrue(value: unknown, message?: string): void;
125
+ /**
126
+ * Assert that a value is falsy
127
+ */
128
+ export declare function assertFalse(value: unknown, message?: string): void;
129
+ /**
130
+ * Assert that a value is defined (not null or undefined)
131
+ */
132
+ export declare function assertDefined<T>(value: T | null | undefined, message?: string): asserts value is T;
133
+ /**
134
+ * Assert that an array contains a value
135
+ */
136
+ export declare function assertContains<T>(array: T[], value: T, message?: string): void;
137
+ /**
138
+ * Assert that a number is within a range
139
+ */
140
+ export declare function assertInRange(value: number, min: number, max: number, message?: string): void;
141
+ /**
142
+ * Mock LLM provider for testing without actual API calls
143
+ */
144
+ export declare class MockLLMProvider {
145
+ private responses;
146
+ callCount: number;
147
+ /**
148
+ * Set a mock response for a specific prompt pattern
149
+ */
150
+ setResponse(pattern: string | RegExp, response: unknown): void;
151
+ /**
152
+ * Mock complete method
153
+ */
154
+ complete(prompt: string): Promise<string>;
155
+ /**
156
+ * Mock completeJson method
157
+ */
158
+ completeJson<T>(prompt: string): Promise<{
159
+ data: T | null;
160
+ }>;
161
+ /**
162
+ * Reset the mock provider
163
+ */
164
+ reset(): void;
165
+ }
166
+ /**
167
+ * Example test suite demonstrating usage
168
+ */
169
+ export declare function exampleTestSuite(): Promise<void>;
170
+ //# sourceMappingURL=test-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../src/tools/test-utils.ts"],"names":[],"mappings":"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"}