fix(core): update

This commit is contained in:
2024-04-03 13:34:26 +02:00
parent a0969912eb
commit 8d4b278a5d
19 changed files with 436 additions and 145 deletions

View File

@ -0,0 +1,73 @@
import type { AiDoc } from '../classes.aidoc.js';
import * as plugins from '../plugins.js';
import { ProjectContext } from './projectcontext.js';
interface IDescriptionInterface {
description: string;
keywords: string[];
}
export class Description {
// INSTANCE
private aiDocsRef: AiDoc;
private projectDir: string;
constructor(aiDocsRef: AiDoc, projectDirArg: string) {
this.aiDocsRef = aiDocsRef;
this.projectDir = projectDirArg;
}
public async build() {
// we can now assemble the directory structure.
const projectContext = new ProjectContext(this.projectDir);
const contextString = await projectContext.update();
let result = await this.aiDocsRef.openaiInstance.chat(
`
You create a json adhering the following interface:
{
description: string; // a sensible short, one sentence description of the project
keywords: string[]; // an array of tags that describe the project
}
The description should be based on what you understand from the project's files.
The keywords should be based on use cases you see from the files.
Don't be cheap about the way you think.
Important: Answer only in valid JSON.
You answer should be parseable with JSON.parse() without modifying anything.
Don't wrap the JSON in three ticks json!!!
`,
contextString,
[]
);
console.log(result.message.content);
const resultObject: IDescriptionInterface = JSON.parse(result.message.content.replace('```json', '').replace('```', ''));
const npmextraJson = (await projectContext.gatherFiles()).smartfilesNpmextraJSON;
const npmextraJsonContent = JSON.parse(npmextraJson.contents.toString());
npmextraJsonContent.gitzone.module.description = resultObject.description;
npmextraJsonContent.gitzone.module.keywords = resultObject.keywords;
npmextraJson.contents = Buffer.from(JSON.stringify(npmextraJsonContent, null, 2));
await npmextraJson.write();
// do the same with packageJson
const packageJson = (await projectContext.gatherFiles()).smartfilePackageJSON;
const packageJsonContent = JSON.parse(packageJson.contents.toString());
packageJsonContent.description = resultObject.description;
packageJsonContent.keywords = resultObject.keywords;
packageJson.contents = Buffer.from(JSON.stringify(packageJsonContent, null, 2));
await packageJson.write();
console.log(`\n======================\n`);
console.log(JSON.stringify(resultObject, null, 2));
console.log(`\n======================\n`);
return result.message.content;
}
}

View File

@ -0,0 +1,3 @@
export * from './description.js';
export * from './projectcontext.js';
export * from './readme.js';

View File

@ -0,0 +1,73 @@
import * as plugins from '../plugins.js';
export class ProjectContext {
public static async fromDir(dirArg: string) {}
// INSTANCE
public projectDir: string;
constructor(projectDirArg: string) {
this.projectDir = projectDirArg;
}
public async gatherFiles() {
const smartfilePackageJSON = await plugins.smartfile.SmartFile.fromFilePath(
plugins.path.join(this.projectDir, 'package.json'),
this.projectDir
);
const smartfilesReadme = await plugins.smartfile.SmartFile.fromFilePath(
plugins.path.join(this.projectDir, 'readme.md'),
this.projectDir
);
const smartfilesNpmextraJSON = await plugins.smartfile.SmartFile.fromFilePath(
plugins.path.join(this.projectDir, 'npmextra.json'),
this.projectDir
);
const smartfilesMod = await plugins.smartfile.fs.fileTreeToObject(
this.projectDir,
'ts/**/*.ts'
);
const smartfilesTest = await plugins.smartfile.fs.fileTreeToObject(
this.projectDir,
'test/**/*.ts'
);
return {
smartfilePackageJSON,
smartfilesReadme,
smartfilesNpmextraJSON,
smartfilesMod,
smartfilesTest,
};
}
public async convertFilesToContext(filesArg: plugins.smartfile.SmartFile[]) {
return filesArg
.map((smartfile) => {
return `
====== START OF FILE ${smartfile.relative} ======
${smartfile.contents.toString()}
====== END OF FILE ${smartfile.relative} ======
`;
})
.join('\n');
}
private async buildContext(dirArg: string) {
const files = await this.gatherFiles();
let context = await this.convertFilesToContext([
files.smartfilePackageJSON,
files.smartfilesReadme,
files.smartfilesNpmextraJSON,
...files.smartfilesMod,
...files.smartfilesTest,
]);
return context;
}
public async update() {
const result = await this.buildContext(this.projectDir);
return result;
}
}

View File

@ -0,0 +1,84 @@
import type { AiDoc } from '../classes.aidoc.js';
import * as plugins from '../plugins.js';
import { ProjectContext } from './projectcontext.js';
export class Readme {
// INSTANCE
private aiDocsRef: AiDoc;
private projectDir: string;
constructor(aiDocsRef: AiDoc, projectDirArg: string) {
this.aiDocsRef = aiDocsRef;
this.projectDir = projectDirArg;
}
public async build() {
let finalReadmeString = ``;
// we can now assemble the directory structure.
const projectContext = new ProjectContext(this.projectDir);
const contextString = await projectContext.update();
// lets first check legal before introducung any cost
const npmExtraJson = JSON.parse(((await projectContext.gatherFiles()).smartfilesNpmextraJSON).contents.toString());
const legalInfo = npmExtraJson?.tsdoc?.legal
if (!legalInfo) {
const error = new Error(`No legal information found in npmextra.json`);
console.log(error);
}
let result = await this.aiDocsRef.openaiInstance.chat(
`
You create markdown readmes for npm projects. You only output the markdown readme.
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".
npmextra.json has a tsdocs section that provides valuable information about module ideas.
]
`,
contextString,
[]
);
finalReadmeString += result.message.content + '\n' + legalInfo;
console.log(`\n======================\n`);
console.log(result.message.content);
console.log(`\n======================\n`);
const readme = (await projectContext.gatherFiles()).smartfilesReadme;
readme.contents = Buffer.from(finalReadmeString);
await readme.write();
return result.message.content;
}
}