@git.zone/tsdoc 1.11.0 → 1.11.2
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_ts/aidocs_classes/commit.js +27 -34
- package/dist_ts/aidocs_classes/description.js +68 -29
- package/dist_ts/aidocs_classes/projectcontext.d.ts +5 -5
- package/dist_ts/aidocs_classes/projectcontext.js +8 -16
- package/dist_ts/aidocs_classes/readme.js +156 -88
- package/dist_ts/classes.aidoc.d.ts +10 -6
- package/dist_ts/classes.aidoc.js +17 -11
- package/dist_ts/classes.diffprocessor.js +284 -0
- package/dist_ts/cli.js +21 -92
- package/dist_ts/plugins.d.ts +1 -2
- package/dist_ts/plugins.js +2 -3
- package/package.json +11 -13
- package/ts/aidocs_classes/commit.ts +26 -41
- package/ts/aidocs_classes/description.ts +72 -34
- package/ts/aidocs_classes/projectcontext.ts +7 -14
- package/ts/aidocs_classes/readme.ts +168 -93
- package/ts/classes.aidoc.ts +18 -11
- package/ts/cli.ts +20 -100
- package/ts/plugins.ts +1 -2
- package/dist_ts/context/config-manager.d.ts +0 -83
- package/dist_ts/context/config-manager.js +0 -318
- package/dist_ts/context/context-analyzer.d.ts +0 -73
- package/dist_ts/context/context-analyzer.js +0 -311
- package/dist_ts/context/context-cache.d.ts +0 -73
- package/dist_ts/context/context-cache.js +0 -239
- package/dist_ts/context/context-trimmer.d.ts +0 -60
- package/dist_ts/context/context-trimmer.js +0 -258
- package/dist_ts/context/diff-processor.js +0 -284
- package/dist_ts/context/enhanced-context.d.ts +0 -73
- package/dist_ts/context/enhanced-context.js +0 -275
- package/dist_ts/context/index.d.ts +0 -11
- package/dist_ts/context/index.js +0 -12
- package/dist_ts/context/iterative-context-builder.d.ts +0 -62
- package/dist_ts/context/iterative-context-builder.js +0 -395
- package/dist_ts/context/lazy-file-loader.d.ts +0 -60
- package/dist_ts/context/lazy-file-loader.js +0 -182
- package/dist_ts/context/task-context-factory.d.ts +0 -48
- package/dist_ts/context/task-context-factory.js +0 -86
- package/dist_ts/context/types.d.ts +0 -301
- package/dist_ts/context/types.js +0 -2
- package/dist_ts/tsdoc.classes.typedoc.d.ts +0 -10
- package/dist_ts/tsdoc.classes.typedoc.js +0 -48
- package/dist_ts/tsdoc.cli.d.ts +0 -1
- package/dist_ts/tsdoc.cli.js +0 -32
- package/dist_ts/tsdoc.logging.d.ts +0 -2
- package/dist_ts/tsdoc.logging.js +0 -14
- package/dist_ts/tsdoc.paths.d.ts +0 -8
- package/dist_ts/tsdoc.paths.js +0 -12
- package/dist_ts/tsdoc.plugins.d.ts +0 -11
- package/dist_ts/tsdoc.plugins.js +0 -15
- package/ts/context/config-manager.ts +0 -369
- package/ts/context/context-analyzer.ts +0 -391
- package/ts/context/context-cache.ts +0 -286
- package/ts/context/context-trimmer.ts +0 -310
- package/ts/context/enhanced-context.ts +0 -332
- package/ts/context/index.ts +0 -70
- package/ts/context/iterative-context-builder.ts +0 -512
- package/ts/context/lazy-file-loader.ts +0 -207
- package/ts/context/task-context-factory.ts +0 -120
- package/ts/context/types.ts +0 -324
- /package/dist_ts/{context/diff-processor.d.ts → classes.diffprocessor.d.ts} +0 -0
- /package/ts/{context/diff-processor.ts → classes.diffprocessor.ts} +0 -0
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import type { ITrimConfig, ContextMode } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Class responsible for trimming file contents to reduce token usage
|
|
4
|
-
* while preserving important information for context
|
|
5
|
-
*/
|
|
6
|
-
export declare class ContextTrimmer {
|
|
7
|
-
private config;
|
|
8
|
-
/**
|
|
9
|
-
* Create a new ContextTrimmer with the given configuration
|
|
10
|
-
* @param config The trimming configuration
|
|
11
|
-
*/
|
|
12
|
-
constructor(config?: ITrimConfig);
|
|
13
|
-
/**
|
|
14
|
-
* Trim a file's contents based on the configuration
|
|
15
|
-
* @param filePath The path to the file
|
|
16
|
-
* @param content The file's contents
|
|
17
|
-
* @param mode The context mode to use
|
|
18
|
-
* @returns The trimmed file contents
|
|
19
|
-
*/
|
|
20
|
-
trimFile(filePath: string, content: string, mode?: ContextMode): string;
|
|
21
|
-
/**
|
|
22
|
-
* Trim a TypeScript file to reduce token usage
|
|
23
|
-
* @param content The TypeScript file contents
|
|
24
|
-
* @returns The trimmed file contents
|
|
25
|
-
*/
|
|
26
|
-
private trimTypeScriptFile;
|
|
27
|
-
/**
|
|
28
|
-
* Limit a function body to a maximum number of lines
|
|
29
|
-
* @param start The function signature and opening brace
|
|
30
|
-
* @param body The function body
|
|
31
|
-
* @param end The closing brace
|
|
32
|
-
* @returns The limited function body
|
|
33
|
-
*/
|
|
34
|
-
private limitFunctionBody;
|
|
35
|
-
/**
|
|
36
|
-
* Trim a Markdown file to reduce token usage
|
|
37
|
-
* @param content The Markdown file contents
|
|
38
|
-
* @returns The trimmed file contents
|
|
39
|
-
*/
|
|
40
|
-
private trimMarkdownFile;
|
|
41
|
-
/**
|
|
42
|
-
* Trim a JSON file to reduce token usage
|
|
43
|
-
* @param content The JSON file contents
|
|
44
|
-
* @returns The trimmed file contents
|
|
45
|
-
*/
|
|
46
|
-
private trimJsonFile;
|
|
47
|
-
/**
|
|
48
|
-
* Update the trimmer configuration
|
|
49
|
-
* @param config The new configuration to apply
|
|
50
|
-
*/
|
|
51
|
-
updateConfig(config: ITrimConfig): void;
|
|
52
|
-
/**
|
|
53
|
-
* Trim a file based on its importance tier
|
|
54
|
-
* @param filePath The path to the file
|
|
55
|
-
* @param content The file's contents
|
|
56
|
-
* @param level The trimming level to apply ('none', 'light', 'aggressive')
|
|
57
|
-
* @returns The trimmed file contents
|
|
58
|
-
*/
|
|
59
|
-
trimFileWithLevel(filePath: string, content: string, level: 'none' | 'light' | 'aggressive'): string;
|
|
60
|
-
}
|
|
@@ -1,258 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../plugins.js';
|
|
2
|
-
/**
|
|
3
|
-
* Class responsible for trimming file contents to reduce token usage
|
|
4
|
-
* while preserving important information for context
|
|
5
|
-
*/
|
|
6
|
-
export class ContextTrimmer {
|
|
7
|
-
/**
|
|
8
|
-
* Create a new ContextTrimmer with the given configuration
|
|
9
|
-
* @param config The trimming configuration
|
|
10
|
-
*/
|
|
11
|
-
constructor(config) {
|
|
12
|
-
this.config = {
|
|
13
|
-
removeImplementations: true,
|
|
14
|
-
preserveInterfaces: true,
|
|
15
|
-
preserveTypeDefs: true,
|
|
16
|
-
preserveJSDoc: true,
|
|
17
|
-
maxFunctionLines: 5,
|
|
18
|
-
removeComments: true,
|
|
19
|
-
removeBlankLines: true,
|
|
20
|
-
...config
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Trim a file's contents based on the configuration
|
|
25
|
-
* @param filePath The path to the file
|
|
26
|
-
* @param content The file's contents
|
|
27
|
-
* @param mode The context mode to use
|
|
28
|
-
* @returns The trimmed file contents
|
|
29
|
-
*/
|
|
30
|
-
trimFile(filePath, content, mode = 'trimmed') {
|
|
31
|
-
// If mode is 'full', return the original content
|
|
32
|
-
if (mode === 'full') {
|
|
33
|
-
return content;
|
|
34
|
-
}
|
|
35
|
-
// Process based on file type
|
|
36
|
-
if (filePath.endsWith('.ts') || filePath.endsWith('.tsx')) {
|
|
37
|
-
return this.trimTypeScriptFile(content);
|
|
38
|
-
}
|
|
39
|
-
else if (filePath.endsWith('.md')) {
|
|
40
|
-
return this.trimMarkdownFile(content);
|
|
41
|
-
}
|
|
42
|
-
else if (filePath.endsWith('.json')) {
|
|
43
|
-
return this.trimJsonFile(content);
|
|
44
|
-
}
|
|
45
|
-
// Default to returning the original content for unknown file types
|
|
46
|
-
return content;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Trim a TypeScript file to reduce token usage
|
|
50
|
-
* @param content The TypeScript file contents
|
|
51
|
-
* @returns The trimmed file contents
|
|
52
|
-
*/
|
|
53
|
-
trimTypeScriptFile(content) {
|
|
54
|
-
let result = content;
|
|
55
|
-
// Step 1: Preserve JSDoc comments if configured
|
|
56
|
-
const jsDocComments = [];
|
|
57
|
-
if (this.config.preserveJSDoc) {
|
|
58
|
-
const jsDocRegex = /\/\*\*[\s\S]*?\*\//g;
|
|
59
|
-
const matches = result.match(jsDocRegex) || [];
|
|
60
|
-
jsDocComments.push(...matches);
|
|
61
|
-
}
|
|
62
|
-
// Step 2: Remove comments if configured
|
|
63
|
-
if (this.config.removeComments) {
|
|
64
|
-
// Remove single-line comments
|
|
65
|
-
result = result.replace(/\/\/.*$/gm, '');
|
|
66
|
-
// Remove multi-line comments (except JSDoc if preserveJSDoc is true)
|
|
67
|
-
if (!this.config.preserveJSDoc) {
|
|
68
|
-
result = result.replace(/\/\*[\s\S]*?\*\//g, '');
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
// Only remove non-JSDoc comments
|
|
72
|
-
result = result.replace(/\/\*(?!\*)[\s\S]*?\*\//g, '');
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
// Step 3: Remove function implementations if configured
|
|
76
|
-
if (this.config.removeImplementations) {
|
|
77
|
-
// Match function and method bodies
|
|
78
|
-
result = result.replace(/(\b(function|constructor|async function)\s+[\w$]*\s*\([^)]*\)\s*{)([\s\S]*?)(})/g, (match, start, funcType, body, end) => {
|
|
79
|
-
// Keep function signature and opening brace, replace body with comment
|
|
80
|
-
return `${start} /* implementation removed */ ${end}`;
|
|
81
|
-
});
|
|
82
|
-
// Match arrow function bodies
|
|
83
|
-
result = result.replace(/(\([^)]*\)\s*=>\s*{)([\s\S]*?)(})/g, (match, start, body, end) => {
|
|
84
|
-
return `${start} /* implementation removed */ ${end}`;
|
|
85
|
-
});
|
|
86
|
-
// Match method declarations
|
|
87
|
-
result = result.replace(/(^\s*[\w$]*\s*\([^)]*\)\s*{)([\s\S]*?)(})/gm, (match, start, body, end) => {
|
|
88
|
-
return `${start} /* implementation removed */ ${end}`;
|
|
89
|
-
});
|
|
90
|
-
// Match class methods
|
|
91
|
-
result = result.replace(/(\b(public|private|protected|static|async)?\s+[\w$]+\s*\([^)]*\)\s*{)([\s\S]*?)(})/g, (match, start, modifier, body, end) => {
|
|
92
|
-
return `${start} /* implementation removed */ ${end}`;
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
else if (this.config.maxFunctionLines && this.config.maxFunctionLines > 0) {
|
|
96
|
-
// If not removing implementations completely, limit the number of lines
|
|
97
|
-
// Match function and method bodies
|
|
98
|
-
result = result.replace(/(\b(function|constructor|async function)\s+[\w$]*\s*\([^)]*\)\s*{)([\s\S]*?)(})/g, (match, start, funcType, body, end) => {
|
|
99
|
-
return this.limitFunctionBody(start, body, end);
|
|
100
|
-
});
|
|
101
|
-
// Match arrow function bodies
|
|
102
|
-
result = result.replace(/(\([^)]*\)\s*=>\s*{)([\s\S]*?)(})/g, (match, start, body, end) => {
|
|
103
|
-
return this.limitFunctionBody(start, body, end);
|
|
104
|
-
});
|
|
105
|
-
// Match method declarations
|
|
106
|
-
result = result.replace(/(^\s*[\w$]*\s*\([^)]*\)\s*{)([\s\S]*?)(})/gm, (match, start, body, end) => {
|
|
107
|
-
return this.limitFunctionBody(start, body, end);
|
|
108
|
-
});
|
|
109
|
-
// Match class methods
|
|
110
|
-
result = result.replace(/(\b(public|private|protected|static|async)?\s+[\w$]+\s*\([^)]*\)\s*{)([\s\S]*?)(})/g, (match, start, modifier, body, end) => {
|
|
111
|
-
return this.limitFunctionBody(start, body, end);
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
// Step 4: Remove blank lines if configured
|
|
115
|
-
if (this.config.removeBlankLines) {
|
|
116
|
-
result = result.replace(/^\s*[\r\n]/gm, '');
|
|
117
|
-
}
|
|
118
|
-
// Step 5: Restore preserved JSDoc comments
|
|
119
|
-
if (this.config.preserveJSDoc && jsDocComments.length > 0) {
|
|
120
|
-
// This is a placeholder; we already preserved JSDoc comments in the regex steps
|
|
121
|
-
}
|
|
122
|
-
return result;
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Limit a function body to a maximum number of lines
|
|
126
|
-
* @param start The function signature and opening brace
|
|
127
|
-
* @param body The function body
|
|
128
|
-
* @param end The closing brace
|
|
129
|
-
* @returns The limited function body
|
|
130
|
-
*/
|
|
131
|
-
limitFunctionBody(start, body, end) {
|
|
132
|
-
const lines = body.split('\n');
|
|
133
|
-
if (lines.length > this.config.maxFunctionLines) {
|
|
134
|
-
const limitedBody = lines.slice(0, this.config.maxFunctionLines).join('\n');
|
|
135
|
-
return `${start}${limitedBody}\n // ... (${lines.length - this.config.maxFunctionLines} lines trimmed)\n${end}`;
|
|
136
|
-
}
|
|
137
|
-
return `${start}${body}${end}`;
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Trim a Markdown file to reduce token usage
|
|
141
|
-
* @param content The Markdown file contents
|
|
142
|
-
* @returns The trimmed file contents
|
|
143
|
-
*/
|
|
144
|
-
trimMarkdownFile(content) {
|
|
145
|
-
// For markdown files, we generally want to keep most content
|
|
146
|
-
// but we can remove lengthy code blocks if needed
|
|
147
|
-
return content;
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Trim a JSON file to reduce token usage
|
|
151
|
-
* @param content The JSON file contents
|
|
152
|
-
* @returns The trimmed file contents
|
|
153
|
-
*/
|
|
154
|
-
trimJsonFile(content) {
|
|
155
|
-
try {
|
|
156
|
-
// Parse the JSON
|
|
157
|
-
const json = JSON.parse(content);
|
|
158
|
-
// For package.json, keep only essential information
|
|
159
|
-
if ('name' in json && 'version' in json && 'dependencies' in json) {
|
|
160
|
-
const essentialKeys = [
|
|
161
|
-
'name', 'version', 'description', 'author', 'license',
|
|
162
|
-
'main', 'types', 'exports', 'type'
|
|
163
|
-
];
|
|
164
|
-
const trimmedJson = {};
|
|
165
|
-
essentialKeys.forEach(key => {
|
|
166
|
-
if (key in json) {
|
|
167
|
-
trimmedJson[key] = json[key];
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
|
-
// Add dependency information without versions
|
|
171
|
-
if ('dependencies' in json) {
|
|
172
|
-
trimmedJson.dependencies = Object.keys(json.dependencies).reduce((acc, dep) => {
|
|
173
|
-
acc[dep] = '*'; // Replace version with wildcard
|
|
174
|
-
return acc;
|
|
175
|
-
}, {});
|
|
176
|
-
}
|
|
177
|
-
// Return the trimmed JSON
|
|
178
|
-
return JSON.stringify(trimmedJson, null, 2);
|
|
179
|
-
}
|
|
180
|
-
// For other JSON files, leave as is
|
|
181
|
-
return content;
|
|
182
|
-
}
|
|
183
|
-
catch (error) {
|
|
184
|
-
// If there's an error parsing the JSON, return the original content
|
|
185
|
-
return content;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Update the trimmer configuration
|
|
190
|
-
* @param config The new configuration to apply
|
|
191
|
-
*/
|
|
192
|
-
updateConfig(config) {
|
|
193
|
-
this.config = {
|
|
194
|
-
...this.config,
|
|
195
|
-
...config
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Trim a file based on its importance tier
|
|
200
|
-
* @param filePath The path to the file
|
|
201
|
-
* @param content The file's contents
|
|
202
|
-
* @param level The trimming level to apply ('none', 'light', 'aggressive')
|
|
203
|
-
* @returns The trimmed file contents
|
|
204
|
-
*/
|
|
205
|
-
trimFileWithLevel(filePath, content, level) {
|
|
206
|
-
// No trimming for essential files
|
|
207
|
-
if (level === 'none') {
|
|
208
|
-
return content;
|
|
209
|
-
}
|
|
210
|
-
// Create a temporary config based on level
|
|
211
|
-
const originalConfig = { ...this.config };
|
|
212
|
-
try {
|
|
213
|
-
if (level === 'light') {
|
|
214
|
-
// Light trimming: preserve signatures, remove only complex implementations
|
|
215
|
-
this.config = {
|
|
216
|
-
...this.config,
|
|
217
|
-
removeImplementations: false,
|
|
218
|
-
preserveInterfaces: true,
|
|
219
|
-
preserveTypeDefs: true,
|
|
220
|
-
preserveJSDoc: true,
|
|
221
|
-
maxFunctionLines: 10,
|
|
222
|
-
removeComments: false,
|
|
223
|
-
removeBlankLines: true
|
|
224
|
-
};
|
|
225
|
-
}
|
|
226
|
-
else if (level === 'aggressive') {
|
|
227
|
-
// Aggressive trimming: remove all implementations, keep only signatures
|
|
228
|
-
this.config = {
|
|
229
|
-
...this.config,
|
|
230
|
-
removeImplementations: true,
|
|
231
|
-
preserveInterfaces: true,
|
|
232
|
-
preserveTypeDefs: true,
|
|
233
|
-
preserveJSDoc: true,
|
|
234
|
-
maxFunctionLines: 3,
|
|
235
|
-
removeComments: true,
|
|
236
|
-
removeBlankLines: true
|
|
237
|
-
};
|
|
238
|
-
}
|
|
239
|
-
// Process based on file type
|
|
240
|
-
let result = content;
|
|
241
|
-
if (filePath.endsWith('.ts') || filePath.endsWith('.tsx')) {
|
|
242
|
-
result = this.trimTypeScriptFile(content);
|
|
243
|
-
}
|
|
244
|
-
else if (filePath.endsWith('.md')) {
|
|
245
|
-
result = this.trimMarkdownFile(content);
|
|
246
|
-
}
|
|
247
|
-
else if (filePath.endsWith('.json')) {
|
|
248
|
-
result = this.trimJsonFile(content);
|
|
249
|
-
}
|
|
250
|
-
return result;
|
|
251
|
-
}
|
|
252
|
-
finally {
|
|
253
|
-
// Restore original config
|
|
254
|
-
this.config = originalConfig;
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC10cmltbWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvY29udGV4dC9jb250ZXh0LXRyaW1tZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFHekM7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFHekI7OztPQUdHO0lBQ0gsWUFBWSxNQUFvQjtRQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ1oscUJBQXFCLEVBQUUsSUFBSTtZQUMzQixrQkFBa0IsRUFBRSxJQUFJO1lBQ3hCLGdCQUFnQixFQUFFLElBQUk7WUFDdEIsYUFBYSxFQUFFLElBQUk7WUFDbkIsZ0JBQWdCLEVBQUUsQ0FBQztZQUNuQixjQUFjLEVBQUUsSUFBSTtZQUNwQixnQkFBZ0IsRUFBRSxJQUFJO1lBQ3RCLEdBQUcsTUFBTTtTQUNWLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksUUFBUSxDQUFDLFFBQWdCLEVBQUUsT0FBZSxFQUFFLE9BQW9CLFNBQVM7UUFDOUUsaURBQWlEO1FBQ2pELElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFFRCw2QkFBNkI7UUFDN0IsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMxRCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQyxDQUFDO2FBQU0sSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEMsQ0FBQzthQUFNLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxD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
|
|
@@ -1,284 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Intelligent git diff processor that handles large diffs by sampling and prioritization
|
|
3
|
-
* instead of blind truncation.
|
|
4
|
-
*/
|
|
5
|
-
export class DiffProcessor {
|
|
6
|
-
constructor(options = {}) {
|
|
7
|
-
this.options = {
|
|
8
|
-
maxDiffTokens: options.maxDiffTokens ?? 100000,
|
|
9
|
-
smallFileLines: options.smallFileLines ?? 50,
|
|
10
|
-
mediumFileLines: options.mediumFileLines ?? 200,
|
|
11
|
-
sampleHeadLines: options.sampleHeadLines ?? 20,
|
|
12
|
-
sampleTailLines: options.sampleTailLines ?? 20,
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Process an array of git diffs into a structured, token-efficient format
|
|
17
|
-
*/
|
|
18
|
-
processDiffs(diffStringArray) {
|
|
19
|
-
// Parse all diffs into file info objects
|
|
20
|
-
const fileInfos = diffStringArray
|
|
21
|
-
.map(diffString => this.parseDiffFile(diffString))
|
|
22
|
-
.filter(info => info !== null);
|
|
23
|
-
// Prioritize files (source files first, build artifacts last)
|
|
24
|
-
const prioritized = this.prioritizeFiles(fileInfos);
|
|
25
|
-
const result = {
|
|
26
|
-
summary: '',
|
|
27
|
-
fullDiffs: [],
|
|
28
|
-
summarizedDiffs: [],
|
|
29
|
-
metadataOnly: [],
|
|
30
|
-
totalFiles: prioritized.length,
|
|
31
|
-
totalTokens: 0,
|
|
32
|
-
};
|
|
33
|
-
let tokensUsed = 0;
|
|
34
|
-
const tokenBudget = this.options.maxDiffTokens;
|
|
35
|
-
// Categorize and include files based on size and token budget
|
|
36
|
-
for (const fileInfo of prioritized) {
|
|
37
|
-
const remainingBudget = tokenBudget - tokensUsed;
|
|
38
|
-
if (remainingBudget <= 0) {
|
|
39
|
-
// Budget exhausted - rest are metadata only
|
|
40
|
-
result.metadataOnly.push(this.formatMetadataOnly(fileInfo));
|
|
41
|
-
continue;
|
|
42
|
-
}
|
|
43
|
-
if (fileInfo.totalLines <= this.options.smallFileLines) {
|
|
44
|
-
// Small file - include fully if budget allows
|
|
45
|
-
if (fileInfo.estimatedTokens <= remainingBudget) {
|
|
46
|
-
const statusPrefix = this.getFileStatusPrefix(fileInfo);
|
|
47
|
-
result.fullDiffs.push(`${statusPrefix}${fileInfo.diffContent}`);
|
|
48
|
-
tokensUsed += fileInfo.estimatedTokens;
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
result.metadataOnly.push(this.formatMetadataOnly(fileInfo));
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
else if (fileInfo.totalLines <= this.options.mediumFileLines) {
|
|
55
|
-
// Medium file - try to include summary with head/tail
|
|
56
|
-
const summary = this.extractDiffSample(fileInfo, this.options.sampleHeadLines, this.options.sampleTailLines);
|
|
57
|
-
const summaryTokens = Math.ceil(summary.length / 4); // Rough estimate
|
|
58
|
-
if (summaryTokens <= remainingBudget) {
|
|
59
|
-
result.summarizedDiffs.push(summary);
|
|
60
|
-
tokensUsed += summaryTokens;
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
result.metadataOnly.push(this.formatMetadataOnly(fileInfo));
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
// Large file - metadata only
|
|
68
|
-
result.metadataOnly.push(this.formatMetadataOnly(fileInfo));
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
result.totalTokens = tokensUsed;
|
|
72
|
-
result.summary = this.generateSummary(result);
|
|
73
|
-
return result;
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Format the processed diff for inclusion in context
|
|
77
|
-
*/
|
|
78
|
-
formatForContext(processed) {
|
|
79
|
-
const sections = [];
|
|
80
|
-
// Summary section
|
|
81
|
-
sections.push('====== GIT DIFF SUMMARY ======');
|
|
82
|
-
sections.push(processed.summary);
|
|
83
|
-
sections.push('');
|
|
84
|
-
// Full diffs section
|
|
85
|
-
if (processed.fullDiffs.length > 0) {
|
|
86
|
-
sections.push(`====== FULL DIFFS (${processed.fullDiffs.length} files) ======`);
|
|
87
|
-
sections.push(processed.fullDiffs.join('\n\n'));
|
|
88
|
-
sections.push('');
|
|
89
|
-
}
|
|
90
|
-
// Summarized diffs section
|
|
91
|
-
if (processed.summarizedDiffs.length > 0) {
|
|
92
|
-
sections.push(`====== SUMMARIZED DIFFS (${processed.summarizedDiffs.length} files) ======`);
|
|
93
|
-
sections.push(processed.summarizedDiffs.join('\n\n'));
|
|
94
|
-
sections.push('');
|
|
95
|
-
}
|
|
96
|
-
// Metadata only section
|
|
97
|
-
if (processed.metadataOnly.length > 0) {
|
|
98
|
-
sections.push(`====== METADATA ONLY (${processed.metadataOnly.length} files) ======`);
|
|
99
|
-
sections.push(processed.metadataOnly.join('\n'));
|
|
100
|
-
sections.push('');
|
|
101
|
-
}
|
|
102
|
-
sections.push('====== END OF GIT DIFF ======');
|
|
103
|
-
return sections.join('\n');
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Parse a single git diff string into file information
|
|
107
|
-
*/
|
|
108
|
-
parseDiffFile(diffString) {
|
|
109
|
-
if (!diffString || diffString.trim().length === 0) {
|
|
110
|
-
return null;
|
|
111
|
-
}
|
|
112
|
-
const lines = diffString.split('\n');
|
|
113
|
-
let filepath = '';
|
|
114
|
-
let status = 'modified';
|
|
115
|
-
let linesAdded = 0;
|
|
116
|
-
let linesRemoved = 0;
|
|
117
|
-
// Parse diff header to extract filepath and status
|
|
118
|
-
for (const line of lines) {
|
|
119
|
-
if (line.startsWith('--- a/')) {
|
|
120
|
-
filepath = line.substring(6);
|
|
121
|
-
}
|
|
122
|
-
else if (line.startsWith('+++ b/')) {
|
|
123
|
-
const newPath = line.substring(6);
|
|
124
|
-
if (newPath === '/dev/null') {
|
|
125
|
-
status = 'deleted';
|
|
126
|
-
}
|
|
127
|
-
else if (filepath === '/dev/null') {
|
|
128
|
-
status = 'added';
|
|
129
|
-
filepath = newPath;
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
filepath = newPath;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
else if (line.startsWith('+') && !line.startsWith('+++')) {
|
|
136
|
-
linesAdded++;
|
|
137
|
-
}
|
|
138
|
-
else if (line.startsWith('-') && !line.startsWith('---')) {
|
|
139
|
-
linesRemoved++;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
const totalLines = linesAdded + linesRemoved;
|
|
143
|
-
const estimatedTokens = Math.ceil(diffString.length / 4);
|
|
144
|
-
return {
|
|
145
|
-
filepath,
|
|
146
|
-
status,
|
|
147
|
-
linesAdded,
|
|
148
|
-
linesRemoved,
|
|
149
|
-
totalLines,
|
|
150
|
-
estimatedTokens,
|
|
151
|
-
diffContent: diffString,
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Prioritize files by importance (source files before build artifacts)
|
|
156
|
-
*/
|
|
157
|
-
prioritizeFiles(files) {
|
|
158
|
-
return files.sort((a, b) => {
|
|
159
|
-
const scoreA = this.getFileImportanceScore(a.filepath);
|
|
160
|
-
const scoreB = this.getFileImportanceScore(b.filepath);
|
|
161
|
-
return scoreB - scoreA; // Higher score first
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Calculate importance score for a file path
|
|
166
|
-
*/
|
|
167
|
-
getFileImportanceScore(filepath) {
|
|
168
|
-
// Source files - highest priority
|
|
169
|
-
if (filepath.match(/^(src|lib|app|components|pages|api)\//)) {
|
|
170
|
-
return 100;
|
|
171
|
-
}
|
|
172
|
-
// Test files - high priority
|
|
173
|
-
if (filepath.match(/\.(test|spec)\.(ts|js|tsx|jsx)$/) || filepath.startsWith('test/')) {
|
|
174
|
-
return 80;
|
|
175
|
-
}
|
|
176
|
-
// Configuration files - medium-high priority
|
|
177
|
-
if (filepath.match(/\.(json|yaml|yml|toml|config\.(ts|js))$/)) {
|
|
178
|
-
return 60;
|
|
179
|
-
}
|
|
180
|
-
// Documentation - medium priority
|
|
181
|
-
if (filepath.match(/\.(md|txt|rst)$/)) {
|
|
182
|
-
return 40;
|
|
183
|
-
}
|
|
184
|
-
// Build artifacts - low priority
|
|
185
|
-
if (filepath.match(/^(dist|build|out|\.next|public\/dist)\//)) {
|
|
186
|
-
return 10;
|
|
187
|
-
}
|
|
188
|
-
// Start with default priority
|
|
189
|
-
let score = 50;
|
|
190
|
-
// Boost interface/type files - they're usually small but critical
|
|
191
|
-
if (filepath.includes('interfaces/') || filepath.includes('.types.')) {
|
|
192
|
-
score += 20;
|
|
193
|
-
}
|
|
194
|
-
// Boost entry points
|
|
195
|
-
if (filepath.endsWith('index.ts') || filepath.endsWith('mod.ts')) {
|
|
196
|
-
score += 15;
|
|
197
|
-
}
|
|
198
|
-
return score;
|
|
199
|
-
}
|
|
200
|
-
/**
|
|
201
|
-
* Extract head and tail lines from a diff, omitting the middle
|
|
202
|
-
*/
|
|
203
|
-
extractDiffSample(fileInfo, headLines, tailLines) {
|
|
204
|
-
const lines = fileInfo.diffContent.split('\n');
|
|
205
|
-
const totalLines = lines.length;
|
|
206
|
-
if (totalLines <= headLines + tailLines) {
|
|
207
|
-
// File is small enough to include fully
|
|
208
|
-
return fileInfo.diffContent;
|
|
209
|
-
}
|
|
210
|
-
// Extract file metadata from diff header
|
|
211
|
-
const headerLines = [];
|
|
212
|
-
let bodyStartIndex = 0;
|
|
213
|
-
for (let i = 0; i < lines.length; i++) {
|
|
214
|
-
if (lines[i].startsWith('@@')) {
|
|
215
|
-
headerLines.push(...lines.slice(0, i + 1));
|
|
216
|
-
bodyStartIndex = i + 1;
|
|
217
|
-
break;
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
const bodyLines = lines.slice(bodyStartIndex);
|
|
221
|
-
const head = bodyLines.slice(0, headLines);
|
|
222
|
-
const tail = bodyLines.slice(-tailLines);
|
|
223
|
-
const omittedLines = bodyLines.length - headLines - tailLines;
|
|
224
|
-
const statusEmoji = fileInfo.status === 'added' ? '➕' :
|
|
225
|
-
fileInfo.status === 'deleted' ? '➖' : '📝';
|
|
226
|
-
const parts = [];
|
|
227
|
-
parts.push(`${statusEmoji} FILE: ${fileInfo.filepath}`);
|
|
228
|
-
parts.push(`CHANGES: +${fileInfo.linesAdded} lines, -${fileInfo.linesRemoved} lines (${fileInfo.totalLines} total)`);
|
|
229
|
-
parts.push('');
|
|
230
|
-
parts.push(...headerLines);
|
|
231
|
-
parts.push(...head);
|
|
232
|
-
parts.push('');
|
|
233
|
-
parts.push(`[... ${omittedLines} lines omitted - use Read tool to see full file ...]`);
|
|
234
|
-
parts.push('');
|
|
235
|
-
parts.push(...tail);
|
|
236
|
-
return parts.join('\n');
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* Get file status prefix with emoji
|
|
240
|
-
*/
|
|
241
|
-
getFileStatusPrefix(fileInfo) {
|
|
242
|
-
const statusEmoji = fileInfo.status === 'added' ? '➕' :
|
|
243
|
-
fileInfo.status === 'deleted' ? '➖' : '📝';
|
|
244
|
-
return `${statusEmoji} `;
|
|
245
|
-
}
|
|
246
|
-
/**
|
|
247
|
-
* Extract filepath from diff content
|
|
248
|
-
*/
|
|
249
|
-
extractFilepathFromDiff(diffContent) {
|
|
250
|
-
const lines = diffContent.split('\n');
|
|
251
|
-
for (const line of lines) {
|
|
252
|
-
if (line.startsWith('+++ b/')) {
|
|
253
|
-
return line.substring(6);
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
return 'unknown';
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* Format file info as metadata only
|
|
260
|
-
*/
|
|
261
|
-
formatMetadataOnly(fileInfo) {
|
|
262
|
-
const statusEmoji = fileInfo.status === 'added' ? '➕' :
|
|
263
|
-
fileInfo.status === 'deleted' ? '➖' : '📝';
|
|
264
|
-
return `${statusEmoji} ${fileInfo.filepath} (+${fileInfo.linesAdded}, -${fileInfo.linesRemoved})`;
|
|
265
|
-
}
|
|
266
|
-
/**
|
|
267
|
-
* Generate human-readable summary of processed diff
|
|
268
|
-
*/
|
|
269
|
-
generateSummary(result) {
|
|
270
|
-
const parts = [];
|
|
271
|
-
parts.push(`Files changed: ${result.totalFiles} total`);
|
|
272
|
-
parts.push(`- ${result.fullDiffs.length} included in full`);
|
|
273
|
-
parts.push(`- ${result.summarizedDiffs.length} summarized (head/tail shown)`);
|
|
274
|
-
parts.push(`- ${result.metadataOnly.length} metadata only`);
|
|
275
|
-
parts.push(`Estimated tokens: ~${result.totalTokens.toLocaleString()}`);
|
|
276
|
-
if (result.metadataOnly.length > 0) {
|
|
277
|
-
parts.push('');
|
|
278
|
-
parts.push('NOTE: Some files excluded to stay within token budget.');
|
|
279
|
-
parts.push('Use Read tool with specific file paths to see full content.');
|
|
280
|
-
}
|
|
281
|
-
return parts.join('\n');
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZi1wcm9jZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jb250ZXh0L2RpZmYtcHJvY2Vzc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQTZCSCxNQUFNLE9BQU8sYUFBYTtJQUd4QixZQUFZLFVBQWlDLEVBQUU7UUFDN0MsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLGFBQWEsRUFBRSxPQUFPLENBQUMsYUFBYSxJQUFJLE1BQU07WUFDOUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjLElBQUksRUFBRTtZQUM1QyxlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWUsSUFBSSxHQUFHO1lBQy9DLGVBQWUsRUFBRSxPQUFPLENBQUMsZUFBZSxJQUFJLEVBQUU7WUFDOUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxlQUFlLElBQUksRUFBRTtTQUMvQyxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ksWUFBWSxDQUFDLGVBQXlCO1FBQzNDLHlDQUF5QztRQUN6QyxNQUFNLFNBQVMsR0FBb0IsZUFBZTthQUMvQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ2pELE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxJQUFJLENBQW9CLENBQUM7UUFFcEQsOERBQThEO1FBQzlELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFcEQsTUFBTSxNQUFNLEdBQW1CO1lBQzdCLE9BQU8sRUFBRSxFQUFFO1lBQ1gsU0FBUyxFQUFFLEVBQUU7WUFDYixlQUFlLEVBQUUsRUFBRTtZQUNuQixZQUFZLEVBQUUsRUFBRTtZQUNoQixVQUFVLEVBQUUsV0FBVyxDQUFDLE1BQU07WUFDOUIsV0FBVyxFQUFFLENBQUM7U0FDZixDQUFDO1FBRUYsSUFBSSxVQUFVLEdBQUcsQ0FBQyxD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
|