README
🚀 任务编排器
任务编排器是一个用于任务编排和管理的模型上下文协议(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"的子任务)。
goalId和taskId的组合保证是唯一的。
工具
服务器提供以下工具(基于build/index.js):
-
create_goal- 创建一个新目标
- 参数:
{ description: string; // 目标描述 repoName: string; // 与此目标关联的仓库名称 } - 示例输入:
{ "description": "实现用户认证", "repoName": "example/auth-service" } - 返回值:
{ goalId: number }
-
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对象是简化的,不包括createdAt、updatedAt或parentId。
- 向目标添加多个任务。任务可以以层次结构的形式提供。对于现有任务的子任务,请使用
-
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对象是简化的,不包括createdAt、updatedAt或parentId。
- 从目标中软删除多个任务。任务被标记为已删除,但仍保留在系统中。默认情况下,如果父任务有子任务,则在未明确删除其子任务的情况下,不能软删除该父任务。软删除的任务默认从
-
get_tasks- 获取目标的任务。任务ID使用点符号表示法(例如,"1"、"1.1"、"1.1.1")。当指定
includeSubtasks时,响应将返回层次化任务对象。否则,将返回不包括createdAt、updatedAt或parentId的简化任务对象。 - 参数:
{ 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对象是简化的,不包括createdAt、updatedAt或parentId。
- 获取目标的任务。任务ID使用点符号表示法(例如,"1"、"1.1"、"1.1.1")。当指定
-
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对象是简化的,不包括createdAt、updatedAt或parentId。
💻 使用示例
创建目标和任务
// 创建一个新目标。其顶级任务的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
安装步骤
-
安装依赖项:
pnpm install -
构建项目:
pnpm build -
运行测试:
pnpm test
项目结构
src/- 源代码index.ts- 主服务器实现storage.ts- 数据持久层types.ts- TypeScript 类型定义prompts.ts- AI 提示模板__tests__/- 测试文件
📄 许可证
本项目采用 MIT 许可证。
Scan to join WeChat group