mirror of
https://github.com/cjo4m06/mcp-shrimp-task-manager.git
synced 2025-10-18 02:41:33 +08:00
142 lines
3.6 KiB
TypeScript
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");
|
|
}
|