Files
John Qiu 99a701d34d refactor: ai-proj-plugin 移至 skills-core,合并冗余 session 插件
- ai-proj-plugin 作为 MCP 基础设施移入 skills-core/
- 删除 4 个冗余 session 子插件(save/reload/read/search),
  session-plugin 已包含全部功能
- 48 → 44 插件

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 11:50:11 +10:30

35 KiB
Raw Permalink Blame History

name, description
name description
ai-proj 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接口开发"

返回示例:

{
  "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_iddue_date 字段。 如需更新这两个字段,必须直接调用后端 REST API

# 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:00ZYYYY-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

参数:

{
  "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. 分页: 大量数据请使用分页参数 pagelimit
  4. 状态流转: 任务和需求都有状态机,注意状态转换规则
  5. 同步方向: 远程同步时注意 to_remotefrom_remote 方向
  6. 计时器: 同一时间只能有一个活跃计时器

用户管理

重要: 创建数据库用户时必须使用 bcrypt cost 12 进行密码哈希。

详细的用户管理流程请参考:

  • ops-tools/SKILL.md - "AI-Proj 用户管理" 章节
  • ops-tools/ai-proj-deploy.md - "用户管理" 章节

快速参考

# 生成密码哈希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 文件):

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
  2. 创建新项目或选择现有项目
  3. 记录项目 ID

2. 启用 API

  1. 进入 APIs & ServicesLibrary
  2. 搜索并启用 Google Calendar API

3. 配置 OAuth 同意屏幕

  1. 进入 APIs & ServicesOAuth 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 & ServicesCredentials
  2. 点击 + CREATE CREDENTIALSOAuth 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

部署配置

# 更新生产环境配置
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 日历集成需要以下表:

-- 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 字段"请求数据格式错误"

症状

{
  "code": "BAD_REQUEST",
  "message": "请求数据格式错误"
}

常见原因

原因 解决方案
description 内容过长 API 可能有字段长度限制,逐步测试找到上限
Markdown 特殊字符 检查是否有未转义的特殊字符(如反引号、引号)
JSON 转义问题 确保 JSON 字符串正确转义(尤其是换行符、引号)
多层嵌套的代码块 Markdown 代码块中的反引号可能导致解析失败

正确的调试流程

# ❌ 错误做法:直接简化内容
"创建失败 → 简化 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完整的需求 + 关联文档

// 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分段创建需求描述

// 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 需求描述的格式建议

推荐的需求描述结构(简洁版):

## 核心方案
1. 关键点 1一句话
2. 关键点 2一句话
3. 关键点 3一句话

## 技术架构
- 第1层组件名职责
- 第2层组件名职责
- 第3层组件名职责

## 实施周期
X周阶段1 + 阶段2 + 阶段3

详细内容放在关联文档

  • 需求背景与业务价值
  • 详细的技术方案
  • 实施路线图与时间规划
  • 风险评估与应对措施
  • 验收标准

Markdown 格式注意事项

✅ 安全的格式:
- 简单的标题(# ## ###
- 无序列表(-
- 有序列表1. 2. 3.
- 简单的表格
- 加粗(**text**

⚠️ 可能有问题的格式:
- 三重反引号代码块(```
- HTML 标签
- 复杂的嵌套列表
- 大量的特殊字符
- 超长的单行文本

13.3 更新需求的最佳实践

使用 update_requirement 补充详细内容

// 创建需求后,逐步更新描述
await update_requirement({
  id: 857,  // REQ-20260217-0001
  updates: {
    description: `
      ## 需求背景

      ### 当前问题
      思源笔记仅提供 REST API 接口AI 操作复杂...

      ### 业务价值
      为思源笔记添加 MCP 协议层支持,使其能够...

      ## 技术方案

      ### 架构设计
      ...(详细内容)
    `
  }
});

测试长度限制

# 逐步增加内容,找到上限
第1次: 200字  → 成功
第2次: 500字  → 成功
第3次: 1000字 → 成功
第4次: 2000字 → 成功
第5次: 5000字 → 失败 ← 找到上限

结论: description 字段最大约 3000-4000 字

13.4 故障排查清单

遇到 API 错误时,按以下步骤排查:

步骤 1分析错误信息

{
  "code": "BAD_REQUEST",
  "message": "请求数据格式错误"
}
  • 错误码是什么BAD_REQUEST / VALIDATION_ERROR / AUTH_FAILED
  • 错误信息是否有具体提示?
  • 是哪个字段导致的错误?

步骤 2检查参数格式

  • 必填参数是否都提供了?
  • 参数类型是否正确number vs string
  • 枚举值是否在允许范围内?
  • JSON 格式是否正确?

步骤 3简化测试

  • 尝试最小化的参数集
  • 逐个添加可选参数
  • 找到导致错误的具体参数

步骤 4查看后端日志(如有权限)

# 生产环境日志
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 字以内
  • 详细内容使用关联文档
  • 复杂格式改为纯文本