Compare commits

..

No commits in common. "master" and "v1.2.1" have entirely different histories.

10 changed files with 2117 additions and 5485 deletions

View File

@ -1,109 +1,13 @@
# Changelog # Changelog
## 2025-02-25 - 1.4.4 - fix(dependencies) ## 1.2.1
Update dependencies to latest versions fix(core): Fixed usage of plugins in project context and readme generation
- Updated '@push.rocks/smartai' from '^0.0.17' to '^0.4.2' ## 1.2.0
- Updated 'typedoc' from '^0.26.1' to '^0.27.9' feat(aidocs_classes): Enhance changelog generation by supporting complete generation in the absence of previous changelog files
## 2025-01-14 - 1.4.3 - fix(aidocs_classes) ## 1.1.42
Improve readme generation instructions to ensure correct markdown formatting. fix(aidoc_classes): Improve commit message generation by handling empty diffs and updating changelog instructions
- Added guidance to avoid using backticks at the beginning and end of readme generation to prevent markdown issues. ## 1.1.41
- Clarified that the output is directly written to readme.md and backticks should only be used for code blocks. fix(aidoc_classes): Improve commit message generation by handling empty diffs and updating changelog instructions
## 2024-10-28 - 1.4.2 - fix(cli)
Ensure async completion for aidoc readme and description generation
- Added await statements for asynchronous methods buildReadme and buildDescription in the aidoc command.
## 2024-10-28 - 1.4.1 - fix(readme)
Correct async call to getModuleSubDirs in readme generation.
- Fixed an issue with asynchronous handling in readme generation for submodules.
- Ensured that getModuleSubDirs function is called with await to handle promises properly.
## 2024-10-28 - 1.4.0 - feat(aidocs)
Added support for building readmes for sub-modules in aidocs
- Updated the `Readme` class to handle monorepo projects by generating readmes for sub-modules.
- Integrated `tspublish` to identify sub-modules for readme generation.
## 2024-06-24 - 1.3.12 - fix(aidocs)
Fix changelog generation by handling leading newlines
- Fixed handling of leading newlines in the changelog to ensure proper formatting.
## 2024-06-23 - 1.3.11 - fix(core)
Fixed new changelog formatting issue to retain consistent spacing.
- Adjusted the new changelog generation to ensure consistent spacing for improved readability.
## 2024-06-23 - 1.3.10 - fix(aidocs_classes)
Fix changelog format to remove extra newline
- Updated `ts/aidocs_classes/commit.ts` to fix the changelog format.
## 2024-06-23 - 1.3.9 - fix(aidoc)
Fix changelog generation by properly stripping markdown code fences
- Corrected the changelog generation code to ensure markdown code fences are properly stripped.
## 2024-06-23 - 1.3.8 - fix(changelog)
Fix changelog generation by properly stripping markdown code fences
- Corrected the changelog generation code to ensure markdown code fences are properly stripped.
## 2024-06-23 - 1.3.7 - fix(aidoc)
Update to include package-lock.json in uncommitted changes check
- Modified the getUncommittedDiff method call in commit.ts to include package-lock.json along with pnpm-lock.yaml
## 2024-06-23 - 1.3.6 - fix(commit)
Fixed issue with retrieving uncommitted diffs in git repository
- Revised logic to correctly handle uncommitted changes by using an array for `getUncommittedDiff` method
- Ensured proper handling and representation of uncommitted changes in the output
## 2024-06-23 - 1.3.5 - fix(aidocs_classes)
Refactor and enhance changelog formatting
- Updated the `commit.ts` file to improve the changelog formatting and ensure consistency.
- Enhanced the changelog instructions to include summarizing messages for omitted commits.
- Removed unnecessary console logging in `projectcontext.ts`.
```markdown
## 2024-06-23 - 1.3.3 - fix(aidocs_classes)
Fix changelog formatting issue in commit class
## 2024-06-23 - 1.3.2 - fix(aidocs_classes)
Fix minor bugs and update dependencies in aidocs_classes
## 2024-06-23 - 1.3.1 - fix(aidocs_classes)
Fix typo in INextCommitObject interface and update date format in changelog generation.
## 2024-06-23 - 1.3.0 - fix(aidocs_classes)
Fix typo in INextCommitObject interface
## 2024-06-23 - 1.2.4 - feat(core)
Added smarttime dependency and improved changelog generation
## 2024-06-23 - 1.2.3 - fix(logging)
Refactor logger initialization to use commitinfo data
## 2024-06-23 - 1.2.2 - fix(aidocs)
Fix bug in AiDoc class causing undefined token handling
## 2024-06-23 - 1.2.0 - fix(core)
Fixed usage of plugins in project context and readme generation
## 2024-06-23 - 1.1.42 - feat(aidocs_classes)
Enhance changelog generation by supporting complete generation in the absence of previous changelog files
## 2024-06-23 - 1.1.41 - fix(aidocs_classes)
Improve commit message generation by handling empty diffs and updating changelog instructions
```

