From 7630185773bb97d0027287f4622aed14c016c2da Mon Sep 17 00:00:00 2001 From: siage Date: Fri, 11 Apr 2025 17:01:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BB=BB=E5=8B=99=E8=A4=87?= =?UTF-8?q?=E9=9B=9C=E5=BA=A6=E8=A9=95=E4=BC=B0=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E5=8C=85=E5=90=AB=E8=A4=87=E9=9B=9C=E5=BA=A6=E7=B4=9A=E5=88=A5?= =?UTF-8?q?=E3=80=81=E8=A9=95=E4=BC=B0=E6=8C=87=E6=A8=99=E5=8F=8A=E8=99=95?= =?UTF-8?q?=E7=90=86=E5=BB=BA=E8=AD=B0=EF=BC=8C=E4=B8=A6=E5=9C=A8=E4=BB=BB?= =?UTF-8?q?=E5=8B=99=E5=9F=B7=E8=A1=8C=E9=81=8E=E7=A8=8B=E4=B8=AD=E9=A1=AF?= =?UTF-8?q?=E7=A4=BA=E8=A9=95=E4=BC=B0=E7=B5=90=E6=9E=9C=E3=80=82=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E7=9B=B8=E9=97=9C=E6=A8=A1=E5=9E=8B=E5=92=8C=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E4=BB=A5=E6=94=AF=E6=8C=81=E6=AD=A4=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=8C=E6=8F=90=E5=8D=87=E4=BB=BB=E5=8B=99=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=9A=84=E9=9D=88=E6=B4=BB=E6=80=A7=E8=88=87=E5=8F=AF=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=80=A7=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/models/taskModel.ts | 142 +++++++++++++++++++++++++++++++++++++++- src/tools/taskTools.ts | 59 +++++++++++++++-- src/types/index.ts | 40 +++++++++++ 3 files changed, 236 insertions(+), 5 deletions(-) diff --git a/src/models/taskModel.ts b/src/models/taskModel.ts index b7890c0..d9b3d7e 100644 --- a/src/models/taskModel.ts +++ b/src/models/taskModel.ts @@ -1,4 +1,11 @@ -import { Task, TaskStatus, TaskDependency } from "../types/index.js"; +import { + Task, + TaskStatus, + TaskDependency, + TaskComplexityLevel, + TaskComplexityThresholds, + TaskComplexityAssessment, +} from "../types/index.js"; import fs from "fs/promises"; import path from "path"; import { v4 as uuidv4 } from "uuid"; @@ -298,3 +305,136 @@ export async function deleteTask( return { success: true, message: "任務刪除成功" }; } + +// 評估任務複雜度 +export async function assessTaskComplexity( + taskId: string +): Promise { + const task = await getTaskById(taskId); + + if (!task) { + return null; + } + + // 評估各項指標 + const descriptionLength = task.description.length; + const dependenciesCount = task.dependencies.length; + const notesLength = task.notes ? task.notes.length : 0; + const hasNotes = !!task.notes; + + // 基於各項指標評估複雜度級別 + let level = TaskComplexityLevel.LOW; + + // 描述長度評估 + if ( + descriptionLength >= TaskComplexityThresholds.DESCRIPTION_LENGTH.VERY_HIGH + ) { + level = TaskComplexityLevel.VERY_HIGH; + } else if ( + descriptionLength >= TaskComplexityThresholds.DESCRIPTION_LENGTH.HIGH + ) { + level = TaskComplexityLevel.HIGH; + } else if ( + descriptionLength >= TaskComplexityThresholds.DESCRIPTION_LENGTH.MEDIUM + ) { + level = TaskComplexityLevel.MEDIUM; + } + + // 依賴數量評估(取最高級別) + if ( + dependenciesCount >= TaskComplexityThresholds.DEPENDENCIES_COUNT.VERY_HIGH + ) { + level = TaskComplexityLevel.VERY_HIGH; + } else if ( + dependenciesCount >= TaskComplexityThresholds.DEPENDENCIES_COUNT.HIGH && + level !== TaskComplexityLevel.VERY_HIGH + ) { + level = TaskComplexityLevel.HIGH; + } else if ( + dependenciesCount >= TaskComplexityThresholds.DEPENDENCIES_COUNT.MEDIUM && + level !== TaskComplexityLevel.HIGH && + level !== TaskComplexityLevel.VERY_HIGH + ) { + level = TaskComplexityLevel.MEDIUM; + } + + // 注記長度評估(取最高級別) + if (notesLength >= TaskComplexityThresholds.NOTES_LENGTH.VERY_HIGH) { + level = TaskComplexityLevel.VERY_HIGH; + } else if ( + notesLength >= TaskComplexityThresholds.NOTES_LENGTH.HIGH && + level !== TaskComplexityLevel.VERY_HIGH + ) { + level = TaskComplexityLevel.HIGH; + } else if ( + notesLength >= TaskComplexityThresholds.NOTES_LENGTH.MEDIUM && + level !== TaskComplexityLevel.HIGH && + level !== TaskComplexityLevel.VERY_HIGH + ) { + level = TaskComplexityLevel.MEDIUM; + } + + // 根據複雜度級別生成處理建議 + const recommendations: string[] = []; + + // 低複雜度任務建議 + if (level === TaskComplexityLevel.LOW) { + recommendations.push("此任務複雜度較低,可直接執行"); + recommendations.push("建議設定清晰的完成標準,確保驗收有明確依據"); + } + // 中等複雜度任務建議 + else if (level === TaskComplexityLevel.MEDIUM) { + recommendations.push("此任務具有一定複雜性,建議詳細規劃執行步驟"); + recommendations.push("可分階段執行並定期檢查進度,確保理解準確且實施完整"); + if (dependenciesCount > 0) { + recommendations.push("注意檢查所有依賴任務的完成狀態和輸出質量"); + } + } + // 高複雜度任務建議 + else if (level === TaskComplexityLevel.HIGH) { + recommendations.push("此任務複雜度較高,建議先進行充分的分析和規劃"); + recommendations.push("考慮將任務拆分為較小的、可獨立執行的子任務"); + recommendations.push("建立清晰的里程碑和檢查點,便於追蹤進度和品質"); + if ( + dependenciesCount > TaskComplexityThresholds.DEPENDENCIES_COUNT.MEDIUM + ) { + recommendations.push( + "依賴任務較多,建議製作依賴關係圖,確保執行順序正確" + ); + } + } + // 極高複雜度任務建議 + else if (level === TaskComplexityLevel.VERY_HIGH) { + recommendations.push("⚠️ 此任務複雜度極高,強烈建議拆分為多個獨立任務"); + recommendations.push( + "在執行前進行詳盡的分析和規劃,明確定義各子任務的範圍和介面" + ); + recommendations.push( + "對任務進行風險評估,識別可能的阻礙因素並制定應對策略" + ); + recommendations.push("建立具體的測試和驗證標準,確保每個子任務的輸出質量"); + if ( + descriptionLength >= TaskComplexityThresholds.DESCRIPTION_LENGTH.VERY_HIGH + ) { + recommendations.push( + "任務描述非常長,建議整理關鍵點並建立結構化的執行清單" + ); + } + if (dependenciesCount >= TaskComplexityThresholds.DEPENDENCIES_COUNT.HIGH) { + recommendations.push( + "依賴任務數量過多,建議重新評估任務邊界,確保任務切分合理" + ); + } + } + + return { + level, + metrics: { + descriptionLength, + dependenciesCount, + notesLength, + hasNotes, + }, + recommendations, + }; +} diff --git a/src/tools/taskTools.ts b/src/tools/taskTools.ts index 94e7c27..ef5fe91 100644 --- a/src/tools/taskTools.ts +++ b/src/tools/taskTools.ts @@ -7,8 +7,13 @@ import { batchCreateOrUpdateTasks, deleteTask as modelDeleteTask, updateTaskSummary, + assessTaskComplexity, } from "../models/taskModel.js"; -import { TaskStatus, ConversationParticipant } from "../types/index.js"; +import { + TaskStatus, + ConversationParticipant, + TaskComplexityLevel, +} from "../types/index.js"; import { addConversationEntry } from "../models/conversationLogModel.js"; import { extractSummary, @@ -501,6 +506,9 @@ export async function executeTask({ }; } + // ===== 新增:評估任務複雜度 ===== + const complexityAssessment = await assessTaskComplexity(taskId); + // 更新任務狀態為進行中 await updateTaskStatus(taskId, TaskStatus.IN_PROGRESS); @@ -508,7 +516,11 @@ export async function executeTask({ try { await addConversationEntry( ConversationParticipant.MCP, - `開始執行任務:${task.name} (ID: ${task.id})`, + `開始執行任務:${task.name} (ID: ${task.id})${ + complexityAssessment + ? `, 複雜度評估:${complexityAssessment.level}` + : "" + }`, task.id, "任務啟動" ); @@ -516,13 +528,52 @@ export async function executeTask({ console.error("記錄對話日誌時發生錯誤:", error); } - const prompt = `## 任務執行指示\n\n### 任務詳情\n\n- **名稱:** ${ + // 構建任務執行提示 + let prompt = `## 任務執行指示\n\n### 任務詳情\n\n- **名稱:** ${ task.name }\n- **ID:** \`${task.id}\`\n- **描述:** ${task.description}\n${ task.notes ? `- **注意事項:** ${task.notes}\n` : "" + }\n`; + + // 新增:添加複雜度評估部分 + if (complexityAssessment) { + // 添加複雜度評估部分 + prompt += `\n## 任務複雜度評估\n\n- **複雜度級別:** ${complexityAssessment.level}`; + + // 根據複雜度級別使用不同風格 + let complexityStyle = ""; + if (complexityAssessment.level === TaskComplexityLevel.VERY_HIGH) { + complexityStyle = "⚠️ **警告:此任務複雜度極高** ⚠️"; + } else if (complexityAssessment.level === TaskComplexityLevel.HIGH) { + complexityStyle = "⚠️ **注意:此任務複雜度較高**"; + } else if (complexityAssessment.level === TaskComplexityLevel.MEDIUM) { + complexityStyle = "**提示:此任務具有一定複雜性**"; + } + + if (complexityStyle) { + prompt += `\n\n${complexityStyle}\n`; + } + + // 添加評估指標 + prompt += `\n### 評估指標\n`; + prompt += `- 描述長度: ${complexityAssessment.metrics.descriptionLength} 字符\n`; + prompt += `- 依賴任務數: ${complexityAssessment.metrics.dependenciesCount} 個\n`; + if (complexityAssessment.metrics.hasNotes) { + prompt += `- 注記長度: ${complexityAssessment.metrics.notesLength} 字符\n`; + } + + // 添加處理建議 + if (complexityAssessment.recommendations.length > 0) { + prompt += `\n### 處理建議\n`; + complexityAssessment.recommendations.forEach((recommendation, index) => { + prompt += `${index + 1}. ${recommendation}\n`; + }); + } + + prompt += `\n`; } -## 執行指引\n\n1. 請仔細分析任務要求,確保理解所有細節和約束條件 + prompt += `## 執行指引\n\n1. 請仔細分析任務要求,確保理解所有細節和約束條件 2. 設計詳細的執行方案,包括具體步驟和技術選擇 3. 系統性地實施您的方案,遵循最佳實踐和項目慣例 4. 完整記錄您的實施過程,包括重要決策點和遇到的挑戰 diff --git a/src/types/index.ts b/src/types/index.ts index 8c0c8cc..bfd3c65 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -97,3 +97,43 @@ export interface ListConversationLogArgs { limit?: number; // 返回結果數量限制(選填) offset?: number; // 分頁偏移量(選填) } + +// 任務複雜度級別:定義任務的複雜程度分類 +export enum TaskComplexityLevel { + LOW = "低複雜度", // 簡單且直接的任務,通常不需要特殊處理 + MEDIUM = "中等複雜度", // 具有一定複雜性但仍可管理的任務 + HIGH = "高複雜度", // 複雜且耗時的任務,需要特別關注 + VERY_HIGH = "極高複雜度", // 極其複雜的任務,建議拆分處理 +} + +// 任務複雜度閾值:定義任務複雜度評估的參考標準 +export const TaskComplexityThresholds = { + DESCRIPTION_LENGTH: { + MEDIUM: 500, // 超過此字數判定為中等複雜度 + HIGH: 1000, // 超過此字數判定為高複雜度 + VERY_HIGH: 2000, // 超過此字數判定為極高複雜度 + }, + DEPENDENCIES_COUNT: { + MEDIUM: 2, // 超過此依賴數量判定為中等複雜度 + HIGH: 5, // 超過此依賴數量判定為高複雜度 + VERY_HIGH: 10, // 超過此依賴數量判定為極高複雜度 + }, + NOTES_LENGTH: { + MEDIUM: 200, // 超過此字數判定為中等複雜度 + HIGH: 500, // 超過此字數判定為高複雜度 + VERY_HIGH: 1000, // 超過此字數判定為極高複雜度 + }, +}; + +// 任務複雜度評估結果:記錄任務複雜度分析的詳細結果 +export interface TaskComplexityAssessment { + level: TaskComplexityLevel; // 整體複雜度級別 + metrics: { + // 各項評估指標的詳細數據 + descriptionLength: number; // 描述長度 + dependenciesCount: number; // 依賴數量 + notesLength: number; // 注記長度 + hasNotes: boolean; // 是否有注記 + }; + recommendations: string[]; // 處理建議列表 +}