googleworkspace/cli 但接了飞书/钉钉/企微/腾讯文档——一个 Go 写的 agent CLI,让你的 Coding Agent 读写你自己的飞书文档、钉钉日历、企微消息、腾讯文档,把 4 套 OAuth 收敛成 1 次 suiter login。Agent 现在 org-wide 地 just work 在 CN 办公套件数据上,零 per-app 集成代码。
一次
suiter login顶掉 4 套手搓 OAuth 集成——你的 Coding Agent 读写你自己的飞书文档 / 钉钉日历 / 企微消息 / 腾讯文档,零 per-app 胶水代码。
suiter 是一个用 Go 写的命令行二进制,你的 Coding Agent 调用它来读写你自己的 CN 办公套件数据。每个子命令都说 --json stdio,agent(Claude Code / Trae / Cline)可以直接 pipe 进上下文。一个 Suite 接口、一套语法:suiter <suite> <verb> <id>。
googleworkspace/cli 让你的 Agent 读 Google Workspace——但 CN 开发者真正活在飞书/钉钉/企微/腾讯文档里,而 Google Workspace 被 CN 数据出境挡住。每家 CN 套件各自的 OpenAPI + OAuth + 事件 schema 各不相同,今天你为了让 Claude Code 读一篇飞书文档,得手搓 4 套 OAuth(外加 paging、token 刷新、event 订阅)。suiter 把这笔「under the hood」的工程税一次付清并缓存到 ~/.suiter/tokens.json,你的 Agent org-wide 地 just work 在 CN 办公套件数据上。
Before — 4 套手搓 OAuth 集成 After — 1 次 suiter login
┌──────────────────────────────────┐ ┌───────────────────────────────┐
│ feishu SDK → OAuth #1 ┐ │ │ $ suiter login feishu │
│ dingtalk SDK → OAuth #2 │ 4× glue│ │ $ suiter login dingtalk │
│ wework SDK → OAuth #3 │ │ │ $ suiter login wework │
│ tencent SDK → OAuth #4 ┘ │ │ $ suiter login tencentdocs │
│ (各自 paging / refresh / events) │ │ → ~/.suiter/tokens.json (1 个) │
└──────────────────────────────────┘ └───────────────────────────────┘
单二进制,进程内,无 daemon、无 server、无 K8s:Cobra CLI → Suite 注册表 → 4 个套件客户端,背后是共享的 TokenStore(~/.suiter/tokens.json)和一个薄的 OpenAI 兼容 LLM 客户端(GLM / DeepSeek,不自建模型)。
go install github.com/SuperMarioYL/suiter@latest需要 Go 1.24+。二进制落到 $GOPATH/bin。
export SUITER_FEISHU_APP_ID=cli_xxx SUITER_FEISHU_APP_SECRET=xxx # open.feishu.cn 控制台取
suiter login feishu # 一次 OAuth loopback,token 缓存
suiter feishu doc read <doc-id> --json # 文档正文 → agent-readable JSONsample output
{
"code": 0,
"msg": "success",
"data": { "content": "周会纪要:1) 7/30 发版 ... 2) 负责人 @张三 ..." }
}# 1) 一次 OAuth loopback,token 缓存到 ~/.suiter/tokens.json
suiter login feishu
# 2) 飞书文档正文 → JSON 输出到 stdout
suiter feishu doc read <doc-id> --json
# 3) pipe 进你的 Coding Agent
suiter feishu doc read <doc-id> --json | your-agent summarize
# 4) 列出已注册套件
suiter suites
# 5) m3 端到端 star-moment:读飞书 → GLM 摘要 → 钉钉日历事件
suiter agent run summarize-and-schedule <doc-id>更多见 examples/。
| 套件 | 状态 | 动词 |
|---|---|---|
| 飞书 feishu | m1 ✓ | login,doc read |
| 钉钉 dingtalk | m2 ✓ | login,calendar list/get/create |
| 企微 wework | m2 ✓ | login,message send/read |
| 腾讯文档 tencentdocs | m3 ✓ | login,sheet read/write |
每个套件实现同一个 Suite 接口(Name / Login / Read / Write),挂在同一个 Suite 注册表后;新增套件动词零新增 CLI 胶水——这就是统一抽象要证明的事。
明星时刻(m3)是一个 60 秒的 loop:suiter feishu doc read <id> --json → GLM/DeepSeek summarize → suiter dingtalk calendar create。v0.2 在每个动词上开放 --json stdio 且把 钉钉/企微 真正接通到同一套 suiter <suite> <verb> 语法后,Agent 今天就能 orchestrate 跨三套;v0.3 把 suiter agent run summarize-and-schedule 端到端串起来——读飞书文档 → GLM/DeepSeek 摘要 → 写钉钉日历事件,一个命令搞定。完整的 MCP server 仍在路线——先把统一抽象坐实成 4 套真实现,再封 MCP。
suiter: 4 OAuth → 1 CLI in 60s(m3 agent loop —— 读飞书 → GLM 摘要 → 钉钉日历)
由 CI 从
docs/demo.tape(vhs)渲染。手动刷新用demoworkflow。上面 gif 跑的是无凭证也能渲染的统一语法巡览;完整 60s 录屏脚本如下:
suiter login feishu # one OAuth loopback, token cached in ~/.suiter/tokens.json
suiter login dingtalk # same flow, same shared TokenStore (m2 unified)
suiter feishu doc read <id> --json # agent-readable doc body
suiter agent run summarize-and-schedule <feishu-doc-id> # read 飞书 → GLM summarize → 钉钉 calendar event (m3 star-moment)
suiter dingtalk calendar list --json # unified verb, same grammar, no per-suite CLI glue
优先级:命令行 --config <path> > 环境变量 > ~/.suiter/config.yaml。
| Key | 环境变量 | 默认 | 含义 |
|---|---|---|---|
feishu_app_id |
SUITER_FEISHU_APP_ID |
"" |
飞书 app_id |
feishu_app_secret |
SUITER_FEISHU_APP_SECRET |
"" |
飞书 app_secret |
dingtalk_app_key |
SUITER_DINGTALK_APP_KEY |
"" |
钉钉 appKey(v0.2 已通) |
dingtalk_app_secret |
SUITER_DINGTALK_APP_SECRET |
"" |
钉钉 appSecret(v0.2 已通) |
wework_corp_id |
SUITER_WEWORK_CORP_ID |
"" |
企微 corpId(v0.2 已通) |
wework_agent_id |
SUITER_WEWORK_AGENT_ID |
"" |
企微 agentId(v0.2 已通) |
wework_secret |
SUITER_WEWORK_SECRET |
"" |
企微 secret(v0.2 已通) |
tencentdocs_client_id |
SUITER_TENCENTDOCS_CLIENT_ID |
"" |
腾讯文档 clientId(v0.3 已通) |
tencentdocs_client_secret |
SUITER_TENCENTDOCS_CLIENT_SECRET |
"" |
腾讯文档 clientSecret(v0.3 已通) |
llm_base_url |
SUITER_LLM_BASE_URL |
GLM open.bigmodel.cn |
OpenAI-compatible 模型根(GLM/DeepSeek) |
llm_api_key |
SUITER_LLM_API_KEY |
"" |
GLM/DeepSeek API key(agent run 摘要步骤必需) |
llm_model |
SUITER_LLM_MODEL |
"" |
模型名(如 glm-4.6 / deepseek-chat) |
token 缓存在 ~/.suiter/tokens.json(0600 权限,单 dev 本机;多用户 / 云 vault 明确 out of scope)。
- m1 —
suiter login feishu+suiter feishu doc read <id> --json;token 缓存到~/.suiter/tokens.json,跨 session 存活。 - m2 — 钉钉(
calendar list/get/create)+ 企微(message send/read)挂在同一套suiter <suite> <verb>语法 + 共享TokenStore后;通用 dispatcher 让新增套件动词零新增 CLI 胶水,3 套统一证明完毕。 - m3 — 腾讯文档(
sheet read/write)+ GLM/DeepSeek 摘要器;端到端suiter agent run summarize-and-schedule(读飞书 → 摘要 → 钉钉日历事件)。v0.3 同时修掉 dingtalk/wework 缓存 token 过期未检的缺陷(镜像 v0.2 的 feishu 修复)。 - 未来 — MCP server、团队 auth、托管 token vault。
推送后建议加 repo topics:
gh repo edit --add-topic coding-agent --add-topic cli --add-topic feishu --add-topic dingtalkMIT — 见 LICENSE。在 GitHub Issues 提 issue 或 PR。
MIT © 2026 SuperMarioYL
