@git.zone/tsdoc 1.4.5 → 1.5.1

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 (41) hide show
  1. package/dist_ts/00_commitinfo_data.js +3 -3
  2. package/dist_ts/aidocs_classes/commit.js +16 -10
  3. package/dist_ts/aidocs_classes/description.js +14 -6
  4. package/dist_ts/aidocs_classes/projectcontext.d.ts +22 -0
  5. package/dist_ts/aidocs_classes/projectcontext.js +41 -1
  6. package/dist_ts/aidocs_classes/readme.js +10 -4
  7. package/dist_ts/classes.aidoc.d.ts +23 -0
  8. package/dist_ts/classes.aidoc.js +34 -1
  9. package/dist_ts/cli.js +110 -1
  10. package/dist_ts/context/config-manager.d.ts +58 -0
  11. package/dist_ts/context/config-manager.js +183 -0
  12. package/dist_ts/context/context-trimmer.d.ts +52 -0
  13. package/dist_ts/context/context-trimmer.js +199 -0
  14. package/dist_ts/context/enhanced-context.d.ts +75 -0
  15. package/dist_ts/context/enhanced-context.js +272 -0
  16. package/dist_ts/context/index.d.ts +7 -0
  17. package/dist_ts/context/index.js +8 -0
  18. package/dist_ts/context/task-context-factory.d.ts +46 -0
  19. package/dist_ts/context/task-context-factory.js +109 -0
  20. package/dist_ts/context/types.d.ts +89 -0
  21. package/dist_ts/context/types.js +2 -0
  22. package/dist_ts/plugins.d.ts +2 -1
  23. package/dist_ts/plugins.js +3 -2
  24. package/npmextra.json +10 -9
  25. package/package.json +25 -23
  26. package/readme.md +588 -174
  27. package/readme.plan.md +314 -0
  28. package/ts/00_commitinfo_data.ts +2 -2
  29. package/ts/aidocs_classes/commit.ts +21 -9
  30. package/ts/aidocs_classes/description.ts +16 -5
  31. package/ts/aidocs_classes/projectcontext.ts +43 -0
  32. package/ts/aidocs_classes/readme.ts +11 -3
  33. package/ts/classes.aidoc.ts +37 -0
  34. package/ts/cli.ts +128 -0
  35. package/ts/context/config-manager.ts +209 -0
  36. package/ts/context/context-trimmer.ts +246 -0
  37. package/ts/context/enhanced-context.ts +343 -0
  38. package/ts/context/index.ts +32 -0
  39. package/ts/context/task-context-factory.ts +138 -0
  40. package/ts/context/types.ts +95 -0
  41. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1jb250ZXh0LWZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jb250ZXh0L3Rhc2stY29udGV4dC1mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHcEQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBSTdCOzs7T0FHRztJQUNILFlBQVksYUFBcUI7UUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUM7UUFDaEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbkQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFVBQVU7UUFDckIsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLHNCQUFzQjtRQUNqQyxNQUFNLGNBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUQsTUFBTSxjQUFjLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEMsb0NBQW9DO1FBQ3BDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlELElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BCLGNBQWMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFFRCxvQ0FBb0M7UUFDcEMsT0FBTyxNQUFNLGNBQWMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLDJCQUEyQjtRQUN0QyxNQUFNLGNBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUQsTUFBTSxjQUFjLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEMseUNBQXlDO1FBQ3pDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ25FLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BCLGNBQWMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFFRCx5Q0FBeUM7UUFDekMsT0FBTyxNQUFNLGNBQWMsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxPQUFnQjtRQUNsRCxNQUFNLGNBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUQsTUFBTSxjQUFjLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEMsb0NBQW9DO1FBQ3BDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlELElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BCLGNBQWMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFFRCxvQ0FBb0M7UUFDcEMsTUFBTSxhQUFhLEdBQUcsTUFBTSxjQUFjLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWxFLGlEQUFpRDtRQUNqRCxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osY0FBYyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFFRCxPQUFPLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLG9CQUFvQixDQUMvQixRQUFrQixFQUNsQixpQkFBMEI7UUFFMUIsUUFBUSxRQUFRLEVBQUUsQ0FBQztZQUNqQixLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUN2QyxLQUFLLGFBQWE7Z0JBQ2hCLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7WUFDNUMsS0FBSyxRQUFRO2dCQUNYLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDeEQ7Z0JBQ0UseUNBQXlDO2dCQUN6QyxNQUFNLGNBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzVELE1BQU0sY0FBYyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNsQyxPQUFPLE1BQU0sY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQy9DLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsYUFBYTtRQU94QixNQUFNLFNBQVMsR0FBZSxDQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbEUsTUFBTSxLQUFLLEdBQTBCLEVBQVMsQ0FBQztRQUUvQyxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3pELEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRztnQkFDaEIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO2dCQUM3QixPQUFPLEVBQUUsTUFBTSxDQUFDLFlBQVk7Z0JBQzVCLGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU07Z0JBQzFDLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU07Z0JBQ3hDLGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU07YUFDM0MsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRiJ9
@@ -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
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jb250ZXh0L3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -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
- export { typedoc };
20
+ import * as gptTokenizer from 'gpt-tokenizer';
21
+ export { typedoc, gptTokenizer };
@@ -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
- export { typedoc };
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYztBQUNkLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUVoQixrQkFBa0I7QUFDbEIsT0FBTyxLQUFLLFFBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEtBQUssSUFBSSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pDLE9BQU8sS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxLQUFLLFFBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFFBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEtBQUssYUFBYSxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLHdCQUF3QixNQUFNLHdDQUF3QyxDQUFDO0FBQ25GLE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBRW5ELE9BQU8sRUFDTCxRQUFRLEVBQ1IsSUFBSSxFQUNKLE9BQU8sRUFDUCxRQUFRLEVBQ1IsVUFBVSxFQUNWLFNBQVMsRUFDVCxRQUFRLEVBQ1IsYUFBYSxFQUNiLFFBQVEsRUFDUix3QkFBd0IsRUFDeEIsU0FBUyxFQUNULFVBQVUsRUFDVixTQUFTLEdBQ1YsQ0FBQztBQUVGLGtCQUFrQjtBQUNsQixPQUFPLEtBQUssU0FBUyxNQUFNLHFCQUFxQixDQUFDO0FBRWpELE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQztBQUVyQixvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFFbkMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDIn0=
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": "An advanced TypeScript documentation tool using AI to generate and enhance documentation for TypeScript projects.",
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 generation",
16
- "AI-enhanced documentation",
17
- "CLI tool",
15
+ "documentation",
16
+ "AI",
17
+ "CLI",
18
+ "README",
19
+ "TypeDoc",
20
+ "commit messages",
21
+ "automation",
18
22
  "code analysis",
19
- "automated documentation",
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
  },