@git.zone/tsdoc 1.4.5 → 1.5.0
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/00_commitinfo_data.js +3 -3
- package/dist_ts/aidocs_classes/commit.js +16 -10
- package/dist_ts/aidocs_classes/description.js +14 -6
- package/dist_ts/aidocs_classes/projectcontext.d.ts +22 -0
- package/dist_ts/aidocs_classes/projectcontext.js +41 -1
- package/dist_ts/aidocs_classes/readme.js +10 -4
- package/dist_ts/classes.aidoc.d.ts +22 -0
- package/dist_ts/classes.aidoc.js +31 -1
- package/dist_ts/cli.js +110 -1
- package/dist_ts/context/config-manager.d.ts +58 -0
- package/dist_ts/context/config-manager.js +183 -0
- package/dist_ts/context/context-trimmer.d.ts +52 -0
- package/dist_ts/context/context-trimmer.js +199 -0
- package/dist_ts/context/enhanced-context.d.ts +75 -0
- package/dist_ts/context/enhanced-context.js +272 -0
- package/dist_ts/context/index.d.ts +7 -0
- package/dist_ts/context/index.js +8 -0
- package/dist_ts/context/task-context-factory.d.ts +46 -0
- package/dist_ts/context/task-context-factory.js +109 -0
- package/dist_ts/context/types.d.ts +89 -0
- package/dist_ts/context/types.js +2 -0
- package/dist_ts/plugins.d.ts +2 -1
- package/dist_ts/plugins.js +3 -2
- package/npmextra.json +10 -9
- package/package.json +12 -10
- package/readme.md +588 -174
- package/readme.plan.md +314 -0
- package/ts/00_commitinfo_data.ts +2 -2
- package/ts/aidocs_classes/commit.ts +21 -9
- package/ts/aidocs_classes/description.ts +16 -5
- package/ts/aidocs_classes/projectcontext.ts +43 -0
- package/ts/aidocs_classes/readme.ts +11 -3
- package/ts/classes.aidoc.ts +33 -0
- package/ts/cli.ts +128 -0
- package/ts/context/config-manager.ts +209 -0
- package/ts/context/context-trimmer.ts +246 -0
- package/ts/context/enhanced-context.ts +343 -0
- package/ts/context/index.ts +32 -0
- package/ts/context/task-context-factory.ts +138 -0
- package/ts/context/types.ts +95 -0
- package/ts/plugins.ts +2 -1
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import { ContextTrimmer } from './context-trimmer.js';
|
|
3
|
+
import { ConfigManager } from './config-manager.js';
|
|
4
|
+
/**
|
|
5
|
+
* Enhanced ProjectContext that supports context optimization strategies
|
|
6
|
+
*/
|
|
7
|
+
export class EnhancedContext {
|
|
8
|
+
/**
|
|
9
|
+
* Create a new EnhancedContext
|
|
10
|
+
* @param projectDirArg The project directory
|
|
11
|
+
*/
|
|
12
|
+
constructor(projectDirArg) {
|
|
13
|
+
this.contextMode = 'trimmed';
|
|
14
|
+
this.tokenBudget = 190000; // Default for o4-mini
|
|
15
|
+
this.contextResult = {
|
|
16
|
+
context: '',
|
|
17
|
+
tokenCount: 0,
|
|
18
|
+
includedFiles: [],
|
|
19
|
+
trimmedFiles: [],
|
|
20
|
+
excludedFiles: [],
|
|
21
|
+
tokenSavings: 0
|
|
22
|
+
};
|
|
23
|
+
this.projectDir = projectDirArg;
|
|
24
|
+
this.configManager = ConfigManager.getInstance();
|
|
25
|
+
this.trimmer = new ContextTrimmer(this.configManager.getTrimConfig());
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Initialize the context builder
|
|
29
|
+
*/
|
|
30
|
+
async initialize() {
|
|
31
|
+
await this.configManager.initialize(this.projectDir);
|
|
32
|
+
this.tokenBudget = this.configManager.getMaxTokens();
|
|
33
|
+
this.trimmer.updateConfig(this.configManager.getTrimConfig());
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Set the context mode
|
|
37
|
+
* @param mode The context mode to use
|
|
38
|
+
*/
|
|
39
|
+
setContextMode(mode) {
|
|
40
|
+
this.contextMode = mode;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Set the token budget
|
|
44
|
+
* @param maxTokens The maximum tokens to use
|
|
45
|
+
*/
|
|
46
|
+
setTokenBudget(maxTokens) {
|
|
47
|
+
this.tokenBudget = maxTokens;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Gather files from the project
|
|
51
|
+
* @param includePaths Optional paths to include
|
|
52
|
+
* @param excludePaths Optional paths to exclude
|
|
53
|
+
*/
|
|
54
|
+
async gatherFiles(includePaths, excludePaths) {
|
|
55
|
+
const smartfilePackageJSON = await plugins.smartfile.SmartFile.fromFilePath(plugins.path.join(this.projectDir, 'package.json'), this.projectDir);
|
|
56
|
+
const smartfilesReadme = await plugins.smartfile.SmartFile.fromFilePath(plugins.path.join(this.projectDir, 'readme.md'), this.projectDir);
|
|
57
|
+
const smartfilesReadmeHints = await plugins.smartfile.SmartFile.fromFilePath(plugins.path.join(this.projectDir, 'readme.hints.md'), this.projectDir);
|
|
58
|
+
const smartfilesNpmextraJSON = await plugins.smartfile.SmartFile.fromFilePath(plugins.path.join(this.projectDir, 'npmextra.json'), this.projectDir);
|
|
59
|
+
// Use provided include paths or default to all TypeScript files
|
|
60
|
+
const includeGlobs = includePaths?.map(path => `${path}/**/*.ts`) || ['ts*/**/*.ts'];
|
|
61
|
+
// Get TypeScript files
|
|
62
|
+
const smartfilesModPromises = includeGlobs.map(glob => plugins.smartfile.fs.fileTreeToObject(this.projectDir, glob));
|
|
63
|
+
const smartfilesModArrays = await Promise.all(smartfilesModPromises);
|
|
64
|
+
// Flatten the arrays
|
|
65
|
+
const smartfilesMod = [];
|
|
66
|
+
smartfilesModArrays.forEach(array => {
|
|
67
|
+
smartfilesMod.push(...array);
|
|
68
|
+
});
|
|
69
|
+
// Get test files if not excluded
|
|
70
|
+
let smartfilesTest = [];
|
|
71
|
+
if (!excludePaths?.includes('test/')) {
|
|
72
|
+
smartfilesTest = await plugins.smartfile.fs.fileTreeToObject(this.projectDir, 'test/**/*.ts');
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
smartfilePackageJSON,
|
|
76
|
+
smartfilesReadme,
|
|
77
|
+
smartfilesReadmeHints,
|
|
78
|
+
smartfilesNpmextraJSON,
|
|
79
|
+
smartfilesMod,
|
|
80
|
+
smartfilesTest,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Convert files to context string
|
|
85
|
+
* @param files The files to convert
|
|
86
|
+
* @param mode The context mode to use
|
|
87
|
+
*/
|
|
88
|
+
async convertFilesToContext(files, mode = this.contextMode) {
|
|
89
|
+
// Reset context result
|
|
90
|
+
this.contextResult = {
|
|
91
|
+
context: '',
|
|
92
|
+
tokenCount: 0,
|
|
93
|
+
includedFiles: [],
|
|
94
|
+
trimmedFiles: [],
|
|
95
|
+
excludedFiles: [],
|
|
96
|
+
tokenSavings: 0
|
|
97
|
+
};
|
|
98
|
+
let totalTokenCount = 0;
|
|
99
|
+
let totalOriginalTokens = 0;
|
|
100
|
+
// Sort files by importance (for now just a simple alphabetical sort)
|
|
101
|
+
// Later this could be enhanced with more sophisticated prioritization
|
|
102
|
+
const sortedFiles = [...files].sort((a, b) => a.relative.localeCompare(b.relative));
|
|
103
|
+
const processedFiles = [];
|
|
104
|
+
for (const smartfile of sortedFiles) {
|
|
105
|
+
// Calculate original token count
|
|
106
|
+
const originalContent = smartfile.contents.toString();
|
|
107
|
+
const originalTokenCount = this.countTokens(originalContent);
|
|
108
|
+
totalOriginalTokens += originalTokenCount;
|
|
109
|
+
// Apply trimming based on mode
|
|
110
|
+
let processedContent = originalContent;
|
|
111
|
+
if (mode !== 'full') {
|
|
112
|
+
processedContent = this.trimmer.trimFile(smartfile.relative, originalContent, mode);
|
|
113
|
+
}
|
|
114
|
+
// Calculate new token count
|
|
115
|
+
const processedTokenCount = this.countTokens(processedContent);
|
|
116
|
+
// Check if we have budget for this file
|
|
117
|
+
if (totalTokenCount + processedTokenCount > this.tokenBudget) {
|
|
118
|
+
// We don't have budget for this file
|
|
119
|
+
this.contextResult.excludedFiles.push({
|
|
120
|
+
path: smartfile.path,
|
|
121
|
+
contents: originalContent,
|
|
122
|
+
relativePath: smartfile.relative,
|
|
123
|
+
tokenCount: originalTokenCount
|
|
124
|
+
});
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
// Format the file for context
|
|
128
|
+
const formattedContent = `
|
|
129
|
+
====== START OF FILE ${smartfile.relative} ======
|
|
130
|
+
|
|
131
|
+
${processedContent}
|
|
132
|
+
|
|
133
|
+
====== END OF FILE ${smartfile.relative} ======
|
|
134
|
+
`;
|
|
135
|
+
processedFiles.push(formattedContent);
|
|
136
|
+
totalTokenCount += processedTokenCount;
|
|
137
|
+
// Track file in appropriate list
|
|
138
|
+
const fileInfo = {
|
|
139
|
+
path: smartfile.path,
|
|
140
|
+
contents: processedContent,
|
|
141
|
+
relativePath: smartfile.relative,
|
|
142
|
+
tokenCount: processedTokenCount
|
|
143
|
+
};
|
|
144
|
+
if (mode === 'full' || processedContent === originalContent) {
|
|
145
|
+
this.contextResult.includedFiles.push(fileInfo);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
this.contextResult.trimmedFiles.push(fileInfo);
|
|
149
|
+
this.contextResult.tokenSavings += (originalTokenCount - processedTokenCount);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Join all processed files
|
|
153
|
+
const context = processedFiles.join('\n');
|
|
154
|
+
// Update context result
|
|
155
|
+
this.contextResult.context = context;
|
|
156
|
+
this.contextResult.tokenCount = totalTokenCount;
|
|
157
|
+
return context;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Build context for the project
|
|
161
|
+
* @param taskType Optional task type for task-specific context
|
|
162
|
+
*/
|
|
163
|
+
async buildContext(taskType) {
|
|
164
|
+
// Initialize if needed
|
|
165
|
+
if (this.tokenBudget === 0) {
|
|
166
|
+
await this.initialize();
|
|
167
|
+
}
|
|
168
|
+
// Get task-specific configuration if a task type is provided
|
|
169
|
+
if (taskType) {
|
|
170
|
+
const taskConfig = this.configManager.getTaskConfig(taskType);
|
|
171
|
+
if (taskConfig.mode) {
|
|
172
|
+
this.setContextMode(taskConfig.mode);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Gather files
|
|
176
|
+
const taskConfig = taskType ? this.configManager.getTaskConfig(taskType) : undefined;
|
|
177
|
+
const files = await this.gatherFiles(taskConfig?.includePaths, taskConfig?.excludePaths);
|
|
178
|
+
// Convert files to context
|
|
179
|
+
// Create an array of all files to process
|
|
180
|
+
const allFiles = [];
|
|
181
|
+
// Add individual files
|
|
182
|
+
if (files.smartfilePackageJSON)
|
|
183
|
+
allFiles.push(files.smartfilePackageJSON);
|
|
184
|
+
if (files.smartfilesReadme)
|
|
185
|
+
allFiles.push(files.smartfilesReadme);
|
|
186
|
+
if (files.smartfilesReadmeHints)
|
|
187
|
+
allFiles.push(files.smartfilesReadmeHints);
|
|
188
|
+
if (files.smartfilesNpmextraJSON)
|
|
189
|
+
allFiles.push(files.smartfilesNpmextraJSON);
|
|
190
|
+
// Add arrays of files
|
|
191
|
+
if (files.smartfilesMod) {
|
|
192
|
+
if (Array.isArray(files.smartfilesMod)) {
|
|
193
|
+
allFiles.push(...files.smartfilesMod);
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
allFiles.push(files.smartfilesMod);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
if (files.smartfilesTest) {
|
|
200
|
+
if (Array.isArray(files.smartfilesTest)) {
|
|
201
|
+
allFiles.push(...files.smartfilesTest);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
allFiles.push(files.smartfilesTest);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
const context = await this.convertFilesToContext(allFiles);
|
|
208
|
+
return this.contextResult;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Update the context with git diff information for commit tasks
|
|
212
|
+
* @param gitDiff The git diff to include
|
|
213
|
+
*/
|
|
214
|
+
updateWithGitDiff(gitDiff) {
|
|
215
|
+
// If we don't have a context yet, return empty result
|
|
216
|
+
if (!this.contextResult.context) {
|
|
217
|
+
return this.contextResult;
|
|
218
|
+
}
|
|
219
|
+
// Add git diff to context
|
|
220
|
+
const diffSection = `
|
|
221
|
+
====== GIT DIFF ======
|
|
222
|
+
|
|
223
|
+
${gitDiff}
|
|
224
|
+
|
|
225
|
+
====== END GIT DIFF ======
|
|
226
|
+
`;
|
|
227
|
+
const diffTokenCount = this.countTokens(diffSection);
|
|
228
|
+
// Update context and token count
|
|
229
|
+
this.contextResult.context += diffSection;
|
|
230
|
+
this.contextResult.tokenCount += diffTokenCount;
|
|
231
|
+
return this.contextResult;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Count tokens in a string
|
|
235
|
+
* @param text The text to count tokens for
|
|
236
|
+
* @param model The model to use for token counting
|
|
237
|
+
*/
|
|
238
|
+
countTokens(text, model = 'gpt-3.5-turbo') {
|
|
239
|
+
try {
|
|
240
|
+
// Use the gpt-tokenizer library to count tokens
|
|
241
|
+
const tokens = plugins.gptTokenizer.encode(text);
|
|
242
|
+
return tokens.length;
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
console.error('Error counting tokens:', error);
|
|
246
|
+
// Provide a rough estimate if tokenization fails
|
|
247
|
+
return Math.ceil(text.length / 4);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Get the context result
|
|
252
|
+
*/
|
|
253
|
+
getContextResult() {
|
|
254
|
+
return this.contextResult;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Get the token count for the current context
|
|
258
|
+
*/
|
|
259
|
+
getTokenCount() {
|
|
260
|
+
return this.contextResult.tokenCount;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Get both the context string and its token count
|
|
264
|
+
*/
|
|
265
|
+
getContextWithTokenCount() {
|
|
266
|
+
return {
|
|
267
|
+
context: this.contextResult.context,
|
|
268
|
+
tokenCount: this.contextResult.tokenCount
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5oYW5jZWQtY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NvbnRleHQvZW5oYW5jZWQtY29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXBEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFlMUI7OztPQUdHO0lBQ0gsWUFBWSxhQUFxQjtRQWZ6QixnQkFBVyxHQUFnQixTQUFTLENBQUM7UUFDckMsZ0JBQVcsR0FBVyxNQUFNLENBQUMsQ0FBQyxzQkFBc0I7UUFDcEQsa0JBQWEsR0FBbUI7WUFDdEMsT0FBTyxFQUFFLEVBQUU7WUFDWCxVQUFVLEVBQUUsQ0FBQztZQUNiLGFBQWEsRUFBRSxFQUFFO1lBQ2pCLFlBQVksRUFBRSxFQUFFO1lBQ2hCLGFBQWEsRUFBRSxFQUFFO1lBQ2pCLFlBQVksRUFBRSxDQUFDO1NBQ2hCLENBQUM7UUFPQSxJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQztRQUNoQyxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsVUFBVTtRQUNyQixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDckQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZ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
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { EnhancedContext } from './enhanced-context.js';
|
|
2
|
+
import { TaskContextFactory } from './task-context-factory.js';
|
|
3
|
+
import { ConfigManager } from './config-manager.js';
|
|
4
|
+
import { ContextTrimmer } from './context-trimmer.js';
|
|
5
|
+
import type { ContextMode, IContextConfig, IContextResult, IFileInfo, ITrimConfig, ITaskConfig, TaskType } from './types.js';
|
|
6
|
+
export { EnhancedContext, TaskContextFactory, ConfigManager, ContextTrimmer, };
|
|
7
|
+
export type { ContextMode, IContextConfig, IContextResult, IFileInfo, ITrimConfig, ITaskConfig, TaskType };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { EnhancedContext } from './enhanced-context.js';
|
|
2
|
+
import { TaskContextFactory } from './task-context-factory.js';
|
|
3
|
+
import { ConfigManager } from './config-manager.js';
|
|
4
|
+
import { ContextTrimmer } from './context-trimmer.js';
|
|
5
|
+
export {
|
|
6
|
+
// Classes
|
|
7
|
+
EnhancedContext, TaskContextFactory, ConfigManager, ContextTrimmer, };
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jb250ZXh0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBV3RELE9BQU87QUFDTCxVQUFVO0FBQ1YsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixhQUFhLEVBQ2IsY0FBYyxHQUNmLENBQUMifQ==
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { IContextResult, TaskType } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Factory class for creating task-specific context
|
|
4
|
+
*/
|
|
5
|
+
export declare class TaskContextFactory {
|
|
6
|
+
private projectDir;
|
|
7
|
+
private configManager;
|
|
8
|
+
/**
|
|
9
|
+
* Create a new TaskContextFactory
|
|
10
|
+
* @param projectDirArg The project directory
|
|
11
|
+
*/
|
|
12
|
+
constructor(projectDirArg: string);
|
|
13
|
+
/**
|
|
14
|
+
* Initialize the factory
|
|
15
|
+
*/
|
|
16
|
+
initialize(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Create context for README generation
|
|
19
|
+
*/
|
|
20
|
+
createContextForReadme(): Promise<IContextResult>;
|
|
21
|
+
/**
|
|
22
|
+
* Create context for description generation
|
|
23
|
+
*/
|
|
24
|
+
createContextForDescription(): Promise<IContextResult>;
|
|
25
|
+
/**
|
|
26
|
+
* Create context for commit message generation
|
|
27
|
+
* @param gitDiff Optional git diff to include
|
|
28
|
+
*/
|
|
29
|
+
createContextForCommit(gitDiff?: string): Promise<IContextResult>;
|
|
30
|
+
/**
|
|
31
|
+
* Create context for any task type
|
|
32
|
+
* @param taskType The task type to create context for
|
|
33
|
+
* @param additionalContent Optional additional content to include
|
|
34
|
+
*/
|
|
35
|
+
createContextForTask(taskType: TaskType, additionalContent?: string): Promise<IContextResult>;
|
|
36
|
+
/**
|
|
37
|
+
* Get token stats for all task types
|
|
38
|
+
*/
|
|
39
|
+
getTokenStats(): Promise<Record<TaskType, {
|
|
40
|
+
tokenCount: number;
|
|
41
|
+
savings: number;
|
|
42
|
+
includedFiles: number;
|
|
43
|
+
trimmedFiles: number;
|
|
44
|
+
excludedFiles: number;
|
|
45
|
+
}>>;
|
|
46
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import { EnhancedContext } from './enhanced-context.js';
|
|
3
|
+
import { ConfigManager } from './config-manager.js';
|
|
4
|
+
/**
|
|
5
|
+
* Factory class for creating task-specific context
|
|
6
|
+
*/
|
|
7
|
+
export class TaskContextFactory {
|
|
8
|
+
/**
|
|
9
|
+
* Create a new TaskContextFactory
|
|
10
|
+
* @param projectDirArg The project directory
|
|
11
|
+
*/
|
|
12
|
+
constructor(projectDirArg) {
|
|
13
|
+
this.projectDir = projectDirArg;
|
|
14
|
+
this.configManager = ConfigManager.getInstance();
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Initialize the factory
|
|
18
|
+
*/
|
|
19
|
+
async initialize() {
|
|
20
|
+
await this.configManager.initialize(this.projectDir);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create context for README generation
|
|
24
|
+
*/
|
|
25
|
+
async createContextForReadme() {
|
|
26
|
+
const contextBuilder = new EnhancedContext(this.projectDir);
|
|
27
|
+
await contextBuilder.initialize();
|
|
28
|
+
// Get README-specific configuration
|
|
29
|
+
const taskConfig = this.configManager.getTaskConfig('readme');
|
|
30
|
+
if (taskConfig.mode) {
|
|
31
|
+
contextBuilder.setContextMode(taskConfig.mode);
|
|
32
|
+
}
|
|
33
|
+
// Build the context for README task
|
|
34
|
+
return await contextBuilder.buildContext('readme');
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Create context for description generation
|
|
38
|
+
*/
|
|
39
|
+
async createContextForDescription() {
|
|
40
|
+
const contextBuilder = new EnhancedContext(this.projectDir);
|
|
41
|
+
await contextBuilder.initialize();
|
|
42
|
+
// Get description-specific configuration
|
|
43
|
+
const taskConfig = this.configManager.getTaskConfig('description');
|
|
44
|
+
if (taskConfig.mode) {
|
|
45
|
+
contextBuilder.setContextMode(taskConfig.mode);
|
|
46
|
+
}
|
|
47
|
+
// Build the context for description task
|
|
48
|
+
return await contextBuilder.buildContext('description');
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Create context for commit message generation
|
|
52
|
+
* @param gitDiff Optional git diff to include
|
|
53
|
+
*/
|
|
54
|
+
async createContextForCommit(gitDiff) {
|
|
55
|
+
const contextBuilder = new EnhancedContext(this.projectDir);
|
|
56
|
+
await contextBuilder.initialize();
|
|
57
|
+
// Get commit-specific configuration
|
|
58
|
+
const taskConfig = this.configManager.getTaskConfig('commit');
|
|
59
|
+
if (taskConfig.mode) {
|
|
60
|
+
contextBuilder.setContextMode(taskConfig.mode);
|
|
61
|
+
}
|
|
62
|
+
// Build the context for commit task
|
|
63
|
+
const contextResult = await contextBuilder.buildContext('commit');
|
|
64
|
+
// If git diff is provided, add it to the context
|
|
65
|
+
if (gitDiff) {
|
|
66
|
+
contextBuilder.updateWithGitDiff(gitDiff);
|
|
67
|
+
}
|
|
68
|
+
return contextBuilder.getContextResult();
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Create context for any task type
|
|
72
|
+
* @param taskType The task type to create context for
|
|
73
|
+
* @param additionalContent Optional additional content to include
|
|
74
|
+
*/
|
|
75
|
+
async createContextForTask(taskType, additionalContent) {
|
|
76
|
+
switch (taskType) {
|
|
77
|
+
case 'readme':
|
|
78
|
+
return this.createContextForReadme();
|
|
79
|
+
case 'description':
|
|
80
|
+
return this.createContextForDescription();
|
|
81
|
+
case 'commit':
|
|
82
|
+
return this.createContextForCommit(additionalContent);
|
|
83
|
+
default:
|
|
84
|
+
// Generic context for unknown task types
|
|
85
|
+
const contextBuilder = new EnhancedContext(this.projectDir);
|
|
86
|
+
await contextBuilder.initialize();
|
|
87
|
+
return await contextBuilder.buildContext();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Get token stats for all task types
|
|
92
|
+
*/
|
|
93
|
+
async getTokenStats() {
|
|
94
|
+
const taskTypes = ['readme', 'description', 'commit'];
|
|
95
|
+
const stats = {};
|
|
96
|
+
for (const taskType of taskTypes) {
|
|
97
|
+
const result = await this.createContextForTask(taskType);
|
|
98
|
+
stats[taskType] = {
|
|
99
|
+
tokenCount: result.tokenCount,
|
|
100
|
+
savings: result.tokenSavings,
|
|
101
|
+
includedFiles: result.includedFiles.length,
|
|
102
|
+
trimmedFiles: result.trimmedFiles.length,
|
|
103
|
+
excludedFiles: result.excludedFiles.length
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
return stats;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1jb250ZXh0LWZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jb250ZXh0L3Rhc2stY29udGV4dC1mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHcEQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBSTdCOzs7T0FHRztJQUNILFlBQVksYUFBcUI7UUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUM7UUFDaEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbkQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFVBQVU7UUFDckIsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLHNCQUFzQjtRQUNqQyxNQUFNLGNBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUQsTUFBTSxjQUFjLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEMsb0NBQW9DO1FBQ3BDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlELElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BCLGNBQWMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFFRCxvQ0FBb0M7UUFDcEMsT0FBTyxNQUFNLGNBQWMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7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
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context processing mode to control how context is built
|
|
3
|
+
*/
|
|
4
|
+
export type ContextMode = 'full' | 'trimmed' | 'summarized';
|
|
5
|
+
/**
|
|
6
|
+
* Configuration for context trimming
|
|
7
|
+
*/
|
|
8
|
+
export interface ITrimConfig {
|
|
9
|
+
/** Whether to remove function implementations */
|
|
10
|
+
removeImplementations?: boolean;
|
|
11
|
+
/** Whether to preserve interface definitions */
|
|
12
|
+
preserveInterfaces?: boolean;
|
|
13
|
+
/** Whether to preserve type definitions */
|
|
14
|
+
preserveTypeDefs?: boolean;
|
|
15
|
+
/** Whether to preserve JSDoc comments */
|
|
16
|
+
preserveJSDoc?: boolean;
|
|
17
|
+
/** Maximum lines to keep for function bodies (if not removing completely) */
|
|
18
|
+
maxFunctionLines?: number;
|
|
19
|
+
/** Whether to remove normal comments (non-JSDoc) */
|
|
20
|
+
removeComments?: boolean;
|
|
21
|
+
/** Whether to remove blank lines */
|
|
22
|
+
removeBlankLines?: boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Task types that require different context optimization
|
|
26
|
+
*/
|
|
27
|
+
export type TaskType = 'readme' | 'commit' | 'description';
|
|
28
|
+
/**
|
|
29
|
+
* Configuration for different tasks
|
|
30
|
+
*/
|
|
31
|
+
export interface ITaskConfig {
|
|
32
|
+
/** The context mode to use for this task */
|
|
33
|
+
mode?: ContextMode;
|
|
34
|
+
/** File paths to include for this task */
|
|
35
|
+
includePaths?: string[];
|
|
36
|
+
/** File paths to exclude for this task */
|
|
37
|
+
excludePaths?: string[];
|
|
38
|
+
/** For commit tasks, whether to focus on changed files */
|
|
39
|
+
focusOnChangedFiles?: boolean;
|
|
40
|
+
/** For description tasks, whether to include package info */
|
|
41
|
+
includePackageInfo?: boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Complete context configuration
|
|
45
|
+
*/
|
|
46
|
+
export interface IContextConfig {
|
|
47
|
+
/** Maximum tokens to use for context */
|
|
48
|
+
maxTokens?: number;
|
|
49
|
+
/** Default context mode */
|
|
50
|
+
defaultMode?: ContextMode;
|
|
51
|
+
/** Task-specific settings */
|
|
52
|
+
taskSpecificSettings?: {
|
|
53
|
+
[key in TaskType]?: ITaskConfig;
|
|
54
|
+
};
|
|
55
|
+
/** Trimming configuration */
|
|
56
|
+
trimming?: ITrimConfig;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Basic file information interface
|
|
60
|
+
*/
|
|
61
|
+
export interface IFileInfo {
|
|
62
|
+
/** The file path */
|
|
63
|
+
path: string;
|
|
64
|
+
/** The file contents */
|
|
65
|
+
contents: string;
|
|
66
|
+
/** The file's relative path from the project root */
|
|
67
|
+
relativePath: string;
|
|
68
|
+
/** The estimated token count of the file */
|
|
69
|
+
tokenCount?: number;
|
|
70
|
+
/** The file's importance score (higher is more important) */
|
|
71
|
+
importanceScore?: number;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Result of context building
|
|
75
|
+
*/
|
|
76
|
+
export interface IContextResult {
|
|
77
|
+
/** The generated context string */
|
|
78
|
+
context: string;
|
|
79
|
+
/** The total token count of the context */
|
|
80
|
+
tokenCount: number;
|
|
81
|
+
/** Files included in the context */
|
|
82
|
+
includedFiles: IFileInfo[];
|
|
83
|
+
/** Files that were trimmed */
|
|
84
|
+
trimmedFiles: IFileInfo[];
|
|
85
|
+
/** Files that were excluded */
|
|
86
|
+
excludedFiles: IFileInfo[];
|
|
87
|
+
/** Token savings from trimming */
|
|
88
|
+
tokenSavings: number;
|
|
89
|
+
}
|
package/dist_ts/plugins.d.ts
CHANGED
|
@@ -17,4 +17,5 @@ export { npmextra, qenv, smartai, smartcli, smartdelay, smartfile, smartgit, sma
|
|
|
17
17
|
import * as tspublish from '@git.zone/tspublish';
|
|
18
18
|
export { tspublish };
|
|
19
19
|
import * as typedoc from 'typedoc';
|
|
20
|
-
|
|
20
|
+
import * as gptTokenizer from 'gpt-tokenizer';
|
|
21
|
+
export { typedoc, gptTokenizer };
|
package/dist_ts/plugins.js
CHANGED
|
@@ -21,5 +21,6 @@ import * as tspublish from '@git.zone/tspublish';
|
|
|
21
21
|
export { tspublish };
|
|
22
22
|
// third party scope
|
|
23
23
|
import * as typedoc from 'typedoc';
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
import * as gptTokenizer from 'gpt-tokenizer';
|
|
25
|
+
export { typedoc, gptTokenizer };
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYztBQUNkLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUVoQixrQkFBa0I7QUFDbEIsT0FBTyxLQUFLLFFBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEtBQUssSUFBSSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pDLE9BQU8sS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxLQUFLLFFBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFFBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEtBQUssYUFBYSxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLHdCQUF3QixNQUFNLHdDQUF3QyxDQUFDO0FBQ25GLE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBRW5ELE9BQU8sRUFDTCxRQUFRLEVBQ1IsSUFBSSxFQUNKLE9BQU8sRUFDUCxRQUFRLEVBQ1IsVUFBVSxFQUNWLFNBQVMsRUFDVCxRQUFRLEVBQ1IsYUFBYSxFQUNiLFFBQVEsRUFDUix3QkFBd0IsRUFDeEIsU0FBUyxFQUNULFVBQVUsRUFDVixTQUFTLEdBQ1YsQ0FBQztBQUVGLGtCQUFrQjtBQUNsQixPQUFPLEtBQUssU0FBUyxNQUFNLHFCQUFxQixDQUFDO0FBRWpELE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQztBQUVyQixvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxLQUFLLFlBQVksTUFBTSxlQUFlLENBQUM7QUFFOUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsQ0FBQyJ9
|
package/npmextra.json
CHANGED
|
@@ -9,18 +9,19 @@
|
|
|
9
9
|
"npmPackagename": "@git.zone/tsdoc",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"projectDomain": "git.zone",
|
|
12
|
-
"description": "
|
|
12
|
+
"description": "A comprehensive TypeScript documentation tool that leverages AI to generate and enhance project documentation, including dynamic README creation, API docs via TypeDoc, and smart commit message generation.",
|
|
13
13
|
"keywords": [
|
|
14
14
|
"TypeScript",
|
|
15
|
-
"documentation
|
|
16
|
-
"AI
|
|
17
|
-
"CLI
|
|
15
|
+
"documentation",
|
|
16
|
+
"AI",
|
|
17
|
+
"CLI",
|
|
18
|
+
"README",
|
|
19
|
+
"TypeDoc",
|
|
20
|
+
"commit messages",
|
|
21
|
+
"automation",
|
|
18
22
|
"code analysis",
|
|
19
|
-
"
|
|
20
|
-
"developer tools"
|
|
21
|
-
"API documentation",
|
|
22
|
-
"technical writing",
|
|
23
|
-
"code quality improvement"
|
|
23
|
+
"context trimming",
|
|
24
|
+
"developer tools"
|
|
24
25
|
]
|
|
25
26
|
}
|
|
26
27
|
},
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@git.zone/tsdoc",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"private": false,
|
|
5
|
-
"description": "
|
|
5
|
+
"description": "A comprehensive TypeScript documentation tool that leverages AI to generate and enhance project documentation, including dynamic README creation, API docs via TypeDoc, and smart commit message generation.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"exports": {
|
|
8
8
|
".": "./dist_ts/index.js"
|
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
"@push.rocks/smartpath": "^5.0.18",
|
|
36
36
|
"@push.rocks/smartshell": "^3.0.5",
|
|
37
37
|
"@push.rocks/smarttime": "^4.0.6",
|
|
38
|
+
"gpt-tokenizer": "^2.9.0",
|
|
38
39
|
"typedoc": "^0.28.4",
|
|
39
40
|
"typescript": "^5.8.3"
|
|
40
41
|
},
|
|
@@ -55,15 +56,16 @@
|
|
|
55
56
|
],
|
|
56
57
|
"keywords": [
|
|
57
58
|
"TypeScript",
|
|
58
|
-
"documentation
|
|
59
|
-
"AI
|
|
60
|
-
"CLI
|
|
59
|
+
"documentation",
|
|
60
|
+
"AI",
|
|
61
|
+
"CLI",
|
|
62
|
+
"README",
|
|
63
|
+
"TypeDoc",
|
|
64
|
+
"commit messages",
|
|
65
|
+
"automation",
|
|
61
66
|
"code analysis",
|
|
62
|
-
"
|
|
63
|
-
"developer tools"
|
|
64
|
-
"API documentation",
|
|
65
|
-
"technical writing",
|
|
66
|
-
"code quality improvement"
|
|
67
|
+
"context trimming",
|
|
68
|
+
"developer tools"
|
|
67
69
|
],
|
|
68
70
|
"repository": {
|
|
69
71
|
"type": "git",
|