Compare commits
22 Commits
Author | SHA1 | Date | |
---|---|---|---|
927cd961fd | |||
63b4fcc232 | |||
4188ed7f24 | |||
1feddc6e85 | |||
499baebc18 | |||
01fc0d0c6e | |||
b6c9cea5d1 | |||
a949039192 | |||
11bde9d756 | |||
eac26521c6 | |||
e1323569f5 | |||
41e4bd6689 | |||
164a58ec59 | |||
e1c0f82fe8 | |||
8a0046818b | |||
97fa9db32f | |||
d61de9b615 | |||
fba54035ea | |||
9a3d8588a8 | |||
eb8f8fa70a | |||
afe7b5e99e | |||
e074562362 |
20
changelog.md
Normal file
20
changelog.md
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## [1.2.3]
|
||||||
|
fix(aidocs): Fix bug in AiDoc class causing undefined token handling
|
||||||
|
|
||||||
|
## [1.2.2] - 2023-11-20
|
||||||
|
### Fixed
|
||||||
|
- Fix bug in AiDoc class causing undefined token handling
|
||||||
|
|
||||||
|
## [1.2.1] - 2023-11-10
|
||||||
|
### Fixed
|
||||||
|
- Fixed usage of plugins in project context and readme generation
|
||||||
|
|
||||||
|
## [1.2.0] - 2023-11-01
|
||||||
|
### Added
|
||||||
|
- Enhance changelog generation by supporting complete generation in the absence of previous changelog files
|
||||||
|
|
||||||
|
## [1.1.42] - 2023-10-30
|
||||||
|
### Fixed
|
||||||
|
- Improve commit message generation by handling empty diffs and updating changelog instructions
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@git.zone/tsdoc",
|
"name": "@git.zone/tsdoc",
|
||||||
"version": "1.1.35",
|
"version": "1.2.3",
|
||||||
"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",
|
||||||
|
@ -29,9 +29,10 @@ tap.test('should build commit object', async () => {
|
|||||||
const commitObject = await aidocs.buildNextCommitObject('./');
|
const commitObject = await aidocs.buildNextCommitObject('./');
|
||||||
console.log(commitObject);
|
console.log(commitObject);
|
||||||
expect(commitObject).not.toBeUndefined();
|
expect(commitObject).not.toBeUndefined();
|
||||||
expect(commitObject).toHaveProperty('message');
|
|
||||||
expect(commitObject).toHaveProperty('recommendedNextVersion');
|
expect(commitObject).toHaveProperty('recommendedNextVersion');
|
||||||
expect(commitObject).toHaveProperty('recommendedNextVersionLevel');
|
expect(commitObject).toHaveProperty('recommendedNextVersionLevel');
|
||||||
|
expect(commitObject).toHaveProperty('recommendedNextVersionScope');
|
||||||
|
expect(commitObject).toHaveProperty('recommendedNextVersionMessage');
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -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.35',
|
version: '1.2.3',
|
||||||
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.'
|
||||||
}
|
}
|
||||||
|
@ -3,10 +3,11 @@ import { AiDoc } from '../classes.aidoc.js';
|
|||||||
import { ProjectContext } from './projectcontext.js';
|
import { ProjectContext } from './projectcontext.js';
|
||||||
|
|
||||||
export interface INextCommitObject {
|
export interface INextCommitObject {
|
||||||
recommendedNextVersionLevel: 'patch' | 'minor' | 'major'; // the recommended next version level of the project
|
recommendedNextVersionLevel: 'fix' | 'feat' | 'BREAKING CHANGE'; // the recommended next version level of the project
|
||||||
recommendedNextVersion: string; // the recommended next version of the project
|
recommendedNextVersionScope: string; // the recommended scope name of the next version, like "core" or "cli", or specific class names.
|
||||||
message: string; // the commit message. use conventional commits format
|
recommendedNextVersionMessage: string; // the commit message. Don't put fix() feat() or BREAKING CHANGE in the message. Please just the message itself.
|
||||||
changelog?: string; // 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 {
|
||||||
@ -21,16 +22,20 @@ export class Commit {
|
|||||||
public async buildNextCommitObject(): Promise<INextCommitObject> {
|
public async buildNextCommitObject(): Promise<INextCommitObject> {
|
||||||
const smartgitInstance = new plugins.smartgit.Smartgit();
|
const smartgitInstance = new plugins.smartgit.Smartgit();
|
||||||
await smartgitInstance.init();
|
await smartgitInstance.init();
|
||||||
const gitRepo = await plugins.smartgit.GitRepo.fromOpeningRepoDir(smartgitInstance, this.projectDir);
|
const gitRepo = await plugins.smartgit.GitRepo.fromOpeningRepoDir(
|
||||||
|
smartgitInstance,
|
||||||
|
this.projectDir
|
||||||
|
);
|
||||||
const diffString = await gitRepo.getUncommittedDiff();
|
const diffString = await gitRepo.getUncommittedDiff();
|
||||||
const projectContext = new ProjectContext(this.projectDir);
|
const projectContext = new ProjectContext(this.projectDir);
|
||||||
let contextString = await projectContext.update();
|
let contextString = await projectContext.update();
|
||||||
contextString = `
|
contextString = `
|
||||||
${contextString}
|
${contextString}
|
||||||
|
|
||||||
Here is the diff:
|
Below is the diff of the uncommitted changes. If nothing is changed, there are no changes:
|
||||||
${diffString}
|
|
||||||
`
|
${diffString || 'No changes.'}
|
||||||
|
`;
|
||||||
|
|
||||||
let result = await this.aiDocsRef.openaiInstance.chat({
|
let result = await this.aiDocsRef.openaiInstance.chat({
|
||||||
systemMessage: `
|
systemMessage: `
|
||||||
@ -45,9 +50,10 @@ 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
|
recommendedNextVersionLevel: 'fix' | 'feat' | 'BREAKING CHANGE'; // the recommended next version level of the project
|
||||||
recommendedNextVersion: string; // the recommended next version of the project
|
recommendedNextVersionScope: string; // the recommended scope name of the next version, like "core" or "cli", or specific class names.
|
||||||
message: string; // the commit message. use conventional commits format
|
recommendedNextVersionMessage: string; // the commit message. Don't put fix() feat() or BREAKING CHANGE in the message. Please just the message itself.
|
||||||
|
recommendedNextVersion: string; // the recommended next version of the project, x.x.x
|
||||||
}
|
}
|
||||||
|
|
||||||
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.
|
||||||
@ -59,7 +65,9 @@ Also you are given a diff
|
|||||||
});
|
});
|
||||||
|
|
||||||
// console.log(result.message);
|
// console.log(result.message);
|
||||||
const resultObject: INextCommitObject = JSON.parse(result.message.replace('```json', '').replace('```', ''));
|
const resultObject: INextCommitObject = JSON.parse(
|
||||||
|
result.message.replace('```json', '').replace('```', '')
|
||||||
|
);
|
||||||
|
|
||||||
// lets build the changelog based on that
|
// lets build the changelog based on that
|
||||||
const commitMessages = await gitRepo.getAllCommitMessages();
|
const commitMessages = await gitRepo.getAllCommitMessages();
|
||||||
@ -80,18 +88,28 @@ You are given
|
|||||||
|
|
||||||
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
|
||||||
|
|
||||||
For the latest version, that is not yet part of the commit messages, use {{nextVersion}} and {{nextDescription}} placeholders.
|
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: `
|
userMessage: `
|
||||||
The previous changelog file is:
|
The previous changelog file is:
|
||||||
${(!previousChangelog) ? 'No previous changelog file found' : previousChangelog.contents.toString()}
|
${!previousChangelog ? 'No previous changelog file found' : previousChangelog.contents.toString()}
|
||||||
|
|
||||||
Here are the commit messages so far:
|
Here are the commit messages so far:
|
||||||
|
|
||||||
${commitMessages.join('\n\n')}
|
${commitMessages.join('\n\n')}
|
||||||
`
|
`,
|
||||||
})
|
});
|
||||||
resultObject.changelog = result2.message;
|
if (previousChangelog) {
|
||||||
|
let newChangelog = result2.message;
|
||||||
|
newChangelog = newChangelog.replace('# Changelog\n\n', '');
|
||||||
|
let oldChangelog = previousChangelog.contents.toString().replace('# Changelog\n\n', '');
|
||||||
|
newChangelog = `# Changelog\n\n${newChangelog}\n\n${oldChangelog}`;
|
||||||
|
resultObject.changelog = newChangelog;
|
||||||
|
} else {
|
||||||
|
resultObject.changelog = result2.message;
|
||||||
|
}
|
||||||
return resultObject;
|
return resultObject;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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: '',
|
||||||
});
|
});
|
||||||
|
Reference in New Issue
Block a user