142 lines
3.6 KiB
TypeScript

/**
* updateTaskContent prompt 生成器
* 負責將模板和參數組合成最終的 prompt
*/
import {
loadPrompt,
generatePrompt,
loadPromptFromTemplate,
} from "../loader.js";
import { Task, RelatedFile } from "../../types/index.js";
/**
* updateTaskContent prompt 參數介面
*/
export interface UpdateTaskContentPromptParams {
taskId: string;
task?: Task;
success?: boolean;
message?: string;
validationError?: string;
emptyUpdate?: boolean;
updatedTask?: Task;
}
/**
* 獲取 updateTaskContent 的完整 prompt
* @param params prompt 參數
* @returns 生成的 prompt
*/
export function getUpdateTaskContentPrompt(
params: UpdateTaskContentPromptParams
): string {
const {
taskId,
task,
success,
message,
validationError,
emptyUpdate,
updatedTask,
} = params;
// 處理任務不存在的情況
if (!task) {
const notFoundTemplate = loadPromptFromTemplate(
"updateTaskContent/notFound.md"
);
return generatePrompt(notFoundTemplate, {
taskId,
});
}
// 處理驗證錯誤的情況
if (validationError) {
const validationTemplate = loadPromptFromTemplate(
"updateTaskContent/validation.md"
);
return generatePrompt(validationTemplate, {
error: validationError,
});
}
// 處理空更新的情況
if (emptyUpdate) {
const emptyUpdateTemplate = loadPromptFromTemplate(
"updateTaskContent/emptyUpdate.md"
);
return generatePrompt(emptyUpdateTemplate, {});
}
// 處理更新成功或失敗的情況
const responseTitle = success ? "Success" : "Failure";
let content = message || "";
// 更新成功且有更新後的任務詳情
if (success && updatedTask) {
const successTemplate = loadPromptFromTemplate(
"updateTaskContent/success.md"
);
// 編合相關文件信息
let filesContent = "";
if (updatedTask.relatedFiles && updatedTask.relatedFiles.length > 0) {
const fileDetailsTemplate = loadPromptFromTemplate(
"updateTaskContent/fileDetails.md"
);
// 按文件類型分組
const filesByType = updatedTask.relatedFiles.reduce((acc, file) => {
if (!acc[file.type]) {
acc[file.type] = [];
}
acc[file.type].push(file);
return acc;
}, {} as Record<string, RelatedFile[]>);
// 為每種文件類型生成內容
for (const [type, files] of Object.entries(filesByType)) {
const filesList = files.map((file) => `\`${file.path}\``).join(", ");
filesContent += generatePrompt(fileDetailsTemplate, {
fileType: type,
fileCount: files.length,
filesList,
});
}
}
// 處理任務備註
const taskNotesPrefix = "- **Notes:** ";
const taskNotes = updatedTask.notes
? `${taskNotesPrefix}${
updatedTask.notes.length > 100
? `${updatedTask.notes.substring(0, 100)}...`
: updatedTask.notes
}\n`
: "";
// 生成成功更新的詳細信息
content += generatePrompt(successTemplate, {
taskName: updatedTask.name,
taskDescription:
updatedTask.description.length > 100
? `${updatedTask.description.substring(0, 100)}...`
: updatedTask.description,
taskNotes: taskNotes,
taskStatus: updatedTask.status,
taskUpdatedAt: new Date(updatedTask.updatedAt).toISOString(),
filesContent,
});
}
const indexTemplate = loadPromptFromTemplate("updateTaskContent/index.md");
const prompt = generatePrompt(indexTemplate, {
responseTitle,
message: content,
});
// 載入可能的自定義 prompt
return loadPrompt(prompt, "UPDATE_TASK_CONTENT");
}