@adep/cli 0.0.1

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 ADDED
@@ -0,0 +1,371 @@
1
+ # adep — AgentDeploy CLI
2
+
3
+ > 面向终端开发者的 AgentDeploy 命令行工具:**登录 / 初始化 / 本地调试 / 部署 / 数据库维护 / 云存储 / 静态托管 / 微前端组件(widget)** 一站式闭环。
4
+
5
+ `adep` 让你在一个项目目录里完成从**脚手架 → 本地调试 → 部署上线 → 数据与资源运维**的完整流程。它复用平台运行时内核(`@adep/runtime`),本地与线上的执行语义一致,离线、不装 Docker 也能开发。
6
+
7
+ <br />
8
+
9
+ <div align="center">
10
+
11
+ **[安装](#安装)** · **[快速开始](#快速开始)** · **[子命令](#子命令)** · **[配置](#配置)** · **[FAQ](#faq)**
12
+
13
+ </div>
14
+
15
+ ---
16
+
17
+ ## 目录
18
+
19
+ 1. [安装](#安装)
20
+
21
+ 2. [快速开始](#快速开始)
22
+
23
+ 3. [子命令](#子命令)
24
+
25
+ - [`adep init`](#adep-init)
26
+
27
+ - [`adep dev`](#adep-dev)
28
+
29
+ - [`adep deploy`](#adep-deploy)
30
+
31
+ - [`adep db`](#adep-db)
32
+
33
+ - [`adep storage`](#adep-storage)
34
+
35
+ - [`adep hosting`](#adep-hosting)
36
+
37
+ - [`adep widget`](#adep-widget)
38
+
39
+ 4. [配置](#配置)
40
+
41
+ - [环境变量](#环境变量)
42
+
43
+ - [`adep.config.ts`](#adepconfigts)
44
+
45
+ 5. [常用示例](#常用示例)
46
+
47
+ 6. [FAQ](#faq)
48
+
49
+ 7. [相关](#相关)
50
+
51
+ ---
52
+
53
+ ## 安装
54
+
55
+ ```bash
56
+ # 通过 npm 全局安装
57
+ npm install -g @adep/cli
58
+ # 或使用 bun
59
+ bun add -g @adep/cli
60
+ # 发布前本地调试:从仓库根目录
61
+ bun run packages/cli/src/index.ts --help
62
+ ```
63
+
64
+ > **要求**:Node ≥ 22.19,或 Bun ≥ 1.3(Bun 可免编译直接运行 TS,推荐用于本地开发)。
65
+ > 安装后运行 `adep --help` 查看全部可用命令。
66
+
67
+ ---
68
+
69
+ ## 快速开始
70
+
71
+ ```bash
72
+ # 1. 登录平台(凭据保存在 ~/.adep/credentials,权限 0600)
73
+ adep login
74
+ # 或指定平台与邮箱:adep login -s https://platform.example.com -e you@example.com
75
+
76
+ # 2. 初始化一个函数项目
77
+ adep init my-app --template function
78
+
79
+ # 3. 进入项目,本地调试(监听 functions/,支持热重载)
80
+ cd my-app
81
+ adep dev
82
+ # → http://127.0.0.1:8787/hello
83
+
84
+ # 4. 部署上线
85
+ adep deploy
86
+ ```
87
+
88
+ 三步即可把本地 `functions/hello.ts` 发到线上并得到公网访问地址。
89
+
90
+ ---
91
+
92
+ ## 子命令
93
+
94
+ 所有子命令都支持全局 `--json` 标志,以机器可读的 JSON 信封输出(适合 Agent / 脚本调用):
95
+
96
+ ```bash
97
+ adep --json whoami
98
+ # → {"ok":true,"command":"whoami","data":{"email":"...","server":"..."}}
99
+ ```
100
+
101
+ 失败时返回退出码 1 + `{"ok":false,"command":"...","error":{"code":"...","message":"..."}}`。
102
+
103
+ ### `adep init`
104
+
105
+ 初始化项目(脚手架),模板二选一:
106
+
107
+ | 模板 | 说明 |
108
+ | ---------- | --------------------------------------------- |
109
+ | `empty` | 仅 `adep.config.ts` + 空入口,不生成示例函数 |
110
+ | `function` | 生成一个示例函数 `functions/hello.ts`(默认) |
111
+
112
+ ```bash
113
+ adep init my-app # 默认 function 模板
114
+ adep init my-app -t empty # 空模板
115
+ adep init --list # 从平台 GET /api/v1/templates 列出可用模板
116
+ adep init --list -s https://platform.example.com
117
+ ```
118
+
119
+ 产物结构(`function` 模板):
120
+
121
+ ```
122
+ my-app/
123
+ ├── adep.config.ts # 项目标识(dev / deploy 按此识别)
124
+ ├── functions/
125
+ │ ├── hello.ts # 示例函数(deploy 后经 /hello 触发)
126
+ │ └── README.md
127
+ ├── README.md
128
+ └── .gitignore # 已忽略 node_modules/ data/ .adep/
129
+ ```
130
+
131
+ > 目录已存在时会拒绝覆盖(fail loud),不会静默改写你的代码。
132
+
133
+ ### `adep dev`
134
+
135
+ 本地调试:监听 `functions/`(以及 `.env.local` / `adep.config.ts`)变化并热重载,默认监听 `http://127.0.0.1:8787/<fnName>`,冷启动 ≤ 1.5s,文件变更到可被调用 ≤ 300ms。
136
+
137
+ ```bash
138
+ adep dev # 默认端口 8787
139
+ adep dev -p 3000 # 指定端口
140
+ ```
141
+
142
+ - **模拟运行时**:默认使用进程内模拟运行时(`@adep/runtime` + 本地模拟器),**不连云端、不装 Docker、断网也能开发**——只替换传输与持久化,不改写函数语义。
143
+
144
+ - **能力注入**:自动装配 `cloud.db` / `cloud.storage` / `cloud.realtime`,语义与线上一致。
145
+
146
+ - **环境变量**:读取 `.env.local` / `.env` 的键值,注入执行沙箱(`process.env[KEY]`)。
147
+
148
+ - **能力边界**:启动时打印一行边界清单(如下),提示本地与线上的差异:
149
+
150
+ - 定时/事件触发器只登记,本地以手工 HTTP 调用替代;
151
+
152
+ - realtime 为单进程内存广播,线上多实例语义不同;
153
+
154
+ - 本地不执行计量 / 配额门禁,不计费。
155
+
156
+ ```bash
157
+ [adep] dev server listening on http://127.0.0.1:8787(Ctrl-C 退出)
158
+ [adep] curl 示例:curl http://127.0.0.1:8787/hello
159
+ ...
160
+ ```
161
+
162
+ ### `adep deploy`
163
+
164
+ 增量部署:扫描本地 `functions/` 计算内容哈希 → 调平台 `/api/v1/deploy/diff` 拿差异清单 → 仅上传变更函数 → 发布 → 输出访问域名。
165
+
166
+ ```bash
167
+ adep deploy # 项目 slug 取 adep.config.ts 的 name
168
+ adep deploy -p my-app # 显式指定目标 slug
169
+ ```
170
+
171
+ - 本地 `functions/<name>.ts` 对应平台函数 `<name>`(入口文件固定为 `index.ts`)。
172
+
173
+ - **幂等**:内容与已发布版本一致时输出 `no changes`,不产生新版本。
174
+
175
+ - 成功输出每个函数的名字 / 版本 / 访问地址:
176
+
177
+ ```bash
178
+ hello v1 https://my-app.platform.example.com/hello
179
+ ```
180
+
181
+ ### `adep db`
182
+
183
+ 项目数据库维护子命令组:启动 / 状态 / 停止 / SQL 执行 / 快照 / 时间点回滚。项目参数缺省取 `adep.config.ts` 的 `name`(也可用 `-p` 显式指定)。
184
+
185
+ ```bash
186
+ adep db start # 启动项目数据库(已存在则重新激活,不重建数据)
187
+ adep db status # 查询状态与用量(体积 / 表数 / 行数)
188
+ adep db stop # 停止数据库(连接关闭并标记;文件保留)
189
+
190
+ # 执行单条 SQL;写 / 破坏性语句需 --confirm-table 二次确认目标表名
191
+ adep db exec --sql "SELECT * FROM users"
192
+ adep db exec --sql "DELETE FROM users WHERE id = 1" --confirm-table users
193
+
194
+ # 快照(付费档位):列出 / 创建 / 还原
195
+ adep db snapshot list
196
+ adep db snapshot create
197
+ adep db snapshot restore <snapshotId>
198
+
199
+ # 时间点回滚(团队版,基于变更流重放)
200
+ adep db rollback --to 2026-01-01T00:00:00.000Z
201
+ ```
202
+
203
+ `db exec` 人读模式下返回对齐文本表(结果行截断时会提示),`--json` 输出结构化结果。
204
+
205
+ ### `adep storage`
206
+
207
+ 云存储 / 文件存储子命令组:上传 / 下载 / 列表 / 删除。
208
+
209
+ ```bash
210
+ adep storage upload ./avatar.png --path avatars/a.png # 缺省 private(签名访问)
211
+ adep storage upload ./banner.png --path site/banner.png --visibility public # public 直连
212
+ adep storage download avatars/a.png [-o 本地输出路径] # 自动解析签名 / 直连 URL 落盘
213
+ adep storage ls [--prefix site/] # 按前缀列出(附访问 URL)
214
+ adep storage rm avatars/a.png
215
+ ```
216
+
217
+ - **上传**:multipart,单文件 ≤ 50MB;`path` 为桶内相对路径,`visibility` 决定 public 直连或 private 签名。
218
+
219
+ - **下载**:先列表解析出服务端生成的 URL(public 直连 / private 15 分钟签名),再取回内容——private 文件无需 CLI 自行签发签名。
220
+
221
+ - 所有命令都支持 `-p <slug>` 指定项目。
222
+
223
+ ### `adep hosting`
224
+
225
+ 静态托管子命令组:查看 / 部署 / 拉取 / 配置。站点文件即项目桶 `site/` 前缀下的 public 文件。
226
+
227
+ ```bash
228
+ adep hosting info # 查看托管配置、站点地址与文件树
229
+ adep hosting deploy ./dist # 递归上传目录到 site/ 并打开托管
230
+ adep hosting deploy ./dist --spa # 同时启用 SPA 回退(无匹配静态文件回 index.html)
231
+ adep hosting pull [-o ./site] # 拉取站点公开文件到本地(跳过 private 托管配置)
232
+ adep hosting config --enabled true --spa true # 更新托管开关 / SPA 回退(幂等)
233
+ ```
234
+
235
+ - **deploy**:把本地目录递归上传为 `site/<rel>`(public)→ 打开托管开关 → 输出站点地址。
236
+
237
+ - **pull**:只拉公开站点文件,private 侧载的托管配置(`site/.hosting.json`)不会进站点目录。
238
+
239
+ ### `adep widget`
240
+
241
+ 微前端组件(widget)的子命令组:脚手架 / 本地沙箱 / 发布。
242
+
243
+ #### `adep widget init`
244
+
245
+ ```bash
246
+ adep widget init my-widget # 默认 vue3-ts 模板
247
+ adep widget init my-widget -t react-ts # 或 react-ts
248
+ ```
249
+
250
+ widget 名称需以小写字母开头,仅含小写字母 / 数字 / 连字符。
251
+
252
+ #### `adep widget dev`
253
+
254
+ 本地宿主沙箱:主题变量 + mock props + token 注入 + 热更新,默认 `http://127.0.0.1:8788`。
255
+
256
+ ```bash
257
+ adep widget dev # 默认端口 8788
258
+ adep widget dev -p 9000
259
+ # 在浏览器打开 ?token=<...> 可注入鉴权 token
260
+ ```
261
+
262
+ #### `adep widget publish`
263
+
264
+ 按框架构建 → 上传平台静态资源 → 版本化输出 URL:
265
+
266
+ ```bash
267
+ adep widget publish -p my-app
268
+ # → my-widget v0.1.0 https://my-app.platform.example.com/widgets/my-widget/0.1.0/index.js
269
+ ```
270
+
271
+ 版本取自 widget `package.json` 的 `version`(缺省 `0.1.0`);产物是单个 ESM 文件。
272
+
273
+ ---
274
+
275
+ ## 配置
276
+
277
+ ### 环境变量
278
+
279
+ | 变量 | 说明 | 缺省 |
280
+ | ------------- | --------------------------------- | ----------------------- |
281
+ | `ADEP_SERVER` | 平台地址(CLI 请求的默认 server) | `http://localhost:3000` |
282
+ | `ADEP_HOME` | 凭据目录(测试隔离用) | `~/.adep` |
283
+
284
+ ```bash
285
+ export ADEP_SERVER=https://platform.example.com
286
+ export ADEP_HOME=~/.adep
287
+ ```
288
+
289
+ > 也可通过 `-s` / `-e` / `-p` 等子命令参数覆盖。
290
+
291
+ ### `adep.config.ts`
292
+
293
+ `adep init` 生成的项目标识文件,CLI 的 `dev` / `deploy` 按此识别项目:
294
+
295
+ ```ts
296
+ import { defineConfig } from 'adep/config'
297
+
298
+ export default defineConfig({
299
+ name: 'my-app', // 项目名(deploy 的默认 slug)
300
+ template: 'function', // 模板:empty | function
301
+ })
302
+ ```
303
+
304
+ ---
305
+
306
+ ## 常用示例
307
+
308
+ ```bash
309
+ # 登录后查看当前身份
310
+ adep whoami
311
+
312
+ # 登出并清除本地凭据
313
+ adep logout
314
+
315
+ # 列出平台可用的脚手架模板
316
+ adep init --list
317
+
318
+ # 数据库运维:启动 → 看状态 → 跑 SQL → 打快照
319
+ adep db start
320
+ adep db status
321
+ adep db exec --sql "SELECT count(*) FROM users"
322
+ adep db snapshot create
323
+
324
+ # 云存储:上传 / 下载 / 删除
325
+ adep storage upload ./logo.png --path assets/logo.png --visibility public
326
+ adep storage download assets/logo.png -o ./logo.png
327
+
328
+ # 静态托管:本地构建产物一键上线,随时拉回
329
+ adep hosting deploy ./dist
330
+ adep hosting pull -o ./site
331
+
332
+ # 以 JSON 输出(Agent / CI 可用)
333
+ adep --json deploy -p my-app
334
+ ```
335
+
336
+ ---
337
+
338
+ ## FAQ
339
+
340
+ **Q:`adep login`** **失败提示** **`NOT_LOGGED_IN`** **/** **`SERVER_UNREACHABLE`?**
341
+ 先确认 `ADEP_SERVER`(或 `-s`)指向可访问的平台地址,再重新 `adep login`。凭据保存在 `~/.adep/credentials`(权限 `0600`)。
342
+
343
+ **Q:`adep dev`** **需要 Docker / 云连接吗?**
344
+ 不需要。默认使用进程内模拟运行时(`@adep/runtime`),断网也能开发——只替换传输与持久化,不改变函数语义。
345
+
346
+ **Q:本地开发与线上行为会不一致吗?**
347
+ 模拟器刻意保持执行语义一致:`cloud.db` / `cloud.storage` / `cloud.realtime` 能力装配复用线上逻辑。差异点仅限传输层与持久化层,且 `adep dev` 启动时会打印边界清单(触发器不自动执行、无跨实例广播、不在本地计量计费)。
348
+
349
+ **Q:`adep deploy`** **显示** **`no changes`?**
350
+ 这是幂等设计:本地函数内容与已发布版本一致时复用当前版本,不产生新版本。想强制更新需修改函数内容。
351
+
352
+ **Q:项目名 / widget 名的命名规则?**
353
+ `init` 项目名:小写字母开头,仅含小写字母 / 数字 / 连字符(≤ 63 字符)。`widget init` 名称同规则。
354
+
355
+ **Q:`adep db exec`** **的** **`--confirm-table`** **是做什么的?**
356
+ 写 / 破坏性语句(DELETE / DROP / ALTER…)服务端要求二次确认目标表名,`--confirm-table users` 即输入目标表名以放行;只读查询无需该参数。
357
+
358
+ **Q:`adep storage`** **/** **`adep hosting`** **需要在平台项目目录里跑吗?**
359
+ 不需要。它们通过 `-p <slug>` 指定目标项目,缺省才读取 `adep.config.ts` 的 `name`——在任何目录下都能对指定项目做资源运维。
360
+
361
+ **Q:private 文件如何下载?**
362
+ `adep storage download` 会自动调用平台列表接口拿到服务端生成的 15 分钟签名 URL 再取回内容,无需 CLI 自行签发签名;公网访问同样走该 URL。
363
+
364
+ **Q:`--json`** **输出长什么样?**
365
+ 每个命令输出一个 JSON 对象:成功 `{"ok":true,"command":"...","data":{...}}`,预期内失败 `{"ok":false,"command":"...","error":{"code":"...","message":"..."}}` 且退出码为 1。
366
+
367
+ ---
368
+
369
+ ## 相关
370
+
371
+ - `@adep/runtime` —— 平台运行时内核(执行器 + 本地模拟运行时 + 能力装配),`adep dev` 复用其保证本地/线上语义一致。