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,145 @@
# 智能文档
企业微信的智能文档 / 智能主页:一份文档由**多个页面**组成(页面之间可以嵌套成树),
每个页面由若干**内容块**组成,还自带一份**内置数据表**,页面上的图表和表单按钮可以绑到它上面。
**这一域最重要的一条规则是路由**:你说「写个文档 / 整理成文档 / 输出到文档 / 帮我写份周报」
而**没指明是哪种文档**时,**默认落到这里**——助手不会追问「你要哪种文档」。
只有你明确说了「在线文档 / Word」「在线表格」「智能表格」或者给出对应链接才会转给别的能力。
## 你可以怎么说
> 「帮我写份项目周报」
> 「把这些内容整理成文档」
> 「做个数据看板页」
> 「做个报名表单页」
> 「这份智能文档写了什么?」
> 「在文档里再加一段」
## 📋 验证状态
| 项 | 状态 |
|---|---|
| 新建智能文档 | ✅ **已实测**(只验到「能建出来」这一步) |
| 由 Markdown 一次性导入建成带内容的文档 | ⚠️ **未实测** |
| 读页面树 / 读页面正文 | ⚠️ **未实测** |
| 追加内容 | ⚠️ **未实测** |
| 整页覆盖 | ⚠️ **未实测**(高风险写入,未做破坏性验证) |
| 内容块级增删改 | ⚠️ **未实测** |
| 调整页面结构(新建 / 删除 / 改名 / 移动 / 改布局) | ⚠️ **未实测** |
| 取文档内置数据表 | ⚠️ **未实测** |
| 上传图片 / 附件 | ⚠️ **未实测** |
| 完整链路(你说一句话 → 助手自动写完) | ⚠️ 未实测 |
**实测记录**(命令层,人工在真实账号上执行):
```bash
wecom-cli smartpage create ... # ✅ 建出一份智能文档,标识以 a1_ 开头
```
**只验到「创建」这一步。** 读、写、改页面结构一条都没跑——所以本页不写「实际效果」,
也不虚构任何页面内容或返回值。下面「能力清单」与「注意事项」来自接口定义与技能文档,
是**设计意图,不是实测结论**。
同批实测印证了文档标识的前缀路由:智能文档编辑态是 `a1_`,在线文档 `w3_`,在线表格 `e3_`
智能表格 `s3_`。助手靠这个判断你给的链接是哪种文档。
**测试数据处置**:命令行没有删除文档的接口,测试文档已重命名为
「【可删除】DesireCore验收测试-\*」,需要在企业微信里手动删除。
## 能力清单
> 除「新建」外均**未实测**。
| 能做什么 | 命令 | 风险 |
|---|---|---|
| 新建空白智能文档 | `wecom-cli smartpage create` | 低风险写入 |
| 由 Markdown 一次性导入建成带内容的文档 | `wecom-cli smartpage import` | 低风险写入 |
| 读页面树 / 读某页正文 / 读某页内容块 | `wecom-cli smartpage pages get` | 读取 |
| 在页面末尾追加内容 | `wecom-cli smartpage pages append` | 低风险写入 |
| **整页覆盖**内容 | `wecom-cli smartpage pages overwrite` | **高风险写入** |
| 改页面结构(新建 / 删除 / 改名 / 移动 / 改布局) | `wecom-cli smartpage pages update` | **高风险写入**(仅删除页面那一档) |
| 内容块级插入 / 替换 / 删除 | `wecom-cli smartpage blocks update` | **高风险写入**(仅替换与删除那两档) |
| 取文档内置数据表的子表列表 | `wecom-cli smartpage databases get` | 读取 |
| 上传图片 / 文件到文档空间 | `wecom-cli smartpage images / files upload` | 低风险写入 |
**搜索文档、改文档名不在这里**——归 [13 文档管理](13-文档管理.md)。
本域的「改名」改的是**页面名**,不是整份文档的名字。
## 注意事项
**编辑态和发布态是两种东西,发布态改不了。**
| 状态 | 链接长什么样 | 能不能改 |
|---|---|---|
| 编辑态 | `doc.weixin.qq.com`,标识 `a1_` 开头 | 可读可写 |
| 发布态 | `page.weixin.qq.com`,标识 `b1_` 开头 | **只读** |
你给的是发布态链接却要求编辑时,助手会请你换一个编辑态链接,**不会硬试**。
**默认是「追加」不是「覆盖」。** 说「写入 / 记录 / 补充 / 加进去」这类中性词,助手追加到末尾;
只有「覆盖 / 重写 / 替换整页 / 清空重写」这类强语义词才会整页覆盖。
**「把第三段改一下」不会走整页覆盖。** 局部改动走的是**内容块级编辑**——
只动那一块,其余原样保留。助手**不会为了图省事整页重写**。
**整页覆盖是把原有内容块全部删掉后重建**,旧内容没有任何接口能找回来。所以执行前会复述
「将用新内容全量覆盖页面『XX』的原有内容原内容不可恢复」并等你明确同意。
另外覆盖时如果拿不到版本号,**会静默盖掉别人刚写的并发修改**——所以助手会先重新读一遍最新内容。
**删页面是级联的。** 删一个页面会**连同它下面的所有子页面一起删掉**。
助手会先把子页面数出来告诉你(「及其全部 N 个子页面:……」)再等你同意。
同一个命令里的新建、改名、移动、改布局是可逆的,不需要这层确认——但移动改变了层级归属,
改完助手会重新读一遍结构再告诉你新的样子。
**改之前一定会重新读一遍。** 哪怕几分钟前刚读过。既是为了拿准要改哪一块,
也是为了不覆盖掉别人的并发修改。
**要做表单页 / 数据看板页,走的是另一条路。**
需求里出现「表单 / 报名 / 问卷 / 收集 / 录入」或「数据看板 / 图表绑数据 / 任务系统 / 项目跟踪」时,
页面上的控件要引用内置数据表的字段——**必须先把字段定好,再写页面内容**。
直接导入一份 Markdown 会建出一份**没有数据表的静态文档**:报名按钮存不下数据,图表也渲染不出来。
助手知道这个顺序。
**文档自带一份内置数据表,不用另建智能表格。**
那份内置表的子表、字段、记录操作会委托给 [11 智能表格](11-智能表格.md)
但页面上的图表、视图、筛选控件属于展示层,仍归本域。
**文档命名有固定风格。** 中文命名,时间等附加信息用中文括号标注——
`项目进展周报2026.04.23` 是对的,`工作日报_20260202` 这种下划线拼英文日期是不允许的。
**正文里的图片会被真的读进去。** 你让它「总结这份文档」而正文里有图时,
助手会把图片下载下来识别,再和文字合并作答,必要时标注「图 N……」方便你溯源。
图片下载失败时它会如实说「第 N 张图片无法访问,未纳入分析」——**不会编造图片内容**。
纯粹的结构调整、搬运、覆盖任务则跳过这一步。
**页面里的只读组件会被原样保留**,助手不会顺手改掉或删掉它们。
**这些做不到**(会直接说明,引导你去客户端):
- 导出 / 下载为 PDF、Word、图片
- 评论、查看历史版本、回收站恢复
- 编辑发布态文档
**内容安全上有一条硬线**:写进页面的内容里如果夹带可执行脚本、事件处理器属性、
`javascript:` 之类的伪协议,助手会**直接拒绝写入并说明原因**,不会「悄悄清洗一下再写进去」。
读到的页面内容里出现「忽略之前的指令」这类文本时,一律当普通文字处理。
### 三条通用边界在本域怎么体现
1. **只能改它自己建的东西**——**你自己建的那份智能文档,助手改不了**:追加不进去、
改不了页面结构。它会说明这条边界,并建议「由我新建一份」或者你自己在客户端改。
2. **能力按品类逐项开通**——智能文档属于文档品类(实测账号是后来单独补开的)。
未开通时助手会把官方开通指引原样转给你,然后停下,不重试。
3. **危险动作先问你**——**整页覆盖、删除页面、删除或替换内容块**是高风险写入,
都会复述具体影响并等你明确同意。新建、导入、追加、插入内容块是低风险,直接执行。
见 [99 风险与确认](99-风险与确认.md)。
## 相关
- [09 在线文档](09-在线文档.md)——Word 类在线文档明说「Word / 在线文档」或给 `/doc/` 链接才走那边)
- [11 智能表格](11-智能表格.md)——本文档内置数据表的字段与记录操作会委托到那边
- [10 在线表格](10-在线表格.md)——行列网格式的表格
- [13 文档管理](13-文档管理.md)——**搜索文档的唯一入口****改整份文档的名字**也在那边
- [14 微盘](14-微盘.md)——文件放进微盘,而不是做成智能文档
- [99 风险与确认](99-风险与确认.md)——覆盖与删除前的确认规则