Task Orchestrator

Task Orchestrator

🚀 任务编排器

任务编排器是一个用于任务编排和管理的模型上下文协议(MCP)服务器。该工具可将目标分解为可管理的任务,并跟踪其进度。

🚀 快速开始

理想情况下,大语言模型(LLM)应该能够理解何时使用此MCP工具。作为示例提示,类似以下内容可能会起作用:

"为我创建一个新的开发目标。目标是'实现用户认证',该目标适用于'my-web-app'仓库。"

如果您遇到任何问题,请在顶部的“讨论”标签中创建一个新问题告知我们。

✨ 主要特性

  • 创建和管理目标
  • 将目标分解为层次化任务
  • 跟踪任务完成状态
  • 支持子任务以及父任务与子任务之间的依赖管理
  • 使用LokiDB进行持久化存储

📋 路线图

  • 复杂任务/目标相互依赖编排
  • 目标删除
  • 完成处置
  • 用于可视化进度的用户界面

📚 详细文档

任务ID命名约定

任务ID使用点符号表示法(例如,"1"、"1.1"、"1.1.1"),其中每个段表示层次结构中的一个级别。

  • 对于每个新目标,顶级任务ID从"1"开始并按顺序递增(例如,"1"、"2"、"3")。
  • 子任务的ID是在其父任务ID后面追加一个新段形成的(例如,"1.1"是"1"的子任务)。
  • goalIdtaskId的组合保证是唯一的。

工具

服务器提供以下工具(基于build/index.js):

  1. create_goal

    • 创建一个新目标
    • 参数:
      {
      description: string;  // 目标描述
      repoName: string;     // 与此目标关联的仓库名称
      }
      
    • 示例输入:
      {
      "description": "实现用户认证",
      "repoName": "example/auth-service"
      }
      
    • 返回值:{ goalId: number }
  2. add_tasks

    • 向目标添加多个任务。任务可以以层次结构的形式提供。对于现有任务的子任务,请使用parentId字段。该操作是事务性的:要么批次中的所有任务都成功,要么整个操作失败。
    • 参数:
      {
      goalId: number; // 要添加任务的目标ID
      tasks: Array<{
      title: string; // 任务标题
      description: string; // 任务详细描述
      parentId?: string | null; // 可选的父任务ID,用于现有任务的子任务。对于在此批次中以层次结构定义的新子任务,请勿使用。
      subtasks?: Array<any>; // 要在此任务下创建的嵌套子任务对象数组。
      }>;
      }
      
    • 示例输入:
      {
      "goalId": 1,
      "tasks": [
      {
      "title": "设计数据库架构",
      "description": "定义用户、角色和权限的表",
      "subtasks": [
      {
      "title": "创建实体关系图",
      "description": "绘制实体关系图"
      }
      ]
      },
      {
      "title": "实现用户注册",
      "description": "创建新用户注册的API端点",
      "parentId": "1"
      }
      ]
      }
      
    • 返回值:HierarchicalTaskResponse[]HierarchicalTaskResponse对象是简化的,不包括createdAtupdatedAtparentId
  3. remove_tasks

    • 从目标中软删除多个任务。任务被标记为已删除,但仍保留在系统中。默认情况下,如果父任务有子任务,则在未明确删除其子任务的情况下,不能软删除该父任务。软删除的任务默认从get_tasks结果中排除,除非includeDeletedTasks设置为true
    • 参数:
      {
      goalId: number; // 要删除任务的目标ID
      taskIds: string[]; // 要删除的任务ID(字符串数组)。任务ID使用点符号表示法(例如,"1"、"1.1")。
      deleteChildren?: boolean; // 是否与父任务一起删除子任务(布尔值)。默认为`false`。如果为`false`,尝试删除有现有子任务的父任务将抛出错误。
      }
      
    • 示例输入(不删除子任务):
      {
      "goalId": 1,
      "taskIds": ["2", "3"]
      }
      
    • 示例输入(删除子任务):
      {
      "goalId": 1,
      "taskIds": ["1"],
      "deleteChildren": true
      }
      
    • 返回值:{ removedTasks: TaskResponse[], completedParents: TaskResponse[] }TaskResponse对象是简化的,不包括createdAtupdatedAtparentId
  4. get_tasks

    • 获取目标的任务。任务ID使用点符号表示法(例如,"1"、"1.1"、"1.1.1")。当指定includeSubtasks时,响应将返回层次化任务对象。否则,将返回不包括createdAtupdatedAtparentId的简化任务对象。
    • 参数:
      {
      goalId: number; // 要获取任务的目标ID
      taskIds?: string[]; // 可选:要获取的任务ID(字符串数组)。如果为`null`或为空,则将获取目标的所有任务。
      includeSubtasks?: "none" | "first-level" | "recursive"; // 要包含的子任务级别:"none"(仅顶级任务)、"first-level"(顶级任务及其直接子任务)或"recursive"(所有嵌套子任务)。默认为"none"。
      includeDeletedTasks?: boolean; // 是否在结果中包含软删除的任务(布尔值)。默认为`false`。
      }
      
    • 示例输入:
      {
      "goalId": 1,
      "includeSubtasks": "recursive",
      "includeDeletedTasks": true
      }
      
    • 返回值:TaskResponse[]TaskResponse对象是简化的,不包括createdAtupdatedAtparentId
  5. complete_task_status

    • 将任务标记为已完成。默认情况下,如果父任务有未完成的子任务,则不能将其标记为已完成。
    • 参数:
      {
      goalId: number; // 包含任务的目标ID
      taskIds: string[]; // 要更新的任务ID(字符串数组)。任务ID使用点符号表示法(例如,"1"、"1.1")。
      completeChildren?: boolean; // 是否递归完成所有子任务(布尔值)。默认为`false`。如果为`false`,则只有在所有子任务都已完成的情况下,才能完成任务。
      }
      
    • 示例输入(不完成子任务):
      {
      "goalId": 1,
      "taskIds": ["1", "2"]
      }
      
    • 示例输入(完成子任务):
      {
      "goalId": 1,
      "taskIds": ["1"],
      "completeChildren": true
      }
      
    • 返回值:TaskResponse[]TaskResponse对象是简化的,不包括createdAtupdatedAtparentId

