@git.zone/tsdoc 1.11.2 → 1.11.4

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.
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@git.zone/tsdoc',
6
- version: '1.11.0',
6
+ version: '1.11.4',
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxpQkFBaUI7SUFDdkIsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLDhNQUE4TTtDQUM1TixDQUFBIn0=
@@ -86,7 +86,6 @@ export class Commit {
86
86
  processedDiffString = 'No changes.';
87
87
  }
88
88
  // Use DualAgentOrchestrator for commit message generation
89
- // Note: No filesystem tool needed - the diff already contains all change information
90
89
  const commitOrchestrator = new plugins.smartagent.DualAgentOrchestrator({
91
90
  smartAiInstance: this.aiDocsRef.smartAiInstance,
92
91
  defaultProvider: 'openai',
@@ -95,41 +94,62 @@ export class Commit {
95
94
  guardianPolicyPrompt: `
96
95
  You validate commit messages for semantic versioning compliance.
97
96
 
98
- APPROVE if:
97
+ APPROVE tool calls for:
98
+ - Reading package.json or source files to understand project context
99
+ - Using tree to see project structure
100
+ - Listing directory contents
101
+
102
+ REJECT tool calls for:
103
+ - Reading files outside the project directory
104
+ - Writing, deleting, or modifying any files
105
+ - Any destructive operations
106
+
107
+ APPROVE final output if:
99
108
  - Version level (fix/feat/BREAKING CHANGE) matches the scope of changes in the diff
100
109
  - Commit message is clear, professional, and follows conventional commit conventions
101
110
  - No personal information, licensing details, or AI mentions (Claude/Codex) included
102
111
  - JSON structure is valid with all required fields
103
112
  - Scope accurately reflects the changed modules/files
104
113
 
105
- REJECT with specific feedback if:
114
+ REJECT final output if:
106
115
  - Version level doesn't match the scope of changes (e.g., "feat" for a typo fix should be "fix")
107
116
  - Message is vague, unprofessional, or contains sensitive information
108
117
  - JSON is malformed or missing required fields
109
118
  `,
110
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
+ ]);
111
128
  await commitOrchestrator.start();
112
129
  const commitTaskPrompt = `
113
130
  You create a commit message for a git commit.
114
131
  Project directory: ${this.projectDir}
115
132
 
133
+ You have access to a filesystem tool to explore the project if needed:
134
+ - Use tree to see project structure
135
+ - Use read to read package.json or source files for context
136
+
116
137
  Analyze the git diff below to understand what changed and generate a commit message.
117
138
 
118
139
  You should not include any licensing information or personal information.
119
140
  Never mention CLAUDE code, or codex.
120
141
 
121
- Important: Answer only in valid JSON.
142
+ Your final output (inside the task_complete tags) must be ONLY valid JSON - the raw JSON object, nothing else.
143
+ No explanations, no summaries, no markdown - just the JSON object that can be parsed with JSON.parse().
122
144
 
123
- Your answer should be parseable with JSON.parse() without modifying anything.
145
+ Here is the structure of the JSON you must return:
124
146
 
125
- Here is the structure of the JSON you should return:
126
-
127
- interface {
128
- recommendedNextVersionLevel: 'fix' | 'feat' | 'BREAKING CHANGE'; // the recommended next version level
129
- recommendedNextVersionScope: string; // scope name like "core", "cli", or specific class names
130
- recommendedNextVersionMessage: string; // the commit message (don't include fix/feat prefix)
131
- recommendedNextVersionDetails: string[]; // detailed bullet points for the changelog
132
- recommendedNextVersion: string; // the recommended next version x.x.x
147
+ {
148
+ "recommendedNextVersionLevel": "fix" | "feat" | "BREAKING CHANGE",
149
+ "recommendedNextVersionScope": "string",
150
+ "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')",
151
+ "recommendedNextVersionDetails": ["string"],
152
+ "recommendedNextVersion": "x.x.x"
133
153
  }
134
154
 
135
155
  For recommendedNextVersionDetails, only add entries that have obvious value to the reader.
@@ -138,14 +158,24 @@ Here is the git diff showing what changed:
138
158
 
139
159
  ${processedDiffString}
140
160
 
141
- Generate the commit message based on these changes.
161
+ Analyze these changes and output the JSON commit message object.
142
162
  `;
143
163
  const commitResult = await commitOrchestrator.run(commitTaskPrompt);
144
164
  await commitOrchestrator.stop();
145
165
  if (!commitResult.success) {
146
166
  throw new Error(`Commit message generation failed: ${commitResult.status}`);
147
167
  }
148
- const resultObject = JSON.parse(commitResult.result.replace('```json', '').replace('```', ''));
168
+ // Extract JSON from result - handle cases where AI adds text around it
169
+ let jsonString = commitResult.result
170
+ .replace(/```json\n?/gi, '')
171
+ .replace(/```\n?/gi, '');
172
+ // Try to find JSON object in the result
173
+ const jsonMatch = jsonString.match(/\{[\s\S]*\}/);
174
+ if (!jsonMatch) {
175
+ throw new Error(`Could not find JSON object in result: ${jsonString.substring(0, 100)}...`);
176
+ }
177
+ jsonString = jsonMatch[0];
178
+ const resultObject = JSON.parse(jsonString);
149
179
  const previousChangelogPath = plugins.path.join(this.projectDir, 'changelog.md');
150
180
  let previousChangelog;
151
181
  if (await plugins.fsInstance.file(previousChangelogPath).exists()) {
@@ -218,4 +248,4 @@ ${JSON.stringify(commitMessages, null, 2)}
218
248
  return resultObject;
219
249
  }
220
250
  }
