Compare commits
68 Commits
Author | SHA1 | Date | |
---|---|---|---|
84947cfb80 | |||
1a9ac9091d | |||
88b93b8b83 | |||
77279a9135 | |||
7426addbdd | |||
58d060d729 | |||
370cbfe6f3 | |||
2adb4e8cb0 | |||
e8608b1cae | |||
33fa7fa337 | |||
2946bcaf49 | |||
d962e17c18 | |||
a22c400355 | |||
08b7305ef0 | |||
d7b462fda9 | |||
01e6c15626 | |||
94a066247f | |||
7de157ccb3 | |||
d783965b25 | |||
07f1413d5e | |||
d7bf45f6b5 | |||
3eb64bcb5d | |||
e24a027fdd | |||
3f451cfcb1 | |||
e355c51c8d | |||
b0fcaba2c3 | |||
4ea205e11b | |||
f819e7b521 | |||
d4903f32f0 | |||
34102a2544 | |||
5e2171dbfd | |||
70d4af653a | |||
06f6fdef98 | |||
b6fb7bf029 | |||
4c83725120 | |||
a060cd1a03 | |||
e8372effc7 | |||
571249705e | |||
927cd961fd | |||
63b4fcc232 | |||
4188ed7f24 | |||
1feddc6e85 | |||
499baebc18 | |||
01fc0d0c6e | |||
b6c9cea5d1 | |||
a949039192 | |||
11bde9d756 | |||
eac26521c6 | |||
e1323569f5 | |||
41e4bd6689 | |||
164a58ec59 | |||
e1c0f82fe8 | |||
8a0046818b | |||
97fa9db32f | |||
d61de9b615 | |||
fba54035ea | |||
9a3d8588a8 | |||
eb8f8fa70a | |||
afe7b5e99e | |||
e074562362 | |||
240d6bb314 | |||
2d0839a1da | |||
9f250ae2b3 | |||
1223bb8567 | |||
9395cfc166 | |||
3b4c6bd97f | |||
5d2c9e6158 | |||
89977038ec |
109
changelog.md
Normal file
109
changelog.md
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## 2025-02-25 - 1.4.4 - fix(dependencies)
|
||||||
|
Update dependencies to latest versions
|
||||||
|
|
||||||
|
- Updated '@push.rocks/smartai' from '^0.0.17' to '^0.4.2'
|
||||||
|
- Updated 'typedoc' from '^0.26.1' to '^0.27.9'
|
||||||
|
|
||||||
|
## 2025-01-14 - 1.4.3 - fix(aidocs_classes)
|
||||||
|
Improve readme generation instructions to ensure correct markdown formatting.
|
||||||
|
|
||||||
|
- Added guidance to avoid using backticks at the beginning and end of readme generation to prevent markdown issues.
|
||||||
|
- Clarified that the output is directly written to readme.md and backticks should only be used for code blocks.
|
||||||
|
|
||||||
|
## 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
|
||||||
|
```
|
19
package.json
19
package.json
@ -1,12 +1,13 @@
|
|||||||
{
|
{
|
||||||
"name": "@git.zone/tsdoc",
|
"name": "@git.zone/tsdoc",
|
||||||
"version": "1.1.31",
|
"version": "1.4.4",
|
||||||
"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.",
|
||||||
"main": "dist_ts/index.js",
|
|
||||||
"typings": "dist_ts/index.d.ts",
|
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"author": "Lossless GmbH",
|
"exports": {
|
||||||
|
".": "./dist_ts/index.js"
|
||||||
|
},
|
||||||
|
"author": "Task Venture Capital GmbH",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"bin": {
|
"bin": {
|
||||||
"tsdoc": "cli.js"
|
"tsdoc": "cli.js"
|
||||||
@ -22,23 +23,25 @@
|
|||||||
"@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": "^20.14.8"
|
"@types/node": "^22.8.1"
|
||||||
},
|
},
|
||||||
"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.0.17",
|
"@push.rocks/smartai": "^0.4.2",
|
||||||
"@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.0.4",
|
"@push.rocks/smartgit": "^3.1.0",
|
||||||
"@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",
|
||||||
"typedoc": "^0.26.0",
|
"@push.rocks/smarttime": "^4.0.6",
|
||||||
|
"typedoc": "^0.27.9",
|
||||||
"typescript": "^5.5.2"
|
"typescript": "^5.5.2"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
|
7350
pnpm-lock.yaml
generated
7350
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@ -15,12 +15,25 @@ tap.test('should create an AIdocs class', async () => {
|
|||||||
|
|
||||||
tap.test('should start AIdocs', async () => {
|
tap.test('should start AIdocs', async () => {
|
||||||
await aidocs.start();
|
await aidocs.start();
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.skip.test('should start AIdocs', async () => {
|
||||||
await aidocs.buildReadme('./');
|
await aidocs.buildReadme('./');
|
||||||
});
|
});
|
||||||
|
|
||||||
tap.test('should start AIdocs', async () => {
|
tap.skip.test('should start AIdocs', async () => {
|
||||||
await aidocs.start();
|
|
||||||
await aidocs.buildDescription('./');
|
await aidocs.buildDescription('./');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
tap.test('should build commit object', async () => {
|
||||||
|
const commitObject = await aidocs.buildNextCommitObject('./');
|
||||||
|
console.log(commitObject);
|
||||||
|
expect(commitObject).not.toBeUndefined();
|
||||||
|
expect(commitObject).toHaveProperty('recommendedNextVersion');
|
||||||
|
expect(commitObject).toHaveProperty('recommendedNextVersionLevel');
|
||||||
|
expect(commitObject).toHaveProperty('recommendedNextVersionScope');
|
||||||
|
expect(commitObject).toHaveProperty('recommendedNextVersionMessage');
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
tap.start();
|
tap.start();
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
/**
|
/**
|
||||||
* autocreated commitinfo by @pushrocks/commitinfo
|
* autocreated commitinfo by @push.rocks/commitinfo
|
||||||
*/
|
*/
|
||||||
export const commitinfo = {
|
export const commitinfo = {
|
||||||
name: '@git.zone/tsdoc',
|
name: '@git.zone/tsdoc',
|
||||||
version: '1.1.31',
|
version: '1.4.4',
|
||||||
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.'
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,15 @@ import * as plugins from '../plugins.js';
|
|||||||
import { AiDoc } from '../classes.aidoc.js';
|
import { AiDoc } from '../classes.aidoc.js';
|
||||||
import { ProjectContext } from './projectcontext.js';
|
import { ProjectContext } from './projectcontext.js';
|
||||||
|
|
||||||
|
export interface INextCommitObject {
|
||||||
|
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.
|
||||||
|
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
|
||||||
|
changelog?: string; // the changelog for the next version
|
||||||
|
}
|
||||||
|
|
||||||
export class Commit {
|
export class Commit {
|
||||||
private aiDocsRef: AiDoc;
|
private aiDocsRef: AiDoc;
|
||||||
private projectDir: string;
|
private projectDir: string;
|
||||||
@ -11,9 +20,26 @@ export class Commit {
|
|||||||
this.projectDir = projectDirArg;
|
this.projectDir = projectDirArg;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async build() {
|
public async buildNextCommitObject(): Promise<INextCommitObject> {
|
||||||
|
const smartgitInstance = new plugins.smartgit.Smartgit();
|
||||||
|
await smartgitInstance.init();
|
||||||
|
const gitRepo = await plugins.smartgit.GitRepo.fromOpeningRepoDir(
|
||||||
|
smartgitInstance,
|
||||||
|
this.projectDir
|
||||||
|
);
|
||||||
|
const diffStringArray = await gitRepo.getUncommittedDiff([
|
||||||
|
'pnpm-lock.yaml',
|
||||||
|
'package-lock.json',
|
||||||
|
]);
|
||||||
const projectContext = new ProjectContext(this.projectDir);
|
const projectContext = new ProjectContext(this.projectDir);
|
||||||
const contextString = await projectContext.update();
|
let contextString = await projectContext.update();
|
||||||
|
contextString = `
|
||||||
|
${contextString}
|
||||||
|
|
||||||
|
Below is the diff of the uncommitted changes. If nothing is changed, there are no changes:
|
||||||
|
|
||||||
|
${diffStringArray[0] ? diffStringArray.join('\n\n') : 'No changes.'}
|
||||||
|
`;
|
||||||
|
|
||||||
let result = await this.aiDocsRef.openaiInstance.chat({
|
let result = await this.aiDocsRef.openaiInstance.chat({
|
||||||
systemMessage: `
|
systemMessage: `
|
||||||
@ -27,12 +53,17 @@ 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:
|
||||||
{
|
|
||||||
recommendedNextVersionLevel: 'patch' | 'minor' | 'major'; // the recommended next version level of the project
|
interface {
|
||||||
recommendedNextVersion: string; // the recommended next version of the project
|
recommendedNextVersionLevel: 'fix' | 'feat' | 'BREAKING CHANGE'; // the recommended next version level of the project
|
||||||
message: string; // the commit message. use conventional commits format
|
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.
|
||||||
|
recommendedNextVersionDetails: string[]; // detailed bullet points for the changelog
|
||||||
|
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
|
||||||
|
|
||||||
@ -41,15 +72,63 @@ Also you are given a diff
|
|||||||
userMessage: contextString,
|
userMessage: contextString,
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log(result.message);
|
// console.log(result.message);
|
||||||
const resultObject = JSON.parse(result.message.replace('```json', '').replace('```', ''));
|
const resultObject: INextCommitObject = JSON.parse(
|
||||||
|
result.message.replace('```json', '').replace('```', '')
|
||||||
|
);
|
||||||
|
|
||||||
const npmextraJson = (await projectContext.gatherFiles()).smartfilesNpmextraJSON;
|
const previousChangelogPath = plugins.path.join(this.projectDir, 'changelog.md');
|
||||||
const npmextraJsonContent = JSON.parse(npmextraJson.contents.toString());
|
let previousChangelog: plugins.smartfile.SmartFile;
|
||||||
|
if (await plugins.smartfile.fs.fileExists(previousChangelogPath)) {
|
||||||
|
previousChangelog = await plugins.smartfile.SmartFile.fromFilePath(previousChangelogPath);
|
||||||
|
}
|
||||||
|
|
||||||
npmextraJsonContent.gitzone.module.commit = resultObject.message;
|
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({
|
||||||
|
messageHistory: [],
|
||||||
|
systemMessage: `
|
||||||
|
You are building a changelog.md file for the project.
|
||||||
|
Omit commits and versions that lack relevant changes, but make sure to mention them as a range with a summarizing message instead.
|
||||||
|
|
||||||
npmextraJson.contents = Buffer.from(JSON.stringify(npmextraJsonContent, null, 2));
|
A changelog entry should look like this:
|
||||||
await npmextraJson.write();
|
|
||||||
|
## yyyy-mm-dd - x.x.x - scope here
|
||||||
|
main descriptiom here
|
||||||
|
|
||||||
|
- detailed bullet points follow
|
||||||
|
|
||||||
|
You are given:
|
||||||
|
* the commit messages of the project
|
||||||
|
|
||||||
|
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)}
|
||||||
|
`,
|
||||||
|
});
|
||||||
|
|
||||||
|
previousChangelog = await plugins.smartfile.SmartFile.fromString(
|
||||||
|
previousChangelogPath,
|
||||||
|
result2.message.replaceAll('```markdown', '').replaceAll('```', ''),
|
||||||
|
'utf8'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
let oldChangelog = previousChangelog.contents.toString().replace('# Changelog\n\n', '');
|
||||||
|
if (oldChangelog.startsWith('\n')) {
|
||||||
|
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;
|
||||||
|
|
||||||
|
return resultObject;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
export * from './commit.js';
|
||||||
export * from './description.js';
|
export * from './description.js';
|
||||||
export * from './projectcontext.js';
|
export * from './projectcontext.js';
|
||||||
export * from './readme.js';
|
export * from './readme.js';
|
||||||
|
@ -47,9 +47,8 @@ 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) => {
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
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
|
||||||
@ -21,7 +23,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) {
|
||||||
@ -79,6 +81,64 @@ 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@ export class AiDoc {
|
|||||||
|
|
||||||
public npmextraKV: plugins.npmextra.KeyValueStore;
|
public npmextraKV: plugins.npmextra.KeyValueStore;
|
||||||
public qenvInstance: plugins.qenv.Qenv;
|
public qenvInstance: plugins.qenv.Qenv;
|
||||||
public smartinteractInstance: plugins.smartinteract.SmartInteract;
|
public aidocInteract: plugins.smartinteract.SmartInteract;
|
||||||
public openaiInstance: plugins.smartai.OpenAiProvider;
|
public openaiInstance: plugins.smartai.OpenAiProvider;
|
||||||
|
|
||||||
argvArg: any;
|
argvArg: any;
|
||||||
@ -33,7 +33,7 @@ export class AiDoc {
|
|||||||
|
|
||||||
public async start() {
|
public async start() {
|
||||||
// lets care about prerequisites
|
// lets care about prerequisites
|
||||||
this.smartinteractInstance = new plugins.smartinteract.SmartInteract();
|
this.aidocInteract = new plugins.smartinteract.SmartInteract();
|
||||||
this.qenvInstance = new plugins.qenv.Qenv();
|
this.qenvInstance = new plugins.qenv.Qenv();
|
||||||
if (!(await this.qenvInstance.getEnvVarOnDemand('OPENAI_TOKEN'))) {
|
if (!(await this.qenvInstance.getEnvVarOnDemand('OPENAI_TOKEN'))) {
|
||||||
this.npmextraKV = new plugins.npmextra.KeyValueStore({
|
this.npmextraKV = new plugins.npmextra.KeyValueStore({
|
||||||
@ -51,9 +51,9 @@ export class AiDoc {
|
|||||||
// lets try smartinteract
|
// lets try smartinteract
|
||||||
// wait for a second until OpenAI fixes punycode problem...
|
// wait for a second until OpenAI fixes punycode problem...
|
||||||
await plugins.smartdelay.delayFor(1000);
|
await plugins.smartdelay.delayFor(1000);
|
||||||
const answerObject = await this.smartinteractInstance.askQuestion({
|
const answerObject = await this.aidocInteract.askQuestion({
|
||||||
type: 'input',
|
type: 'input',
|
||||||
message: `Please provide your OpenAI token`,
|
message: `Please provide your OpenAI token. This will be persisted in your home directory.`,
|
||||||
name: 'OPENAI_TOKEN',
|
name: 'OPENAI_TOKEN',
|
||||||
default: '',
|
default: '',
|
||||||
});
|
});
|
||||||
@ -85,7 +85,10 @@ export class AiDoc {
|
|||||||
return await descriptionInstance.build();
|
return await descriptionInstance.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async buildNextCommit(projectDirArg: string) {}
|
public async buildNextCommitObject(projectDirArg: string) {
|
||||||
|
const commitInstance = new aiDocsClasses.Commit(this, projectDirArg);
|
||||||
|
return await commitInstance.buildNextCommitObject();
|
||||||
|
}
|
||||||
|
|
||||||
public async getProjectContext(projectDirArg: string) {
|
public async getProjectContext(projectDirArg: string) {
|
||||||
const projectContextInstance = new aiDocsClasses.ProjectContext(projectDirArg);
|
const projectContextInstance = new aiDocsClasses.ProjectContext(projectDirArg);
|
||||||
|
@ -28,14 +28,14 @@ export const run = async () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
tsdocCli.addCommand('aidoc').subscribe(async (argvArg) => {
|
tsdocCli.addCommand('aidoc').subscribe(async (argvArg) => {
|
||||||
logger.log('info', `Generating new readme...`);
|
|
||||||
logger.log('info', `This may take some time...`);
|
|
||||||
const aidocInstance = new AiDoc();
|
const aidocInstance = new AiDoc();
|
||||||
await aidocInstance.start();
|
await aidocInstance.start();
|
||||||
aidocInstance.buildReadme(paths.cwd);
|
logger.log('info', `Generating new readme...`);
|
||||||
|
logger.log('info', `This may take some time...`);
|
||||||
|
await 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...`);
|
||||||
aidocInstance.buildDescription(paths.cwd);
|
await aidocInstance.buildDescription(paths.cwd);
|
||||||
});
|
});
|
||||||
|
|
||||||
tsdocCli.addCommand('test').subscribe((argvArg) => {
|
tsdocCli.addCommand('test').subscribe((argvArg) => {
|
||||||
|
@ -1,15 +1,6 @@
|
|||||||
|
import { commitinfo } from './00_commitinfo_data.js';
|
||||||
import * as plugins from './plugins.js';
|
import * as plugins from './plugins.js';
|
||||||
|
|
||||||
export const logger = new plugins.smartlog.Smartlog({
|
export const logger = plugins.smartlog.Smartlog.createForCommitinfo(commitinfo);
|
||||||
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());
|
||||||
|
@ -16,6 +16,7 @@ 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,
|
||||||
@ -30,8 +31,14 @@ 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';
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user