💻 使用示例

创建目标和任务

// 创建一个新目标。其顶级任务的ID将从 "1" 开始。
const goal = await callTool('create_goal', {
description: '实现用户认证',
repoName: 'user/repo'
});

// 添加一个顶级任务
const task1 = await callTool('add_tasks', {
goalId: goal.goalId,
tasks: [
{
title: '设置认证中间件',
description: '实现基于JWT的认证'
}
]
});
// task1.addedTasks[0].id 将为 "1"

// 向之前创建的任务 "1" 添加一个子任务
const task2 = await callTool('add_tasks', {
goalId: goal.goalId,
tasks: [
{
title: '创建登录端点',
description: '实现POST /auth/login',
parentId: "1"  // ParentId 必须引用一个已经存在的任务ID
}
]
});
// task2.addedTasks[0].id 将为 "1.1"

管理任务状态

// 将一个父任务标记为已完成,这也将完成其子任务
await callTool('complete_task_status', {
goalId: 1,
taskIds: ["1"],
completeChildren: true
});

// 递归获取所有任务,包括子任务
const allTasks = await callTool('get_tasks', {
goalId: 1,
includeSubtasks: "recursive"
});

删除任务

// 尝试在不删除子任务的情况下删除一个父任务(如果有子任务,操作将失败)
try {
await callTool('remove_tasks', {
goalId: 1,
taskIds: ["1"]
});
} catch (error) {
console.error(error.message); // 如果存在子任务,预计会抛出错误
}

// 删除一个父任务及其子任务
await callTool('remove_tasks', {
goalId: 1,
taskIds: ["1"],
deleteChildren: true
});

📦 安装指南

前提条件

  • Node.js 18+
  • pnpm

安装步骤

  1. 安装依赖项:

    pnpm install
    
  2. 构建项目:

    pnpm build
    
  3. 运行测试:

    pnpm test
    

项目结构

  • src/ - 源代码
    • index.ts - 主服务器实现
    • storage.ts - 数据持久层
    • types.ts - TypeScript 类型定义
    • prompts.ts - AI 提示模板
    • __tests__/ - 测试文件

📄 许可证

本项目采用 MIT 许可证。

  • 0 关注
  • 0 收藏,34 浏览
  • system 提出于 2025-09-20 03:03

相似服务问题

相关AI产品