@git.zone/tsdoc 1.11.1 → 1.11.3
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 +65 -42
- 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 +2 -3
- package/ts/aidocs_classes/commit.ts +67 -51
- 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,239 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../plugins.js';
|
|
2
|
-
import * as fs from 'fs';
|
|
3
|
-
import { logger } from '../logging.js';
|
|
4
|
-
/**
|
|
5
|
-
* ContextCache provides persistent caching of file contents and token counts
|
|
6
|
-
* with automatic invalidation on file changes
|
|
7
|
-
*/
|
|
8
|
-
export class ContextCache {
|
|
9
|
-
/**
|
|
10
|
-
* Creates a new ContextCache
|
|
11
|
-
* @param projectRoot - Root directory of the project
|
|
12
|
-
* @param config - Cache configuration
|
|
13
|
-
*/
|
|
14
|
-
constructor(projectRoot, config = {}) {
|
|
15
|
-
this.cache = new Map();
|
|
16
|
-
this.config = {
|
|
17
|
-
enabled: config.enabled ?? true,
|
|
18
|
-
ttl: config.ttl ?? 3600, // 1 hour default
|
|
19
|
-
maxSize: config.maxSize ?? 100, // 100MB default
|
|
20
|
-
directory: config.directory ?? plugins.path.join(projectRoot, '.nogit', 'context-cache'),
|
|
21
|
-
};
|
|
22
|
-
this.cacheDir = this.config.directory;
|
|
23
|
-
this.cacheIndexPath = plugins.path.join(this.cacheDir, 'index.json');
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Initializes the cache by loading from disk
|
|
27
|
-
*/
|
|
28
|
-
async init() {
|
|
29
|
-
if (!this.config.enabled) {
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
// Ensure cache directory exists
|
|
33
|
-
await plugins.fsInstance.directory(this.cacheDir).recursive().create();
|
|
34
|
-
// Load cache index if it exists
|
|
35
|
-
try {
|
|
36
|
-
const indexExists = await plugins.fsInstance.file(this.cacheIndexPath).exists();
|
|
37
|
-
if (indexExists) {
|
|
38
|
-
const indexContent = await plugins.fsInstance.file(this.cacheIndexPath).encoding('utf8').read();
|
|
39
|
-
const indexData = JSON.parse(indexContent);
|
|
40
|
-
if (Array.isArray(indexData)) {
|
|
41
|
-
for (const entry of indexData) {
|
|
42
|
-
this.cache.set(entry.path, entry);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
catch (error) {
|
|
48
|
-
console.warn('Failed to load cache index:', error.message);
|
|
49
|
-
// Start with empty cache if loading fails
|
|
50
|
-
}
|
|
51
|
-
// Clean up expired and invalid entries
|
|
52
|
-
await this.cleanup();
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Gets a cached entry if it's still valid
|
|
56
|
-
* @param filePath - Absolute path to the file
|
|
57
|
-
* @returns Cache entry if valid, null otherwise
|
|
58
|
-
*/
|
|
59
|
-
async get(filePath) {
|
|
60
|
-
if (!this.config.enabled) {
|
|
61
|
-
return null;
|
|
62
|
-
}
|
|
63
|
-
const entry = this.cache.get(filePath);
|
|
64
|
-
if (!entry) {
|
|
65
|
-
return null;
|
|
66
|
-
}
|
|
67
|
-
// Check if entry is expired
|
|
68
|
-
const now = Date.now();
|
|
69
|
-
if (now - entry.cachedAt > this.config.ttl * 1000) {
|
|
70
|
-
this.cache.delete(filePath);
|
|
71
|
-
return null;
|
|
72
|
-
}
|
|
73
|
-
// Check if file has been modified
|
|
74
|
-
try {
|
|
75
|
-
const stats = await fs.promises.stat(filePath);
|
|
76
|
-
const currentMtime = Math.floor(stats.mtimeMs);
|
|
77
|
-
if (currentMtime !== entry.mtime) {
|
|
78
|
-
// File has changed, invalidate cache
|
|
79
|
-
this.cache.delete(filePath);
|
|
80
|
-
return null;
|
|
81
|
-
}
|
|
82
|
-
return entry;
|
|
83
|
-
}
|
|
84
|
-
catch (error) {
|
|
85
|
-
// File doesn't exist anymore
|
|
86
|
-
this.cache.delete(filePath);
|
|
87
|
-
return null;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Stores a cache entry
|
|
92
|
-
* @param entry - Cache entry to store
|
|
93
|
-
*/
|
|
94
|
-
async set(entry) {
|
|
95
|
-
if (!this.config.enabled) {
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
this.cache.set(entry.path, entry);
|
|
99
|
-
// Check cache size and evict old entries if needed
|
|
100
|
-
await this.enforceMaxSize();
|
|
101
|
-
// Persist to disk (async, don't await)
|
|
102
|
-
this.persist().catch((error) => {
|
|
103
|
-
console.warn('Failed to persist cache:', error.message);
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Stores multiple cache entries
|
|
108
|
-
* @param entries - Array of cache entries
|
|
109
|
-
*/
|
|
110
|
-
async setMany(entries) {
|
|
111
|
-
if (!this.config.enabled) {
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
for (const entry of entries) {
|
|
115
|
-
this.cache.set(entry.path, entry);
|
|
116
|
-
}
|
|
117
|
-
await this.enforceMaxSize();
|
|
118
|
-
await this.persist();
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Checks if a file is cached and valid
|
|
122
|
-
* @param filePath - Absolute path to the file
|
|
123
|
-
* @returns True if cached and valid
|
|
124
|
-
*/
|
|
125
|
-
async has(filePath) {
|
|
126
|
-
const entry = await this.get(filePath);
|
|
127
|
-
return entry !== null;
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Gets cache statistics
|
|
131
|
-
*/
|
|
132
|
-
getStats() {
|
|
133
|
-
let totalSize = 0;
|
|
134
|
-
let oldestEntry = null;
|
|
135
|
-
let newestEntry = null;
|
|
136
|
-
for (const entry of this.cache.values()) {
|
|
137
|
-
totalSize += entry.contents.length;
|
|
138
|
-
if (oldestEntry === null || entry.cachedAt < oldestEntry) {
|
|
139
|
-
oldestEntry = entry.cachedAt;
|
|
140
|
-
}
|
|
141
|
-
if (newestEntry === null || entry.cachedAt > newestEntry) {
|
|
142
|
-
newestEntry = entry.cachedAt;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
return {
|
|
146
|
-
entries: this.cache.size,
|
|
147
|
-
totalSize,
|
|
148
|
-
oldestEntry,
|
|
149
|
-
newestEntry,
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Clears all cache entries
|
|
154
|
-
*/
|
|
155
|
-
async clear() {
|
|
156
|
-
this.cache.clear();
|
|
157
|
-
await this.persist();
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Clears specific cache entries
|
|
161
|
-
* @param filePaths - Array of file paths to clear
|
|
162
|
-
*/
|
|
163
|
-
async clearPaths(filePaths) {
|
|
164
|
-
for (const path of filePaths) {
|
|
165
|
-
this.cache.delete(path);
|
|
166
|
-
}
|
|
167
|
-
await this.persist();
|
|
168
|
-
}
|
|
169
|
-
/**
|
|
170
|
-
* Cleans up expired and invalid cache entries
|
|
171
|
-
*/
|
|
172
|
-
async cleanup() {
|
|
173
|
-
const now = Date.now();
|
|
174
|
-
const toDelete = [];
|
|
175
|
-
for (const [path, entry] of this.cache.entries()) {
|
|
176
|
-
// Check expiration
|
|
177
|
-
if (now - entry.cachedAt > this.config.ttl * 1000) {
|
|
178
|
-
toDelete.push(path);
|
|
179
|
-
continue;
|
|
180
|
-
}
|
|
181
|
-
// Check if file still exists and hasn't changed
|
|
182
|
-
try {
|
|
183
|
-
const stats = await fs.promises.stat(path);
|
|
184
|
-
const currentMtime = Math.floor(stats.mtimeMs);
|
|
185
|
-
if (currentMtime !== entry.mtime) {
|
|
186
|
-
toDelete.push(path);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
catch (error) {
|
|
190
|
-
// File doesn't exist
|
|
191
|
-
toDelete.push(path);
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
for (const path of toDelete) {
|
|
195
|
-
this.cache.delete(path);
|
|
196
|
-
}
|
|
197
|
-
if (toDelete.length > 0) {
|
|
198
|
-
await this.persist();
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Enforces maximum cache size by evicting oldest entries
|
|
203
|
-
*/
|
|
204
|
-
async enforceMaxSize() {
|
|
205
|
-
const stats = this.getStats();
|
|
206
|
-
const maxSizeBytes = this.config.maxSize * 1024 * 1024; // Convert MB to bytes
|
|
207
|
-
if (stats.totalSize <= maxSizeBytes) {
|
|
208
|
-
return;
|
|
209
|
-
}
|
|
210
|
-
// Sort entries by age (oldest first)
|
|
211
|
-
const entries = Array.from(this.cache.entries()).sort((a, b) => a[1].cachedAt - b[1].cachedAt);
|
|
212
|
-
// Remove oldest entries until we're under the limit
|
|
213
|
-
let currentSize = stats.totalSize;
|
|
214
|
-
for (const [path, entry] of entries) {
|
|
215
|
-
if (currentSize <= maxSizeBytes) {
|
|
216
|
-
break;
|
|
217
|
-
}
|
|
218
|
-
currentSize -= entry.contents.length;
|
|
219
|
-
this.cache.delete(path);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* Persists cache index to disk
|
|
224
|
-
*/
|
|
225
|
-
async persist() {
|
|
226
|
-
if (!this.config.enabled) {
|
|
227
|
-
return;
|
|
228
|
-
}
|
|
229
|
-
try {
|
|
230
|
-
const entries = Array.from(this.cache.values());
|
|
231
|
-
const content = JSON.stringify(entries, null, 2);
|
|
232
|
-
await plugins.fsInstance.file(this.cacheIndexPath).encoding('utf8').write(content);
|
|
233
|
-
}
|
|
234
|
-
catch (error) {
|
|
235
|
-
console.warn('Failed to persist cache index:', error.message);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1jYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NvbnRleHQvY29udGV4dC1jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUV6QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZDOzs7R0FHRztBQUNILE1BQU0sT0FBTyxZQUFZO0lBTXZCOzs7O09BSUc7SUFDSCxZQUFZLFdBQW1CLEVBQUUsU0FBZ0MsRUFBRTtRQVQzRCxVQUFLLEdBQTZCLElBQUksR0FBRyxFQUFFLENBQUM7UUFVbEQsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxJQUFJLElBQUk7WUFDL0IsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLGlCQUFpQjtZQUMxQyxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sSUFBSSxHQUFHLEVBQUUsZ0JBQWdCO1lBQ2hELFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsZUFBZSxDQUFDO1NBQ3pGLENBQUM7UUFFRixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsSUFBSTtRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pCLE9BQU87UUFDVCxDQUFDO1FBRUQsZ0NB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
|
|
@@ -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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
|