View File

@ -1,6 +1,6 @@
{ {
"name": "@git.zone/tsdoc", "name": "@git.zone/tsdoc",
"version": "1.4.4", "version": "1.2.1",
"private": false, "private": false,
"description": "An advanced TypeScript documentation tool using AI to generate and enhance documentation for TypeScript projects.", "description": "An advanced TypeScript documentation tool using AI to generate and enhance documentation for TypeScript projects.",
"type": "module", "type": "module",
@ -23,25 +23,23 @@
"@git.zone/tsrun": "^1.2.46", "@git.zone/tsrun": "^1.2.46",
"@git.zone/tstest": "^1.0.90", "@git.zone/tstest": "^1.0.90",
"@push.rocks/tapbundle": "^5.0.23", "@push.rocks/tapbundle": "^5.0.23",
"@types/node": "^22.8.1" "@types/node": "^20.14.8"
}, },
"dependencies": { "dependencies": {
"@git.zone/tspublish": "^1.5.5",
"@push.rocks/early": "^4.0.3", "@push.rocks/early": "^4.0.3",
"@push.rocks/npmextra": "^5.0.23", "@push.rocks/npmextra": "^5.0.23",
"@push.rocks/qenv": "^6.0.5", "@push.rocks/qenv": "^6.0.5",
"@push.rocks/smartai": "^0.4.2", "@push.rocks/smartai": "^0.0.17",
"@push.rocks/smartcli": "^4.0.11", "@push.rocks/smartcli": "^4.0.11",
"@push.rocks/smartdelay": "^3.0.5", "@push.rocks/smartdelay": "^3.0.5",
"@push.rocks/smartfile": "^11.0.20", "@push.rocks/smartfile": "^11.0.20",
"@push.rocks/smartgit": "^3.1.0", "@push.rocks/smartgit": "^3.0.4",
"@push.rocks/smartinteract": "^2.0.15", "@push.rocks/smartinteract": "^2.0.15",
"@push.rocks/smartlog": "^3.0.7", "@push.rocks/smartlog": "^3.0.7",
"@push.rocks/smartlog-destination-local": "^9.0.2", "@push.rocks/smartlog-destination-local": "^9.0.2",
"@push.rocks/smartpath": "^5.0.18", "@push.rocks/smartpath": "^5.0.18",
"@push.rocks/smartshell": "^3.0.5", "@push.rocks/smartshell": "^3.0.5",
"@push.rocks/smarttime": "^4.0.6", "typedoc": "^0.26.0",
"typedoc": "^0.27.9",
"typescript": "^5.5.2" "typescript": "^5.5.2"
}, },
"files": [ "files": [

7298
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@ -3,6 +3,6 @@
*/ */
export const commitinfo = { export const commitinfo = {
name: '@git.zone/tsdoc', name: '@git.zone/tsdoc',
version: '1.4.4', version: '1.2.1',
description: 'An advanced TypeScript documentation tool using AI to generate and enhance documentation for TypeScript projects.' description: 'An advanced TypeScript documentation tool using AI to generate and enhance documentation for TypeScript projects.'
} }

View File

@ -6,7 +6,6 @@ export interface INextCommitObject {
recommendedNextVersionLevel: 'fix' | 'feat' | 'BREAKING CHANGE'; // the recommended next version level of the project recommendedNextVersionLevel: 'fix' | 'feat' | 'BREAKING CHANGE'; // the recommended next version level of the project
recommendedNextVersionScope: string; // the recommended scope name of the next version, like "core" or "cli", or specific class names. recommendedNextVersionScope: string; // the recommended scope name of the next version, like "core" or "cli", or specific class names.
recommendedNextVersionMessage: string; // the commit message. Don't put fix() feat() or BREAKING CHANGE in the message. Please just the message itself. recommendedNextVersionMessage: string; // the commit message. Don't put fix() feat() or BREAKING CHANGE in the message. Please just the message itself.
recommendedNextVersionDetails: string[]; // detailed bullet points for the changelog
recommendedNextVersion: string; // the recommended next version of the project, x.x.x recommendedNextVersion: string; // the recommended next version of the project, x.x.x
changelog?: string; // the changelog for the next version changelog?: string; // the changelog for the next version
} }
@ -27,10 +26,7 @@ export class Commit {
smartgitInstance, smartgitInstance,
this.projectDir this.projectDir
); );
const diffStringArray = await gitRepo.getUncommittedDiff([ const diffString = await gitRepo.getUncommittedDiff();
'pnpm-lock.yaml',
'package-lock.json',
]);
const projectContext = new ProjectContext(this.projectDir); const projectContext = new ProjectContext(this.projectDir);
let contextString = await projectContext.update(); let contextString = await projectContext.update();
contextString = ` contextString = `
@ -38,7 +34,7 @@ ${contextString}
Below is the diff of the uncommitted changes. If nothing is changed, there are no changes: Below is the diff of the uncommitted changes. If nothing is changed, there are no changes:
${diffStringArray[0] ? diffStringArray.join('\n\n') : 'No changes.'} ${diffString || 'No changes.'}
`; `;
let result = await this.aiDocsRef.openaiInstance.chat({ let result = await this.aiDocsRef.openaiInstance.chat({
@ -53,17 +49,13 @@ Important: Answer only in valid JSON.
Your answer should be parseable with JSON.parse() without modifying anything. Your answer should be parseable with JSON.parse() without modifying anything.
Here is the structure of the JSON you should return: Here is the structure of the JSON you should return:
{
interface {
recommendedNextVersionLevel: 'fix' | 'feat' | 'BREAKING CHANGE'; // the recommended next version level of the project recommendedNextVersionLevel: 'fix' | 'feat' | 'BREAKING CHANGE'; // the recommended next version level of the project
recommendedNextVersionScope: string; // the recommended scope name of the next version, like "core" or "cli", or specific class names. recommendedNextVersionScope: string; // the recommended scope name of the next version, like "core" or "cli", or specific class names.
recommendedNextVersionMessage: string; // the commit message. Don't put fix() feat() or BREAKING CHANGE in the message. Please just the message itself. recommendedNextVersionMessage: string; // the commit message. Don't put fix() feat() or BREAKING CHANGE in the message. Please just the message itself.
recommendedNextVersionDetails: string[]; // detailed bullet points for the changelog
recommendedNextVersion: string; // the recommended next version of the project, x.x.x recommendedNextVersion: string; // the recommended next version of the project, x.x.x
} }
For the recommendedNextVersionDetails, please only add a detail entries to the array if it has an obvious value to the reader.
You are being given the files of the project. You should use them to create the commit message. You are being given the files of the project. You should use them to create the commit message.
Also you are given a diff Also you are given a diff
@ -77,58 +69,47 @@ Also you are given a diff
result.message.replace('```json', '').replace('```', '') result.message.replace('```json', '').replace('```', '')
); );
// lets build the changelog based on that
const commitMessages = await gitRepo.getAllCommitMessages();
const previousChangelogPath = plugins.path.join(this.projectDir, 'changelog.md'); const previousChangelogPath = plugins.path.join(this.projectDir, 'changelog.md');
let previousChangelog: plugins.smartfile.SmartFile; let previousChangelog: plugins.smartfile.SmartFile;
if (await plugins.smartfile.fs.fileExists(previousChangelogPath)) { if (await plugins.smartfile.fs.fileExists(previousChangelogPath)) {
previousChangelog = await plugins.smartfile.SmartFile.fromFilePath(previousChangelogPath); previousChangelog = await plugins.smartfile.SmartFile.fromFilePath(previousChangelogPath);
} }
if (!previousChangelog) {
// lets build the changelog based on that
const commitMessages = await gitRepo.getAllCommitMessages();
console.log(JSON.stringify(commitMessages, null, 2));
let result2 = await this.aiDocsRef.openaiInstance.chat({ let result2 = await this.aiDocsRef.openaiInstance.chat({
messageHistory: [], messageHistory: [],
systemMessage: ` systemMessage: `
You are building a changelog.md file for the project. You are building a changelog file for the projext.
Omit commits and versions that lack relevant changes, but make sure to mention them as a range with a summarizing message instead. Omit commits and versions that lack relevant changes.
A changelog entry should look like this: You are given
* the previous changelog file (if available)
## yyyy-mm-dd - x.x.x - scope here
main descriptiom here
- detailed bullet points follow
You are given:
* the commit messages of the project * the commit messages of the project
Only return the changelog file, so it can be written directly to changelog.md`, Only return the changelog file, so it can be written directly to changelog.md
userMessage: `
Here are the commit messages:
${JSON.stringify(commitMessages, null, 2)} For the latest version, that is not yet part of the commit messages, add a placeholder entry that uses {{nextVersion}} and {{nextVersionMessage}} as variables to filled later.
Only output newer versions and their changes compared to ones already mentioned. We take of appending your output later.
If there is no previous changelog file, generate a complete changelog from commit messages with heading and everything + the placeholder section mentioned above.
`, `,
userMessage: `
The previous changelog file is:
${!previousChangelog ? 'No previous changelog file found' : previousChangelog.contents.toString()}
Here are the commit messages so far:
${commitMessages.join('\n\n')}
`,
}); });
if (previousChangelog) {
previousChangelog = await plugins.smartfile.SmartFile.fromString( let newChangelog = result2.message;
previousChangelogPath, newChangelog = newChangelog.replace('# Changelog\n\n', '');
result2.message.replaceAll('```markdown', '').replaceAll('```', ''),
'utf8'
);
}
let oldChangelog = previousChangelog.contents.toString().replace('# Changelog\n\n', ''); let oldChangelog = previousChangelog.contents.toString().replace('# Changelog\n\n', '');
if (oldChangelog.startsWith('\n')) { newChangelog = `# Changelog\n\n${newChangelog}\n\n${oldChangelog}`;
oldChangelog = oldChangelog.replace('\n', '');
}
let newDateString = new plugins.smarttime.ExtendedDate().exportToHyphedSortableDate();
let newChangelog = `# Changelog\n\n${`## ${newDateString} - {{nextVersion}} - {{nextVersionScope}}
{{nextVersionMessage}}
{{nextVersionDetails}}`}\n\n${oldChangelog}`;
resultObject.changelog = newChangelog; resultObject.changelog = newChangelog;
} else {
resultObject.changelog = result2.message;
}
return resultObject; return resultObject;
} }
} }

