@zan_team/cli 0.0.3 → 0.0.6-beta.0

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,27 @@
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 / Solana / Hyperliquid 查询、助记词与钱包管理、本地签名、Solana 交易与 Trading Boost 加速,以及稳定的机器可读输出。
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。
11
+
12
+ macOS / Windows 需要安装 CLI 的可选原生凭据库依赖,安装时请保留 optional dependencies。通过命令行子进程传递秘密的备用凭据库实现已禁用;Linux 支持原生或通过 stdin 传入秘密的 Secret Service 实现。
13
13
 
14
14
  ### 安装
15
15
 
16
- npm 包发布后可以全局安装:
16
+ 使用 npm 全局安装:
17
17
 
18
18
  ```sh
19
19
  npm install --global @zan_team/cli
20
20
  zan --help
21
21
  ```
22
22
 
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
- 服务地址;内部环境地址和配置请通过授权渠道获取,不要写入公开文档或示例。
23
+ CLI 默认连接 ZAN 服务,无需配置服务地址。
24
+ 下文命令中的 `<project-id>`、`<solana-address>` 等是占位符,执行前请替换为实际值并去掉尖括号。
45
25
 
46
26
  ### 登录
47
27
 
@@ -69,8 +49,7 @@ zan project active
69
49
  ```
70
50
 
71
51
  `project create` 不会自动切换当前 Project。使用返回或列表中的 Project ID 执行
72
- `project use`;CLI 会同时拉取该 Project 的 Network/Endpoint 列表并建立本地
73
- 加密缓存。
52
+ `project use` 将其设为默认项目。
74
53
 
75
54
  ### 查看当前项目用量
76
55
 
@@ -88,11 +67,18 @@ zan --json --no-interactive usage
88
67
 
89
68
  ```sh
90
69
  zan evm networks
91
- zan settings set network base-mainnet
70
+ zan settings set network <network-id>
92
71
  zan settings show
93
72
  ```
94
73
 
95
- Network ID 由 `evm networks` 返回。不要自行猜测 Network ID。
74
+ 将 `<network-id>` 替换为 `evm networks` 返回的 Network ID。使用 Solana 时:
75
+
76
+ ```sh
77
+ zan solana networks
78
+ zan settings set network solana-testnet
79
+ ```
80
+
81
+ Solana 支持 `solana-testnet` 和 `solana-mainnet`。EVM 与 Solana 的默认 Network 分开保存。
96
82
 
97
83
  ### 第一次查询
98
84
 
@@ -108,6 +94,15 @@ zan evm data balance 0x0000000000000000000000000000000000000000
108
94
  zan evm rpc eth_blockNumber
109
95
  ```
110
96
 
