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.
- package/dist/mcp.js +191 -0
- package/dist/mcp.js.map +1 -1
- package/dist/tools/context.d.ts +33 -7
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +167 -82
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/dashboard.d.ts +107 -0
- package/dist/tools/dashboard.d.ts.map +1 -0
- package/dist/tools/dashboard.js +544 -0
- package/dist/tools/dashboard.js.map +1 -0
- package/dist/tools/dependencies.d.ts +105 -0
- package/dist/tools/dependencies.d.ts.map +1 -0
- package/dist/tools/dependencies.js +410 -0
- package/dist/tools/dependencies.js.map +1 -0
- package/dist/tools/git.d.ts +27 -4
- package/dist/tools/git.d.ts.map +1 -1
- package/dist/tools/git.js +156 -59
- package/dist/tools/git.js.map +1 -1
- package/dist/tools/profiler.d.ts +83 -0
- package/dist/tools/profiler.d.ts.map +1 -0
- package/dist/tools/profiler.js +385 -0
- package/dist/tools/profiler.js.map +1 -0
- package/dist/tools/refactor.d.ts +63 -0
- package/dist/tools/refactor.d.ts.map +1 -0
- package/dist/tools/refactor.js +308 -0
- package/dist/tools/refactor.js.map +1 -0
- package/dist/tools/resource-manager.d.ts +167 -0
- package/dist/tools/resource-manager.d.ts.map +1 -0
- package/dist/tools/resource-manager.js +352 -0
- package/dist/tools/resource-manager.js.map +1 -0
- package/dist/tools/review.d.ts +98 -0
- package/dist/tools/review.d.ts.map +1 -0
- package/dist/tools/review.js +428 -0
- package/dist/tools/review.js.map +1 -0
- package/dist/tools/test-utils.d.ts +170 -0
- package/dist/tools/test-utils.d.ts.map +1 -0
- package/dist/tools/test-utils.js +490 -0
- package/dist/tools/test-utils.js.map +1 -0
- package/dist/tools/validation.d.ts +237 -0
- package/dist/tools/validation.d.ts.map +1 -0
- package/dist/tools/validation.js +323 -0
- package/dist/tools/validation.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atlas Server - Resource Management and Cleanup
|
|
3
|
+
*
|
|
4
|
+
* Comprehensive resource lifecycle management to prevent memory leaks:
|
|
5
|
+
* - Automatic cleanup of resources
|
|
6
|
+
* - Graceful shutdown handling
|
|
7
|
+
* - Resource pooling and recycling
|
|
8
|
+
* - Memory usage tracking
|
|
9
|
+
* - File handle management
|
|
10
|
+
*
|
|
11
|
+
* @module resource-manager
|
|
12
|
+
* @version 1.0.0
|
|
13
|
+
*/
|
|
14
|
+
import { logger } from '../utils.js';
|
|
15
|
+
/**
|
|
16
|
+
* Git instance wrapper with lifecycle management
|
|
17
|
+
*/
|
|
18
|
+
export class ManagedGitInstance {
|
|
19
|
+
repoPath;
|
|
20
|
+
git;
|
|
21
|
+
id;
|
|
22
|
+
type = 'git-instance';
|
|
23
|
+
createdAt;
|
|
24
|
+
lastAccessedAt;
|
|
25
|
+
constructor(repoPath, git) {
|
|
26
|
+
this.repoPath = repoPath;
|
|
27
|
+
this.git = git;
|
|
28
|
+
this.id = `git:${repoPath}`;
|
|
29
|
+
this.createdAt = Date.now();
|
|
30
|
+
this.lastAccessedAt = Date.now();
|
|
31
|
+
}
|
|
32
|
+
/** Get the git instance and update access time */
|
|
33
|
+
getGit() {
|
|
34
|
+
this.lastAccessedAt = Date.now();
|
|
35
|
+
return this.git;
|
|
36
|
+
}
|
|
37
|
+
/** Check if instance is still valid */
|
|
38
|
+
isValid() {
|
|
39
|
+
// Git instances don't expire but can be invalidated
|
|
40
|
+
return this.git !== null;
|
|
41
|
+
}
|
|
42
|
+
/** Cleanup the git instance */
|
|
43
|
+
async cleanup() {
|
|
44
|
+
logger.debug({ repoPath: this.repoPath }, 'Cleaning up git instance');
|
|
45
|
+
// SimpleGit doesn't require explicit cleanup, but we null it out
|
|
46
|
+
this.git = null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// ============================================================================
|
|
50
|
+
// Resource Manager
|
|
51
|
+
// ============================================================================
|
|
52
|
+
/**
|
|
53
|
+
* Centralized resource manager for automatic cleanup
|
|
54
|
+
*/
|
|
55
|
+
export class ResourceManager {
|
|
56
|
+
options;
|
|
57
|
+
resources = new Map();
|
|
58
|
+
cleanupTimer = null;
|
|
59
|
+
shutdownHandlers = [];
|
|
60
|
+
isShuttingDown = false;
|
|
61
|
+
constructor(options = {}) {
|
|
62
|
+
this.options = options;
|
|
63
|
+
const { cleanupIntervalMs = 60000, // 1 minute
|
|
64
|
+
maxIdleTimeMs = 300000, // 5 minutes
|
|
65
|
+
maxResources = 100, } = options;
|
|
66
|
+
// Start periodic cleanup
|
|
67
|
+
this.cleanupTimer = setInterval(() => {
|
|
68
|
+
this.performCleanup(maxIdleTimeMs, maxResources);
|
|
69
|
+
}, cleanupIntervalMs);
|
|
70
|
+
// Register shutdown handler
|
|
71
|
+
this.registerShutdownHandlers();
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Register a resource for management
|
|
75
|
+
*/
|
|
76
|
+
register(resource) {
|
|
77
|
+
if (this.isShuttingDown) {
|
|
78
|
+
logger.warn('Cannot register resource during shutdown');
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
this.resources.set(resource.id, resource);
|
|
82
|
+
logger.debug({ id: resource.id, type: resource.type, totalResources: this.resources.size }, 'Resource registered');
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Unregister and cleanup a resource
|
|
86
|
+
*/
|
|
87
|
+
async unregister(id) {
|
|
88
|
+
const resource = this.resources.get(id);
|
|
89
|
+
if (resource) {
|
|
90
|
+
await this.cleanupResource(resource);
|
|
91
|
+
this.resources.delete(id);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Get a resource by ID
|
|
96
|
+
*/
|
|
97
|
+
get(id) {
|
|
98
|
+
const resource = this.resources.get(id);
|
|
99
|
+
if (resource) {
|
|
100
|
+
resource.lastAccessedAt = Date.now();
|
|
101
|
+
return resource;
|
|
102
|
+
}
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Check if a resource exists
|
|
107
|
+
*/
|
|
108
|
+
has(id) {
|
|
109
|
+
return this.resources.has(id);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get all resources of a specific type
|
|
113
|
+
*/
|
|
114
|
+
getByType(type) {
|
|
115
|
+
const results = [];
|
|
116
|
+
for (const resource of this.resources.values()) {
|
|
117
|
+
if (resource.type === type) {
|
|
118
|
+
results.push(resource);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return results;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Perform periodic cleanup of idle resources
|
|
125
|
+
*/
|
|
126
|
+
async performCleanup(maxIdleTimeMs, maxResources) {
|
|
127
|
+
const now = Date.now();
|
|
128
|
+
const resourcesToCleanup = [];
|
|
129
|
+
// Find resources to cleanup
|
|
130
|
+
for (const resource of this.resources.values()) {
|
|
131
|
+
const idleTime = now - resource.lastAccessedAt;
|
|
132
|
+
// Cleanup invalid or idle resources
|
|
133
|
+
if (!resource.isValid() || idleTime > maxIdleTimeMs) {
|
|
134
|
+
resourcesToCleanup.push(resource);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// If still over limit after idle cleanup, cleanup LRU resources
|
|
138
|
+
if (this.resources.size > maxResources) {
|
|
139
|
+
const sorted = Array.from(this.resources.values())
|
|
140
|
+
.filter((r) => !resourcesToCleanup.includes(r))
|
|
141
|
+
.sort((a, b) => a.lastAccessedAt - b.lastAccessedAt);
|
|
142
|
+
const excess = this.resources.size - maxResources;
|
|
143
|
+
resourcesToCleanup.push(...sorted.slice(0, excess));
|
|
144
|
+
}
|
|
145
|
+
// Cleanup resources
|
|
146
|
+
if (resourcesToCleanup.length > 0) {
|
|
147
|
+
logger.debug({ count: resourcesToCleanup.length, totalResources: this.resources.size }, 'Performing resource cleanup');
|
|
148
|
+
for (const resource of resourcesToCleanup) {
|
|
149
|
+
await this.cleanupResource(resource);
|
|
150
|
+
this.resources.delete(resource.id);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Cleanup a single resource
|
|
156
|
+
*/
|
|
157
|
+
async cleanupResource(resource) {
|
|
158
|
+
try {
|
|
159
|
+
await resource.cleanup();
|
|
160
|
+
logger.debug({ id: resource.id, type: resource.type }, 'Resource cleaned up');
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
logger.error({ error, id: resource.id, type: resource.type }, 'Error cleaning up resource');
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Register a custom shutdown handler
|
|
168
|
+
*/
|
|
169
|
+
onShutdown(handler) {
|
|
170
|
+
this.shutdownHandlers.push(handler);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Graceful shutdown - cleanup all resources
|
|
174
|
+
*/
|
|
175
|
+
async shutdown() {
|
|
176
|
+
if (this.isShuttingDown) {
|
|
177
|
+
logger.warn('Shutdown already in progress');
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
this.isShuttingDown = true;
|
|
181
|
+
logger.info({ resourceCount: this.resources.size }, 'Starting graceful shutdown');
|
|
182
|
+
// Stop cleanup timer
|
|
183
|
+
if (this.cleanupTimer) {
|
|
184
|
+
clearInterval(this.cleanupTimer);
|
|
185
|
+
this.cleanupTimer = null;
|
|
186
|
+
}
|
|
187
|
+
// Run custom shutdown handlers
|
|
188
|
+
for (const handler of this.shutdownHandlers) {
|
|
189
|
+
try {
|
|
190
|
+
await handler();
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
logger.error({ error }, 'Error in shutdown handler');
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Cleanup all resources
|
|
197
|
+
const cleanupPromises = Array.from(this.resources.values()).map((resource) => this.cleanupResource(resource));
|
|
198
|
+
await Promise.allSettled(cleanupPromises);
|
|
199
|
+
this.resources.clear();
|
|
200
|
+
logger.info('Graceful shutdown complete');
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Register signal handlers for graceful shutdown
|
|
204
|
+
*/
|
|
205
|
+
registerShutdownHandlers() {
|
|
206
|
+
const signals = ['SIGINT', 'SIGTERM', 'SIGQUIT'];
|
|
207
|
+
for (const signal of signals) {
|
|
208
|
+
process.once(signal, () => {
|
|
209
|
+
logger.info({ signal }, 'Received shutdown signal');
|
|
210
|
+
this.shutdown()
|
|
211
|
+
.then(() => process.exit(0))
|
|
212
|
+
.catch((error) => {
|
|
213
|
+
logger.error({ error }, 'Error during shutdown');
|
|
214
|
+
process.exit(1);
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
// Handle uncaught errors
|
|
219
|
+
process.once('uncaughtException', (error) => {
|
|
220
|
+
logger.error({ error }, 'Uncaught exception');
|
|
221
|
+
this.shutdown()
|
|
222
|
+
.then(() => process.exit(1))
|
|
223
|
+
.catch(() => process.exit(1));
|
|
224
|
+
});
|
|
225
|
+
process.once('unhandledRejection', (reason) => {
|
|
226
|
+
logger.error({ reason }, 'Unhandled rejection');
|
|
227
|
+
this.shutdown()
|
|
228
|
+
.then(() => process.exit(1))
|
|
229
|
+
.catch(() => process.exit(1));
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Get resource statistics
|
|
234
|
+
*/
|
|
235
|
+
getStats() {
|
|
236
|
+
const byType = {};
|
|
237
|
+
let oldestAge = 0;
|
|
238
|
+
const now = Date.now();
|
|
239
|
+
for (const resource of this.resources.values()) {
|
|
240
|
+
byType[resource.type] = (byType[resource.type] || 0) + 1;
|
|
241
|
+
const age = now - resource.createdAt;
|
|
242
|
+
if (age > oldestAge) {
|
|
243
|
+
oldestAge = age;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return {
|
|
247
|
+
total: this.resources.size,
|
|
248
|
+
byType: byType,
|
|
249
|
+
oldestResourceAge: oldestAge,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// ============================================================================
|
|
254
|
+
// Global Resource Manager
|
|
255
|
+
// ============================================================================
|
|
256
|
+
/** Global resource manager instance */
|
|
257
|
+
export const globalResourceManager = new ResourceManager({
|
|
258
|
+
cleanupIntervalMs: 60000, // 1 minute
|
|
259
|
+
maxIdleTimeMs: 300000, // 5 minutes
|
|
260
|
+
maxResources: 100,
|
|
261
|
+
});
|
|
262
|
+
// ============================================================================
|
|
263
|
+
// Helper Functions
|
|
264
|
+
// ============================================================================
|
|
265
|
+
/**
|
|
266
|
+
* Create a managed resource with automatic cleanup
|
|
267
|
+
*
|
|
268
|
+
* @param create - Function to create the resource
|
|
269
|
+
* @param cleanup - Function to cleanup the resource
|
|
270
|
+
* @param options - Resource options
|
|
271
|
+
* @returns The created resource
|
|
272
|
+
*/
|
|
273
|
+
export async function withManagedResource(create, cleanup, options) {
|
|
274
|
+
const { id, type, autoRegister = true } = options;
|
|
275
|
+
const resource = await create();
|
|
276
|
+
if (autoRegister) {
|
|
277
|
+
const managedResource = {
|
|
278
|
+
id,
|
|
279
|
+
type,
|
|
280
|
+
createdAt: Date.now(),
|
|
281
|
+
lastAccessedAt: Date.now(),
|
|
282
|
+
cleanup: () => cleanup(resource),
|
|
283
|
+
isValid: () => resource !== null && resource !== undefined,
|
|
284
|
+
};
|
|
285
|
+
globalResourceManager.register(managedResource);
|
|
286
|
+
}
|
|
287
|
+
return resource;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Execute a function with automatic resource cleanup
|
|
291
|
+
*
|
|
292
|
+
* @param fn - Function to execute
|
|
293
|
+
* @param resources - Resources to cleanup after execution
|
|
294
|
+
* @returns Result of the function
|
|
295
|
+
*/
|
|
296
|
+
export async function withCleanup(fn, resources) {
|
|
297
|
+
try {
|
|
298
|
+
return await fn();
|
|
299
|
+
}
|
|
300
|
+
finally {
|
|
301
|
+
// Cleanup resources in parallel
|
|
302
|
+
await Promise.allSettled(resources.map((resource) => resource.cleanup()));
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Memory usage monitor
|
|
307
|
+
*/
|
|
308
|
+
export class MemoryMonitor {
|
|
309
|
+
threshold;
|
|
310
|
+
warnings = 0;
|
|
311
|
+
constructor(thresholdMB = 512) {
|
|
312
|
+
this.threshold = thresholdMB * 1024 * 1024; // Convert to bytes
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Check current memory usage
|
|
316
|
+
*/
|
|
317
|
+
check() {
|
|
318
|
+
const usage = process.memoryUsage();
|
|
319
|
+
const isOverThreshold = usage.heapUsed > this.threshold;
|
|
320
|
+
if (isOverThreshold) {
|
|
321
|
+
this.warnings++;
|
|
322
|
+
logger.warn({
|
|
323
|
+
heapUsedMB: Math.round(usage.heapUsed / 1024 / 1024),
|
|
324
|
+
heapTotalMB: Math.round(usage.heapTotal / 1024 / 1024),
|
|
325
|
+
thresholdMB: Math.round(this.threshold / 1024 / 1024),
|
|
326
|
+
warnings: this.warnings,
|
|
327
|
+
}, 'Memory usage exceeds threshold');
|
|
328
|
+
}
|
|
329
|
+
return {
|
|
330
|
+
heapUsed: usage.heapUsed,
|
|
331
|
+
heapTotal: usage.heapTotal,
|
|
332
|
+
external: usage.external,
|
|
333
|
+
rss: usage.rss,
|
|
334
|
+
isOverThreshold,
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Force garbage collection if available
|
|
339
|
+
*/
|
|
340
|
+
forceGC() {
|
|
341
|
+
if (global.gc) {
|
|
342
|
+
global.gc();
|
|
343
|
+
logger.debug('Forced garbage collection');
|
|
344
|
+
return true;
|
|
345
|
+
}
|
|
346
|
+
logger.debug('Garbage collection not available (run with --expose-gc)');
|
|
347
|
+
return false;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
/** Global memory monitor */
|
|
351
|
+
export const globalMemoryMonitor = new MemoryMonitor(512);
|
|
352
|
+
//# sourceMappingURL=resource-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-manager.js","sourceRoot":"","sources":["../../src/tools/resource-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
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
|
+
export interface CodeReviewOptions {
|
|
19
|
+
code: string;
|
|
20
|
+
language: string;
|
|
21
|
+
filePath?: string;
|
|
22
|
+
checkQuality?: boolean;
|
|
23
|
+
checkSecurity?: boolean;
|
|
24
|
+
checkPerformance?: boolean;
|
|
25
|
+
checkArchitecture?: boolean;
|
|
26
|
+
checkTests?: boolean;
|
|
27
|
+
checkDocumentation?: boolean;
|
|
28
|
+
framework?: string;
|
|
29
|
+
teamStandards?: string;
|
|
30
|
+
pullRequestContext?: string;
|
|
31
|
+
changedFiles?: string[];
|
|
32
|
+
}
|
|
33
|
+
export interface CodeReviewResult {
|
|
34
|
+
code: string;
|
|
35
|
+
overallScore: number;
|
|
36
|
+
grades: ReviewGrades;
|
|
37
|
+
findings: ReviewFinding[];
|
|
38
|
+
suggestions: ReviewSuggestion[];
|
|
39
|
+
metrics: QualityMetrics;
|
|
40
|
+
summary: string;
|
|
41
|
+
executionTimeMs: number;
|
|
42
|
+
warnings: string[];
|
|
43
|
+
}
|
|
44
|
+
export interface ReviewGrades {
|
|
45
|
+
quality: Grade;
|
|
46
|
+
security: Grade;
|
|
47
|
+
performance: Grade;
|
|
48
|
+
architecture: Grade;
|
|
49
|
+
tests: Grade;
|
|
50
|
+
documentation: Grade;
|
|
51
|
+
}
|
|
52
|
+
export interface Grade {
|
|
53
|
+
score: number;
|
|
54
|
+
letter: 'A+' | 'A' | 'B' | 'C' | 'D' | 'F';
|
|
55
|
+
issues: number;
|
|
56
|
+
strengths: string[];
|
|
57
|
+
weaknesses: string[];
|
|
58
|
+
}
|
|
59
|
+
export interface ReviewFinding {
|
|
60
|
+
severity: 'blocker' | 'critical' | 'major' | 'minor' | 'info';
|
|
61
|
+
category: ReviewCategory;
|
|
62
|
+
title: string;
|
|
63
|
+
description: string;
|
|
64
|
+
location?: CodeLocation;
|
|
65
|
+
suggestion: string;
|
|
66
|
+
autoFixable: boolean;
|
|
67
|
+
references?: string[];
|
|
68
|
+
}
|
|
69
|
+
export type ReviewCategory = 'correctness' | 'security' | 'performance' | 'maintainability' | 'reliability' | 'architecture' | 'testing' | 'documentation' | 'style' | 'best-practices';
|
|
70
|
+
export interface CodeLocation {
|
|
71
|
+
startLine: number;
|
|
72
|
+
endLine: number;
|
|
73
|
+
snippet?: string;
|
|
74
|
+
}
|
|
75
|
+
export interface ReviewSuggestion {
|
|
76
|
+
priority: 'must' | 'should' | 'consider';
|
|
77
|
+
category: string;
|
|
78
|
+
description: string;
|
|
79
|
+
codeExample?: string;
|
|
80
|
+
rationale: string;
|
|
81
|
+
}
|
|
82
|
+
export interface QualityMetrics {
|
|
83
|
+
totalLines: number;
|
|
84
|
+
codeLines: number;
|
|
85
|
+
commentLines: number;
|
|
86
|
+
blankLines: number;
|
|
87
|
+
commentRatio: number;
|
|
88
|
+
averageComplexity: number;
|
|
89
|
+
duplicatedCodeRatio: number;
|
|
90
|
+
testCoverage?: number;
|
|
91
|
+
documentationCoverage: number;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Comprehensive AI-powered code review
|
|
95
|
+
*/
|
|
96
|
+
export declare function reviewCode(options: CodeReviewOptions): Promise<CodeReviewResult>;
|
|
97
|
+
export default reviewCode;
|
|
98
|
+
//# sourceMappingURL=review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/tools/review.ts"],"names":[],"mappings":"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"}
|