openai-compatible-task-master
Version:
使用MCP解析PRD文档并生成任务列表
121 lines (116 loc) • 4.64 kB
JavaScript
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