138 lines
4.1 KiB
TypeScript
138 lines
4.1 KiB
TypeScript
import * as plugins from '../plugins.js';
|
|
import { EnhancedContext } from './enhanced-context.js';
|
|
import { ConfigManager } from './config-manager.js';
|
|
import type { IContextResult, TaskType } from './types.js';
|
|
|
|
/**
|
|
* Factory class for creating task-specific context
|
|
*/
|
|
export class TaskContextFactory {
|
|
private projectDir: string;
|
|
private configManager: ConfigManager;
|
|
|
|
/**
|
|
* Create a new TaskContextFactory
|
|
* @param projectDirArg The project directory
|
|
*/
|
|
constructor(projectDirArg: string) {
|
|
this.projectDir = projectDirArg;
|
|
this.configManager = ConfigManager.getInstance();
|
|
}
|
|
|
|
/**
|
|
* Initialize the factory
|
|
*/
|
|
public async initialize(): Promise<void> {
|
|
await this.configManager.initialize(this.projectDir);
|
|
}
|
|
|
|
/**
|
|
* Create context for README generation
|
|
*/
|
|
public async createContextForReadme(): Promise<IContextResult> {
|
|
const contextBuilder = new EnhancedContext(this.projectDir);
|
|
await contextBuilder.initialize();
|
|
|
|
// Get README-specific configuration
|
|
const taskConfig = this.configManager.getTaskConfig('readme');
|
|
if (taskConfig.mode) {
|
|
contextBuilder.setContextMode(taskConfig.mode);
|
|
}
|
|
|
|
// Build the context for README task
|
|
return await contextBuilder.buildContext('readme');
|
|
}
|
|
|
|
/**
|
|
* Create context for description generation
|
|
*/
|
|
public async createContextForDescription(): Promise<IContextResult> {
|
|
const contextBuilder = new EnhancedContext(this.projectDir);
|
|
await contextBuilder.initialize();
|
|
|
|
// Get description-specific configuration
|
|
const taskConfig = this.configManager.getTaskConfig('description');
|
|
if (taskConfig.mode) {
|
|
contextBuilder.setContextMode(taskConfig.mode);
|
|
}
|
|
|
|
// Build the context for description task
|
|
return await contextBuilder.buildContext('description');
|
|
}
|
|
|
|
/**
|
|
* Create context for commit message generation
|
|
* @param gitDiff Optional git diff to include
|
|
*/
|
|
public async createContextForCommit(gitDiff?: string): Promise<IContextResult> {
|
|
const contextBuilder = new EnhancedContext(this.projectDir);
|
|
await contextBuilder.initialize();
|
|
|
|
// Get commit-specific configuration
|
|
const taskConfig = this.configManager.getTaskConfig('commit');
|
|
if (taskConfig.mode) {
|
|
contextBuilder.setContextMode(taskConfig.mode);
|
|
}
|
|
|
|
// Build the context for commit task
|
|
const contextResult = await contextBuilder.buildContext('commit');
|
|
|
|
// If git diff is provided, add it to the context
|
|
if (gitDiff) {
|
|
contextBuilder.updateWithGitDiff(gitDiff);
|
|
}
|
|
|
|
return contextBuilder.getContextResult();
|
|
}
|
|
|
|
/**
|
|
* Create context for any task type
|
|
* @param taskType The task type to create context for
|
|
* @param additionalContent Optional additional content to include
|
|
*/
|
|
public async createContextForTask(
|
|
taskType: TaskType,
|
|
additionalContent?: string
|
|
): Promise<IContextResult> {
|
|
switch (taskType) {
|
|
case 'readme':
|
|
return this.createContextForReadme();
|
|
case 'description':
|
|
return this.createContextForDescription();
|
|
case 'commit':
|
|
return this.createContextForCommit(additionalContent);
|
|
default:
|
|
// Generic context for unknown task types
|
|
const contextBuilder = new EnhancedContext(this.projectDir);
|
|
await contextBuilder.initialize();
|
|
return await contextBuilder.buildContext();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get token stats for all task types
|
|
*/
|
|
public async getTokenStats(): Promise<Record<TaskType, {
|
|
tokenCount: number;
|
|
savings: number;
|
|
includedFiles: number;
|
|
trimmedFiles: number;
|
|
excludedFiles: number;
|
|
}>> {
|
|
const taskTypes: TaskType[] = ['readme', 'description', 'commit'];
|
|
const stats: Record<TaskType, any> = {} as any;
|
|
|
|
for (const taskType of taskTypes) {
|
|
const result = await this.createContextForTask(taskType);
|
|
stats[taskType] = {
|
|
tokenCount: result.tokenCount,
|
|
savings: result.tokenSavings,
|
|
includedFiles: result.includedFiles.length,
|
|
trimmedFiles: result.trimmedFiles.length,
|
|
excludedFiles: result.excludedFiles.length
|
|
};
|
|
}
|
|
|
|
return stats;
|
|
}
|
|
} |