@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 +353 -249
- package/dist/cli.js +4184 -933
- package/package.json +8 -1
- package/skills/zan-cli/SKILL.md +6 -2
- package/skills/zan-cli/references/rpc-workflow.md +15 -0
- package/skills/zan-cli/references/signing.md +16 -0
- package/skills/zan-cli/references/solana-transactions.md +92 -0
- package/skills/zan-cli/references/troubleshooting.md +6 -0
package/README.md
CHANGED
|
@@ -1,47 +1,27 @@
|
|
|
1
1
|
# ZAN CLI
|
|
2
2
|
|
|
3
|
-
ZAN CLI 是面向开发者、自动化脚本和 AI Agent 的统一命令行入口,提供安全认证、ZAN Project
|
|
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
|
-
-
|
|
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
|
|
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
|
|
70
|
+
zan settings set network <network-id>
|
|
92
71
|
zan settings show
|
|
93
72
|
```
|
|
94
73
|
|
|
95
|
-
|
|
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
|
|
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
|
-
|
|
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`
|
|
182
|
-
- `--
|
|
183
|
-
-
|
|
184
|
-
|
|
185
|
-
|
|
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
|
|
209
|
-
|
|
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`
|
|
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
|
-
|
|
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
|
-
|
|
307
|
-
|
|
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
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
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
|
-
|
|
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
|
-
|
|
337
|
-
Project 使用不同缓存文件与密钥。普通设置文件仍只保存 Project ID 和 Network
|
|
338
|
-
ID,不保存 Endpoint 或 API Key。
|
|
339
|
-
|
|
340
|
-
#### RPC API Key 覆盖
|
|
286
|
+
#### 应用 API Key
|
|
341
287
|
|
|
342
|
-
|
|
343
|
-
凭据库:
|
|
288
|
+
仅通过 CLI 查询数据时无需导出 API Key。应用需要直接调用 ZAN API 时,在应用目录执行:
|
|
344
289
|
|
|
345
290
|
```sh
|
|
346
|
-
zan project rpc-key
|
|
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
|
-
|
|
354
|
-
|
|
294
|
+
命令将所选项目的 API Key 写入当前目录 `.env` 的 `ZAN_API_KEY`:文件不存在时创建,
|
|
295
|
+
变量已存在时替换,否则追加。其他变量和其他环境配置文件保持不变,终端不显示 Key。
|
|
355
296
|
|
|
356
|
-
|
|
297
|
+
未选择项目时会提示选择;非交互模式请使用 `--project <project-id>`。
|
|
298
|
+
此命令无需选择 Network。
|
|
357
299
|
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
300
|
+
CLI 会尝试将 `.env` 加入 `.gitignore`;已有生效规则时不重复修改。若文件已被 Git
|
|
301
|
+
跟踪,或忽略规则检查、更新失败,仍会写入并提示风险,JSON 输出中包含 `warnings`。
|
|
302
|
+
提交代码前请确认 `.env` 不在暂存区,也不要将其打包或上传。
|
|
361
303
|
|
|
362
|
-
|
|
363
|
-
不存在时创建。API Key 按环境和 Project ID 独立保存在系统凭据库(macOS Keychain
|
|
364
|
-
等),与 Endpoint 缓存的加密密钥、手动覆盖值分别存储。`pull` 优先使用手动覆盖值,
|
|
365
|
-
否则直接读取所选 Project 已保存的 API Key,不需要读取网络缓存或请求后端。
|
|
304
|
+
如需为当前项目指定其他 RPC API Key,可使用隐藏输入:
|
|
366
305
|
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
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
|
-
`
|
|
380
|
-
|
|
381
|
-
仓库的目录也支持此行为,不会自动创建项目仓库。此检查使用本机 Git;Git 不可用时会提示风险。
|
|
312
|
+
`set --stdin` 支持从标准输入读取 Key。已配置的覆盖值优先用于 RPC 请求及 `pull`;
|
|
313
|
+
`clear` 清除覆盖值后恢复使用项目默认 Key。凭据保存在系统凭据库中。
|
|
382
314
|
|
|
383
|
-
|
|
384
|
-
误提交 Key 的风险;JSON 结果通过 `warnings` 返回同样的提示。已跟踪时可执行
|
|
385
|
-
`git rm --cached -- .env` 取消跟踪,并在提交前检查暂存内容;CLI 不会自动修改 Git
|
|
386
|
-
索引,忽略规则也不能清除历史提交中的内容。其他环境配置文件不会被修改。
|
|
387
|
-
写入后,任何拥有当前目录读取权限的进程或 Agent 都可能读取这个明文
|
|
388
|
-
文件;“不泄露”保证只覆盖该命令自身的参数、输出、错误和日志边界。
|
|
315
|
+
#### 默认 Project 和 Network
|
|
389
316
|
|
|
390
|
-
|
|
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` |
|
|
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
|
-
|
|
463
|
-
`ZAN_ENV` 及所选 ZAN 后端环境无关;`ZAN_HOME` 不会改变它的位置,所有环境
|
|
464
|
-
读取同一个文件。
|
|
395
|
+
该文件位于当前用户的主目录,对所有项目生效;`ZAN_HOME` 不改变此路径。
|
|
465
396
|
|
|
466
|
-
YAML schema
|
|
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
|
|
417
|
+
条目是精确且大小写敏感的方法名(1–128 字符,匹配 `^[A-Za-z][A-Za-z0-9_.-]*$`),不允许重复,最多 256 条。不支持通配、前缀或正则。空列表会拒绝对应类别的所有 Raw 方法。文件必须是单个 YAML 文档且不超过 64 KiB;注释允许,重复键、别名、自定义标签和合并键会被拒绝。
|
|
482
418
|
|
|
483
|
-
|
|
419
|
+
首次调用 `zan evm rpc`、`zan hyperliquid info` 或 `zan solana rpc` 时,若配置文件不存在,CLI 会创建默认查询方法列表。已有文件不会被升级覆盖;修改后在下一次调用生效。
|
|
484
420
|
|
|
485
|
-
|
|
421
|
+
旧版本配置继续兼容:缺少 `allowedHyperliquidInfoMethods` 或 `allowedSolanaRpcMethods` 时,对应命令使用默认允许列表,不会自动改写用户文件。可显式加入对应属性限制方法;空列表拒绝该类 Raw 调用。已有配置不会自动补入新增加的 `hl_*` JSON-RPC 方法,需要使用时请手动加入 `allowedRpcMethods`。
|
|
486
422
|
|
|
487
423
|
允许列表不保证所选 Network 或套餐支持某个方法;RPC 错误仍然是最终依据。诊断和跟踪类读取可能消耗更多额度。
|
|
488
424
|
|
|
489
|
-
> **警告**:默认列表是只读的,但加入 `eth_sendRawTransaction`、`avax.issueTx`、`personal_*` 或 `admin_*` 等方法后,CLI 会在不做方法级安全校验或确认的情况下直接分发这些方法。
|
|
425
|
+
> **警告**:默认列表是只读的,但加入 `eth_sendRawTransaction`、`avax.issueTx`、`personal_*` 或 `admin_*` 等方法后,CLI 会在不做方法级安全校验或确认的情况下直接分发这些方法。Raw RPC 命令不会替用户签名,但提交已签名交易可能产生链上状态变更。
|
|
490
426
|
|
|
491
|
-
|
|
427
|
+
方法不在允许列表中时返回 `INVALID_ARGS`;配置文件损坏或权限不安全时返回 `SETUP_REQUIRED`。
|
|
492
428
|
|
|
493
|
-
内置查询命令(`evm data balance`、`evm tx`、`evm receipt`、`evm block`、`evm gas`、`evm logs
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
626
|
-
Project/Network 选择、套餐与 Key 用量、EVM/Hyperliquid 查询、RPC Key
|
|
627
|
-
|
|
800
|
+
CLI 随附 zan-cli Skill,包含命令使用说明、
|
|
801
|
+
Project/Network 选择、套餐与 Key 用量、EVM / Solana / Hyperliquid 查询、RPC Key 拉取、助记词派生、钱包签名及 Solana 交易与 Trading Boost 指引。
|
|
802
|
+
安装 CLI 后,使用以下命令将 Skill 安装到 Agent 可发现的位置。
|
|
628
803
|
|
|
629
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
728
|
-
|
|
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
|
-
-
|
|
739
|
-
|
|
740
|
-
-
|
|
741
|
-
-
|
|
742
|
-
-
|
|
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
|
-
|
|
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 及项目归属;用量查询不支持他人拥有的项目。
|