npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@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

水滴平台的命令行工具。用统一身份登录一次,选定工作空间,就能在终端里访问平台上你看得到的技能、知识库、应用、会话、评测与可观测数据。

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 43

CI 与脚本:令牌直连

流水线里没法开浏览器,用令牌:

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 --yes

credential 凭证

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"     # zsh

api:通用逃生口

平台上了新端点、或某个端点还没包成子命令时,直接打:

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。