diff --git a/test/test.aidoc.nonci.ts b/test/test.aidoc.nonci.ts index b76f32f..f2f8b60 100644 --- a/test/test.aidoc.nonci.ts +++ b/test/test.aidoc.nonci.ts @@ -15,12 +15,24 @@ tap.test('should create an AIdocs class', async () => { tap.test('should start AIdocs', async () => { await aidocs.start(); +}); + +tap.skip.test('should start AIdocs', async () => { await aidocs.buildReadme('./'); }); -tap.test('should start AIdocs', async () => { - await aidocs.start(); +tap.skip.test('should start AIdocs', async () => { 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('message'); + expect(commitObject).toHaveProperty('recommendedNextVersion'); + expect(commitObject).toHaveProperty('recommendedNextVersionLevel'); + +}) + tap.start(); diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts index 8fb2012..e315577 100644 --- a/ts/00_commitinfo_data.ts +++ b/ts/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@git.zone/tsdoc', - version: '1.1.32', + version: '1.1.33', description: 'An advanced TypeScript documentation tool using AI to generate and enhance documentation for TypeScript projects.' } diff --git a/ts/aidocs_classes/commit.ts b/ts/aidocs_classes/commit.ts index 5a8099d..066bc4a 100644 --- a/ts/aidocs_classes/commit.ts +++ b/ts/aidocs_classes/commit.ts @@ -2,6 +2,13 @@ import * as plugins from '../plugins.js'; import { AiDoc } from '../classes.aidoc.js'; import { ProjectContext } from './projectcontext.js'; +export interface INextCommitObject { + recommendedNextVersionLevel: 'patch' | 'minor' | 'major'; // the recommended next version level of the project + recommendedNextVersion: string; // the recommended next version of the project + message: string; // the commit message. use conventional commits format + changelog?: string; // the changelog +} + export class Commit { private aiDocsRef: AiDoc; private projectDir: string; @@ -11,9 +18,20 @@ export class Commit { this.projectDir = projectDirArg; } - public async build() { + public async buildNextCommitObject(): Promise { + const smartgitInstance = new plugins.smartgit.Smartgit(); + await smartgitInstance.init(); + const gitRepo = await plugins.smartgit.GitRepo.fromOpeningRepoDir(smartgitInstance, this.projectDir); + const diffString = await gitRepo.getUncommittedDiff(); + console.log(diffString); const projectContext = new ProjectContext(this.projectDir); - const contextString = await projectContext.update(); + let contextString = await projectContext.update(); + contextString = ` +${contextString} + +Here is the diff: +${diffString} + ` let result = await this.aiDocsRef.openaiInstance.chat({ systemMessage: ` @@ -41,15 +59,40 @@ Also you are given a diff userMessage: contextString, }); - console.log(result.message); - const resultObject = JSON.parse(result.message.replace('```json', '').replace('```', '')); + // console.log(result.message); + const resultObject: INextCommitObject = JSON.parse(result.message.replace('```json', '').replace('```', '')); - const npmextraJson = (await projectContext.gatherFiles()).smartfilesNpmextraJSON; - const npmextraJsonContent = JSON.parse(npmextraJson.contents.toString()); + // 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. - npmextraJsonContent.gitzone.module.commit = resultObject.message; +You are given +* the previous changelog file (if available) +* the commit messages of the project - npmextraJson.contents = Buffer.from(JSON.stringify(npmextraJsonContent, null, 2)); - await npmextraJson.write(); +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. + `, + 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')} +` + }) + resultObject.changelog = result2.message; + return resultObject; } } diff --git a/ts/aidocs_classes/index.ts b/ts/aidocs_classes/index.ts index 4ecea4a..10213ff 100644 --- a/ts/aidocs_classes/index.ts +++ b/ts/aidocs_classes/index.ts @@ -1,3 +1,4 @@ +export * from './commit.js'; export * from './description.js'; export * from './projectcontext.js'; export * from './readme.js'; diff --git a/ts/classes.aidoc.ts b/ts/classes.aidoc.ts index 823fd30..1574804 100644 --- a/ts/classes.aidoc.ts +++ b/ts/classes.aidoc.ts @@ -85,7 +85,10 @@ export class AiDoc { 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) { const projectContextInstance = new aiDocsClasses.ProjectContext(projectDirArg);