mirror of
https://github.com/cjo4m06/mcp-shrimp-task-manager.git
synced 2025-07-26 16:02:26 +08:00
77 lines
2.2 KiB
TypeScript
77 lines
2.2 KiB
TypeScript
import { z } from "zod";
|
||
import path from "path";
|
||
import { fileURLToPath } from "url";
|
||
import { getAllTasks } from "../../models/taskModel.js";
|
||
import { TaskStatus, Task } from "../../types/index.js";
|
||
import { getPlanTaskPrompt } from "../../prompts/index.js";
|
||
|
||
// 開始規劃工具
|
||
export const planTaskSchema = z.object({
|
||
description: z
|
||
.string()
|
||
.min(10, {
|
||
message: "任務描述不能少於10個字符,請提供更詳細的描述以確保任務目標明確",
|
||
})
|
||
.describe("完整詳細的任務問題描述,應包含任務目標、背景及預期成果"),
|
||
requirements: z
|
||
.string()
|
||
.optional()
|
||
.describe("任務的特定技術要求、業務約束條件或品質標準(選填)"),
|
||
existingTasksReference: z
|
||
.boolean()
|
||
.optional()
|
||
.default(false)
|
||
.describe("是否參考現有任務作為規劃基礎,用於任務調整和延續性規劃"),
|
||
});
|
||
|
||
export async function planTask({
|
||
description,
|
||
requirements,
|
||
existingTasksReference = false,
|
||
}: z.infer<typeof planTaskSchema>) {
|
||
// 獲取基礎目錄路徑
|
||
const __filename = fileURLToPath(import.meta.url);
|
||
const __dirname = path.dirname(__filename);
|
||
const PROJECT_ROOT = path.resolve(__dirname, "../../..");
|
||
const DATA_DIR = process.env.DATA_DIR || path.join(PROJECT_ROOT, "data");
|
||
const MEMORY_DIR = path.join(DATA_DIR, "memory");
|
||
|
||
// 準備所需參數
|
||
let completedTasks: Task[] = [];
|
||
let pendingTasks: Task[] = [];
|
||
|
||
// 當 existingTasksReference 為 true 時,從數據庫中載入所有任務作為參考
|
||
if (existingTasksReference) {
|
||
try {
|
||
const allTasks = await getAllTasks();
|
||
|
||
// 將任務分為已完成和未完成兩類
|
||
completedTasks = allTasks.filter(
|
||
(task) => task.status === TaskStatus.COMPLETED
|
||
);
|
||
pendingTasks = allTasks.filter(
|
||
(task) => task.status !== TaskStatus.COMPLETED
|
||
);
|
||
} catch (error) {}
|
||
}
|
||
|
||
// 使用prompt生成器獲取最終prompt
|
||
const prompt = getPlanTaskPrompt({
|
||
description,
|
||
requirements,
|
||
existingTasksReference,
|
||
completedTasks,
|
||
pendingTasks,
|
||
memoryDir: MEMORY_DIR,
|
||
});
|
||
|
||
return {
|
||
content: [
|
||
{
|
||
type: "text" as const,
|
||
text: prompt,
|
||
},
|
||
],
|
||
};
|
||
}
|