# Task Manager MCP 工作流程说明

## 问题诊断

### 现象
Task Manager MCP 能够读取到任务，但是没有自动生成对应的代码。

### 原因分析

Task Manager MCP 的工作流程分为以下步骤：

1. **任务读取** ✅ - MCP 从数据库读取任务
2. **返回执行指令** ✅ - MCP 返回任务描述和执行指令
3. **AI 生成代码** ❌ - **这一步需要 AI 主动执行**
4. **更新任务状态** ❌ - **AI 必须调用 MCP 工具更新状态**

### 核心问题

**MCP 只负责任务管理，不负责代码生成**。代码生成需要 AI 来完成。

## MCP 工作流程

### 1. 执行任务 (`execute_task`)

```javascript
mcp_task-manager_execute_task({
  task_id: 7,
  auto_complete: true
})
```

**返回内容**:
- 任务信息（ID、名称、描述）
- 任务描述（包含 DDL、需求等）
- **执行指令**（告诉 AI 如何生成代码）
- **更新状态的提醒**（AI 必须调用 update_task_status）

**注意**: 这个函数**不会**自动生成代码，只是返回指令。

### 2. AI 生成代码

AI 需要：
1. 阅读任务描述
2. 理解需求
3. 生成 Python 代码
4. 保存到指定路径

### 3. 更新任务状态 (`update_task_status`)

```javascript
mcp_task-manager_update_task_status({
  task_id: 7,
  status: "completed",
  code_name: "import_dept_data.py",
  code_path: "app/core/data_flow"
})
```

**这一步是必须的**，否则任务会一直停留在 "processing" 状态。

## 完整流程示例

### 任务 7: 导入数据资源的科室对照表

#### 步骤 1: 读取任务

```javascript
// 获取任务详情
mcp_task-manager_get_task_by_id({ task_id: 7 })

// 返回
{
  "task_id": 7,
  "task_name": "导入数据资源的科室对照表",
  "status": "pending",
  "task_description": "# Task: 导入数据资源的科室对照表\n..."
}
```

#### 步骤 2: 执行任务

```javascript
// 执行任务
mcp_task-manager_execute_task({ 
  task_id: 7, 
  auto_complete: true 
})

// 返回执行指令
{
  "message": "请生成代码并更新任务状态...",
  "task_description": "...",
  "steps": [
    "分析需求",
    "生成代码",
    "更新任务状态"
  ]
}
```

**注意**: 此时任务状态变为 "processing"。

#### 步骤 3: AI 生成代码

AI 执行以下操作：

```python
# 1. 创建代码文件
write("app/core/data_flow/import_dept_data.py", code_content)

# 2. 验证代码
python -m py_compile app/core/data_flow/import_dept_data.py
```

#### 步骤 4: 更新任务状态

```javascript
// AI 调用 MCP 工具更新状态
mcp_task-manager_update_task_status({
  task_id: 7,
  status: "completed",
  code_name: "import_dept_data.py",
  code_path: "app/core/data_flow"
})

// 返回
{
  "task_id": 7,
  "status": "completed",
  "update_time": "2025-11-28T10:33:37.833Z"
}
```

## 任务状态流转

```
pending (待处理)
    ↓
  execute_task 调用
    ↓
processing (处理中)
    ↓
  AI 生成代码
    ↓
  update_task_status 调用
    ↓
completed (已完成)
```

## 常见问题

### Q1: 为什么任务一直停留在 "processing" 状态？

**原因**: AI 没有调用 `update_task_status` 更新状态。

**解决方案**: 在生成代码后，必须调用 `update_task_status`。

### Q2: 任务状态是 "processing"，还能再次执行吗？

**不能**。只有 "pending" 状态的任务才能执行。

**解决方案**: 
```javascript
// 先更新为 pending
mcp_task-manager_update_task_status({
  task_id: 7,
  status: "pending"
})

// 再执行
mcp_task-manager_execute_task({ task_id: 7 })
```

### Q3: MCP 会自动生成代码吗？

**不会**。MCP 只负责：
- 任务管理（读取、更新、删除）
- 返回执行指令

**代码生成**由 AI 负责。

### Q4: 如何查看所有待处理的任务？

```javascript
// 查看 pending 状态的任务
mcp_task-manager_get_pending_tasks()

// 查看所有任务
mcp_task-manager_get_all_tasks({ limit: 20 })
```

## MCP 工具列表

| 工具 | 功能 | 参数 |
|------|------|------|
| `get_pending_tasks` | 获取待处理任务列表 | 无 |
| `get_task_by_id` | 根据ID获取任务详情 | `task_id` |
| `execute_task` | 执行任务（返回指令） | `task_id`, `auto_complete` |
| `update_task_status` | 更新任务状态 | `task_id`, `status`, `code_name`, `code_path` |
| `process_all_tasks` | 批量处理所有待处理任务 | `auto_poll` |
| `create_task` | 创建新任务 | `task_name`, `task_description`, `create_by` |
| `get_all_tasks` | 获取所有任务（调试用） | `limit` |

## 最佳实践

### 1. 自动化流程

```javascript
// 1. 获取所有待处理任务
const pendingTasks = mcp_task-manager_get_pending_tasks()

// 2. 逐个执行
for (const task of pendingTasks) {
  // 执行任务（获取指令）
  const instructions = mcp_task-manager_execute_task({
    task_id: task.task_id,
    auto_complete: true
  })
  
  // AI 生成代码
  // ... (AI 操作)
  
  // 更新状态
  mcp_task-manager_update_task_status({
    task_id: task.task_id,
    status: "completed",
    code_name: "generated_file.py",
    code_path: "app/core/data_flow"
  })
}
```

