@h-ai/cli 0.1.0-alpha.65 → 0.1.0-alpha.66
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.en.md +13 -7
- package/README.ja.md +13 -7
- package/README.md +14 -8
- package/dist/{chunk-IPG3QNYK.js → chunk-FWN5B54L.js} +36 -4
- package/dist/chunk-FWN5B54L.js.map +1 -0
- package/dist/{chunk-47V5OT22.js → chunk-QYX6V7H2.js} +17 -43
- package/dist/chunk-QYX6V7H2.js.map +1 -0
- package/dist/cli-config-templates-3XSFIXBP.js +5 -0
- package/dist/{cli-config-templates-SJ2MBIR7.js.map → cli-config-templates-3XSFIXBP.js.map} +1 -1
- package/dist/{cli-skill-templates-A5VIR5J6.js → cli-skill-templates-TSYEQTCY.js} +3 -3
- package/dist/{cli-skill-templates-A5VIR5J6.js.map → cli-skill-templates-TSYEQTCY.js.map} +1 -1
- package/dist/index.js +273 -208
- package/dist/index.js.map +1 -1
- package/dist/{src-6PPBKQ6Q.js → src-RDQ2EIBT.js} +506 -488
- package/dist/src-RDQ2EIBT.js.map +1 -0
- package/package.json +8 -8
- package/templates/apps/api/.dockerignore.hbs +4 -5
- package/templates/apps/api/.gitignore.hbs +2 -1
- package/templates/apps/api/Dockerfile.hbs +2 -15
- package/templates/apps/api/apps/{{projectName}}-service/README.md.hbs +2 -2
- package/templates/apps/api/apps/{{projectName}}-service/package.json.hbs +0 -1
- package/templates/apps/api/hai.build.json.hbs +1 -0
- package/templates/apps/api/package.json.hbs +5 -8
- package/templates/apps/fullstack/.dockerignore.hbs +4 -5
- package/templates/apps/fullstack/.gitignore.hbs +2 -1
- package/templates/apps/fullstack/Dockerfile.hbs +3 -15
- package/templates/apps/fullstack/apps/{{projectName}}-app/README.md.hbs +0 -3
- package/templates/apps/fullstack/apps/{{projectName}}-app/package.json.hbs +0 -2
- package/templates/apps/fullstack/apps/{{projectName}}-app/vite.config.ts.hbs +2 -2
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/README.md.hbs +3 -6
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/package.json.hbs +2 -3
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/src/lib.rs.hbs +73 -2
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/tauri.conf.json.hbs +2 -2
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/vite.config.ts.hbs +2 -2
- package/templates/apps/fullstack/apps/{{projectName}}-web/README.md.hbs +2 -6
- package/templates/apps/fullstack/apps/{{projectName}}-web/package.json.hbs +0 -2
- package/templates/apps/fullstack/apps/{{projectName}}-web/vite.config.ts.hbs +2 -2
- package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +1 -0
- package/templates/apps/fullstack/hai.build.json.hbs +7 -0
- package/templates/apps/fullstack/package.json.hbs +5 -12
- package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +2 -2
- package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +0 -1
- package/templates/apps/fullstack/packages/{{projectName}}-shared/README.md.hbs +1 -1
- package/templates/apps/mobile-app/index.html.hbs +1 -0
- package/templates/apps/mobile-app/public/runtime-config.js +1 -0
- package/templates/apps/mobile-app/src/lib/api.ts.hbs +2 -1
- package/templates/apps/mobile-app/src/lib/app-config.ts.hbs +3 -2
- package/templates/base/.dockerignore.hbs +4 -5
- package/templates/base/.gitignore.hbs +2 -1
- package/templates/base/Dockerfile.hbs +5 -22
- package/templates/base/docker/nginx.conf.hbs +6 -0
- package/templates/base/hai.build.json.hbs +1 -0
- package/templates/base/package.json.hbs +13 -17
- package/templates/base/svelte.config.js.hbs +2 -0
- package/templates/base/vite.config.ts.hbs +6 -2
- package/templates/shared/.gitattributes +5 -0
- package/templates/shared/container-runtime-config.sh +30 -0
- package/templates/shared/run-e2e.mjs +65 -0
- package/templates/shared/vite-runtime-config.ts +54 -0
- package/templates/skills/hai-app-create/development.md +3 -1
- package/templates/skills/hai-app-create/reference.md +2 -2
- package/templates/skills/hai-build/SKILL.md +16 -1
- package/templates/skills/hai-deploy/SKILL.md +52 -260
- package/templates/skills/hai-deploy/middleware.md +8 -14
- package/templates/skills/hai-ui/reference.md +2 -0
- package/dist/chunk-47V5OT22.js.map +0 -1
- package/dist/chunk-IPG3QNYK.js.map +0 -1
- package/dist/cli-config-templates-SJ2MBIR7.js +0 -5
- package/dist/src-6PPBKQ6Q.js.map +0 -1
package/README.en.md
CHANGED
|
@@ -4,8 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
[Framework home](../../README.en.md) · Related modules: [@h-ai/core](../core/README.en.md)
|
|
6
6
|
|
|
7
|
+
For creation, traditional/AI-first development, compilation, packaging, deployment, and upgrades, follow the [complete usage guide](../../docs/usage/README.en.md). This page provides detailed CLI and template references.
|
|
8
|
+
|
|
7
9
|
> hai Agent Framework CLI: interactive project scaffolding and code generation.
|
|
8
10
|
|
|
11
|
+
`pnpm build` / `hai build` compiles source by default. Use `pnpm build --target docker` to build/export app + optional Web images (Podman first, Docker fallback), or `pnpm build --target desktop --platform windows|linux|macos` for Tauri on the matching host. Build does not select deployment environments. `hai deploy` consumes existing artifacts and uploads one Compose tar; `--bundle-only --output release.tar` generates a manual-transfer bundle without SSH. Fullstack `pnpm run deploy --env test` publishes API/Web together. See [deploy usage and offline prerequisites](../deploy/README.en.md). Test artifacts are cleaned in finally/teardown, including failures.
|
|
12
|
+
|
|
9
13
|
## Capabilities
|
|
10
14
|
|
|
11
15
|
`hai deploy` exits nonzero on missing modules/configuration, credential loading, scanning, initialization, deployment, or closure failures. Scripts must check the exit code; only complete deployment success can unlock subsequent steps.
|
|
@@ -199,14 +203,16 @@ Run `hai deploy --env test` to check `.env.test` first, then choose defaults, cu
|
|
|
199
203
|
|
|
200
204
|
Choose “deploy directly” in the wizard, or run `hai deploy packages/my-app-serv --env prod --yes --skip-middleware`, to skip all middleware prompts, configuration writes and provisioning when your environment is complete. Missing deployment targets are guided through SSH/Vercel setup. Host, ports, key paths, remote directory and tokens are saved only in Git-ignored `.env.local` and reused on later runs. Edit `HAI_DEPLOY_PROVIDER` there to change the target; supply private key paths only.
|
|
201
205
|
|
|
202
|
-
Fullstack deploys only the selected API package; publish Web separately. docker-ssh builds locally, transfers an image tar, Compose, runtime environment and startup script through SCP, then loads and starts them remotely. `--skip-build` does not skip container builds. Node 20 / pnpm 9.5.0 are unsupported. See the [deploy guide](../deploy/README.en.md) for commands, offline materials and Web publishing, and the [middleware reference](templates/skills/hai-deploy/middleware.md) for connection fields. Deployment regression: `pnpm --filter @h-ai/cli test:deploy-gates`.
|
|
203
|
-
|
|
204
206
|
## Global options
|
|
205
207
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
|
209
|
-
|
|
|
208
|
+
See the [usage guide](../../docs/usage/README.en.md) for build/deploy meanings, defaults, and examples. Deliverables use the application root package.json version, not the CLI version.
|
|
209
|
+
|
|
210
|
+
| Option | Description | Default | Example |
|
|
211
|
+
| ------------------ | ----------------- | ----------------- | ----------------------------- |
|
|
212
|
+
| `-v, --verbose` | Verbose output | false | `hai create my-app --verbose` |
|
|
213
|
+
| `-C, --cwd <path>` | Working directory | Current directory | `hai build --cwd ../my-app` |
|
|
214
|
+
| `-h, --help` | Command help | false | `hai build --help` |
|
|
215
|
+
| `-V, --version` | CLI version | false | `hai --version` |
|
|
210
216
|
|
|
211
217
|
## Local development usage
|
|
212
218
|
|
|
@@ -293,7 +299,7 @@ Successful screenshots default to the CLI's `test-results/scaffold-evidence/`. S
|
|
|
293
299
|
|
|
294
300
|
Failures and degraded-state messages must also be localized: website APIs use the request locale for AI fallback and email delivery status; undelivered messages must not be described as received. CLI deployment status uses cliM, and Gallery encryption limitations use bilingual messages. Verify unconfigured, failed, and successful paths in Chinese and English without paid service calls.
|
|
295
301
|
|
|
296
|
-
Provisioned configuration: Neon emits HAI_DB (PostgreSQL JSON), Upstash HAI_CACHE (Redis rediss URL JSON), and R2 HAI_STORAGE (flat S3 JSON). Email/SMS emit HAI_REACH_PROVIDERS; deployApp merges both channels while preserving YAML message templates, replacing the original providers array. Core supports whole-object/array overrides, with parents preceding leaves and schema validation retained.
|
|
302
|
+
Provisioned configuration: Neon emits HAI_DB (PostgreSQL JSON), Upstash HAI_CACHE (Redis rediss URL JSON), and R2 HAI_STORAGE (flat S3 JSON). Email/SMS emit HAI_REACH_PROVIDERS; deployApp merges both channels while preserving YAML message templates, replacing the original providers array. Core supports whole-object/array overrides, with parents preceding leaves and schema validation retained. Provisioned values are runtime-only and are never passed to build subprocesses. R2 needs existing S3 accessKeyId/secretAccessKey, Resend a verified-domain from address, and Alibaba Cloud approved signName/templates. Applications need matching `_db.yml` / `_cache.yml` / `_storage.yml` / `_reach.yml` loaded at startup; network clients require Node.
|
|
297
303
|
|
|
298
304
|
Deployment recovery: `ProvisionResult.resourceStatus` marks created/reused. `getDeployRecovery(result.error)` reads projectName, stage, platformProjectId, and resource lists; unknown means an uncertain request result that must first be checked in the provider console. Preserve returned IDs for failed resources. Recovery excludes envVars, raw exceptions, and credentials; the CLI shows resources and advice. Same-name retries reuse resources. Reused resources are never deleted automatically; clean up newly created resources only after manually confirming they are unused.
|
|
299
305
|
|
package/README.ja.md
CHANGED
|
@@ -4,8 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
[フレームワークのホーム](../../README.ja.md) · 関連モジュール:[@h-ai/core](../core/README.ja.md)
|
|
6
6
|
|
|
7
|
+
作成、手作業・AI first 開発、コンパイル、パッケージ、デプロイ、更新の流れは[完全ガイド](../../docs/usage/README.ja.md)を参照してください。本ページでは CLI コマンドとテンプレートの詳細を説明します。
|
|
8
|
+
|
|
7
9
|
> hai Agent Framework CLI:対話式のプロジェクト生成とコード生成ツール。
|
|
8
10
|
|
|
11
|
+
`pnpm build` はソースをコンパイルします。`pnpm build --target docker` は API/Web イメージをビルドして書き出し、Podman、Docker の順に選択します。Desktop は対応 OS 上で `pnpm build --target desktop --platform windows|linux|macos` から Tauri を実行します。ビルド時に環境は選択しません。deploy は既存成果物から Compose tar を作成して転送します。`--bundle-only --output release.tar` は SSH 接続せず手動配布用の tar のみを生成します。[利用方法とオフライン準備](../deploy/README.ja.md)を参照してください。テストの一時成果物は失敗時も finally/teardown で削除します。
|
|
12
|
+
|
|
9
13
|
## 主な機能
|
|
10
14
|
|
|
11
15
|
`hai deploy` はモジュール・設定不足、認証情報読み込み、走査、初期化、デプロイ、終了処理の失敗で非ゼロの終了コードを返します。スクリプトは終了コードを確認し、デプロイ全体の成功を後続処理の条件にしてください。
|
|
@@ -191,7 +195,7 @@ SvelteKit のサーバー layout は名称、バージョン、環境、既定
|
|
|
191
195
|
|
|
192
196
|
葉の環境変数は YAML に存在するパスだけを上書きします。コメントの項目は先に有効にするか、`HAI_DB`、`HAI_CACHE` などでオブジェクト全体を置き換えます。camelCase は分割せず、`connectTimeout` は `HAI_CACHE_CONNECTTIMEOUT` に対応します。言語一覧は各フロントエンド/shared の `project.inlang/settings.json` で管理し、`_core.yml` は既定言語のみを指定します。
|
|
193
197
|
|
|
194
|
-
Fullstack の `.env` は選択したモジュールの実行パラメーターを有効にします。YAML は同名の変数を参照し、ローカル既定値を保持します。未使用モジュールと任意フィールドはコメントとして残します。環境の切り替えは dev:test / dev:prod、
|
|
198
|
+
Fullstack の `.env` は選択したモジュールの実行パラメーターを有効にします。YAML は同名の変数を参照し、ローカル既定値を保持します。未使用モジュールと任意フィールドはコメントとして残します。環境の切り替えは dev:test / dev:prod、start:test / start:prod を使用します。
|
|
195
199
|
|
|
196
200
|
## 環境別デプロイ
|
|
197
201
|
|
|
@@ -199,14 +203,16 @@ Fullstack の `.env` は選択したモジュールの実行パラメーター
|
|
|
199
203
|
|
|
200
204
|
設定済みの環境ではウィザードで「直接デプロイ」を選ぶか、`hai deploy packages/my-app-serv --env prod --yes --skip-middleware` を実行すると、すべてのミドルウェア設定・書き込み・リソース作成を省略できます。不足する SSH/Vercel 接続情報は対話で補完し、ホスト、ポート、鍵のパス、リモートディレクトリー、Token を Git 対象外の `.env.local` にのみ保存して再利用します。接続先は `HAI_DEPLOY_PROVIDER` で更新できます。秘密鍵は内容ではなくパスを指定します。
|
|
201
205
|
|
|
202
|
-
fullstack は指定 API パッケージのみをデプロイし、Web は別途公開します。docker-ssh はローカルでビルドし、イメージ tar・Compose・実行環境・起動スクリプトを SCP 転送して遠隔で読み込み・起動します。`--skip-build` はコンテナビルドを省略しません。Node 20 / pnpm 9.5.0 は非対応です。コマンド・オフライン材料・Web 公開は [deploy ガイド](../deploy/README.ja.md)、接続項目は [ミドルウェア仕様](templates/skills/hai-deploy/middleware.md) を参照してください。回帰試験は `pnpm --filter @h-ai/cli test:deploy-gates` です。
|
|
203
|
-
|
|
204
206
|
## 共通オプション
|
|
205
207
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
|
209
|
-
|
|
|
208
|
+
ビルド/デプロイ引数の意味、既定値、例は[使用ガイド](../../docs/usage/README.ja.md)を参照してください。成果物には CLI の版ではなく、アプリルートの package.json の版を使います。
|
|
209
|
+
|
|
210
|
+
| オプション | 説明 | 既定値 | 例 |
|
|
211
|
+
| ------------------ | ------------------ | -------------------- | ----------------------------- |
|
|
212
|
+
| `-v, --verbose` | 詳細出力 | false | `hai create my-app --verbose` |
|
|
213
|
+
| `-C, --cwd <path>` | 作業ディレクトリー | 現在のディレクトリー | `hai build --cwd ../my-app` |
|
|
214
|
+
| `-h, --help` | コマンドヘルプ | false | `hai build --help` |
|
|
215
|
+
| `-V, --version` | CLI の版 | false | `hai --version` |
|
|
210
216
|
|
|
211
217
|
## 開発時のローカル利用
|
|
212
218
|
|
package/README.md
CHANGED
|
@@ -4,8 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
[框架首页](../../README.md) · 相关模块:[@h-ai/core](../core/README.md)
|
|
6
6
|
|
|
7
|
+
从创建、手工/AI first 开发到编译、打包、部署与升级,见[完整使用指南](../../docs/usage/README.md)。本页提供 CLI 命令与模板的详细参考。
|
|
8
|
+
|
|
7
9
|
> hai Agent Framework CLI — 交互式项目脚手架与代码生成工具。
|
|
8
10
|
|
|
11
|
+
`pnpm build` 默认编译源码;`pnpm build --target docker` 构建并导出 API/可选 Web 镜像,优先 Podman、其次 Docker。启用 Desktop 时用 `pnpm build --target desktop --platform windows|linux|macos` 在对应系统调用 Tauri。构建不选择部署环境。`hai deploy` 消费已有产物并上传一个 Compose tar;`--bundle-only --output release.tar` 仅生成包供手工搬运。fullstack 的 `pnpm run deploy --env test` 一并发布 API/Web。见 [部署用法与离线准备](../deploy/README.md)。测试临时产物由 finally/teardown 清理,失败也执行。
|
|
12
|
+
|
|
9
13
|
## 支持的能力
|
|
10
14
|
|
|
11
15
|
`hai deploy` 的缺失模块/配置、凭证加载、扫描、初始化、部署和关闭失败均以非零退出码结束;脚本必须检查退出码。只有完整部署成功才可作为后续步骤的成功条件。
|
|
@@ -189,16 +193,20 @@ Fullstack 的 `packages/<project>-serv/config/` 始终保留 13 份配置:`_co
|
|
|
189
193
|
|
|
190
194
|
叶子环境变量只覆盖 YAML 中已有的路径;注释掉的键须先取消注释,或使用 `HAI_DB`、`HAI_CACHE` 等整体对象覆盖。camelCase 不拆词,例如 `connectTimeout` 对应 `HAI_CACHE_CONNECTTIMEOUT`。语言列表由各前端与 shared 的 `project.inlang/settings.json` 维护,`_core.yml` 只配置默认语言。
|
|
191
195
|
|
|
192
|
-
Fullstack 的 `.env` 启用当前模块的运行参数;YAML 引用同名变量并保留本地回退。未启用模块的变量和可选 Schema 字段保留注释。使用 `dev:test` / `dev:prod
|
|
196
|
+
Fullstack 的 `.env` 启用当前模块的运行参数;YAML 引用同名变量并保留本地回退。未启用模块的变量和可选 Schema 字段保留注释。使用 `dev:test` / `dev:prod` 与服务端 `start:test` / `start:prod` 加载环境覆盖。
|
|
193
197
|
|
|
194
198
|
SvelteKit 的服务端 layout 只下发名称、版本、环境和默认语言等公开白名单。独立 mobile-app 的 Vite 配置在 Node 构建阶段通过 core 解析 YAML,再注入公开值及浏览器日志级别/格式;修改 YAML 或覆盖变量后需要重新构建。Fullstack 前端通过加密的 `app.info` 获取服务端公开元信息。任何模板都不能把完整 core/模块配置、密钥或日志脱敏上下文注入浏览器。
|
|
195
199
|
|
|
196
200
|
## 全局选项
|
|
197
201
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
|
201
|
-
|
|
|
202
|
+
构建和部署参数的含义、默认值与示例见[使用指南](../../docs/usage/README.md)。交付文件使用应用根 package.json 的版本,CLI 版本不会代替应用版本。
|
|
203
|
+
|
|
204
|
+
| 选项 | 说明 | 默认值 | 示例 |
|
|
205
|
+
| ------------------ | ------------- | -------- | ----------------------------- |
|
|
206
|
+
| `-v, --verbose` | 显示详细输出 | false | `hai create my-app --verbose` |
|
|
207
|
+
| `-C, --cwd <path>` | 指定工作目录 | 当前目录 | `hai build --cwd ../my-app` |
|
|
208
|
+
| `-h, --help` | 显示命令帮助 | false | `hai build --help` |
|
|
209
|
+
| `-V, --version` | 显示 CLI 版本 | false | `hai --version` |
|
|
202
210
|
|
|
203
211
|
## 开发阶段本地使用
|
|
204
212
|
|
|
@@ -261,11 +269,9 @@ node packages/cli/dist/index.js create ../my-new-project
|
|
|
261
269
|
|
|
262
270
|
配置已完备时可在向导中选择“直接部署”,或执行 `hai deploy packages/my-app-serv --env prod --yes --skip-middleware`,跳过全部中间件提示、配置写入和资源开通。部署目标缺失时引导填写 SSH/Vercel 参数;SSH 地址、端口、密钥路径、远程目录及 Token 只保存到被 Git 忽略的 `.env.local`,下次自动复用。可编辑其中的 `HAI_DEPLOY_PROVIDER` 更新目标;私钥只填写路径。
|
|
263
271
|
|
|
264
|
-
fullstack 的命令只部署指定 API 包,Web 需单独发布。docker-ssh 在本地构建镜像,经 SCP 上传镜像 tar、Compose、运行环境和启动脚本,在远程加载启动;`--skip-build` 不跳过容器构建。Node 20 / pnpm 9.5.0 不受支持。具体命令、离线材料及 Web 发布步骤见 [deploy 使用说明](../deploy/README.md),中间件字段见 [环境与中间件](templates/skills/hai-deploy/middleware.md)。部署回归执行 `pnpm --filter @h-ai/cli test:deploy-gates`。
|
|
265
|
-
|
|
266
272
|
失败与降级提示也必须国际化:官网 API 按请求 locale 生成 AI 降级/邮件送达状态;未送达不能称为已接收。CLI 部署状态使用 cliM,Gallery 加密能力限制使用双语消息。中文与英文分别验证未配置、失败和成功路径,无需调用付费服务。
|
|
267
273
|
|
|
268
|
-
云资源配置消费:Neon 输出 HAI_DB(PostgreSQL JSON),Upstash 输出 HAI_CACHE(Redis rediss URL JSON),R2 输出 HAI_STORAGE(扁平 S3 JSON)。邮件/短信输出 HAI_REACH_PROVIDERS 数组,deployApp 合并两个渠道并保留 YAML 中的消息模板;此覆盖替换原 providers 数组。Core 支持整体对象/数组覆盖,父节点优先于叶子变量,仍执行 Schema
|
|
274
|
+
云资源配置消费:Neon 输出 HAI_DB(PostgreSQL JSON),Upstash 输出 HAI_CACHE(Redis rediss URL JSON),R2 输出 HAI_STORAGE(扁平 S3 JSON)。邮件/短信输出 HAI_REACH_PROVIDERS 数组,deployApp 合并两个渠道并保留 YAML 中的消息模板;此覆盖替换原 providers 数组。Core 支持整体对象/数组覆盖,父节点优先于叶子变量,仍执行 Schema 校验;开通结果只进入目标运行环境,不传入构建进程。R2 必须提供已有 S3 accessKeyId/secretAccessKey;Resend 必须提供已验证域名的 from;阿里云必须提供已审核 signName/模板。应用须已有相应\_db/\_cache/\_storage/\_reach.yml 并在启动时加载,网络客户端需要 Node 运行时。
|
|
269
275
|
|
|
270
276
|
部署失败恢复:`ProvisionResult.resourceStatus` 标记 created/reused;`getDeployRecovery(result.error)` 读取 projectName、stage、platformProjectId 和资源清单,unknown 表示请求结果不确定,必须先在服务商控制台核对。失败资源已返回 ID 时保留该 ID。恢复结果不含 envVars、原始异常或连接凭证,CLI 会展示清单和建议。同名重试复用现有资源;不自动删除复用资源,新建资源仅在人工确认未被使用后清理。
|
|
271
277
|
|
|
@@ -70,7 +70,23 @@ var en_US_default = {
|
|
|
70
70
|
cli_deploy_middleware_plan: "Do you need to configure middleware for this deployment?",
|
|
71
71
|
cli_deploy_middleware_configure: "Review and configure each middleware service",
|
|
72
72
|
cli_deploy_middleware_skip: "Environment is complete; deploy directly",
|
|
73
|
-
cli_deploy_middleware_skipped: "Skipped all middleware configuration and provisioning. Deploying with current environment settings and existing services."
|
|
73
|
+
cli_deploy_middleware_skipped: "Skipped all middleware configuration and provisioning. Deploying with current environment settings and existing services.",
|
|
74
|
+
cli_build_failed: "Build command {command} failed (exit {code}).",
|
|
75
|
+
cli_build_use_pnpm: "Run via pnpm build to use the project pnpm executable.",
|
|
76
|
+
cli_build_target_invalid: "target must be compile, docker or desktop.",
|
|
77
|
+
cli_build_options_invalid: "runtime, network, sqlite-prebuild-mirror and no-http-proxy require docker; platform and arch require desktop.",
|
|
78
|
+
cli_build_version_invalid: "Set a valid three-part version in the application root package.json (for example 1.2.3 or 1.2.3-beta.1; at most 80 characters).",
|
|
79
|
+
cli_build_native_host: "Build Tauri on the matching OS (windows/linux/macos), with x64 or arm64 architecture. Install the Rust target, system SDK and packaging tools first.",
|
|
80
|
+
cli_build_desktop_missing: "No desktop directories in hai.build.json. Generate a desktop frontend or add an existing Tauri project.",
|
|
81
|
+
cli_build_images_missing: "hai.build.json requires one app image and at most one web image.",
|
|
82
|
+
cli_build_runtime_missing: "Install and start Podman or Docker. auto prefers a reachable Podman engine.",
|
|
83
|
+
cli_build_mirror_invalid: "SQLite mirror must use HTTP(S) without credentials, query or fragment.",
|
|
84
|
+
cli_build_ready: "Build ready ({runtime}): {path}. Reuse these images across deployment environments.",
|
|
85
|
+
cli_build_native_ready: "Tauri build ready: {target}. Installers are under src-tauri/target/{target}/release/bundle in each project.",
|
|
86
|
+
cli_deploy_bundle_provider: "--bundle-only requires the docker-ssh Compose provider.",
|
|
87
|
+
cli_deploy_bundle_local: "Generate bundle only; no server connection",
|
|
88
|
+
cli_deploy_bundle_ready: "Deployment bundle ready; the server has not been deployed.",
|
|
89
|
+
cli_deploy_bundle_path: "Deployment bundle: {path}"
|
|
74
90
|
};
|
|
75
91
|
|
|
76
92
|
// messages/zh-CN.json
|
|
@@ -138,7 +154,23 @@ var zh_CN_default = {
|
|
|
138
154
|
cli_deploy_middleware_plan: "\u662F\u5426\u9700\u8981\u914D\u7F6E\u672C\u6B21\u90E8\u7F72\u7684\u4E2D\u95F4\u4EF6\uFF1F",
|
|
139
155
|
cli_deploy_middleware_configure: "\u9010\u9879\u68C0\u67E5\u5E76\u914D\u7F6E\u4E2D\u95F4\u4EF6",
|
|
140
156
|
cli_deploy_middleware_skip: "\u73AF\u5883\u914D\u7F6E\u5DF2\u5B8C\u5907\uFF0C\u76F4\u63A5\u90E8\u7F72",
|
|
141
|
-
cli_deploy_middleware_skipped: "\u5DF2\u8DF3\u8FC7\u5168\u90E8\u4E2D\u95F4\u4EF6\u914D\u7F6E\u4E0E\u8D44\u6E90\u5F00\u901A\uFF0C\u4F7F\u7528\u5F53\u524D\u73AF\u5883\u914D\u7F6E\u53CA\u5DF2\u6709\u670D\u52A1\u76F4\u63A5\u90E8\u7F72\u3002"
|
|
157
|
+
cli_deploy_middleware_skipped: "\u5DF2\u8DF3\u8FC7\u5168\u90E8\u4E2D\u95F4\u4EF6\u914D\u7F6E\u4E0E\u8D44\u6E90\u5F00\u901A\uFF0C\u4F7F\u7528\u5F53\u524D\u73AF\u5883\u914D\u7F6E\u53CA\u5DF2\u6709\u670D\u52A1\u76F4\u63A5\u90E8\u7F72\u3002",
|
|
158
|
+
cli_build_failed: "\u6784\u5EFA\u547D\u4EE4 {command} \u5931\u8D25\uFF08\u9000\u51FA\u7801 {code}\uFF09\u3002",
|
|
159
|
+
cli_build_use_pnpm: "\u8BF7\u901A\u8FC7 pnpm build \u8FD0\u884C\u6784\u5EFA\uFF0C\u786E\u4FDD\u4F7F\u7528\u5F53\u524D\u9879\u76EE\u7684 pnpm\u3002",
|
|
160
|
+
cli_build_target_invalid: "target \u5FC5\u987B\u4E3A compile\u3001docker \u6216 desktop\u3002",
|
|
161
|
+
cli_build_options_invalid: "runtime\u3001network\u3001sqlite-prebuild-mirror\u3001no-http-proxy \u4EC5\u7528\u4E8E docker\uFF1Bplatform\u3001arch \u4EC5\u7528\u4E8E desktop\u3002",
|
|
162
|
+
cli_build_version_invalid: "\u8BF7\u5728\u5E94\u7528\u6839 package.json \u4E2D\u8BBE\u7F6E\u6709\u6548\u7684\u4E09\u6BB5\u5F0F\u7248\u672C\uFF08\u5982 1.2.3 \u6216 1.2.3-beta.1\uFF0C\u6700\u957F 80 \u5B57\u7B26\uFF09\u3002",
|
|
163
|
+
cli_build_native_host: "Tauri \u9700\u8981\u5728\u5BF9\u5E94\u7CFB\u7EDF\u4E0A\u6784\u5EFA\uFF08windows/linux/macos\uFF09\uFF0C\u67B6\u6784\u4E3A x64 \u6216 arm64\uFF1B\u8BF7\u5148\u5B89\u88C5\u5BF9\u5E94 Rust target\u3001\u7CFB\u7EDF SDK \u548C\u6253\u5305\u5DE5\u5177\u3002",
|
|
164
|
+
cli_build_desktop_missing: "hai.build.json \u672A\u914D\u7F6E desktop \u76EE\u5F55\u3002\u8BF7\u751F\u6210 desktop \u524D\u7AEF\u6216\u6DFB\u52A0\u5DF2\u6709\u7684 Tauri \u5DE5\u7A0B\u3002",
|
|
165
|
+
cli_build_images_missing: "hai.build.json \u5FC5\u987B\u5305\u542B\u4E00\u4E2A app \u955C\u50CF\u548C\u81F3\u591A\u4E00\u4E2A web \u955C\u50CF\u3002",
|
|
166
|
+
cli_build_runtime_missing: "\u8BF7\u5B89\u88C5\u5E76\u542F\u52A8 Podman \u6216 Docker\u3002auto \u4F18\u5148\u9009\u62E9\u53EF\u7528\u7684 Podman\u3002",
|
|
167
|
+
cli_build_mirror_invalid: "SQLite \u955C\u50CF\u5730\u5740\u5FC5\u987B\u4E3A HTTP(S)\uFF0C\u4E0D\u80FD\u5305\u542B\u51ED\u636E\u3001\u67E5\u8BE2\u6216\u7247\u6BB5\u3002",
|
|
168
|
+
cli_build_ready: "\u6784\u5EFA\u5B8C\u6210\uFF08{runtime}\uFF09\uFF1A{path}\u3002\u6B64\u955C\u50CF\u53EF\u7528\u4E8E\u4E0D\u540C\u90E8\u7F72\u73AF\u5883\u3002",
|
|
169
|
+
cli_build_native_ready: "Tauri \u6784\u5EFA\u5B8C\u6210\uFF1A{target}\uFF0C\u5B89\u88C5\u5305\u4F4D\u4E8E\u5BF9\u5E94\u5DE5\u7A0B src-tauri/target/{target}/release/bundle\u3002",
|
|
170
|
+
cli_deploy_bundle_provider: "--bundle-only \u4EC5\u9002\u7528\u4E8E docker-ssh\uFF0C\u8BF7\u9009\u62E9 Compose \u90E8\u7F72\u76EE\u6807\u3002",
|
|
171
|
+
cli_deploy_bundle_local: "\u4EC5\u751F\u6210\u90E8\u7F72\u5305\uFF0C\u4E0D\u8FDE\u63A5\u670D\u52A1\u5668",
|
|
172
|
+
cli_deploy_bundle_ready: "\u90E8\u7F72\u5305\u5DF2\u751F\u6210\uFF1B\u670D\u52A1\u5668\u5C1A\u672A\u90E8\u7F72\u3002",
|
|
173
|
+
cli_deploy_bundle_path: "\u90E8\u7F72\u5305\uFF1A{path}"
|
|
142
174
|
};
|
|
143
175
|
|
|
144
176
|
// src/cli-i18n.ts
|
|
@@ -432,5 +464,5 @@ async function generateProjectAiSupport(projectPath, skillNames, options = {}) {
|
|
|
432
464
|
}
|
|
433
465
|
|
|
434
466
|
export { cliM, generateModuleSkillFile, generateProjectAiSupport, generateSkillFiles, resolveCompatibleSkillNames, resolveSkillNamesForPackages };
|
|
435
|
-
//# sourceMappingURL=chunk-
|
|
436
|
-
//# sourceMappingURL=chunk-
|
|
467
|
+
//# sourceMappingURL=chunk-FWN5B54L.js.map
|
|
468
|
+
//# sourceMappingURL=chunk-FWN5B54L.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../messages/en-US.json","../messages/zh-CN.json","../src/cli-i18n.ts","../src/commands/cli-skill-templates.ts"],"names":[],"mappings":"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","file":"chunk-FWN5B54L.js","sourcesContent":["{\n \"cli_createFailed\": \"Failed to create project:\",\n \"cli_installFailed\": \"Dependency installation failed ({pm}).\",\n \"cli_commandLabel\": \"Command: {command}\",\n \"cli_exitCode\": \"Exit code: {code}\",\n \"cli_signal\": \"Signal: {signal}\",\n \"cli_selectHint\": \"- ↑/↓ select, Enter confirm\",\n \"cli_multiselectHint\": \"- Space select, Enter confirm\",\n \"cli_featuresPrompt\": \"Select features:\",\n \"cli_frontendsPrompt\": \"Select frontend targets:\",\n \"cli_invalidGenerateName\": \"Use a name starting with a letter, with only letters, digits, hyphens or underscores\",\n \"cli_generateOutsideWorkspace\": \"Generated files must remain inside the workspace, including symbolic link targets\",\n \"cli_generateExists\": \"File already exists: {path}. Use --force to overwrite it\",\n \"cli_deploy_module_missing\": \"Deploy module not found. Install @h-ai/deploy first:\",\n \"cli_deploy_load_credentials\": \"Loading credentials...\",\n \"cli_deploy_credentials_failed\": \"Failed to load credentials: {message}\",\n \"cli_deploy_credentials_loaded\": \"Loaded {count} credentials\",\n \"cli_deploy_load_config\": \"Loading deploy config...\",\n \"cli_deploy_config_missing\": \"Deploy config not found: {path}\",\n \"cli_deploy_config_hint\": \"Run: hai add deploy to generate config template\",\n \"cli_deploy_config_loaded\": \"Deploy config loaded\",\n \"cli_deploy_scanning\": \"Scanning application...\",\n \"cli_deploy_scan_failed\": \"Scan failed: {message}\",\n \"cli_deploy_scanned\": \"Scanned: {name} (SvelteKit: {sveltekit}, Services: {services})\",\n \"cli_deploy_none\": \"none\",\n \"cli_deploy_initializing\": \"Initializing deploy module...\",\n \"cli_deploy_init_failed\": \"Init failed: {message}\",\n \"cli_deploy_initialized\": \"Deploy module initialized\",\n \"cli_deploy_deploying\": \"Deploying application...\",\n \"cli_deploy_failed\": \"Deploy failed: {message}\",\n \"cli_deploy_success\": \"Deployment successful!\",\n \"cli_deploy_url\": \" URL: {url}\",\n \"cli_deploy_id\": \" ID: {id}\",\n \"cli_deploy_env\": \" Env: {names}\",\n \"cli_deploy_command_failed\": \"Deploy command failed\",\n \"cli_adminPasswordSaved\": \" Administrator: admin; the random initial password is saved as HAI_ADMIN_DEFAULT_PASSWORD in .env.local\",\n \"cli_deploy_environment\": \"Deployment environment (test / prod / other)\",\n \"cli_deploy_cancelled\": \"Deployment cancelled.\",\n \"cli_deploy_environment_hint\": \"Specify --env <environment>; non-interactive calls also require --yes, or use a terminal to select middleware.\",\n \"cli_deploy_middleware\": \"{service}: current default {backend}; {purpose}. Source: {source}\",\n \"cli_deploy_action\": \"How should {service} be configured?\",\n \"cli_deploy_default\": \"Use default configuration\",\n \"cli_deploy_custom\": \"Use custom configuration\",\n \"cli_deploy_keep\": \"Keep unchanged\",\n \"cli_deploy_backend\": \"Select the backend for {service}\",\n \"cli_deploy_field\": \"{name} ({description}; {constraint})\",\n \"cli_deploy_required\": \"This value is required\",\n \"cli_deploy_invalid_value\": \"The value does not satisfy the field constraints\",\n \"cli_deploy_cloud_unsupported\": \"No cloud provisioner is available for {backend}; use a custom connection or select a supported backend.\",\n \"cli_deploy_saved\": \"Configured {name}={value} (public values in the target environment file; credentials in .env.local)\",\n \"cli_deploy_secret\": \"[redacted]\",\n \"cli_deploy_missing_keep\": \"The target environment has no complete {service} configuration to keep.\",\n \"cli_deploy_s3_engine\": \"Select the S3 service implementation (application type remains s3)\",\n \"cli_deploy_target_reused\": \"Reusing deployment target {target}. Update connection settings in HAI_DEPLOY_PROVIDER in .env.local.\",\n \"cli_deploy_target_missing\": \"Deployment target is incomplete: {fields}. Set HAI_DEPLOY_PROVIDER in .env.local, or run interactively to complete setup.\",\n \"cli_deploy_target_platform\": \"Select the deployment platform\",\n \"cli_deploy_target_ssh\": \"SSH server (Docker / Podman Compose)\",\n \"cli_deploy_target_field\": \"{name} (saved only in .env.local)\",\n \"cli_deploy_target_ssh_hint\": \"Enter connection and port settings. Enter a private key file path, or leave blank for ssh-agent/default keys. Leave known_hosts blank for the OpenSSH default. New host fingerprints are trusted on first connection; changed fingerprints are rejected.\",\n \"cli_deploy_target_runtime\": \"Remote container runtime (auto prefers Podman)\",\n \"cli_deploy_target_saved\": \"Deployment target saved to Git-ignored .env.local and reused on subsequent runs.\",\n \"cli_deploy_middleware_plan\": \"Do you need to configure middleware for this deployment?\",\n \"cli_deploy_middleware_configure\": \"Review and configure each middleware service\",\n \"cli_deploy_middleware_skip\": \"Environment is complete; deploy directly\",\n \"cli_deploy_middleware_skipped\": \"Skipped all middleware configuration and provisioning. Deploying with current environment settings and existing services.\",\n \"cli_build_failed\": \"Build command {command} failed (exit {code}).\",\n \"cli_build_use_pnpm\": \"Run via pnpm build to use the project pnpm executable.\",\n \"cli_build_target_invalid\": \"target must be compile, docker or desktop.\",\n \"cli_build_options_invalid\": \"runtime, network, sqlite-prebuild-mirror and no-http-proxy require docker; platform and arch require desktop.\",\n \"cli_build_version_invalid\": \"Set a valid three-part version in the application root package.json (for example 1.2.3 or 1.2.3-beta.1; at most 80 characters).\",\n \"cli_build_native_host\": \"Build Tauri on the matching OS (windows/linux/macos), with x64 or arm64 architecture. Install the Rust target, system SDK and packaging tools first.\",\n \"cli_build_desktop_missing\": \"No desktop directories in hai.build.json. Generate a desktop frontend or add an existing Tauri project.\",\n \"cli_build_images_missing\": \"hai.build.json requires one app image and at most one web image.\",\n \"cli_build_runtime_missing\": \"Install and start Podman or Docker. auto prefers a reachable Podman engine.\",\n \"cli_build_mirror_invalid\": \"SQLite mirror must use HTTP(S) without credentials, query or fragment.\",\n \"cli_build_ready\": \"Build ready ({runtime}): {path}. Reuse these images across deployment environments.\",\n \"cli_build_native_ready\": \"Tauri build ready: {target}. Installers are under src-tauri/target/{target}/release/bundle in each project.\",\n \"cli_deploy_bundle_provider\": \"--bundle-only requires the docker-ssh Compose provider.\",\n \"cli_deploy_bundle_local\": \"Generate bundle only; no server connection\",\n \"cli_deploy_bundle_ready\": \"Deployment bundle ready; the server has not been deployed.\",\n \"cli_deploy_bundle_path\": \"Deployment bundle: {path}\"\n}\n","{\n \"cli_createFailed\": \"创建项目失败:\",\n \"cli_installFailed\": \"安装依赖失败({pm})。\",\n \"cli_commandLabel\": \"命令: {command}\",\n \"cli_exitCode\": \"退出码: {code}\",\n \"cli_signal\": \"信号: {signal}\",\n \"cli_selectHint\": \"- ↑/↓ 选择,回车确认\",\n \"cli_multiselectHint\": \"- 空格选择,回车确认\",\n \"cli_featuresPrompt\": \"选择功能:\",\n \"cli_frontendsPrompt\": \"选择前端目标:\",\n \"cli_invalidGenerateName\": \"名称必须以字母开头,且仅包含字母、数字、短横线或下划线\",\n \"cli_generateOutsideWorkspace\": \"生成文件必须位于工作目录内,符号链接目标也不得越界\",\n \"cli_generateExists\": \"文件已存在:{path}。使用 --force 才可覆盖\",\n \"cli_deploy_module_missing\": \"未找到部署模块,请先安装 @h-ai/deploy:\",\n \"cli_deploy_load_credentials\": \"正在加载凭证…\",\n \"cli_deploy_credentials_failed\": \"加载凭证失败:{message}\",\n \"cli_deploy_credentials_loaded\": \"已加载 {count} 项凭证\",\n \"cli_deploy_load_config\": \"正在加载部署配置…\",\n \"cli_deploy_config_missing\": \"未找到部署配置:{path}\",\n \"cli_deploy_config_hint\": \"运行 hai add deploy 生成部署配置模板\",\n \"cli_deploy_config_loaded\": \"部署配置已加载\",\n \"cli_deploy_scanning\": \"正在扫描应用…\",\n \"cli_deploy_scan_failed\": \"扫描失败:{message}\",\n \"cli_deploy_scanned\": \"已扫描:{name}(SvelteKit:{sveltekit},服务:{services})\",\n \"cli_deploy_none\": \"无\",\n \"cli_deploy_initializing\": \"正在初始化部署模块…\",\n \"cli_deploy_init_failed\": \"初始化失败:{message}\",\n \"cli_deploy_initialized\": \"部署模块已初始化\",\n \"cli_deploy_deploying\": \"正在部署应用…\",\n \"cli_deploy_failed\": \"部署失败:{message}\",\n \"cli_deploy_success\": \"部署成功!\",\n \"cli_deploy_url\": \" 地址:{url}\",\n \"cli_deploy_id\": \" 标识:{id}\",\n \"cli_deploy_env\": \" 环境变量:{names}\",\n \"cli_deploy_command_failed\": \"部署命令失败\",\n \"cli_adminPasswordSaved\": \" 管理员:admin;随机初始密码已保存到 .env.local 的 HAI_ADMIN_DEFAULT_PASSWORD\",\n \"cli_deploy_environment\": \"请输入部署环境(test / prod 等)\",\n \"cli_deploy_cancelled\": \"部署已取消。\",\n \"cli_deploy_environment_hint\": \"请指定 --env <环境>;非交互调用还需 --yes,或在交互终端逐项选择中间件。\",\n \"cli_deploy_middleware\": \"{service}:当前默认 {backend};{purpose}。来源:{source}\",\n \"cli_deploy_action\": \"如何处理 {service}?\",\n \"cli_deploy_default\": \"使用默认配置\",\n \"cli_deploy_custom\": \"使用自定义配置\",\n \"cli_deploy_keep\": \"保持不变\",\n \"cli_deploy_backend\": \"请选择 {service} 的后端\",\n \"cli_deploy_field\": \"{name}({description};{constraint})\",\n \"cli_deploy_required\": \"此项必填\",\n \"cli_deploy_invalid_value\": \"取值不满足字段约束\",\n \"cli_deploy_cloud_unsupported\": \"{backend} 没有可用的云自动开通器,请选择自定义连接或切换受支持的后端。\",\n \"cli_deploy_saved\": \"已配置 {name}={value}(公共值写目标环境文件,凭据写 .env.local)\",\n \"cli_deploy_secret\": \"[已隐藏]\",\n \"cli_deploy_missing_keep\": \"目标环境尚无 {service} 的完整配置,不能保持不变。\",\n \"cli_deploy_s3_engine\": \"选择自建 S3 服务实现(应用仍使用 type: s3)\",\n \"cli_deploy_target_reused\": \"复用部署目标 {target}。可在 .env.local 的 HAI_DEPLOY_PROVIDER 中更新连接参数。\",\n \"cli_deploy_target_missing\": \"部署目标配置不完整:{fields}。请在 .env.local 中配置 HAI_DEPLOY_PROVIDER,或使用交互终端完成引导。\",\n \"cli_deploy_target_platform\": \"选择部署平台\",\n \"cli_deploy_target_ssh\": \"SSH 服务器(Docker / Podman Compose)\",\n \"cli_deploy_target_field\": \"{name}(仅保存在 .env.local)\",\n \"cli_deploy_target_ssh_hint\": \"输入服务器连接及端口参数。私钥填写文件路径;留空使用 ssh-agent 或默认密钥。known_hosts 路径留空使用 OpenSSH 默认值。首次连接信任主机指纹,后续拒绝指纹变更。\",\n \"cli_deploy_target_runtime\": \"远程容器运行时(auto 优先使用 Podman)\",\n \"cli_deploy_target_saved\": \"部署目标已保存到 .env.local(已加入 Git 忽略),下次自动复用。\",\n \"cli_deploy_middleware_plan\": \"是否需要配置本次部署的中间件?\",\n \"cli_deploy_middleware_configure\": \"逐项检查并配置中间件\",\n \"cli_deploy_middleware_skip\": \"环境配置已完备,直接部署\",\n \"cli_deploy_middleware_skipped\": \"已跳过全部中间件配置与资源开通,使用当前环境配置及已有服务直接部署。\",\n \"cli_build_failed\": \"构建命令 {command} 失败(退出码 {code})。\",\n \"cli_build_use_pnpm\": \"请通过 pnpm build 运行构建,确保使用当前项目的 pnpm。\",\n \"cli_build_target_invalid\": \"target 必须为 compile、docker 或 desktop。\",\n \"cli_build_options_invalid\": \"runtime、network、sqlite-prebuild-mirror、no-http-proxy 仅用于 docker;platform、arch 仅用于 desktop。\",\n \"cli_build_version_invalid\": \"请在应用根 package.json 中设置有效的三段式版本(如 1.2.3 或 1.2.3-beta.1,最长 80 字符)。\",\n \"cli_build_native_host\": \"Tauri 需要在对应系统上构建(windows/linux/macos),架构为 x64 或 arm64;请先安装对应 Rust target、系统 SDK 和打包工具。\",\n \"cli_build_desktop_missing\": \"hai.build.json 未配置 desktop 目录。请生成 desktop 前端或添加已有的 Tauri 工程。\",\n \"cli_build_images_missing\": \"hai.build.json 必须包含一个 app 镜像和至多一个 web 镜像。\",\n \"cli_build_runtime_missing\": \"请安装并启动 Podman 或 Docker。auto 优先选择可用的 Podman。\",\n \"cli_build_mirror_invalid\": \"SQLite 镜像地址必须为 HTTP(S),不能包含凭据、查询或片段。\",\n \"cli_build_ready\": \"构建完成({runtime}):{path}。此镜像可用于不同部署环境。\",\n \"cli_build_native_ready\": \"Tauri 构建完成:{target},安装包位于对应工程 src-tauri/target/{target}/release/bundle。\",\n \"cli_deploy_bundle_provider\": \"--bundle-only 仅适用于 docker-ssh,请选择 Compose 部署目标。\",\n \"cli_deploy_bundle_local\": \"仅生成部署包,不连接服务器\",\n \"cli_deploy_bundle_ready\": \"部署包已生成;服务器尚未部署。\",\n \"cli_deploy_bundle_path\": \"部署包:{path}\"\n}\n","/** CLI 用户可见消息;通过 core 的全局 locale 选择语言。 */\nimport { core } from '@h-ai/core'\nimport enUS from '../messages/en-US.json'\nimport zhCN from '../messages/zh-CN.json'\n\nexport const cliM = core.i18n.createMessageGetter<keyof typeof zhCN>({ 'en-US': enUS, 'zh-CN': zhCN })\n","/**\n * @h-ai/cli — Skill 模板生成\n *\n * 将 Skill 模板文件复制到用户项目中,供 AI 编程助手使用。\n * @module cli-skill-templates\n */\n\nimport type { AppType } from '../cli-types.js'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport fse from 'fs-extra'\nimport Handlebars from 'handlebars'\nimport { cliM } from '../cli-i18n.js'\n\n/**\n * 模块名到 Skill 目录名的映射\n */\nconst MODULE_SKILL_MAP: Record<string, string> = {\n 'db': 'hai-reldb',\n 'reldb': 'hai-reldb',\n 'cache': 'hai-cache',\n 'iam': 'hai-iam',\n 'storage': 'hai-storage',\n 'ai': 'hai-ai',\n 'crypto': 'hai-crypto',\n 'payment': 'hai-payment',\n 'vecdb': 'hai-vecdb',\n 'datapipe': 'hai-datapipe',\n 'reach': 'hai-reach',\n 'scheduler': 'hai-scheduler',\n 'audit': 'hai-audit',\n 'deploy': 'hai-deploy',\n 'kit': 'hai-kit',\n 'ui': 'hai-ui',\n 'api-client': 'hai-api-client',\n 'capacitor': 'hai-capacitor',\n}\n\n/**\n * 各 appType 互斥的 Skill。\n *\n * 生成样板工程时,默认复制 templates/skills 下所有 hai-* Skill,\n * 仅排除与当前样板技术栈明显冲突的少数 Skill。\n */\nconst SKILL_EXCLUSIONS_BY_APP_TYPE: Partial<Record<AppType, string[]>> = {\n 'admin': ['hai-serv', 'hai-api-contract', 'hai-api-client', 'hai-capacitor'],\n 'website': ['hai-serv', 'hai-api-contract', 'hai-api-client', 'hai-capacitor'],\n 'h5': ['hai-serv', 'hai-api-contract', 'hai-api-client', 'hai-capacitor'],\n 'api': ['hai-ui', 'hai-kit', 'hai-capacitor'],\n 'mobile-app': ['hai-core', 'hai-kit', 'hai-serv', 'hai-api-contract'],\n 'fullstack': ['hai-kit'],\n}\n\nconst WORKFLOW_SKILLS = [\n 'hai-build',\n 'hai-spec-review',\n 'hai-spec-implement',\n 'hai-app-create',\n 'hai-app-review',\n 'hai-app-tests',\n 'hai-framework-sync',\n 'hai-ci',\n 'hai-pr-review',\n]\n\nconst PACKAGE_SKILL_MAP: Record<string, string> = {\n '@h-ai/api-contract': 'hai-api-contract',\n '@h-ai/api-client': 'hai-api-client',\n '@h-ai/core': 'hai-core',\n '@h-ai/serv': 'hai-serv',\n '@h-ai/kit': 'hai-kit',\n '@h-ai/ui': 'hai-ui',\n '@h-ai/reldb': 'hai-reldb',\n '@h-ai/cache': 'hai-cache',\n '@h-ai/iam': 'hai-iam',\n '@h-ai/storage': 'hai-storage',\n '@h-ai/ai': 'hai-ai',\n '@h-ai/crypto': 'hai-crypto',\n '@h-ai/payment': 'hai-payment',\n '@h-ai/vecdb': 'hai-vecdb',\n '@h-ai/datapipe': 'hai-datapipe',\n '@h-ai/reach': 'hai-reach',\n '@h-ai/scheduler': 'hai-scheduler',\n '@h-ai/audit': 'hai-audit',\n '@h-ai/deploy': 'hai-deploy',\n '@h-ai/capacitor': 'hai-capacitor',\n}\n\nconst SKILL_TARGET_DIRS = ['.agents/skills'] as const\n\nconst BRIDGE_FILES = [\n {\n source: 'copilot-instructions.md',\n destination: '.github/copilot-instructions.md',\n },\n {\n source: 'CLAUDE.md',\n destination: 'CLAUDE.md',\n },\n {\n source: 'AGENTS.md',\n destination: 'AGENTS.md',\n },\n {\n source: 'opencode.json',\n destination: 'opencode.json',\n },\n] as const\n\nconst BRIDGE_PROFILE_REGEX = /^[a-z0-9-]+$/\n\n/** 从已有模板标识与实际包布局确认桥接类型,不按项目名称猜测技术栈。 */\nasync function detectBridgeContext(projectPath: string): Promise<{ appType?: AppType, projectName?: string }> {\n const packagePath = path.join(projectPath, 'package.json')\n if (!(await fse.pathExists(packagePath))) {\n return {}\n }\n\n let metadata: unknown\n try {\n metadata = await fse.readJson(packagePath)\n }\n catch {\n return {}\n }\n if (!metadata || typeof metadata !== 'object' || !('name' in metadata)\n || typeof metadata.name !== 'string' || !BRIDGE_PROFILE_REGEX.test(metadata.name)) {\n return {}\n }\n\n const projectName = metadata.name\n for (const [appType, directory, suffixes] of [\n ['fullstack', 'packages', ['contract', 'serv', 'shared']],\n ['api', 'apps', ['contract', 'service']],\n ] as const) {\n const manifests = await Promise.all(suffixes.map(suffix => fse.pathExists(\n path.join(projectPath, directory, `${projectName}-${suffix}`, 'package.json'),\n )))\n if (manifests.every(Boolean)) {\n return { appType, projectName }\n }\n }\n\n if ('keywords' in metadata && Array.isArray(metadata.keywords) && metadata.keywords.includes('hai')) {\n for (const appType of ['admin', 'website', 'h5', 'mobile-app'] as const) {\n if (metadata.keywords.includes(appType)) {\n return { appType, projectName }\n }\n }\n }\n return { projectName }\n}\n\nasync function listTemplateSkillNames(templatesDir: string): Promise<string[]> {\n const entries = await fse.readdir(templatesDir, { withFileTypes: true })\n const skillNames: string[] = []\n\n for (const entry of entries) {\n if (!entry.isDirectory() || !entry.name.startsWith('hai-')) {\n continue\n }\n\n const skillFilePath = path.join(templatesDir, entry.name, 'SKILL.md')\n if (await fse.pathExists(skillFilePath)) {\n skillNames.push(entry.name)\n }\n }\n\n return skillNames.sort((a, b) => a.localeCompare(b))\n}\n\nexport function resolveCompatibleSkillNames(\n skillNames: string[],\n appType?: AppType,\n): string[] {\n const excludedSkills = new Set(appType ? SKILL_EXCLUSIONS_BY_APP_TYPE[appType] ?? [] : [])\n return skillNames.filter(skillName => !excludedSkills.has(skillName))\n}\n\n/**\n * 获取 templates/skills/ 目录的绝对路径\n *\n * 兼容两种运行环境:\n * - 构建后:dist/cli-skill-templates.js → ../templates/skills\n * - 测试时:src/commands/cli-skill-templates.ts → ../../templates/skills\n */\nfunction getSkillTemplatesDir(): string {\n const currentDir = path.dirname(fileURLToPath(import.meta.url))\n const distPath = path.resolve(currentDir, '..', 'templates', 'skills')\n if (fse.pathExistsSync(distPath)) {\n return distPath\n }\n return path.resolve(currentDir, '..', '..', 'templates', 'skills')\n}\n\n/**\n * 复制单个 Skill 目录到项目\n *\n * @param templatesDir - Skill 模板根目录\n * @param skillName - Skill 目录名(如 'hai-reldb')\n * @param projectPath - 用户项目根目录\n */\nasync function copySkill(\n templatesDir: string,\n skillName: string,\n projectPath: string,\n targetDirs: readonly string[] = SKILL_TARGET_DIRS,\n overwrite = true,\n): Promise<string[]> {\n const src = path.join(templatesDir, skillName)\n\n if (!(await fse.pathExists(src))) {\n return []\n }\n\n const copiedFiles: string[] = []\n const resources = await fse.readdir(src, { recursive: true, withFileTypes: true })\n const relativeFiles = resources.filter(resource => resource.isFile())\n .map(resource => path.relative(src, path.join(resource.parentPath, resource.name)))\n\n for (const targetDir of targetDirs) {\n const dest = path.join(projectPath, targetDir, skillName)\n await assertProjectOutputPath(projectPath, dest)\n if (!overwrite) {\n // 已有入口不能使新参考资源被跳过;逐文件补缺,同时保留用户修改。\n const missingFiles: string[] = []\n for (const relativeFile of relativeFiles) {\n if (!(await fse.pathExists(path.join(dest, relativeFile)))) {\n missingFiles.push(relativeFile)\n }\n }\n if (missingFiles.length === 0) {\n continue\n }\n for (const relativeFile of missingFiles)\n await assertProjectOutputPath(projectPath, path.join(dest, relativeFile))\n await fse.copy(src, dest, { overwrite: false })\n copiedFiles.push(...missingFiles.map(relativeFile => `${targetDir}/${skillName}/${relativeFile.replaceAll(path.sep, '/')}`))\n }\n else {\n for (const relativeFile of relativeFiles)\n await assertProjectOutputPath(projectPath, path.join(dest, relativeFile))\n await fse.copy(src, dest, { overwrite: true })\n copiedFiles.push(`${targetDir}/${skillName}/SKILL.md`)\n }\n }\n\n return copiedFiles\n}\n\n/** 写入前解析已有目录/文件链接,所有 AI 输出均限制在当前项目内。 */\nasync function assertProjectOutputPath(projectPath: string, destination: string): Promise<void> {\n let ancestor = destination\n while (!(await fse.pathExists(ancestor))) {\n const parent = path.dirname(ancestor)\n if (parent === ancestor)\n throw new Error(cliM('cli_generateOutsideWorkspace'))\n ancestor = parent\n }\n const relativeAncestor = path.relative(await fse.realpath(projectPath), await fse.realpath(ancestor))\n if (relativeAncestor === '..' || relativeAncestor.startsWith(`..${path.sep}`) || path.isAbsolute(relativeAncestor))\n throw new Error(cliM('cli_generateOutsideWorkspace'))\n}\n\nasync function copySkills(\n templatesDir: string,\n skillNames: string[],\n projectPath: string,\n targetDirs: readonly string[] = SKILL_TARGET_DIRS,\n overwrite = true,\n): Promise<string[]> {\n const copiedFiles: string[] = []\n\n for (const skillName of new Set(skillNames)) {\n copiedFiles.push(...await copySkill(templatesDir, skillName, projectPath, targetDirs, overwrite))\n }\n\n return copiedFiles\n}\n\n/**\n * 复制桥接文件到项目\n *\n * @param templatesDir - Skill 模板根目录\n * @param projectPath - 用户项目根目录\n */\nasync function copyBridgeFiles(\n templatesDir: string,\n projectPath: string,\n overwrite = true,\n appType?: string,\n projectName?: string,\n): Promise<string[]> {\n const copiedFiles: string[] = []\n\n for (const file of BRIDGE_FILES) {\n const src = await resolveBridgeSource(templatesDir, file.source, appType, projectName !== undefined)\n const dest = path.join(projectPath, file.destination)\n\n if (!src) {\n continue\n }\n\n if (!overwrite && await fse.pathExists(dest)) {\n continue\n }\n\n await assertProjectOutputPath(projectPath, dest)\n await fse.ensureDir(path.dirname(dest))\n if (src.endsWith('.hbs')) {\n const template = await fse.readFile(src, 'utf8')\n const rendered = Handlebars.compile(template, { noEscape: true })({ projectName })\n await fse.writeFile(dest, rendered, 'utf8')\n }\n else {\n await fse.copy(src, dest, { overwrite })\n }\n copiedFiles.push(file.destination)\n }\n\n return copiedFiles\n}\n\nasync function resolveBridgeSource(\n templatesDir: string,\n source: string,\n appType?: string,\n allowTemplate = false,\n): Promise<string | null> {\n const profile = appType && BRIDGE_PROFILE_REGEX.test(appType) ? appType : 'generic'\n const candidates = [\n ...(allowTemplate ? [path.join(templatesDir, 'bridges', profile, `${source}.hbs`)] : []),\n path.join(templatesDir, 'bridges', profile, source),\n path.join(templatesDir, 'bridges', 'generic', source),\n path.join(templatesDir, source),\n ]\n\n for (const candidate of candidates) {\n if (await fse.pathExists(candidate)) {\n return candidate\n }\n }\n\n return null\n}\n\n/**\n * 为新项目生成完整的 Skill 文件。\n *\n * 默认复制 templates/skills 下所有 hai-* Skill,再按 appType 排除互斥项。\n *\n * @param projectPath - 用户项目根目录\n * @param _features - 预留参数;保留签名兼容 createProject 调用方\n * @param appType - 应用类型(api 类型不复制 UI Skill)\n */\nexport async function generateSkillFiles(\n projectPath: string,\n _features: string[],\n appType?: string,\n projectName?: string,\n): Promise<string[]> {\n const templatesDir = getSkillTemplatesDir()\n\n if (!(await fse.pathExists(templatesDir))) {\n return []\n }\n\n const copiedFiles: string[] = []\n\n const templateSkillNames = await listTemplateSkillNames(templatesDir)\n const compatibleSkillNames = resolveCompatibleSkillNames(templateSkillNames, appType as AppType | undefined)\n\n copiedFiles.push(...await copySkills(templatesDir, compatibleSkillNames, projectPath))\n\n // 复制桥接文件\n copiedFiles.push(...await copyBridgeFiles(templatesDir, projectPath, true, appType, projectName))\n\n return copiedFiles\n}\n\n/**\n * 为已有项目添加单个模块的 Skill 文件\n *\n * 同时补全普通开发所需工作流及缺失参考资源,保留已有文件。\n *\n * @param projectPath - 用户项目根目录\n * @param moduleId - 模块标识(如 'db'、'iam')\n * @returns 复制的文件路径,若模块无对应 Skill 则返回 null\n */\nexport async function generateModuleSkillFile(\n projectPath: string,\n moduleId: string,\n): Promise<string[] | null> {\n const skillName = MODULE_SKILL_MAP[moduleId]\n if (!skillName) {\n return null\n }\n\n const copiedFiles = await generateProjectAiSupport(projectPath, [skillName], {\n overwriteSkills: false,\n overwriteBridgeFiles: false,\n })\n return copiedFiles.length > 0 ? copiedFiles : null\n}\n\nexport function resolveSkillNamesForPackages(packageNames: string[]): string[] {\n const skillNames = [...WORKFLOW_SKILLS]\n\n for (const packageName of packageNames) {\n const skillName = PACKAGE_SKILL_MAP[packageName]\n if (skillName) {\n skillNames.push(skillName)\n }\n }\n\n return [...new Set(skillNames)]\n}\n\nexport async function generateProjectAiSupport(\n projectPath: string,\n skillNames: string[],\n options: {\n overwriteSkills?: boolean\n overwriteBridgeFiles?: boolean\n appType?: string\n projectName?: string\n } = {},\n): Promise<string[]> {\n const templatesDir = getSkillTemplatesDir()\n\n if (!(await fse.pathExists(templatesDir))) {\n return []\n }\n\n const {\n overwriteSkills = true,\n overwriteBridgeFiles = true,\n } = options\n\n const detected = await detectBridgeContext(projectPath)\n const appType = options.appType ?? detected.appType\n const projectName = options.projectName ?? detected.projectName\n // 已确认的样板补全整个兼容目录;其它项目只补工作流与明确请求的模块。\n const selectedSkillNames = appType\n ? [...resolveCompatibleSkillNames(await listTemplateSkillNames(templatesDir), appType as AppType), ...WORKFLOW_SKILLS, ...skillNames]\n : [...WORKFLOW_SKILLS, ...skillNames]\n const copiedFiles: string[] = []\n copiedFiles.push(...await copySkills(templatesDir, selectedSkillNames, projectPath, SKILL_TARGET_DIRS, overwriteSkills))\n copiedFiles.push(...await copyBridgeFiles(templatesDir, projectPath, overwriteBridgeFiles, appType, projectName))\n\n return copiedFiles\n}\n"]}
|
|
@@ -1991,26 +1991,10 @@ var cli_config_catalog_default = [
|
|
|
1991
1991
|
name: "HAI_DEPLOY_CONTAINER",
|
|
1992
1992
|
module: "deploy",
|
|
1993
1993
|
path: "deploy.container",
|
|
1994
|
-
description: "\
|
|
1994
|
+
description: "Docker Compose \u90E8\u7F72\u53C2\u6570\uFF1B\u6784\u5EFA\u914D\u7F6E\u4F4D\u4E8E\u9879\u76EE hai.build.json\u3002",
|
|
1995
1995
|
value: "",
|
|
1996
1996
|
constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
|
|
1997
1997
|
},
|
|
1998
|
-
{
|
|
1999
|
-
name: "HAI_DEPLOY_CONTAINER_HTTPPROXY",
|
|
2000
|
-
module: "deploy",
|
|
2001
|
-
path: "deploy.container.httpProxy",
|
|
2002
|
-
description: "Podman \u6784\u5EFA\u662F\u5426\u7EE7\u627F\u4EE3\u7406\uFF1B\u5BB9\u5668\u4E0D\u80FD\u8BBF\u95EE\u5BBF\u4E3B\u673A localhost \u4EE3\u7406\u65F6\u8BBE\u4E3A false\u3002",
|
|
2003
|
-
value: "true",
|
|
2004
|
-
constraint: "true | false"
|
|
2005
|
-
},
|
|
2006
|
-
{
|
|
2007
|
-
name: "HAI_DEPLOY_CONTAINER_RUNTIME",
|
|
2008
|
-
module: "deploy",
|
|
2009
|
-
path: "deploy.container.runtime",
|
|
2010
|
-
description: "\u672C\u5730\u6216\u8FDC\u7A0B\u5BB9\u5668\u8FD0\u884C\u65F6\uFF0Cauto \u6309\u90E8\u7F72\u6A21\u5757\u987A\u5E8F\u63A2\u6D4B",
|
|
2011
|
-
value: "auto",
|
|
2012
|
-
constraint: "\u5B57\u7B26\u4E32\uFF1B\u53D6\u503C\uFF1Aauto | docker | podman"
|
|
2013
|
-
},
|
|
2014
1998
|
{
|
|
2015
1999
|
name: "HAI_DEPLOY_CONTAINER_S3ENGINE",
|
|
2016
2000
|
module: "deploy",
|
|
@@ -2019,14 +2003,6 @@ var cli_config_catalog_default = [
|
|
|
2019
2003
|
value: "rustfs",
|
|
2020
2004
|
constraint: "\u5B57\u7B26\u4E32\uFF1B\u53D6\u503C\uFF1Arustfs | minio"
|
|
2021
2005
|
},
|
|
2022
|
-
{
|
|
2023
|
-
name: "HAI_DEPLOY_CONTAINER_SQLITEPREBUILDMIRROR",
|
|
2024
|
-
module: "deploy",
|
|
2025
|
-
path: "deploy.container.sqlitePrebuildMirror",
|
|
2026
|
-
description: "SQLite \u9884\u7F16\u8BD1\u5305\u955C\u50CF\u6839\u5730\u5740\uFF1B\u7701\u7565\u65F6\u4ECE\u5B98\u65B9 GitHub Release \u4E0B\u8F7D\uFF0C\u4E0D\u5141\u8BB8\u5D4C\u5165\u51ED\u636E\u3002",
|
|
2027
|
-
value: "",
|
|
2028
|
-
constraint: "\u5B57\u7B26\u4E32\uFF1B\u683C\u5F0F uri"
|
|
2029
|
-
},
|
|
2030
2006
|
{
|
|
2031
2007
|
name: "HAI_DEPLOY_ENVIRONMENT",
|
|
2032
2008
|
module: "deploy",
|
|
@@ -3859,6 +3835,14 @@ var cli_config_catalog_default = [
|
|
|
3859
3835
|
value: "",
|
|
3860
3836
|
constraint: "\u6709\u6548 HTTP(S) URL"
|
|
3861
3837
|
},
|
|
3838
|
+
{
|
|
3839
|
+
name: "PATH",
|
|
3840
|
+
module: "runtime",
|
|
3841
|
+
path: "PATH",
|
|
3842
|
+
description: "\u64CD\u4F5C\u7CFB\u7EDF\u63D0\u4F9B\u7684\u53EF\u6267\u884C\u7A0B\u5E8F\u641C\u7D22\u8DEF\u5F84\uFF1BCLI \u7528\u4E8E\u5B9A\u4F4D\u5DF2\u5B89\u88C5\u7684 pnpm",
|
|
3843
|
+
value: "",
|
|
3844
|
+
constraint: "\u4FDD\u7559\u7CFB\u7EDF\u539F\u503C\uFF1B\u7531\u64CD\u4F5C\u7CFB\u7EDF\u8DEF\u5F84\u5206\u9694\u7B26\u8FDE\u63A5\uFF0C\u4E0D\u8981\u5728 .env \u4E2D\u7F6E\u7A7A\u6216\u4F5C\u4E3A\u5E94\u7528\u914D\u7F6E\u8986\u76D6"
|
|
3845
|
+
},
|
|
3862
3846
|
{
|
|
3863
3847
|
name: "POLLINATIONS_API_KEY",
|
|
3864
3848
|
module: "runtime",
|
|
@@ -3904,7 +3888,7 @@ var cli_config_catalog_default = [
|
|
|
3904
3888
|
module: "runtime",
|
|
3905
3889
|
path: "PUBLIC_API_TRANSPORT",
|
|
3906
3890
|
description: "\u5BA2\u6237\u7AEF\u4F20\u8F93\u52A0\u5BC6\u5F00\u5173\uFF0C\u987B\u4E0E\u670D\u52A1\u7AEF\u4E00\u81F4",
|
|
3907
|
-
value: "
|
|
3891
|
+
value: "",
|
|
3908
3892
|
constraint: "on | off"
|
|
3909
3893
|
},
|
|
3910
3894
|
{
|
|
@@ -3947,14 +3931,6 @@ var cli_config_catalog_default = [
|
|
|
3947
3931
|
value: "",
|
|
3948
3932
|
constraint: "node | static\uFF1B\u672A\u8BC6\u522B\u7684\u503C\u56DE\u9000 node"
|
|
3949
3933
|
},
|
|
3950
|
-
{
|
|
3951
|
-
name: "VITE_HAI_E2E_KIT_TRANSPORT_MODE",
|
|
3952
|
-
module: "runtime",
|
|
3953
|
-
path: "VITE_HAI_E2E_KIT_TRANSPORT_MODE",
|
|
3954
|
-
description: "\u7BA1\u7406\u540E\u53F0\u7AEF\u5230\u7AEF\u6D4B\u8BD5\u4F20\u8F93\u52A0\u5BC6\u6A21\u5F0F",
|
|
3955
|
-
value: "",
|
|
3956
|
-
constraint: "on | off"
|
|
3957
|
-
},
|
|
3958
3934
|
{
|
|
3959
3935
|
name: "VITEST",
|
|
3960
3936
|
module: "runtime",
|
|
@@ -5410,12 +5386,9 @@ provider:
|
|
|
5410
5386
|
# containerPort: 3000
|
|
5411
5387
|
# hostPort: 18080 # \u8BBF\u95EE\u5730\u5740 http://<host>:18080
|
|
5412
5388
|
|
|
5413
|
-
# \
|
|
5389
|
+
# Compose \u4E2D\u95F4\u4EF6\u53C2\u6570\uFF1B\u955C\u50CF\u6784\u5EFA\u8BBE\u7F6E\u5728\u5DE5\u7A0B hai.build.json\u3002
|
|
5414
5390
|
# container:
|
|
5415
|
-
#
|
|
5416
|
-
# httpProxy: true # Podman \u6784\u5EFA\u7EE7\u627F\u4EE3\u7406\uFF1Blocalhost \u4EE3\u7406\u4E0D\u53EF\u8FBE\u65F6\u8BBE\u4E3A false
|
|
5417
|
-
# s3Engine: rustfs # rustfs | minio\uFF1B\u5E94\u7528\u59CB\u7EC8\u4F7F\u7528 storage.type=s3
|
|
5418
|
-
# sqlitePrebuildMirror: https://your-trusted-mirror.example/better-sqlite3 # \u53EF\u9009\uFF0C\u4E0D\u542B\u8BA4\u8BC1\u4FE1\u606F
|
|
5391
|
+
# s3Engine: rustfs # rustfs | minio\uFF1B\u5E94\u7528\u4F7F\u7528 storage.type=s3
|
|
5419
5392
|
|
|
5420
5393
|
# \u57FA\u7840\u8BBE\u65BD\u670D\u52A1\uFF08\u6309\u9700\u5F00\u542F\uFF09
|
|
5421
5394
|
# services:
|
|
@@ -5452,8 +5425,9 @@ provider:
|
|
|
5452
5425
|
# signName: \${HAI_DEPLOY_SERVICES_SMS_SIGNNAME}
|
|
5453
5426
|
|
|
5454
5427
|
# docker-ssh \u8BF4\u660E\uFF1A
|
|
5455
|
-
# - \
|
|
5456
|
-
# - compose \
|
|
5428
|
+
# - \u5148 pnpm build --target docker\uFF1Bdeploy \u6D88\u8D39\u5DF2\u6709\u955C\u50CF\u5E76\u751F\u6210\u4E00\u4E2A Compose tar \u540E\u4E0A\u4F20
|
|
5429
|
+
# - compose \u6309\u5B9E\u9645\u540E\u7AEF\u751F\u6210\u4E2D\u95F4\u4EF6\uFF1BS3 \u9ED8\u8BA4 RustFS\uFF0C\u53EF\u901A\u8FC7 s3Engine \u9009\u62E9 MinIO
|
|
5430
|
+
# - \u955C\u50CF\u6E05\u5355\u542B Web \u65F6\u4E00\u5E76\u90E8\u7F72\uFF0CWeb \u4E0D\u63A5\u6536 API \u7684\u79C1\u6709\u53D8\u91CF\uFF1B--bundle-only \u53EF\u624B\u5DE5\u642C\u8FD0
|
|
5457
5431
|
# - \u82E5\u540C\u65F6\u914D\u7F6E\u4E86\u5BF9\u5E94\u4E91 Provisioner\uFF0C\u5219\u4F18\u5148\u4F7F\u7528\u4E91\u8D44\u6E90\uFF0C\u4E0D\u518D\u81EA\u5EFA sidecar
|
|
5458
5432
|
`;
|
|
5459
5433
|
}
|
|
@@ -5635,5 +5609,5 @@ function generatePaymentConfig() {
|
|
|
5635
5609
|
}
|
|
5636
5610
|
|
|
5637
5611
|
export { generateConfigFile, generateEnvExample, moduleEnvironmentVariables, parameterizeConfig, renderEnvironment, runtimeEnvironmentVariables };
|
|
5638
|
-
//# sourceMappingURL=chunk-
|
|
5639
|
-
//# sourceMappingURL=chunk-
|
|
5612
|
+
//# sourceMappingURL=chunk-QYX6V7H2.js.map
|
|
5613
|
+
//# sourceMappingURL=chunk-QYX6V7H2.js.map
|