2025-04-15 19:02:28 +08:00
|
|
|
/**
|
|
|
|
* getTaskDetail prompt 生成器
|
|
|
|
* 負責將模板和參數組合成最終的 prompt
|
|
|
|
*/
|
|
|
|
|
2025-04-26 19:58:52 +08:00
|
|
|
import {
|
|
|
|
loadPrompt,
|
|
|
|
generatePrompt,
|
|
|
|
loadPromptFromTemplate,
|
|
|
|
} from "../loader.js";
|
|
|
|
import { Task } from "../../types/index.js";
|
2025-04-15 19:02:28 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* getTaskDetail prompt 參數介面
|
|
|
|
*/
|
|
|
|
export interface GetTaskDetailPromptParams {
|
|
|
|
taskId: string;
|
|
|
|
task?: Task | null;
|
|
|
|
error?: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 獲取 getTaskDetail 的完整 prompt
|
|
|
|
* @param params prompt 參數
|
|
|
|
* @returns 生成的 prompt
|
|
|
|
*/
|
2025-07-06 20:48:11 +08:00
|
|
|
export async function getGetTaskDetailPrompt(
|
2025-04-15 19:02:28 +08:00
|
|
|
params: GetTaskDetailPromptParams
|
2025-07-06 20:48:11 +08:00
|
|
|
): Promise<string> {
|
2025-04-15 19:02:28 +08:00
|
|
|
const { taskId, task, error } = params;
|
|
|
|
|
|
|
|
// 如果有錯誤,顯示錯誤訊息
|
|
|
|
if (error) {
|
2025-07-06 20:48:11 +08:00
|
|
|
const errorTemplate = await loadPromptFromTemplate(
|
|
|
|
"getTaskDetail/error.md"
|
|
|
|
);
|
2025-04-26 19:58:52 +08:00
|
|
|
return generatePrompt(errorTemplate, {
|
2025-04-15 19:02:28 +08:00
|
|
|
errorMessage: error,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// 如果找不到任務,顯示找不到任務的訊息
|
|
|
|
if (!task) {
|
2025-07-06 20:48:11 +08:00
|
|
|
const notFoundTemplate = await loadPromptFromTemplate(
|
2025-04-26 19:58:52 +08:00
|
|
|
"getTaskDetail/notFound.md"
|
|
|
|
);
|
|
|
|
return generatePrompt(notFoundTemplate, {
|
2025-04-15 19:02:28 +08:00
|
|
|
taskId,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2025-04-26 19:58:52 +08:00
|
|
|
let notesPrompt = "";
|
2025-04-15 19:02:28 +08:00
|
|
|
if (task.notes) {
|
2025-07-06 20:48:11 +08:00
|
|
|
const notesTemplate = await loadPromptFromTemplate(
|
|
|
|
"getTaskDetail/notes.md"
|
|
|
|
);
|
2025-04-26 19:58:52 +08:00
|
|
|
notesPrompt = generatePrompt(notesTemplate, {
|
2025-04-15 19:02:28 +08:00
|
|
|
notes: task.notes,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2025-04-26 19:58:52 +08:00
|
|
|
let dependenciesPrompt = "";
|
2025-04-15 19:02:28 +08:00
|
|
|
if (task.dependencies && task.dependencies.length > 0) {
|
2025-07-06 20:48:11 +08:00
|
|
|
const dependenciesTemplate = await loadPromptFromTemplate(
|
2025-04-26 19:58:52 +08:00
|
|
|
"getTaskDetail/dependencies.md"
|
|
|
|
);
|
|
|
|
dependenciesPrompt = generatePrompt(dependenciesTemplate, {
|
2025-04-15 19:02:28 +08:00
|
|
|
dependencies: task.dependencies
|
|
|
|
.map((dep) => `\`${dep.taskId}\``)
|
|
|
|
.join(", "),
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2025-04-26 19:58:52 +08:00
|
|
|
let implementationGuidePrompt = "";
|
2025-04-15 19:02:28 +08:00
|
|
|
if (task.implementationGuide) {
|
2025-07-06 20:48:11 +08:00
|
|
|
const implementationGuideTemplate = await loadPromptFromTemplate(
|
2025-04-26 19:58:52 +08:00
|
|
|
"getTaskDetail/implementationGuide.md"
|
|
|
|
);
|
|
|
|
implementationGuidePrompt = generatePrompt(implementationGuideTemplate, {
|
2025-04-15 19:02:28 +08:00
|
|
|
implementationGuide: task.implementationGuide,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2025-04-26 19:58:52 +08:00
|
|
|
let verificationCriteriaPrompt = "";
|
2025-04-15 19:02:28 +08:00
|
|
|
if (task.verificationCriteria) {
|
2025-07-06 20:48:11 +08:00
|
|
|
const verificationCriteriaTemplate = await loadPromptFromTemplate(
|
2025-04-26 19:58:52 +08:00
|
|
|
"getTaskDetail/verificationCriteria.md"
|
|
|
|
);
|
|
|
|
verificationCriteriaPrompt = generatePrompt(verificationCriteriaTemplate, {
|
2025-04-15 19:02:28 +08:00
|
|
|
verificationCriteria: task.verificationCriteria,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2025-04-26 19:58:52 +08:00
|
|
|
let relatedFilesPrompt = "";
|
2025-04-15 19:02:28 +08:00
|
|
|
if (task.relatedFiles && task.relatedFiles.length > 0) {
|
2025-07-06 20:48:11 +08:00
|
|
|
const relatedFilesTemplate = await loadPromptFromTemplate(
|
2025-04-26 19:58:52 +08:00
|
|
|
"getTaskDetail/relatedFiles.md"
|
|
|
|
);
|
|
|
|
relatedFilesPrompt = generatePrompt(relatedFilesTemplate, {
|
|
|
|
files: task.relatedFiles
|
|
|
|
.map(
|
|
|
|
(file) =>
|
|
|
|
`- \`${file.path}\` (${file.type})${
|
|
|
|
file.description ? `: ${file.description}` : ""
|
|
|
|
}`
|
|
|
|
)
|
|
|
|
.join("\n"),
|
2025-04-15 19:02:28 +08:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2025-04-26 19:58:52 +08:00
|
|
|
let complatedSummaryPrompt = "";
|
2025-04-15 19:02:28 +08:00
|
|
|
if (task.completedAt) {
|
2025-07-06 20:48:11 +08:00
|
|
|
const complatedSummaryTemplate = await loadPromptFromTemplate(
|
2025-04-26 19:58:52 +08:00
|
|
|
"getTaskDetail/complatedSummary.md"
|
|
|
|
);
|
|
|
|
complatedSummaryPrompt = generatePrompt(complatedSummaryTemplate, {
|
2025-04-15 19:02:28 +08:00
|
|
|
completedTime: new Date(task.completedAt).toLocaleString("zh-TW"),
|
2025-04-26 19:58:52 +08:00
|
|
|
summary: task.summary || "*無完成摘要*",
|
2025-04-15 19:02:28 +08:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2025-07-06 20:48:11 +08:00
|
|
|
const indexTemplate = await loadPromptFromTemplate("getTaskDetail/index.md");
|
2025-04-26 19:58:52 +08:00
|
|
|
|
|
|
|
// 開始構建基本 prompt
|
|
|
|
let prompt = generatePrompt(indexTemplate, {
|
|
|
|
name: task.name,
|
|
|
|
id: task.id,
|
|
|
|
status: task.status,
|
|
|
|
description: task.description,
|
|
|
|
notesTemplate: notesPrompt,
|
|
|
|
dependenciesTemplate: dependenciesPrompt,
|
|
|
|
implementationGuideTemplate: implementationGuidePrompt,
|
|
|
|
verificationCriteriaTemplate: verificationCriteriaPrompt,
|
|
|
|
relatedFilesTemplate: relatedFilesPrompt,
|
|
|
|
createdTime: new Date(task.createdAt).toLocaleString("zh-TW"),
|
|
|
|
updatedTime: new Date(task.updatedAt).toLocaleString("zh-TW"),
|
|
|
|
complatedSummaryTemplate: complatedSummaryPrompt,
|
|
|
|
});
|
2025-04-15 19:02:28 +08:00
|
|
|
|
|
|
|
// 載入可能的自定義 prompt
|
2025-04-26 19:58:52 +08:00
|
|
|
return loadPrompt(prompt, "GET_TASK_DETAIL");
|
2025-04-15 19:02:28 +08:00
|
|
|
}
|