221
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvYWlkb2NzX2NsYXNzZXMvY29tbWl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzVELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFXdkMsTUFBTSxPQUFPLE1BQU07SUFJakIsWUFBWSxTQUFnQixFQUFFLGFBQXFCO1FBQ2pELElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLENBQUM7SUFFTSxLQUFLLENBQUMscUJBQXFCO1FBQ2hDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3pELE1BQU0sZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDOUIsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FDL0QsZ0JBQWdCLEVBQ2hCLElBQUksQ0FBQyxVQUFVLENBQ2hCLENBQUM7UUFFRiwwQ0FBMEM7UUFDMUMsa0RBQWtEO1FBQ2xELE1BQU0sZUFBZSxHQUFHO1lBQ3RCLGFBQWE7WUFDYixnQkFBZ0I7WUFDaEIsbUJBQW1CO1lBQ25CLHFCQUFxQjtZQUNyQixXQUFXO1lBQ1gsV0FBVztZQUNYLFdBQVc7WUFFWCxrREFBa0Q7WUFDbEQsU0FBUztZQUNULFdBQVcsRUFBWSwwQkFBMEI7WUFDakQsVUFBVTtZQUNWLFVBQVU7WUFDVixRQUFRO1lBQ1IsZ0JBQWdC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
251
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvYWlkb2NzX2NsYXNzZXMvY29tbWl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzVELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFXdkMsTUFBTSxPQUFPLE1BQU07SUFJakIsWUFBWSxTQUFnQixFQUFFLGFBQXFCO1FBQ2pELElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLENBQUM7SUFFTSxLQUFLLENBQUMscUJBQXFCO1FBQ2hDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3pELE1BQU0sZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDOUIsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FDL0QsZ0JBQWdCLEVBQ2hCLElBQUksQ0FBQyxVQUFVLENBQ2hCLENBQUM7UUFFRiwwQ0FBMEM7UUFDMUMsa0RBQWtEO1FBQ2xELE1BQU0sZUFBZSxHQUFHO1lBQ3RCLGFBQWE7WUFDYixnQkFBZ0I7WUFDaEIsbUJBQW1CO1lBQ25CLHFCQUFxQjtZQUNyQixXQUFXO1lBQ1gsV0FBVztZQUNYLFdBQVc7WUFFWCxrREFBa0Q7WUFDbEQsU0FBUztZQUNULFdBQVcsRUFBWSwwQkFBMEI7WUFDakQsVUFBVTtZQUNWLFVBQVU7WUFDVixRQUFRO1lBQ1IsZ0JBQWdC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
package/dist_ts/cli.js CHANGED
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@git.zone/tsdoc",
3
- "version": "1.11.2",
3
+ "version": "1.11.4",
4
4
  "private": false,
