feat: 寰汐插件随 v1.0.0 生产切换升级到 v2 技能组,新增独立管理端插件

huanxi 插件的技能内容从 v1 全面替换为 v2(huanxi-org/huanxi-weekly 等
v1 专属技能下线,新增 huanxi-issue/huanxi-lookup/huanxi-meeting),MCP
连接与 Token 获取方式同步更新为个人中心自助生成。

新增独立的 huanxi-admin 插件(管理端 4 个技能,hxa_ Token,普通员工无需
安装),此前一直卡在"v2 未部署到生产域名前不推送"这条约束,今晚寰汐
v1.0.0 生产切换完成后条件满足。

产物由 huanxi-menagement 仓库 skills/sync_marketplace.py 生成,技能源码
单一真相在该仓库的 skills/,本仓库只接收产物、不手工编辑。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018xxRKMuiGR4wYT3QbwCpDc
This commit is contained in:
SkyJourney
2026-08-22 02:14:34 +08:00
co-authored by Claude Sonnet 5
parent d7aaaf8224
commit 600c0dd323
23 changed files with 786 additions and 1126 deletions
+54 -66
View File
@@ -1,102 +1,90 @@
---
name: huanxi-task
description: "寰汐任务管理:创建任务(+create)、更新任务状态/进度(+update)、查看任务看板(+board)、设置执行人(+assign)。当用户说"创建任务"、"新建任务"、"更新任务"、"看任务板"、"任务分配"时触发。"
description: "寰汐任务管理:查任务、建任务、改状态进度、分配执行人、认领。当用户说「我有什么任务」「建个任务」「把这个标成完成」「派给谁」时使用。"
---
# 寰汐任务管理
**前置条件:先 Read `../huanxi-shared/SKILL.md`(缓存规则 + TTL 策略)**
> ⚠️ **工具调用规范**:执行任何 `mcp__huanxi__*` 调用前,以工具实际注册的参数名和类型为准,本文档示例仅供工作流引导(见 shared 全局约定第 6 条)。
**前置:先读 `huanxi-shared`(尤其「状态是可配置的两层模型」一节)。**
---
## Shortcuts
## ID 传递链
| 指令 | 说明 |
|------|------|
| [`+create`](references/task-create.md) | 创建新任务(引导式填写) |
| `+update` | 更新任务状态/进度/截止日 |
| [`+board`](references/task-kanban.md) | 查看我的任务看板 |
| `+assign` | 设置/变更任务执行人 |
| `+get` | 查看单个任务详情 |
任务操作几乎都是这条链,**中间结果要展示给用户**,不要一路闷头做到底:
---
## +create:创建任务
详见 [references/task-create.md](references/task-create.md)
**快速概览:**
```
1. 确定所属模块(从 modules.json 缓存解析名字 → ID
2. 收集任务信息(标题、描述、截止日、优先级)
3. mcp__huanxi__task_create(module_id, title, ...)
4. [可选] 设置执行人 → mcp__huanxi__task_set_assignees(task_id, [user_id])
module_query() → module_id
task_query(module_ids=[...]) → task_id[] ← 展示给用户看
↓ ⏸ 用户指明改哪些
task_update(updates=[{id, ...}])
```
---
## +update:更新任务
> ⚠️ 参数细节以 MCP `task_update` 的 docstring 为准,本节仅做工作流引导。
##
```
Step 1: 确认任务 ID
→ 若用户已提供 task_id:直接使用
→ 若用户描述了任务名称:
a. mcp__huanxi__task_list_mine() 获取我的任务列表
b. 按标题关键词模糊匹配,列出候选任务供用户选择
c. 仍未找到(可能属于他人或已归档)→ 告知用户提供精确 task_id
Step 2: 展示当前任务状态,引导用户填写要修改的字段
Step 3: mcp__huanxi__task_update(task_id, {
title? : "新标题",
description? : "新描述",
progress? : 80, ← 0-100 整数
progress_before? : 60, ← 修改 progress 时必传当前值(乐观锁,防并发覆盖)
status? : "not_started" | "in_progress" | "done" | "cancelled" | "on_hold",
end_date? : "YYYY-MM-DD", ← 字段名是 end_date,不是 due_date
priority? : "low" | "medium" | "high" | "critical"
})
Step 4: 告知更新结果
task_query(scope="mine") 我负责执行的(默认)
task_query(scope="all", module_ids=[...]) 某几个模块的全部任务
task_query(q="关键词") 标题模糊搜
task_get(task_ids=[...]) 详情:描述 + 层级路径
```
⚠️ **历史踩坑**
- 字段名 `due_date` 错误,后端为 `end_date`
- 状态值 `todo` 错误,后端为 `not_started`
- priority 缺 `critical`,没有 `urgent`
- 改 progress 不传 `progress_before` 会 409 冲突
过滤维度都收列表,一次查多个模块比循环调用好。
---
## +assign:设置执行人
## 改状态与进度
**先 `dict_get` 取 task 类型的状态选项**,拿到 `status_option_id` 再传:
```
Step 1: 确认任务 ID
Step 2: 解析执行人名字 → user_id(查 users.json 缓存)
→ 详见 huanxi-org references/resolve-ids.md
Step 3: mcp__huanxi__task_set_assignees(task_id, assignee_ids=[user_id, ...])
(此操作幂等:传完整列表,不是追加)
Step 4: 告知设置结果
dict_get(kinds=["status_options"])
→ 筛 entity_type == "task"
→ 按 category 找到目标状态(not_started/in_progress/completed/cancelled
→ 取它的 id
task_update(updates=[{id: 任务id, status_option_id: 状态id}])
```
状态与进度**有联动,只传一个就够**:进度设到 100 会自动转完成;已完成的任务把进度
调低会自动回落进行中。两个都传等于重复表达同一个意思。
**非叶子任务不能直接设进度**——返回里 `progress_readonly` 为 true 的那些,进度是子任务
聚合出来的,硬设会被拒绝。要推进它,去改它的子任务。
---
## +get:查看任务详情
## 建任务
```
Step 1: mcp__huanxi__task_get(task_id)
Step 2: 展示完整任务信息(标题/描述/状态/进度/执行人/截止日/评论数)
task_create(module_id=..., tasks=[{title, description?, priority?, end_date?,
parent_id?, milestone_id?, assignee_ids?}])
```
- 建子任务传 `parent_id`,**最多三级**(任务 / 子任务 / 孙任务)
- 需要是该模块的成员或负责人
- `priority` 的取值以工具说明为准——**不要凭直觉写**,这个字段有 DB 级约束,写错直接报错
---
## 关键约束
## 执行人
- **任务创建后不自动认领**`task_create` 不会自动设置执行人,需要单独调用 `task_set_assignees`
- **执行人是完整列表**`task_set_assignees` 传入的是完整执行人 ID 列表(幂等替换),不是追加
- **progress 是整数**:0-100 的整数,不是小数或百分比字符串
- **模块创建权限**:用户必须是模块成员(任意角色)才能在该模块创建任务,否则返回 403
```
task_set_assignees(task_id=..., user_ids=[...]) 整组覆盖,传空即清空
task_claim(task_ids=[...], claim=true/false) 认领 / 取消认领(只动自己)
```
**`task_set_assignees` 是替换不是追加。** 想加一个人,要先 `task_get` 拿到现有名单,
把新人拼进去再整组传回——直接传一个人会把其余执行人全部踢掉。这是最容易出错的地方,
覆盖前把「改完会变成谁」说给用户听。
被指派的人若不是模块成员,会自动加入该模块;新增执行人会收到飞书通知。
---
## 不在工具里的操作
删除任务、跨模块转移任务**不在 MCP**,请引导用户去网页端——这两个动作作用于整棵子树
且不可逆,需要看清楚影响范围再点。