@git.zone/tsdoc 1.11.4 → 2.0.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 +2 -2
- package/dist_ts/aidocs_classes/commit.js +81 -86
- package/dist_ts/aidocs_classes/description.js +29 -48
- package/dist_ts/aidocs_classes/readme.js +57 -95
- package/dist_ts/classes.aidoc.d.ts +1 -6
- package/dist_ts/classes.aidoc.js +7 -17
- package/dist_ts/plugins.d.ts +2 -1
- package/dist_ts/plugins.js +3 -2
- package/package.json +13 -13
- package/readme.hints.md +10 -1
- package/readme.md +137 -313
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/aidocs_classes/commit.ts +84 -87
- package/ts/aidocs_classes/description.ts +31 -51
- package/ts/aidocs_classes/readme.ts +57 -96
- package/ts/classes.aidoc.ts +10 -21
- package/ts/plugins.ts +2 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@git.zone/tsdoc',
|
|
6
|
-
version: '
|
|
6
|
+
version: '2.0.0',
|
|
7
7
|
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.'
|
|
8
8
|
};
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxpQkFBaUI7SUFDdkIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLDhNQUE4TTtDQUM1TixDQUFBIn0=
|
|
@@ -3,6 +3,23 @@ import { AiDoc } from '../classes.aidoc.js';
|
|
|
3
3
|
import { ProjectContext } from './projectcontext.js';
|
|
4
4
|
import { DiffProcessor } from '../classes.diffprocessor.js';
|
|
5
5
|
import { logger } from '../logging.js';
|
|
6
|
+
// Token budget configuration for OpenAI API limits
|
|
7
|
+
const TOKEN_BUDGET = {
|
|
8
|
+
OPENAI_CONTEXT_LIMIT: 272000, // OpenAI's configured limit
|
|
9
|
+
SAFETY_MARGIN: 10000, // Buffer to avoid hitting exact limit
|
|
10
|
+
SMARTAGENT_OVERHEAD: 180000, // System msgs, tools, history, formatting
|
|
11
|
+
TASK_PROMPT_OVERHEAD: 2000, // Task prompt template size
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Calculate max tokens available for diff content based on total budget
|
|
15
|
+
*/
|
|
16
|
+
function calculateMaxDiffTokens() {
|
|
17
|
+
const available = TOKEN_BUDGET.OPENAI_CONTEXT_LIMIT
|
|
18
|
+
- TOKEN_BUDGET.SAFETY_MARGIN
|
|
19
|
+
- TOKEN_BUDGET.SMARTAGENT_OVERHEAD
|
|
20
|
+
- TOKEN_BUDGET.TASK_PROMPT_OVERHEAD;
|
|
21
|
+
return Math.max(available, 30000);
|
|
22
|
+
}
|
|
6
23
|
export class Commit {
|
|
7
24
|
constructor(aiDocsRef, projectDirArg) {
|
|
8
25
|
this.aiDocsRef = aiDocsRef;
|
|
@@ -58,14 +75,17 @@ export class Commit {
|
|
|
58
75
|
// Diagnostic logging for raw diff statistics
|
|
59
76
|
const totalChars = diffStringArray.join('\n\n').length;
|
|
60
77
|
const estimatedTokens = Math.ceil(totalChars / 4);
|
|
61
|
-
console.log(
|
|
78
|
+
console.log(`Raw git diff statistics:`);
|
|
62
79
|
console.log(` Files changed: ${diffStringArray.length}`);
|
|
63
80
|
console.log(` Total characters: ${totalChars.toLocaleString()}`);
|
|
64
81
|
console.log(` Estimated tokens: ${estimatedTokens.toLocaleString()}`);
|
|
65
82
|
console.log(` Exclusion patterns: ${excludePatterns.length}`);
|
|
83
|
+
// Calculate available tokens for diff based on total budget
|
|
84
|
+
const maxDiffTokens = calculateMaxDiffTokens();
|
|
85
|
+
console.log(`Token budget: ${maxDiffTokens.toLocaleString()} tokens for diff (limit: ${TOKEN_BUDGET.OPENAI_CONTEXT_LIMIT.toLocaleString()}, overhead: ${(TOKEN_BUDGET.SMARTAGENT_OVERHEAD + TOKEN_BUDGET.TASK_PROMPT_OVERHEAD).toLocaleString()})`);
|
|
66
86
|
// Use DiffProcessor to intelligently handle large diffs
|
|
67
87
|
const diffProcessor = new DiffProcessor({
|
|
68
|
-
maxDiffTokens
|
|
88
|
+
maxDiffTokens, // Dynamic based on total budget
|
|
69
89
|
smallFileLines: 300, // Most source files are under 300 lines
|
|
70
90
|
mediumFileLines: 800, // Only very large files get head/tail treatment
|
|
71
91
|
sampleHeadLines: 75, // When sampling, show more context
|
|
@@ -73,73 +93,55 @@ export class Commit {
|
|
|
73
93
|
});
|
|
74
94
|
const processedDiff = diffProcessor.processDiffs(diffStringArray);
|
|
75
95
|
processedDiffString = diffProcessor.formatForContext(processedDiff);
|
|
76
|
-
console.log(
|
|
96
|
+
console.log(`Processed diff statistics:`);
|
|
77
97
|
console.log(` Full diffs: ${processedDiff.fullDiffs.length} files`);
|
|
78
98
|
console.log(` Summarized: ${processedDiff.summarizedDiffs.length} files`);
|
|
79
99
|
console.log(` Metadata only: ${processedDiff.metadataOnly.length} files`);
|
|
80
100
|
console.log(` Final tokens: ${processedDiff.totalTokens.toLocaleString()}`);
|
|
81
101
|
if (estimatedTokens > 50000) {
|
|
82
|
-
console.log(
|
|
102
|
+
console.log(`DiffProcessor reduced token usage: ${estimatedTokens.toLocaleString()} -> ${processedDiff.totalTokens.toLocaleString()}`);
|
|
103
|
+
}
|
|
104
|
+
// Validate total tokens won't exceed limit
|
|
105
|
+
const totalEstimatedTokens = processedDiff.totalTokens
|
|
106
|
+
+ TOKEN_BUDGET.SMARTAGENT_OVERHEAD
|
|
107
|
+
+ TOKEN_BUDGET.TASK_PROMPT_OVERHEAD;
|
|
108
|
+
if (totalEstimatedTokens > TOKEN_BUDGET.OPENAI_CONTEXT_LIMIT - TOKEN_BUDGET.SAFETY_MARGIN) {
|
|
109
|
+
console.log(`Warning: Estimated tokens (${totalEstimatedTokens.toLocaleString()}) approaching limit`);
|
|
110
|
+
console.log(` Consider splitting into smaller commits`);
|
|
83
111
|
}
|
|
84
112
|
}
|
|
85
113
|
else {
|
|
86
114
|
processedDiffString = 'No changes.';
|
|
87
115
|
}
|
|
88
|
-
// Use
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
-
|
|
99
|
-
-
|
|
100
|
-
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
- Writing, deleting, or modifying any files
|
|
105
|
-
- Any destructive operations
|
|
106
|
-
|
|
107
|
-
APPROVE final output if:
|
|
108
|
-
- Version level (fix/feat/BREAKING CHANGE) matches the scope of changes in the diff
|
|
109
|
-
- Commit message is clear, professional, and follows conventional commit conventions
|
|
110
|
-
- No personal information, licensing details, or AI mentions (Claude/Codex) included
|
|
111
|
-
- JSON structure is valid with all required fields
|
|
112
|
-
- Scope accurately reflects the changed modules/files
|
|
113
|
-
|
|
114
|
-
REJECT final output if:
|
|
115
|
-
- Version level doesn't match the scope of changes (e.g., "feat" for a typo fix should be "fix")
|
|
116
|
-
- Message is vague, unprofessional, or contains sensitive information
|
|
117
|
-
- JSON is malformed or missing required fields
|
|
118
|
-
`,
|
|
119
|
-
});
|
|
120
|
-
// Register scoped filesystem tool for agent exploration
|
|
121
|
-
commitOrchestrator.registerScopedFilesystemTool(this.projectDir, [
|
|
122
|
-
'.nogit/**',
|
|
123
|
-
'node_modules/**',
|
|
124
|
-
'.git/**',
|
|
125
|
-
'dist/**',
|
|
126
|
-
'dist_*/**',
|
|
127
|
-
]);
|
|
128
|
-
await commitOrchestrator.start();
|
|
116
|
+
// Use runAgent for commit message generation with filesystem tool
|
|
117
|
+
const fsTools = plugins.smartagentTools.filesystemTool({ rootDir: this.projectDir });
|
|
118
|
+
const commitSystemPrompt = `
|
|
119
|
+
You create commit messages for git commits following semantic versioning conventions.
|
|
120
|
+
|
|
121
|
+
You have access to filesystem tools to explore the project if needed.
|
|
122
|
+
|
|
123
|
+
IMPORTANT RULES:
|
|
124
|
+
- Only READ files (package.json, source files) for context
|
|
125
|
+
- Do NOT write, delete, or modify any files
|
|
126
|
+
- Version level (fix/feat/BREAKING CHANGE) must match the scope of changes
|
|
127
|
+
- Commit message must be clear, professional, and follow conventional commit conventions
|
|
128
|
+
- Do NOT include personal information, licensing details, or AI mentions (Claude/Codex)
|
|
129
|
+
- JSON structure must be valid with all required fields
|
|
130
|
+
- Scope must accurately reflect the changed modules/files
|
|
131
|
+
`;
|
|
129
132
|
const commitTaskPrompt = `
|
|
130
|
-
You create a commit message for a git commit.
|
|
131
133
|
Project directory: ${this.projectDir}
|
|
132
134
|
|
|
133
|
-
You have access to
|
|
134
|
-
- Use
|
|
135
|
-
- Use
|
|
135
|
+
You have access to filesystem tools to explore the project if needed:
|
|
136
|
+
- Use list_directory to see project structure
|
|
137
|
+
- Use read_file to read package.json or source files for context
|
|
136
138
|
|
|
137
139
|
Analyze the git diff below to understand what changed and generate a commit message.
|
|
138
140
|
|
|
139
141
|
You should not include any licensing information or personal information.
|
|
140
142
|
Never mention CLAUDE code, or codex.
|
|
141
143
|
|
|
142
|
-
Your final
|
|
144
|
+
Your final response must be ONLY valid JSON - the raw JSON object, nothing else.
|
|
143
145
|
No explanations, no summaries, no markdown - just the JSON object that can be parsed with JSON.parse().
|
|
144
146
|
|
|
145
147
|
Here is the structure of the JSON you must return:
|
|
@@ -160,13 +162,17 @@ ${processedDiffString}
|
|
|
160
162
|
|
|
161
163
|
Analyze these changes and output the JSON commit message object.
|
|
162
164
|
`;
|
|
163
|
-
|
|
164
|
-
await
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
165
|
+
logger.log('info', 'Starting commit message generation with agent...');
|
|
166
|
+
const commitResult = await plugins.smartagent.runAgent({
|
|
167
|
+
model: this.aiDocsRef.model,
|
|
168
|
+
prompt: commitTaskPrompt,
|
|
169
|
+
system: commitSystemPrompt,
|
|
170
|
+
tools: fsTools,
|
|
171
|
+
maxSteps: 10,
|
|
172
|
+
onToolCall: (toolName) => logger.log('info', `[Commit] Tool call: ${toolName}`),
|
|
173
|
+
});
|
|
168
174
|
// Extract JSON from result - handle cases where AI adds text around it
|
|
169
|
-
let jsonString = commitResult.
|
|
175
|
+
let jsonString = commitResult.text
|
|
170
176
|
.replace(/```json\n?/gi, '')
|
|
171
177
|
.replace(/```\n?/gi, '');
|
|
172
178
|
// Try to find JSON object in the result
|
|
@@ -185,29 +191,16 @@ Analyze these changes and output the JSON commit message object.
|
|
|
185
191
|
// lets build the changelog based on that
|
|
186
192
|
const commitMessages = await gitRepo.getAllCommitMessages();
|
|
187
193
|
console.log(JSON.stringify(commitMessages, null, 2));
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
smartAiInstance: this.aiDocsRef.smartAiInstance,
|
|
191
|
-
defaultProvider: 'openai',
|
|
192
|
-
logPrefix: '[Changelog]',
|
|
193
|
-
onProgress: (event) => logger.log(event.logLevel, event.logMessage),
|
|
194
|
-
guardianPolicyPrompt: `
|
|
195
|
-
You validate changelog generation.
|
|
196
|
-
|
|
197
|
-
APPROVE if:
|
|
198
|
-
- Changelog follows proper markdown format with ## headers for each version
|
|
199
|
-
- Entries are chronologically ordered (newest first)
|
|
200
|
-
- Version ranges for trivial commits are properly summarized
|
|
201
|
-
- No duplicate or empty entries
|
|
202
|
-
- Format matches: ## yyyy-mm-dd - x.x.x - scope
|
|
194
|
+
const changelogSystemPrompt = `
|
|
195
|
+
You generate changelog.md files for software projects.
|
|
203
196
|
|
|
204
|
-
|
|
205
|
-
-
|
|
206
|
-
- Entries
|
|
207
|
-
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
197
|
+
RULES:
|
|
198
|
+
- Changelog must follow proper markdown format with ## headers for each version
|
|
199
|
+
- Entries must be chronologically ordered (newest first)
|
|
200
|
+
- Version ranges for trivial commits should be properly summarized
|
|
201
|
+
- No duplicate or empty entries
|
|
202
|
+
- Format: ## yyyy-mm-dd - x.x.x - scope
|
|
203
|
+
`;
|
|
211
204
|
const changelogTaskPrompt = `
|
|
212
205
|
You are building a changelog.md file for the project.
|
|
213
206
|
Omit commits and versions that lack relevant changes, but make sure to mention them as a range with a summarizing message instead.
|
|
@@ -215,7 +208,7 @@ Omit commits and versions that lack relevant changes, but make sure to mention t
|
|
|
215
208
|
A changelog entry should look like this:
|
|
216
209
|
|
|
217
210
|
## yyyy-mm-dd - x.x.x - scope here
|
|
218
|
-
main
|
|
211
|
+
main description here
|
|
219
212
|
|
|
220
213
|
- detailed bullet points follow
|
|
221
214
|
|
|
@@ -228,12 +221,14 @@ Here are the commit messages:
|
|
|
228
221
|
|
|
229
222
|
${JSON.stringify(commitMessages, null, 2)}
|
|
230
223
|
`;
|
|
231
|
-
const changelogResult = await
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
224
|
+
const changelogResult = await plugins.smartagent.runAgent({
|
|
225
|
+
model: this.aiDocsRef.model,
|
|
226
|
+
prompt: changelogTaskPrompt,
|
|
227
|
+
system: changelogSystemPrompt,
|
|
228
|
+
maxSteps: 1,
|
|
229
|
+
onToolCall: (toolName) => logger.log('info', `[Changelog] Tool call: ${toolName}`),
|
|
230
|
+
});
|
|
231
|
+
previousChangelog = plugins.smartfileFactory.fromString(previousChangelogPath, changelogResult.text.replaceAll('```markdown', '').replaceAll('```', ''), 'utf8');
|
|
237
232
|
}
|
|
238
233
|
let oldChangelog = previousChangelog.contents.toString().replace('# Changelog\n\n', '');
|
|
239
234
|
if (oldChangelog.startsWith('\n')) {
|
|
@@ -248,4 +243,4 @@ ${JSON.stringify(commitMessages, null, 2)}
|
|
|
248
243
|
return resultObject;
|
|
249
244
|
}
|
|
250
245
|
}
|
|
251
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
246
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvYWlkb2NzX2NsYXNzZXMvY29tbWl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzVELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkMsbURBQW1EO0FBQ25ELE1BQU0sWUFBWSxHQUFHO0lBQ25CLG9CQUFvQixFQUFFLE1BQU0sRUFBSSw0QkFBNEI7SUFDNUQsYUFBYSxFQUFFLEtBQUssRUFBYSxzQ0FBc0M7SUFDdkUsbUJBQW1CLEVBQUUsTUFBTSxFQUFNLDBDQUEwQztJQUMzRSxvQkFBb0IsRUFBRSxJQUFJLEVBQU8sNEJBQTRCO0NBQ3JELENBQUM7QUFFWDs7R0FFRztBQUNILFNBQVMsc0JBQXNCO0lBQzdCLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxvQkFBb0I7VUFDL0MsWUFBWSxDQUFDLGFBQWE7VUFDMUIsWUFBWSxDQUFDLG1CQUFtQjtVQUNoQyxZQUFZLENBQUMsb0JBQW9CLENBQUM7SUFDdEMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBV0QsTUFBTSxPQUFPLE1BQU07SUFJakIsWUFBWSxTQUFnQixFQUFFLGFBQXFCO1FBQ2pELElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLENBQUM7SUFFTSxLQUFLLENBQUMscUJBQXFCO1FBQ2hDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLENB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
|
|
@@ -7,50 +7,27 @@ export class Description {
|
|
|
7
7
|
this.projectDir = projectDirArg;
|
|
8
8
|
}
|
|
9
9
|
async build() {
|
|
10
|
-
// Use
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
maxIterations: 15,
|
|
15
|
-
maxResultChars: 10000, // Limit tool output to prevent token explosion
|
|
16
|
-
maxHistoryMessages: 15, // Limit history window
|
|
17
|
-
logPrefix: '[Description]',
|
|
18
|
-
onProgress: (event) => logger.log(event.logLevel, event.logMessage),
|
|
19
|
-
guardianPolicyPrompt: `
|
|
20
|
-
You validate description generation tool calls and outputs.
|
|
10
|
+
// Use runAgent with filesystem tool for agent-driven exploration
|
|
11
|
+
const fsTools = plugins.smartagentTools.filesystemTool({ rootDir: this.projectDir });
|
|
12
|
+
const descriptionSystemPrompt = `
|
|
13
|
+
You create project descriptions and keywords for npm packages.
|
|
21
14
|
|
|
22
|
-
|
|
23
|
-
- Reading package.json, npmextra.json, or source files in the ts/ directory
|
|
24
|
-
- Listing directory contents to understand project structure
|
|
25
|
-
- Using tree to see project structure
|
|
15
|
+
You have access to filesystem tools to explore the project.
|
|
26
16
|
|
|
27
|
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
|
|
36
|
-
- Both description and keywords fields are present
|
|
37
|
-
|
|
38
|
-
REJECT final output if:
|
|
39
|
-
- JSON is malformed or wrapped in markdown code blocks
|
|
40
|
-
- Description is too long or vague
|
|
41
|
-
- Keywords are irrelevant or generic
|
|
42
|
-
`,
|
|
43
|
-
});
|
|
44
|
-
// Register scoped filesystem tool for agent exploration
|
|
45
|
-
descriptionOrchestrator.registerScopedFilesystemTool(this.projectDir);
|
|
46
|
-
await descriptionOrchestrator.start();
|
|
17
|
+
IMPORTANT RULES:
|
|
18
|
+
- Only READ files (package.json, npmextra.json, source files in ts/)
|
|
19
|
+
- Do NOT write, delete, or modify any files
|
|
20
|
+
- Your final response must be valid JSON only
|
|
21
|
+
- Description must be a clear, concise one-sentence summary
|
|
22
|
+
- Keywords must be relevant to the project's use cases
|
|
23
|
+
- Both description and keywords fields must be present
|
|
24
|
+
- Do NOT wrap JSON in markdown code blocks
|
|
25
|
+
`;
|
|
47
26
|
const descriptionTaskPrompt = `
|
|
48
|
-
You create a project description and keywords for an npm package.
|
|
49
|
-
|
|
50
27
|
PROJECT DIRECTORY: ${this.projectDir}
|
|
51
28
|
|
|
52
|
-
Use the filesystem
|
|
53
|
-
1. First, use
|
|
29
|
+
Use the filesystem tools to explore the project and understand what it does:
|
|
30
|
+
1. First, use list_directory to see the project structure
|
|
54
31
|
2. Read package.json to understand the package name and current description
|
|
55
32
|
3. Read npmextra.json if it exists for additional metadata
|
|
56
33
|
4. Read key source files in ts/ directory to understand the implementation
|
|
@@ -67,13 +44,17 @@ Important: Answer only in valid JSON.
|
|
|
67
44
|
Your answer should be parseable with JSON.parse() without modifying anything.
|
|
68
45
|
Don't wrap the JSON in \`\`\`json\`\`\` - just return the raw JSON object.
|
|
69
46
|
`;
|
|
70
|
-
|
|
71
|
-
await
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
47
|
+
logger.log('info', 'Starting description generation with agent...');
|
|
48
|
+
const descriptionResult = await plugins.smartagent.runAgent({
|
|
49
|
+
model: this.aiDocsRef.model,
|
|
50
|
+
prompt: descriptionTaskPrompt,
|
|
51
|
+
system: descriptionSystemPrompt,
|
|
52
|
+
tools: fsTools,
|
|
53
|
+
maxSteps: 15,
|
|
54
|
+
onToolCall: (toolName) => logger.log('info', `[Description] Tool call: ${toolName}`),
|
|
55
|
+
});
|
|
56
|
+
console.log(descriptionResult.text);
|
|
57
|
+
const resultObject = JSON.parse(descriptionResult.text.replace('```json', '').replace('```', ''));
|
|
77
58
|
// Use ProjectContext to get file handles for writing
|
|
78
59
|
const projectContext = new ProjectContext(this.projectDir);
|
|
79
60
|
const files = await projectContext.gatherFiles();
|
|
@@ -94,7 +75,7 @@ Don't wrap the JSON in \`\`\`json\`\`\` - just return the raw JSON object.
|
|
|
94
75
|
console.log(`\n======================\n`);
|
|
95
76
|
console.log(JSON.stringify(resultObject, null, 2));
|
|
96
77
|
console.log(`\n======================\n`);
|
|
97
|
-
return descriptionResult.
|
|
78
|
+
return descriptionResult.text;
|
|
98
79
|
}
|
|
99
80
|
}
|
|
100
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9haWRvY3NfY2xhc3Nlcy9kZXNjcmlwdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU92QyxNQUFNLE9BQU8sV0FBVztJQUt0QixZQUFZLFNBQWdCLEVBQUUsYUFBcUI7UUFDakQsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUM7SUFDbEMsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLGlFQUFpRTtRQUNqRSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUVyRixNQUFNLHVCQUF1QixHQUFHOzs7Ozs7Ozs7Ozs7O0NBYW5DLENBQUM7UUFFRSxNQUFNLHFCQUFxQixHQUFHO3FCQUNiLElBQUksQ0FBQyxVQUFVOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBbUJuQyxDQUFDO1FBRUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsK0NBQStDLENBQUMsQ0FBQztRQUVwRSxNQUFNLGlCQUFpQixHQUFHLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDMUQsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSztZQUMzQixNQUFNLEVBQUUscUJBQXFCO1lBQzdCLE1BQU0sRUFBRSx1QkFBdUI7WUFDL0IsS0FBSyxFQUFFLE9BQU87WUFDZCxRQUFRLEVBQUUsRUFBRTtZQUNaLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsNEJBQTRCLFFBQVEsRUFBRSxDQUFDO1NBQ3JGLENBQUMsQ0FBQztRQUVILE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsTUFBTSxZQUFZLEdBQTBCLElBQUksQ0FBQyxLQUFLLENBQ3BELGlCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQ2pFLENBQUM7UUFFRixxREFBcUQ7UUFDckQsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNELE1BQU0sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRWpELHVCQUF1QjtRQUN2QixNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsc0JBQXNCLENBQUM7UUFDbEQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUV6RSxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUM7UUFDbkYsbUJBQW1CLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDO1FBRTdFLFlBQVksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xGLE1BQU0sWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTNCLHNCQUFzQjtRQUN0QixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsb0JBQW9CLENBQUM7UUFDL0MsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN2RSxrQkFBa0IsQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQztRQUMxRCxrQkFBa0IsQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQztRQUNwRCxXQUFXLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRixNQUFNLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUUxQixPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRCxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDMUMsT0FBTyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7SUFDaEMsQ0FBQztDQUNGIn0=
|
|
@@ -17,52 +17,29 @@ export class Readme {
|
|
|
17
17
|
const error = new Error(`No legal information found in npmextra.json`);
|
|
18
18
|
console.log(error);
|
|
19
19
|
}
|
|
20
|
-
// Use
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
defaultProvider: 'openai',
|
|
24
|
-
maxIterations: 25,
|
|
25
|
-
maxResultChars: 15000, // Limit tool output to prevent token explosion
|
|
26
|
-
maxHistoryMessages: 20, // Limit history window
|
|
27
|
-
logPrefix: '[README]',
|
|
28
|
-
onProgress: (event) => logger.log(event.logLevel, event.logMessage),
|
|
29
|
-
guardianPolicyPrompt: `
|
|
30
|
-
You validate README generation tool calls and outputs.
|
|
31
|
-
|
|
32
|
-
APPROVE tool calls for:
|
|
33
|
-
- Reading any files within the project directory (package.json, ts/*.ts, readme.md, etc.)
|
|
34
|
-
- Using tree to see project structure
|
|
35
|
-
- Using glob to find source files
|
|
36
|
-
- Listing directory contents
|
|
37
|
-
|
|
38
|
-
REJECT tool calls for:
|
|
39
|
-
- Reading files outside the project directory
|
|
40
|
-
- Writing, deleting, or modifying any files
|
|
41
|
-
- Any destructive operations
|
|
42
|
-
|
|
43
|
-
For final README output, APPROVE if:
|
|
44
|
-
- README follows proper markdown format
|
|
45
|
-
- Contains Install and Usage sections
|
|
46
|
-
- Code examples are correct TypeScript/ESM syntax
|
|
47
|
-
- Documentation is comprehensive and helpful
|
|
48
|
-
|
|
49
|
-
REJECT final output if:
|
|
50
|
-
- README is incomplete or poorly formatted
|
|
51
|
-
- Contains licensing information (added separately)
|
|
52
|
-
- Uses CommonJS syntax instead of ESM
|
|
53
|
-
- Contains "in conclusion" or similar filler
|
|
54
|
-
`,
|
|
55
|
-
});
|
|
56
|
-
// Register scoped filesystem tool for agent exploration
|
|
57
|
-
readmeOrchestrator.registerScopedFilesystemTool(this.projectDir);
|
|
58
|
-
await readmeOrchestrator.start();
|
|
59
|
-
const readmeTaskPrompt = `
|
|
20
|
+
// Use runAgent with filesystem tool for agent-driven exploration
|
|
21
|
+
const fsTools = plugins.smartagentTools.filesystemTool({ rootDir: this.projectDir });
|
|
22
|
+
const readmeSystemPrompt = `
|
|
60
23
|
You create markdown READMEs for npm projects. You only output the markdown readme.
|
|
61
24
|
|
|
25
|
+
You have access to filesystem tools to explore the project. Use them to understand the codebase.
|
|
26
|
+
|
|
27
|
+
IMPORTANT RULES:
|
|
28
|
+
- Only READ files within the project directory
|
|
29
|
+
- Do NOT write, delete, or modify any files
|
|
30
|
+
- README must follow proper markdown format
|
|
31
|
+
- Must contain Install and Usage sections
|
|
32
|
+
- Code examples must use correct TypeScript/ESM syntax
|
|
33
|
+
- Documentation must be comprehensive and helpful
|
|
34
|
+
- Do NOT include licensing information (added separately)
|
|
35
|
+
- Do NOT use CommonJS syntax - only ESM
|
|
36
|
+
- Do NOT include "in conclusion" or similar filler
|
|
37
|
+
`;
|
|
38
|
+
const readmeTaskPrompt = `
|
|
62
39
|
PROJECT DIRECTORY: ${this.projectDir}
|
|
63
40
|
|
|
64
|
-
Use the filesystem
|
|
65
|
-
1. First, use
|
|
41
|
+
Use the filesystem tools to explore the project and understand what it does:
|
|
42
|
+
1. First, use list_directory to see the project structure
|
|
66
43
|
2. Read package.json to understand the package name, description, and dependencies
|
|
67
44
|
3. Read the existing readme.md if it exists (use it as a base, improve and expand)
|
|
68
45
|
4. Read readme.hints.md if it exists (contains hints for documentation)
|
|
@@ -91,13 +68,17 @@ Then generate a comprehensive README following this template:
|
|
|
91
68
|
Avoid "in conclusion" statements.
|
|
92
69
|
]
|
|
93
70
|
`;
|
|
94
|
-
|
|
95
|
-
await
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
71
|
+
logger.log('info', 'Starting README generation with agent...');
|
|
72
|
+
const readmeResult = await plugins.smartagent.runAgent({
|
|
73
|
+
model: this.aiDocsRef.model,
|
|
74
|
+
prompt: readmeTaskPrompt,
|
|
75
|
+
system: readmeSystemPrompt,
|
|
76
|
+
tools: fsTools,
|
|
77
|
+
maxSteps: 25,
|
|
78
|
+
onToolCall: (toolName) => logger.log('info', `[README] Tool call: ${toolName}`),
|
|
79
|
+
});
|
|
99
80
|
// Clean up markdown formatting if wrapped in code blocks
|
|
100
|
-
let resultMessage = readmeResult.
|
|
81
|
+
let resultMessage = readmeResult.text
|
|
101
82
|
.replace(/^```markdown\n?/i, '')
|
|
102
83
|
.replace(/\n?```$/i, '');
|
|
103
84
|
finalReadmeString += resultMessage + '\n' + legalInfo;
|
|
@@ -118,37 +99,17 @@ Then generate a comprehensive README following this template:
|
|
|
118
99
|
.file(plugins.path.join(subModulePath, 'tspublish.json'))
|
|
119
100
|
.encoding('utf8')
|
|
120
101
|
.read();
|
|
121
|
-
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
defaultProvider: 'openai',
|
|
125
|
-
maxIterations: 20,
|
|
126
|
-
maxResultChars: 12000,
|
|
127
|
-
maxHistoryMessages: 15,
|
|
128
|
-
logPrefix: `[README:${subModule}]`,
|
|
129
|
-
onProgress: (event) => logger.log(event.logLevel, event.logMessage),
|
|
130
|
-
guardianPolicyPrompt: `
|
|
131
|
-
You validate README generation for submodules.
|
|
132
|
-
|
|
133
|
-
APPROVE tool calls for:
|
|
134
|
-
- Reading any files within the submodule directory
|
|
135
|
-
- Using tree to see structure
|
|
136
|
-
- Using glob to find source files
|
|
137
|
-
|
|
138
|
-
REJECT tool calls for:
|
|
139
|
-
- Reading files outside the submodule directory
|
|
140
|
-
- Writing, deleting, or modifying any files
|
|
141
|
-
- Any destructive operations
|
|
102
|
+
const subModuleFsTools = plugins.smartagentTools.filesystemTool({ rootDir: subModulePath });
|
|
103
|
+
const subModuleSystemPrompt = `
|
|
104
|
+
You create markdown READMEs for npm projects. You only output the markdown readme.
|
|
142
105
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
await subModuleOrchestrator.start();
|
|
106
|
+
IMPORTANT RULES:
|
|
107
|
+
- Only READ files within the submodule directory
|
|
108
|
+
- Do NOT write, delete, or modify any files
|
|
109
|
+
- README must be comprehensive, well-formatted markdown with ESM TypeScript examples
|
|
110
|
+
- Do NOT include licensing information (added separately)
|
|
111
|
+
`;
|
|
150
112
|
const subModulePrompt = `
|
|
151
|
-
You create markdown READMEs for npm projects. You only output the markdown readme.
|
|
152
113
|
SUB MODULE: ${subModule}
|
|
153
114
|
SUB MODULE DIRECTORY: ${subModulePath}
|
|
154
115
|
|
|
@@ -156,8 +117,8 @@ IMPORTANT: YOU ARE CREATING THE README FOR THIS SUB MODULE: ${subModule}
|
|
|
156
117
|
The Sub Module will be published with:
|
|
157
118
|
${JSON.stringify(tspublishData, null, 2)}
|
|
158
119
|
|
|
159
|
-
Use the filesystem
|
|
160
|
-
1. Use
|
|
120
|
+
Use the filesystem tools to explore the submodule:
|
|
121
|
+
1. Use list_directory to see the submodule structure
|
|
161
122
|
2. Read package.json to understand the submodule
|
|
162
123
|
3. Read source files in ts/ directory to understand the implementation
|
|
163
124
|
|
|
@@ -180,23 +141,24 @@ Generate a README following the template:
|
|
|
180
141
|
|
|
181
142
|
Don't use \`\`\` at the beginning or end. Only for code blocks.
|
|
182
143
|
`;
|
|
183
|
-
const subModuleResult = await
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
144
|
+
const subModuleResult = await plugins.smartagent.runAgent({
|
|
145
|
+
model: this.aiDocsRef.model,
|
|
146
|
+
prompt: subModulePrompt,
|
|
147
|
+
system: subModuleSystemPrompt,
|
|
148
|
+
tools: subModuleFsTools,
|
|
149
|
+
maxSteps: 20,
|
|
150
|
+
onToolCall: (toolName) => logger.log('info', `[README:${subModule}] Tool call: ${toolName}`),
|
|
151
|
+
});
|
|
152
|
+
const subModuleReadmeString = subModuleResult.text
|
|
153
|
+
.replace(/^```markdown\n?/i, '')
|
|
154
|
+
.replace(/\n?```$/i, '') + '\n' + legalInfo;
|
|
155
|
+
await plugins.fsInstance
|
|
156
|
+
.file(plugins.path.join(subModulePath, 'readme.md'))
|
|
157
|
+
.encoding('utf8')
|
|
158
|
+
.write(subModuleReadmeString);
|
|
159
|
+
logger.log('success', `Built readme for ${subModule}`);
|
|
198
160
|
}
|
|
199
161
|
return resultMessage;
|
|
200
162
|
}
|
|
201
163
|
}
|
|
202
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZG1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvYWlkb2NzX2NsYXNzZXMvcmVhZG1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxLQUFLLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZDLE1BQU0sT0FBTyxNQUFNO0lBS2pCLFlBQVksU0FBZ0IsRUFBRSxhQUFxQjtRQUNqRCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQztJQUNsQyxDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUs7UUFDaEIsSUFBSSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFFM0IscURBQXFEO1FBQ3JELE1BQU0sY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUM3QixDQUFDLE1BQU0sY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUNoRixDQUFDO1FBQ0YsTUFBTSxTQUFTLEdBQUcsWUFBWSxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxLQUFLLENBQUM7UUFDM0QsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztZQUN2RSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JCLENBQUM7UUFFRCxpRUFBaUU7UUFDakUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLGVB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
|