@defai.digital/ax-cli 2.5.2 → 2.6.4

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 (54) hide show
  1. package/config/settings.yaml +28 -0
  2. package/dist/agent/context-manager.js +8 -6
  3. package/dist/agent/context-manager.js.map +1 -1
  4. package/dist/agent/llm-agent.js +19 -10
  5. package/dist/agent/llm-agent.js.map +1 -1
  6. package/dist/commands/cache.d.ts +7 -0
  7. package/dist/commands/cache.js +270 -0
  8. package/dist/commands/cache.js.map +1 -0
  9. package/dist/commands/mcp.js +6 -5
  10. package/dist/commands/mcp.js.map +1 -1
  11. package/dist/commands/memory.js.map +1 -1
  12. package/dist/constants.d.ts +2 -0
  13. package/dist/constants.js +2 -0
  14. package/dist/constants.js.map +1 -1
  15. package/dist/index.js +3 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/llm/client.d.ts +1 -1
  18. package/dist/llm/types.d.ts +9 -0
  19. package/dist/llm/types.js.map +1 -1
  20. package/dist/mcp/transports.js +4 -2
  21. package/dist/mcp/transports.js.map +1 -1
  22. package/dist/schemas/api-schemas.js +1 -0
  23. package/dist/schemas/api-schemas.js.map +1 -1
  24. package/dist/schemas/yaml-schemas.d.ts +10 -0
  25. package/dist/schemas/yaml-schemas.js +2 -0
  26. package/dist/schemas/yaml-schemas.js.map +1 -1
  27. package/dist/tools/bash.js +16 -3
  28. package/dist/tools/bash.js.map +1 -1
  29. package/dist/tools/text-editor.js +8 -5
  30. package/dist/tools/text-editor.js.map +1 -1
  31. package/dist/types/index.d.ts +2 -2
  32. package/dist/ui/components/chat-interface.js +27 -15
  33. package/dist/ui/components/chat-interface.js.map +1 -1
  34. package/dist/utils/config-loader.d.ts +2 -0
  35. package/dist/utils/config-loader.js.map +1 -1
  36. package/dist/utils/file-cache.d.ts +144 -0
  37. package/dist/utils/file-cache.js +412 -0
  38. package/dist/utils/file-cache.js.map +1 -0
  39. package/dist/utils/incremental-analyzer.d.ts +134 -0
  40. package/dist/utils/incremental-analyzer.js +361 -0
  41. package/dist/utils/incremental-analyzer.js.map +1 -0
  42. package/dist/utils/message-optimizer.d.ts +99 -0
  43. package/dist/utils/message-optimizer.js +291 -0
  44. package/dist/utils/message-optimizer.js.map +1 -0
  45. package/dist/utils/parallel-analyzer.d.ts +123 -0
  46. package/dist/utils/parallel-analyzer.js +228 -0
  47. package/dist/utils/parallel-analyzer.js.map +1 -0
  48. package/dist/utils/streaming-analyzer.d.ts +171 -0
  49. package/dist/utils/streaming-analyzer.js +248 -0
  50. package/dist/utils/streaming-analyzer.js.map +1 -0
  51. package/dist/utils/token-counter.d.ts +2 -5
  52. package/dist/utils/token-counter.js +12 -3
  53. package/dist/utils/token-counter.js.map +1 -1
  54. package/package.json +1 -1
