2024-04-03 11:34:26 +00:00
|
|
|
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
|
2024-06-22 11:20:55 +00:00
|
|
|
const npmExtraJson = JSON.parse(
|
|
|
|
(await projectContext.gatherFiles()).smartfilesNpmextraJSON.contents.toString(),
|
|
|
|
);
|
|
|
|
const legalInfo = npmExtraJson?.tsdoc?.legal;
|
2024-04-03 11:34:26 +00:00
|
|
|
if (!legalInfo) {
|
|
|
|
const error = new Error(`No legal information found in npmextra.json`);
|
|
|
|
console.log(error);
|
|
|
|
}
|
|
|
|
|
2024-05-17 15:38:35 +00:00
|
|
|
let result = await this.aiDocsRef.openaiInstance.chat({
|
|
|
|
systemMessage: `
|
2024-04-03 11:34:26 +00:00
|
|
|
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".
|
|
|
|
|
2024-04-12 13:28:55 +00:00
|
|
|
Good to know:
|
|
|
|
* npmextra.json contains overall module information.
|
|
|
|
* readme.hints.md provides valuable hints about module ideas.
|
2024-04-03 11:34:26 +00:00
|
|
|
]
|
2024-05-17 15:38:35 +00:00
|
|
|
`,
|
|
|
|
messageHistory: [],
|
|
|
|
userMessage: contextString,
|
|
|
|
});
|
2024-04-03 11:34:26 +00:00
|
|
|
|
2024-05-17 15:38:35 +00:00
|
|
|
finalReadmeString += result.message + '\n' + legalInfo;
|
2024-04-03 11:34:26 +00:00
|
|
|
|
|
|
|
console.log(`\n======================\n`);
|
2024-05-17 15:38:35 +00:00
|
|
|
console.log(result.message);
|
2024-04-03 11:34:26 +00:00
|
|
|
console.log(`\n======================\n`);
|
|
|
|
|
|
|
|
const readme = (await projectContext.gatherFiles()).smartfilesReadme;
|
|
|
|
readme.contents = Buffer.from(finalReadmeString);
|
|
|
|
await readme.write();
|
|
|
|
|
2024-05-17 15:38:35 +00:00
|
|
|
return result.message;
|
2024-04-03 11:34:26 +00:00
|
|
|
}
|
2024-06-22 11:20:55 +00:00
|
|
|
}
|