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() { // Use the new TaskContextFactory for optimized context const taskContextFactory = new (await import('../context/index.js')).TaskContextFactory(this.projectDir); await taskContextFactory.initialize(); // Generate context specifically for description task const contextResult = await taskContextFactory.createContextForDescription(); const contextString = contextResult.context; // Log token usage statistics console.log(`Token usage - Context: ${contextResult.tokenCount}, Files: ${contextResult.includedFiles.length + contextResult.trimmedFiles.length}, Savings: ${contextResult.tokenSavings}`); let result = await this.aiDocsRef.openaiInstance.chat({ systemMessage: ` 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!!! `, messageHistory: [], userMessage: contextString, }); console.log(result.message); const resultObject: IDescriptionInterface = JSON.parse( result.message.replace('```json', '').replace('```', ''), ); // Create a standard ProjectContext instance for file operations const projectContext = new ProjectContext(this.projectDir); const files = await projectContext.gatherFiles(); const npmextraJson = files.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 = files.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; } }