@zan_team/cli 0.0.2 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,47 +1,24 @@
1
1
  # ZAN CLI
2
2
 
3
- ZAN CLI 是面向开发者、自动化脚本和 AI Agent 的统一命令行入口,提供安全认证、ZAN Project 管理与套餐用量查询、动态多链发现、EVM 与 Hyperliquid 只读查询,以及稳定的机器可读输出。
4
-
5
- > 当前状态:认证、Project、套餐用量、Network、EVM 与 Hyperliquid 只读查询已经实现。npm 包尚未发布,当前请使用源码构建方式运行。示例中的 `example.com` 地址仅为配置占位符。
3
+ ZAN CLI 是面向开发者、自动化脚本和 AI Agent 的统一命令行入口,提供安全认证、ZAN Project 管理与套餐用量查询、动态多链发现、EVM 与 Hyperliquid 查询、钱包管理与本地签名,以及稳定的机器可读输出。
6
4
 
7
5
  ## 快速开始
8
6
 
9
7
  ### 环境要求
10
8
 
11
9
  - Node.js 22 或更高版本。
12
- - 从源码构建时需要 pnpm 10。
10
+ - 可用的系统凭据库:macOS Keychain、Windows Credential Manager 或 Linux Secret Service。
13
11
 
14
12
  ### 安装
15
13
 
16
- npm 包发布后可以全局安装:
14
+ 使用 npm 全局安装:
17
15
 
18
16
  ```sh
19
17
  npm install --global @zan_team/cli
20
18
  zan --help
21
19
  ```
22
20
 
23
- 当前请在已检出的源码目录中安装并构建:
24
-
25
- ```sh
26
- pnpm install
27
- pnpm build
28
- node dist/cli.js --help
29
- ```
30
-
31
- 下文统一使用 `zan`。运行源码构建产物时,将 `zan` 替换为 `node dist/cli.js`。
32
-
33
- ### 配置服务地址
34
-
35
- CLI 未显式配置服务地址时默认连接生产环境 `https://zan.top`。也可以通过
36
- 环境变量覆盖 Auth/API Origin:
37
-
38
- ```sh
39
- export ZAN_AUTH_BASE_URL=https://auth.example.com
40
- export ZAN_API_BASE_URL=https://api.example.com
41
- ```
42
-
43
- 上述 `example.com` 地址仅用于展示配置方式,不能直接使用。日常使用无需覆盖
44
- 服务地址;内部环境地址和配置请通过授权渠道获取,不要写入公开文档或示例。
21
+ CLI 默认连接 ZAN 服务,无需配置服务地址。
45
22
 
46
23
  ### 登录
47
24
 
@@ -69,8 +46,7 @@ zan project active
69
46
  ```
70
47
 
71
48
  `project create` 不会自动切换当前 Project。使用返回或列表中的 Project ID 执行
72
- `project use`;CLI 会同时拉取该 Project 的 Network/Endpoint 列表并建立本地
73
- 加密缓存。
49
+ `project use` 将其设为默认项目。
74
50
 
75
51
  ### 查看当前项目用量
76
52
 
@@ -88,11 +64,11 @@ zan --json --no-interactive usage
88
64
 
89
65
  ```sh
90
66
  zan evm networks
91
- zan settings set network base-mainnet
67
+ zan settings set network <network-id>
92
68
  zan settings show
93
69
  ```
94
70
 
95
- Network ID 由 `evm networks` 返回。不要自行猜测 Network ID。
71
+ 将 `<network-id>` 替换为 `evm networks` 返回的 Network ID。
96
72
 
97
73
  ### 第一次查询
98
74
 
@@ -117,7 +93,7 @@ zan \
117
93
  --json \
118
94
  --no-interactive \
119
95
  --project <project-id> \
120
- --network base-mainnet \
96
+ --network <network-id> \
121
97
  evm rpc eth_blockNumber
122
98
  ```
123
99
 
@@ -127,7 +103,7 @@ zan \
127
103
 
128
104
  ### 安装与升级
129
105
 
130
- npm 包发布后:
106
+ 安装或升级到最新版本:
131
107
 
132
108
  ```sh
133
109
  npm install --global @zan_team/cli
@@ -135,18 +111,6 @@ npm update --global @zan_team/cli
135
111
  zan version
136
112
  ```
137
113
 
138
- 从源码构建:
139
-
140
- ```sh
141
- pnpm install
142
- pnpm typecheck
143
- pnpm test
144
- pnpm build
145
- node dist/cli.js version
146
- ```
147
-
148
- 维护者发布流程见 [发布指南](docs/releasing.md),首次发布使用 `pnpm run release -- --version=0.0.1`。
149
-
150
114
  ### 全局参数