@@ -0,0 +1,361 @@
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
+ import { execSync } from 'child_process';
11
+ import { existsSync } from 'fs';
12
+ import { resolve, dirname, join } from 'path';
13
+ import { readFile } from 'fs/promises';
14
+ /**
15
+ * Check if directory is a git repository
16
+ */
17
+ export function isGitRepo(dir = process.cwd()) {
18
+ try {
19
+ execSync('git rev-parse --git-dir', {
20
+ cwd: dir,
21
+ stdio: 'ignore',
22
+ });
23
+ return true;
24
+ }
25
+ catch {
26
+ return false;
27
+ }
28
+ }
29
+ /**
30
+ * Get changed files from git
31
+ *
32
+ * @param config - Configuration options
33
+ * @returns Array of changed files
34
+ *
35
+ * @example
36
+ * ```typescript
37
+ * const changed = await getChangedFiles({
38
+ * compareWith: 'main',
39
+ * include: ['*.ts', '*.tsx'],
40
+ * });
41
+ *
42
+ * console.log(`${changed.length} files changed`);
43
+ * ```
44
+ */
45
+ export async function getChangedFiles(config = {}) {
46
+ const baseDir = config.baseDir || process.cwd();
47
+ // Check if git repo
48
+ if (!isGitRepo(baseDir)) {
49
+ throw new Error('Not a git repository');
50
+ }
51
+ const changedFiles = [];
52
+ try {
53
+ // Get staged and unstaged changes
54
+ const statusOutput = execSync(`git status --porcelain ${config.includeUntracked ? '--untracked-files=all' : '--untracked-files=no'}`, {
55
+ cwd: baseDir,
56
+ encoding: 'utf-8',
57
+ });
58
+ // Parse git status output
59
+ for (const line of statusOutput.split('\n')) {
60
+ if (!line.trim())
61
+ continue;
62
+ const status = line.substring(0, 2);
63
+ const filePath = line.substring(3);
64
+ // Parse status codes
65
+ let changeType;
66
+ if (status.includes('M')) {
67
+ changeType = 'modified';
68
+ }
69
+ else if (status.includes('A')) {
70
+ changeType = 'added';
71
+ }
72
+ else if (status.includes('D')) {
73
+ changeType = 'deleted';
74
+ }
75
+ else if (status.includes('R')) {
76
+ changeType = 'renamed';
77
+ }
78
+ else if (status.includes('?')) {
79
+ changeType = 'untracked';
80
+ }
81
+ else {
82
+ continue;
83
+ }
84
+ // Apply filters
85
+ if (config.include && config.include.length > 0) {
86
+ const matches = config.include.some((pattern) => new RegExp(pattern.replace(/\*/g, '.*')).test(filePath));
87
+ if (!matches)
88
+ continue;
89
+ }
90
+ if (config.exclude && config.exclude.length > 0) {
91
+ const excluded = config.exclude.some((pattern) => new RegExp(pattern.replace(/\*/g, '.*')).test(filePath));
92
+ if (excluded)
93
+ continue;
94
+ }
95
+ changedFiles.push({
96
+ path: filePath,
97
+ status: changeType,
98
+ });
99
+ }
100
+ // Get diff against specific commit/branch if specified
101
+ if (config.compareWith) {
102
+ const diffOutput = execSync(`git diff --name-status ${config.compareWith}...HEAD`, {
103
+ cwd: baseDir,
104
+ encoding: 'utf-8',
105
+ });
106
+ for (const line of diffOutput.split('\n')) {
107
+ if (!line.trim())
108
+ continue;
109
+ const [status, ...paths] = line.split('\t');
110
+ const filePath = paths[0];
111
+ // Skip if already in changed files
112
+ if (changedFiles.some((f) => f.path === filePath)) {
113
+ continue;
114
+ }
115
+ let changeType;
116
+ if (status === 'M') {
117
+ changeType = 'modified';
118
+ }
119
+ else if (status === 'A') {
120
+ changeType = 'added';
121
+ }
122
+ else if (status === 'D') {
123
+ changeType = 'deleted';
124
+ }
125
+ else if (status.startsWith('R')) {
126
+ changeType = 'renamed';
127
+ }
128
+ else {
129
+ continue;
130
+ }
131
+ changedFiles.push({
132
+ path: filePath,
133
+ status: changeType,
134
+ oldPath: paths.length > 1 ? paths[1] : undefined,
135
+ });
136
+ }
137
+ }
138
+ }
139
+ catch (error) {
140
+ throw new Error(`Failed to get changed files: ${error.message}`);
141
+ }
142
+ return changedFiles;
143
+ }
144
+ /**
145
+ * Get files to analyze incrementally
146
+ *
147
+ * Returns only files that need analysis based on git changes.
148
+ *
149
+ * @param allFiles - All files in project
150
+ * @param config - Configuration options
151
+ * @returns Incremental analysis result
152
+ *
153
+ * @example
154
+ * ```typescript
155
+ * const allFiles = await glob('src/** /*.ts');
156
+ * const result = await getFilesToAnalyze(allFiles);
157
+ *
158
+ * console.log(`Analyzing ${result.filesToAnalyze.length} of ${result.totalFiles} files`);
159
+ * console.log(`Speedup: ${result.speedup.toFixed(1)}x`);
160
+ * ```
161
+ */
162
+ export async function getFilesToAnalyze(allFiles, config = {}) {
163
+ const baseDir = config.baseDir || process.cwd();
164
+ // Check if git repo
165
+ if (!isGitRepo(baseDir)) {
166
+ // Not a git repo - analyze all files
167
+ return {
168
+ filesToAnalyze: allFiles,
169
+ cachedFiles: [],
170
+ changedFiles: [],
171
+ totalFiles: allFiles.length,
172
+ speedup: 1.0,
173
+ };
174
+ }
175
+ // Get changed files
176
+ const changedFiles = await getChangedFiles(config);
177
+ if (changedFiles.length === 0) {
178
+ // No changes - all files can use cache
179
+ return {
180
+ filesToAnalyze: [],
181
+ cachedFiles: allFiles,
182
+ changedFiles: [],
183
+ totalFiles: allFiles.length,
184
+ speedup: allFiles.length > 0 ? Infinity : 1.0,
185
+ };
186
+ }
187
+ // Convert changed file paths to absolute paths
188
+ const changedPaths = new Set(changedFiles.map((f) => resolve(baseDir, f.path)));
189
+ // Filter all files to only those that changed
190
+ const filesToAnalyze = allFiles.filter((file) => {
191
+ const absPath = resolve(file);
192
+ return changedPaths.has(absPath);
193
+ });
194
+ const cachedFiles = allFiles.filter((file) => {
195
+ const absPath = resolve(file);
196
+ return !changedPaths.has(absPath);
197
+ });
198
+ const speedup = allFiles.length / Math.max(filesToAnalyze.length, 1);
199
+ return {
200
+ filesToAnalyze,
201
+ cachedFiles,
202
+ changedFiles,
203
+ totalFiles: allFiles.length,
204
+ speedup,
205
+ };
206
+ }
207
+ /**
208
+ * Get git repository info
209
+ *
210
+ * @param baseDir - Base directory (default: cwd)
211
+ * @returns Repository information
212
+ */
213
+ export function getGitInfo(baseDir = process.cwd()) {
214
+ if (!isGitRepo(baseDir)) {
215
+ return null;
216
+ }
217
+ try {
218
+ const branch = execSync('git rev-parse --abbrev-ref HEAD', {
219
+ cwd: baseDir,
220
+ encoding: 'utf-8',
221
+ }).trim();
222
+ const commit = execSync('git rev-parse --short HEAD', {
223
+ cwd: baseDir,
224
+ encoding: 'utf-8',
225
+ }).trim();
226
+ const statusOutput = execSync('git status --porcelain', {
227
+ cwd: baseDir,
228
+ encoding: 'utf-8',
229
+ });
230
+ const isDirty = statusOutput.trim().length > 0;
231
+ // Get ahead/behind counts
232
+ let ahead = 0;
233
+ let behind = 0;
234
+ try {
235
+ const aheadBehind = execSync('git rev-list --left-right --count HEAD...@{u}', {
236
+ cwd: baseDir,
237
+ encoding: 'utf-8',
238
+ }).trim();
239
+ const [aheadStr, behindStr] = aheadBehind.split('\t');
240
+ ahead = parseInt(aheadStr, 10);
241
+ behind = parseInt(behindStr, 10);
242
+ }
243
+ catch {
244
+ // No upstream branch
245
+ }
246
+ return {
247
+ branch,
248
+ commit,
249
+ isDirty,
250
+ ahead,
251
+ behind,
252
+ };
253
+ }
254
+ catch (error) {
255
+ return null;
256
+ }
257
+ }
258
+ /**
259
+ * Simple dependency tracker (for future use)
260
+ *
261
+ * Parses import/require statements to build a dependency graph.
262
+ */
263
+ export class DependencyTracker {
264
+ graph = new Map();
265
+ reverseGraph = new Map();
266
+ /**
267
+ * Add a file and its dependencies
268
+ */
269
+ async addFile(filePath) {
270
+ const content = await readFile(filePath, 'utf-8');
271
+ const imports = this.parseImports(content);
272
+ // Resolve imports to absolute paths
273
+ const resolvedImports = imports
274
+ .map((imp) => this.resolveImport(imp, filePath))
275
+ .filter((imp) => imp !== null);
276
+ // Add to graph
277
+ this.graph.set(filePath, new Set(resolvedImports));
278
+ // Add to reverse graph
279
+ for (const imp of resolvedImports) {
280
+ if (!this.reverseGraph.has(imp)) {
281
+ this.reverseGraph.set(imp, new Set());
282
+ }
283
+ this.reverseGraph.get(imp).add(filePath);
284
+ }
285
+ }
286
+ /**
287
+ * Get files that depend on the given file
288
+ */
289
+ getDependents(filePath) {
290
+ return Array.from(this.reverseGraph.get(filePath) || []);
291
+ }
292
+ /**
293
+ * Get all affected files (transitive dependencies)
294
+ */
295
+ getAffectedFiles(changedFiles) {
296
+ const affected = new Set(changedFiles);
297
+ const queue = [...changedFiles];
298
+ while (queue.length > 0) {
299
+ const file = queue.shift();
300
+ const dependents = this.getDependents(file);
301
+ for (const dep of dependents) {
302
+ if (!affected.has(dep)) {
303
+ affected.add(dep);
304
+ queue.push(dep);
305
+ }
306
+ }
307
+ }
308
+ return Array.from(affected);
309
+ }
310
+ /**
311
+ * Parse import statements from file content
312
+ */
313
+ parseImports(content) {
314
+ const imports = [];
315
+ // ES6 imports
316
+ const es6Regex = /import\s+.*?\s+from\s+['"]([^'"]+)['"]/g;
317
+ let match;
318
+ while ((match = es6Regex.exec(content)) !== null) {
319
+ imports.push(match[1]);
320
+ }
321
+ // CommonJS requires
322
+ const cjsRegex = /require\(['"]([^'"]+)['"]\)/g;
323
+ while ((match = cjsRegex.exec(content)) !== null) {
324
+ imports.push(match[1]);
325
+ }
326
+ // Dynamic imports
327
+ const dynamicRegex = /import\(['"]([^'"]+)['"]\)/g;
328
+ while ((match = dynamicRegex.exec(content)) !== null) {
329
+ imports.push(match[1]);
330
+ }
331
+ return imports;
332
+ }
333
+ /**
334
+ * Resolve import path to absolute path
335
+ */
336
+ resolveImport(importPath, fromFile) {
337
+ // Skip node_modules
338
+ if (!importPath.startsWith('.')) {
339
+ return null;
340
+ }
341
+ const dir = dirname(fromFile);
342
+ let resolved = resolve(dir, importPath);
343
+ // Try with common extensions
344
+ const extensions = ['', '.ts', '.tsx', '.js', '.jsx'];
345
+ for (const ext of extensions) {
346
+ const withExt = resolved + ext;
347
+ if (existsSync(withExt)) {
348
+ return withExt;
349
+ }
350
+ }
351
+ // Try index files
352
+ for (const ext of extensions.slice(1)) {
353
+ const indexPath = join(resolved, `index${ext}`);
354
+ if (existsSync(indexPath)) {
355
+ return indexPath;
356
+ }
357
+ }
358
+ return null;
359
+ }
360
+ }
361
+ //# sourceMappingURL=incremental-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incremental-analyzer.js","sourceRoot":"","sources":["../../src/utils/incremental-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Message Optimizer - Smart truncation and summarization for LLM messages
3
+ *
4
+ * Reduces verbose tool outputs while preserving essential information.
5
+ * Designed to reduce message length by 80-95% for better context efficiency.
6
+ */
7
+ export interface TruncationConfig {
8
+ /** Maximum length for tool outputs (default: 1000) */
9
+ maxLength?: number;
10
+ /** Number of lines to show from start (default: 20) */
11
+ headLines?: number;
12
+ /** Number of lines to show from end (default: 10) */
13
+ tailLines?: number;
14
+ /** Whether to extract and show only errors (default: true) */
15
+ extractErrors?: boolean;
16
+ /** Maximum lines for file content (default: 100) */
17
+ maxFileLines?: number;
18
+ }
19
+ export interface TruncationResult {
20
+ /** Optimized content */
21
+ content: string;
22
+ /** Whether content was truncated */
23
+ truncated: boolean;
24
+ /** Original length */
25
+ originalLength: number;
26
+ /** New length */
27
+ newLength: number;
28
+ /** Percentage reduced */
29
+ reduction: number;
30
+ }
31
+ /**
32
+ * MessageOptimizer - Reduces verbose tool outputs while preserving key information
33
+ */
34
+ export declare class MessageOptimizer {
35
+ private config;
36
+ constructor(config?: TruncationConfig);
37
+ /**
38
+ * Optimize tool output with smart truncation
39
+ */
40
+ optimizeToolOutput(output: string, toolName?: string): TruncationResult;
41
+ /**
42
+ * Detect TypeScript build output
43
+ */
44
+ private isTypeScriptBuild;
45
+ /**
46
+ * Detect test output
47
+ */
48
+ private isTestOutput;
49
+ /**
50
+ * Detect git output
51
+ */
52
+ private isGitOutput;
53
+ /**
54
+ * Extract TypeScript errors with context
55
+ */
56
+ private extractTypeScriptErrors;
57
+ /**
58
+ * Extract test results summary
59
+ */
60
+ private extractTestResults;
61
+ /**
62
+ * Truncate git output intelligently
63
+ */
64
+ private truncateGitOutput;
65
+ /**
66
+ * Truncate file content with context preservation
67
+ */
68
+ private truncateFileContent;
69
+ /**
70
+ * Generic truncation: show head and tail
71
+ */
72
+ private genericTruncate;
73
+ /**
74
+ * Head-tail truncation: show beginning and end
75
+ */
76
+ private headTailTruncate;
77
+ /**
78
+ * Create excerpt with context around important lines
79
+ */
80
+ createExcerpt(lines: string[], importantIndices: number[], contextLines?: number): string;
81
+ /**
82
+ * Get optimization statistics
83
+ */
84
+ getStats(results: TruncationResult[]): {
85
+ totalOriginal: number;
86
+ totalNew: number;
87
+ totalReduction: number;
88
+ avgReduction: number;
89
+ count: number;
90
+ };
91
+ }
92
+ /**
93
+ * Get or create global message optimizer
94
+ */
95
+ export declare function getMessageOptimizer(config?: TruncationConfig): MessageOptimizer;
96
+ /**
97
+ * Quick helper: optimize tool output
98
+ */
99
+ export declare function optimizeOutput(output: string, toolName?: string): string;