task-processor.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /**
  2. * 任务处理模块
  3. *
  4. * 负责处理单个任务,将任务描述发送给Cursor执行代码开发
  5. */
  6. import { info, error } from './logger.js';
  7. /**
  8. * 处理任务
  9. *
  10. * 这个函数将任务描述格式化后返回,供Cursor通过MCP协议接收并执行
  11. *
  12. * @param {Object} task - 任务对象
  13. * @param {number} task.task_id - 任务ID
  14. * @param {string} task.task_name - 任务名称
  15. * @param {string} task.task_description - 任务描述(markdown格式)
  16. * @returns {Promise<Object>} 处理结果
  17. */
  18. export async function processTask(task) {
  19. info(`[Task Processor] Processing task ${task.task_id}: ${task.task_name}`);
  20. const startTime = Date.now();
  21. try {
  22. // 构建任务执行消息
  23. // 这个消息将通过MCP协议返回给Cursor,Cursor会解析并执行
  24. const taskMessage = {
  25. type: 'development_task',
  26. task_id: task.task_id,
  27. task_name: task.task_name,
  28. description: task.task_description,
  29. timestamp: new Date().toISOString(),
  30. };
  31. // 格式化任务描述,确保是有效的markdown
  32. const formattedDescription = formatTaskDescription(task);
  33. info(`[Task Processor] Task ${task.task_id} description formatted successfully (${formattedDescription.length} characters)`);
  34. // 返回任务信息,供Cursor处理
  35. // Cursor会接收到这个信息,并根据描述执行代码开发
  36. const result = {
  37. success: true,
  38. message: `Task ${task.task_id} prepared for execution`,
  39. task_id: task.task_id,
  40. task_name: task.task_name,
  41. formatted_description: formattedDescription,
  42. // 这些字段将在任务完成后更新到数据库
  43. code_name: null,
  44. code_path: null,
  45. execution_instructions: `
  46. 请根据以下任务描述进行代码开发:
  47. ## 任务信息
  48. - 任务ID: ${task.task_id}
  49. - 任务名称: ${task.task_name}
  50. ## 任务描述
  51. ${formattedDescription}
  52. ## 执行要求
  53. 1. 仔细阅读任务描述,理解需求
  54. 2. 根据描述开发相应的代码
  55. 3. 确保代码符合项目规范
  56. 4. 完成后,请提供生成的代码文件名和路径信息
  57. `,
  58. };
  59. const duration = Date.now() - startTime;
  60. info(`[Task Processor] Task ${task.task_id} processed successfully in ${duration}ms`);
  61. return result;
  62. } catch (err) {
  63. const duration = Date.now() - startTime;
  64. error(`[Task Processor] Task ${task.task_id} processing failed after ${duration}ms: ${err.message}`);
  65. return {
  66. success: false,
  67. message: `Failed to process task: ${err.message}`,
  68. error: err.stack,
  69. };
  70. }
  71. }
  72. /**
  73. * 格式化任务描述
  74. *
  75. * @param {Object} task - 任务对象
  76. * @returns {string} 格式化后的任务描述
  77. */
  78. function formatTaskDescription(task) {
  79. let description = task.task_description || '';
  80. // 确保描述是有效的markdown格式
  81. // 如果描述不是以markdown格式开头,添加一些基本格式
  82. if (!description.trim().startsWith('#')) {
  83. description = `# ${task.task_name}\n\n${description}`;
  84. }
  85. return description;
  86. }
  87. /**
  88. * 验证任务描述格式
  89. *
  90. * @param {string} description - 任务描述
  91. * @returns {boolean} 是否为有效的markdown格式
  92. */
  93. export function validateTaskDescription(description) {
  94. if (!description || typeof description !== 'string') {
  95. return false;
  96. }
  97. // 基本验证:检查是否包含一些内容
  98. if (description.trim().length === 0) {
  99. return false;
  100. }
  101. return true;
  102. }
  103. /**
  104. * 提取任务中的关键信息
  105. *
  106. * @param {Object} task - 任务对象
  107. * @returns {Object} 提取的关键信息
  108. */
  109. export function extractTaskInfo(task) {
  110. const description = task.task_description || '';
  111. // 尝试提取代码文件名和路径(如果任务描述中包含)
  112. const codeNameMatch = description.match(/代码文件名[::]\s*([^\n]+)/i);
  113. const codePathMatch = description.match(/代码路径[::]\s*([^\n]+)/i);
  114. return {
  115. code_name: codeNameMatch ? codeNameMatch[1].trim() : null,
  116. code_path: codePathMatch ? codePathMatch[1].trim() : null,
  117. };
  118. }