5
5
  "description": "A comprehensive TypeScript documentation tool that leverages AI to generate and enhance project documentation, including dynamic README creation, API docs via TypeDoc, and smart commit message generation.",
6
6
  "type": "module",
@@ -12,6 +12,12 @@
12
12
  "bin": {
13
13
  "tsdoc": "cli.js"
14
14
  },
15
+ "scripts": {
16
+ "test": "(tstest test/ --verbose --logfile --timeout 600) && npm run testCli",
17
+ "testCli": "(node ./cli.ts.js) && (node ./cli.ts.js aidocs)",
18
+ "build": "(tsbuild --web --allowimplicitany)",
19
+ "buildDocs": "tsdoc"
20
+ },
15
21
  "devDependencies": {
16
22
  "@git.zone/tsbuild": "^4.0.2",
17
23
  "@git.zone/tsrun": "^2.0.1",
@@ -23,7 +29,7 @@
23
29
  "@push.rocks/early": "^4.0.4",
24
30
  "@push.rocks/npmextra": "^5.3.3",
25
31
  "@push.rocks/qenv": "^6.1.3",
26
- "@push.rocks/smartagent": "file:../../push.rocks/smartagent",
32
+ "@push.rocks/smartagent": "1.2.5",
27
33
  "@push.rocks/smartai": "^0.8.0",
28
34
  "@push.rocks/smartcli": "^4.0.19",
29
35
  "@push.rocks/smartdelay": "^3.0.5",
@@ -75,10 +81,5 @@
75
81
  "url": "https://gitlab.com/gitzone/tsdoc/issues"
76
82
  },
77
83
  "homepage": "https://gitlab.com/gitzone/tsdoc#readme",
78
- "scripts": {
79
- "test": "(tstest test/ --verbose --logfile --timeout 600) && npm run testCli",
80
- "testCli": "(node ./cli.ts.js) && (node ./cli.ts.js aidocs)",
81
- "build": "(tsbuild --web --allowimplicitany)",
82
- "buildDocs": "tsdoc"
83
- }
84
- }
84
+ "packageManager": "pnpm@10.14.0+sha512.ad27a79641b49c3e481a16a805baa71817a04bbe06a38d17e60e2eaee83f6a146c6a688125f5792e48dd5ba30e7da52a5cda4c3992b9ccf333f9ce223af84748"
85
+ }
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@git.zone/tsdoc',
6
- version: '1.11.0',
6
+ version: '1.11.4',
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
  }
@@ -116,7 +116,6 @@ export class Commit {
116
116
  }
117
117
 
118
118
  // Use DualAgentOrchestrator for commit message generation
