@adep/cli 0.1.17 → 0.2.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.
Files changed (29) hide show
  1. package/README.md +96 -12
  2. package/dist/index.js +27103 -10486
  3. package/package.json +8 -6
  4. package/templates/app-desktop/README.md +51 -0
  5. package/templates/app-desktop/main.mjs +108 -0
  6. package/templates/app-desktop/offline-runtime.mjs +129 -0
  7. package/templates/app-desktop/package.json +49 -0
  8. package/templates/app-desktop/preload.cjs +45 -0
  9. package/templates/app-desktop/template.json +14 -0
  10. package/templates/app-desktop/window.mjs +53 -0
  11. package/templates/app-mobile/README.md +89 -0
  12. package/templates/app-mobile/adep.permissions.json +4 -0
  13. package/templates/app-mobile/bridge/gate.mjs +88 -0
  14. package/templates/app-mobile/capacitor.config.ts +23 -0
  15. package/templates/app-mobile/package.json +24 -0
  16. package/templates/app-mobile/plugins/adep-bridge/android/build.gradle +22 -0
  17. package/templates/app-mobile/plugins/adep-bridge/android/src/main/AndroidManifest.xml +9 -0
  18. package/templates/app-mobile/plugins/adep-bridge/android/src/main/java/com/adep/bridge/AdepBridge.kt +86 -0
  19. package/templates/app-mobile/plugins/adep-bridge/android/src/main/java/com/adep/bridge/AdepKeystore.kt +81 -0
  20. package/templates/app-mobile/plugins/adep-bridge/android/src/main/java/com/adep/bridge/AdepPermissionGate.kt +81 -0
  21. package/templates/app-mobile/plugins/adep-bridge/capacitor.plugin.json +10 -0
  22. package/templates/app-mobile/plugins/adep-bridge/dist/plugin.js +44 -0
  23. package/templates/app-mobile/plugins/adep-bridge/ios/AdepBridge.podspec +14 -0
  24. package/templates/app-mobile/plugins/adep-bridge/ios/Sources/AdepBridge.swift +69 -0
  25. package/templates/app-mobile/plugins/adep-bridge/ios/Sources/AdepKeychain.swift +58 -0
  26. package/templates/app-mobile/plugins/adep-bridge/ios/Sources/AdepPermissionGate.swift +82 -0
  27. package/templates/app-mobile/plugins/adep-bridge/package.json +14 -0
  28. package/templates/app-mobile/template.json +16 -0
  29. package/templates/app-mobile/web/adep-bridge.js +56 -0
package/README.md CHANGED
@@ -48,6 +48,8 @@
48
48
 
