@defai.digital/ax-cli 3.14.14 → 3.14.16
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/.ax-cli/CUSTOM.md +97 -0
- package/.ax-cli/auto-accept-audit.json +1302 -0
- package/.ax-cli/index.json +43 -0
- package/.ax-cli/memory.json +62 -0
- package/.ax-cli/settings.json +39 -0
- package/README.md +47 -2
- package/ax.config.json +304 -0
- package/dist/analyzers/ast/tree-sitter-parser.d.ts +134 -0
- package/dist/analyzers/ast/tree-sitter-parser.js +730 -0
- package/dist/analyzers/ast/tree-sitter-parser.js.map +1 -0
- package/dist/commands/setup.js +108 -0
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/update.js +55 -2
- package/dist/commands/update.js.map +1 -1
- package/dist/mcp/config-detector-v2.d.ts +83 -0
- package/dist/mcp/config-detector-v2.js +328 -0
- package/dist/mcp/config-detector-v2.js.map +1 -0
- package/dist/mcp/config-migrator-v2.d.ts +89 -0
- package/dist/mcp/config-migrator-v2.js +288 -0
- package/dist/mcp/config-migrator-v2.js.map +1 -0
- package/dist/mcp/config-v2.d.ts +111 -0
- package/dist/mcp/config-v2.js +443 -0
- package/dist/mcp/config-v2.js.map +1 -0
- package/dist/mcp/transports-v2.d.ts +152 -0
- package/dist/mcp/transports-v2.js +481 -0
- package/dist/mcp/transports-v2.js.map +1 -0
- package/dist/utils/error-sanitizer.d.ts +119 -0
- package/dist/utils/error-sanitizer.js +253 -0
- package/dist/utils/error-sanitizer.js.map +1 -0
- package/dist/utils/errors.d.ts +74 -0
- package/dist/utils/errors.js +139 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/incremental-analyzer.d.ts +134 -0
- package/dist/utils/incremental-analyzer.js +377 -0
- package/dist/utils/incremental-analyzer.js.map +1 -0
- package/dist/utils/math.d.ts +1 -0
- package/dist/utils/math.js +4 -0
- package/dist/utils/math.js.map +1 -0
- package/dist/utils/settings.d.ts +1 -0
- package/dist/utils/settings.js +4 -0
- package/dist/utils/settings.js.map +1 -0
- package/dist/utils/streaming-analyzer.d.ts +160 -0
- package/dist/utils/streaming-analyzer.js +214 -0
- package/dist/utils/streaming-analyzer.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error Message Sanitization (REQ-SEC-010)
|
|
3
|
+
*
|
|
4
|
+
* Sanitizes error messages to prevent information disclosure
|
|
5
|
+
* Removes:
|
|
6
|
+
* - File system paths
|
|
7
|
+
* - API keys and secrets
|
|
8
|
+
* - Stack traces (for user-facing errors)
|
|
9
|
+
* - Internal implementation details
|
|
10
|
+
*
|
|
11
|
+
* Security: CVSS 6.5 (Medium Priority)
|
|
12
|
+
*/
|
|
13
|
+
import { homedir } from 'os';
|
|
14
|
+
import { getAuditLogger, AuditCategory } from './audit-logger.js';
|
|
15
|
+
/**
|
|
16
|
+
* Patterns to detect and sanitize in error messages
|
|
17
|
+
*/
|
|
18
|
+
const SENSITIVE_PATTERNS = {
|
|
19
|
+
// File paths (Windows and Unix)
|
|
20
|
+
FILE_PATH: /([A-Za-z]:\\|\/)[^\s"'<>|]+/g,
|
|
21
|
+
// API keys and tokens (common formats)
|
|
22
|
+
// Matches patterns like "api_key=XXX", "secret: XXX", "API key: XXX", "bearer XXX"
|
|
23
|
+
API_KEY: /\b(?:api[_ -]?key|token|secret|password|bearer)[\s:=]+['"]?[a-zA-Z0-9_\-]{16,}['"]?/gi,
|
|
24
|
+
// Environment variables
|
|
25
|
+
ENV_VAR: /\$\{?[A-Z_][A-Z0-9_]*\}?/g,
|
|
26
|
+
// IP addresses (for SSRF protection)
|
|
27
|
+
IP_ADDRESS: /\b(?:\d{1,3}\.){3}\d{1,3}\b/g,
|
|
28
|
+
// URLs with credentials
|
|
29
|
+
URL_WITH_CREDS: /https?:\/\/[^:]+:[^@]+@[^\s]+/g,
|
|
30
|
+
// Stack trace lines
|
|
31
|
+
STACK_TRACE_LINE: /^\s*at\s+.+\(.+:\d+:\d+\)$/gm,
|
|
32
|
+
// Home directory references
|
|
33
|
+
HOME_DIR: new RegExp(homedir().replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g'),
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Replacement strings for sanitized content
|
|
37
|
+
*/
|
|
38
|
+
const REPLACEMENTS = {
|
|
39
|
+
FILE_PATH: '[REDACTED_PATH]',
|
|
40
|
+
API_KEY: '[REDACTED_KEY]',
|
|
41
|
+
ENV_VAR: '[REDACTED_ENV]',
|
|
42
|
+
IP_ADDRESS: '[REDACTED_IP]',
|
|
43
|
+
URL_WITH_CREDS: '[REDACTED_URL]',
|
|
44
|
+
STACK_TRACE_LINE: '',
|
|
45
|
+
HOME_DIR: '[USER_HOME]',
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Error categories for user-friendly messages
|
|
49
|
+
*/
|
|
50
|
+
export var ErrorCategory;
|
|
51
|
+
(function (ErrorCategory) {
|
|
52
|
+
ErrorCategory["NETWORK"] = "NETWORK";
|
|
53
|
+
ErrorCategory["FILE_SYSTEM"] = "FILE_SYSTEM";
|
|
54
|
+
ErrorCategory["VALIDATION"] = "VALIDATION";
|
|
55
|
+
ErrorCategory["AUTHENTICATION"] = "AUTHENTICATION";
|
|
56
|
+
ErrorCategory["RATE_LIMIT"] = "RATE_LIMIT";
|
|
57
|
+
ErrorCategory["API_ERROR"] = "API_ERROR";
|
|
58
|
+
ErrorCategory["INTERNAL"] = "INTERNAL";
|
|
59
|
+
ErrorCategory["USER_INPUT"] = "USER_INPUT";
|
|
60
|
+
})(ErrorCategory || (ErrorCategory = {}));
|
|
61
|
+
/**
|
|
62
|
+
* Sanitize error message by removing sensitive information
|
|
63
|
+
*
|
|
64
|
+
* @param message - Raw error message
|
|
65
|
+
* @returns Sanitized message safe for user display
|
|
66
|
+
*/
|
|
67
|
+
export function sanitizeErrorMessage(message) {
|
|
68
|
+
let sanitized = message;
|
|
69
|
+
// Remove URLs with credentials first (before FILE_PATH catches them)
|
|
70
|
+
sanitized = sanitized.replace(SENSITIVE_PATTERNS.URL_WITH_CREDS, REPLACEMENTS.URL_WITH_CREDS);
|
|
71
|
+
// Remove home directory references (before FILE_PATH catches them)
|
|
72
|
+
sanitized = sanitized.replace(SENSITIVE_PATTERNS.HOME_DIR, REPLACEMENTS.HOME_DIR);
|
|
73
|
+
// Remove file paths
|
|
74
|
+
sanitized = sanitized.replace(SENSITIVE_PATTERNS.FILE_PATH, REPLACEMENTS.FILE_PATH);
|
|
75
|
+
// Remove API keys and secrets
|
|
76
|
+
sanitized = sanitized.replace(SENSITIVE_PATTERNS.API_KEY, REPLACEMENTS.API_KEY);
|
|
77
|
+
// Remove environment variables
|
|
78
|
+
sanitized = sanitized.replace(SENSITIVE_PATTERNS.ENV_VAR, REPLACEMENTS.ENV_VAR);
|
|
79
|
+
// Remove IP addresses
|
|
80
|
+
sanitized = sanitized.replace(SENSITIVE_PATTERNS.IP_ADDRESS, REPLACEMENTS.IP_ADDRESS);
|
|
81
|
+
return sanitized;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Sanitize stack trace by removing sensitive paths
|
|
85
|
+
*
|
|
86
|
+
* @param stack - Raw stack trace
|
|
87
|
+
* @returns Sanitized stack trace
|
|
88
|
+
*/
|
|
89
|
+
export function sanitizeStackTrace(stack) {
|
|
90
|
+
let sanitized = stack;
|
|
91
|
+
// Remove home directory references first
|
|
92
|
+
sanitized = sanitized.replace(SENSITIVE_PATTERNS.HOME_DIR, REPLACEMENTS.HOME_DIR);
|
|
93
|
+
// Remove file paths from stack frames
|
|
94
|
+
sanitized = sanitized.replace(SENSITIVE_PATTERNS.FILE_PATH, REPLACEMENTS.FILE_PATH);
|
|
95
|
+
return sanitized;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Remove stack trace entirely (for user-facing errors)
|
|
99
|
+
*
|
|
100
|
+
* @param message - Error message with potential stack trace
|
|
101
|
+
* @returns Message without stack trace
|
|
102
|
+
*/
|
|
103
|
+
export function removeStackTrace(message) {
|
|
104
|
+
// Split at first "at " (stack trace start)
|
|
105
|
+
const parts = message.split(/\n\s*at\s+/);
|
|
106
|
+
return parts[0].trim();
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Categorize error and create user-friendly message
|
|
110
|
+
*
|
|
111
|
+
* @param error - Error object
|
|
112
|
+
* @returns Sanitized error with category and suggestion
|
|
113
|
+
*/
|
|
114
|
+
export function sanitizeError(error) {
|
|
115
|
+
const errorObj = error instanceof Error ? error : new Error(String(error));
|
|
116
|
+
const message = errorObj.message;
|
|
117
|
+
// Sanitize the message
|
|
118
|
+
const sanitizedMessage = sanitizeErrorMessage(removeStackTrace(message));
|
|
119
|
+
// Determine category and suggestion
|
|
120
|
+
let category = ErrorCategory.INTERNAL;
|
|
121
|
+
let suggestion;
|
|
122
|
+
let code;
|
|
123
|
+
// Network errors
|
|
124
|
+
if (message.includes('ENOTFOUND') || message.includes('ECONNREFUSED') || message.includes('fetch failed')) {
|
|
125
|
+
category = ErrorCategory.NETWORK;
|
|
126
|
+
suggestion = 'Check your network connection and try again.';
|
|
127
|
+
code = 'ERR_NETWORK';
|
|
128
|
+
}
|
|
129
|
+
// File system errors
|
|
130
|
+
else if (message.includes('ENOENT') || message.includes('EACCES') || message.includes('EPERM')) {
|
|
131
|
+
category = ErrorCategory.FILE_SYSTEM;
|
|
132
|
+
suggestion = 'Check that the file exists and you have permission to access it.';
|
|
133
|
+
code = 'ERR_FILE_SYSTEM';
|
|
134
|
+
}
|
|
135
|
+
// Validation errors
|
|
136
|
+
else if (message.includes('validation') || message.includes('invalid') || message.includes('required')) {
|
|
137
|
+
category = ErrorCategory.VALIDATION;
|
|
138
|
+
suggestion = 'Check your input and try again.';
|
|
139
|
+
code = 'ERR_VALIDATION';
|
|
140
|
+
}
|
|
141
|
+
// Authentication errors
|
|
142
|
+
else if (message.includes('unauthorized') || message.includes('authentication') || message.includes('API key')) {
|
|
143
|
+
category = ErrorCategory.AUTHENTICATION;
|
|
144
|
+
suggestion = 'Check your API key configuration.';
|
|
145
|
+
code = 'ERR_AUTH';
|
|
146
|
+
}
|
|
147
|
+
// Rate limit errors
|
|
148
|
+
else if (message.includes('rate limit') || message.includes('too many requests')) {
|
|
149
|
+
category = ErrorCategory.RATE_LIMIT;
|
|
150
|
+
suggestion = 'Please wait a moment before trying again.';
|
|
151
|
+
code = 'ERR_RATE_LIMIT';
|
|
152
|
+
}
|
|
153
|
+
// API errors
|
|
154
|
+
else if (message.includes('API') || message.includes('status code')) {
|
|
155
|
+
category = ErrorCategory.API_ERROR;
|
|
156
|
+
suggestion = 'The API returned an error. Please try again later.';
|
|
157
|
+
code = 'ERR_API';
|
|
158
|
+
}
|
|
159
|
+
// REQ-SEC-008: Audit log errors with sensitive info detection
|
|
160
|
+
if (message !== sanitizedMessage) {
|
|
161
|
+
const auditLogger = getAuditLogger();
|
|
162
|
+
auditLogger.logWarning({
|
|
163
|
+
category: AuditCategory.SYSTEM_EVENT,
|
|
164
|
+
action: 'sensitive_data_in_error',
|
|
165
|
+
outcome: 'success',
|
|
166
|
+
details: {
|
|
167
|
+
category,
|
|
168
|
+
sanitized: true,
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
message: sanitizedMessage,
|
|
174
|
+
code,
|
|
175
|
+
category,
|
|
176
|
+
suggestion,
|
|
177
|
+
originalError: errorObj,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Format sanitized error for user display
|
|
182
|
+
*
|
|
183
|
+
* @param sanitizedError - Sanitized error object
|
|
184
|
+
* @returns Formatted error message
|
|
185
|
+
*/
|
|
186
|
+
export function formatUserError(sanitizedError) {
|
|
187
|
+
const parts = [];
|
|
188
|
+
if (sanitizedError.code) {
|
|
189
|
+
parts.push(`[${sanitizedError.code}]`);
|
|
190
|
+
}
|
|
191
|
+
parts.push(sanitizedError.message);
|
|
192
|
+
if (sanitizedError.suggestion) {
|
|
193
|
+
parts.push(`\nℹ️ ${sanitizedError.suggestion}`);
|
|
194
|
+
}
|
|
195
|
+
return parts.join(' ');
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Create internal log message with full details (not sanitized)
|
|
199
|
+
*
|
|
200
|
+
* @param error - Original error
|
|
201
|
+
* @param context - Additional context
|
|
202
|
+
* @returns Detailed log message
|
|
203
|
+
*/
|
|
204
|
+
export function createInternalLogMessage(error, context) {
|
|
205
|
+
const errorObj = error instanceof Error ? error : new Error(String(error));
|
|
206
|
+
const parts = [
|
|
207
|
+
`Error: ${errorObj.message}`,
|
|
208
|
+
];
|
|
209
|
+
if (errorObj.stack) {
|
|
210
|
+
parts.push(`Stack: ${sanitizeStackTrace(errorObj.stack)}`);
|
|
211
|
+
}
|
|
212
|
+
if (context) {
|
|
213
|
+
parts.push(`Context: ${JSON.stringify(context, null, 2)}`);
|
|
214
|
+
}
|
|
215
|
+
return parts.join('\n');
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Safe error wrapper for user-facing operations
|
|
219
|
+
*
|
|
220
|
+
* @param operation - Async operation to execute
|
|
221
|
+
* @param errorHandler - Optional custom error handler
|
|
222
|
+
* @returns Result or sanitized error
|
|
223
|
+
*
|
|
224
|
+
* @example
|
|
225
|
+
* ```typescript
|
|
226
|
+
* const result = await safeExecute(
|
|
227
|
+
* () => riskyOperation(),
|
|
228
|
+
* (error) => console.error('Internal error:', error)
|
|
229
|
+
* );
|
|
230
|
+
*
|
|
231
|
+
* if (!result.success) {
|
|
232
|
+
* console.log(formatUserError(result.error));
|
|
233
|
+
* }
|
|
234
|
+
* ```
|
|
235
|
+
*/
|
|
236
|
+
export async function safeExecute(operation, errorHandler) {
|
|
237
|
+
try {
|
|
238
|
+
const data = await operation();
|
|
239
|
+
return { success: true, data };
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
const sanitized = sanitizeError(error);
|
|
243
|
+
// Log internal error details
|
|
244
|
+
if (errorHandler) {
|
|
245
|
+
errorHandler(sanitized.originalError, sanitized);
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
console.error(createInternalLogMessage(error));
|
|
249
|
+
}
|
|
250
|
+
return { success: false, error: sanitized };
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=error-sanitizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-sanitizer.js","sourceRoot":"","sources":["../../src/utils/error-sanitizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed Error Classes
|
|
3
|
+
* Provides consistent, categorized error handling across the application
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Base error class for AX CLI errors
|
|
7
|
+
*/
|
|
8
|
+
export declare class AxCliError extends Error {
|
|
9
|
+
readonly category: string;
|
|
10
|
+
readonly details?: unknown | undefined;
|
|
11
|
+
constructor(message: string, category: string, details?: unknown | undefined);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Configuration-related errors (YAML, settings, etc.)
|
|
15
|
+
*/
|
|
16
|
+
export declare class ConfigurationError extends AxCliError {
|
|
17
|
+
constructor(message: string, details?: unknown);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Validation errors (Zod, schema, input validation)
|
|
21
|
+
*/
|
|
22
|
+
export declare class ValidationError extends AxCliError {
|
|
23
|
+
constructor(message: string, details?: unknown);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* File system operation errors
|
|
27
|
+
*/
|
|
28
|
+
export declare class FileSystemError extends AxCliError {
|
|
29
|
+
readonly filePath?: string | undefined;
|
|
30
|
+
constructor(message: string, filePath?: string | undefined, details?: unknown);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Network/API errors
|
|
34
|
+
*/
|
|
35
|
+
export declare class NetworkError extends AxCliError {
|
|
36
|
+
readonly statusCode?: number | undefined;
|
|
37
|
+
constructor(message: string, statusCode?: number | undefined, details?: unknown);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* MCP (Model Context Protocol) errors
|
|
41
|
+
*/
|
|
42
|
+
export declare class MCPError extends AxCliError {
|
|
43
|
+
readonly serverName?: string | undefined;
|
|
44
|
+
constructor(message: string, serverName?: string | undefined, details?: unknown);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Tool execution errors
|
|
48
|
+
*/
|
|
49
|
+
export declare class ToolExecutionError extends AxCliError {
|
|
50
|
+
readonly toolName?: string | undefined;
|
|
51
|
+
constructor(message: string, toolName?: string | undefined, details?: unknown);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Authentication/Authorization errors
|
|
55
|
+
*/
|
|
56
|
+
export declare class AuthenticationError extends AxCliError {
|
|
57
|
+
constructor(message: string, details?: unknown);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Type guard to check if error is an AxCliError
|
|
61
|
+
*/
|
|
62
|
+
export declare function isAxCliError(error: unknown): error is AxCliError;
|
|
63
|
+
/**
|
|
64
|
+
* Extract user-friendly error message from any error type
|
|
65
|
+
*/
|
|
66
|
+
export declare function getErrorMessage(error: unknown): string;
|
|
67
|
+
/**
|
|
68
|
+
* Format error for logging with details
|
|
69
|
+
*/
|
|
70
|
+
export declare function formatErrorForLogging(error: unknown): string;
|
|
71
|
+
/**
|
|
72
|
+
* Wrap any error in an appropriate AxCliError
|
|
73
|
+
*/
|
|
74
|
+
export declare function wrapError(error: unknown, category: string, context?: string): AxCliError;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed Error Classes
|
|
3
|
+
* Provides consistent, categorized error handling across the application
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Base error class for AX CLI errors
|
|
7
|
+
*/
|
|
8
|
+
export class AxCliError extends Error {
|
|
9
|
+
category;
|
|
10
|
+
details;
|
|
11
|
+
constructor(message, category, details) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.category = category;
|
|
14
|
+
this.details = details;
|
|
15
|
+
this.name = 'AxCliError';
|
|
16
|
+
Error.captureStackTrace(this, this.constructor);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Configuration-related errors (YAML, settings, etc.)
|
|
21
|
+
*/
|
|
22
|
+
export class ConfigurationError extends AxCliError {
|
|
23
|
+
constructor(message, details) {
|
|
24
|
+
super(message, 'Configuration', details);
|
|
25
|
+
this.name = 'ConfigurationError';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Validation errors (Zod, schema, input validation)
|
|
30
|
+
*/
|
|
31
|
+
export class ValidationError extends AxCliError {
|
|
32
|
+
constructor(message, details) {
|
|
33
|
+
super(message, 'Validation', details);
|
|
34
|
+
this.name = 'ValidationError';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* File system operation errors
|
|
39
|
+
*/
|
|
40
|
+
export class FileSystemError extends AxCliError {
|
|
41
|
+
filePath;
|
|
42
|
+
constructor(message, filePath, details) {
|
|
43
|
+
super(message, 'FileSystem', details);
|
|
44
|
+
this.filePath = filePath;
|
|
45
|
+
this.name = 'FileSystemError';
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Network/API errors
|
|
50
|
+
*/
|
|
51
|
+
export class NetworkError extends AxCliError {
|
|
52
|
+
statusCode;
|
|
53
|
+
constructor(message, statusCode, details) {
|
|
54
|
+
super(message, 'Network', details);
|
|
55
|
+
this.statusCode = statusCode;
|
|
56
|
+
this.name = 'NetworkError';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* MCP (Model Context Protocol) errors
|
|
61
|
+
*/
|
|
62
|
+
export class MCPError extends AxCliError {
|
|
63
|
+
serverName;
|
|
64
|
+
constructor(message, serverName, details) {
|
|
65
|
+
super(message, 'MCP', details);
|
|
66
|
+
this.serverName = serverName;
|
|
67
|
+
this.name = 'MCPError';
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Tool execution errors
|
|
72
|
+
*/
|
|
73
|
+
export class ToolExecutionError extends AxCliError {
|
|
74
|
+
toolName;
|
|
75
|
+
constructor(message, toolName, details) {
|
|
76
|
+
super(message, 'ToolExecution', details);
|
|
77
|
+
this.toolName = toolName;
|
|
78
|
+
this.name = 'ToolExecutionError';
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Authentication/Authorization errors
|
|
83
|
+
*/
|
|
84
|
+
export class AuthenticationError extends AxCliError {
|
|
85
|
+
constructor(message, details) {
|
|
86
|
+
super(message, 'Authentication', details);
|
|
87
|
+
this.name = 'AuthenticationError';
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Type guard to check if error is an AxCliError
|
|
92
|
+
*/
|
|
93
|
+
export function isAxCliError(error) {
|
|
94
|
+
return error instanceof AxCliError;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Extract user-friendly error message from any error type
|
|
98
|
+
*/
|
|
99
|
+
export function getErrorMessage(error) {
|
|
100
|
+
if (error instanceof AxCliError) {
|
|
101
|
+
return error.message;
|
|
102
|
+
}
|
|
103
|
+
if (error instanceof Error) {
|
|
104
|
+
return error.message;
|
|
105
|
+
}
|
|
106
|
+
if (typeof error === 'string') {
|
|
107
|
+
return error;
|
|
108
|
+
}
|
|
109
|
+
return 'An unknown error occurred';
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Format error for logging with details
|
|
113
|
+
*/
|
|
114
|
+
export function formatErrorForLogging(error) {
|
|
115
|
+
if (error instanceof AxCliError) {
|
|
116
|
+
let message = `[${error.category}] ${error.message}`;
|
|
117
|
+
if (error.details) {
|
|
118
|
+
message += `\nDetails: ${JSON.stringify(error.details, null, 2)}`;
|
|
119
|
+
}
|
|
120
|
+
if (error.stack) {
|
|
121
|
+
message += `\nStack: ${error.stack}`;
|
|
122
|
+
}
|
|
123
|
+
return message;
|
|
124
|
+
}
|
|
125
|
+
if (error instanceof Error) {
|
|
126
|
+
return error.stack || error.message;
|
|
127
|
+
}
|
|
128
|
+
return String(error);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Wrap any error in an appropriate AxCliError
|
|
132
|
+
*/
|
|
133
|
+
export function wrapError(error, category, context) {
|
|
134
|
+
const message = context
|
|
135
|
+
? `${context}: ${getErrorMessage(error)}`
|
|
136
|
+
: getErrorMessage(error);
|
|
137
|
+
return new AxCliError(message, category, error);
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Incremental Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Analyzes only changed files and their dependencies using git integration.
|
|
5
|
+
* Provides 10-50x speedup by avoiding analysis of unchanged files.
|
|
6
|
+
*
|
|
7
|
+
* Quick Win #2: Git-Based Incremental Analysis (Est. time: 1 hour)
|
|
8
|
+
* Impact: 10-50x reduction in files to analyze
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Configuration for incremental analysis
|
|
12
|
+
*/
|
|
13
|
+
export interface IncrementalConfig {
|
|
14
|
+
/** Base directory for git operations (default: cwd) */
|
|
15
|
+
baseDir?: string;
|
|
16
|
+
/** File patterns to include (default: all) */
|
|
17
|
+
include?: string[];
|
|
18
|
+
/** File patterns to exclude (default: none) */
|
|
19
|
+
exclude?: string[];
|
|
20
|
+
/** Compare against specific commit/branch (default: HEAD) */
|
|
21
|
+
compareWith?: string;
|
|
22
|
+
/** Include untracked files (default: true) */
|
|
23
|
+
includeUntracked?: boolean;
|
|
24
|
+
/** Build dependency graph (default: false, for future use) */
|
|
25
|
+
trackDependencies?: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Changed file info
|
|
29
|
+
*/
|
|
30
|
+
export interface ChangedFile {
|
|
31
|
+
/** File path relative to base directory */
|
|
32
|
+
path: string;
|
|
33
|
+
/** Type of change */
|
|
34
|
+
status: 'modified' | 'added' | 'deleted' | 'renamed' | 'untracked';
|
|
35
|
+
/** Previous path (for renamed files) */
|
|
36
|
+
oldPath?: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Result of incremental analysis
|
|
40
|
+
*/
|
|
41
|
+
export interface IncrementalResult {
|
|
42
|
+
/** Files that need analysis */
|
|
43
|
+
filesToAnalyze: string[];
|
|
44
|
+
/** Files that are cached */
|
|
45
|
+
cachedFiles: string[];
|
|
46
|
+
/** Changed files detected */
|
|
47
|
+
changedFiles: ChangedFile[];
|
|
48
|
+
/** Total files in project */
|
|
49
|
+
totalFiles: number;
|
|
50
|
+
/** Estimated speedup */
|
|
51
|
+
speedup: number;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Check if directory is a git repository
|
|
55
|
+
*/
|
|
56
|
+
export declare function isGitRepo(dir?: string): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Get changed files from git
|
|
59
|
+
*
|
|
60
|
+
* @param config - Configuration options
|
|
61
|
+
* @returns Array of changed files
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```typescript
|
|
65
|
+
* const changed = await getChangedFiles({
|
|
66
|
+
* compareWith: 'main',
|
|
67
|
+
* include: ['*.ts', '*.tsx'],
|
|
68
|
+
* });
|
|
69
|
+
*
|
|
70
|
+
* console.log(`${changed.length} files changed`);
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export declare function getChangedFiles(config?: IncrementalConfig): Promise<ChangedFile[]>;
|
|
74
|
+
/**
|
|
75
|
+
* Get files to analyze incrementally
|
|
76
|
+
*
|
|
77
|
+
* Returns only files that need analysis based on git changes.
|
|
78
|
+
*
|
|
79
|
+
* @param allFiles - All files in project
|
|
80
|
+
* @param config - Configuration options
|
|
81
|
+
* @returns Incremental analysis result
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```typescript
|
|
85
|
+
* const allFiles = await glob('src/** /*.ts');
|
|
86
|
+
* const result = await getFilesToAnalyze(allFiles);
|
|
87
|
+
*
|
|
88
|
+
* console.log(`Analyzing ${result.filesToAnalyze.length} of ${result.totalFiles} files`);
|
|
89
|
+
* console.log(`Speedup: ${result.speedup.toFixed(1)}x`);
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
export declare function getFilesToAnalyze(allFiles: string[], config?: IncrementalConfig): Promise<IncrementalResult>;
|
|
93
|
+
/**
|
|
94
|
+
* Get git repository info
|
|
95
|
+
*
|
|
96
|
+
* @param baseDir - Base directory (default: cwd)
|
|
97
|
+
* @returns Repository information
|
|
98
|
+
*/
|
|
99
|
+
export declare function getGitInfo(baseDir?: string): {
|
|
100
|
+
branch: string;
|
|
101
|
+
commit: string;
|
|
102
|
+
isDirty: boolean;
|
|
103
|
+
ahead: number;
|
|
104
|
+
behind: number;
|
|
105
|
+
} | null;
|
|
106
|
+
/**
|
|
107
|
+
* Simple dependency tracker (for future use)
|
|
108
|
+
*
|
|
109
|
+
* Parses import/require statements to build a dependency graph.
|
|
110
|
+
*/
|
|
111
|
+
export declare class DependencyTracker {
|
|
112
|
+
private graph;
|
|
113
|
+
private reverseGraph;
|
|
114
|
+
/**
|
|
115
|
+
* Add a file and its dependencies
|
|
116
|
+
*/
|
|
117
|
+
addFile(filePath: string): Promise<void>;
|
|
118
|
+
/**
|
|
119
|
+
* Get files that depend on the given file
|
|
120
|
+
*/
|
|
121
|
+
getDependents(filePath: string): string[];
|
|
122
|
+
/**
|
|
123
|
+
* Get all affected files (transitive dependencies)
|
|
124
|
+
*/
|
|
125
|
+
getAffectedFiles(changedFiles: string[]): string[];
|
|
126
|
+
/**
|
|
127
|
+
* Parse import statements from file content
|
|
128
|
+
*/
|
|
129
|
+
private parseImports;
|
|
130
|
+
/**
|
|
131
|
+
* Resolve import path to absolute path
|
|
132
|
+
*/
|
|
133
|
+
private resolveImport;
|
|
134
|
+
}
|