dsh-office-cli
English | 中文
把企业微信、钉钉、飞书三家的官方办公 CLI 作为一个安全、原生的 DeepSeek Harness(DSH)插件提供给 Agent。
这不是另一个聊天机器人桥。现有 DSH 社区已经有不少“从飞书/钉钉/企微聊天远程控制 DSH”的项目;本项目解决另一层问题:让 DSH 在一次安装后,以统一工具操作三家的消息、通讯录、文档、表格、日程、会议、待办、审批、邮件等办公能力,同时继续使用厂商 CLI 自己的鉴权、命令发现和 API 兼容层。
> 当前适配 DSH 0.1.0-rc.7。DSH 仍处于 Developer Preview,后续版本可能需要同步适配。
能力
| 平台 | 官方 CLI | 插件平台名 | 能力发现 | 本地鉴权 |
|---|---|---|---|---|
| 企业微信 / WeCom | @wecom/cli | wecom | schema list/get、--doc、--schema | wecom-cli auth init |
| 钉钉 / DingTalk | dws | dingtalk | dws schema ... --compact | dws auth login |
| 飞书 / Lark | lark-cli | feishu | 分层 --help、快捷命令与 API 命令 | lark-cli config init + auth login |
插件提供:
office_cli:统一的模型工具,输入平台、argv 数组、用途和可选dry_run。office_cli_doctor:只检查三家 CLI 是否能运行及其版本,不读取账号身份或凭据。dsh-office:用户在终端执行的诊断和交互式鉴权助手。dsh-office-cli内置 Skill:教 Agent 渐进发现命令、先 dry-run、检查退出码,并正确处理三家差异。- 安全策略:无 shell 执行、输出/超时上限、凭据参数拦截、工作区路径限制、危险与未知写操作审批。
安装
要求 Node.js >=22.19 和可运行的 DeepSeek Harness。
从 GitHub 安装
dsh plugin --profile web add github:meliwanx/dsh-office-cli
dsh plugin --profile web exec dsh-office install
dsh plugin --profile web exec dsh-office doctor
dsh --profile web --dump-config
dsh --profile web插件安装本身没有 postinstall,不会触发 pnpm 的依赖脚本拦截。第二条命令是用户明确授权的准备步骤:它通过 npm 把三个精确版本的官方 CLI 安装到 $DSH_HOME/office-cli,供所有 DSH profile 共用,不污染全局 npm。
# 也可以只装需要的平台
dsh plugin --profile web exec dsh-office install wecom
dsh plugin --profile web exec dsh-office install dingtalk
dsh plugin --profile web exec dsh-office install feishu如果不想使用受管目录,也可以手工把官方 CLI 安装到 PATH,或把它们作为 profile 的相邻依赖安装。插件按“显式配置 → $DSH_OFFICE_HOME/$DSH_HOME/office-cli → 相邻 npm 包 → PATH”的顺序查找。
本地开发安装
npm install
npm run check
dsh plugin --profile web add .
dsh plugin --profile web exec dsh-office install首次发布到 npm 后,安装命令可简化为:
dsh plugin --profile web add dsh-office-cli诊断与鉴权
凭据由三家官方 CLI 写入自己的系统 Keychain/加密存储,本插件不接收、不保存、不代理 App Secret 或 Token。
dsh plugin --profile web exec dsh-office doctor
dsh plugin --profile web exec dsh-office install
dsh plugin --profile web exec dsh-office auth wecom
dsh plugin --profile web exec dsh-office auth dingtalk
dsh plugin --profile web exec dsh-office auth feishu也可直接使用厂商命令:
wecom-cli auth init
dws auth login
lark-cli config init
lark-cli auth login --recommend使用
安装并完成对应平台鉴权后,直接对 DSH 说:
查看我今天的飞书日程。先 dry-run,然后在企业微信里给张三创建一个明天下午 5 点到期的待办。查钉钉里本周待我审批的流程,只读,不要做任何审批操作。Agent 会先加载随包提供的 Skill;命令不确定时,先用厂商 schema/help 发现最小命令面,再调用 office_cli。写操作默认进入 DSH 的一次性审批流程。
配置
覆盖 profile 的 cordis.patch.yml 中同一个 id,并重述完整配置:
- id: dsh-office-cli
config:
approval: writes
timeoutMs: 120000
killGraceMs: 2000
maxOutputBytes: 262144
maxArgs: 128
maxArgLength: 65536
allowRawApi: false
workspaceFilesOnly: true
# 仅在自动发现失败时设置;值是单个可执行文件路径,不是 shell 命令。
# wecomCommand: /opt/bin/wecom-cli
# dingtalkCommand: /opt/bin/dws
# feishuCommand: /opt/bin/lark-cli| 字段 | 默认值 | 含义 |
|---|---|---|
approval | writes | writes 仅审批写/删除/未知操作;all 审批全部调用;off 关闭本插件审批。 |
timeoutMs | 120000 | 每个前台 CLI 调用的超时。 |
killGraceMs | 2000 | 超时/取消后从 SIGTERM 升级到强制终止的宽限时间。 |
maxOutputBytes | 262144 | stdout + stderr 的总捕获上限,超出后截断。 |
maxArgs | 128 | 单次 argv 数量上限。 |
maxArgLength | 65536 | 单个 argv 的字符上限,兼容文档正文。 |
allowRawApi | false | 是否允许三家 CLI 的低层 api 模式。 |
workspaceFilesOnly | true | 拒绝明显指向会话工作区之外的文件参数。 |
*Command | 未设置 | 指定对应 CLI 的可执行文件路径或 PATH 名。不会进行 shell 拆词。 |
workspaceFilesOnly 是参数级防护,不是操作系统沙箱。高安全部署应把 DSH 和厂商 CLI 放进专用容器/账号,并限制企业应用本身的 API 权限。详见 [SECURITY.md](SECURITY.md)。
为什么做成一层统一插件
三家官方 CLI 都已经针对 Agent 提供 JSON 输出、帮助/schema 发现、dry-run 或风险元数据,并负责不断跟进各自开放平台。重新手写数百个 API 包装会迅速漂移;单纯让模型走 bash 又缺少统一审批、参数审计、超时和凭据防泄漏。
本项目因此只拥有四件事:DSH 工具契约、三家进程适配、跨平台安全策略、Agent 使用方法。业务 API 与 OAuth 生命周期仍由官方 CLI 拥有。完整设计见 [架构说明](docs/architecture.zh-CN.md),生态调研见 [GitHub 调研](docs/research.zh-CN.md)。
范围与路线
0.1 版本专注 DSH → 办公平台 的出站办公能力。办公平台消息 → DSH 的入站 IM channel 涉及长期连接、会话映射、多租户身份、幂等/重放、远程审批与媒体流,不能和一次性 CLI 调用混成一个不可靠进程。后续会在同一适配器契约上增加独立的 channel-* 插件,不改变现有工具接口。
开发
npm install
npm run check
npm run pack:check本项目不采用 TDD 强制流程;实现完成后使用单元、类型和打包检查验证。贡献前请阅读 [CONTRIBUTING.md](CONTRIBUTING.md)。
许可证
[MIT](LICENSE)。由安装助手获取的三个厂商 CLI 是独立软件,分别遵循其自身许可证;见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。