### 2. 错误处理

```javascript
try {
  // 执行任务
  const result = mcp_task-manager_execute_task({ task_id: 7 })
  
  // AI 生成代码
  // ...
  
  // 更新为完成
  mcp_task-manager_update_task_status({
    task_id: 7,
    status: "completed"
  })
} catch (error) {
  // 更新为失败
  mcp_task-manager_update_task_status({
    task_id: 7,
    status: "failed"
  })
}
```

### 3. 批量处理

```javascript
// 启用自动轮询（每5分钟检查一次）
mcp_task-manager_process_all_tasks({
  auto_poll: true
})
```

## 任务描述格式

### 由 DataFlow 自动生成

当创建 DataFlow 时，系统会自动生成任务描述：

```markdown
# Task: {任务名称}

## Data Source
- Type: postgresql
- Host: 10.52.31.104
- Port: 5432
- Database: hospital_db

## Source Tables (DDL)
```sql
CREATE TABLE source_table (...);
```

## Target Tables (DDL)
```sql
CREATE TABLE target_table (
    ...,
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

## Update Mode
- Mode: Append (追加模式)

## Request Content
{rule 字段的内容}

## Implementation Steps
1. Extract data from source tables
2. Apply transformation logic
3. Write data to target table
4. Generate Python program
5. Generate n8n workflow
```

## 生成的代码结构

### 标准模板

```python
"""
{任务名称}

功能：{任务描述}
模式：{update_mode}
作者：cursor
创建时间：{当前日期}
"""

import logging
from typing import Dict, List, Any
from app.extensions import db
from app.core.graph.neo4j_client import connect_graph

logger = logging.getLogger(__name__)


class DataProcessor:
    """数据处理器"""
    
    def __init__(self):
        self.processed_count = 0
        self.error_count = 0
    
    def get_data_source_info(self, bd_id: int):
        """获取数据源信息"""
        pass
    
    def extract_data(self):
        """提取数据"""
        pass
    
    def transform_data(self, data):
        """转换数据"""
        pass
    
    def load_data(self, data):
        """加载数据"""
        pass
    
    def run(self):
        """执行主流程"""
        pass


def main_function():
    """主函数"""
    processor = DataProcessor()
    return processor.run()


if __name__ == '__main__':
    result = main_function()
    print(f"处理结果: {result}")
```

## 与 DataFlow 集成

### DataFlow 创建时自动生成任务

在 `app/core/data_flow/dataflows.py` 的 `create_dataflow` 函数中：

```python
# 保存到 task_list 表
task_insert_sql = text("""
    INSERT INTO public.task_list 
    (task_name, task_description, status, code_name, code_path, create_by, create_time)
    VALUES 
    (:task_name, :task_description, :status, :code_name, :code_path, :create_by, :create_time)
""")

task_params = {
    'task_name': script_name,
    'task_description': task_description_md,  # Markdown 格式的任务描述
    'status': 'pending',
    'code_name': script_name,
    'code_path': 'app/core/data_flow',
    'create_by': 'cursor',
    'create_time': current_time
}

db.session.execute(task_insert_sql, task_params)
```

### 任务描述包含的信息

1. ✅ **数据源信息**: 从 Neo4j 获取（如果有）
2. ✅ **源表 DDL**: 根据 source_table IDs 生成
3. ✅ **目标表 DDL**: 根据 target_table IDs 生成（含 create_time）
4. ✅ **更新模式**: append 或 full
5. ✅ **规则说明**: rule 字段内容
6. ✅ **实施步骤**: 标准化步骤

## 总结

### MCP 的职责
- ✅ 任务的 CRUD 操作
- ✅ 返回任务描述和执行指令
- ✅ 更新任务状态
- ❌ **不负责生成代码**

### AI 的职责
- ✅ 读取 MCP 返回的任务描述
- ✅ 理解需求并生成代码
- ✅ 保存代码到指定路径
- ✅ **必须调用 MCP 更新任务状态**

### 关键要点

1. **`execute_task` 不会自动生成代码**，只返回指令
2. **AI 必须主动生成代码**
3. **AI 必须调用 `update_task_status`** 更新状态
4. 只有 "pending" 状态的任务才能执行
5. 任务描述由 DataFlow 自动生成，格式标准化

## 示例：任务 7 的完整流程

```javascript
// 1. 查看任务
mcp_task-manager_get_task_by_id({ task_id: 7 })
// 状态: pending

// 2. 执行任务
mcp_task-manager_execute_task({ task_id: 7, auto_complete: true })
// 状态: processing
// 返回: 任务描述 + 执行指令

// 3. AI 生成代码
write("app/core/data_flow/import_dept_data.py", code)
// 文件已创建

// 4. 更新状态
mcp_task-manager_update_task_status({
  task_id: 7,
  status: "completed",
  code_name: "import_dept_data.py",
  code_path: "app/core/data_flow"
})
// 状态: completed ✅
```

## 相关文件

- `app/core/data_flow/dataflows.py` - DataFlow 创建时写入 task_list
- `docs/DataFlow_task_list优化说明.md` - 任务描述生成逻辑
- `app/core/data_flow/import_dept_data.py` - 任务 7 生成的代码

## 更新历史

- **2025-11-28**: 诊断 Task Manager MCP 工作流程，明确 AI 和 MCP 的职责划分

