@git.zone/tsdoc 2.0.5 → 2.0.6
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/.smartconfig.json +21 -2
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/aidocs_classes/commit.d.ts +3 -0
- package/dist_ts/aidocs_classes/commit.js +122 -115
- package/dist_ts/aidocs_classes/description.js +58 -14
- package/dist_ts/aidocs_classes/projectcontext.d.ts +2 -1
- package/dist_ts/aidocs_classes/projectcontext.js +24 -8
- package/dist_ts/aidocs_classes/readme.js +28 -20
- package/dist_ts/classes.aidoc.d.ts +39 -1
- package/dist_ts/classes.aidoc.js +260 -62
- package/dist_ts/classes.diffprocessor.d.ts +1 -0
- package/dist_ts/classes.diffprocessor.js +25 -16
- package/dist_ts/classes.typedoc.js +33 -11
- package/dist_ts/cli.js +69 -11
- package/dist_ts/helpers.agenttools.d.ts +2 -0
- package/dist_ts/helpers.agenttools.js +112 -0
- package/dist_ts/index.d.ts +1 -0
- package/dist_ts/index.js +2 -1
- package/dist_ts/plugins.d.ts +5 -2
- package/dist_ts/plugins.js +6 -3
- package/package.json +10 -11
- package/readme.md +35 -14
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/aidocs_classes/commit.ts +134 -134
- package/ts/aidocs_classes/description.ts +60 -17
- package/ts/aidocs_classes/projectcontext.ts +24 -24
- package/ts/aidocs_classes/readme.ts +28 -21
- package/ts/classes.aidoc.ts +315 -63
- package/ts/classes.diffprocessor.ts +23 -13
- package/ts/classes.typedoc.ts +35 -12
- package/ts/cli.ts +72 -10
- package/ts/helpers.agenttools.ts +125 -0
- package/ts/index.ts +1 -0
- package/ts/plugins.ts +6 -1
package/.smartconfig.json
CHANGED
|
@@ -33,12 +33,31 @@
|
|
|
33
33
|
"legal": "\n## License and Legal Information\n\nThis repository contains open-source code licensed under the MIT License. A copy of the license can be found in the [LICENSE](./license) file.\n\n**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.\n\n### Trademarks\n\nThis project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH or third parties, and are not included within the scope of the MIT license granted herein.\n\nUse of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines or the guidelines of the respective third-party owners, and any usage must be approved in writing. Third-party trademarks used herein are the property of their respective owners and used only in a descriptive manner, e.g. for an implementation of an API or similar.\n\n### Company Information\n\nTask Venture Capital GmbH \nRegistered at District Court Bremen HRB 35230 HB, Germany\n\nFor any legal inquiries or further information, please contact us via email at hello@task.vc.\n\nBy using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.\n"
|
|
34
34
|
},
|
|
35
35
|
"@git.zone/cli": {
|
|
36
|
+
"schemaVersion": 2,
|
|
37
|
+
"projectType": "npm",
|
|
36
38
|
"release": {
|
|
37
39
|
"registries": [
|
|
38
40
|
"https://verdaccio.lossless.digital",
|
|
39
41
|
"https://registry.npmjs.org"
|
|
40
42
|
],
|
|
41
|
-
"accessLevel": "public"
|
|
43
|
+
"accessLevel": "public",
|
|
44
|
+
"targets": {
|
|
45
|
+
"git": {
|
|
46
|
+
"enabled": true,
|
|
47
|
+
"remote": "origin",
|
|
48
|
+
"pushBranch": true,
|
|
49
|
+
"pushTags": true
|
|
50
|
+
},
|
|
51
|
+
"npm": {
|
|
52
|
+
"enabled": true,
|
|
53
|
+
"registries": [
|
|
54
|
+
"https://verdaccio.lossless.digital",
|
|
55
|
+
"https://registry.npmjs.org"
|
|
56
|
+
],
|
|
57
|
+
"accessLevel": "public",
|
|
58
|
+
"alreadyPublished": "success"
|
|
59
|
+
}
|
|
60
|
+
}
|
|
42
61
|
}
|
|
43
62
|
}
|
|
44
|
-
}
|
|
63
|
+
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@git.zone/tsdoc',
|
|
6
|
-
version: '2.0.
|
|
6
|
+
version: '2.0.6',
|
|
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
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxpQkFBaUI7SUFDdkIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLDhNQUE4TTtDQUM1TixDQUFBIn0=
|
|
@@ -7,6 +7,9 @@ export interface INextCommitObject {
|
|
|
7
7
|
recommendedNextVersion: string;
|
|
8
8
|
changelog?: string;
|
|
9
9
|
}
|
|
10
|
+
export declare class NoChangesError extends Error {
|
|
11
|
+
constructor(message?: string);
|
|
12
|
+
}
|
|
10
13
|
export declare class Commit {
|
|
11
14
|
private aiDocsRef;
|
|
12
15
|
private projectDir;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
2
|
import { AiDoc } from '../classes.aidoc.js';
|
|
3
|
-
import { ProjectContext } from './projectcontext.js';
|
|
4
3
|
import { DiffProcessor } from '../classes.diffprocessor.js';
|
|
5
4
|
import { logger } from '../logging.js';
|
|
5
|
+
import { createReadOnlyFileSystemTools } from '../helpers.agenttools.js';
|
|
6
6
|
// Token budget configuration for OpenAI API limits
|
|
7
7
|
const TOKEN_BUDGET = {
|
|
8
8
|
OPENAI_CONTEXT_LIMIT: 272000, // OpenAI's configured limit
|
|
@@ -20,6 +20,81 @@ function calculateMaxDiffTokens() {
|
|
|
20
20
|
- TOKEN_BUDGET.TASK_PROMPT_OVERHEAD;
|
|
21
21
|
return Math.max(available, 30000);
|
|
22
22
|
}
|
|
23
|
+
export class NoChangesError extends Error {
|
|
24
|
+
constructor(message = 'No uncommitted changes found for commit recommendation.') {
|
|
25
|
+
super(message);
|
|
26
|
+
this.name = 'NoChangesError';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const normalizeLevel = (level) => {
|
|
30
|
+
if (level === 'fix' || level === 'feat' || level === 'BREAKING CHANGE')
|
|
31
|
+
return level;
|
|
32
|
+
throw new Error('recommendedNextVersionLevel must be fix, feat, or BREAKING CHANGE.');
|
|
33
|
+
};
|
|
34
|
+
const stripConventionalPrefix = (message) => {
|
|
35
|
+
return message.replace(/^(fix|feat|BREAKING CHANGE)(\([^)]*\))?:\s*/i, '').trim();
|
|
36
|
+
};
|
|
37
|
+
const extractJsonObject = (text) => {
|
|
38
|
+
const jsonString = text
|
|
39
|
+
.replace(/```json\n?/gi, '')
|
|
40
|
+
.replace(/```\n?/gi, '')
|
|
41
|
+
.match(/\{[\s\S]*\}/)?.[0];
|
|
42
|
+
if (!jsonString) {
|
|
43
|
+
throw new Error(`Could not find JSON object in result: ${text.substring(0, 100)}...`);
|
|
44
|
+
}
|
|
45
|
+
return JSON.parse(jsonString);
|
|
46
|
+
};
|
|
47
|
+
const bumpVersion = (currentVersion, level) => {
|
|
48
|
+
const [majorString, minorString, patchString] = currentVersion.split(/[+-]/)[0].split('.');
|
|
49
|
+
let major = Number.parseInt(majorString, 10);
|
|
50
|
+
let minor = Number.parseInt(minorString, 10);
|
|
51
|
+
let patch = Number.parseInt(patchString, 10);
|
|
52
|
+
if (!Number.isFinite(major))
|
|
53
|
+
major = 0;
|
|
54
|
+
if (!Number.isFinite(minor))
|
|
55
|
+
minor = 0;
|
|
56
|
+
if (!Number.isFinite(patch))
|
|
57
|
+
patch = 0;
|
|
58
|
+
if (level === 'BREAKING CHANGE') {
|
|
59
|
+
return `${major + 1}.0.0`;
|
|
60
|
+
}
|
|
61
|
+
if (level === 'feat') {
|
|
62
|
+
return `${major}.${minor + 1}.0`;
|
|
63
|
+
}
|
|
64
|
+
return `${major}.${minor}.${patch + 1}`;
|
|
65
|
+
};
|
|
66
|
+
const parseCommitResult = (text, currentVersion) => {
|
|
67
|
+
const parsed = extractJsonObject(text);
|
|
68
|
+
const level = normalizeLevel(parsed.recommendedNextVersionLevel);
|
|
69
|
+
const scope = typeof parsed.recommendedNextVersionScope === 'string'
|
|
70
|
+
? parsed.recommendedNextVersionScope.trim()
|
|
71
|
+
: '';
|
|
72
|
+
const message = typeof parsed.recommendedNextVersionMessage === 'string'
|
|
73
|
+
? stripConventionalPrefix(parsed.recommendedNextVersionMessage)
|
|
74
|
+
: '';
|
|
75
|
+
const details = Array.isArray(parsed.recommendedNextVersionDetails)
|
|
76
|
+
? parsed.recommendedNextVersionDetails.filter((detail) => typeof detail === 'string').map(detail => detail.trim()).filter(Boolean)
|
|
77
|
+
: [];
|
|
78
|
+
if (!scope)
|
|
79
|
+
throw new Error('recommendedNextVersionScope must be a non-empty string.');
|
|
80
|
+
if (!message)
|
|
81
|
+
throw new Error('recommendedNextVersionMessage must be a non-empty string.');
|
|
82
|
+
return {
|
|
83
|
+
recommendedNextVersionLevel: level,
|
|
84
|
+
recommendedNextVersionScope: scope,
|
|
85
|
+
recommendedNextVersionMessage: message,
|
|
86
|
+
recommendedNextVersionDetails: details,
|
|
87
|
+
recommendedNextVersion: bumpVersion(currentVersion, level),
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
const buildChangelog = (commitObject, oldChangelog) => {
|
|
91
|
+
const dateString = new plugins.smarttime.ExtendedDate().exportToHyphedSortableDate();
|
|
92
|
+
const details = commitObject.recommendedNextVersionDetails.length > 0
|
|
93
|
+
? `\n\n${commitObject.recommendedNextVersionDetails.map(detail => `- ${detail}`).join('\n')}`
|
|
94
|
+
: '';
|
|
95
|
+
const previous = oldChangelog.replace(/^# Changelog\n\n?/, '').replace(/^\n+/, '');
|
|
96
|
+
return `# Changelog\n\n## ${dateString} - ${commitObject.recommendedNextVersion} - ${commitObject.recommendedNextVersionScope}\n${commitObject.recommendedNextVersionMessage}${details}\n\n${previous}`.trimEnd() + '\n';
|
|
97
|
+
};
|
|
23
98
|
export class Commit {
|
|
24
99
|
constructor(aiDocsRef, projectDirArg) {
|
|
25
100
|
this.aiDocsRef = aiDocsRef;
|
|
@@ -69,52 +144,36 @@ export class Commit {
|
|
|
69
144
|
];
|
|
70
145
|
// Pass glob patterns directly to smartgit - it handles matching internally
|
|
71
146
|
const diffStringArray = await gitRepo.getUncommittedDiff(excludePatterns);
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
if (diffStringArray.length > 0) {
|
|
75
|
-
// Diagnostic logging for raw diff statistics
|
|
76
|
-
const totalChars = diffStringArray.join('\n\n').length;
|
|
77
|
-
const estimatedTokens = Math.ceil(totalChars / 4);
|
|
78
|
-
console.log(`Raw git diff statistics:`);
|
|
79
|
-
console.log(` Files changed: ${diffStringArray.length}`);
|
|
80
|
-
console.log(` Total characters: ${totalChars.toLocaleString()}`);
|
|
81
|
-
console.log(` Estimated tokens: ${estimatedTokens.toLocaleString()}`);
|
|
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()})`);
|
|
86
|
-
// Use DiffProcessor to intelligently handle large diffs
|
|
87
|
-
const diffProcessor = new DiffProcessor({
|
|
88
|
-
maxDiffTokens, // Dynamic based on total budget
|
|
89
|
-
smallFileLines: 300, // Most source files are under 300 lines
|
|
90
|
-
mediumFileLines: 800, // Only very large files get head/tail treatment
|
|
91
|
-
sampleHeadLines: 75, // When sampling, show more context
|
|
92
|
-
sampleTailLines: 75, // When sampling, show more context
|
|
93
|
-
});
|
|
94
|
-
const processedDiff = diffProcessor.processDiffs(diffStringArray);
|
|
95
|
-
processedDiffString = diffProcessor.formatForContext(processedDiff);
|
|
96
|
-
console.log(`Processed diff statistics:`);
|
|
97
|
-
console.log(` Full diffs: ${processedDiff.fullDiffs.length} files`);
|
|
98
|
-
console.log(` Summarized: ${processedDiff.summarizedDiffs.length} files`);
|
|
99
|
-
console.log(` Metadata only: ${processedDiff.metadataOnly.length} files`);
|
|
100
|
-
console.log(` Final tokens: ${processedDiff.totalTokens.toLocaleString()}`);
|
|
101
|
-
if (estimatedTokens > 50000) {
|
|
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`);
|
|
111
|
-
}
|
|
147
|
+
if (diffStringArray.length === 0) {
|
|
148
|
+
throw new NoChangesError();
|
|
112
149
|
}
|
|
113
|
-
|
|
114
|
-
|
|
150
|
+
const packageJsonPath = plugins.path.join(this.projectDir, 'package.json');
|
|
151
|
+
const packageJson = await plugins.fsInstance.file(packageJsonPath).exists()
|
|
152
|
+
? JSON.parse(String(await plugins.fsInstance.file(packageJsonPath).encoding('utf8').read()))
|
|
153
|
+
: {};
|
|
154
|
+
const currentVersion = typeof packageJson.version === 'string' ? packageJson.version : '0.0.0';
|
|
155
|
+
// Process diffs intelligently using DiffProcessor
|
|
156
|
+
const totalChars = diffStringArray.join('\n\n').length;
|
|
157
|
+
const estimatedTokens = Math.ceil(totalChars / 4);
|
|
158
|
+
logger.log('info', `Raw git diff: ${diffStringArray.length} files, ${estimatedTokens.toLocaleString()} estimated tokens, ${excludePatterns.length} exclusions.`);
|
|
159
|
+
const maxDiffTokens = calculateMaxDiffTokens();
|
|
160
|
+
const diffProcessor = new DiffProcessor({
|
|
161
|
+
maxDiffTokens,
|
|
162
|
+
smallFileLines: 300,
|
|
163
|
+
mediumFileLines: 800,
|
|
164
|
+
sampleHeadLines: 75,
|
|
165
|
+
sampleTailLines: 75,
|
|
166
|
+
});
|
|
167
|
+
const processedDiff = diffProcessor.processDiffs(diffStringArray);
|
|
168
|
+
const processedDiffString = diffProcessor.formatForContext(processedDiff);
|
|
169
|
+
logger.log('info', `Processed diff: ${processedDiff.fullDiffs.length} full, ${processedDiff.summarizedDiffs.length} summarized, ${processedDiff.metadataOnly.length} metadata-only, ${processedDiff.totalTokens.toLocaleString()} tokens.`);
|
|
170
|
+
const totalEstimatedTokens = processedDiff.totalTokens
|
|
171
|
+
+ TOKEN_BUDGET.SMARTAGENT_OVERHEAD
|
|
172
|
+
+ TOKEN_BUDGET.TASK_PROMPT_OVERHEAD;
|
|
173
|
+
if (totalEstimatedTokens > TOKEN_BUDGET.OPENAI_CONTEXT_LIMIT - TOKEN_BUDGET.SAFETY_MARGIN) {
|
|
174
|
+
logger.log('warn', `Estimated tokens (${totalEstimatedTokens.toLocaleString()}) approach the model context limit. Consider splitting into smaller commits.`);
|
|
115
175
|
}
|
|
116
|
-
|
|
117
|
-
const fsTools = plugins.smartagentTools.filesystemTool({ rootDir: this.projectDir });
|
|
176
|
+
const fsTools = createReadOnlyFileSystemTools(this.projectDir);
|
|
118
177
|
const commitSystemPrompt = `
|
|
119
178
|
You create commit messages for git commits following semantic versioning conventions.
|
|
120
179
|
|
|
@@ -151,7 +210,7 @@ Here is the structure of the JSON you must return:
|
|
|
151
210
|
"recommendedNextVersionScope": "string",
|
|
152
211
|
"recommendedNextVersionMessage": "string (ONLY the description body WITHOUT the type(scope): prefix - e.g. 'bump dependency to ^1.2.6' NOT 'fix(deps): bump dependency to ^1.2.6')",
|
|
153
212
|
"recommendedNextVersionDetails": ["string"],
|
|
154
|
-
"recommendedNextVersion": "x.x.x"
|
|
213
|
+
"recommendedNextVersion": "x.x.x (will be verified deterministically)"
|
|
155
214
|
}
|
|
156
215
|
|
|
157
216
|
For recommendedNextVersionDetails, only add entries that have obvious value to the reader.
|
|
@@ -163,84 +222,32 @@ ${processedDiffString}
|
|
|
163
222
|
Analyze these changes and output the JSON commit message object.
|
|
164
223
|
`;
|
|
165
224
|
logger.log('info', 'Starting commit message generation with agent...');
|
|
166
|
-
const commitResult = await
|
|
167
|
-
|
|
225
|
+
const commitResult = await this.aiDocsRef.runAgent({
|
|
226
|
+
taskName: 'commit',
|
|
227
|
+
projectDir: this.projectDir,
|
|
168
228
|
prompt: commitTaskPrompt,
|
|
169
229
|
system: commitSystemPrompt,
|
|
170
230
|
tools: fsTools,
|
|
171
231
|
maxSteps: 10,
|
|
232
|
+
maxValidationRetries: 1,
|
|
233
|
+
validateCompletion: (result) => {
|
|
234
|
+
try {
|
|
235
|
+
parseCommitResult(result.text, currentVersion);
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
return `Return only valid JSON matching the requested commit object schema. Error: ${error instanceof Error ? error.message : String(error)}`;
|
|
239
|
+
}
|
|
240
|
+
},
|
|
172
241
|
onToolCall: (toolName) => logger.log('info', `[Commit] Tool call: ${toolName}`),
|
|
173
242
|
});
|
|
174
|
-
|
|
175
|
-
let jsonString = commitResult.text
|
|
176
|
-
.replace(/```json\n?/gi, '')
|
|
177
|
-
.replace(/```\n?/gi, '');
|
|
178
|
-
// Try to find JSON object in the result
|
|
179
|
-
const jsonMatch = jsonString.match(/\{[\s\S]*\}/);
|
|
180
|
-
if (!jsonMatch) {
|
|
181
|
-
throw new Error(`Could not find JSON object in result: ${jsonString.substring(0, 100)}...`);
|
|
182
|
-
}
|
|
183
|
-
jsonString = jsonMatch[0];
|
|
184
|
-
const resultObject = JSON.parse(jsonString);
|
|
243
|
+
const resultObject = parseCommitResult(commitResult.text, currentVersion);
|
|
185
244
|
const previousChangelogPath = plugins.path.join(this.projectDir, 'changelog.md');
|
|
186
|
-
let
|
|
245
|
+
let oldChangelog = '';
|
|
187
246
|
if (await plugins.fsInstance.file(previousChangelogPath).exists()) {
|
|
188
|
-
|
|
189
|
-
}
|
|
190
|
-
if (!previousChangelog) {
|
|
191
|
-
// lets build the changelog based on that
|
|
192
|
-
const commitMessages = await gitRepo.getAllCommitMessages();
|
|
193
|
-
console.log(JSON.stringify(commitMessages, null, 2));
|
|
194
|
-
const changelogSystemPrompt = `
|
|
195
|
-
You generate changelog.md files for software projects.
|
|
196
|
-
|
|
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
|
-
`;
|
|
204
|
-
const changelogTaskPrompt = `
|
|
205
|
-
You are building a changelog.md file for the project.
|
|
206
|
-
Omit commits and versions that lack relevant changes, but make sure to mention them as a range with a summarizing message instead.
|
|
207
|
-
|
|
208
|
-
A changelog entry should look like this:
|
|
209
|
-
|
|
210
|
-
## yyyy-mm-dd - x.x.x - scope here
|
|
211
|
-
main description here
|
|
212
|
-
|
|
213
|
-
- detailed bullet points follow
|
|
214
|
-
|
|
215
|
-
You are given:
|
|
216
|
-
* the commit messages of the project
|
|
217
|
-
|
|
218
|
-
Only return the changelog file content, so it can be written directly to changelog.md.
|
|
219
|
-
|
|
220
|
-
Here are the commit messages:
|
|
221
|
-
|
|
222
|
-
${JSON.stringify(commitMessages, null, 2)}
|
|
223
|
-
`;
|
|
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');
|
|
232
|
-
}
|
|
233
|
-
let oldChangelog = previousChangelog.contents.toString().replace('# Changelog\n\n', '');
|
|
234
|
-
if (oldChangelog.startsWith('\n')) {
|
|
235
|
-
oldChangelog = oldChangelog.replace('\n', '');
|
|
247
|
+
oldChangelog = String(await plugins.fsInstance.file(previousChangelogPath).encoding('utf8').read());
|
|
236
248
|
}
|
|
237
|
-
|
|
238
|
-
let newChangelog = `# Changelog\n\n${`## ${newDateString} - {{nextVersion}} - {{nextVersionScope}}
|
|
239
|
-
{{nextVersionMessage}}
|
|
240
|
-
|
|
241
|
-
{{nextVersionDetails}}`}\n\n${oldChangelog}`;
|
|
242
|
-
resultObject.changelog = newChangelog;
|
|
249
|
+
resultObject.changelog = buildChangelog(resultObject, oldChangelog);
|
|
243
250
|
return resultObject;
|
|
244
251
|
}
|
|
245
252
|
}
|
|
246
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvYWlkb2NzX2NsYXNzZXMvY29tbWl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzVELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkMsbURBQW1EO0FBQ25ELE1BQU0sWUFBWSxHQUFHO0lBQ25CLG9CQUFvQixFQUFFLE1BQU0sRUFBSSw0QkFBNEI7SUFDNUQsYUFBYSxFQUFFLEtBQUssRUFBYSxzQ0FBc0M7SUFDdkUsbUJBQW1CLEVBQUUsTUFBTSxFQUFNLDBDQUEwQztJQUMzRSxvQkFBb0IsRUFBRSxJQUFJLEVBQU8sNEJBQTRCO0NBQ3JELENBQUM7QUFFWDs7R0FFRztBQUNILFNBQVMsc0JBQXNCO0lBQzdCLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxvQkFBb0I7VUFDL0MsWUFBWSxDQUFDLGFBQWE7VUFDMUIsWUFBWSxDQUFDLG1CQUFtQjtVQUNoQyxZQUFZLENBQUMsb0JBQW9CLENBQUM7SUFDdEMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBV0QsTUFBTSxPQUFPLE1BQU07SUFJakIsWUFBWSxTQUFnQixFQUFFLGFBQXFCO1FBQ2pELElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLENBQUM7SUFFTSxLQUFLLENBQUMscUJBQXFCO1FBQ2hDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLENB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
|
|
253
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvYWlkb2NzX2NsYXNzZXMvY29tbWl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV6RSxtREFBbUQ7QUFDbkQsTUFBTSxZQUFZLEdBQUc7SUFDbkIsb0JBQW9CLEVBQUUsTUFBTSxFQUFJLDRCQUE0QjtJQUM1RCxhQUFhLEVBQUUsS0FBSyxFQUFhLHNDQUFzQztJQUN2RSxtQkFBbUIsRUFBRSxNQUFNLEVBQU0sMENBQTBDO0lBQzNFLG9CQUFvQixFQUFFLElBQUksRUFBTyw0QkFBNEI7Q0FDckQsQ0FBQztBQUVYOztHQUVHO0FBQ0gsU0FBUyxzQkFBc0I7SUFDN0IsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLG9CQUFvQjtVQUMvQyxZQUFZLENBQUMsYUFBYTtVQUMxQixZQUFZLENBQUMsbUJBQW1CO1VBQ2hDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQztJQUN0QyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFXRCxNQUFNLE9BQU8sY0FBZSxTQUFRLEtBQUs7SUFDdkMsWUFBWSxPQUFPLEdBQUcseURBQXlEO1FBQzdFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztDQUNGO0FBRUQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFjLEVBQW9ELEVBQUU7SUFD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
|
|
@@ -1,21 +1,44 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
2
|
import { ProjectContext } from './projectcontext.js';
|
|
3
3
|
import { logger } from '../logging.js';
|
|
4
|
+
import { createReadOnlyFileSystemTools } from '../helpers.agenttools.js';
|
|
5
|
+
const parseDescriptionJson = (text) => {
|
|
6
|
+
const jsonString = text
|
|
7
|
+
.replace(/```json\n?/gi, '')
|
|
8
|
+
.replace(/```\n?/gi, '')
|
|
9
|
+
.match(/\{[\s\S]*\}/)?.[0] ?? text;
|
|
10
|
+
const parsed = JSON.parse(jsonString);
|
|
11
|
+
if (typeof parsed.description !== 'string' || parsed.description.trim().length === 0) {
|
|
12
|
+
throw new Error('description must be a non-empty string.');
|
|
13
|
+
}
|
|
14
|
+
if (!Array.isArray(parsed.keywords) || parsed.keywords.some(keyword => typeof keyword !== 'string')) {
|
|
15
|
+
throw new Error('keywords must be an array of strings.');
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
description: parsed.description.trim(),
|
|
19
|
+
keywords: parsed.keywords.map(keyword => keyword.trim()).filter(Boolean),
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
const ensureModuleConfig = (config) => {
|
|
23
|
+
if (!config.module || typeof config.module !== 'object') {
|
|
24
|
+
config.module = {};
|
|
25
|
+
}
|
|
26
|
+
return config.module;
|
|
27
|
+
};
|
|
4
28
|
export class Description {
|
|
5
29
|
constructor(aiDocsRef, projectDirArg) {
|
|
6
30
|
this.aiDocsRef = aiDocsRef;
|
|
7
31
|
this.projectDir = projectDirArg;
|
|
8
32
|
}
|
|
9
33
|
async build() {
|
|
10
|
-
|
|
11
|
-
const fsTools = plugins.smartagentTools.filesystemTool({ rootDir: this.projectDir });
|
|
34
|
+
const fsTools = createReadOnlyFileSystemTools(this.projectDir);
|
|
12
35
|
const descriptionSystemPrompt = `
|
|
13
36
|
You create project descriptions and keywords for npm packages.
|
|
14
37
|
|
|
15
38
|
You have access to filesystem tools to explore the project.
|
|
16
39
|
|
|
17
40
|
IMPORTANT RULES:
|
|
18
|
-
- Only READ files (package.json, .smartconfig.json, source files in ts/)
|
|
41
|
+
- Only READ files (package.json, .smartconfig.json, source files in ts/ and ts_web/)
|
|
19
42
|
- Do NOT write, delete, or modify any files
|
|
20
43
|
- Your final response must be valid JSON only
|
|
21
44
|
- Description must be a clear, concise one-sentence summary
|
|
@@ -30,7 +53,7 @@ Use the filesystem tools to explore the project and understand what it does:
|
|
|
30
53
|
1. First, use list_directory to see the project structure
|
|
31
54
|
2. Read package.json to understand the package name and current description
|
|
32
55
|
3. Read .smartconfig.json if it exists for additional metadata
|
|
33
|
-
4. Read key source files in ts/
|
|
56
|
+
4. Read key source files in ts/ and ts_web/ directories to understand the implementation
|
|
34
57
|
|
|
35
58
|
Then generate a description and keywords based on your exploration.
|
|
36
59
|
|
|
@@ -45,32 +68,53 @@ Your answer should be parseable with JSON.parse() without modifying anything.
|
|
|
45
68
|
Don't wrap the JSON in \`\`\`json\`\`\` - just return the raw JSON object.
|
|
46
69
|
`;
|
|
47
70
|
logger.log('info', 'Starting description generation with agent...');
|
|
48
|
-
const descriptionResult = await
|
|
49
|
-
|
|
71
|
+
const descriptionResult = await this.aiDocsRef.runAgent({
|
|
72
|
+
taskName: 'description',
|
|
73
|
+
projectDir: this.projectDir,
|
|
50
74
|
prompt: descriptionTaskPrompt,
|
|
51
75
|
system: descriptionSystemPrompt,
|
|
52
76
|
tools: fsTools,
|
|
53
77
|
maxSteps: 15,
|
|
78
|
+
useCompaction: true,
|
|
79
|
+
maxValidationRetries: 1,
|
|
80
|
+
validateCompletion: (result) => {
|
|
81
|
+
try {
|
|
82
|
+
parseDescriptionJson(result.text);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
return `Return only valid JSON matching { "description": string, "keywords": string[] }. Error: ${error instanceof Error ? error.message : String(error)}`;
|
|
86
|
+
}
|
|
87
|
+
},
|
|
54
88
|
onToolCall: (toolName) => logger.log('info', `[Description] Tool call: ${toolName}`),
|
|
55
89
|
});
|
|
56
|
-
|
|
57
|
-
const resultObject = JSON.parse(descriptionResult.text.replace('```json', '').replace('```', ''));
|
|
90
|
+
const resultObject = parseDescriptionJson(descriptionResult.text);
|
|
58
91
|
// Use ProjectContext to get file handles for writing
|
|
59
92
|
const projectContext = new ProjectContext(this.projectDir);
|
|
60
93
|
const files = await projectContext.gatherFiles();
|
|
61
94
|
// Update smartconfig.json
|
|
62
95
|
const smartconfigJson = files.smartfilesSmartconfigJSON;
|
|
63
|
-
const smartconfigJsonContent =
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
96
|
+
const smartconfigJsonContent = smartconfigJson.contents.length > 0
|
|
97
|
+
? JSON.parse(smartconfigJson.contents.toString())
|
|
98
|
+
: {};
|
|
99
|
+
if (!smartconfigJsonContent['@git.zone/cli'] || typeof smartconfigJsonContent['@git.zone/cli'] !== 'object') {
|
|
100
|
+
smartconfigJsonContent['@git.zone/cli'] = {};
|
|
101
|
+
}
|
|
102
|
+
const modernModuleConfig = ensureModuleConfig(smartconfigJsonContent['@git.zone/cli']);
|
|
103
|
+
modernModuleConfig.description = resultObject.description;
|
|
104
|
+
modernModuleConfig.keywords = resultObject.keywords;
|
|
105
|
+
if (smartconfigJsonContent.gitzone && typeof smartconfigJsonContent.gitzone === 'object') {
|
|
106
|
+
const legacyModuleConfig = ensureModuleConfig(smartconfigJsonContent.gitzone);
|
|
107
|
+
legacyModuleConfig.description = resultObject.description;
|
|
108
|
+
legacyModuleConfig.keywords = resultObject.keywords;
|
|
109
|
+
}
|
|
110
|
+
smartconfigJson.contents = Buffer.from(`${JSON.stringify(smartconfigJsonContent, null, 2)}\n`);
|
|
67
111
|
await smartconfigJson.write();
|
|
68
112
|
// Update package.json
|
|
69
113
|
const packageJson = files.smartfilePackageJSON;
|
|
70
114
|
const packageJsonContent = JSON.parse(packageJson.contents.toString());
|
|
71
115
|
packageJsonContent.description = resultObject.description;
|
|
72
116
|
packageJsonContent.keywords = resultObject.keywords;
|
|
73
|
-
packageJson.contents = Buffer.from(JSON.stringify(packageJsonContent, null, 2));
|
|
117
|
+
packageJson.contents = Buffer.from(`${JSON.stringify(packageJsonContent, null, 2)}\n`);
|
|
74
118
|
await packageJson.write();
|
|
75
119
|
console.log(`\n======================\n`);
|
|
76
120
|
console.log(JSON.stringify(resultObject, null, 2));
|
|
@@ -78,4 +122,4 @@ Don't wrap the JSON in \`\`\`json\`\`\` - just return the raw JSON object.
|
|
|
78
122
|
return descriptionResult.text;
|
|
79
123
|
}
|
|
80
124
|
}
|
|
81
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9haWRvY3NfY2xhc3Nlcy9kZXNjcmlwdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQU96RSxNQUFNLG9CQUFvQixHQUFHLENBQUMsSUFBWSxFQUF5QixFQUFFO0lBQ25FLE1BQU0sVUFBVSxHQUFHLElBQUk7U0FDcEIsT0FBTyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7U0FDM0IsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7U0FDdkIsS0FBSyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUEwQixDQUFDO0lBQy9ELElBQUksT0FBTyxNQUFNLENBQUMsV0FBVyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNyRixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDcEcsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFD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
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
2
|
export declare class ProjectContext {
|
|
3
|
-
static fromDir(dirArg: string): Promise<
|
|
3
|
+
static fromDir(dirArg: string): Promise<ProjectContext>;
|
|
4
4
|
projectDir: string;
|
|
5
5
|
private tokenCount;
|
|
6
6
|
private contextString;
|
|
7
7
|
constructor(projectDirArg: string);
|
|
8
|
+
private getSmartFile;
|
|
8
9
|
gatherFiles(): Promise<{
|
|
9
10
|
smartfilePackageJSON: plugins.smartfile.SmartFile;
|
|
10
11
|
smartfilesReadme: plugins.smartfile.SmartFile;
|
|
@@ -1,18 +1,34 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
2
|
export class ProjectContext {
|
|
3
|
-
static async fromDir(dirArg) {
|
|
3
|
+
static async fromDir(dirArg) {
|
|
4
|
+
const projectContext = new ProjectContext(dirArg);
|
|
5
|
+
await projectContext.update();
|
|
6
|
+
return projectContext;
|
|
7
|
+
}
|
|
4
8
|
constructor(projectDirArg) {
|
|
5
9
|
this.tokenCount = 0;
|
|
6
10
|
this.contextString = '';
|
|
7
11
|
this.projectDir = projectDirArg;
|
|
8
12
|
}
|
|
13
|
+
async getSmartFile(fileName) {
|
|
14
|
+
const filePath = plugins.path.join(this.projectDir, fileName);
|
|
15
|
+
if (await plugins.fsInstance.file(filePath).exists()) {
|
|
16
|
+
return await plugins.smartfileFactory.fromFilePath(filePath, this.projectDir);
|
|
17
|
+
}
|
|
18
|
+
return plugins.smartfileFactory.fromString(filePath, '', 'utf8');
|
|
19
|
+
}
|
|
9
20
|
async gatherFiles() {
|
|
10
|
-
const smartfilePackageJSON = await
|
|
11
|
-
const smartfilesReadme = await
|
|
12
|
-
const smartfilesReadmeHints = await
|
|
13
|
-
const smartfilesSmartconfigJSON = await
|
|
14
|
-
const
|
|
15
|
-
const
|
|
21
|
+
const smartfilePackageJSON = await this.getSmartFile('package.json');
|
|
22
|
+
const smartfilesReadme = await this.getSmartFile('readme.md');
|
|
23
|
+
const smartfilesReadmeHints = await this.getSmartFile('readme.hints.md');
|
|
24
|
+
const smartfilesSmartconfigJSON = await this.getSmartFile('.smartconfig.json');
|
|
25
|
+
const virtualDirectory = await plugins.smartfileFactory.virtualDirectoryFromPath(this.projectDir);
|
|
26
|
+
const smartfilesMod = await virtualDirectory
|
|
27
|
+
.filter(f => (f.relative.startsWith('ts/') || f.relative.startsWith('ts_web/')) && f.relative.endsWith('.ts'))
|
|
28
|
+
.listFiles();
|
|
29
|
+
const smartfilesTest = await virtualDirectory
|
|
30
|
+
.filter(f => f.relative.startsWith('test/') && f.relative.endsWith('.ts'))
|
|
31
|
+
.listFiles();
|
|
16
32
|
return {
|
|
17
33
|
smartfilePackageJSON,
|
|
18
34
|
smartfilesReadme,
|
|
@@ -86,4 +102,4 @@ ${smartfile.contents.toString()}
|
|
|
86
102
|
return result;
|
|
87
103
|
}
|
|
88
104
|
}
|
|
89
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdGNvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9haWRvY3NfY2xhc3Nlcy9wcm9qZWN0Y29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxNQUFNLE9BQU8sY0FBYztJQUNsQixNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFjO1FBQ3hDLE1BQU0sY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELE1BQU0sY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzlCLE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFPRCxZQUFZLGFBQXFCO1FBSHpCLGVBQVUsR0FBVyxDQUFDLENBQUM7UUFDdkIsa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFHakMsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUM7SUFDbEMsQ0FBQztJQUVPLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBZ0I7UUFDekMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM5RCxJQUFJLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUNyRCxPQUFPLE1BQU0sT0FBTyxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRU0sS0FBSyxDQUFDLFdBQVc7UUFDdEIsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLElBQUks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
|