tsdoc/ts/aidocs_classes/commit.ts

102 lines
4.2 KiB
TypeScript
Raw Normal View History

2024-06-22 11:11:22 +00:00
import * as plugins from '../plugins.js';
import { AiDoc } from '../classes.aidoc.js';
import { ProjectContext } from './projectcontext.js';
2024-06-22 19:21:52 +00:00
export interface INextCommitObject {
2024-06-23 10:20:06 +00:00
recommendedNextVersionLevel: 'fix' | 'feat' | 'BREAKING CHANGE'; // the recommended next version level of the project
2024-06-23 10:27:26 +00:00
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.
recommendedNextVersion: string; // the recommended next version of the project, x.x.x
changelog?: string; // the changelog for the next version
2024-06-22 19:21:52 +00:00
}
2024-06-22 11:11:22 +00:00
export class Commit {
private aiDocsRef: AiDoc;
private projectDir: string;
constructor(aiDocsRef: AiDoc, projectDirArg: string) {
this.aiDocsRef = aiDocsRef;
this.projectDir = projectDirArg;
}
2024-06-22 19:21:52 +00:00
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 diffString = await gitRepo.getUncommittedDiff();
2024-06-22 11:11:22 +00:00
const projectContext = new ProjectContext(this.projectDir);
2024-06-22 19:21:52 +00:00
let contextString = await projectContext.update();
contextString = `
${contextString}
Below is the diff of the uncommitted changes. If nothing is changed, there are no changes:
${diffString || 'No changes.'}
2024-06-22 19:21:52 +00:00
`
2024-06-22 11:11:22 +00:00
let result = await this.aiDocsRef.openaiInstance.chat({
systemMessage: `
You create a commit message for a git commit.
The commit message should be based on the files in the project.
You should not include any licensing information.
You should not include any personal information.
Important: Answer only in valid JSON.
Your answer should be parseable with JSON.parse() without modifying anything.
Here is the structure of the JSON you should return:
{
2024-06-23 10:20:06 +00:00
recommendedNextVersionLevel: 'fix' | 'feat' | 'BREAKING CHANGE'; // the recommended next version level of the project
2024-06-23 10:27:26 +00:00
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.
recommendedNextVersion: string; // the recommended next version of the project, x.x.x
2024-06-22 11:11:22 +00:00
}
You are being given the files of the project. You should use them to create the commit message.
Also you are given a diff
`,
messageHistory: [],
userMessage: contextString,
});
2024-06-22 19:21:52 +00:00
// console.log(result.message);
const resultObject: INextCommitObject = JSON.parse(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');
let previousChangelog: plugins.smartfile.SmartFile;
if (await plugins.smartfile.fs.fileExists(previousChangelogPath)) {
previousChangelog = await plugins.smartfile.SmartFile.fromFilePath(previousChangelogPath);
}
let result2 = await this.aiDocsRef.openaiInstance.chat({
messageHistory: [],
systemMessage: `
You are building a changelog file for the projext.
Omit commits and versions that lack relevant changes.
You are given
* the previous changelog file (if available)
* the commit messages of the project
Only return the changelog file, so it can be written directly to changelog.md
2024-06-22 11:11:22 +00:00
2024-06-23 11:04:47 +00:00
For the latest version, that is not yet part of the commit messages, use {{nextVersion}} and {{nextVersionMessage}} placeholders.
Only output newer versions and their changes compared to ones already mentioned. We take of appending your output later.
2024-06-22 19:21:52 +00:00
`,
userMessage: `
The previous changelog file is:
${(!previousChangelog) ? 'No previous changelog file found' : previousChangelog.contents.toString()}
2024-06-22 11:11:22 +00:00
2024-06-22 19:21:52 +00:00
Here are the commit messages so far:
2024-06-22 11:11:22 +00:00
2024-06-22 19:21:52 +00:00
${commitMessages.join('\n\n')}
`
})
resultObject.changelog = result2.message;
return resultObject;
2024-06-22 11:11:22 +00:00
}
}