View File

@ -47,8 +47,9 @@ export class ProjectContext {
} }
public async convertFilesToContext(filesArg: plugins.smartfile.SmartFile[]) { public async convertFilesToContext(filesArg: plugins.smartfile.SmartFile[]) {
console.log(`Using the following files for the documentation:`);
filesArg.map((fileArg) => { filesArg.map((fileArg) => {
// console.log(` -> ${fileArg.relative}`); console.log(` -> ${fileArg.relative}`);
}); });
return filesArg return filesArg
.map((smartfile) => { .map((smartfile) => {

View File

@ -1,8 +1,6 @@
import type { AiDoc } from '../classes.aidoc.js'; import type { AiDoc } from '../classes.aidoc.js';
import * as plugins from '../plugins.js'; import * as plugins from '../plugins.js';
import * as paths from '../paths.js';
import { ProjectContext } from './projectcontext.js'; import { ProjectContext } from './projectcontext.js';
import { logger } from '../logging.js';
export class Readme { export class Readme {
// INSTANCE // INSTANCE
@ -23,7 +21,7 @@ export class Readme {
// lets first check legal before introducung any cost // lets first check legal before introducung any cost
const npmExtraJson = JSON.parse( const npmExtraJson = JSON.parse(
(await projectContext.gatherFiles()).smartfilesNpmextraJSON.contents.toString() (await projectContext.gatherFiles()).smartfilesNpmextraJSON.contents.toString(),
); );
const legalInfo = npmExtraJson?.tsdoc?.legal; const legalInfo = npmExtraJson?.tsdoc?.legal;
if (!legalInfo) { if (!legalInfo) {
@ -81,64 +79,6 @@ The Readme should follow the following template:
readme.contents = Buffer.from(finalReadmeString); readme.contents = Buffer.from(finalReadmeString);
await readme.write(); await readme.write();
// lets care about monorepo aspects
const tsPublishInstance = new plugins.tspublish.TsPublish();
const subModules = await tsPublishInstance.getModuleSubDirs(paths.cwd);
logger.log('info', `Found ${Object.keys(subModules).length} sub modules`);
for (const subModule of Object.keys(subModules)) {
logger.log('info', `Building readme for ${subModule}`);
const subModuleContextString = await projectContext.update();
let result = await this.aiDocsRef.openaiInstance.chat({
systemMessage: `
You create markdown readmes for npm projects. You only output the markdown readme.
IMPORTANT: YOU ARE NOW CREATING THE README FOR THE FOLLOWING SUB MODULE: ${subModule} !!!!!!!!!!!
The Sub Module will be published with the following data:
${JSON.stringify(plugins.smartfile.fs.toStringSync(plugins.path.join(paths.cwd, subModule, 'tspublish.json')), null, 2)}
The Readme should follow the following template:
# Project Name
[
The name is the module name of package.json
The description is in the description field of package.json
]
## Install
[
Write a short text on how to install the project
]
## Usage
[
Give code examples here.
Construct sensible scenarios for the user.
Make sure to show a complete set of features of the module.
Don't omit use cases.
It does not matter how much time you need.
ALWAYS USE ESM SYNTAX AND TYPESCRIPT.
DON'T CHICKEN OUT. Write at least 4000 words. More if necessary.
If there is already a readme, take the Usage section as base. Remove outdated content, and expand and improve upon the valid parts.
Super important: Check for completenes.
Don't include any licensing information. This will be added in a later step.
Avoid "in conclusions".
Good to know:
* npmextra.json contains overall module information.
* readme.hints.md provides valuable hints about module ideas.
* Your output lands directly in the readme.md file.
* Don't use \`\`\` at the beginning or the end. It'll cause problems. Only use it for codeblocks. You are directly writing markdown. No need to introduce it weirdly.
]
`,
messageHistory: [],
userMessage: subModuleContextString,
});
const subModuleReadmeString = result.message + '\n' + legalInfo;
await plugins.smartfile.memory.toFs(subModuleReadmeString, plugins.path.join(paths.cwd, subModule, 'readme.md'));
logger.log('success', `Built readme for ${subModule}`);
}
return result.message; return result.message;
} }
} }

View File

@ -28,14 +28,14 @@ export const run = async () => {
}); });
tsdocCli.addCommand('aidoc').subscribe(async (argvArg) => { tsdocCli.addCommand('aidoc').subscribe(async (argvArg) => {
const aidocInstance = new AiDoc();
await aidocInstance.start();
logger.log('info', `Generating new readme...`); logger.log('info', `Generating new readme...`);
logger.log('info', `This may take some time...`); logger.log('info', `This may take some time...`);
await aidocInstance.buildReadme(paths.cwd); const aidocInstance = new AiDoc();
await aidocInstance.start();
aidocInstance.buildReadme(paths.cwd);
logger.log('info', `Generating new keywords...`); logger.log('info', `Generating new keywords...`);
logger.log('info', `This may take some time...`); logger.log('info', `This may take some time...`);
await aidocInstance.buildDescription(paths.cwd); aidocInstance.buildDescription(paths.cwd);
}); });
tsdocCli.addCommand('test').subscribe((argvArg) => { tsdocCli.addCommand('test').subscribe((argvArg) => {

View File

@ -1,6 +1,15 @@
import { commitinfo } from './00_commitinfo_data.js';
import * as plugins from './plugins.js'; import * as plugins from './plugins.js';
export const logger = plugins.smartlog.Smartlog.createForCommitinfo(commitinfo); export const logger = new plugins.smartlog.Smartlog({
logContext: {
company: 'Some Company',
companyunit: 'Some CompanyUnit',
containerName: 'Some Containername',
environment: 'local',
runtime: 'node',
zone: 'gitzone',
},
minimumLogLevel: 'silly',
});
logger.addLogDestination(new plugins.smartlogDestinationLocal.DestinationLocal()); logger.addLogDestination(new plugins.smartlogDestinationLocal.DestinationLocal());

View File

@ -16,7 +16,6 @@ import * as smartlog from '@push.rocks/smartlog';
import * as smartlogDestinationLocal from '@push.rocks/smartlog-destination-local'; import * as smartlogDestinationLocal from '@push.rocks/smartlog-destination-local';
import * as smartpath from '@push.rocks/smartpath'; import * as smartpath from '@push.rocks/smartpath';
import * as smartshell from '@push.rocks/smartshell'; import * as smartshell from '@push.rocks/smartshell';
import * as smarttime from '@push.rocks/smarttime';
export { export {
npmextra, npmextra,
@ -31,14 +30,8 @@ export {
smartlogDestinationLocal, smartlogDestinationLocal,
smartpath, smartpath,
smartshell, smartshell,
smarttime,
}; };
// @git.zone scope
import * as tspublish from '@git.zone/tspublish';
export { tspublish };
// third party scope // third party scope
import * as typedoc from 'typedoc'; import * as typedoc from 'typedoc';