151
115
 
152
116
  全局参数放在 `zan` 与子命令之间:
@@ -178,45 +142,14 @@ zan auth status --verify
178
142
  zan auth logout
179
143
  ```
180
144
 
181
- - `auth login` 获取正式授权、校验服务端 Session,并在本地保存身份与过期时间。
182
- - `--device-code` 适用于无浏览器或远程终端,并会展示可扫码授权的二维码。
183
- - `--force` 替换当前本地 Session。
184
- - `auth status` 读取登录时保存的本地状态;`--verify` 向 ZAN 重新验证并刷新
185
- Session 信息。默认输出仅包含邮箱、认证状态、当地时间(含时区)的过期时间和
186
- scopes;`--json` 保留完整状态字段和 ISO 格式时间。旧登录状态执行一次
187
- `auth status --verify` 补齐邮箱,之后普通 `auth status` 即可离线显示。
188
- - `auth logout` 撤销服务端 Token,并清理当前环境的本地凭据、Session、加密
189
- Endpoint 缓存、缓存密钥和 RPC API Key 覆盖。
145
+ - `auth login` 登录 ZAN 账号;`--device-code` 适用于无浏览器或远程终端。
146
+ - `--force` 替换当前登录状态。
147
+ - `auth status` 显示本地保存的邮箱、认证状态、过期时间和授权范围;
148
+ `--verify` 向 ZAN 验证登录状态并更新这些信息。
149
+ - `auth logout` 退出登录并清理本地登录凭据、项目缓存及项目 API Key。
190
150
 
191
- Refresh Token、Access Token 和 Access Token 过期时间仅存入系统凭据库。
192
- 不同 CLI 进程会复用剩余有效期超过 60 秒的 Access Token;需要续期时通过
193
- 用户目录下按凭据 Profile 隔离的跨进程锁协调一次 Refresh Token 轮换。
194
-
195
- 已认证的 Project 与 Network 请求遇到 Access Token 失效时,会静默刷新一次
196
- Token,并原样重放请求一次。重放会保留 method、path、body 和创建请求的幂等键,
197
- 同时替换 Authorization 并为新的网络尝试生成新的 Request ID。若 Refresh
198
- Session 已过期、撤销,或新 Access Token 仍被拒绝,CLI 返回:
199
-
200
- ```text
201
- AUTH_EXPIRED: Authentication has expired and could not be renewed.
202
- Hint: Run: zan auth login
203
- ```
204
-
205
- Scope 不足继续返回 `AUTH_REQUIRED`,不会做无意义刷新。CLI 不会自动打开浏览器
206
- 重新登录,避免打断脚本或 Agent;所有认证重试最多一次,不会循环。
207
-
208
- CLI 使用第一方账户权限 `account.profile:read`,不请求 `openid`、`profile`
209
- 或 OIDC ID Token。固定授权范围还包括 `offline_access`、
210
- `node-service.projects:read`、`node-service.projects:create` 和
211
- `node-service.rpc:read`。
212
-
213
- `GET /v1/api/cli-oauth/authorize` 是浏览器 Redirect/PKCE 入口。Device
214
- Authorization、Token 与 Revoke 使用同一 `/v1/api/cli-oauth/**` 前缀。
215
- `ZAN_AUTH_BASE_URL` 与 `ZAN_API_BASE_URL` 只配置 origin,不附加协议路径。
216
- OAuth 与 Session JSON 接口使用统一响应 envelope;CLI 只在 envelope 成功后
217
- 校验严格业务数据。`auth status --verify` 保存 `subject`、
218
- `displayName`、`email`、`scopes` 和 `expiresAt`,不传递、保存或显示 organization。
219
- 兼容尚未返回邮箱的旧后端;账户未提供邮箱时显示 `not available`。
151
+ 登录凭据保存在系统凭据库中。CLI 会尝试自动续期;若提示 `AUTH_EXPIRED`,请重新执行
152
+ `zan auth login`。非交互模式不会自动打开浏览器。
220
153
 
221
154
  ### Project 管理
222
155
 
@@ -229,11 +162,8 @@ zan project active
229
162
  ```
230
163
 
231
164
  - Project 名称不保证唯一,选择和设置始终使用 Project ID。
232
- - `project use` 会先验证 Project、刷新并加密保存 Endpoint 缓存,再写入本地
233
- 默认设置;刷新失败时不会切换 Project。
165
+ - `project use` 验证项目并更新可用网络后,将其设为默认项目;失败时保留原选择。
234
166
  - 使用 `--project <id>` 可以只覆盖当前命令,不修改本地设置。
235
- - Project 与 Network API 使用统一响应 envelope,解包后的业务 DTO 仍执行
236
- 严格校验;创建接口固定为 `POST /v1/api/cli/createProject`。
237
167
 
238
168
  ### 套餐与 Key 用量
239
169
 
@@ -244,7 +174,7 @@ zan --json --no-interactive usage
244
174
  ```
245
175
 
246
176
  默认查询当前 Project,选择优先级为 `--project` > `ZAN_PROJECT` > 本地设置。
247
- 无需 Network,不读取 Endpoint 缓存或测试 Key 覆盖,也不会导出 API Key。
177
+ 无需选择 Network,也不会导出 API Key。
248
178
  未选择 Project 时,交互终端会提示选择;非交互调用返回 `SETUP_REQUIRED`。
249
179
 
250
180
  输出示例:
@@ -265,7 +195,7 @@ Status: VALID / service ON
265
195
  ```
266
196
 
267
197
  `keyUsage` 是当前项目 Key 的累计消耗及单 Key 限额;`plan` 是所属账号共享的
268
- Node Service 套餐,余额与控制台使用相同口径:本地套餐读取履约用量,双百套餐读取资源包余额,包含有效加油包。
198
+ Node Service 套餐,余额与控制台使用相同口径,包含有效加油包。
269
199
  两者的统计范围不同,不能用单 Key 累计消耗减套餐总量。用量有计量延迟。
270
200
 
271
201
  对应的 `--json` 输出示例:
@@ -303,9 +233,8 @@ JSON 直接返回 `{ project, keyUsage, plan }`,额度字段为十进制整数
303
233
  `expiresAt` 是套餐到期时间,`refreshAt` 是当前权益周期刷新时间;未知时间为 `null`。
304
234
  耗尽时剩余量显示 `0`;已过期/关闭的套餐仍返回状态及到期时间,查询不会开通或续订套餐。
305
235
 
306
- 本期仅支持当前登录账号拥有的 `CHAIN_RPC` Project;无权访问、他人拥有或不存在的
307
- 项目统一返回 `PROJECT_NOT_FOUND`。后端需提供
308
- `GET /v1/api/cli/projects/{projectId}/usage`,沿用 `node-service.projects:read` Scope。
236
+ 用量查询支持当前登录账号拥有的 `CHAIN_RPC` Project。无权访问或不存在的项目返回
237
+ `PROJECT_NOT_FOUND`。
309
238
 
310
239
  ### Network 与本地设置
311
240
 
@@ -317,14 +246,11 @@ zan evm networks --search base
317
246
  zan evm networks --refresh
318
247
  ```
319
248
 
320
- 网络列表不要求原生币元数据完整。后端提供有效 EVM 网络、Chain ID 和 HTTPS
321
- Endpoint 时,即使 `nativeCurrency` 缺失也可以展示和执行普通 RPC;币种列显示
322
- `-`,JSON 中省略 `nativeCurrency`。`evm balance` 需要币种和精度,缺失时会提示
323
- 补齐服务端配置,也可以通过 `evm rpc eth_getBalance` 查询原始单位。
249
+ 网络列表中的币种显示为 `-` 时,仍可使用 `evm rpc` 查询。
250
+ `evm data balance` 需要币种信息;信息缺失时可用 `evm rpc eth_getBalance`
251
+ 查询以最小单位表示的余额。
324
252
 
325
- 未使用 `--refresh` 时,CLI 优先解密复用本地缓存,不会为了每条 EVM 命令重复
326
- 请求 Project 详情或 Network 列表。缓存缺失、密钥缺失或密文校验失败时会自动
327
- 重新拉取;RPC Endpoint 返回 HTTP 401/403 时会刷新一次并重试一次。
253
+ CLI 会缓存网络列表。需要获取最新列表时使用 `--refresh`。
328
254
 
329
255
  查看或清理当前 Project 的缓存:
330
256
 
@@ -333,45 +259,38 @@ zan project cache status
333
259
  zan project cache clear
334
260
  ```
335
261
 
336
- 缓存文件使用 AES-256-GCM 加密,独立随机密钥保存在系统凭据库。不同环境和
337
- Project 使用不同缓存文件与密钥。普通设置文件仍只保存 Project ID 和 Network
338
- ID,不保存 Endpoint 或 API Key。
262
+ #### 应用 API Key
339
263
 
340
- #### RPC API Key 覆盖
341
-
342
- 需要临时替换当前 Project 的 RPC API Key 时,通过隐藏输入或 stdin 写入系统
343
- 凭据库:
264
+ 仅通过 CLI 查询数据时无需导出 API Key。应用需要直接调用 ZAN API 时,在应用目录执行:
344
265
 
345
266
  ```sh
346
- zan project rpc-key set
347
- printf '%s\n' "$TEST_RPC_API_KEY" \
348
- | zan project rpc-key set --stdin
349
- zan project rpc-key status
350
- zan project rpc-key clear
267
+ zan project rpc-key pull
351
268
  ```
352
269
 
353
- 覆盖值不会出现在命令参数、普通配置、Endpoint 缓存或命令输出中。启用覆盖后,
354
- RPC 401/403 不会自动换回服务端下发的 Key,便于稳定测试指定 Key。
270
+ 命令将所选项目的 API Key 写入当前目录 `.env` 的 `ZAN_API_KEY`:文件不存在时创建,
271
+ 变量已存在时替换,否则追加。其他变量和其他环境配置文件保持不变,终端不显示 Key。
272
+
273
+ 未选择项目时会提示选择;非交互模式请使用 `--project <project-id>`。
274
+ 此命令无需选择 Network。
275
+
276
+ CLI 会尝试将 `.env` 加入 `.gitignore`;已有生效规则时不重复修改。若文件已被 Git
277
+ 跟踪,或忽略规则检查、更新失败,仍会写入并提示风险,JSON 输出中包含 `warnings`。
278
+ 提交代码前请确认 `.env` 不在暂存区,也不要将其打包或上传。
355
279
 
356
- 需要让当前目录中的应用使用当前 Project Key 时,可以直接拉取到 `.env`:
280
+ 如需为当前项目指定其他 RPC API Key,可使用隐藏输入:
357
281
 
358
282
  ```sh
359
- zan project rpc-key pull
283
+ zan project rpc-key set
284
+ zan project rpc-key status
285
+ zan project rpc-key clear
360
286
  ```
361
287
 
362
- 命令写入当前工作目录中固定的 `ZAN_API_KEY`:已存在时替换,缺少时追加,文件
363
- 不存在时创建。实际生效的测试覆盖 Key 优先,否则从加密 Endpoint 缓存中提取
364
- 服务端下发的 Project Key;不要求选择 Network。命令不接受 Key、stdin、变量名
365
- 或输出路径,也不会在人工输出、JSON 输出、错误或日志中包含 Key。新文件及更新
366
- 后的文件在 POSIX 系统上使用 `0600` 权限,并通过文件锁和原子替换写入;符号链接
367
- 或非普通 `.env` 会被拒绝。
288
+ `set --stdin` 支持从标准输入读取 Key。已配置的覆盖值优先用于 RPC 请求及 `pull`;
289
+ `clear` 清除覆盖值后恢复使用项目默认 Key。凭据保存在系统凭据库中。
368
290
 
369
- `pull` 只写 `.env`,不会修改其他环境配置文件。
370
- 它不会检查 Git 跟踪状态或自动更新 `.gitignore`,请自行确保 `.env`
371
- 不会被提交。写入后,任何拥有当前目录读取权限的进程或 Agent 都可能读取这个明文
372
- 文件;“不泄露”保证只覆盖该命令自身的参数、输出、错误和日志边界。
291
+ #### 默认 Project 和 Network
373
292
 
374
- 管理默认 Project 和 Network:
293
+ 管理默认选择:
375
294
 
376
295
  ```sh
377
296
  zan settings get project
@@ -395,7 +314,7 @@ Project 和 Network 的选择优先级:
395
314
  | ------------------------ | ------------------------------------- |
396
315
  | `ZAN_PROJECT` | 默认 Project ID |
397
316
  | `ZAN_NETWORK` | 默认 Network ID |
398
- | `ZAN_HOME` | 覆盖 CLI 数据目录,主要用于隔离和测试 |
317
+ | `ZAN_HOME` | 指定 CLI 数据目录 |
399
318
  | `ZAN_REQUEST_TIMEOUT_MS` | 默认请求超时 |
400
319
 
401
320
  非交互模式下缺少命令所需的 Project 或 Network 时,CLI 返回 `SETUP_REQUIRED`,不会显示选择器。
@@ -443,9 +362,7 @@ printf '["0x0000000000000000000000000000000000000000","latest"]' \
443
362
  ~/.zan-cli/config.yaml
444
363
  ```
445
364
 
446
- `~` 由操作系统用户目录 API 解析。该文件是个人 CLI 策略,与环境配置文件、
447
- `ZAN_ENV` 及所选 ZAN 后端环境无关;`ZAN_HOME` 不会改变它的位置,所有环境
448
- 读取同一个文件。
365
+ 该文件位于当前用户的主目录,对所有项目生效;`ZAN_HOME` 不改变此路径。
449
366
 
450
367
  YAML schema 支持两个顶层属性,分别控制 Raw JSON-RPC 和 Hyperliquid Info 方法:
451
368
 
@@ -464,17 +381,17 @@ allowedHyperliquidInfoMethods:
464
381
 
465
382
  条目是精确且大小写敏感的方法名(1–128 字符,匹配 `^[A-Za-z][A-Za-z0-9_.-]*$`),不允许重复,最多 256 条。不支持通配、前缀或正则。空列表会拒绝所有 Raw RPC 方法。文件必须是单个 YAML 文档且不超过 64 KiB;注释允许,重复键、别名、自定义标签和合并键会被拒绝。
466
383
 
467
- 第一次执行语法合法的 `zan evm rpc` 或 `zan hyperliquid info` 时,如果文件不存在,CLI 会自动创建它,并预填截至 2026-09-07 ZAN 文档中 113 条只读、模拟、诊断和过滤类 JSON-RPC 方法,以及 78 条 Hyperliquid Info 查询方法。默认内容只是创建模板:文件存在后,只有文件内容决定方法是否被允许,CLI 升级不会合并或覆盖已有文件。每次调用都会重新读取该文件,编辑后下一次调用立即生效。
384
+ 首次调用 `zan evm rpc` 或 `zan hyperliquid info` 时,若配置文件不存在,CLI 会创建默认查询方法列表。已有文件不会被升级覆盖;修改后在下一次调用生效。
468
385
 
469
- 旧版本生成、只有 `allowedRpcMethods` 的配置文件继续兼容:CLI 在内存中使用默认的 Hyperliquid Info 允许列表,不会自动改写用户文件。若要限制 Info 调用,请显式加入 `allowedHyperliquidInfoMethods`;空列表会拒绝所有 Info 方法。已有配置不会自动补入新增加的 `hl_*` JSON-RPC 方法,需要使用时请手动加入 `allowedRpcMethods`。
386
+ 旧版本生成、只有 `allowedRpcMethods` 的配置文件继续兼容:Hyperliquid Info 使用默认允许列表,不会自动改写用户文件。若要限制 Info 调用,请显式加入 `allowedHyperliquidInfoMethods`;空列表会拒绝所有 Info 方法。已有配置不会自动补入新增加的 `hl_*` JSON-RPC 方法,需要使用时请手动加入 `allowedRpcMethods`。
470
387
 
471
388
  允许列表不保证所选 Network 或套餐支持某个方法;RPC 错误仍然是最终依据。诊断和跟踪类读取可能消耗更多额度。
472
389
 
473
- > **警告**:默认列表是只读的,但加入 `eth_sendRawTransaction`、`avax.issueTx`、`personal_*` 或 `admin_*` 等方法后,CLI 会在不做方法级安全校验或确认的情况下直接分发这些方法。CLI 仍不实现交易构造、签名或任意 Endpoint 选择,但用户提供的已签名 payload 可能产生链上副作用。
390
+ > **警告**:默认列表是只读的,但加入 `eth_sendRawTransaction`、`avax.issueTx`、`personal_*` 或 `admin_*` 等方法后,CLI 会在不做方法级安全校验或确认的情况下直接分发这些方法。Raw RPC 命令不会替用户签名,但提交已签名交易可能产生链上状态变更。
474
391
 
475
- 方法不在允许列表中时,`zan evm rpc` 在认证、Project/Network 解析或任何网络请求之前即以 `INVALID_ARGS` 拒绝;文件损坏或权限不安全时返回 `SETUP_REQUIRED`。
392
+ 方法不在允许列表中时返回 `INVALID_ARGS`;配置文件损坏或权限不安全时返回 `SETUP_REQUIRED`。
476
393
 
477
- 内置查询命令(`evm data balance`、`evm tx`、`evm receipt`、`evm block`、`evm gas`、`evm logs`)不受该文件影响,始终使用其固定的内部只读 RPC 方法。
394
+ 内置查询命令(`evm data balance`、`evm tx`、`evm receipt`、`evm block`、`evm gas`、`evm logs`)不受该文件影响,使用固定的只读 RPC 方法。
478
395
 
479
396
  #### Hyperliquid
480
397
 
@@ -509,7 +426,7 @@ printf '{"user":"0x0000000000000000000000000000000000000000"}' \
509
426
  ```sh
510
427
  zan evm data balance 0x0000000000000000000000000000000000000000
511
428
  zan evm data balance 0x0000000000000000000000000000000000000000 --block latest
512
- zan --network base-mainnet evm data balance vitalik.eth
429
+ zan --network <network-id> evm data balance vitalik.eth
513
430
  ```
514
431
 
515
432
  ENS 通过同一 Project 的 `ethereum-mainnet` Network 解析,然后在目标 Network 查询余额。如果 Project 不支持 `ethereum-mainnet`,请改用十六进制地址。
@@ -530,7 +447,7 @@ zan evm block 0x1036640
530
447
 
531
448
  ```sh
532
449
  zan evm gas
533
- zan --json --network base-mainnet evm gas
450
+ zan --json --network <network-id> evm gas
534
451
  ```
535
452
 
536
453
  结果包含当前 Gas Price;节点支持时还包含 Priority Fee。
@@ -552,6 +469,46 @@ zan evm logs \
552
469
 
553
470
  当前版本返回原始日志,不执行 ABI 解码或分页。
554
471
 
472
+ ### 钱包与签名
473
+
474
+ 添加钱包时通过终端隐藏输入私钥,私钥保存在系统凭据库中:
475
+
476
+ ```sh
477
+ zan settings wallet add my-wallet
478
+ zan settings wallet list
479
+ zan settings wallet use my-wallet
480
+ ```
481
+
482
+ 使用当前钱包签署消息(EIP-191):
483
+
484
+ ```sh
485
+ zan sign "Hello ZAN"
486
+ zan sign "Hello ZAN" --account my-wallet
487
+ ```
488
+
489
+ 签署交易前需选择 Project 和 Network。以下命令仅生成已签名交易,不广播:
490
+
491
+ ```sh
492
+ zan evm tx sign --to <recipient-address> --value 0.01
493
+ ```
494
+
495
+ 可通过 `--nonce`、`--gas-limit`、`--max-fee-per-gas` 和 `--max-priority-fee-per-gas`
496
+ 指定交易字段,其中费用参数的单位为 Gwei。签名和已签名交易可能被用于授权或广播,
497
+ 请仅签署明确理解的内容。
498
+
499
+ 编码合约调用数据:
500
+
501
+ ```sh
502
+ zan evm contract encode --method 'balanceOf(address)' \
503
+ --args '["0x0000000000000000000000000000000000000000"]'
504
+ ```
505
+
506
+ 删除已保存的钱包:
507
+
508
+ ```sh
509
+ zan settings wallet remove my-wallet
510
+ ```
511
+
555
512
  ### 自动化与 JSON 输出
556
513
 
557
514
  推荐的自动化调用形式:
@@ -566,7 +523,7 @@ zan --json --no-interactive --project <project-id> --network <network-id> <comma
566
523
  zan --json --no-interactive --project <project-id> usage
567
524
  ```
568
525
 
569
- - 成功时,stdout 只包含一个完整 JSON 值。
526
+ - 成功时,stdout 只包含一个完整 JSON 值;部分命令可能同时向 stderr 输出风险警告。
570
527
  - 失败时,stderr 只包含一个完整 JSON 错误。
571
528
  - JSON 模式不输出进度提示。
572
529
  - 非交互模式不读取交互输入、不打开浏览器。
@@ -594,7 +551,7 @@ zan inspect
594
551
  zan --json --no-interactive inspect
595
552
  ```
596
553
 
597
- 获取从真实命令树生成的 Agent Manifest:
554
+ 获取 Agent 可读取的命令说明:
598
555
 
599
556
  ```sh
600
557
  zan agent manifest
@@ -606,11 +563,11 @@ Agent 可用 `inspect` 检查本地状态;`ready: false` 需结合实际命令
606
563
 
607
564
  ### Agent Skill
608
565
 
609
- 项目提供 [zan-cli Skill](skills/zan-cli/SKILL.md),包含实际 CLI 的调用约定、
566
+ CLI 随附 zan-cli Skill,包含命令使用说明、
610
567
  Project/Network 选择、套餐与 Key 用量、EVM/Hyperliquid 查询、RPC Key 拉取及钱包签名指引。
611
- `skills/` 随 npm 包发布;安装 CLI 后仍需将技能目录放入 Agent 的发现路径。
568
+ 安装 CLI 后,使用以下命令将 Skill 安装到 Agent 可发现的位置。
612
569
 
613
- npm 包发布后,安装 CLI 并选择 Agent 安装技能:
570
+ 选择 Agent 和安装范围:
614
571
 
615
572
  ```sh
616
573
  npm install -g @zan_team/cli
@@ -645,8 +602,7 @@ zan skills install --agent codex --global
645
602
  zan skills install --agent claude-code --global
646
603
  ```
647
604
 
648
- 安装目录中的 `.zan-cli-install.json` 记录版本和文件摘要,重复执行且内容未变时
649
- 返回 `unchanged`。升级会替换完整目录并移除旧版本不再提供的资源。已有目录未经
605
+ 重复执行且内容未变时返回 `unchanged`。升级会更新技能目录。已有目录未经
650
606
  本命令管理,或文件被手动修改、增加、删除时,默认保留原内容并提示冲突。
651
607
  先备份自己的修改,再用 `--force` 显式替换整个 `zan-cli` 技能目录:
652
608
 
@@ -654,20 +610,7 @@ zan skills install --agent claude-code --global
654
610
  zan skills install --agent codex --global --force
655
611
  ```
656
612
 
657
- 指向当前包内 Skill 的开发软链接会保留并返回 `linked`,其他软链接即使使用
658
- `--force` 也不会被覆盖。安装结果支持 `--json --no-interactive`,包含 Agent、
659
- 范围、版本、绝对目标路径以及 `installed` / `updated` / `unchanged` / `linked` 状态。
660
-
661
- 本地测试无需发布 npm;构建后在目标业务项目目录调用绝对路径:
662
-
663
- ```sh
664
- # 在 CLI 仓库构建
665
- pnpm build
666
-
667
- # 在目标业务项目目录执行,将路径替换为实际 CLI 仓库路径
668
- node /absolute/path/to/zan-cli/dist/cli.js skills install --agent claude-code
669
- node /absolute/path/to/zan-cli/dist/cli.js skills install --agent codex
670
- ```
613
+ 安装结果支持 `--json --no-interactive`。
671
614
 
672
615
  ### Shell 补全
673
616
 
@@ -696,49 +639,23 @@ zan completions fish
696
639
 
697
640
  只有限流、临时网络错误和服务端明确标记的临时错误适合自动重试。参数错误、认证拒绝和资源不存在不应自动重试。
698
641
 
699
- 第一方 CLI Auth 服务通过 WebResult 返回业务错误时,CLI 只按服务端发布的
700
- 精确错误码转换稳定错误语义:Device Flow 的等待、降速、拒绝和过期状态继续
701
- 由轮询流程处理;授权拒绝返回 `AUTH_DENIED`,Refresh Session 失效返回
702
- `AUTH_EXPIRED`,Scope 不足返回 `AUTH_REQUIRED`,Project 不存在返回
703
- `PROJECT_NOT_FOUND`。未纳入安全映射的正式错误码和未知错误码统一降级为
704
- `ZAN_API_ERROR`;服务端原始错误码和 message 不进入人工或 JSON 输出。
705
-
706
- 创建 Project 时,已发布的套餐错误(`W3S-019-5-B027` 至 `B032`)仍使用
707
- `ZAN_API_ERROR` 和退出码 `8`,但会明确提示免费套餐未配置、无领取资格、
708
- 初始化中、初始化失败、已有套餐不可用或 Project 数量超限。只有初始化中
709
- 标记为可重试;CLI 不会因此自动重复创建请求。
710
-
711
- 同名 Project 已存在(`W3S-019-5-B033`)时,CLI 会明确提示重名,并建议换一个
712
- 名称,或通过 `zan project list` 查找项目后执行 `zan project use <id>` 使用已有
713
- 项目;此错误不可重试,仍使用 `ZAN_API_ERROR` 和退出码 `8`。
714
-
715
- 已认证的 Project 与 Network 请求如果通过 HTTP 401 或已发布的 WebResult
716
- 语义表明 Access Token 无效,会刷新一次 Access Token 并重放一次请求。第二次
717
- 仍失败时返回 `AUTH_EXPIRED`,不会继续刷新。普通 HTTP 403 和 Scope 不足不会
718
- 触发刷新。该行为不适用于 OAuth、Device Flow 或原始 EVM JSON-RPC 请求。
642
+ 创建 Project 时若提示名称重复,可更换名称,或执行 `zan project list` 查找已有项目。
643
+ 套餐不可用或项目数量达到上限时,请根据错误提示检查账号套餐及项目状态。
719
644
 
720
645
  ### 安全注意事项
721
646
 
722
- - 对外文档、截图和问题反馈中不要包含内部开发、测试或预发域名、IP、端口及环境配置;
723
- 示例统一使用 `example.com` 等占位地址,分享命令输出前先检查并脱敏。
724
- - 不要把 Access Token、Refresh Token、Project Token 或完整 Endpoint 写入脚本、日志和普通配置。
725
- - 不要使用 `--verbose` 输出处理结果中的敏感字段。
726
- - 完整 RPC Endpoint 只在当前进程内解密使用;本地仅保存 AES-256-GCM 密文,
727
- 不进入命令输出、普通设置或错误信息。
728
- - 加密缓存主要防止配置文件、备份或日志意外泄露明文 Endpoint。它不能抵御已
729
- 同时取得本地文件和已解锁系统凭据库权限的恶意进程或系统管理员。
730
- - RPC API Key 覆盖值只通过隐藏输入或 stdin 写入系统凭据库,不要放入命令参数
731
- 或脚本源码。仅在应用确实需要时使用 `project rpc-key pull` 创建 `.env`,并确保
732
- 文件不进入版本控制、构建产物或日志。
733
- - 不要向 CLI 传入任意 RPC URL;Network 必须来自当前 Project。
734
- - 自动化应使用 `--json --no-interactive` 并分别解析 stdout、stderr 和退出码。
735
- - `--reveal` 只应在用户明确需要展示受保护结果字段时使用。
647
+ - 不要在聊天、问题反馈、日志或版本控制中包含私钥、API Key、登录凭据及含凭据的 RPC 地址。
648
+ - 仅在应用直接调用 ZAN API 时使用 `project rpc-key pull`,并妥善保管生成的 `.env`。
649
+ - 私钥和 API Key 使用隐藏输入或 stdin 传入,不要将真实值写在命令参数中。
650
+ - 自定义 RPC 允许列表可能开放写操作;执行前确认方法及参数的影响。
651
+ - 分享签名、已签名交易或查询结果前,确认其用途及接收方。
652
+ - 自动化调用使用 `--json --no-interactive`,同时检查退出码和风险警告。
736
653
 
737
654
  ### 常见问题
738
655
 
739
656
  **返回 `SETUP_REQUIRED`**
740
657
 
741
- 检查服务地址、当前 Project 和 Network:
658
+ 检查当前 Project、Network 和本地凭据状态:
742
659
 
743
660
  ```sh
744
661
  zan settings show
@@ -771,35 +688,4 @@ zan auth login
771
688
 
772
689
  Key 是项目的累计用量,套餐余额由账号下的项目共享,与控制台按套餐类型读取的余额一致。
773
690
  `Key limit: Not set` 表示未设置单 Key 限额,仍受套餐余额约束。
774
- `PROJECT_NOT_FOUND` 时检查当前环境及项目归属;本期不支持查询他人拥有的共享项目。
775
-
776
- ## 已实现能力
777
-
778
- - OAuth 2.1 PKCE 与 Device Flow 登录、刷新、验证和登出。
779
- - 系统凭据库、跨进程 Access Token 复用与 Refresh Token 安全轮换。
780
- - Project 管理、动态 Network 发现、加密 Endpoint 缓存与安全解析。
781
- - `zan usage` 查询当前 Project 的 Key 用量、共享套餐余额及到期时间。
782
- - Raw JSON-RPC、余额、ENS、交易、回执、区块、Gas 和日志查询。
783
- - 稳定 JSON 协议、退出码、统一脱敏、Agent Manifest 和 shell completions。
784
- - 单元、集成、CLI 黑盒、覆盖率和安装包冒烟测试。
785
-
786
- ## 架构与安全
787
-
788
- 命令层负责解析输入,认证、Session、Project、Network 和 EVM 查询由独立服务完成;HTTP、凭据库、文件存储、输出与错误映射位于可替换的基础设施边界。
789
-
790
- 完整 Network Endpoint 仅在进程内以明文用于 RPC 调用;持久化时使用
791
- AES-256-GCM 加密,密钥由系统凭据库单独保存,不进入命令输出或普通设置。
792
-
793
- ## 路线图
794
-
795
- - **Phase A**:认证、Session、设置、就绪检查、Agent Manifest 与 CLI 基础,已实现。
796
- - **Phase B**:Project 管理、选择与动态多链发现,已实现。
797
- - **Phase C**:动态多链 Endpoint、EVM 只读查询、ENS 与显式 stdin,已实现。
798
- - **后续阶段**:事件查询、钱包签名、支付、Webhook 与 MCP 集成。
799
-
800
- ## 文档
801
-
802
- - [ZAN CLI 设计规格](docs/superpowers/specs/2026-07-23-zan-cli-design-spec.md)
803
- - [Phase A 设计](docs/superpowers/specs/2026-07-23-phase-a-cli-auth-foundation-design.md)
804
- - [Phase B 设计](docs/superpowers/specs/2026-07-24-phase-b-project-dynamic-multichain-design.md)
805
- - [Phase C 设计](docs/superpowers/specs/2026-07-24-phase-c-evm-readonly-queries-design.md)
691
+ `PROJECT_NOT_FOUND` 时检查项目 ID 及项目归属;用量查询不支持他人拥有的项目。