From f9409fd48ebc6c014c6234fa77945dd08d9aa85d Mon Sep 17 00:00:00 2001 From: siage Date: Sun, 13 Apr 2025 21:33:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BB=BB=E5=8B=99=E7=9B=B8?= =?UTF-8?q?=E9=97=9C=E6=AC=84=E4=BD=8D=EF=BC=8C=E5=8C=85=E6=8B=AC=E4=BE=9D?= =?UTF-8?q?=E8=B3=B4=E9=97=9C=E4=BF=82=E3=80=81=E5=AF=A6=E7=8F=BE=E6=8C=87?= =?UTF-8?q?=E5=8D=97=E5=8F=8A=E9=A9=97=E8=AD=89=E6=A8=99=E6=BA=96=EF=BC=8C?= =?UTF-8?q?=E4=B8=A6=E8=AA=BF=E6=95=B4=E4=BB=BB=E5=8B=99=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E9=82=8F=E8=BC=AF=E4=BB=A5=E6=94=AF=E6=8C=81=E9=80=99=E4=BA=9B?= =?UTF-8?q?=E6=96=B0=E6=AC=84=E4=BD=8D=EF=BC=8C=E6=8F=90=E5=8D=87=E4=BB=BB?= =?UTF-8?q?=E5=8B=99=E7=AE=A1=E7=90=86=E7=9A=84=E5=AE=8C=E6=95=B4=E6=80=A7?= =?UTF-8?q?=E8=88=87=E5=8F=AF=E8=BF=BD=E6=BA=AF=E6=80=A7=E3=80=82=E5=90=8C?= =?UTF-8?q?=E6=99=82=E6=9B=B4=E6=96=B0=E7=9B=B8=E9=97=9C=E6=8F=8F=E8=BF=B0?= =?UTF-8?q?=E4=BB=A5=E6=8F=90=E4=BE=9B=E6=9B=B4=E6=B8=85=E6=99=B0=E7=9A=84?= =?UTF-8?q?=E6=8C=87=E5=B0=8E=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.ts | 65 ++++++++++++++++++++++++++++++++++++----- src/models/taskModel.ts | 17 +++++++++++ src/tools/taskTools.ts | 42 ++++++++++++++++++++++---- 3 files changed, 111 insertions(+), 13 deletions(-) diff --git a/src/index.ts b/src/index.ts index e2d7484..28b24f1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -69,7 +69,7 @@ async function main() { server.tool( "analyze_task", - "深入分析任務需求並系統性檢查代碼庫,評估技術可行性與潛在風險", + "深入分析任務需求並系統性檢查代碼庫,評估技術可行性與潛在風險,如果需要提供程式碼請使用 pseudocode 格式且盡量精簡只保留核心實現部分", { summary: z .string() @@ -84,7 +84,9 @@ async function main() { message: "初步解答構想過於簡短,請提供更完整的技術方案和實施策略詳情", }) - .describe("初步解答構想,包含技術方案、架構設計和實施策略"), + .describe( + "初步解答構想,包含技術方案、架構設計和實施策略,如果需要提供程式碼請使用 pseudocode 格式且盡量精簡只保留核心實現部分" + ), previousAnalysis: z .string() .optional() @@ -99,7 +101,7 @@ async function main() { server.tool( "reflect_task", - "批判性審查分析結果,評估方案完整性並識別優化機會,確保解決方案符合最佳實踐", + "批判性審查分析結果,評估方案完整性並識別優化機會,確保解決方案符合最佳實踐,如果需要提供程式碼請使用 pseudocode 格式且盡量精簡只保留核心實現部分", { summary: z .string() @@ -115,7 +117,7 @@ async function main() { "技術分析結果過於簡略,請提供更詳盡的技術細節、依賴組件和實施方案說明", }) .describe( - "完整詳盡的技術分析結果,包括所有技術細節、依賴組件和實施方案" + "完整詳盡的技術分析結果,包括所有技術細節、依賴組件和實施方案,如果需要提供程式碼請使用 pseudocode 格式且盡量精簡只保留核心實現部分" ), }, async (args) => { @@ -125,7 +127,7 @@ async function main() { server.tool( "split_tasks", - "將複雜任務分解為獨立且可追蹤的子任務,建立明確的依賴關係和優先順序。支援四種任務更新模式:追加(append)、覆蓋(overwrite)、選擇性更新(selective)和清除所有任務(clearAllTasks),其中覆蓋模式只會刪除未完成的任務並保留已完成任務,選擇性更新模式可根據任務名稱智能匹配更新現有任務,同時保留其他任務,如果你需要規劃全新的任務請使用清除所有任務模式會清除所有任務並創建備份。請優先使用清除所有任務模式,只有用戶要求變更或修改計畫內容才使用其他模式", + "將複雜任務分解為獨立且可追蹤的子任務,建立明確的依賴關係和優先順序。支援四種任務更新模式:追加(append)、覆蓋(overwrite)、選擇性更新(selective)和清除所有任務(clearAllTasks),其中覆蓋模式只會刪除未完成的任務並保留已完成任務,選擇性更新模式可根據任務名稱智能匹配更新現有任務,同時保留其他任務,如果你需要規劃全新的任務請使用清除所有任務模式會清除所有任務並創建備份。請優先使用清除所有任務模式,只有用戶要求變更或修改計畫內容才使用其他模式。\n\n**請參考之前的分析結果提供 pseudocode\n\n**如果任務太多或內容過長,請分批使用「split_tasks」工具,每次只提交一小部分任務", { updateMode: z .enum(["append", "overwrite", "selective", "clearAllTasks"]) @@ -186,8 +188,9 @@ async function main() { .describe("與任務相關的檔案列表,包含檔案路徑、類型和描述"), implementationGuide: z .string() - .optional() - .describe("此特定任務的具體實現方法和步驟"), + .describe( + "此特定任務的具體實現方法和步驟,請參考之前的分析結果提供 pseudocode" + ), verificationCriteria: z .string() .optional() @@ -293,6 +296,54 @@ async function main() { name: z.string().optional().describe("任務的新名稱(選填)"), description: z.string().optional().describe("任務的新描述內容(選填)"), notes: z.string().optional().describe("任務的新補充說明(選填)"), + dependencies: z + .array(z.string()) + .optional() + .describe("任務的新依賴關係(選填)"), + relatedFiles: z + .array( + z.object({ + path: z + .string() + .min(1, { message: "文件路徑不能為空,請提供有效的文件路徑" }) + .describe("文件路徑,可以是相對於項目根目錄的路徑或絕對路徑"), + type: z + .enum([ + RelatedFileType.TO_MODIFY, + RelatedFileType.REFERENCE, + RelatedFileType.CREATE, + RelatedFileType.DEPENDENCY, + RelatedFileType.OTHER, + ]) + .describe("文件與任務的關係類型"), + description: z + .string() + .optional() + .describe("文件的補充描述(選填)"), + lineStart: z + .number() + .int() + .positive() + .optional() + .describe("相關代碼區塊的起始行(選填)"), + lineEnd: z + .number() + .int() + .positive() + .optional() + .describe("相關代碼區塊的結束行(選填)"), + }) + ) + .optional() + .describe("與任務相關的文件列表(選填)"), + implementationGuide: z + .string() + .optional() + .describe("任務的新實現指南(選填)"), + verificationCriteria: z + .string() + .optional() + .describe("任務的新驗證標準(選填)"), }, async (args) => { return await updateTaskContent(args); diff --git a/src/models/taskModel.ts b/src/models/taskModel.ts index 19cdedc..be61fcf 100644 --- a/src/models/taskModel.ts +++ b/src/models/taskModel.ts @@ -171,6 +171,9 @@ export async function updateTaskContent( description?: string; notes?: string; relatedFiles?: RelatedFile[]; + dependencies?: string[]; + implementationGuide?: string; + verificationCriteria?: string; } ): Promise<{ success: boolean; message: string; task?: Task }> { // 獲取任務並檢查是否存在 @@ -204,6 +207,20 @@ export async function updateTaskContent( updateObj.relatedFiles = updates.relatedFiles; } + if (updates.dependencies !== undefined) { + updateObj.dependencies = updates.dependencies.map((dep) => ({ + taskId: dep, + })); + } + + if (updates.implementationGuide !== undefined) { + updateObj.implementationGuide = updates.implementationGuide; + } + + if (updates.verificationCriteria !== undefined) { + updateObj.verificationCriteria = updates.verificationCriteria; + } + // 如果沒有要更新的內容,提前返回 if (Object.keys(updateObj).length === 0) { return { success: true, message: "沒有提供需要更新的內容", task }; diff --git a/src/tools/taskTools.ts b/src/tools/taskTools.ts index 7969f56..2b1433c 100644 --- a/src/tools/taskTools.ts +++ b/src/tools/taskTools.ts @@ -267,7 +267,8 @@ export const analyzeTaskSchema = z.object({ initialConcept: z .string() .min(50, { - message: "初步解答構想過於簡短,請提供更完整的技術方案和實施策略詳情", + message: + "初步解答構想過於簡短,請提供更完整的技術方案和實施策略詳情,如果需要提供程式碼請使用 pseudocode 格式且盡量精簡只保留核心實現部分", }) .describe("初步解答構想,包含技術方案、架構設計和實施策略"), previousAnalysis: z @@ -352,7 +353,9 @@ export const reflectTaskSchema = z message: "技術分析結果過於簡略,請提供更詳盡的技術細節、依賴組件和實施方案說明", }) - .describe("完整詳盡的技術分析結果,包括所有技術細節、依賴組件和實施方案"), + .describe( + "完整詳盡的技術分析結果,包括所有技術細節、依賴組件和實施方案,如果需要提供程式碼請使用 pseudocode 格式且盡量精簡只保留核心實現部分" + ), }) .refine((data) => data.summary.length * 3 <= data.analysis.length, { message: @@ -395,6 +398,7 @@ export async function reflectTask({ - **如果確認方案已足夠完善**: - 請使用「split_tasks」工具,將解決方案分解為具體、可執行的子任務 + - 如果任務太多或內容過長,請分批使用「split_tasks」工具,每次只提交一小部分任務 - 建立明確的依賴關係和執行順序 - 為每個子任務設定明確的完成標準和驗收條件 @@ -409,7 +413,7 @@ export async function reflectTask({ 拆分任務時,已將規劃與分析階段產生的關鍵知識保留並融入到任務中: 1. **全局分析結果** - 所有任務都已關聯完整的分析文檔,在執行時可查看 -2. **任務專屬實現指南** - 每個任務都已保存具體的實現方法和建議 +2. **任務專屬實現指南** - 每個任務都已保存具體的實現方法和建議,如果可以請提供 pseudocode 3. **任務專屬驗證標準** - 每個任務都設置了明確的驗證要求和檢查點 此機制確保了任務執行者可以獲得完整的背景知識和技術細節,無需重新思考或推導解決方案。 @@ -486,8 +490,9 @@ export const splitTasksSchema = z .describe("與任務相關的檔案列表,包含檔案路徑、類型和描述"), implementationGuide: z .string() - .optional() - .describe("此特定任務的具體實現方法和步驟"), + .describe( + "此特定任務的具體實現方法和步驟,請參考之前的分析結果提供 pseudocode" + ), verificationCriteria: z .string() .optional() @@ -1518,6 +1523,18 @@ export const updateTaskContentSchema = z ) .optional() .describe("與任務相關的文件列表(選填)"), + dependencies: z + .array(z.string()) + .optional() + .describe("任務的新依賴關係(選填)"), + implementationGuide: z + .string() + .optional() + .describe("任務的新實現指南(選填)"), + verificationCriteria: z + .string() + .optional() + .describe("任務的新驗證標準(選填)"), }) .refine( (data) => { @@ -1541,7 +1558,10 @@ export const updateTaskContentSchema = z data.name || data.description || data.notes || - (data.relatedFiles && data.relatedFiles.length > 0) + data.dependencies || + data.implementationGuide || + data.verificationCriteria || + data.relatedFiles ); }, { @@ -1557,6 +1577,9 @@ export async function updateTaskContent({ description, notes, relatedFiles, + dependencies, + implementationGuide, + verificationCriteria, }: z.infer) { // 獲取任務以檢查它是否存在 const task = await getTaskById(taskId); @@ -1580,6 +1603,10 @@ export async function updateTaskContent({ if (notes) updateSummary += `,更新注記`; if (relatedFiles) updateSummary += `,更新相關文件 (${relatedFiles.length} 個)`; + if (dependencies) + updateSummary += `,更新依賴關係 (${dependencies.length} 個)`; + if (implementationGuide) updateSummary += `,更新實現指南`; + if (verificationCriteria) updateSummary += `,更新驗證標準`; // 執行更新操作 const result = await modelUpdateTaskContent(taskId, { @@ -1587,6 +1614,9 @@ export async function updateTaskContent({ description, notes, relatedFiles, + dependencies, + implementationGuide, + verificationCriteria, }); // 構建響應消息