@zan_team/cli 0.0.0-stage → 0.0.2
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 +804 -2
- package/dist/cli.js +7655 -0
- package/dist/cli.js.map +1 -0
- package/package.json +58 -4
- package/skills/zan-cli/SKILL.md +95 -0
- package/skills/zan-cli/agents/openai.yaml +3 -0
- package/skills/zan-cli/references/rpc-workflow.md +33 -0
- package/skills/zan-cli/references/signing.md +30 -0
- package/skills/zan-cli/references/troubleshooting.md +42 -0
package/README.md
CHANGED
|
@@ -1,3 +1,805 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ZAN CLI
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
ZAN CLI 是面向开发者、自动化脚本和 AI Agent 的统一命令行入口,提供安全认证、ZAN Project 管理与套餐用量查询、动态多链发现、EVM 与 Hyperliquid 只读查询,以及稳定的机器可读输出。
|
|
4
|
+
|
|
5
|
+
> 当前状态:认证、Project、套餐用量、Network、EVM 与 Hyperliquid 只读查询已经实现。npm 包尚未发布,当前请使用源码构建方式运行。示例中的 `example.com` 地址仅为配置占位符。
|
|
6
|
+
|
|
7
|
+
## 快速开始
|
|
8
|
+
|
|
9
|
+
### 环境要求
|
|
10
|
+
|
|
11
|
+
- Node.js 22 或更高版本。
|
|
12
|
+
- 从源码构建时需要 pnpm 10。
|
|
13
|
+
|
|
14
|
+
### 安装
|
|
15
|
+
|
|
16
|
+
npm 包发布后可以全局安装:
|
|
17
|
+
|
|
18
|
+
```sh
|
|
19
|
+
npm install --global @zan_team/cli
|
|
20
|
+
zan --help
|
|
21
|
+
```
|
|
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
|
+
服务地址;内部环境地址和配置请通过授权渠道获取,不要写入公开文档或示例。
|
|
45
|
+
|
|
46
|
+
### 登录
|
|
47
|
+
|
|
48
|
+
交互式环境默认使用浏览器授权:
|
|
49
|
+
|
|
50
|
+
```sh
|
|
51
|
+
zan auth login
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
终端无法打开浏览器时使用 Device Flow:
|
|
55
|
+
|
|
56
|
+
```sh
|
|
57
|
+
zan auth login --device-code
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
CLI 会展示授权二维码、可直接打开的验证链接和一次性用户码。
|
|
61
|
+
|
|
62
|
+
### 创建并选择 Project
|
|
63
|
+
|
|
64
|
+
```sh
|
|
65
|
+
zan project create --name cli-demo
|
|
66
|
+
zan project list
|
|
67
|
+
zan project use <project-id>
|
|
68
|
+
zan project active
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
`project create` 不会自动切换当前 Project。使用返回或列表中的 Project ID 执行
|
|
72
|
+
`project use`;CLI 会同时拉取该 Project 的 Network/Endpoint 列表并建立本地
|
|
73
|
+
加密缓存。
|
|
74
|
+
|
|
75
|
+
### 查看当前项目用量
|
|
76
|
+
|
|
77
|
+
选好 Project 后即可查询套餐与 Key 用量:
|
|
78
|
+
|
|
79
|
+
```sh
|
|
80
|
+
zan usage
|
|
81
|
+
zan --json --no-interactive usage
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
显示套餐名称、已用/总额度、剩余额度和过期时间,并单独显示 Key 的累计用量。
|
|
85
|
+
仅查询用量时无需选择 Network;完整输出及字段含义见[套餐与 Key 用量](#套餐与-key-用量)。
|
|
86
|
+
|
|
87
|
+
### 选择 Network
|
|
88
|
+
|
|
89
|
+
```sh
|
|
90
|
+
zan evm networks
|
|
91
|
+
zan settings set network base-mainnet
|
|
92
|
+
zan settings show
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Network ID 由 `evm networks` 返回。不要自行猜测 Network ID。
|
|
96
|
+
|
|
97
|
+
### 第一次查询
|
|
98
|
+
|
|
99
|
+
查询原生代币余额:
|
|
100
|
+
|
|
101
|
+
```sh
|
|
102
|
+
zan evm data balance 0x0000000000000000000000000000000000000000
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
调用无参数 JSON-RPC 方法:
|
|
106
|
+
|
|
107
|
+
```sh
|
|
108
|
+
zan evm rpc eth_blockNumber
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 脚本和 AI Agent
|
|
112
|
+
|
|
113
|
+
自动化调用应显式关闭交互并使用 JSON 输出:
|
|
114
|
+
|
|
115
|
+
```sh
|
|
116
|
+
zan \
|
|
117
|
+
--json \
|
|
118
|
+
--no-interactive \
|
|
119
|
+
--project <project-id> \
|
|
120
|
+
--network base-mainnet \
|
|
121
|
+
evm rpc eth_blockNumber
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
成功结果写入 stdout,失败结果写入 stderr。脚本还应检查进程退出码。
|
|
125
|
+
|
|
126
|
+
## 完整使用指南
|
|
127
|
+
|
|
128
|
+
### 安装与升级
|
|
129
|
+
|
|
130
|
+
npm 包发布后:
|
|
131
|
+
|
|
132
|
+
```sh
|
|
133
|
+
npm install --global @zan_team/cli
|
|
134
|
+
npm update --global @zan_team/cli
|
|
135
|
+
zan version
|
|
136
|
+
```
|
|
137
|
+
|
|
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
|
+
### 全局参数
|
|
151
|
+
|
|
152
|
+
全局参数放在 `zan` 与子命令之间:
|
|
153
|
+
|
|
154
|
+
| 参数 | 作用 |
|
|
155
|
+
| -------------------- | ---------------------------- |
|
|
156
|
+
| `--project <id>` | 为本次调用选择 Project |
|
|
157
|
+
| `-n, --network <id>` | 为本次调用选择 Network |
|
|
158
|
+
| `--json` | 输出机器可读 JSON |
|
|
159
|
+
| `--no-interactive` | 禁止交互式提示 |
|
|
160
|
+
| `--interactive` | 允许交互式提示 |
|
|
161
|
+
| `--quiet` | 隐藏非必要进度 |
|
|
162
|
+
| `--verbose` | 输出详细诊断 |
|
|
163
|
+
| `--timeout <ms>` | 设置请求超时 |
|
|
164
|
+
| `--no-color` | 禁用 ANSI 颜色 |
|
|
165
|
+
| `--color` | 启用 ANSI 颜色 |
|
|
166
|
+
| `--reveal` | 允许显式展示受保护的结果字段 |
|
|
167
|
+
|
|
168
|
+
运行 `zan --help` 或 `zan <command> --help` 查看当前命令帮助。
|
|
169
|
+
|
|
170
|
+
### 认证
|
|
171
|
+
|
|
172
|
+
```sh
|
|
173
|
+
zan auth login
|
|
174
|
+
zan auth login --device-code
|
|
175
|
+
zan auth login --force
|
|
176
|
+
zan auth status
|
|
177
|
+
zan auth status --verify
|
|
178
|
+
zan auth logout
|
|
179
|
+
```
|
|
180
|
+
|
|
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;所有认证重试最多一次,不会循环。
|
|
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`。
|
|
220
|
+
|
|
221
|
+
### Project 管理
|
|
222
|
+
|
|
223
|
+
```sh
|
|
224
|
+
zan project list
|
|
225
|
+
zan project get <project-id>
|
|
226
|
+
zan project create --name <project-name>
|
|
227
|
+
zan project use <project-id>
|
|
228
|
+
zan project active
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
- Project 名称不保证唯一,选择和设置始终使用 Project ID。
|
|
232
|
+
- `project use` 会先验证 Project、刷新并加密保存 Endpoint 缓存,再写入本地
|
|
233
|
+
默认设置;刷新失败时不会切换 Project。
|
|
234
|
+
- 使用 `--project <id>` 可以只覆盖当前命令,不修改本地设置。
|
|
235
|
+
- Project 与 Network API 使用统一响应 envelope,解包后的业务 DTO 仍执行
|
|
236
|
+
严格校验;创建接口固定为 `POST /v1/api/cli/createProject`。
|
|
237
|
+
|
|
238
|
+
### 套餐与 Key 用量
|
|
239
|
+
|
|
240
|
+
```sh
|
|
241
|
+
zan usage
|
|
242
|
+
zan --project <project-id> usage
|
|
243
|
+
zan --json --no-interactive usage
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
默认查询当前 Project,选择优先级为 `--project` > `ZAN_PROJECT` > 本地设置。
|
|
247
|
+
无需 Network,不读取 Endpoint 缓存或测试 Key 覆盖,也不会导出 API Key。
|
|
248
|
+
未选择 Project 时,交互终端会提示选择;非交互调用返回 `SETUP_REQUIRED`。
|
|
249
|
+
|
|
250
|
+
输出示例:
|
|
251
|
+
|
|
252
|
+
```text
|
|
253
|
+
Project: Production (project-1)
|
|
254
|
+
Key: abcd...wxyz
|
|
255
|
+
Key used (cumulative): 123 credits
|
|
256
|
+
Key limit: 1,000 credits
|
|
257
|
+
Key remaining: 877 credits
|
|
258
|
+
|
|
259
|
+
Plan: Growth (shared across account projects)
|
|
260
|
+
Plan used / total: 2,500 / 10,000 credits
|
|
261
|
+
Plan remaining: 7,500 credits
|
|
262
|
+
Expires: 2026-10-22T00:00:00Z
|
|
263
|
+
Refreshes: 2026-10-01T00:00:00Z
|
|
264
|
+
Status: VALID / service ON
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
`keyUsage` 是当前项目 Key 的累计消耗及单 Key 限额;`plan` 是所属账号共享的
|
|
268
|
+
Node Service 套餐,余额与控制台使用相同口径:本地套餐读取履约用量,双百套餐读取资源包余额,包含有效加油包。
|
|
269
|
+
两者的统计范围不同,不能用单 Key 累计消耗减套餐总量。用量有计量延迟。
|
|
270
|
+
|
|
271
|
+
对应的 `--json` 输出示例:
|
|
272
|
+
|
|
273
|
+
```json
|
|
274
|
+
{
|
|
275
|
+
"project": {
|
|
276
|
+
"id": "project-1",
|
|
277
|
+
"name": "Production",
|
|
278
|
+
"type": "CHAIN_RPC",
|
|
279
|
+
"createdAt": "2026-07-24T08:00:00Z",
|
|
280
|
+
"tokenHint": "abcd...wxyz"
|
|
281
|
+
},
|
|
282
|
+
"keyUsage": {
|
|
283
|
+
"usedCredits": "123",
|
|
284
|
+
"limitCredits": "1000",
|
|
285
|
+
"remainingCredits": "877"
|
|
286
|
+
},
|
|
287
|
+
"plan": {
|
|
288
|
+
"name": "Growth",
|
|
289
|
+
"usedCredits": "2500",
|
|
290
|
+
"totalCredits": "10000",
|
|
291
|
+
"remainingCredits": "7500",
|
|
292
|
+
"expiresAt": "2026-10-22T00:00:00Z",
|
|
293
|
+
"refreshAt": "2026-10-01T00:00:00Z",
|
|
294
|
+
"status": "VALID",
|
|
295
|
+
"serviceStatus": "ON"
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
JSON 直接返回 `{ project, keyUsage, plan }`,额度字段为十进制整数字符串,
|
|
301
|
+
时间为 UTC ISO 8601。`keyUsage.limitCredits` 和 `remainingCredits` 为 `null`
|
|
302
|
+
表示未设置单 Key 限额,仍受套餐余额限制;无订阅时 `plan` 为 `null`。
|
|
303
|
+
`expiresAt` 是套餐到期时间,`refreshAt` 是当前权益周期刷新时间;未知时间为 `null`。
|
|
304
|
+
耗尽时剩余量显示 `0`;已过期/关闭的套餐仍返回状态及到期时间,查询不会开通或续订套餐。
|
|
305
|
+
|
|
306
|
+
本期仅支持当前登录账号拥有的 `CHAIN_RPC` Project;无权访问、他人拥有或不存在的
|
|
307
|
+
项目统一返回 `PROJECT_NOT_FOUND`。后端需提供
|
|
308
|
+
`GET /v1/api/cli/projects/{projectId}/usage`,沿用 `node-service.projects:read` Scope。
|
|
309
|
+
|
|
310
|
+
### Network 与本地设置
|
|
311
|
+
|
|
312
|
+
查看当前 Project 支持的 Network:
|
|
313
|
+
|
|
314
|
+
```sh
|
|
315
|
+
zan evm networks
|
|
316
|
+
zan evm networks --search base
|
|
317
|
+
zan evm networks --refresh
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
网络列表不要求原生币元数据完整。后端提供有效 EVM 网络、Chain ID 和 HTTPS
|
|
321
|
+
Endpoint 时,即使 `nativeCurrency` 缺失也可以展示和执行普通 RPC;币种列显示
|
|
322
|
+
`-`,JSON 中省略 `nativeCurrency`。`evm balance` 需要币种和精度,缺失时会提示
|
|
323
|
+
补齐服务端配置,也可以通过 `evm rpc eth_getBalance` 查询原始单位。
|
|
324
|
+
|
|
325
|
+
未使用 `--refresh` 时,CLI 优先解密复用本地缓存,不会为了每条 EVM 命令重复
|
|
326
|
+
请求 Project 详情或 Network 列表。缓存缺失、密钥缺失或密文校验失败时会自动
|
|
327
|
+
重新拉取;RPC Endpoint 返回 HTTP 401/403 时会刷新一次并重试一次。
|
|
328
|
+
|
|
329
|
+
查看或清理当前 Project 的缓存:
|
|
330
|
+
|
|
331
|
+
```sh
|
|
332
|
+
zan project cache status
|
|
333
|
+
zan project cache clear
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
缓存文件使用 AES-256-GCM 加密,独立随机密钥保存在系统凭据库。不同环境和
|
|
337
|
+
Project 使用不同缓存文件与密钥。普通设置文件仍只保存 Project ID 和 Network
|
|
338
|
+
ID,不保存 Endpoint 或 API Key。
|
|
339
|
+
|
|
340
|
+
#### RPC API Key 覆盖
|
|
341
|
+
|
|
342
|
+
需要临时替换当前 Project 的 RPC API Key 时,通过隐藏输入或 stdin 写入系统
|
|
343
|
+
凭据库:
|
|
344
|
+
|
|
345
|
+
```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
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
覆盖值不会出现在命令参数、普通配置、Endpoint 缓存或命令输出中。启用覆盖后,
|
|
354
|
+
RPC 401/403 不会自动换回服务端下发的 Key,便于稳定测试指定 Key。
|
|
355
|
+
|
|
356
|
+
需要让当前目录中的应用使用当前 Project Key 时,可以直接拉取到 `.env`:
|
|
357
|
+
|
|
358
|
+
```sh
|
|
359
|
+
zan project rpc-key pull
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
命令写入当前工作目录中固定的 `ZAN_API_KEY`:已存在时替换,缺少时追加,文件
|
|
363
|
+
不存在时创建。实际生效的测试覆盖 Key 优先,否则从加密 Endpoint 缓存中提取
|
|
364
|
+
服务端下发的 Project Key;不要求选择 Network。命令不接受 Key、stdin、变量名
|
|
365
|
+
或输出路径,也不会在人工输出、JSON 输出、错误或日志中包含 Key。新文件及更新
|
|
366
|
+
后的文件在 POSIX 系统上使用 `0600` 权限,并通过文件锁和原子替换写入;符号链接
|
|
367
|
+
或非普通 `.env` 会被拒绝。
|
|
368
|
+
|
|
369
|
+
`pull` 只写 `.env`,不会修改其他环境配置文件。
|
|
370
|
+
它不会检查 Git 跟踪状态或自动更新 `.gitignore`,请自行确保 `.env`
|
|
371
|
+
不会被提交。写入后,任何拥有当前目录读取权限的进程或 Agent 都可能读取这个明文
|
|
372
|
+
文件;“不泄露”保证只覆盖该命令自身的参数、输出、错误和日志边界。
|
|
373
|
+
|
|
374
|
+
管理默认 Project 和 Network:
|
|
375
|
+
|
|
376
|
+
```sh
|
|
377
|
+
zan settings get project
|
|
378
|
+
zan settings get network
|
|
379
|
+
zan settings show
|
|
380
|
+
zan settings set project <project-id>
|
|
381
|
+
zan settings set network <network-id>
|
|
382
|
+
zan settings clear network
|
|
383
|
+
zan settings clear
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
Project 和 Network 的选择优先级:
|
|
387
|
+
|
|
388
|
+
```text
|
|
389
|
+
命令参数 > 环境变量 > 本地设置 > 交互选择
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
可用的环境变量:
|
|
393
|
+
|
|
394
|
+
| 环境变量 | 作用 |
|
|
395
|
+
| ------------------------ | ------------------------------------- |
|
|
396
|
+
| `ZAN_PROJECT` | 默认 Project ID |
|
|
397
|
+
| `ZAN_NETWORK` | 默认 Network ID |
|
|
398
|
+
| `ZAN_HOME` | 覆盖 CLI 数据目录,主要用于隔离和测试 |
|
|
399
|
+
| `ZAN_REQUEST_TIMEOUT_MS` | 默认请求超时 |
|
|
400
|
+
|
|
401
|
+
非交互模式下缺少命令所需的 Project 或 Network 时,CLI 返回 `SETUP_REQUIRED`,不会显示选择器。
|
|
402
|
+
`usage` 只要求 Project;链上查询还需要 Network。
|
|
403
|
+
|
|
404
|
+
### EVM 查询
|
|
405
|
+
|
|
406
|
+
所有 EVM 查询只使用当前 Project 返回的受信 Endpoint。CLI 不接受用户传入任意 RPC URL。
|
|
407
|
+
|
|
408
|
+
#### Raw JSON-RPC
|
|
409
|
+
|
|
410
|
+
```sh
|
|
411
|
+
zan evm rpc eth_blockNumber
|
|
412
|
+
zan evm rpc eth_chainId
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
位置参数必须是合法 JSON。字符串必须保留 JSON 引号:
|
|
416
|
+
|
|
417
|
+
```sh
|
|
418
|
+
zan evm rpc eth_getBalance \
|
|
419
|
+
'"0x0000000000000000000000000000000000000000"' \
|
|
420
|
+
'"latest"'
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
复杂参数同样按位置传入:
|
|
424
|
+
|
|
425
|
+
```sh
|
|
426
|
+
zan evm rpc eth_call \
|
|
427
|
+
'{"to":"0x0000000000000000000000000000000000000000","data":"0x"}' \
|
|
428
|
+
'"latest"'
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
也可以显式从 stdin 读取一个 JSON 数组:
|
|
432
|
+
|
|
433
|
+
```sh
|
|
434
|
+
printf '["0x0000000000000000000000000000000000000000","latest"]' \
|
|
435
|
+
| zan evm rpc eth_getBalance --stdin
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
`--stdin` 与位置参数互斥。未指定 `--stdin` 时,`evm rpc` 不读取 stdin。
|
|
439
|
+
|
|
440
|
+
`evm rpc` 可调用的方法由用户级允许列表控制,固定路径为:
|
|
441
|
+
|
|
442
|
+
```text
|
|
443
|
+
~/.zan-cli/config.yaml
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
`~` 由操作系统用户目录 API 解析。该文件是个人 CLI 策略,与环境配置文件、
|
|
447
|
+
`ZAN_ENV` 及所选 ZAN 后端环境无关;`ZAN_HOME` 不会改变它的位置,所有环境
|
|
448
|
+
读取同一个文件。
|
|
449
|
+
|
|
450
|
+
YAML schema 支持两个顶层属性,分别控制 Raw JSON-RPC 和 Hyperliquid Info 方法:
|
|
451
|
+
|
|
452
|
+
```yaml
|
|
453
|
+
allowedRpcMethods:
|
|
454
|
+
- eth_blockNumber
|
|
455
|
+
- eth_chainId
|
|
456
|
+
- eth_call
|
|
457
|
+
- eth_getBalance
|
|
458
|
+
- hl_getLatestBlockNumber
|
|
459
|
+
allowedHyperliquidInfoMethods:
|
|
460
|
+
- meta
|
|
461
|
+
- activeAssetData
|
|
462
|
+
- userFills
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
条目是精确且大小写敏感的方法名(1–128 字符,匹配 `^[A-Za-z][A-Za-z0-9_.-]*$`),不允许重复,最多 256 条。不支持通配、前缀或正则。空列表会拒绝所有 Raw RPC 方法。文件必须是单个 YAML 文档且不超过 64 KiB;注释允许,重复键、别名、自定义标签和合并键会被拒绝。
|
|
466
|
+
|
|
467
|
+
第一次执行语法合法的 `zan evm rpc` 或 `zan hyperliquid info` 时,如果文件不存在,CLI 会自动创建它,并预填截至 2026-09-07 ZAN 文档中 113 条只读、模拟、诊断和过滤类 JSON-RPC 方法,以及 78 条 Hyperliquid Info 查询方法。默认内容只是创建模板:文件存在后,只有文件内容决定方法是否被允许,CLI 升级不会合并或覆盖已有文件。每次调用都会重新读取该文件,编辑后下一次调用立即生效。
|
|
468
|
+
|
|
469
|
+
旧版本生成、只有 `allowedRpcMethods` 的配置文件继续兼容:CLI 在内存中使用默认的 Hyperliquid Info 允许列表,不会自动改写用户文件。若要限制 Info 调用,请显式加入 `allowedHyperliquidInfoMethods`;空列表会拒绝所有 Info 方法。已有配置不会自动补入新增加的 `hl_*` JSON-RPC 方法,需要使用时请手动加入 `allowedRpcMethods`。
|
|
470
|
+
|
|
471
|
+
允许列表不保证所选 Network 或套餐支持某个方法;RPC 错误仍然是最终依据。诊断和跟踪类读取可能消耗更多额度。
|
|
472
|
+
|
|
473
|
+
> **警告**:默认列表是只读的,但加入 `eth_sendRawTransaction`、`avax.issueTx`、`personal_*` 或 `admin_*` 等方法后,CLI 会在不做方法级安全校验或确认的情况下直接分发这些方法。CLI 仍不实现交易构造、签名或任意 Endpoint 选择,但用户提供的已签名 payload 可能产生链上副作用。
|
|
474
|
+
|
|
475
|
+
方法不在允许列表中时,`zan evm rpc` 在认证、Project/Network 解析或任何网络请求之前即以 `INVALID_ARGS` 拒绝;文件损坏或权限不安全时返回 `SETUP_REQUIRED`。
|
|
476
|
+
|
|
477
|
+
内置查询命令(`evm data balance`、`evm tx`、`evm receipt`、`evm block`、`evm gas`、`evm logs`)不受该文件影响,始终使用其固定的内部只读 RPC 方法。
|
|
478
|
+
|
|
479
|
+
#### Hyperliquid
|
|
480
|
+
|
|
481
|
+
选择 Project 中 `ecosystem` 为 `hyperliquid` 的 Network 后,可以直接调用 ZAN Hyperliquid 的两类只读接口。
|
|
482
|
+
|
|
483
|
+
Hyperliquid JSON-RPC 方法仍使用通用的 `evm rpc` 命令,并发送到 Network Endpoint 的 `/evm` 路径:
|
|
484
|
+
|
|
485
|
+
```sh
|
|
486
|
+
zan evm rpc hl_getLatestBlockNumber
|
|
487
|
+
zan evm rpc hl_getBlock '123456'
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
Hyperliquid Info 使用独立命令,并发送到同一 Endpoint 对应的 `/info` 路径。`payload` 必须是一个 JSON 对象,CLI 会把命令中的方法名写入请求体的 `type` 字段:
|
|
491
|
+
|
|
492
|
+
```sh
|
|
493
|
+
zan hyperliquid info meta
|
|
494
|
+
zan hyperliquid info activeAssetData \
|
|
495
|
+
'{"user":"0x0000000000000000000000000000000000000000","coin":"ETH"}'
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
也可以从 stdin 读取对象,适合避免复杂内容进入 shell 历史:
|
|
499
|
+
|
|
500
|
+
```sh
|
|
501
|
+
printf '{"user":"0x0000000000000000000000000000000000000000"}' \
|
|
502
|
+
| zan hyperliquid info userFills --stdin
|
|
503
|
+
```
|
|
504
|
+
|
|
505
|
+
位置参数与 `--stdin` 互斥;payload 不能包含 `type`,也不能是数组、字符串或 `null`。成功结果按服务原样输出,可能包含账户相关信息,请谨慎保存日志。Info 方法由 `allowedHyperliquidInfoMethods` 精确控制,且必须是已选 Hyperliquid Network;CLI 不开放 Hyperliquid `/exchange` 写接口。
|
|
506
|
+
|
|
507
|
+
#### 余额与 ENS
|
|
508
|
+
|
|
509
|
+
```sh
|
|
510
|
+
zan evm data balance 0x0000000000000000000000000000000000000000
|
|
511
|
+
zan evm data balance 0x0000000000000000000000000000000000000000 --block latest
|
|
512
|
+
zan --network base-mainnet evm data balance vitalik.eth
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
ENS 通过同一 Project 的 `ethereum-mainnet` Network 解析,然后在目标 Network 查询余额。如果 Project 不支持 `ethereum-mainnet`,请改用十六进制地址。
|
|
516
|
+
|
|
517
|
+
#### 交易、回执与区块
|
|
518
|
+
|
|
519
|
+
```sh
|
|
520
|
+
zan evm tx <transaction-hash>
|
|
521
|
+
zan evm receipt <transaction-hash>
|
|
522
|
+
zan evm block latest
|
|
523
|
+
zan evm block 17000000
|
|
524
|
+
zan evm block 0x1036640
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
交易、回执或区块不存在时返回 `NOT_FOUND`。
|
|
528
|
+
|
|
529
|
+
#### Gas
|
|
530
|
+
|
|
531
|
+
```sh
|
|
532
|
+
zan evm gas
|
|
533
|
+
zan --json --network base-mainnet evm gas
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
结果包含当前 Gas Price;节点支持时还包含 Priority Fee。
|
|
537
|
+
|
|
538
|
+
#### 日志
|
|
539
|
+
|
|
540
|
+
`--from-block` 是必填参数,`--to-block` 默认是 `latest`:
|
|
541
|
+
|
|
542
|
+
```sh
|
|
543
|
+
zan evm logs --from-block latest
|
|
544
|
+
zan evm logs \
|
|
545
|
+
--from-block 17000000 \
|
|
546
|
+
--to-block 17000100 \
|
|
547
|
+
--address 0x0000000000000000000000000000000000000000
|
|
548
|
+
zan evm logs \
|
|
549
|
+
--from-block latest \
|
|
550
|
+
--topic 0x0000000000000000000000000000000000000000000000000000000000000000
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
当前版本返回原始日志,不执行 ABI 解码或分页。
|
|
554
|
+
|
|
555
|
+
### 自动化与 JSON 输出
|
|
556
|
+
|
|
557
|
+
推荐的自动化调用形式:
|
|
558
|
+
|
|
559
|
+
```sh
|
|
560
|
+
zan --json --no-interactive --project <project-id> --network <network-id> <command>
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
上例用于需要 Network 的链上命令;用量查询直接使用:
|
|
564
|
+
|
|
565
|
+
```sh
|
|
566
|
+
zan --json --no-interactive --project <project-id> usage
|
|
567
|
+
```
|
|
568
|
+
|
|
569
|
+
- 成功时,stdout 只包含一个完整 JSON 值。
|
|
570
|
+
- 失败时,stderr 只包含一个完整 JSON 错误。
|
|
571
|
+
- JSON 模式不输出进度提示。
|
|
572
|
+
- 非交互模式不读取交互输入、不打开浏览器。
|
|
573
|
+
- 显式的 `evm rpc --stdin` 仍会读取作为命令数据的 stdin。
|
|
574
|
+
|
|
575
|
+
错误示例:
|
|
576
|
+
|
|
577
|
+
```json
|
|
578
|
+
{
|
|
579
|
+
"error": {
|
|
580
|
+
"code": "SETUP_REQUIRED",
|
|
581
|
+
"message": "A ZAN Network must be selected.",
|
|
582
|
+
"hint": "Run: zan settings set network <network-id>",
|
|
583
|
+
"retryable": false
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
```
|
|
587
|
+
|
|
588
|
+
### 就绪检查与 Agent Manifest
|
|
589
|
+
|
|
590
|
+
检查本地配置、凭据库和 Session:
|
|
591
|
+
|
|
592
|
+
```sh
|
|
593
|
+
zan inspect
|
|
594
|
+
zan --json --no-interactive inspect
|
|
595
|
+
```
|
|
596
|
+
|
|
597
|
+
获取从真实命令树生成的 Agent Manifest:
|
|
598
|
+
|
|
599
|
+
```sh
|
|
600
|
+
zan agent manifest
|
|
601
|
+
zan --json --no-interactive agent manifest
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
Agent 可用 `inspect` 检查本地状态;`ready: false` 需结合实际命令判断。
|
|
605
|
+
例如缺少 Network 不影响已登录且已选择 Project 的 `usage` 查询。
|
|
606
|
+
|
|
607
|
+
### Agent Skill
|
|
608
|
+
|
|
609
|
+
项目提供 [zan-cli Skill](skills/zan-cli/SKILL.md),包含实际 CLI 的调用约定、
|
|
610
|
+
Project/Network 选择、套餐与 Key 用量、EVM/Hyperliquid 查询、RPC Key 拉取及钱包签名指引。
|
|
611
|
+
`skills/` 随 npm 包发布;安装 CLI 后仍需将技能目录放入 Agent 的发现路径。
|
|
612
|
+
|
|
613
|
+
npm 包发布后,安装 CLI 并选择 Agent 安装技能:
|
|
614
|
+
|
|
615
|
+
```sh
|
|
616
|
+
npm install -g @zan_team/cli
|
|
617
|
+
|
|
618
|
+
# 当前业务项目:在该项目目录执行
|
|
619
|
+
zan skills install --agent codex
|
|
620
|
+
zan skills install --agent claude-code
|
|
621
|
+
|
|
622
|
+
# 当前用户的所有项目
|
|
623
|
+
zan skills install --agent codex --global
|
|
624
|
+
zan skills install --agent claude-code --global
|
|
625
|
+
```
|
|
626
|
+
|
|
627
|
+
`--agent` 必填,可用值为 `codex`、`claude-code`。默认安装到当前工作目录,
|
|
628
|
+
不会向上查找 Git 根目录;`--global` 安装到操作系统用户主目录。
|
|
629
|
+
|
|
630
|
+
| Agent | 当前项目 | 用户全局 | 显式调用 |
|
|
631
|
+
| --- | --- | --- | --- |
|
|
632
|
+
| Codex | `.agents/skills/zan-cli` | `~/.agents/skills/zan-cli` | `$zan-cli` |
|
|
633
|
+
| Claude Code | `.claude/skills/zan-cli` | `~/.claude/skills/zan-cli` | `/zan-cli` |
|
|
634
|
+
|
|
635
|
+
目录规则分别遵循 [Codex](https://learn.chatgpt.com/docs/build-skills) 和
|
|
636
|
+
[Claude Code](https://code.claude.com/docs/en/skills) 的技能文档。
|
|
637
|
+
安装过程从当前 CLI 所在的 npm 包复制完整技能,不下载额外资源、不要求登录,
|
|
638
|
+
也不修改 Agent 的其他设置。
|
|
639
|
+
|
|
640
|
+
升级 CLI 后,对原 Agent 和安装范围再次运行同一安装命令即可更新:
|
|
641
|
+
|
|
642
|
+
```sh
|
|
643
|
+
npm install -g @zan_team/cli@latest
|
|
644
|
+
zan skills install --agent codex --global
|
|
645
|
+
zan skills install --agent claude-code --global
|
|
646
|
+
```
|
|
647
|
+
|
|
648
|
+
安装目录中的 `.zan-cli-install.json` 记录版本和文件摘要,重复执行且内容未变时
|
|
649
|
+
返回 `unchanged`。升级会替换完整目录并移除旧版本不再提供的资源。已有目录未经
|
|
650
|
+
本命令管理,或文件被手动修改、增加、删除时,默认保留原内容并提示冲突。
|
|
651
|
+
先备份自己的修改,再用 `--force` 显式替换整个 `zan-cli` 技能目录:
|
|
652
|
+
|
|
653
|
+
```sh
|
|
654
|
+
zan skills install --agent codex --global --force
|
|
655
|
+
```
|
|
656
|
+
|
|
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
|
+
```
|
|
671
|
+
|
|
672
|
+
### Shell 补全
|
|
673
|
+
|
|
674
|
+
```sh
|
|
675
|
+
zan completions bash
|
|
676
|
+
zan completions zsh
|
|
677
|
+
zan completions fish
|
|
678
|
+
```
|
|
679
|
+
|
|
680
|
+
命令将补全脚本写到 stdout,由用户按当前 shell 的加载方式保存或执行。
|
|
681
|
+
|
|
682
|
+
### 错误与退出码
|
|
683
|
+
|
|
684
|
+
| 退出码 | 含义 |
|
|
685
|
+
| -----: | ------------------------------------------ |
|
|
686
|
+
| `0` | 成功 |
|
|
687
|
+
| `1` | 内部错误 |
|
|
688
|
+
| `2` | 参数错误 |
|
|
689
|
+
| `3` | 认证、凭据库或必要设置缺失 |
|
|
690
|
+
| `4` | Project、Network、ENS 名称或查询资源不存在 |
|
|
691
|
+
| `5` | 限流 |
|
|
692
|
+
| `6` | 网络错误 |
|
|
693
|
+
| `7` | JSON-RPC 错误 |
|
|
694
|
+
| `8` | ZAN CLI API 错误 |
|
|
695
|
+
| `130` | 用户中断 |
|
|
696
|
+
|
|
697
|
+
只有限流、临时网络错误和服务端明确标记的临时错误适合自动重试。参数错误、认证拒绝和资源不存在不应自动重试。
|
|
698
|
+
|
|
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 请求。
|
|
719
|
+
|
|
720
|
+
### 安全注意事项
|
|
721
|
+
|
|
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` 只应在用户明确需要展示受保护结果字段时使用。
|
|
736
|
+
|
|
737
|
+
### 常见问题
|
|
738
|
+
|
|
739
|
+
**返回 `SETUP_REQUIRED`**
|
|
740
|
+
|
|
741
|
+
检查服务地址、当前 Project 和 Network:
|
|
742
|
+
|
|
743
|
+
```sh
|
|
744
|
+
zan settings show
|
|
745
|
+
zan project active
|
|
746
|
+
zan evm networks
|
|
747
|
+
zan inspect
|
|
748
|
+
```
|
|
749
|
+
|
|
750
|
+
**返回 `AUTH_REQUIRED` 或 `AUTH_EXPIRED`**
|
|
751
|
+
|
|
752
|
+
```sh
|
|
753
|
+
zan auth status --verify
|
|
754
|
+
zan auth login
|
|
755
|
+
```
|
|
756
|
+
|
|
757
|
+
**ENS 无法解析**
|
|
758
|
+
|
|
759
|
+
确认当前 Project 支持 `ethereum-mainnet`,或改用十六进制地址。
|
|
760
|
+
|
|
761
|
+
**Raw RPC 字符串参数被拒绝**
|
|
762
|
+
|
|
763
|
+
字符串参数必须是合法 JSON,例如使用 `'"latest"'`,不能直接传入 `latest`。
|
|
764
|
+
|
|
765
|
+
**自动化流程出现交互提示**
|
|
766
|
+
|
|
767
|
+
增加 `--no-interactive`,并显式提供命令所需参数;`usage` 只需 `--project`,
|
|
768
|
+
链上查询还需 `--network`。
|
|
769
|
+
|
|
770
|
+
**用量查询的 Key 数字与套餐数字不同**
|
|
771
|
+
|
|
772
|
+
Key 是项目的累计用量,套餐余额由账号下的项目共享,与控制台按套餐类型读取的余额一致。
|
|
773
|
+
`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)
|