feat: 新增企业微信助手 Agent,并修正 wecom-cli 条目 ref 漂移 (#112)

## 概述 / Overview

两件事:新增「企业微信助手」Agent(自带 15 个技能),并修正 `wecom-cli` 条目钉在 6 月快照的 ref 漂移。

Two changes: adds the **WeCom Assistant** agent (bundling 15 skills),
and fixes the `wecom-cli` entry whose pinned ref was stuck on a June
snapshot.

## 1. 新增企业微信助手 Agent

覆盖企业微信 **14 类服务、95
个方法**:消息、群聊历史、通讯录、日程、会议、待办、邮件、在线文档、在线表格、智能表格、智能文档、文档管理、微盘、媒体文件。

**采用内联形态 + 自带私有技能**:Agent 安装对 `agents/<id>/` 整目录递归复制且 `skills/`
不在排除集合里,因此装 Agent 即带全部技能,用户无需再单独获取技能合集。

### 技能集(15 个,约 5000 行)

- 基于上游 [wecom-cli](https://github.com/WecomTeam/wecom-cli) 官方
Skill(MIT,© WecomTeam)改写,每个技能末尾保留归属声明
- **新增 `wecom-chat`**:补齐上游零覆盖的群聊历史读取
- 补齐上游未覆盖的 `message.send`、`doc.create`,方法覆盖达 **95/95**
- 修正上游三处文档漂移:邮件能力描述与实际相反、会议室参数名已过时、`title_highlight` 字段不存在

### 相对上游的核心增量:风险治理

- 26 个对外可见或不可逆的方法逐个写明**执行前确认要求**
- 4 个条件升级方法给出**参数级判据**,而非按方法名一刀切
- 文档权限扩散两项加重处理,涉及**企业外可见**时单独再确认一次
- 内部标识禁止外露,不因用户索要而放宽
- 拒绝导出可识别到具体自然人的隐私字段

### 三条真机实测得出、上游未覆盖的硬约束

1. 机器人**只能写入/修改自己创建的数据**,真人创建的只能读
2. 每次响应携带的 `extra_identity_context` **禁止透露给用户**
3. 权限错误(`850002`/`851008`/`853006`)**不得重试**,须将 `help_message`
**逐字原样**转给用户

## 2. 修正 wecom-cli 条目 ref 漂移

`source.ref` 原钉在 2026-06-28 的 `72e14f7`,该快照只有 7
个子技能且用已废弃的旧命名(`msg`/`schedule`)。上游 v1.2.0 已扩展到 **14 个**技能。按旧 ref
安装的用户拿到的是三个月前的快照。

- `source.ref` → `78c514b2afee7c0d3d7be715628478421f37ee63`
- `children` 由 `scripts/gen-collection-children.py` 重新生成,**7 → 14**
- sidecar 同步 `provenance.content.ref`、`childCount` 与 `children`

## 验证 / Verification

**静态**
- 215 条示例命令追加 `--dry-run` 实跑,**215/215 退出码 0**
- 未知方法 0、未知参数 0、`--json` 未知字段 0、枚举违规 0
- 15 个 `SKILL.md` 的 frontmatter 经客户端 `skillFrontmatterSchema` 校验全部通过
- `validate_catalog_metadata.py --require-complete` 与
`gen-collection-children.py`:**0 error**

**真机(在真实企业微信账号上端到端)**
- **待办域 6/6 方法全通**(含 2 个 write-high),`items` 必填的隐蔽坑实测证实
- **日程域 5 个方法全通**(含 3 个 write-high)
- 消息发送、通讯录解析、微盘列表、邮件搜索、文档搜索、会议列表、智能表格创建均已实测通过
- 测试数据已全部清理,未污染真实账号

**尚未实测**:群聊历史(机器人未开通该品类)。相关文档已明确标注验证状态,未实测的能力不写「实际效果」段落。
This commit is contained in:
2026-09-03 03:50:00 -04:00
committed by GitHub
parent c83f917901
commit aec2e7c28b
57 changed files with 16893 additions and 45 deletions

View File

@@ -0,0 +1,132 @@
# 文档管理
企业微信四种在线文档(在线文档 / 在线表格 / 智能表格 / 智能文档)共用的**「文件级」管理**
搜索、改名、加协作成员与权限、设置链接加入规则。它管的是**文件这个壳**——
它叫什么、谁能进来、进来能干什么——**不碰文件里的一个字**。
**两件事只有这里能做**
- **搜索文档**——不论哪种类型,这是**唯一的入口**。其他四个内容能力都没有搜索方法。
- **改文档名 / 改权限**——不论哪种类型,都在这里。
**同时它也是整套能力里风险最高的一域**:改加入规则可能放开**企业外**访问。
## 你可以怎么说
> 「帮我找一下那个产品周报文档」
> 「我最近看过哪些文档?」
> 「我这周建的文档有哪些?」
> 「把这个文档改名叫 2026 年 Q3 项目周报」
> 「把张三加到这个文档里,让他能编辑」
> 「给客户发个只读链接」
## 📋 验证状态
| 项 | 状态 |
|---|---|
| 修改文档名称 | ✅ **已实测** |
| 搜索文档 | ⚠️ **未实测** |
| 添加协作成员 / 设置权限 | ⚠️ **未实测**(高风险,未在真人身上做权限扩散实验) |
| 设置链接加入规则 | ⚠️ **未实测**(风险最高,未做实验) |
| 完整链路(你说一句话 → 助手自动找到并改完) | ⚠️ 未实测 |
**实测记录**(命令层,人工在真实账号上执行):
```bash
wecom-cli doc names update ... # ✅ 重命名成功
```
这一条是在清理测试数据时验证的——4 份测试文档(在线文档 / 在线表格 / 智能表格 / 智能文档)
全部被重命名为「【可删除】DesireCore验收测试-\*」。四种类型都改成功了,
侧面印证了「一套管理接口对四种文档统一生效」。
**权限相关的两个方法一条都没测**——它们会真实改变别人能看到什么,
不适合拿真实文档和真人做验收实验。所以本页不写「实际效果」,也不虚构任何搜索结果或权限变更记录。
## 能力清单
| 能做什么 | 命令 | 风险 |
|---|---|---|
| 搜索文档(含「最近浏览 / 最近创建」) | `wecom-cli doc search` | 读取 |
| 修改文档名称 | `wecom-cli doc names update` | 低风险写入 |
| 添加协作成员并设置权限 | `wecom-cli doc members update` | **高风险写入(权限扩散)** |
| 设置链接加入规则(企业内 / 企业外) | `wecom-cli doc rules update` | **高风险写入(权限扩散,可放开企业外)** |
两个高风险方法属于**权限扩散**类:它们不改文档里的一个字,却直接改变「谁能看到这份文档的全部内容」。
**后果不可逆**——已经看过的人就是看过了,而且命令行侧没有撤销接口。
所以它们的确认比其他高风险动作更重。
## 注意事项
**改加入规则是整套能力里最危险的一件事。**
把「企业外成员加入权限」改成可浏览或可编辑,意味着**不在你们企业微信通讯录里的任何人**
只要拿到链接就能访问这份文档的全部内容——**这是数据外泄级别的变更**
链接被转发出去后无法收回。
所以助手在这里加了三道额外的闸门:
1. **涉及企业外时会单独再确认一次**,把后果单独说清:
> 这份文档将不再限于本企业内部可见,链接被转发出去后无法收回。
2. **「发个链接就能看」不等于「开企业外」。** 默认只动企业内的加入权限。
要动企业外,**必须由你明确说出「企业外 / 外部 / 客户 / 合作方」**这类对象;
含糊时它会追问「是仅企业内部,还是也包括企业外的人?」。
3. **不知道文档里有什么就不开企业外。** 你要求放开而助手没读过这份文档时,
它会先提示「这份文档的内容我没有读过,开放给企业外前请你确认其中不含敏感信息」。
想收紧(关掉外部访问)也要说清楚——**不提这一项等于保持现状,不是关闭**。
**加成员只能加,不能删。** 命令行**没有移除成员的方法**。加错了助手也删不掉,
只能引导你去企业微信客户端手动移除——**它不会假装能撤销**。这也是加成员前要确认的原因之一。
**不会默认给高权限。** 「把张三加进来」这个说法本身**不构成**「让他能编辑」的明确表示。
| 你怎么说 | 会给什么权限 |
|---|---|
| 「让他看看」「发给他参考」 | 仅浏览 |
| 「让他一起写」「他要填表」 | 可编辑 |
| 「让他管这个文档」「他来分配权限」 | 管理员 |
你没说清楚时助手会问一句,不会自己选可编辑或管理员。
**搜索只能搜到你有权限访问的文档。** 搜不到不等于文档不存在,可能只是你无权访问。
你让它查「张三参与的文档」时,助手**必须提醒你**:结果只包含**你自己也有权限访问**的那部分——
**这个能力不能用来窥探别人的文档列表**
**搜索会先分词再搜。** 把整句话当成一个关键词传进去是搜不到东西的头号原因。
助手会先剔除「帮我」「找下」「的」「文档」这类口语词,再把真正有区分度的词组合起来搜。
**搜出多条它不会替你挑。** 结果超过 1 条时,助手会用「序号 + 文档名(可点击链接)+ 最近修改时间」
列出候选,**等你选定再做后续动作**。一条都没搜到时它会告诉你没搜到,并请你补充线索,
**不会自己换关键词反复重试**
**有些类型搜得到但读不了正文**`ppt` / `journal` / `collect` / `mind` / `flow` / `pdf`
整套能力里都没有读它们正文的方法,助手会直接说明,并给你文档链接让你在客户端打开。
**改名 / 加成员 / 改规则这三件事只对四种在线文档有效**,上面那几种类型不适用。
**微盘不是在线文档。** `drive.weixin.qq.com` 开头的是微盘,本域的四个方法对它都不适用——
微盘文件的改名走 [14 微盘](14-微盘.md)。
**文档链接可以给你,内部编号不给。** 助手展示文档时用「文档名 + 可点击链接」的形式,
提创建者时用姓名。文档的内部标识、创建者的内部标识都不会出现在回复里。
### 三条通用边界在本域怎么体现
1. **只能改它自己建的东西**——**你自己建的文档,助手改不了名、也改不了权限**。
(实测的重命名是在助手自己建的 4 份测试文档上做的。)碰到这类请求,
它会说明边界并建议你在客户端操作。
2. **能力按品类逐项开通**——文档是独立品类(实测账号是后来单独补开的)。
未开通时助手会把官方开通指引原样转给你,然后停下,不重试。
3. **危险动作先问你**——**加成员和改加入规则是本域两个高风险写入**
而且**涉及企业外时要单独再同意一次**。改名是低风险,直接执行(改错了再改回来即可)。
见 [99 风险与确认](99-风险与确认.md)。
## 相关
- [09 在线文档](09-在线文档.md)——Word 类文档的正文读写
- [10 在线表格](10-在线表格.md)——行列网格式表格的数据读写
- [11 智能表格](11-智能表格.md)——字段 / 记录 / 视图的操作(那边的「改子表名」不是改文件名)
- [12 智能文档](12-智能文档.md)——智能文档内容与页面结构(那边的「改名」是改页面名)
- [02 通讯录](02-通讯录.md)——给某人开权限前,先在这里把人名解析出来
- [14 微盘](14-微盘.md)——微盘文件的改名与管理
- [99 风险与确认](99-风险与确认.md)——权限扩散类操作的确认规则