97
+ Solana 查询示例:
98
+
99
+ ```sh
100
+ zan solana rpc getSlot
101
+ zan solana data balance <solana-address>
102
+ ```
103
+
104
+ 余额查询无需导入钱包。导入助记词、转账及加速的完整流程见[钱包与签名](#钱包与签名)和[Solana 交易与加速](#solana-交易与加速)。
105
+
111
106
  ### 脚本和 AI Agent
112
107
 
113
108
  自动化调用应显式关闭交互并使用 JSON 输出:
@@ -117,17 +112,17 @@ zan \
117
112
  --json \
118
113
  --no-interactive \
119
114
  --project <project-id> \
120
- --network base-mainnet \
115
+ --network <network-id> \
121
116
  evm rpc eth_blockNumber
122
117
  ```
123
118
 
124
- 成功结果写入 stdout,失败结果写入 stderr。脚本还应检查进程退出码。
119
+ 成功结果写入 stdout,失败结果写入 stderr。Solana 交易提交遇到失败或结果不确定时,还会在 stdout 保留交易结果;脚本应同时检查退出码,见[自动化与 JSON 输出](#自动化与-json-输出)。
125
120
 
126
121
  ## 完整使用指南
127
122
 
128
123
  ### 安装与升级
129
124
 
130
- npm 包发布后:
125
+ 安装或升级到最新版本:
131
126
 
132
127
  ```sh
133
128
  npm install --global @zan_team/cli
@@ -135,18 +130,6 @@ npm update --global @zan_team/cli
135
130
  zan version
136
131
  ```
137
132
 
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
133
  ### 全局参数
151
134
 
152
135
  全局参数放在 `zan` 与子命令之间:
@@ -178,45 +161,14 @@ zan auth status --verify
178
161
  zan auth logout
179
162
  ```
180
163
 
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 覆盖。
190
-
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;所有认证重试最多一次,不会循环。
164
+ - `auth login` 登录 ZAN 账号;`--device-code` 适用于无浏览器或远程终端。
165
+ - `--force` 替换当前登录状态。
166
+ - `auth status` 显示本地保存的邮箱、认证状态、过期时间和授权范围;
167
+ `--verify` 向 ZAN 验证登录状态并更新这些信息。
168
+ - `auth logout` 退出登录并清理本地登录凭据、项目缓存及项目 API Key。
207
169
 
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`。
170
+ 登录凭据保存在系统凭据库中。CLI 会尝试自动续期;若提示 `AUTH_EXPIRED`,请重新执行
171
+ `zan auth login`。非交互模式不会自动打开浏览器。
220
172
 
221
173
  ### Project 管理
222
174
 
@@ -229,11 +181,8 @@ zan project active
229
181
  ```
230
182
 
231
183
  - Project 名称不保证唯一,选择和设置始终使用 Project ID。
232
- - `project use` 会先验证 Project、刷新并加密保存 Endpoint 缓存,再写入本地
233
- 默认设置;刷新失败时不会切换 Project。
184
+ - `project use` 验证项目并更新可用网络后,将其设为默认项目;失败时保留原选择。
234
185
  - 使用 `--project <id>` 可以只覆盖当前命令,不修改本地设置。
235
- - Project 与 Network API 使用统一响应 envelope,解包后的业务 DTO 仍执行
236
- 严格校验;创建接口固定为 `POST /v1/api/cli/createProject`。
237
186
 
238
187
  ### 套餐与 Key 用量
239
188
 
@@ -244,7 +193,7 @@ zan --json --no-interactive usage
244
193
  ```
245
194
 
246
195
  默认查询当前 Project,选择优先级为 `--project` > `ZAN_PROJECT` > 本地设置。
247
- 无需 Network,不读取 Endpoint 缓存或测试 Key 覆盖,也不会导出 API Key。
196
+ 无需选择 Network,也不会导出 API Key。
248
197
  未选择 Project 时,交互终端会提示选择;非交互调用返回 `SETUP_REQUIRED`。
249
198
 
250
199
  输出示例:
@@ -265,7 +214,7 @@ Status: VALID / service ON
265
214
  ```
266
215
 
267
216
  `keyUsage` 是当前项目 Key 的累计消耗及单 Key 限额;`plan` 是所属账号共享的
268
- Node Service 套餐,余额与控制台使用相同口径:本地套餐读取履约用量,双百套餐读取资源包余额,包含有效加油包。
217
+ Node Service 套餐,余额与控制台使用相同口径,包含有效加油包。
269
218
  两者的统计范围不同,不能用单 Key 累计消耗减套餐总量。用量有计量延迟。
270
219
 
271
220
  对应的 `--json` 输出示例:
@@ -303,9 +252,8 @@ JSON 直接返回 `{ project, keyUsage, plan }`,额度字段为十进制整数
303
252
  `expiresAt` 是套餐到期时间,`refreshAt` 是当前权益周期刷新时间;未知时间为 `null`。
304
253
  耗尽时剩余量显示 `0`;已过期/关闭的套餐仍返回状态及到期时间,查询不会开通或续订套餐。
305
254
 
306
- 本期仅支持当前登录账号拥有的 `CHAIN_RPC` Project;无权访问、他人拥有或不存在的
307
- 项目统一返回 `PROJECT_NOT_FOUND`。后端需提供
308
- `GET /v1/api/cli/projects/{projectId}/usage`,沿用 `node-service.projects:read` Scope。
255
+ 用量查询支持当前登录账号拥有的 `CHAIN_RPC` Project。无权访问或不存在的项目返回
256
+ `PROJECT_NOT_FOUND`。
309
257
 
310
258
  ### Network 与本地设置
311
259
 
@@ -315,16 +263,18 @@ JSON 直接返回 `{ project, keyUsage, plan }`,额度字段为十进制整数
315
263
  zan evm networks
316
264
  zan evm networks --search base
317
265
  zan evm networks --refresh
266
+ zan solana networks
267
+ zan solana networks --search testnet
318
268
  ```
319
269
 
320
- 网络列表不要求原生币元数据完整。后端提供有效 EVM 网络、Chain ID 和 HTTPS
321
- Endpoint 时,即使 `nativeCurrency` 缺失也可以展示和执行普通 RPC;币种列显示
322
- `-`,JSON 中省略 `nativeCurrency`。`evm balance` 需要币种和精度,缺失时会提示
323
- 补齐服务端配置,也可以通过 `evm rpc eth_getBalance` 查询原始单位。
270
+ Solana 查询、交易与加速使用当前 Project 的 RPC Key;配置了 Key 覆盖值时使用该覆盖值。
271
+ 无需另建 Solana Project 或导出 Key 才能使用 CLI。
272
+
273
+ 网络列表中的币种显示为 `-` 时,仍可使用 `evm rpc` 查询。
274
+ `evm data balance` 需要币种信息;信息缺失时可用 `evm rpc eth_getBalance`
275
+ 查询以最小单位表示的余额。
324
276
 
325
- 未使用 `--refresh` 时,CLI 优先解密复用本地缓存,不会为了每条 EVM 命令重复
326
- 请求 Project 详情或 Network 列表。缓存缺失、密钥缺失或密文校验失败时会自动
327
- 重新拉取;RPC Endpoint 返回 HTTP 401/403 时会刷新一次并重试一次。
277
+ CLI 会缓存网络列表。需要获取最新列表时使用 `--refresh`。
328
278
 
329
279
  查看或清理当前 Project 的缓存:
330
280
 
@@ -333,72 +283,55 @@ zan project cache status
333
283
  zan project cache clear
334
284
  ```
335
285
 
336
- 缓存文件使用 AES-256-GCM 加密,独立随机密钥保存在系统凭据库。不同环境和
337
- Project 使用不同缓存文件与密钥。普通设置文件仍只保存 Project ID 和 Network
338
- ID,不保存 Endpoint 或 API Key。
339
-
340
- #### RPC API Key 覆盖
286
+ #### 应用 API Key
341
287
 
342
- 需要临时替换当前 Project 的 RPC API Key 时,通过隐藏输入或 stdin 写入系统
343
- 凭据库:
288
+ 仅通过 CLI 查询数据时无需导出 API Key。应用需要直接调用 ZAN API 时,在应用目录执行:
344
289
 
345
290
  ```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
291
+ zan project rpc-key pull
351
292
  ```
352
293
 
353
- 覆盖值不会出现在命令参数、普通配置、Endpoint 缓存或命令输出中。启用覆盖后,
354
- RPC 401/403 不会自动换回服务端下发的 Key,便于稳定测试指定 Key。
294
+ 命令将所选项目的 API Key 写入当前目录 `.env` 的 `ZAN_API_KEY`:文件不存在时创建,
295
+ 变量已存在时替换,否则追加。其他变量和其他环境配置文件保持不变,终端不显示 Key。
355
296
 
356
- 需要让当前目录中的应用使用当前 Project Key 时,可以直接拉取到 `.env`:
297
+ 未选择项目时会提示选择;非交互模式请使用 `--project <project-id>`。
298
+ 此命令无需选择 Network。
357
299
 
358
- ```sh
359
- zan project rpc-key pull
360
- ```
300
+ CLI 会尝试将 `.env` 加入 `.gitignore`;已有生效规则时不重复修改。若文件已被 Git
301
+ 跟踪,或忽略规则检查、更新失败,仍会写入并提示风险,JSON 输出中包含 `warnings`。
302
+ 提交代码前请确认 `.env` 不在暂存区,也不要将其打包或上传。
361
303
 
362
- 命令写入当前工作目录中固定的 `ZAN_API_KEY`:已存在时替换,缺少时追加,文件
363
- 不存在时创建。API Key 按环境和 Project ID 独立保存在系统凭据库(macOS Keychain
364
- 等),与 Endpoint 缓存的加密密钥、手动覆盖值分别存储。`pull` 优先使用手动覆盖值,
365
- 否则直接读取所选 Project 已保存的 API Key,不需要读取网络缓存或请求后端。
304
+ 如需为当前项目指定其他 RPC API Key,可使用隐藏输入:
366
305
 
367
- 首次缺失时,CLI 请求该 Project 的网络列表,从首个可识别的 RPC 地址提取 API Key
368
- 并保存到系统凭据库;现有后端接口通过地址携带 Key。刷新网络列表时同步更新保存的
369
- API Key,服务端不再返回可识别 Key 时移除旧记录。`zan project cache clear` 会同时
370
- 清理当前项目保存的 API Key;退出登录会清理当前环境各项目的 Key 和覆盖值。
371
-
372
- API Key 属于所选 Project,不要求选择 Network。未选择 Project 时,交互终端会
373
- 列出项目供选择,非交互模式需使用 `--project <id>` 或先执行 `zan project use <id>`。
374
- 命令不接受 Key、stdin、变量名
375
- 或输出路径,也不会在人工输出、JSON 输出、错误或日志中包含 Key。新文件及更新
376
- 后的文件在 POSIX 系统上使用 `0600` 权限,并通过文件锁和原子替换写入;符号链接
377
- 或非普通 `.env` 会被拒绝。
306
+ ```sh
307
+ zan project rpc-key set
308
+ zan project rpc-key status
309
+ zan project rpc-key clear
310
+ ```
378
311
 
379
- `pull` 会确保 `.env` 被 Git 忽略:已有生效规则(包括父目录、通配符和全局规则)时
380
- 不修改 `.gitignore`,否则在当前目录的 `.gitignore` 末尾追加 `/.env`。尚未初始化 Git
381
- 仓库的目录也支持此行为,不会自动创建项目仓库。此检查使用本机 Git;Git 不可用时会提示风险。
312
+ `set --stdin` 支持从标准输入读取 Key。已配置的覆盖值优先用于 RPC 请求及 `pull`;
313
+ `clear` 清除覆盖值后恢复使用项目默认 Key。凭据保存在系统凭据库中。
382
314
 
383
- 若 `.env` 已被 Git 跟踪,或无法检查、更新忽略规则,命令仍写入 Key,并在终端提示
384
- 误提交 Key 的风险;JSON 结果通过 `warnings` 返回同样的提示。已跟踪时可执行
385
- `git rm --cached -- .env` 取消跟踪,并在提交前检查暂存内容;CLI 不会自动修改 Git
386
- 索引,忽略规则也不能清除历史提交中的内容。其他环境配置文件不会被修改。
387
- 写入后,任何拥有当前目录读取权限的进程或 Agent 都可能读取这个明文
388
- 文件;“不泄露”保证只覆盖该命令自身的参数、输出、错误和日志边界。
315
+ #### 默认 Project 和 Network
389
316
 
390
- 管理默认 Project 和 Network:
317
+ 管理默认选择:
391
318
 
392
319
  ```sh
393
320
  zan settings get project
394
321
  zan settings get network
322
+ zan settings get solanaNetwork
395
323
  zan settings show
396
324
  zan settings set project <project-id>
397
325
  zan settings set network <network-id>
398
326
  zan settings clear network
327
+ zan settings clear solanaNetwork
399
328
  zan settings clear
400
329
  ```
401
330
 
331
+ `network` 表示 EVM 默认 Network,`solanaNetwork` 表示 Solana 默认 Network。
332
+ `settings set network solana-testnet` 会自动更新 Solana 默认值;设置 EVM Network 不会覆盖它。
333
+ 显式传入的 `--network` 或 `ZAN_NETWORK` 必须与命令所属链匹配。
334
+
402
335
  Project 和 Network 的选择优先级:
403
336
 
404
337
  ```text
@@ -411,7 +344,7 @@ Project 和 Network 的选择优先级:
411
344
  | ------------------------ | ------------------------------------- |
412
345
  | `ZAN_PROJECT` | 默认 Project ID |
413
346
  | `ZAN_NETWORK` | 默认 Network ID |
414
- | `ZAN_HOME` | 覆盖 CLI 数据目录,主要用于隔离和测试 |
347
+ | `ZAN_HOME` | 指定 CLI 数据目录 |
415
348
  | `ZAN_REQUEST_TIMEOUT_MS` | 默认请求超时 |
416
349
 
417
350
  非交互模式下缺少命令所需的 Project 或 Network 时,CLI 返回 `SETUP_REQUIRED`,不会显示选择器。
@@ -459,11 +392,9 @@ printf '["0x0000000000000000000000000000000000000000","latest"]' \
459
392
  ~/.zan-cli/config.yaml
460
393
  ```
461
394
 
462
- `~` 由操作系统用户目录 API 解析。该文件是个人 CLI 策略,与环境配置文件、
463
- `ZAN_ENV` 及所选 ZAN 后端环境无关;`ZAN_HOME` 不会改变它的位置,所有环境
464
- 读取同一个文件。
395
+ 该文件位于当前用户的主目录,对所有项目生效;`ZAN_HOME` 不改变此路径。
465
396
 
466
- YAML schema 支持两个顶层属性,分别控制 Raw JSON-RPC 和 Hyperliquid Info 方法:
397
+ YAML schema 支持三个顶层属性,分别控制 EVM Raw JSON-RPC、Hyperliquid Info 和 Solana Raw JSON-RPC 方法:
467
398
 
468
399
  ```yaml
469
400
  allowedRpcMethods:
@@ -476,21 +407,26 @@ allowedHyperliquidInfoMethods:
476
407
  - meta
477
408
  - activeAssetData
478
409
  - userFills
410
+ allowedSolanaRpcMethods:
411
+ - getSlot
412
+ - getBalance
413
+ - getAccountInfo
414
+ - getTransaction
479
415
  ```
480
416
 
481
- 条目是精确且大小写敏感的方法名(1–128 字符,匹配 `^[A-Za-z][A-Za-z0-9_.-]*$`),不允许重复,最多 256 条。不支持通配、前缀或正则。空列表会拒绝所有 Raw RPC 方法。文件必须是单个 YAML 文档且不超过 64 KiB;注释允许,重复键、别名、自定义标签和合并键会被拒绝。
417
+ 条目是精确且大小写敏感的方法名(1–128 字符,匹配 `^[A-Za-z][A-Za-z0-9_.-]*$`),不允许重复,最多 256 条。不支持通配、前缀或正则。空列表会拒绝对应类别的所有 Raw 方法。文件必须是单个 YAML 文档且不超过 64 KiB;注释允许,重复键、别名、自定义标签和合并键会被拒绝。
482
418
 
483
- 第一次执行语法合法的 `zan evm rpc` 或 `zan hyperliquid info` 时,如果文件不存在,CLI 会自动创建它,并预填截至 2026-09-07 ZAN 文档中 113 条只读、模拟、诊断和过滤类 JSON-RPC 方法,以及 78 条 Hyperliquid Info 查询方法。默认内容只是创建模板:文件存在后,只有文件内容决定方法是否被允许,CLI 升级不会合并或覆盖已有文件。每次调用都会重新读取该文件,编辑后下一次调用立即生效。
419
+ 首次调用 `zan evm rpc`、`zan hyperliquid info` 或 `zan solana rpc` 时,若配置文件不存在,CLI 会创建默认查询方法列表。已有文件不会被升级覆盖;修改后在下一次调用生效。
484
420
 
485
- 旧版本生成、只有 `allowedRpcMethods` 的配置文件继续兼容:CLI 在内存中使用默认的 Hyperliquid Info 允许列表,不会自动改写用户文件。若要限制 Info 调用,请显式加入 `allowedHyperliquidInfoMethods`;空列表会拒绝所有 Info 方法。已有配置不会自动补入新增加的 `hl_*` JSON-RPC 方法,需要使用时请手动加入 `allowedRpcMethods`。
421
+ 旧版本配置继续兼容:缺少 `allowedHyperliquidInfoMethods` 或 `allowedSolanaRpcMethods` 时,对应命令使用默认允许列表,不会自动改写用户文件。可显式加入对应属性限制方法;空列表拒绝该类 Raw 调用。已有配置不会自动补入新增加的 `hl_*` JSON-RPC 方法,需要使用时请手动加入 `allowedRpcMethods`。
486
422
 
487
423
  允许列表不保证所选 Network 或套餐支持某个方法;RPC 错误仍然是最终依据。诊断和跟踪类读取可能消耗更多额度。
488
424
 
489
- > **警告**:默认列表是只读的,但加入 `eth_sendRawTransaction`、`avax.issueTx`、`personal_*` 或 `admin_*` 等方法后,CLI 会在不做方法级安全校验或确认的情况下直接分发这些方法。CLI 仍不实现交易构造、签名或任意 Endpoint 选择,但用户提供的已签名 payload 可能产生链上副作用。
425
+ > **警告**:默认列表是只读的,但加入 `eth_sendRawTransaction`、`avax.issueTx`、`personal_*` 或 `admin_*` 等方法后,CLI 会在不做方法级安全校验或确认的情况下直接分发这些方法。Raw RPC 命令不会替用户签名,但提交已签名交易可能产生链上状态变更。
490
426
 
491
- 方法不在允许列表中时,`zan evm rpc` 在认证、Project/Network 解析或任何网络请求之前即以 `INVALID_ARGS` 拒绝;文件损坏或权限不安全时返回 `SETUP_REQUIRED`。
427
+ 方法不在允许列表中时返回 `INVALID_ARGS`;配置文件损坏或权限不安全时返回 `SETUP_REQUIRED`。
492
428
 
493
- 内置查询命令(`evm data balance`、`evm tx`、`evm receipt`、`evm block`、`evm gas`、`evm logs`)不受该文件影响,始终使用其固定的内部只读 RPC 方法。
429
+ 内置查询命令(`evm data balance`、`evm tx`、`evm receipt`、`evm block`、`evm gas`、`evm logs`)不受该文件影响,使用固定的只读 RPC 方法。
494
430
 
495
431
  #### Hyperliquid
496
432
 
@@ -525,7 +461,7 @@ printf '{"user":"0x0000000000000000000000000000000000000000"}' \
525
461
  ```sh
526
462
  zan evm data balance 0x0000000000000000000000000000000000000000
527
463
  zan evm data balance 0x0000000000000000000000000000000000000000 --block latest
528
- zan --network base-mainnet evm data balance vitalik.eth
464
+ zan --network <network-id> evm data balance vitalik.eth
529
465
  ```
530
466
 
531
467
  ENS 通过同一 Project 的 `ethereum-mainnet` Network 解析,然后在目标 Network 查询余额。如果 Project 不支持 `ethereum-mainnet`,请改用十六进制地址。
@@ -546,7 +482,7 @@ zan evm block 0x1036640
546
482
 
547
483
  ```sh
548
484
  zan evm gas
549
- zan --json --network base-mainnet evm gas
485
+ zan --json --network <network-id> evm gas
550
486
  ```
551
487
 
552
488
  结果包含当前 Gas Price;节点支持时还包含 Priority Fee。
@@ -568,6 +504,233 @@ zan evm logs \
568
504
 
569
505
  当前版本返回原始日志,不执行 ABI 解码或分页。
570
506
 
507
+ ### Solana 查询
508
+
509
+ 登录并选择 Project 后,设置 Solana Network:
510
+
511
+ ```sh
512
+ zan settings set network solana-testnet
513
+ zan inspect --family solana
514
+ ```
515
+
516
+ 常用查询无需本地钱包:
517
+
518
+ ```sh
519
+ zan solana data balance <solana-address>
520
+ zan solana data tokens <owner-address>
521
+ zan solana account <solana-address>
522
+ zan solana tx <transaction-signature>
523
+ zan solana tx status <transaction-signature>
524
+ zan solana block <slot>
525
+ zan solana fees
526
+ ```
527
+
528
+ `data tokens` 同时查询 SPL Token 和 Token-2022 账户。余额中的 lamports 和代币原始数量使用精确十进制字符串,避免大整数精度丢失。`fees` 返回近期优先费采样,单位为 micro-lamports / CU,不能直接当作整笔交易费用。
529
+
530
+ 余额、代币和账户查询支持 `--commitment processed|confirmed|finalized`,默认 `confirmed`;交易和区块查询支持 `confirmed|finalized`。
531
+
532
+ Raw JSON-RPC 的位置参数同样必须是合法 JSON:
533
+
534
+ ```sh
535
+ zan solana rpc getSlot
536
+ zan solana rpc getBalance '"<solana-address>"' '{"commitment":"confirmed"}'
537
+ ```
538
+
539
+ 也可通过 `--stdin` 读取一个 JSON 参数数组,不能同时传位置参数。
540
+ `allowedSolanaRpcMethods` 控制 Raw 查询;即使加入允许列表,`sendTransaction`、`requestAirdrop` 和 `simulateTransaction` 仍不能通过 `solana rpc` 执行。交易模拟使用 `solana tx simulate`,提交使用下面的交易命令。内置查询命令使用固定只读方法,不受允许列表影响。
541
+
542
+ ### 钱包与签名
543
+
544
+ 钱包操作在本地完成,无需登录或选择 Project / Network。交互提示使用英文,秘密通过终端隐藏输入,保存在系统凭据库中。
545
+
546
+ #### 导入助记词与派生账户
547
+
548
+ 导入 BIP39 助记词无需指定链,同一来源可派生 EVM 和 Solana 账户:
549
+
550
+ ```sh
551
+ zan settings wallet add main --mnemonic
552
+ zan settings wallet list
553
+ zan settings wallet use main
554
+ ```
555
+
556
+ 在隐藏输入提示中一次性输入完整助记词,所有单词放在同一行,单词之间用空格分隔,全部输入完成后按 Enter。使用 `--mnemonic --stdin` 时也使用同样的单行格式。
557
+ CLI 检查单词数量(12、15、18、21 或 24)、BIP39 词表和校验和。交互输入无效时显示英文错误原因并让用户重新输入,可按 Ctrl+C 取消;stdin 输入无效时返回错误,不进入交互重试。错误不会回显助记词。
558
+ 默认导入第一个账户(Account 1,index 0),不显示账户选择。CLI 会预览两条链的公开地址和派生路径,确认后保存助记词;后续需要新增账户时使用 `wallet derive`。
559
+ 如原钱包使用了 BIP39 passphrase,导入时增加 `--passphrase-prompt`,在隐藏提示中输入。
560
+
561
+ 从已保存助记词添加第二个账户:
562
+
563
+ ```sh
564
+ zan settings wallet derive main --index 1 --alias trading
565
+ zan settings wallet use trading --chain solana
566
+ ```
567
+
568
+ `--index` 从 0 开始,`1` 表示 Account 2。默认派生路径为 EVM 的 `m/44'/60'/0'/0/<index>` 和 Solana 的 `m/44'/501'/<index>'/0'`。
569
+ 已有钱包地址使用其他路径时,可通过 `--evm-path` / `--solana-path` 指定;自定义路径不能与 `--index` 同用,Solana 路径每一级须使用带 `'` 的加固派生。导入后请核对地址与原钱包一致。
570
+
571
+ `wallet use <alias>` 为别名包含的链设置默认账户,`--chain solana` 或 `--chain evm` 只修改一条链。默认账户分别保存。
572
+
573
+ #### 导入单链私钥
574
+
575
+ 也可运行 `zan settings wallet add <alias>`,按英文提示选择导入方式,或显式指定:
576
+
577
+ ```sh
578
+ zan settings wallet add evm-wallet --chain evm
579
+ zan settings wallet add solana-wallet --chain solana
580
+ zan settings wallet add solana-file --keypair-file /path/to/keypair.json
581
+ ```
582
+
583
+ Solana 私钥支持 Base58 编码的 64 字节 secret key,或包含 64 个字节整数的 JSON keypair 文件。
584
+ `--stdin` 从标准输入读取秘密;使用 `--stdin` 时省略 `--mnemonic` 和 `--chain` 会沿用 EVM 私钥格式。不要将真实助记词、passphrase 或私钥放入命令参数、聊天或日志。
585
+
586
+ #### 消息与 EVM 交易签名
587
+
588
+ 使用默认账户或指定别名签署消息:
589
+
590
+ ```sh
591
+ zan sign "Hello ZAN"
592
+ zan sign "Hello ZAN" --account main
593
+ zan solana sign "Hello ZAN" --account main
594
+ ```
595
+
596
+ `zan sign` 使用 EVM EIP-191,`zan solana sign` 使用 Solana Ed25519。消息默认按 UTF-8 编码;`--hex` 按十六进制字节解释。消息签名无需网络连接,也不会广播交易。
597
+
598
+ 签署交易前需选择 Project 和 Network。以下命令仅生成已签名交易,不广播:
599
+
600
+ ```sh
601
+ zan evm tx sign --to <recipient-address> --value 0.01
602
+ ```
603
+
604
+ 可通过 `--nonce`、`--gas-limit`、`--max-fee-per-gas` 和 `--max-priority-fee-per-gas`
605
+ 指定交易字段,其中费用参数的单位为 Gwei。签名和已签名交易可能被用于授权或广播,
606
+ 请仅签署明确理解的内容。
607
+
608
+ 编码合约调用数据:
609
+
610
+ ```sh
611
+ zan evm contract encode --method 'balanceOf(address)' \
612
+ --args '["0x0000000000000000000000000000000000000000"]'
613
+ ```
614
+
615
+ 删除已保存的钱包:
616
+
617
+ ```sh
618
+ zan settings wallet remove trading
619
+ ```
620
+
621
+ 删除一个派生账户不会删除其他账户仍引用的助记词来源。
622
+
623
+ ### Solana 交易与加速
624
+
625
+ #### SOL 转账
626
+
627
+ 先导入钱包、登录并选择 Project,再在测试网尝试转账。发送方需要测试网 SOL 支付金额和网络费用:
628
+
629
+ ```sh
630
+ zan --network solana-testnet solana transfer \
631
+ --to <recipient-address> --amount 0.01 --account main --wait
632
+ ```
633
+
634
+ CLI 准备交易、模拟并预览收款方、金额、指令和费用,确认后才本地签名并提交。取消确认不会签名或发送。
635
+ 金额使用 SOL 十进制表示,最多 9 位小数,不接受科学计数法。
636
+ 默认使用普通 RPC;加速需要显式选择付费模式。
637
+
638
+ `--wait` 等待 `confirmed`,可用 `--commitment finalized` 等待最终确认;不加 `--wait` 时提交后返回。
639
+ `--wait-timeout <ms>` 控制总等待时间,默认 60000;全局 `--timeout` 控制单次请求超时。
640
+ 默认执行模拟和 RPC preflight,`--skip-preflight` 显式跳过两者。
641
+
642
+ #### 通用交易:构建、检查、模拟、签名和提交
643
+
644
+ 选择目标 Solana Network 后,可从指令文件构建交易,或使用外部生成的 Base64 交易文件:
645
+
646
+ ```sh
647
+ zan settings set network solana-testnet
648
+ zan solana tx build --instructions-file instructions.json --account main --out unsigned.base64
649
+ zan solana tx inspect --file unsigned.base64
650
+ zan solana tx inspect --file unsigned.base64 --online
651
+ zan solana tx simulate --file unsigned.base64
652
+ zan solana tx sign --file unsigned.base64 --account main --out signed.base64
653
+ zan solana tx send --file signed.base64 --wait
654
+ ```
655
+
656
+ `instructions.json` 的格式如下;将占位符替换为程序文档或 SDK 生成的地址与指令数据:
657
+
658
+ ```json
659
+ {
660
+ "version": 0,
661
+ "instructions": [
662
+ {
663
+ "programAddress": "<program-address>",
664
+ "accounts": [
665
+ { "address": "<account-address>", "isSigner": false, "isWritable": true }
666
+ ],
667
+ "dataBase64": "<canonical-base64>"
668
+ }
669
+ ],
670
+ "lookupTableAddresses": []
671
+ }
672
+ ```
673
+
674
+ 支持 `"legacy"` 和 `0` 两种版本;地址查找表使用 v0。CLI 不内置 SPL 转账、Swap 或 Anchor 指令编码,应使用对应程序的 SDK 生成数据。
675
+ 构建时也可用 `--payer <address>` 替代 `--account`,无需本地钱包。
676
+
677
+ 基本检查和 `tx sign` 离线完成,无需登录或 RPC。使用地址查找表时,`inspect --online` 可解析完整账户;离线检查可能不完整。
678
+ 签名只添加当前账户的签名,保留原消息、已有签名和 blockhash;多签交易需逐个签署必需账户。
679
+ `tx send` 要求全部签名有效,可提交外部已签名交易,无需本地钱包。
680
+ 模拟成功仅表示本次模拟通过。已有签名在本地校验,结果标记 `signatureVerificationScope: local`;未签名或部分签名交易会标记未完成全部签名验证。发送给 RPC 的模拟副本会清除全部签名,保留原消息,原交易文件保持不变,避免模拟时披露可广播的交易。
681
+
682
+ 生成的 Base64 文件附带公开的 `<file>.metadata.json`,记录关联网络和交易有效期信息;移动文件时请一起保留。输出文件已存在时不会覆盖。
683
+ 外部交易文件不会被自动改写、补指令或刷新 blockhash。
684
+
685
+ #### Trading Boost:Tips 与 Points
686
+
687
+ 加速仅支持 `solana-mainnet`。先查看当前 Project 和 Network 的能力说明:
688
+
689
+ ```sh
690
+ zan --network solana-mainnet solana boost status
691
+ ```
692
+
693
+ | 模式 | 选择参数 | 额外费用 |
694
+ | --- | --- | --- |
695
+ | 普通 RPC(默认) | `--boost rpc` 或省略 | 无加速费用,仍支付网络费用 |
696
+ | Tips | `--boost tips --tip-sol 0.0003` | 钱包支付 SOL tip,最低及默认值为 0.0003 SOL |
697
+ | Points | `--boost points --tier standard\|turbo\|prime` | 每次提交对应 1 / 3 / 5 Points,仍支付网络费用 |
698
+
699
+ 选择一种模式发送:
700
+
701
+ ```sh
702
+ # Tips
703
+ zan --network solana-mainnet solana transfer \
704
+ --to <recipient-address> --amount 0.01 --account main \
705
+ --boost tips --tip-sol 0.0003 --region sg --wait
706
+
707
+ # Points
708
+ zan --network solana-mainnet solana transfer \
709
+ --to <recipient-address> --amount 0.01 --account main \
710
+ --boost points --tier turbo --wait
711
+ ```
712
+
713
+ Tips 的区域可选 `sg`(默认)、`global`、`hk`、`de`、`us`;Points 使用 `global` 路由。
714
+ Points 未指定 tier 时,交互模式提示选择;非交互模式必须显式指定。
715
+ 当前 CLI 不提供 Points 余额、过期时间和权限的确定查询,`boost status` 中的 unknown / unavailable 不表示余额为零,实际权限和额度由服务校验。
716
+
717
+ 已有交易也可通过 `tx send --boost points --tier turbo` 提交。
718
+ 使用 Tips 时须在签名前准备 tip,例如 `tx build --boost tips`;外部已签名交易必须已包含足额 tip,否则拒绝发送。Points 不会删除交易中已有的 SOL tip。
719
+ `--anti-mev` 可在构建或转账签名前加入保护账户;外部已签名交易须预先包含该账户才能使用此选项。
720
+ 模拟、费用查询和确认查询仍使用普通 RPC。付费提交不保证加速或 Anti-MEV 效果,链上确认也不代表已取得加速回执。
721
+
722
+ #### 交易结果与恢复
723
+
724
+ 结果区分 `submitted`、`confirmed`、`finalized`、`failed`、`expired`、`unknown`。
725
+ 等待超时或网络中断时,按结果中的 `recoveryCommand` 查询;它固定本次 Project、Network 和签名:
726
+
727
+ ```sh
728
+ zan --project <project-id> --network <original-network-id> solana tx status <transaction-signature>
729
+ ```
730
+
731
+ 示例中的网络应与原交易一致。`unknown` 表示执行结果尚未确定,不能据此重新转账;历史查询暂未找到也不能证明未执行。
732
+ CLI 不会自动重签、切换加速模式或发送替代交易。确认期间第一次 Ctrl+C 会保留已知签名和结果,退出码仍为 130。
733
+
571
734
  ### 自动化与 JSON 输出
572
735
 
573
736
  推荐的自动化调用形式:
@@ -582,11 +745,21 @@ zan --json --no-interactive --project <project-id> --network <network-id> <comma
582
745
  zan --json --no-interactive --project <project-id> usage
583
746
  ```
584
747
 
585
- - 成功时,stdout 只包含一个完整 JSON 值。
748
+ - 成功时,stdout 只包含一个完整 JSON 值;部分命令可能同时向 stderr 输出风险警告。
586
749
  - 失败时,stderr 只包含一个完整 JSON 错误。
750
+ - Solana 交易提交返回 `failed` / `expired` / `unknown` 时,stdout 还保留交易结果和恢复命令。前两者退出码为 7,`unknown` 为 6 且不可自动重试;不要仅凭 stdout 有结果判断成功。
587
751
  - JSON 模式不输出进度提示。
588
752
  - 非交互模式不读取交互输入、不打开浏览器。
589
- - 显式的 `evm rpc --stdin` 仍会读取作为命令数据的 stdin。
753
+ - 显式的 `evm rpc --stdin`、`solana rpc --stdin` 和钱包导入 `--stdin` 仍会读取作为命令数据的 stdin。
754
+
755
+ 自动化提交 Solana 交易必须使用 `--yes` 明确授权本次广播。例如,已确认网络、收款方、金额和账户后:
756
+
757
+ ```sh
758
+ zan --json --no-interactive --project <project-id> --network solana-testnet \
759
+ solana transfer --to <recipient-address> --amount 0.01 --account main --yes --wait
760
+ ```
761
+
762
+ 签名授权不等于广播授权。Agent 应在用户授权的范围内使用 `--yes`;Points 模式还必须指定 `--tier`。
590
763
 
591
764
  错误示例:
592
765
 
@@ -608,9 +781,10 @@ zan --json --no-interactive --project <project-id> usage
608
781
  ```sh
609
782
  zan inspect
610
783
  zan --json --no-interactive inspect
784
+ zan inspect --family solana
611
785
  ```
612
786
 
613
- 获取从真实命令树生成的 Agent Manifest:
787
+ 获取 Agent 可读取的命令说明:
614
788
 
615
789
  ```sh
616
790
  zan agent manifest
@@ -619,14 +793,15 @@ zan --json --no-interactive agent manifest
619
793
 
620
794
  Agent 可用 `inspect` 检查本地状态;`ready: false` 需结合实际命令判断。
621
795
  例如缺少 Network 不影响已登录且已选择 Project 的 `usage` 查询。
796
+ `inspect --family solana` 检查 Solana 的就绪状态;余额查询无需钱包,本地消息签名和离线交易签名无需登录或 Network。
622
797
 
623
798
  ### Agent Skill
624
799
 
625
- 项目提供 [zan-cli Skill](skills/zan-cli/SKILL.md),包含实际 CLI 的调用约定、
626
- Project/Network 选择、套餐与 Key 用量、EVM/Hyperliquid 查询、RPC Key 拉取及钱包签名指引。
627
- `skills/` 随 npm 包发布;安装 CLI 后仍需将技能目录放入 Agent 的发现路径。
800
+ CLI 随附 zan-cli Skill,包含命令使用说明、
801
+ Project/Network 选择、套餐与 Key 用量、EVM / Solana / Hyperliquid 查询、RPC Key 拉取、助记词派生、钱包签名及 Solana 交易与 Trading Boost 指引。
802
+ 安装 CLI 后,使用以下命令将 Skill 安装到 Agent 可发现的位置。
628
803
 
629
- npm 包发布后,安装 CLI 并选择 Agent 安装技能:
804
+ 选择 Agent 和安装范围:
630
805
 
631
806
  ```sh
632
807
  npm install -g @zan_team/cli
@@ -661,8 +836,7 @@ zan skills install --agent codex --global
661
836
  zan skills install --agent claude-code --global
662
837
  ```
663
838
 
664
- 安装目录中的 `.zan-cli-install.json` 记录版本和文件摘要,重复执行且内容未变时
665
- 返回 `unchanged`。升级会替换完整目录并移除旧版本不再提供的资源。已有目录未经
839
+ 重复执行且内容未变时返回 `unchanged`。升级会更新技能目录。已有目录未经
666
840
  本命令管理,或文件被手动修改、增加、删除时,默认保留原内容并提示冲突。
667
841
  先备份自己的修改,再用 `--force` 显式替换整个 `zan-cli` 技能目录:
668
842
 
@@ -670,20 +844,7 @@ zan skills install --agent claude-code --global
670
844
  zan skills install --agent codex --global --force
671
845
  ```
672
846
 
673
- 指向当前包内 Skill 的开发软链接会保留并返回 `linked`,其他软链接即使使用
674
- `--force` 也不会被覆盖。安装结果支持 `--json --no-interactive`,包含 Agent、
675
- 范围、版本、绝对目标路径以及 `installed` / `updated` / `unchanged` / `linked` 状态。
676
-
677
- 本地测试无需发布 npm;构建后在目标业务项目目录调用绝对路径:
678
-
679
- ```sh
680
- # 在 CLI 仓库构建
681
- pnpm build
682
-
683
- # 在目标业务项目目录执行,将路径替换为实际 CLI 仓库路径
684
- node /absolute/path/to/zan-cli/dist/cli.js skills install --agent claude-code
685
- node /absolute/path/to/zan-cli/dist/cli.js skills install --agent codex
686
- ```
847
+ 安装结果支持 `--json --no-interactive`。
687
848
 
688
849
  ### Shell 补全
689
850
 
@@ -705,56 +866,30 @@ zan completions fish
705
866
  | `3` | 认证、凭据库或必要设置缺失 |
706
867
  | `4` | Project、Network、ENS 名称或查询资源不存在 |
707
868
  | `5` | 限流 |
708
- | `6` | 网络错误 |
709
- | `7` | JSON-RPC 错误 |
869
+ | `6` | 网络错误或 Solana 提交结果不确定 |
870
+ | `7` | JSON-RPC 错误或 Solana 交易失败、过期 |
710
871
  | `8` | ZAN CLI API 错误 |
711
872
  | `130` | 用户中断 |
712
873
 
713
- 只有限流、临时网络错误和服务端明确标记的临时错误适合自动重试。参数错误、认证拒绝和资源不存在不应自动重试。
714
-
715
- 第一方 CLI Auth 服务通过 WebResult 返回业务错误时,CLI 只按服务端发布的
716
- 精确错误码转换稳定错误语义:Device Flow 的等待、降速、拒绝和过期状态继续
717
- 由轮询流程处理;授权拒绝返回 `AUTH_DENIED`,Refresh Session 失效返回
718
- `AUTH_EXPIRED`,Scope 不足返回 `AUTH_REQUIRED`,Project 不存在返回
719
- `PROJECT_NOT_FOUND`。未纳入安全映射的正式错误码和未知错误码统一降级为
720
- `ZAN_API_ERROR`;服务端原始错误码和 message 不进入人工或 JSON 输出。
721
-
722
- 创建 Project 时,已发布的套餐错误(`W3S-019-5-B027` 至 `B032`)仍使用
723
- `ZAN_API_ERROR` 和退出码 `8`,但会明确提示免费套餐未配置、无领取资格、
724
- 初始化中、初始化失败、已有套餐不可用或 Project 数量超限。只有初始化中
725
- 标记为可重试;CLI 不会因此自动重复创建请求。
874
+ 读取请求遇到限流、临时网络错误或服务端明确标记的临时错误时,可结合 `retryable` 重试。参数错误、认证拒绝和资源不存在不应自动重试。Solana 提交结果不确定时先查询原签名,不自动重试广播或重新支付。
726
875
 
727
- 同名 Project 已存在(`W3S-019-5-B033`)时,CLI 会明确提示重名,并建议换一个
728
- 名称,或通过 `zan project list` 查找项目后执行 `zan project use <id>` 使用已有
729
- 项目;此错误不可重试,仍使用 `ZAN_API_ERROR` 和退出码 `8`。
730
-
731
- 已认证的 Project 与 Network 请求如果通过 HTTP 401 或已发布的 WebResult
732
- 语义表明 Access Token 无效,会刷新一次 Access Token 并重放一次请求。第二次
733
- 仍失败时返回 `AUTH_EXPIRED`,不会继续刷新。普通 HTTP 403 和 Scope 不足不会
734
- 触发刷新。该行为不适用于 OAuth、Device Flow 或原始 EVM JSON-RPC 请求。
876
+ 创建 Project 时若提示名称重复,可更换名称,或执行 `zan project list` 查找已有项目。
877
+ 套餐不可用或项目数量达到上限时,请根据错误提示检查账号套餐及项目状态。
735
878
 
736
879
  ### 安全注意事项
737
880
 
738
- - 对外文档、截图和问题反馈中不要包含内部开发、测试或预发域名、IP、端口及环境配置;
739
- 示例统一使用 `example.com` 等占位地址,分享命令输出前先检查并脱敏。
740
- - 不要把 Access Token、Refresh Token、Project Token 或完整 Endpoint 写入脚本、日志和普通配置。
741
- - 不要使用 `--verbose` 输出处理结果中的敏感字段。
742
- - 完整 RPC Endpoint 只在当前进程内解密使用;本地仅保存 AES-256-GCM 密文,
743
- 不进入命令输出、普通设置或错误信息。
744
- - 加密缓存主要防止配置文件、备份或日志意外泄露明文 Endpoint。它不能抵御已
745
- 同时取得本地文件和已解锁系统凭据库权限的恶意进程或系统管理员。
746
- - RPC API Key 覆盖值只通过隐藏输入或 stdin 写入系统凭据库,不要放入命令参数
747
- 或脚本源码。仅在应用确实需要时使用 `project rpc-key pull` 创建 `.env`,并确保
748
- 文件不进入版本控制、构建产物或日志。
749
- - 不要向 CLI 传入任意 RPC URL;Network 必须来自当前 Project。
750
- - 自动化应使用 `--json --no-interactive` 并分别解析 stdout、stderr 和退出码。
751
- - `--reveal` 只应在用户明确需要展示受保护结果字段时使用。
881
+ - 不要在聊天、问题反馈、日志或版本控制中包含助记词、passphrase、私钥、API Key、登录凭据及含凭据的 RPC 地址。
882
+ - 仅在应用直接调用 ZAN API 时使用 `project rpc-key pull`,并妥善保管生成的 `.env`。
883
+ - 助记词、私钥和 API Key 使用隐藏输入或 stdin 传入;passphrase 使用隐藏提示,不要将真实值写在命令参数中。
884
+ - 自定义 EVM RPC 允许列表可能开放写操作;执行前确认方法及参数的影响。
885
+ - 分享签名、已签名交易或查询结果前,确认其用途及接收方。
886
+ - 自动化调用使用 `--json --no-interactive`,同时检查退出码和风险警告。
752
887
 
753
888
  ### 常见问题
754
889
 
755
890
  **返回 `SETUP_REQUIRED`**
756
891
 
757
- 检查服务地址、当前 Project 和 Network:
892
+ 检查当前 Project、Network 和本地凭据状态:
758
893
 
759
894
  ```sh
760
895
  zan settings show
@@ -787,35 +922,4 @@ zan auth login
787
922
 
788
923
  Key 是项目的累计用量,套餐余额由账号下的项目共享,与控制台按套餐类型读取的余额一致。
789
924
  `Key limit: Not set` 表示未设置单 Key 限额,仍受套餐余额约束。
790
- `PROJECT_NOT_FOUND` 时检查当前环境及项目归属;本期不支持查询他人拥有的共享项目。
791
-
792
- ## 已实现能力
793
-
794
- - OAuth 2.1 PKCE 与 Device Flow 登录、刷新、验证和登出。
795
- - 系统凭据库、跨进程 Access Token 复用与 Refresh Token 安全轮换。
796
- - Project 管理、动态 Network 发现、加密 Endpoint 缓存与安全解析。
797
- - `zan usage` 查询当前 Project 的 Key 用量、共享套餐余额及到期时间。
798
- - Raw JSON-RPC、余额、ENS、交易、回执、区块、Gas 和日志查询。
799
- - 稳定 JSON 协议、退出码、统一脱敏、Agent Manifest 和 shell completions。
800
- - 单元、集成、CLI 黑盒、覆盖率和安装包冒烟测试。
801
-
802
- ## 架构与安全
803
-
804
- 命令层负责解析输入,认证、Session、Project、Network 和 EVM 查询由独立服务完成;HTTP、凭据库、文件存储、输出与错误映射位于可替换的基础设施边界。
805
-
806
- 完整 Network Endpoint 仅在进程内以明文用于 RPC 调用;持久化时使用
807
- AES-256-GCM 加密,密钥由系统凭据库单独保存,不进入命令输出或普通设置。
808
-
809
- ## 路线图
810
-
811
- - **Phase A**:认证、Session、设置、就绪检查、Agent Manifest 与 CLI 基础,已实现。
812
- - **Phase B**:Project 管理、选择与动态多链发现,已实现。
813
- - **Phase C**:动态多链 Endpoint、EVM 只读查询、ENS 与显式 stdin,已实现。
814
- - **后续阶段**:事件查询、钱包签名、支付、Webhook 与 MCP 集成。
815
-
816
- ## 文档
817
-
818
- - [ZAN CLI 设计规格](docs/superpowers/specs/2026-07-23-zan-cli-design-spec.md)
819
- - [Phase A 设计](docs/superpowers/specs/2026-07-23-phase-a-cli-auth-foundation-design.md)
820
- - [Phase B 设计](docs/superpowers/specs/2026-07-24-phase-b-project-dynamic-multichain-design.md)
821
- - [Phase C 设计](docs/superpowers/specs/2026-07-24-phase-c-evm-readonly-queries-design.md)
925
+ `PROJECT_NOT_FOUND` 时检查项目 ID 及项目归属;用量查询不支持他人拥有的项目。