119
- // Note: No filesystem tool needed - the diff already contains all change information
120
119
  const commitOrchestrator = new plugins.smartagent.DualAgentOrchestrator({
121
120
  smartAiInstance: this.aiDocsRef.smartAiInstance,
122
121
  defaultProvider: 'openai',
@@ -125,43 +124,65 @@ export class Commit {
125
124
  guardianPolicyPrompt: `
126
125
  You validate commit messages for semantic versioning compliance.
127
126
 
128
- APPROVE if:
127
+ APPROVE tool calls for:
128
+ - Reading package.json or source files to understand project context
129
+ - Using tree to see project structure
130
+ - Listing directory contents
131
+
132
+ REJECT tool calls for:
133
+ - Reading files outside the project directory
134
+ - Writing, deleting, or modifying any files
135
+ - Any destructive operations
136
+
137
+ APPROVE final output if:
129
138
  - Version level (fix/feat/BREAKING CHANGE) matches the scope of changes in the diff
130
139
  - Commit message is clear, professional, and follows conventional commit conventions
131
140
  - No personal information, licensing details, or AI mentions (Claude/Codex) included
132
141
  - JSON structure is valid with all required fields
133
142
  - Scope accurately reflects the changed modules/files
134
143
 
135
- REJECT with specific feedback if:
144
+ REJECT final output if:
136
145
  - Version level doesn't match the scope of changes (e.g., "feat" for a typo fix should be "fix")
137
146
  - Message is vague, unprofessional, or contains sensitive information
138
147
  - JSON is malformed or missing required fields
139
148
  `,
140
149
  });
141
150
 
151
+ // Register scoped filesystem tool for agent exploration
152
+ commitOrchestrator.registerScopedFilesystemTool(this.projectDir, [
153
+ '.nogit/**',
154
+ 'node_modules/**',
155
+ '.git/**',
156
+ 'dist/**',
157
+ 'dist_*/**',
158
+ ]);
159
+
142
160
  await commitOrchestrator.start();
143
161
 
144
162
  const commitTaskPrompt = `
145
163
  You create a commit message for a git commit.
146
164
  Project directory: ${this.projectDir}
147
165
 
166
+ You have access to a filesystem tool to explore the project if needed:
167
+ - Use tree to see project structure
168
+ - Use read to read package.json or source files for context
169
+
148
170
  Analyze the git diff below to understand what changed and generate a commit message.
149
171
 
150
172
  You should not include any licensing information or personal information.
151
173
  Never mention CLAUDE code, or codex.
152
174
 
153
- Important: Answer only in valid JSON.
175
+ Your final output (inside the task_complete tags) must be ONLY valid JSON - the raw JSON object, nothing else.
176
+ No explanations, no summaries, no markdown - just the JSON object that can be parsed with JSON.parse().
154
177
 
155
- Your answer should be parseable with JSON.parse() without modifying anything.
178
+ Here is the structure of the JSON you must return:
156
179
 
157
- Here is the structure of the JSON you should return:
158
-
159
- interface {
160
- recommendedNextVersionLevel: 'fix' | 'feat' | 'BREAKING CHANGE'; // the recommended next version level
161
- recommendedNextVersionScope: string; // scope name like "core", "cli", or specific class names
162
- recommendedNextVersionMessage: string; // the commit message (don't include fix/feat prefix)
163
- recommendedNextVersionDetails: string[]; // detailed bullet points for the changelog
164
- recommendedNextVersion: string; // the recommended next version x.x.x
180
+ {
181
+ "recommendedNextVersionLevel": "fix" | "feat" | "BREAKING CHANGE",
182
+ "recommendedNextVersionScope": "string",
183
+ "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')",
184
+ "recommendedNextVersionDetails": ["string"],
185
+ "recommendedNextVersion": "x.x.x"
165
186
  }
166
187
 
167
188
  For recommendedNextVersionDetails, only add entries that have obvious value to the reader.
@@ -170,7 +191,7 @@ Here is the git diff showing what changed:
170
191
 
171
192
  ${processedDiffString}
172
193
 
173
- Generate the commit message based on these changes.
194
+ Analyze these changes and output the JSON commit message object.
174
195
  `;
175
196
 
176
197
  const commitResult = await commitOrchestrator.run(commitTaskPrompt);
@@ -180,9 +201,19 @@ Generate the commit message based on these changes.
180
201
  throw new Error(`Commit message generation failed: ${commitResult.status}`);
181
202
  }
182
203
 
183
- const resultObject: INextCommitObject = JSON.parse(
184
- commitResult.result.replace('```json', '').replace('```', '')
185
- );
204
+ // Extract JSON from result - handle cases where AI adds text around it
205
+ let jsonString = commitResult.result
206
+ .replace(/```json\n?/gi, '')
207
+ .replace(/```\n?/gi, '');
208
+
209
+ // Try to find JSON object in the result
210
+ const jsonMatch = jsonString.match(/\{[\s\S]*\}/);
211
+ if (!jsonMatch) {
212
+ throw new Error(`Could not find JSON object in result: ${jsonString.substring(0, 100)}...`);
213
+ }
214
+ jsonString = jsonMatch[0];
215
+
216
+ const resultObject: INextCommitObject = JSON.parse(jsonString);
186
217
 
187
218
  const previousChangelogPath = plugins.path.join(this.projectDir, 'changelog.md');
188
219
  let previousChangelog: plugins.smartfile.SmartFile;