|
|
@ -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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|