@dmall-inc/wd-cli
v0.2.0
Published
Waterdrop platform CLI: sign in with your unified identity, pick a workspace, and use the open platform resources from your terminal
Readme
@dmall-inc/wd-cli
水滴平台的命令行工具。用统一身份登录一次,选定工作空间,就能在终端里访问平台上你看得到的技能、知识库、应用、会话、评测与可观测数据。
npm i -g @dmall-inc/wd-cli
wd-cli auth login --base-url https://agents.example.com
wd-cli workspace use 42
wd-cli skill list免安装试一下:npx @dmall-inc/wd-cli auth login --base-url https://agents.example.com
需要 Node.js 18 或更高版本。零运行时依赖。
安装
包已发布到 npm 公共仓库:npmjs.com/package/@dmall-inc/wd-cli。
npm i -g @dmall-inc/wd-cli # 安装最新版
npm i -g @dmall-inc/[email protected] # 指定版本
npm update -g @dmall-inc/wd-cli # 升级
npm view @dmall-inc/wd-cli versions # 查看已发布版本
wd-cli --version # 确认本地版本本机 npm 若指向内部镜像且拉不到这个包,显式指定公共仓库:
npm i -g @dmall-inc/wd-cli --registry https://registry.npmjs.org目录
登录
wd-cli auth login --base-url https://agents.example.com会在本机起一个临时回调服务,打开浏览器让你完成统一身份登录,拿到令牌后存在本地。整个过程用的是 OAuth2 授权码 + PKCE,密钥不落在命令行里,也不写进任何日志。
没有浏览器(SSH 会话、容器、远程开发机):
wd-cli auth login --base-url https://agents.example.com --no-browser会打印一段授权地址。在任意能上网的浏览器里打开、登录,然后把浏览器地址栏里的整段回调地址粘回终端即可。
令牌会自动续期:快过期时 CLI 会先静默换新再发请求,你不会感觉到。只有 refresh token 也失效了才会让你重新登录。
wd-cli auth status # 看当前身份、工作空间、令牌存在哪儿
wd-cli auth logout # 撤销令牌并清除本地凭据选工作空间
平台上你能看到什么,取决于「你是谁」加「当前在哪个工作空间」。登录后先选一个:
wd-cli workspace list # 我属于哪些工作空间
wd-cli workspace use 42 # 选定(也可以写名称:wd-cli workspace use 数据组)
wd-cli workspace current # 当前是哪个选定后会记在配置里,之后每条命令都带着它。想只影响这一次调用,加 --workspace:
wd-cli skill list --workspace 43CI 与脚本:令牌直连
流水线里没法开浏览器,用令牌:
export WD_CLI_BASE_URL=https://agents.example.com
export WD_CLI_TOKEN=wat_xxxxxxxx # 工作空间访问令牌
wd-cli skill list --output json两类令牌,能访问的东西不一样:
| 令牌 | 哪里拿 | 能访问 |
|------|--------|--------|
| 工作空间访问令牌(wat_ 开头) | 平台「工作空间 → 访问令牌」 | 技能、知识库 |
| 应用访问密钥 | 平台 Agent 的「集成」页 | 对话、会话、凭证、评测、数据集、可观测、自动化 |
令牌自带工作空间,不需要也不接受 --workspace。WD_CLI_TOKEN 存在时会压过登录态,这点与 GH_TOKEN 一致。
命令跟当前令牌类型对不上时,CLI 会在发请求前就告诉你该换哪种令牌、去哪拿。确认服务端放开了某条路径而本地判断偏保守,可以加 --no-principal-check 交给服务端裁决。
配置
配置目录按 XDG 约定,默认 ~/.config/wd-cli(Windows 是 %AppData%\wd-cli):
| 文件 | 内容 |
|------|------|
| config.json | 平台基址、认证中心、当前工作空间等。可以放进 dotfiles 仓库 |
| hosts.json | 令牌。权限 0600,不要提交 |
能用系统密钥链时(macOS 钥匙串、Linux libsecret),令牌存进密钥链,hosts.json 里只留一个标记。wd-cli auth status 会告诉你当前存在哪儿。想强制用文件,设 WD_CLI_INSECURE_STORAGE=1。
wd-cli config list # 所有 profile,当前项带 *
wd-cli config use prod # 切 profile
wd-cli config set baseUrl https://... # 改一项配置
wd-cli config path # 配置文件在哪多套环境用 profile 隔开:
wd-cli auth login --profile prod --base-url https://agents.example.com
wd-cli auth login --profile test --base-url https://test-agents.example.com
wd-cli skill list --profile test取值优先级是命令行参数 > 环境变量 > profile。全部环境变量见 wd-cli help environment。
输出与退出码
终端里默认表格,管道里默认 JSON——直接 | jq 或重定向都不用加参数。
wd-cli skill list # 表格
wd-cli skill list | jq '.[0]' # 自动变 JSON
wd-cli skill list --json id,name # 只要这几个字段
wd-cli skill list --jq '.[] | select(.skillType == "personal") | .name'
wd-cli skill download 123 --output raw--jq 是内置的 jq 子集(路径、.[]、select、比较、管道、字符串插值)。碰上它不支持的表达式会明说,让你改用 --output json | jq,而不是给一个看着对的错结果。
数据永远走标准输出,提示和错误走标准错误。退出码:
| 码 | 含义 | |----|------| | 0 | 成功 | | 1 | 业务失败(资源不存在、参数被拒等) | | 2 | 用法错误(参数写错、缺凭据、没选工作空间) | | 3 | 鉴权失败(自动刷新后仍失败) | | 4 | 网络问题或超时 |
完整说明:wd-cli help exit-codes。
命令参考
skill 技能
wd-cli skill list [--q 关键词]
wd-cli skill search --q python --scope personal --page 1 --page-size 20
wd-cli skill versions 123
wd-cli skill download 123 [--version 2] [-O ./skill.zip]
wd-cli skill import ./my-skill.zip --skill-type personal
wd-cli skill install @team/report-generator [--agents universal,claude-code] [--yes]install 的引用可以是技能 id、@owner/name,或平台上那条安装链接。装到哪儿跟 skills-cli 完全一致:
| --agents | 目录 |
|------------|------|
| universal(默认) | ~/.agents/skills/<name> |
| claude-code | ~/.claude/skills/<name> |
| codex | ~/.codex/skills/<name> |
| openclaw | ~/.openclaw/skills/<name> |
| qoder | ~/.qoder/skills/<name> |
| hermes-agent | ~/.hermes/skills/<name> |
目标目录已有同名技能时,旧的先挪到同级 .backup/ 再装新的(--force 直接覆盖)。解压依赖系统的 unzip。
kb 知识库
wd-cli kb list
wd-cli kb get 12
wd-cli kb search 12 --query 报销流程 --top-k 5 [--catalog 3]
wd-cli kb tags 12
wd-cli kb doc list 12 [--page 1]
wd-cli kb doc get|content 12 99
wd-cli kb doc download 12 99 -O ./doc.pdf
wd-cli kb doc upload 12 ./a.pdf ./b.md [--catalog 3]
wd-cli kb doc delete 12 99 --yes
wd-cli kb doc reindex 12 99
wd-cli kb doc catalog-set|catalog-unset 12 99 --catalog 3
wd-cli kb catalog tree|create|rename|move|delete|contents 12 ...
wd-cli kb lark import|sources|sync 12 ...
wd-cli kb folder add|list|sync|policy|delete 12 ...
wd-cli kb acl list|grant|revoke|external 12 ...
wd-cli kb share create|list 12 99批量上传时单个文件失败不会中断其余文件,最后按整体结果给退出码。
agent 应用与对话
wd-cli agent list
wd-cli agent list --q 客服 --published
wd-cli agent list --type high-agent --paginate --json agentCode,name
wd-cli agent create --name "数仓排障助手" --model-id 3 --prompt-file ./prompt.md --skill-id 128 --publish
wd-cli agent create --dsl ./agent.yaml --publish --remark "初始版本"agent list 列出当前工作空间的应用,按更新时间倒序;可见范围与平台界面一致(工作空间成员能看到空间内全部应用)。--published 只留已发布的,也就是能拿去对话的;--type 直接用列表里「类型」列的值。输出里的 ID 就是后续命令要的 agentCode。agent create 支持参数化或从 YAML DSL 新建 Agent(需工作空间构建权限),加 --publish 可一步完成首版发布上线。登录态或工作空间令牌可用,应用访问密钥不行——它只代表单个应用。
wd-cli agent info --agent-code 66
wd-cli agent metadata 66
wd-cli agent revision 66
wd-cli agent model 3 --agent-code 66
wd-cli agent update 66 --prompt-file ./prompt.md --publish
wd-cli agent publish 66 --remark "发布新版"
wd-cli agent bind-skill 66 --skill-id 128
wd-cli agent unbind-skill 66 --skill-id 128
wd-cli agent chat 66
wd-cli agent chat 66 -m "你好"
wd-cli agent chat 66 -m "写一段介绍" --stream
wd-cli agent chat 66 -i --stream
cat prompt.txt | wd-cli agent chat 66 -m - --session-id s1不带 -m 直接 wd-cli agent chat 66 会进入连续对话:同一个会话反复发问,上下文由服务端维持。已经用 -m 发了一句还想接着聊,就加 -i。
$ wd-cli agent chat 66
会话 id:3fbf7db2-…(下次加 --session-id 3fbf7db2-… 可接着聊)
连续对话已开始,/help 看可用命令,/exit 或 Ctrl-D 退出。
> 你好
你好!有什么可以帮你的吗?
> /exit连续对话里可用 /new(换新会话,清空上下文)、/session(看当前会话 id)、/help、/exit(Ctrl-D 同效),Tab 可补全这些命令。提示符和提示信息都走标准错误,所以 wd-cli agent chat 66 > out.txt 只会把回复落进文件。标准输入不是终端时(脚本、管道)不进连续对话,缺 -m 直接报错,免得 CI 里挂住。
不传 --session-id 会先建一个会话,把服务端生成的 id 打印出来,下次带上它就能接着聊。会话 id 由服务端分配——平台按落库的会话行校验,自己编一个 id 传过去会被判为不存在,所以指定的会话不存在时不会自动新建,而是提示你去掉 --session-id。
--stream 下文本增量即时打出来;加 --output json 则逐行输出原始事件,方便脚本处理。
session 会话
wd-cli session list 66 [--user-id 7] [--paginate]
wd-cli session get|info 66 s-1
wd-cli session rename 66 s-1 --title 季度复盘
wd-cli session history 66 s-1
wd-cli session exists 66 s-1 # 存在退出 0,不存在退出 1
wd-cli session delete 66 s-1 --yes
wd-cli session drop 66 s-1 --yescredential 凭证
wd-cli credential list --agent-code 66
wd-cli credential get feishu-bot --agent-code 66 # 明文默认隐藏
wd-cli credential get feishu-bot --agent-code 66 --reveal # 确实要明文
wd-cli credential authorize-url feishu-bot --agent-code 66登录态下用 --agent-code 指明目标应用;用应用访问密钥时改用 --session-id。
eval / dataset 评测
wd-cli eval plan list --agent-code 66
wd-cli eval plan items 8 --agent-code 66
wd-cli eval plan update 8 15 --data @item.json --agent-code 66
wd-cli eval execute --data @run.json --agent-code 66
wd-cli eval task list|create|get|items 66 ...
wd-cli dataset list|create|get|update|delete 66 ...
wd-cli dataset items 66 3
wd-cli dataset items add 66 3 --data @items.json
wd-cli dataset test-cases 66所有 --data 都接受内联 JSON、@文件、或 -(标准输入),发出去之前先校验是合法 JSON。
trace / obs / score 可观测
wd-cli trace list 66 --from 2026-09-01 --to 2026-09-12
wd-cli trace get 66 <traceId>
wd-cli obs spans|sessions|metrics|logs|summary 66
wd-cli score list 66
wd-cli score add 66 --data '{"traceId":"abc","name":"helpful","value":1}'automation / download-link
wd-cli automation list --session-id s-1
wd-cli automation create --session-id s-1 --data @task.json
wd-cli download-link create --data '{"path":"/data/report.xlsx"}'completion 补全
eval "$(wd-cli completion bash)" # bash,可写进 ~/.bashrc
wd-cli completion zsh > "${fpath[1]}/_wd-cli" # zshapi:通用逃生口
平台上了新端点、或某个端点还没包成子命令时,直接打:
wd-cli api /diwork/message-channels
wd-cli api /datasets/66 -f name=回归集 -F enabled=true -F size=100
wd-cli api /skills/import -F [email protected] -f skillType=personal
wd-cli api /skills/search -X GET -f q=report --paginate --output json
wd-cli api /evaluate/execute --input @run.json形态与 gh api 一致:-f 是字符串字段,-F 带类型推断且支持 @文件,--input 直接给请求体,--paginate 自动翻页。鉴权头和工作空间头照常带上。给了字段而没写 -X 时默认 POST,要放进 query 就显式 -X GET。
常见问题
提示「未登录,也未提供令牌」
执行 wd-cli auth login,或在 CI 里设 WD_CLI_TOKEN。
提示「尚未选定工作空间」
wd-cli workspace list 看一眼,再 wd-cli workspace use <id>。
提示「此命令需要工作空间令牌」 用的是应用访问密钥,但这条命令要工作空间令牌。换令牌,或干脆用登录态(登录态对所有命令都有效)。
登录时浏览器没打开
终端里已经把授权地址打出来了,手动复制到浏览器即可。也可以设 BROWSER 环境变量指定用哪个命令打开,或用 --no-browser。
unzip: command not found
skill install 需要系统的 unzip,先装上。
对话命令报 404
平台把对话端点和其余开放接口拆在不同域名时,设一下:wd-cli config set chatBaseUrl https://<对话域名>。
企业代理
当前不读 HTTPS_PROXY。需要经代理访问时,请在网络层解决。
给编码 agent 用
仓库里带了一份可直接加载的使用技能:docs/wd-cli/SKILL.md(相对仓库根是 docs/wd-cli/)。装到本地技能目录后,Claude Code / Codex 这类 agent 就知道该怎么用这个工具——包括几条它自己想不到的约束:
auth login会开浏览器并阻塞,agent 不能代跑,得引导用户自己执行。- 解析结果一律加
--output json;删除类命令必须带--yes,否则在非交互环境直接失败。 - 按退出码分诊(2 是用法错误、3 才是真的没权限),而不是猜 stderr 文本。
cp -r docs/wd-cli ~/.claude/skills/wd-cli # 或 ~/.agents/skills/wd-cli装好后重开会话才会被识别。
开发与发布
npm run lint # 语法检查
npm test # 全量测试,离线跑,不碰真实服务测试用进程内的 mock 平台与 mock 认证中心,跑的是真实入口进程,验的是退出码与标准输出 / 标准错误的实际分工。
发布到 npm 公共仓库(@dmall-inc/wd-cli,需 @dmall-inc 组织的发布权限):
npm login --registry https://registry.npmjs.org
npm version patch # 或 minor / major,改 package.json 的 version
npm publish --access public --registry https://registry.npmjs.org
npm view @dmall-inc/wd-cli version --registry https://registry.npmjs.org # 确认已上线scoped 包默认按私有发布,首次发布必须带 --access public。发布内容由 package.json 的 files 决定(bin、lib、docs、README.md),发布前可用 npm pack --dry-run 核对。
设计取舍与对标的项目(gh、gcloud、kubectl、AWS CLI、clig.dev)见 docs/design-references.md。
