UNPKG

openai-compatible-task-master

Version:

使用MCP解析PRD文档并生成任务列表

121 lines (116 loc) 4.64 kB
import * as path from 'path'; import { callOpenAIAPI, cleanJsonContent, normalizeTaskData } from './llm_utils.js'; import chalk from 'chalk'; // 解析任务JSON响应 export function parseJsonResponse(jsonContent) { const cleanedContent = cleanJsonContent(jsonContent); try { // 尝试将内容解析为JSON const data = JSON.parse(cleanedContent); if (!data.tasks || !Array.isArray(data.tasks)) { throw new Error('JSON响应格式不正确,无法找到任务列表'); } if (!data.metadata) { throw new Error('JSON响应格式不正确,无法找到元数据'); } // 验证和处理任务数据 const tasks = data.tasks.map((task) => { // 验证优先级 if (!['high', 'medium', 'low'].includes(task.priority)) { console.warn(chalk.yellow(`任务 ${task.id} 的优先级 "${task.priority}" 无效,将默认为 "medium"`)); task.priority = 'medium'; } return normalizeTaskData(task); }); const metadata = { projectName: data.metadata.projectName, totalTasks: typeof data.metadata.totalTasks === 'number' ? data.metadata.totalTasks : parseInt(data.metadata.totalTasks), sourceFile: data.metadata.sourceFile, generatedAt: data.metadata.generatedAt, }; return { tasks, metadata, }; } catch (error) { const err = error; console.debug(chalk.blue("原始JSON内容:"), cleanedContent); // 记录清理后的JSON以供调试 throw new Error(`LLM返回的内容无法解析为JSON: ${err.message}`); } } // 调用OpenAI Compatible API生成任务 export async function parsePRDWithLLM(prdContent, prdPath, numTasks, openaiUrl, apiKey, model, streamMode, additionalPrompts // 添加可选的额外提示参数 ) { if (!apiKey) { throw new Error('API密钥未提供,请使用 --api-key 参数提供有效的API密钥'); } const projectName = path.basename(path.dirname(prdPath)); const systemPrompt = `你是一个AI助手,帮助将产品需求文档(PRD)分解为一系列开发任务。 你的目标是根据提供的PRD创建${numTasks}个结构良好、可执行的开发任务。请使用简体中文回复。 每个任务应包含以下字段: { "id": "字符串形式的ID(如 '1' 或 '1.2')", "title": "标题", "description": "描述", "status": "pending", "dependencies": [依赖任务ID数组,如 ["1", "2"],若无依赖则为空数组 []], "priority": "high|medium|low", "details": "实现细节", "testStrategy": "验证方法" } 指南: 1. 创建恰好${numTasks}个任务,编号从1到${numTasks}。 2. 每个任务应当是原子性的,专注于单一职责。 3. 逻辑排序任务 - 考虑依赖关系和实现顺序。 4. 早期任务应关注环境搭建,优先实现核心功能,然后是高级功能。 5. 为每个任务包含清晰的验证/测试方法。 6. 设置适当的依赖ID(任务只能依赖于ID较小的任务)。如果任务没有依赖,则为空数组 []。 7. 根据关键性和依赖顺序分配优先级(high/medium|low)。 8."details"字段中包含详细的实现指导。 期望的输出格式: { "tasks": [ { "id": 1, "title": "...", "description": "...", "status": "pending", "dependencies": [], "priority": "high", "details": "...", "testStrategy": "..." }, ... // 其他任务 ], "metadata": { "projectName": "${projectName}", "totalTasks": ${numTasks}, "sourceFile": "${prdPath}", "generatedAt": "${new Date().toISOString()}" } } 重要: 你的回复必须仅包含有效的JSON,不要添加任何额外的解释、评论或代码块标记。必须使用简体中文回复。`; const messages = [ { role: 'system', content: systemPrompt, }, { role: 'user', content: `${additionalPrompts ? `用户额外提示(优先级高于其他冲突指令):\n${additionalPrompts}\n\n` : ''}这是需要分解为${numTasks}个任务的产品需求文档(PRD): ${prdContent}`, }, ]; try { const jsonContent = await callOpenAIAPI(messages, openaiUrl, apiKey, model, streamMode); return parseJsonResponse(jsonContent); } catch (error) { const err = error; throw new Error(`解析PRD失败: ${err.message}`); } } //# sourceMappingURL=llm_parse_prd.js.map