Files
ai-proj-helper/plugins/ai-proj-plugin/skills/SKILL.md

1385 lines
35 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: ai-proj
description: ai-proj 任务与需求管理。用于创建/查询/更新需求、任务、文档。当用户提到 ai-proj、任务管理、需求管理、REQ-XXX 相关操作时自动激活。
---
# ai-proj MCP 技能
通过 MCP (Model Context Protocol) 直接调用 ai-proj 服务,管理任务、需求和文档。
## 功能概述
| 模块 | 功能 |
|------|------|
| **任务管理** | 创建、查询、更新、删除任务,子任务管理 |
| **需求管理** | 需求全生命周期:草稿→评审→开发→完成 |
| **文档管理** | 任务文档的创建、编辑、同步 |
| **计时器** | 任务计时、时间追踪 |
| **每日聚焦** | 今日任务规划、智能推荐 |
| **工作笔记** | 知识管理、笔记搜索 |
| **远程同步** | 本地↔远程数据同步 |
---
## 快速开始
### 常用命令速查
```
# 任务操作
"创建任务: xxx" → mcp__ai-proj__create_task
"查看任务列表" → mcp__ai-proj__list_tasks
"开始任务 123" → mcp__ai-proj__start_task
"完成任务 123" → mcp__ai-proj__complete_task
"查找任务 xxx" → mcp__ai-proj__find_task
# 需求操作
"创建需求: xxx" → mcp__ai-proj__create_requirement
"查看需求列表" → mcp__ai-proj__list_requirements
"提交需求 123 评审" → mcp__ai-proj__requirement_action (submit)
"批准需求 123" → mcp__ai-proj__requirement_action (approve)
# 文档操作
"为任务 123 创建文档" → mcp__ai-proj__create-and-attach
"查看任务 123 的文档" → mcp__ai-proj__get_task_document
# 今日聚焦
"查看今日任务" → mcp__ai-proj__get_daily_focus_tasks
"添加任务到今日聚焦" → mcp__ai-proj__add_daily_focus_task
# 计时器
"开始计时任务 123" → mcp__ai-proj__start_task_with_timer
"停止计时" → mcp__ai-proj__stop_timer
```
---
## 一、任务管理
### 1.1 创建任务
**MCP 函数**: `mcp__ai-proj__create_task`
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| title | string | ✅ | 任务标题 |
| projectId | number | ❌ | 项目ID默认为1 |
**自然语言示例**:
- "创建任务: 实现用户登录功能"
- "新建一个任务叫做数据库优化"
- "在项目2中创建任务: API接口开发"
**返回示例**:
```json
{
"id": 5069,
"title": "实现用户登录功能",
"status": "todo",
"project_id": 1
}
```
### 1.2 查看任务列表
**MCP 函数**: `mcp__ai-proj__list_tasks`
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| projectId | number | ❌ | 项目ID筛选 |
| status | array | ❌ | 状态筛选: draft/planning/todo/in_progress/testing/completed/cancelled/on_hold/suspended/blocked/archived |
| priority | array | ❌ | 优先级筛选: low/medium/high |
| search | string | ❌ | 搜索关键词 |
| page | number | ❌ | 页码从1开始 |
| limit | number | ❌ | 每页数量默认20最大100 |
| sort_by | string | ❌ | 排序字段: created_at/updated_at/due_date/priority/title |
| sort_order | string | ❌ | 排序方向: asc/desc |
| response_mode | string | ❌ | 响应模式: minimal/compact/full |
**自然语言示例**:
- "查看所有任务"
- "列出进行中的任务"
- "查看高优先级任务"
- "搜索包含登录的任务"
### 1.3 查找任务
**MCP 函数**: `mcp__ai-proj__find_task`
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | number | ❌ | 任务ID优先使用 |
| titlePattern | string | ❌ | 标题搜索关键词 |
**自然语言示例**:
- "查找任务 5069"
- "搜索任务名包含登录的"
### 1.4 获取任务详情
**MCP 函数**: `mcp__ai-proj__get_detailed_task_info`
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| taskId | number | ✅ | 任务ID |
**返回**: 包含父任务、同级任务、子任务的格式化信息
### 1.5 更新任务
**MCP 函数**: `mcp__ai-proj__update_task`
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | number | ✅ | 任务ID |
| updates | object | ✅ | 更新字段 |
**updates 支持的字段**:
- `title`: 新标题
- `description`: 新描述
- `status`: 新状态 (draft/planning/todo/in_progress/testing/completed/cancelled/on_hold/suspended/blocked/archived)
- `priority`: 新优先级 (low/medium/high)
- `due_date`: 截止日期 (ISO 8601)
- `assignee_id`: 负责人ID
**自然语言示例**:
- "把任务 5069 的状态改为进行中"
- "更新任务 5069 的优先级为高"
- "修改任务 5069 的标题为: 新标题"
### 1.6 任务状态操作
**开始任务**: `mcp__ai-proj__start_task`
```
参数: id (number) - 任务ID
说明: 将任务状态改为 in_progress
```
**完成任务**: `mcp__ai-proj__complete_task`
```
参数: id (number) - 任务ID
说明: 将任务状态改为 completed
```
**暂停任务**: `mcp__ai-proj__pause_task`
```
参数: id (number) - 任务ID
说明: 将任务状态改为 on_hold
```
**删除任务**: `mcp__ai-proj__delete_task`
```
参数:
- id (number) - 任务ID
- force (boolean) - 是否强制删除(包含子任务)
```
### 1.7 子任务管理
**创建子任务**: `mcp__ai-proj__create_subtask`
```
参数:
- parentId (number) - 父任务ID
- title (string) - 子任务标题
```
**创建兄弟任务**: `mcp__ai-proj__create_sibling_task`
```
参数:
- siblingId (number) - 兄弟任务ID参考任务
- title (string) - 新任务标题
- description (string) - 任务描述
- priority (string) - 优先级: low/medium/high
- status (string) - 状态
```
**获取子任务**: `mcp__ai-proj__get_task_children`
```
参数: parentId (number) - 父任务ID
```
### 1.8 移动任务
**MCP 函数**: `mcp__ai-proj__move_task`
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | number | ✅ | 任务ID |
| targetProjectId | number | ✅ | 目标项目ID |
---
## 二、需求管理
### 2.1 创建需求
**MCP 函数**: `mcp__ai-proj__create_requirement`
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| title | string | ✅ | 需求标题 |
| projectId | number | ✅ | 项目ID |
| description | string | ❌ | 需求描述 |
| priority | string | ❌ | 优先级: low/medium/high/urgent |
| category | string | ❌ | 类别: feature/bug/improvement/documentation/other |
| allowSelfApprove | boolean | ❌ | 允许自审批(自动审批时需设为 true |
**创建需求必填清单**
- [ ] `title` - 需求标题
- [ ] `projectId` - 所属项目(不要遗漏!)
- [ ] `priority` - 优先级
- [ ] `description` - 需求描述
> **注意**: 后端已实现默认截止日期:未填 `due_date` 时按优先级自动设置urgent +1天、high +3天、medium +7天、low +14天。MCP `create_requirement` 不支持 `due_date` 参数,如需自定义截止日期,创建后通过 REST API 更新。
**自然语言示例**:
- "创建需求: 用户权限管理功能"
- "新建一个高优先级需求: 性能优化"
### 2.2 查看需求列表
**MCP 函数**: `mcp__ai-proj__list_requirements`
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| project_id | number | ❌ | 项目ID筛选 |
| status | array | ❌ | 状态筛选: draft/pending/reviewing/approved/rejected/archived |
| priority | array | ❌ | 优先级筛选 |
| category | array | ❌ | 类别筛选 |
| search | string | ❌ | 搜索关键词 |
| page | number | ❌ | 页码 |
| page_size | number | ❌ | 每页数量 |
| response_mode | string | ❌ | 响应模式: minimal/compact/full |
### 2.3 获取需求详情
**MCP 函数**: `mcp__ai-proj__get_requirement`
**参数**: `id` (number) - 需求ID
### 2.4 更新需求
**MCP 函数**: `mcp__ai-proj__update_requirement`
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | number | ✅ | 需求ID |
| updates | object | ✅ | 更新字段 |
**updates 支持的字段**: title, description, priority, category, allow_self_approve
> **已知限制**: MCP `update_requirement` 工具**不支持**更新 `project_id` 和 `due_date` 字段。
> 如需更新这两个字段,必须直接调用后端 REST API
> ```bash
> # Dev 环境
> curl -s -X PUT "http://localhost:8080/api/v1/requirements/{id}" \
> -H "Content-Type: application/json" \
> -H "X-API-Key: {TASK_API_TOKEN}" \
> -d '{"project_id": 1, "due_date": "2026-02-27T00:00:00Z"}'
>
> # 生产环境
> curl -s -X PUT "https://ai.pipexerp.com/api/v1/requirements/{id}" \
> -H "Content-Type: application/json" \
> -H "X-API-Key: {SYNC_REMOTE_API_KEY}" \
> -d '{"project_id": 1, "due_date": "2026-02-27T00:00:00Z"}'
> ```
> 注意:`due_date` 必须使用 RFC3339 格式(如 `2026-02-27T00:00:00Z``YYYY-MM-DD` 格式会返回 BAD_REQUEST。
### 2.5 需求工作流
**MCP 函数**: `mcp__ai-proj__requirement_action`
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | number | ✅ | 需求ID |
| action | string | ✅ | 操作类型: submit/approve/reject/withdraw/archive |
| reason | string | ❌ | 拒绝原因reject时必填 |
| comment | string | ❌ | 批准意见 |
**工作流状态图**:
```
draft → [submit] → pending → [approve] → approved
→ [reject] → rejected
pending → [withdraw] → draft
approved → [archive] → archived
```
**自然语言示例**:
- "提交需求 123 进行评审"
- "批准需求 123"
- "拒绝需求 123原因需求不完整"
- "撤回需求 123"
- "归档需求 123"
### 2.6 需求-任务关联
**关联任务到需求**: `mcp__ai-proj__link_tasks_to_requirement`
```
参数:
- requirementId (number) - 需求ID
- taskIds (array) - 任务ID列表
- linkComment (string) - 关联备注
```
**取消关联**: `mcp__ai-proj__unlink_task_from_requirement`
```
参数:
- requirementId (number) - 需求ID
- taskId (number) - 任务ID
```
**获取需求关联的任务**: `mcp__ai-proj__get_requirement_tasks`
```
参数:
- requirementId (number) - 需求ID
- page, page_size - 分页参数
```
### 2.7 需求统计与历史
**获取统计**: `mcp__ai-proj__get_requirement_statistics`
```
参数: id (number) - 需求ID
返回: 关联任务数、完成率等统计信息
```
**获取历史**: `mcp__ai-proj__get_requirement_history`
```
参数: id (number), page, page_size
返回: 需求操作历史记录
```
---
## 三、文档管理
### 3.1 创建任务文档
**MCP 函数**: `mcp__ai-proj__create-and-attach`
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| taskId | number | ✅ | 任务ID |
| content | string | ✅ | 文档内容Markdown格式 |
| title | string | ❌ | 文档标题 |
| projectId | number | ❌ | 项目ID |
**自然语言示例**:
- "为任务 5069 创建PRD文档"
- "给任务 5069 添加开发计划文档"
### 3.2 追加文档内容
**MCP 函数**: `mcp__ai-proj__append-document-content`
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| taskId | number | ✅ | 任务ID |
| documentId | number | ✅ | 文档ID |
| content | string | ✅ | 追加内容Markdown |
| projectId | number | ❌ | 项目ID |
### 3.3 获取文档
**获取元数据**: `mcp__ai-proj__get_task_document_meta`
```
参数: taskId (number)
返回: 文档元数据不含完整内容节省token
```
**获取内容**: `mcp__ai-proj__get_task_document`
```
参数:
- taskId (number) - 任务ID
- projectId (number) - 项目ID
- maxLength (number) - 最大返回字符数
- offset (number) - 起始位置
```
**检查是否有文档**: `mcp__ai-proj__has_task_document`
```
参数: taskId (number), projectId (number)
返回: boolean
```
### 3.4 更新/删除文档
**更新文档**: `mcp__ai-proj__update_task_document`
```
参数:
- taskId (number) - 任务ID
- content (string) - 新内容
- title (string) - 新标题
- projectId (number)
```
**删除文档**: `mcp__ai-proj__delete_task_document`
```
参数: taskId (number), projectId (number)
```
### 3.5 文档同步
**导出到文件**: `mcp__ai-proj__export_task_document_to_file`
```
参数:
- taskId (number)
- projectId (number)
- overwrite (boolean) - 是否覆盖默认true
导出位置: dev-plans 目录
```
**从文件导入**: `mcp__ai-proj__import_task_document_from_file`
```
参数:
- taskId (number)
- projectId (number)
- fileName (string) - 文件名
- updateIfNewer (boolean) - 仅当文件更新时导入
- forceOverwrite (boolean) - 强制覆盖
```
**批量同步**: `mcp__ai-proj__sync_task_documents`
```
参数:
- taskIds (array) - 任务ID列表
- direction (string) - 同步方向: export/import/both
- forceOverwrite (boolean)
- projectId (number)
```
---
## 四、工作笔记
### 4.1 创建工作笔记
**MCP 函数**: `mcp__ai-proj__create_work_note`
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| title | string | ✅ | 笔记标题 |
| content | string | ✅ | 笔记内容Markdown |
| type | string | ❌ | 类型: markdown/text/html |
| tags | array | ❌ | 标签列表 |
| status | string | ❌ | 状态: draft/published/archived |
| visibility | string | ❌ | 可见性: private/team/public |
**创建并关联到任务**: `mcp__ai-proj__create-and-attach-work-note`
```
参数:
- taskId (number) - 任务ID
- content (string) - 笔记内容
- title (string) - 标题
```
### 4.2 查看/搜索笔记
**列出笔记**: `mcp__ai-proj__list_work_notes`
```
参数: page, limit, status, type
```
**搜索笔记**: `mcp__ai-proj__search_work_notes`
```
参数:
- query (string) - 搜索关键词
- tags (array) - 标签筛选
- limit (number)
```
**获取详情**: `mcp__ai-proj__get_work_note`
```
参数: id (number)
```
### 4.3 更新笔记
**MCP 函数**: `mcp__ai-proj__update_work_note`
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | number | ✅ | 笔记ID |
| updates | object | ✅ | 更新字段 |
---
## 五、计时器
### 5.1 基本计时
**开始计时**: `mcp__ai-proj__start_timer`
```
参数:
- taskId (number) - 任务ID
- description (string) - 计时描述
```
**停止计时**: `mcp__ai-proj__stop_timer`
```
参数: taskId (number) - 可选,不指定则停止所有计时
```
**获取当前计时**: `mcp__ai-proj__get_current_timer`
```
无参数
返回: 当前正在进行的计时器信息
```
**获取活跃计时器**: `mcp__ai-proj__get_active_timers`
```
无参数
返回: 所有 running/paused 状态的计时器
```
### 5.2 智能计时
**启动任务并计时**: `mcp__ai-proj__start_task_with_timer`
```
参数:
- taskIdOrTitle (number|string) - 任务ID或标题支持模糊匹配
- timerDescription (string) - 计时描述
- projectId (number)
功能: 自动开始任务并启动计时器
```
**切换任务**: `mcp__ai-proj__switch_to_task`
```
参数:
- newTaskTitle (string) - 任务标题(支持模糊匹配)
- projectId (number)
功能: 停止当前计时,切换到新任务并开始计时
```
**自然语言示例**:
- "开始任务 登录功能开发 并计时"
- "切换到 API开发 任务"
- "停止计时"
---
## 六、每日聚焦
### 6.1 查看今日任务
**MCP 函数**: `mcp__ai-proj__get_daily_focus_tasks`
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| date | string | ❌ | 日期 (YYYY-MM-DD) |
| status | string | ❌ | 状态筛选: active/completed/removed |
| priority | string | ❌ | 优先级筛选 |
| include_suggestions | boolean | ❌ | 是否包含智能推荐 |
### 6.2 添加任务到今日聚焦
**单个添加**: `mcp__ai-proj__add_daily_focus_task`
```
参数:
- task_id (number) - 任务ID
- priority (string) - 优先级: critical/high/medium/low
- estimated_duration_minutes (number) - 预估时长
- notes (string) - 备注
- focus_date (string) - 聚焦日期
```
**批量添加**: `mcp__ai-proj__batch_add_daily_focus_tasks`
```
参数:
- task_ids (array) - 任务ID列表
- priority (string) - 统一优先级
- notes (string) - 统一备注
- focus_date (string)
```
**快速添加当前任务**: `mcp__ai-proj__quick_add_current_task`
```
参数:
- priority (string) - 优先级默认high
- notes (string)
功能: 将当前正在进行的任务添加到今日聚焦
```
### 6.3 管理今日任务
**更新**: `mcp__ai-proj__update_daily_focus_task`
```
参数:
- id (number) - Daily Focus任务ID
- priority, estimated_duration_minutes, notes
```
**移除**: `mcp__ai-proj__remove_daily_focus_task`
```
参数: id (number)
```
**完成**: `mcp__ai-proj__complete_daily_focus_task`
```
参数: id (number)
```
**聚焦并计时**: `mcp__ai-proj__focus_task_with_timer`
```
参数:
- daily_focus_task_id (number)
- timer_description (string)
```
**清理已完成**: `mcp__ai-proj__clear_completed_tasks`
```
参数:
- date (string) - 日期
- confirm (boolean) - 必须设为true
```
### 6.4 统计与推荐
**获取统计**: `mcp__ai-proj__get_daily_focus_stats`
```
参数:
- date (string)
- period (string) - 统计周期: daily/weekly/monthly
```
**获取任务推荐**: `mcp__ai-proj__get_task_recommendations`
```
参数:
- date (string)
- limit (number) - 推荐数量
- exclude_existing (boolean) - 排除已存在任务
返回: 基于优先级、截止日期等的智能推荐
```
---
## 七、项目管理
### 7.1 查看项目列表
**MCP 函数**: `mcp__ai-proj__list_projects`
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| status | string | ❌ | 状态筛选: active/inactive/planning/on_hold/completed/cancelled/archived |
| search | string | ❌ | 搜索关键词 |
| page | number | ❌ | 页码 |
| pageSize | number | ❌ | 每页数量 |
| sortBy | string | ❌ | 排序字段: created_at/updated_at/name/priority |
| sortOrder | string | ❌ | 排序方向: asc/desc |
### 7.2 创建项目
**MCP 函数**: `mcp__ai-proj__create_project`
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| name | string | ✅ | 项目名称 |
| description | string | ❌ | 项目描述 |
---
## 八、项目手册
### 8.1 查看手册列表
**MCP 函数**: `mcp__ai-proj__list_manuals`
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| projectId | number | ✅ | 项目ID |
| status | string | ❌ | 状态筛选: draft/published/archived |
| parentId | number | ❌ | 父级手册ID获取子级列表 |
| search | string | ❌ | 搜索关键词(标题或描述) |
**自然语言示例**:
- "查看项目手册列表"
- "列出已发布的手册"
- "查看手册 5 的子章节"
### 8.2 创建手册
**MCP 函数**: `mcp__ai-proj__create_manual`
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| projectId | number | ✅ | 项目ID |
| title | string | ✅ | 手册标题 |
| content | string | ❌ | 手册内容Markdown格式 |
| description | string | ❌ | 手册简介 |
| parentId | number | ❌ | 父级手册ID用于创建子章节 |
| status | string | ❌ | 状态: draft/published默认draft |
**自然语言示例**:
- "创建项目手册: API 开发规范"
- "在手册 5 下创建子章节: 接口设计规范"
- "创建并发布手册: 前端开发规范"
### 8.3 获取手册详情
**MCP 函数**: `mcp__ai-proj__get_manual`
**参数**: `id` (number) - 手册ID
**返回**: 完整的手册内容Markdown格式
**自然语言示例**:
- "查看手册 5 的内容"
- "显示 API 开发规范手册"
### 8.4 更新手册
**MCP 函数**: `mcp__ai-proj__update_manual`
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | number | ✅ | 手册ID |
| title | string | ❌ | 新标题 |
| content | string | ❌ | 新内容Markdown格式 |
| description | string | ❌ | 新简介 |
| status | string | ❌ | 新状态: draft/published/archived |
**自然语言示例**:
- "更新手册 5 的内容"
- "发布手册 5"
- "归档手册 5"
### 8.5 搜索手册
**MCP 函数**: `mcp__ai-proj__search_manuals`
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| projectId | number | ✅ | 项目ID |
| query | string | ✅ | 搜索关键词 |
**自然语言示例**:
- "搜索项目手册中包含 API 的文档"
- "查找数据库相关的手册"
---
## 九、报告与时间线
### 9.1 获取日报
**MCP 函数**: `mcp__ai-proj__get_daily_work_report`
**参数**: `projectId` (number) - 项目ID默认为1
**返回**: 今日工作报告,包含完成任务、进行中任务、时间统计等
### 9.2 获取任务时间线
**MCP 函数**: `mcp__ai-proj__get_task_timeline`
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| taskId | number | ✅ | 任务ID |
| projectId | number | ❌ | 项目ID |
| limit | number | ❌ | 记录数限制默认20 |
| offset | number | ❌ | 偏移量 |
---
## 十、批量文档操作
### 10.1 批量创建文档
**MCP 函数**: `mcp__ai-proj__create_batch_documents`
**参数**:
```json
{
"documents": [
{
"title": "文档标题",
"content": "Markdown内容",
"taskId": 5069,
"attachToTask": true,
"type": "markdown",
"status": "draft",
"tags": ["tag1", "tag2"],
"relationType": "attachment"
}
]
}
```
---
## 十一、远程同步
### 11.1 任务同步
**同步任务**: `mcp__ai-proj__sync_task`
```
参数:
- taskId (number)
- direction (string) - to_remote/from_remote
- includeDocument (boolean) - 是否同步文档
- includeChildren (boolean) - 是否同步子任务
```
**批量同步到远程**: `mcp__ai-proj__batch_sync_tasks_to_remote`
```
参数:
- taskIds (array)
- includeDocuments (boolean)
- includeChildren (boolean)
```
**获取同步状态**: `mcp__ai-proj__get_task_sync_status`
```
参数: taskId (number)
```
**获取远程同步状态**: `mcp__ai-proj__get_remote_sync_status`
```
参数: taskId (number)
返回: 比较本地和远程版本差异
```
**通过UUID获取任务**: `mcp__ai-proj__get_task_by_uuid`
```
参数: uuid (string)
用途: 跨库同步场景
```
### 11.2 需求同步
**同步需求到远程**: `mcp__ai-proj__sync_requirement_to_remote`
```
参数:
- requirementId (number)
- includeHistory (boolean)
- includeComments (boolean)
```
**从远程同步需求**: `mcp__ai-proj__sync_requirement_from_remote`
```
参数:
- remoteRequirementId (number)
- includeHistory (boolean)
- includeComments (boolean)
```
**批量同步需求**: `mcp__ai-proj__batch_sync_requirements_to_remote`
```
参数:
- requirementIds (array)
- includeComments (boolean)
```
**同步需求-任务关联**: `mcp__ai-proj__sync_requirement_task_links`
```
参数:
- linkUUIDs (array) - 关联关系的UUID列表
- forceUpdate (boolean)
```
**同步任务的需求关联**: `mcp__ai-proj__sync_task_links_to_remote`
```
参数: taskId (number)
```
---
## 十二、开发工具
### 12.1 快速登录
**MCP 函数**: `mcp__ai-proj__dev_quick_login`
**参数**: `username` (string) - 用户名默认qiudl
**说明**: 仅在开发环境(APP_ENV=development/dev)有效自动获取JWT
---
## 自然语言操作示例
### 任务管理
| 用户说 | 调用函数 |
|--------|----------|
| "创建一个任务叫做登录功能开发" | `create_task` |
| "查看所有进行中的任务" | `list_tasks` |
| "开始任务 5069" | `start_task` |
| "完成任务 5069" | `complete_task` |
| "暂停任务 5069" | `pause_task` |
| "把任务 5069 移到项目2" | `move_task` |
| "给任务 5069 创建子任务: 数据库设计" | `create_subtask` |
### 需求管理
| 用户说 | 调用函数 |
|--------|----------|
| "创建需求: 用户权限管理" | `create_requirement` |
| "查看待审核的需求" | `list_requirements` |
| "提交需求 123 评审" | `requirement_action (submit)` |
| "批准需求 123" | `requirement_action (approve)` |
| "拒绝需求 123原因是需求不完整" | `requirement_action (reject)` |
| "将任务 5069 关联到需求 123" | `link_tasks_to_requirement` |
### 文档操作
| 用户说 | 调用函数 |
|--------|----------|
| "为任务 5069 创建PRD文档" | `create-and-attach` |
| "查看任务 5069 的文档" | `get_task_document` |
| "更新任务 5069 的文档" | `update_task_document` |
| "导出任务 5069 的文档到文件" | `export_task_document_to_file` |
### 计时与聚焦
| 用户说 | 调用函数 |
|--------|----------|
| "开始计时任务 5069" | `start_task_with_timer` |
| "停止计时" | `stop_timer` |
| "查看今日任务" | `get_daily_focus_tasks` |
| "把任务 5069 添加到今日聚焦" | `add_daily_focus_task` |
| "生成今日工作报告" | `get_daily_work_report` |
---
## 注意事项
1. **项目ID默认值**: 大多数函数的 `projectId` 默认为 1
2. **响应模式**: 使用 `response_mode: minimal` 可减少返回数据量
3. **分页**: 大量数据请使用分页参数 `page``limit`
4. **状态流转**: 任务和需求都有状态机,注意状态转换规则
5. **同步方向**: 远程同步时注意 `to_remote``from_remote` 方向
6. **计时器**: 同一时间只能有一个活跃计时器
---
## 用户管理
> **重要**: 创建数据库用户时必须使用 bcrypt **cost 12** 进行密码哈希。
详细的用户管理流程请参考:
- **ops-tools/SKILL.md** - "AI-Proj 用户管理" 章节
- **ops-tools/ai-proj-deploy.md** - "用户管理" 章节
**快速参考**
```bash
# 生成密码哈希cost 12
cd /path/to/new-ai-proj/backend
cat > /tmp/genhash.go << 'EOF'
package main
import ("fmt"; "golang.org/x/crypto/bcrypt")
func main() {
hash, _ := bcrypt.GenerateFromPassword([]byte("密码"), 12)
fmt.Println(string(hash))
}
EOF
go run /tmp/genhash.go
```
**常见错误**:使用 cost 10 生成的哈希无法登录(后端 DefaultCost=12
**已创建的系统用户**
| 用户名 | 邮箱 | user_type | role | 创建时间 |
|--------|------|-----------|------|----------|
| qiudl | qiudl@zhiyuncai.com | system | admin | - |
| jiaxiang | jiaxiang@joylodging.com | system | admin | 2026-01 |
| haiqing | haiqing@joylodging.com | system | admin | 2026-02 |
> 注意:密码信息不在文档中记录,如需重置请参考 ops-tools 技能文档
---
## Google 日历集成配置
### 环境变量
生产环境需要配置以下环境变量(`.env` 文件):
```bash
GOOGLE_CLIENT_ID=<你的Client ID>.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=GOCSPX-<你的Client Secret>
GOOGLE_PROJECT_ID=<你的项目ID>
GOOGLE_REDIRECT_URL=https://ai.pipexerp.com/api/v1/auth/google/callback
GOOGLE_CALENDAR_SCOPES=https://www.googleapis.com/auth/calendar
```
### 获取 Google OAuth 凭据
#### 1. 创建 Google Cloud 项目
1. 访问 [Google Cloud Console](https://console.cloud.google.com/)
2. 创建新项目或选择现有项目
3. 记录项目 ID
#### 2. 启用 API
1. 进入 **APIs & Services****Library**
2. 搜索并启用 **Google Calendar API**
#### 3. 配置 OAuth 同意屏幕
1. 进入 **APIs & Services****OAuth consent screen**
2. 选择 **External** → 创建
3. 填写应用名称、支持邮箱
4. 添加 Scopes:
- `https://www.googleapis.com/auth/calendar`
- `https://www.googleapis.com/auth/calendar.events`
5. 添加测试用户(开发阶段)
#### 4. 创建 OAuth 凭据
1. 进入 **APIs & Services****Credentials**
2. 点击 **+ CREATE CREDENTIALS** → **OAuth client ID**
3. 选择 **Web application**
4. 配置:
- **Name**: `AI-Proj Web Client`
- **Authorized JavaScript origins**: `https://ai.pipexerp.com`
- **Authorized redirect URIs**: `https://ai.pipexerp.com/api/v1/auth/google/callback`
5. 复制 Client ID 和 Client Secret
### 部署配置
```bash
# 更新生产环境配置
ssh tools_ai_proj "cd /home/ubuntu/apps/new-ai-proj && \
sed -i 's|GOOGLE_CLIENT_ID=.*|GOOGLE_CLIENT_ID=<CLIENT_ID>|' .env && \
sed -i 's|GOOGLE_CLIENT_SECRET=.*|GOOGLE_CLIENT_SECRET=<CLIENT_SECRET>|' .env && \
sed -i 's|GOOGLE_PROJECT_ID=.*|GOOGLE_PROJECT_ID=<PROJECT_ID>|' .env && \
docker restart ai_backend_prod"
```
### 数据库迁移
Google 日历集成需要以下表:
```sql
-- OAuth 状态表CSRF 保护)
CREATE TABLE oauth_states (
id SERIAL PRIMARY KEY,
state VARCHAR(255) NOT NULL UNIQUE,
user_id INTEGER NOT NULL,
expires_at TIMESTAMP NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 项目日历配置表
-- 见 migrations/20260210_01_project_calendar.sql
-- 日历 Webhook 表
-- 见 migrations/20260211_01_calendar_webhooks.sql
```
### 当前配置2026-02
| 配置项 | 值 |
|--------|-----|
| Project ID | `project-bfa64769-1595-4c41-964` |
| Client ID | `78721641513-...apps.googleusercontent.com` |
| Redirect URL | `https://ai.pipexerp.com/api/v1/auth/google/callback` |
> **注意**: Client Secret 不在文档中记录,存储在生产环境 `.env` 文件中
---
## 十三、最佳实践与故障排查
### 13.1 创建需求的最佳实践
#### 问题description 字段"请求数据格式错误"
**症状**
```json
{
"code": "BAD_REQUEST",
"message": "请求数据格式错误"
}
```
**常见原因**
| 原因 | 解决方案 |
|------|----------|
| **description 内容过长** | API 可能有字段长度限制,逐步测试找到上限 |
| **Markdown 特殊字符** | 检查是否有未转义的特殊字符(如反引号、引号) |
| **JSON 转义问题** | 确保 JSON 字符串正确转义(尤其是换行符、引号) |
| **多层嵌套的代码块** | Markdown 代码块中的反引号可能导致解析失败 |
**正确的调试流程**
```python
# ❌ 错误做法:直接简化内容
"创建失败 → 简化 description → 成功"
问题丢失了重要的需求细节
# ✅ 正确做法:找到根本原因
步骤 1: 测试空描述
create_requirement(description="")
是否成功
步骤 2: 测试纯文本
create_requirement(description="简单文本")
是否成功
步骤 3: 测试简单 Markdown
create_requirement(description="# 标题\n\n内容")
是否成功
步骤 4: 逐步增加复杂度
create_requirement(description="包含代码块的Markdown")
create_requirement(description="包含表格的Markdown")
create_requirement(description="完整的技术方案")
找到临界点
步骤 5: 根据根因选择方案
- 如果是长度限制 分段或使用附件
- 如果是特殊字符 转义或替换
- 如果是 Markdown 简化格式或转纯文本
```
**推荐方案**
**方案 A完整的需求 + 关联文档**
```typescript
// 1. 创建需求(简洁描述)
const req = await create_requirement({
title: "思源笔记增加 MCP 协议层支持",
description: "核心方案:创建独立的 siyuan-mcp-bridge 服务...",
projectId: 162
});
// 2. 创建详细的技术方案文档
const doc = await create_requirement_document({
requirementId: req.id,
title: "技术方案详细设计",
content: `
# 需求背景
...完整的技术方案3000+ 字)
# 架构设计
...
# 实施路线图
...
`
});
```
**方案 B分段创建需求描述**
```typescript
// 1. 创建需求(基本信息)
const req = await create_requirement({
title: "思源笔记增加 MCP 协议层支持",
description: "简短描述",
projectId: 162
});
// 2. 更新需求(逐步添加内容)
await update_requirement({
id: req.id,
updates: {
description: description_part1 // 添加背景
}
});
await update_requirement({
id: req.id,
updates: {
description: description_part1 + description_part2 // 添加架构
}
});
```
#### 经验总结
**原则 1业务优先于技术**
- ❌ 为了创建成功而牺牲需求完整性
- ✅ 找到技术方案来满足业务需求
**原则 2追根溯源**
- ❌ 基于假设快速妥协("可能是太长了"
- ✅ 通过调试找到真正的错误原因
**原则 3给用户选择权**
- ❌ 自作主张简化内容
- ✅ 询问用户的偏好和优先级
**原则 4保留完整信息**
- ❌ 简化后的需求缺少关键信息
- ✅ 通过关联文档保留详细内容
### 13.2 需求描述的格式建议
**推荐的需求描述结构**(简洁版):
```markdown
## 核心方案
1. 关键点 1一句话
2. 关键点 2一句话
3. 关键点 3一句话
## 技术架构
- 第1层组件名职责
- 第2层组件名职责
- 第3层组件名职责
## 实施周期
X周阶段1 + 阶段2 + 阶段3
```
**详细内容放在关联文档**
- 需求背景与业务价值
- 详细的技术方案
- 实施路线图与时间规划
- 风险评估与应对措施
- 验收标准
**Markdown 格式注意事项**
```markdown
✅ 安全的格式:
- 简单的标题(# ## ###
- 无序列表(-
- 有序列表1. 2. 3.
- 简单的表格
- 加粗(**text**
⚠️ 可能有问题的格式:
- 三重反引号代码块(```
- HTML 标签
- 复杂的嵌套列表
- 大量的特殊字符
- 超长的单行文本
```
### 13.3 更新需求的最佳实践
**使用 update_requirement 补充详细内容**
```typescript
// 创建需求后,逐步更新描述
await update_requirement({
id: 857, // REQ-20260217-0001
updates: {
description: `
## 需求背景
### 当前问题
思源笔记仅提供 REST API 接口AI 操作复杂...
### 业务价值
为思源笔记添加 MCP 协议层支持,使其能够...
## 技术方案
### 架构设计
...(详细内容)
`
}
});
```
**测试长度限制**
```bash
# 逐步增加内容,找到上限
第1次: 200字 → 成功
第2次: 500字 → 成功
第3次: 1000字 → 成功
第4次: 2000字 → 成功
第5次: 5000字 → 失败 ← 找到上限
结论: description 字段最大约 3000-4000 字
```
### 13.4 故障排查清单
遇到 API 错误时,按以下步骤排查:
**步骤 1分析错误信息**
```json
{
"code": "BAD_REQUEST",
"message": "请求数据格式错误"
}
```
- [ ] 错误码是什么BAD_REQUEST / VALIDATION_ERROR / AUTH_FAILED
- [ ] 错误信息是否有具体提示?
- [ ] 是哪个字段导致的错误?
**步骤 2检查参数格式**
- [ ] 必填参数是否都提供了?
- [ ] 参数类型是否正确number vs string
- [ ] 枚举值是否在允许范围内?
- [ ] JSON 格式是否正确?
**步骤 3简化测试**
- [ ] 尝试最小化的参数集
- [ ] 逐个添加可选参数
- [ ] 找到导致错误的具体参数
**步骤 4查看后端日志**(如有权限)
```bash
# 生产环境日志
ssh tools_ai_proj "docker logs ai_backend_prod --tail 100"
# 开发环境日志
cd ~/coding/new-ai-proj/backend
tail -f logs/app.log
```
**步骤 5参考类似的成功案例**
- [ ] 查看 SKILL.md 中的示例
- [ ] 查看之前成功的调用记录
- [ ] 对比参数差异
### 13.5 常见错误与解决方案
| 错误 | 可能原因 | 解决方案 |
|------|----------|----------|
| `BAD_REQUEST` | 参数格式错误 | 检查参数类型和 JSON 格式 |
| `VALIDATION_ERROR` | 参数验证失败 | 检查必填字段和枚举值 |
| `AUTH_FAILED` | 认证失败 | 检查 Token 是否过期 |
| `PERMISSION_DENIED` | 权限不足 | 检查用户角色和权限 |
| `NOT_FOUND` | 资源不存在 | 检查 ID 是否正确 |
| `INTERNAL_ERROR` | 服务器错误 | 查看后端日志排查 |
### 13.6 需求 description 长度测试记录
**测试日期**: 2026-02-17
| 长度 | 格式 | 结果 | 备注 |
|------|------|------|------|
| ~200字 | 简单文本 | ✅ 成功 | 核心方案3点 |
| ~3000字 | 完整 Markdown | ❌ 失败 | "请求数据格式错误" |
| 待测试 | 1000字 Markdown | ? | 需要进一步测试 |
| 待测试 | 2000字 Markdown | ? | 需要进一步测试 |
**建议**
- 需求描述控制在 1000 字以内
- 详细内容使用关联文档
- 复杂格式改为纯文本