49
49
  - [`adep export`](#adep-export)
50
50
 
51
+ - [`adep app`](#adep-app)
52
+
51
53
  4. [配置](#配置)
52
54
 
53
55
  - [环境变量](#环境变量)
@@ -81,9 +83,12 @@ bun run packages/cli/src/index.ts --help
81
83
  ## 快速开始
82
84
 
83
85
  ```bash
84
- # 1. 登录平台(凭据保存在 ~/.adep/credentials,权限 0600)
86
+ # 1. 登录平台(打开浏览器用网页授权;凭据保存在 ~/.adep/credentials,权限 0600)
85
87
  adep login
86
- # 或指定平台与邮箱:adep login -s https://platform.example.com -e you@example.com
88
+ # 无浏览器环境(SSH / 无桌面):只打印验证码与链接,手工在浏览器里完成授权
89
+ adep login --no-browser
90
+ # 或不走浏览器,直接用邮箱密码登录(脚本 / 老平台)
91
+ adep login -s https://platform.example.com -e you@example.com -p '***'
87
92
 
88
93
  # 2. 初始化一个函数项目
89
94
  adep init my-app --template function
@@ -113,6 +118,28 @@ adep --json whoami
113
118
 
114
119
  失败时返回退出码 1 + `{"ok":false,"command":"...","error":{"code":"...","message":"..."}}`。
115
120
 
121
+ ### `adep login` / `whoami` / `logout`
122
+
123
+ `adep login` 缺省走**浏览器网页授权**(RFC 8628 设备授权流):CLI 向平台要一个设备码并把
124
+ `<平台>/device?user_code=XXXX` 打开,你在网页上确认「批准」后 CLI 自动换回会话并落盘凭据。
125
+
126
+ ```bash
127
+ adep login # 打开浏览器;终端会同时打印验证码与链接
128
+ adep login --no-browser # 不开浏览器:手工访问打印出来的链接(SSH / 无桌面)
129
+ adep login -s <url> # 指定平台(缺省 ADEP_SERVER,再缺省 https://adep.jajabjbj.top)
130
+ adep login -e <邮箱> -p <密码> # 邮箱密码直登,不发起浏览器流程(CI / 老平台)
131
+ adep whoami # 查看当前身份(读凭据并向平台确认会话仍有效)
132
+ adep logout # 通知平台注销并清除本地凭据
133
+ ```
134
+
135
+ - 判定「打不开浏览器」的三种情况:`--no-browser`、`ADEP_NO_BROWSER=1`、stdout 不是 TTY(CI)。
136
+ 三种都**不会**尝试打开浏览器,但都会打印验证码与链接——命令仍可完成登录。
137
+ - `--json` 模式下交互提示(验证码 / 链接)写 **stderr**,stdout 恒为恰好一个 JSON 对象。
138
+ - 失败语义:用户拒绝 → `LOGIN_DENIED`;验证码过期 → `DEVICE_CODE_EXPIRED`;
139
+ 平台没有设备授权端点(老版本)→ `LOGIN_UNSUPPORTED`(提示改用 `-e/-p`)。失败**不写凭据**。
140
+ - 凭据形态:浏览器登录落 `authType: "bearer"`(发 `Authorization: Bearer`),
141
+ 密码直登落 `authType: "cookie"`;旧凭据缺该字段按 cookie 兼容。
142
+
116
143
  ### `adep init`
117
144
 
118
145
  初始化项目(脚手架)。**默认 `fullstack` 模板**:生成与 Web IDE 项目**同一结构**的全栈骨架
@@ -133,7 +160,7 @@ adep init --list -s https://platform.example.com
133
160
  adep templates publish -t fullstack # 上传平台托管模板包(需登录;模板目录须含 template.json)
134
161
  ```
135
162
 
136
- 模板来源(CLI-020):`adep init` 优先下载**平台托管模板包**(`GET /api/v1/templates/:code/package`,
163
+ 模板来源(CLI-023):`adep init` 优先下载**平台托管模板包**(`GET /api/v1/templates/:code/package`,
137
164
  缓存到 `~/.adep/templates/<code>-<version>.json`);平台无包 / 下载失败 / 离线时自动回退本地内置模板。
138
165
  模板包为 JSON 文件映射,与本地内置模板共用同一套 `{{var}}` 渲染管线。
139
166
 
@@ -251,7 +278,7 @@ adep serve --db sqlite --db-file var/local.sqlite # 指定库文件
251
278
  ```bash
252
279
  adep publish # 缺省全栈:函数 deploy + 前端平台侧构建托管
253
280
  adep publish --only functions # 只发布云函数
254
- adep publish --only frontend # 只触发平台侧前端构建(FN-024)并切换站点版本
281
+ adep publish --only frontend # 只触发平台侧前端构建(FN-025)并切换站点版本
255
282
  adep publish -p my-app # 显式指定目标 slug
256
283
  ```
257
284
 
@@ -307,11 +334,11 @@ hello v1 https://my-app.platform.example.com/hello
307
334
  项目子命令组:创建 / 列出 / 查看 / 删除。子域地址由平台回显(`projectBaseUrl`),CLI 不自行拼域名。
308
335
 
309
336
  ```bash
310
- adep projects create game-arcade # → ✓ Project created · https://game-arcade.adep.top
311
- adep projects create game-arcade -n 游戏厅 # 展示名与 slug 分开
337
+ adep projects create notes-app # → ✓ Project created · https://notes-app.adep.top
338
+ adep projects create notes-app -n 笔记应用 # 展示名与 slug 分开
312
339
  adep projects list # slug \t name \t url
313
- adep projects info game-arcade # id \t slug \t name \t url
314
- adep projects delete game-arcade --yes # → ✓ Project deleted · game-arcade
340
+ adep projects info notes-app # id \t slug \t name \t url
341
+ adep projects delete notes-app --yes # → ✓ Project deleted · notes-app
315
342
  ```
316
343
 
317
344
  - `--name` 缺省取 slug:一行命令即可建项目。
@@ -454,16 +481,73 @@ adep export --out ./dist-export # 指定输出目录(缺省 ./exports)
454
481
 
455
482
  - `--json` 输出单个结果信封;导出失败(长任务未产出 / 自检不过)以退出码 1 + `EXPORT_FAILED` 结束,不静默给半截产物。
456
483
 
484
+ ### `adep app`
485
+
486
+ 应用壳工程(PRD §2.11 路径 A:在线运行时——**页面随包本地加载、云函数服务端执行**,改函数逻辑不需要重新发版)。
487
+ 两种壳:`--platform desktop`(缺省,Electron)与 `--platform mobile`(Capacitor 移动壳,见下)。
488
+
489
+ ```bash
490
+ adep app init -p my-app -n "我的应用" # 生成 Electron 壳工程(缺省 ./my-app-app)
491
+ cd my-app-app && npm install # 壳工程依赖(electron + electron-builder)
492
+
493
+ adep app build # 拉取已发布页面产物 → 注入 app/site/ → 出安装包
494
+ adep app build --platform win32 # 交叉指定目标平台(缺省当前平台)
495
+ adep app build --target dir # 只出未压缩目录(macOS 即 .app),本地快速验证
496
+ adep app build --prepare-only # 只拉产物 + 注入 + 出构建报告,不调 electron-builder
497
+ ```
498
+
499
+ - `app build` 只把项目**已发布**的前端产物(`adep publish --only frontend` 的产物)打进壳:
500
+ 经平台导出链路拉包 → 校验 manifest 与逐项 sha256 → 只取 `site/**` 注入 `app/site/`
501
+ (注入前清空旧产物,上一次构建留下的陈旧文件不会躺在安装包里);
502
+ - **函数源码不入包**:在线运行时下函数在服务端执行,构建报告里的函数清单只标
503
+ `runtime: "online"`(安装包内不含任何 `functions/` 文件);
504
+ - 产物版本回写 `adep.app.json` 的 `build` 段(`bundleVersion` = manifest 项目版本 + `site/` 内容指纹,
505
+ 内容不变则版本不变),同一份版本也写进 `dist/build-report.json`(`appName` / `bundleVersion` /
506
+ `functions` / `topAssets` 四字段 + 平台、产物路径等);
507
+ - 平台**不出具任何签名**:签名与公证由开发者本地完成;
508
+ - fail loud(都以退出码 1 结束且不产出安装包):项目从未发布前端(提示先跑
509
+ `publish --only frontend`)、壳工程依赖未安装(提示先 `npm install`)、导出包损坏或内容物校验和不匹配。
510
+ 其中「依赖未安装」的判定**有意排在导出之前**——导出是分钟级长任务,依赖没装不必白跑。
511
+
512
+ #### 移动壳(Capacitor,APP-009)
513
+
514
+ ```bash
515
+ adep app init -p my-app -n "我的应用" --platform mobile # Capacitor 骨架 + plugins/adep-bridge 原生桥
516
+ cd my-app-app && npm install
517
+ npx cap add ios && npx cap add android # 原生工程由 Capacitor 生成
518
+
519
+ adep app build --platform android --prepare-only # 只注入 + 出报告,先验证注入面
520
+ adep app build --platform android # gradlew assembleRelease → unsigned APK
521
+ adep app build --platform ios # xcodebuild archive(CODE_SIGNING_ALLOWED=NO)
522
+ ```
523
+
524
+ - 骨架含 `plugins/adep-bridge` **原生桥**(iOS Swift / Android Kotlin)与 host-side 门控镜像
525
+ `bridge/gate.mjs`:权限门控做在**原生侧**,未在 `adep.permissions.json` 声明的权限一律
526
+ `PERMISSION_DENIED` + 设备侧审计日志;`ownerKey` 只存 Keychain / Keystore。
527
+ - 移动平台**必须显式指定** `--platform ios|android`;产物是 **unsigned** 的 `.xcarchive` / APK。
528
+ - 签名 / 公证 / 上架由开发者自担,逐步指引见仓库 `docs/mobile-shell-signing.md`。
529
+
530
+ #### 离线运行时(`--offline`,APP-008)
531
+
532
+ ```bash
533
+ adep app build --offline # 消费服务端 .adepack:离线白名单函数 + 基线表 + 预置资源
534
+ ```
535
+
536
+ 把设备端运行时(`@adep/app-runtime`)装入 `app/offline/`:页面、白名单云函数与数据库基线表全部**随包本地执行**,
537
+ 不需要平台在线。白名单函数含**不可移植**写法时构建失败、退出码非 0,错误含违规类型与文件名行号。
538
+ `--offline` 与 `--platform` 互斥——离线包与平台无关,iOS 不做运行时下发离线包。
539
+
457
540
  ---
458
541
 
459
542
  ## 配置
460
543
 
461
544
  ### 环境变量
462
545
 
463
- | 变量 | 说明 | 缺省 |
464
- | ------------- | --------------------------------- | ----------------------- |
465
- | `ADEP_SERVER` | 平台地址(CLI 请求的默认 server) | `http://localhost:3000` |
466
- | `ADEP_HOME` | 凭据目录(测试隔离用) | `~/.adep` |
546
+ | 变量 | 说明 | 缺省 |
547
+ | ----------------- | --------------------------------- | ----------------------------- |
548
+ | `ADEP_SERVER` | 平台地址(CLI 请求的默认 server) | `https://adep.jajabjbj.top` |
549
+ | `ADEP_HOME` | 凭据目录(测试隔离用) | `~/.adep` |
550
+ | `ADEP_NO_BROWSER` | `1` = `adep login` 不打开浏览器 | 未设置(TTY 下自动打开) |
467
551
 
468
552
  ```bash
469
553
  export ADEP_SERVER=https://platform.example.com