@h-ai/cli 1.0.0-beta.1 → 1.0.0-beta.3
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 +20 -8
- package/README.ja.md +20 -8
- package/README.md +20 -8
- package/dist/{chunk-M7HN2OE3.js → chunk-K6RWTTHD.js} +573 -106
- package/dist/chunk-K6RWTTHD.js.map +1 -0
- package/dist/{chunk-AKV2CQZV.js → chunk-SWEU7KUE.js} +71 -59
- package/dist/chunk-SWEU7KUE.js.map +1 -0
- package/dist/{chunk-3JCZO34U.js → chunk-YVNNMC4H.js} +365 -137
- package/dist/chunk-YVNNMC4H.js.map +1 -0
- package/dist/cli-config-templates-LUJGDQNW.js +5 -0
- package/dist/{cli-config-templates-RCWQMHZN.js.map → cli-config-templates-LUJGDQNW.js.map} +1 -1
- package/dist/{cli-skill-templates-PN4FLGBC.js → cli-skill-templates-VV2XWYON.js} +3 -3
- package/dist/{cli-skill-templates-PN4FLGBC.js.map → cli-skill-templates-VV2XWYON.js.map} +1 -1
- package/dist/index.js +118 -209
- package/dist/index.js.map +1 -1
- package/dist/metafile-esm.json +1 -1
- package/dist/{src-JRKSWJ2Q.js → src-IR5AU43K.js} +3 -3
- package/dist/src-IR5AU43K.js.map +1 -0
- package/package.json +11 -11
- package/templates/apps/api/.dockerignore.hbs +10 -0
- package/templates/apps/api/apps/{{projectName}}-serv/config/_serv.yml.hbs +20 -1
- package/templates/apps/api/apps/{{projectName}}-serv/src/app.ts.hbs +6 -1
- package/templates/apps/api/apps/{{projectName}}-serv/src/lib/server/init.ts.hbs +1 -1
- package/templates/apps/api/images/serv.Dockerfile.hbs +3 -2
- package/templates/apps/fullstack/.dockerignore.hbs +10 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/README.md.hbs +1 -1
- package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +16 -2
- package/templates/apps/fullstack/images/serv.Dockerfile.hbs +6 -2
- package/templates/apps/fullstack/images/web.Dockerfile.hbs +6 -1
- package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +1 -1
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_reach.yml.hbs +10 -7
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_serv.yml.hbs +14 -7
- package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +6 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/app-server.ts.hbs +1 -1
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/app-server.test.ts.hbs +7 -1
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/security.test.ts.hbs +1 -1
- package/templates/apps/fullstack/pnpm-workspace.yaml.hbs +1 -0
- package/templates/apps/website/scripts/static-website.mjs.hbs +3 -3
- package/templates/base/.dockerignore.hbs +10 -0
- package/templates/base/images/web.Dockerfile.hbs +4 -2
- package/templates/base/package.json.hbs +1 -1
- package/templates/base/src/hooks.server.ts.hbs +9 -7
- package/templates/features/payment/routes/api/v1/payment/create/+server.ts +3 -1
- package/templates/skills/AGENTS.md +2 -0
- package/templates/skills/bridges/admin/AGENTS.md +2 -0
- package/templates/skills/bridges/api/AGENTS.md +2 -0
- package/templates/skills/bridges/fullstack/AGENTS.md.hbs +2 -0
- package/templates/skills/bridges/h5/AGENTS.md +2 -0
- package/templates/skills/bridges/mobile-app/AGENTS.md +2 -0
- package/templates/skills/bridges/website/AGENTS.md +2 -0
- package/templates/skills/hai-ai/guide.md +5 -3
- package/templates/skills/hai-app-create/SKILL.md +1 -1
- package/templates/skills/hai-app-create/collaboration.md +6 -1
- package/templates/skills/hai-app-create/development.md +10 -4
- package/templates/skills/hai-app-create/reference.md +4 -2
- package/templates/skills/hai-app-review/SKILL.md +2 -0
- package/templates/skills/hai-app-tests/SKILL.md +2 -0
- package/templates/skills/hai-build/SKILL.md +5 -5
- package/templates/skills/hai-build/paths.md +1 -1
- package/templates/skills/hai-build/reference.md +1 -1
- package/templates/skills/hai-change-plan/SKILL.md +46 -0
- package/templates/skills/hai-deploy/SKILL.md +16 -4
- package/templates/skills/hai-deploy/middleware.md +4 -2
- package/templates/skills/hai-feedback/SKILL.md +1 -1
- package/templates/skills/hai-pr-review/SKILL.md +2 -0
- package/templates/skills/hai-serv/reference.md +5 -8
- package/templates/skills/hai-spec-implement/SKILL.md +2 -0
- package/templates/skills/hai-storage/SKILL.md +2 -2
- package/templates/skills/hai-storage/reference.md +1 -1
- package/dist/chunk-3JCZO34U.js.map +0 -1
- package/dist/chunk-AKV2CQZV.js.map +0 -1
- package/dist/chunk-M7HN2OE3.js.map +0 -1
- package/dist/cli-config-templates-RCWQMHZN.js +0 -5
- package/dist/src-JRKSWJ2Q.js.map +0 -1
package/README.en.md
CHANGED
|
@@ -38,12 +38,12 @@ Generated framework dependencies use the exact CLI version. Installation failure
|
|
|
38
38
|
### Create an application
|
|
39
39
|
|
|
40
40
|
```sh
|
|
41
|
-
hai create my-app --type fullstack --frontends web --
|
|
41
|
+
hai create my-app --type fullstack --frontends web --defaults
|
|
42
42
|
cd my-app
|
|
43
43
|
pnpm dev
|
|
44
44
|
```
|
|
45
45
|
|
|
46
|
-
Omit options for interactive choices, or use `--
|
|
46
|
+
Omit options for interactive choices, or use `--defaults` for defaults. Installation and Git initialization are enabled; disable them with `--no-install` / `--no-git`. Deployment tools are development dependencies by default; use `--no-deploy` to omit them.
|
|
47
47
|
|
|
48
48
|
### Project templates
|
|
49
49
|
|
|
@@ -54,13 +54,13 @@ Omit options for interactive choices, or use `--yes` for defaults. Installation
|
|
|
54
54
|
| `mobile-app` | Svelte + Vite + Capacitor |
|
|
55
55
|
| `fullstack` | Contract, API, shared UI and selected Web/App/Desktop; miniapp is a placeholder |
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
Creation always uses the full applicable modules and examples, including AI, vector storage and feedback on servers. Clients retain their dependency boundaries. Installation is larger, and examples need adaptation. `--template`, `--features` and `--examples/--no-examples` have been removed; `create --yes/-y` is now `--defaults`. Old options fail explicitly. `deploy --yes` and existing projects keep their behavior.
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
Standalone `mobile-app` includes frontend crypto and encrypted typed-client transport. For an existing plaintext API, explicitly set `PUBLIC_API_TRANSPORT=off`. `PUBLIC_API_KEY_EXCHANGE_PATH` overrides the public exchange subpath. Handshake failures never fall back, server private keys never enter clients, and cleanup closes transport before client-owned crypto.
|
|
60
60
|
|
|
61
61
|
### Static websites and GitHub Pages
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
New websites include the full modules and examples and default to Node SSR. Before static publication, remove server business dependencies and initialization, custom APIs and actions, retaining Core/Kit/UI. There is no lightweight creation option. Existing websites without these dynamic capabilities can use the static build below.
|
|
64
64
|
|
|
65
65
|
Website defaults to Node SSR. Set `HAI_BUILD_STATIC=1` and `PUBLIC_BASE_PATH=/docs-site` (replace docs-site with the repository name; segments allow only ASCII letters, digits, _, . and -; no trailing slash, empty for a root site) for `pnpm build` to generate the static build directory. The static flag accepts 0/1 and applies only to compile. PUBLIC_BASE_PATH also supports Docker website builds; native app/desktop targets reject website paths. Static builds reject server-side business modules, custom APIs/actions and pages that were not prerendered, preserve production guards and use no SPA fallback. The default health API is excluded.
|
|
66
66
|
|
|
@@ -115,8 +115,20 @@ Select crypto when creating admin, website or h5 projects to enable transport in
|
|
|
115
115
|
|
|
116
116
|
Path rules use `encryption: required / disabled` for encrypted internal APIs and ordinary HTTPS integrations. Conflicts and missing required transport reject host creation. Fullstack management always requires transport; use scoped rules for plaintext exceptions. See [endpoint access and encryption](../../docs/usage/configuration/request-access.md).
|
|
117
117
|
|
|
118
|
+
### Optional HTTPS certificates
|
|
119
|
+
|
|
120
|
+
`pnpm run deploy` offers no HTTPS, existing PEM certificate/key paths, or Let’s Encrypt for every container template. Relative paths resolve from the project root. Certificates are checked for domain, validity and key matching, then copied into private releases. A pinned official Certbot image handles issuance and renewal checks every 12 hours, with automatic Nginx reload. It requires terms acceptance, a real email, public DNS, port 80 and CA connectivity. Isolated servers use existing certificates. Certificate state stays on the server; keys stay out of application images. `--yes` reuses saved settings.
|
|
121
|
+
|
|
122
|
+
Configure `hai.json.deploy.provider.expose.https` or private environment overrides. Defaults are HTTPS 443 and HTTP redirection; omission retains HTTP. Enabling/disabling HTTPS or changing mode, domain, ports or supplied certificates requires a full deployment. See the [HTTPS guide](../../docs/usage/configuration/delivery.md#可选https证书). Plans use `root` for the project and `serviceDir` for the service source/configuration directory, exposing only public certificate metadata.
|
|
123
|
+
|
|
118
124
|
### Build and deploy
|
|
119
125
|
|
|
126
|
+
Default/custom middleware configuration preserves all effective settings for the same backend, including `publicEndpoint`, pool and operation log options absent from the form. Managed services replace connection selectors and credentials. Restore fields already lost from old parent JSON before rebuilding; see [middleware settings](../deploy/README.en.md#configure-only-the-middleware-the-application-needs).
|
|
127
|
+
|
|
128
|
+
Node backends (Serv / SvelteKit SSR) reread the release `.env.runtime` on every start by default. Edit it, then run `docker restart <container>` or `podman restart <container>`; no image rebuild or extra override is needed. Existing deployments need one deployment with the new CLI. Removed settings do not survive through stale Compose injection. Managed connections in `middleware.env` retain precedence; private proxy identity and Node startup options remain deployment settings. Static Web, middleware, ports/mounts and Nginx limits keep their existing update flow. Back up manual edits and copy permanent changes into the source environment; the next backend deployment regenerates the file.
|
|
129
|
+
|
|
130
|
+
Image builds run at most two images concurrently by default; use `--concurrency 1` to reduce resource use. Dependency installation precedes source copies, and each side copies only its required source. Runtime images omit application declaration files, source maps and README files. Packaging validates and reuses middleware archives by image content ID and hashes application archives while copying. Delivery defaults to `.tar.gz`; explicit `--output release.tar` keeps an uncompressed archive. README is only outside the archive. Successful deployment removes its incoming upload/extraction, retains recovery configuration in releases, and keeps images in the container engine.
|
|
131
|
+
|
|
120
132
|
Database connections are validated against the selected backend’s public schema before saving. MySQL `ssl` accepts only `false` or a strict TLS object; `{}` verifies the certificate chain and DNS identity by default. PostgreSQL keeps its modes. CLI bundles the pure schemas and Zod, so validation needs no database package or driver in the target application; running that application still requires its dependencies. Deployment still requires an installed, resolvable `@h-ai/deploy` (a development dependency in generated projects).
|
|
121
133
|
|
|
122
134
|
`pnpm build` compiles sources. Each image has its own Dockerfile in `images/`, selected through `hai.json.build.images`, alongside the project deployment settings in `deploy`. `--images` selects build outputs; `--services` selects deployed services. Automatic engine detection prefers reachable Podman, then Docker. Downloads, installation and production dependency packaging share package and SQLite driver caches to avoid downloading them again.
|
|
@@ -128,7 +140,7 @@ After filtering caller `HAI_/PUBLIC_/VITE_` values, CLI injects only internally
|
|
|
128
140
|
Delivery roles are `serv` for a separate API backend, `web` for a static or SSR browser site, `app` for Android/iOS installers, and `desktop` for desktop installers. Fullstack containers use serv plus optional web; API uses serv; browser images for admin/website/h5/mobile-app use web. Native app/desktop outputs are not server Compose services. Use serv/web with `--images` and `--services`, and `--target app` or `--target desktop` for native packages. API service directories are `apps/<project>-serv`. Images and containers share the normalized root `package.json.name`: remove scope, lowercase, and replace invalid character runs with a hyphen. Missing or invalid names fail without falling back to directory names. Images use `localhost/hai-<project>-<role>:<buildId>`; containers use `hai-<project>-<environment>-<role>`. Images remain reusable across environments.
|
|
129
141
|
|
|
130
142
|
```sh
|
|
131
|
-
pnpm build --target
|
|
143
|
+
pnpm build --target image
|
|
132
144
|
pnpm run deploy --env prod
|
|
133
145
|
pnpm run deploy --env prod --build --services web
|
|
134
146
|
# Use one --services with comma-separated names; quote the value for PowerShell
|
|
@@ -136,7 +148,7 @@ pnpm run deploy --env prod --build --services "serv,web"
|
|
|
136
148
|
pnpm run deploy --env prod --build --bundle-only
|
|
137
149
|
```
|
|
138
150
|
|
|
139
|
-
The default deployment name comes from `package.json.name` at the project root (the nearest `hai.json` or lockfile directory), rejecting missing or invalid names, with an explicit environment appended. A fullstack `hai-delivery` project scanned at `packages/hai-delivery-serv` with `--env test` generates `/opt/hai/apps/hai-delivery-test` and `bundle-hai-delivery-test-<deploymentId>-<version>.tar`. Remote directories, bundles, the Compose project, API/Web/middleware containers, data volumes, server credential state and incremental baselines share this name. Actual project names ending in `-serv` are preserved.
|
|
151
|
+
The default deployment name comes from `package.json.name` at the project root (the nearest `hai.json` or lockfile directory), rejecting missing or invalid names, with an explicit environment appended. A fullstack `hai-delivery` project scanned at `packages/hai-delivery-serv` with `--env test` generates `/opt/hai/apps/hai-delivery-test` and `bundle-hai-delivery-test-<deploymentId>-<version>.tar.gz`. Remote directories, bundles, the Compose project, API/Web/middleware containers, data volumes, server credential state and incremental baselines share this name. Actual project names ending in `-serv` are preserved.
|
|
140
152
|
|
|
141
153
|
Artifact formats 4 and 5 record primaryService (serv/web); hasWeb describes the complete browser topology. Format 5 also records a non-root webBasePath. Only serv + web generates a same-origin API proxy. Rebuild artifacts using formats 1–3. Back up the existing deployment and verify project identity, volumes and managed credentials before establishing a new full deployment baseline. Tools do not migrate data across projects. Full deployments still remove obsolete service containers under the same Compose project; editing deploy-target.json.directory alone does not migrate resources.
|
|
142
154
|
|
|
@@ -174,7 +186,7 @@ The [fullstack security configuration guide template](templates/apps/fullstack/d
|
|
|
174
186
|
|
|
175
187
|
### Feedback and offline analysis
|
|
176
188
|
|
|
177
|
-
A new `hai create my-app --type fullstack --frontends web --
|
|
189
|
+
A new `hai create my-app --type fullstack --frontends web --defaults` includes feedback by default; API projects require `--features feedback`. Members and business operators can submit reports. Only business_operator sees the review menu and can read, process, reopen or export reports. Database, storage, reach and authentication dependencies are included. The generated app provides intake, paginated review and server contracts. Production uses shared DB and private S3. Notifications independently select disabled/console/reach; console defaults to metadata only. Select consoleContent: summary explicitly for summaries, or configure Reach providers and recipients for actual delivery.
|
|
178
190
|
|
|
179
191
|
Register collectEvidence through feedback.init(config, { collectEvidence }) to await business text or archives. _feedback.yml includes businessCollectionTimeoutMs and webhookUrl/webhookSecret/webhookTimeoutMs. Webhook delivery retries durably and exposes status and administrator retry in details. Keep secrets in private server environment settings; see [feedback examples](../feedback/README.en.md).
|
|
180
192
|
|
package/README.ja.md
CHANGED
|
@@ -38,12 +38,12 @@ hai --help
|
|
|
38
38
|
### アプリの作成
|
|
39
39
|
|
|
40
40
|
```sh
|
|
41
|
-
hai create my-app --type fullstack --frontends web --
|
|
41
|
+
hai create my-app --type fullstack --frontends web --defaults
|
|
42
42
|
cd my-app
|
|
43
43
|
pnpm dev
|
|
44
44
|
```
|
|
45
45
|
|
|
46
|
-
省略した項目は対話で選択し、`--
|
|
46
|
+
省略した項目は対話で選択し、`--defaults` は既定値を使います。依存インストールと Git 初期化は既定で有効です。`--no-install` / `--no-git` で無効化できます。デプロイツールは開発依存として既定で入り、不要なら `--no-deploy` を指定します。
|
|
47
47
|
|
|
48
48
|
### プロジェクトテンプレート
|
|
49
49
|
|
|
@@ -54,13 +54,13 @@ pnpm dev
|
|
|
54
54
|
| `mobile-app` | Svelte + Vite + Capacitor |
|
|
55
55
|
| `fullstack` | contract、API、共通 UI、選択した Web/App/Desktop。miniapp は説明のみ |
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
新規作成は適用可能な全モジュールとサンプルに統一し、サーバーには AI・ベクトル保存先・feedback も導入します。クライアントの依存境界は維持します。インストール容量は増え、サンプルは実業務に合わせて変更が必要です。`--template`、`--features`、`--examples/--no-examples` は削除し、`create --yes/-y` は `--defaults` に変更しました。旧引数は明示的に拒否します。`deploy --yes` と既存工程の構成は維持します。
|
|
58
58
|
|
|
59
|
-
独立した `mobile-app`
|
|
59
|
+
独立した `mobile-app` は frontend crypto と暗号化 typed client transport を含みます。既存の平文 API には `PUBLIC_API_TRANSPORT=off` を明示します。`PUBLIC_API_KEY_EXCHANGE_PATH` は公開鍵交換パスの上書きです。失敗時に平文へ切り替えず、サーバー秘密鍵はクライアントに渡しません。終了時は transport、その後に自身の crypto を解放します。
|
|
60
60
|
|
|
61
61
|
### 静的websiteとGitHub Pages
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
新規 website は全モジュールとサンプルを含み、既定は Node SSR です。静的公開前にサーバー業務依存・初期化・独自 API/actions を工程から除去し、Core/Kit/UI を保持します。軽量作成引数はありません。動的機能のない既存 website では下記の静的構築を利用できます。
|
|
64
64
|
|
|
65
65
|
websiteの既定はNode SSRです。ビルド時に`HAI_BUILD_STATIC=1`と`PUBLIC_BASE_PATH=/docs-site`(docs-siteを実際のリポジトリー名に置換。各区間はASCII英数字・_・.・-のみ、末尾/なし、ルートは空)を指定してpnpm buildを実行すると静的buildを生成します。静的フラグは0/1のみでcompile専用です。PUBLIC_BASE_PATHはDockerのWeb構築にも対応しますが、ネイティブapp/desktopでは指定できません。静的構築はサーバー業務モジュール、独自API/actions、事前描画されないページを拒否し、本番ガードを緩和せずSPAフォールバックも生成しません。既定のhealth APIは含めません。
|
|
66
66
|
|
|
@@ -115,8 +115,20 @@ admin・website・h5 作成時に crypto を選ぶと `_kit.yml` の transport
|
|
|
115
115
|
|
|
116
116
|
パスルール `encryption: required / disabled` で内部 API と通常 HTTPS の外部連携を分けます。相反する設定や必須 transport 不足ではホスト作成に失敗します。Fullstack 管理テンプレートは transport を必須とし、明文例外はパスルールで指定します。[アクセスと暗号化の手引き](../../docs/usage/configuration/request-access.md)を参照してください。
|
|
117
117
|
|
|
118
|
+
### 任意の HTTPS 証明書
|
|
119
|
+
|
|
120
|
+
`pnpm run deploy` は全コンテナーテンプレートで HTTPS なし、既存 PEM 証明書・秘密鍵、Let’s Encrypt を選択できます。相対パスは工程ルート基準です。ドメイン・期限・鍵一致を検証して配布物にコピーします。版を固定した公式 Certbot イメージで申請し、12 時間ごとに更新を確認して Nginx を再読み込みします。利用規約の承認、実際のメール、公的 DNS、80 番ポート、CA 接続が必要です。隔離環境では既存証明書を使います。状態はサーバーに保持し、秘密鍵をアプリイメージに含めません。`--yes` は保存設定を使います。
|
|
121
|
+
|
|
122
|
+
`hai.json.deploy.provider.expose.https` または環境別秘密設定で指定します。既定は HTTPS 443 と HTTP リダイレクト、省略時は HTTP です。有効/無効・モード・ドメイン・ポート・持込証明書の変更は完全デプロイが必要です。[HTTPS 設定](../../docs/usage/configuration/delivery.md#可选https证书)を参照してください。計画では `root` が工程ルート、`serviceDir` がサービスのソース・設定ディレクトリです。
|
|
123
|
+
|
|
118
124
|
### ビルドとデプロイ
|
|
119
125
|
|
|
126
|
+
既定/カスタム設定は同じバックエンドの全有効項目を保持し、フォームにない `publicEndpoint`、接続プール、操作ログも引き継ぎます。自前/クラウド構成は接続と認証を更新します。旧親 JSON から消えた項目は復元後に再梱包してください。[ミドルウェア設定](../deploy/README.ja.md#本当に必要なミドルウェアだけを設定する)を参照してください。
|
|
127
|
+
|
|
128
|
+
Node バックエンド(Serv / SvelteKit SSR)は起動ごとに配布先の `.env.runtime` を既定で読み直します。編集後に `docker restart <コンテナー>` または `podman restart <コンテナー>` を実行し、イメージ再構築や追加 override は不要です。既存配置は新 CLI で一度デプロイしてください。削除した設定を旧 Compose 環境から復活させず、管理接続の `middleware.env` を優先します。私有プロキシ識別と Node 起動引数は配置設定のままです。静的 Web・ミドルウェア・ポート/マウント・Nginx 制限は従来手順で更新します。手動変更をバックアップし、継続する値は元の環境にも反映してください。次のバックエンド配置時に再生成されます。
|
|
129
|
+
|
|
130
|
+
イメージは既定で最大 2 件を並列構築し、`--concurrency 1` で資源使用量を抑えます。ソースの前に依存をインストールし、各端で必要なソースだけをコピーします。実行イメージからアプリの型宣言・source map・README を除去します。ミドルウェアのアーカイブはイメージ内容 ID で検証・再利用し、コピーと同時にハッシュを計算します。配布の既定は `.tar.gz`、明示的な `--output release.tar` は非圧縮です。README は外側だけに保持します。成功後に今回の incoming アップロードと展開先を削除し、release に復旧設定、エンジンにイメージを保持します。
|
|
131
|
+
|
|
120
132
|
DB 接続は保存前に選択したバックエンドの公開 Schema で検証します。MySQL の `ssl` は `false` または厳密な TLS オブジェクトのみで、`{}` は証明書チェーンと DNS ID を検証します。PostgreSQL のモードは維持します。CLI は純粋な Schema と Zod を内包するため、検証対象アプリに DB パッケージやドライバーは不要です。アプリの実行には依存関係が必要で、デプロイ機能には解決可能な `@h-ai/deploy`(生成プロジェクトの開発依存)が必要です。
|
|
121
133
|
|
|
122
134
|
`pnpm build` はソースのコンパイルです。イメージごとの Dockerfile を `images/` に置き、`hai.json` の `build.images` で指定し、同じファイルの `deploy` に配置設定を保存します。`--images` はビルド対象、`--services` は更新サービスを選びます。自動選択は接続可能な Podman、次に Docker です。依存の取得・インストール・本番依存の収集で、パッケージと SQLite ドライバーのキャッシュを共有し、再ダウンロードを避けます。
|
|
@@ -128,7 +140,7 @@ CLI は呼び出し元の `HAI_/PUBLIC_/VITE_` を除外し、内部で生成し
|
|
|
128
140
|
配布ロールは、独立 API バックエンドが `serv`、静的または SSR のブラウザーサイトが `web`、Android/iOS インストーラーが `app`、デスクトップインストーラーが `desktop` です。Fullstack は serv と任意の web、API は serv、admin/website/h5/mobile-app のブラウザーイメージは web を使用します。ネイティブ app/desktop はサーバーの Compose サービスではありません。`--images` と `--services` には serv/web、ネイティブ配布には `--target app` または `--target desktop` を指定します。API サービスのディレクトリは `apps/<project>-serv` です。イメージとコンテナーはルート `package.json.name` を共通の識別名として正規化します(scope 除去、小文字化、無効文字の連続をハイフンに変換)。名前がないか無効な場合は失敗し、ディレクトリ名へフォールバックしません。イメージは `localhost/hai-<project>-<role>:<buildId>`、コンテナーは `hai-<project>-<environment>-<role>` となり、イメージは環境間で再利用できます。
|
|
129
141
|
|
|
130
142
|
```sh
|
|
131
|
-
pnpm build --target
|
|
143
|
+
pnpm build --target image
|
|
132
144
|
pnpm run deploy --env prod
|
|
133
145
|
pnpm run deploy --env prod --build --services web
|
|
134
146
|
# 複数サービスは一つの --services にカンマ区切りで指定。PowerShell 向けに引用符で囲む
|
|
@@ -136,7 +148,7 @@ pnpm run deploy --env prod --build --services "serv,web"
|
|
|
136
148
|
pnpm run deploy --env prod --build --bundle-only
|
|
137
149
|
```
|
|
138
150
|
|
|
139
|
-
既定の配置名はプロジェクトルート(最も近い `hai.json` またはロックファイルのディレクトリ)の `package.json.name` を使い、未指定または無効な名前はエラーになります。明示した環境名を末尾に追加します。fullstack の `hai-delivery` で `packages/hai-delivery-serv` を走査しても、`--env test` は `/opt/hai/apps/hai-delivery-test` と `bundle-hai-delivery-test-<配置ID>-<版>.tar` を生成します。接続先ディレクトリ、配布物、Compose プロジェクト、API/Web/ミドルウェアのコンテナー、ボリューム、サーバー認証状態のファイル名、増分基準で同じ名前を使います。実際のプロジェクト名に含まれる `-serv` は削除しません。
|
|
151
|
+
既定の配置名はプロジェクトルート(最も近い `hai.json` またはロックファイルのディレクトリ)の `package.json.name` を使い、未指定または無効な名前はエラーになります。明示した環境名を末尾に追加します。fullstack の `hai-delivery` で `packages/hai-delivery-serv` を走査しても、`--env test` は `/opt/hai/apps/hai-delivery-test` と `bundle-hai-delivery-test-<配置ID>-<版>.tar.gz` を生成します。接続先ディレクトリ、配布物、Compose プロジェクト、API/Web/ミドルウェアのコンテナー、ボリューム、サーバー認証状態のファイル名、増分基準で同じ名前を使います。実際のプロジェクト名に含まれる `-serv` は削除しません。
|
|
140
152
|
|
|
141
153
|
成果物形式4・5はprimaryService(serv/web)と、工程全体のブラウザー構成を示すhasWebを記録します。形式5には非ルートのwebBasePathも含まれます。同一オリジンAPIプロキシはserv + webの場合だけ生成します。形式1~3は再構築が必要です。既存デプロイをバックアップし、プロジェクト名・ボリューム・管理対象の認証情報を確認してから、新しい完全デプロイの基準を作成してください。プロジェクト間のデータ移行は自動化しません。完全デプロイでは同じComposeプロジェクトの旧サービスコンテナーを削除するため、deploy-target.json.directoryの変更だけでは移行できません。
|
|
142
154
|
|
|
@@ -176,7 +188,7 @@ fullstack 例はアプリ設定で `admin`、`audit_admin`、`config_admin`、`b
|
|
|
176
188
|
|
|
177
189
|
feedback.init(config, { collectEvidence }) で業務の本文・ZIP を非同期収集できます。_feedback.yml は businessCollectionTimeoutMs と webhookUrl/webhookSecret/webhookTimeoutMs を提供します。Webhook は永続再試行と詳細画面での状態確認・再試行に対応し、秘密はサーバー非公開環境に保存します。[feedback の例](../feedback/README.ja.md) を参照してください。
|
|
178
190
|
|
|
179
|
-
`hai create my-app --type fullstack --frontends web --
|
|
191
|
+
`hai create my-app --type fullstack --frontends web --defaults` は問題報告を既定で有効にし、API 工程では `--features feedback` を指定します。一般会員と業務操作員が報告でき、管理メニューの表示と閲覧・処理・再開・エクスポートは business_operator に限定します。DB・ストレージ・通知・認証の依存を補い、収集、ページ一覧とサーバーAPIを生成します。本番では共有 DB と非公開 S3 を使用します。通知は disabled/console/reach を独立に選び、console の既定は metadata のみです。要約は consoleContent: summary を明示し、実送信が必要な場合に Reach 通路と受信者を設定します。
|
|
180
192
|
|
|
181
193
|
`hai feedback summary <bundle.zip>`、`inspect`、`evidence --request-id <ID> --page 1 --page-size 20`、`view` で本番へ接続せず分析できます。表示はloopbackのみで待機し、Ctrl+Cで閉じます。
|
|
182
194
|
|
package/README.md
CHANGED
|
@@ -38,12 +38,12 @@ hai --help
|
|
|
38
38
|
### 创建项目
|
|
39
39
|
|
|
40
40
|
```sh
|
|
41
|
-
hai create my-app --type fullstack --frontends web --
|
|
41
|
+
hai create my-app --type fullstack --frontends web --defaults
|
|
42
42
|
cd my-app
|
|
43
43
|
pnpm dev
|
|
44
44
|
```
|
|
45
45
|
|
|
46
|
-
省略选项时按向导选择,`--
|
|
46
|
+
省略选项时按向导选择,`--defaults` 使用默认值。默认安装依赖并初始化 Git,`--no-install` / `--no-git` 可关闭。部署工具默认作为开发依赖安装,不需要时加 `--no-deploy`。
|
|
47
47
|
|
|
48
48
|
### 项目模板
|
|
49
49
|
|
|
@@ -54,13 +54,13 @@ pnpm dev
|
|
|
54
54
|
| `mobile-app` | Svelte + Vite + Capacitor |
|
|
55
55
|
| `fullstack` | contract、API、共享界面与所选 Web/App/Desktop;miniapp 仅预留说明 |
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
新建工程统一采用适用的完整模块和示例,服务端包含 AI、向量库、反馈等依赖;客户端仍按类型隔离服务端模块。安装体积相应增加,示例需按实际业务替换。`--template`、`--features`、`--examples/--no-examples` 已删除,`create --yes/-y` 改为 `--defaults`,旧参数明确报错;`deploy --yes` 保持原义。已有工程的模块选择不受影响。
|
|
58
58
|
|
|
59
|
-
独立 `mobile-app`
|
|
59
|
+
独立 `mobile-app` 默认包含前端 crypto,并启用 typed client 加密传输。已有明文 API 可显式使用 `PUBLIC_API_TRANSPORT=off`;`PUBLIC_API_KEY_EXCHANGE_PATH` 只覆盖公开协商子路径。握手失败不会降级,服务端私钥不进入客户端。客户端先关闭 transport,再释放自身初始化的 crypto。
|
|
60
60
|
|
|
61
61
|
### 纯静态 website 与 GitHub Pages
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
新建 website 同样包含完整模块和示例,默认 Node SSR。静态发布前须在工程中移除服务端业务依赖及其初始化、API/actions,保留 Core/Kit/UI;没有轻量创建参数。已有不含这些动态能力的 website 仍可使用下述静态构建。
|
|
64
64
|
|
|
65
65
|
website默认Node SSR。仅构建时设置`HAI_BUILD_STATIC=1`与`PUBLIC_BASE_PATH=/docs-site`(docs-site替换为实际仓库名;各目录段仅ASCII字母、数字、_、.、-,无末尾/,根站留空)后执行`pnpm build`,输出build静态目录。静态标志只接受0/1,且仅用于compile;PUBLIC_BASE_PATH也可用于Docker网站构建,原生app/desktop目标不接受网站目录。静态拒绝服务端业务模块、自定义API/actions和未预渲染页面,不放宽生产守卫,不生成SPA回退;默认健康API不进入静态产物。
|
|
66
66
|
|
|
@@ -115,8 +115,20 @@ CLI 消息支持中文、英文和日文,优先使用 `HAI_CORE_DEFAULTLOCALE`
|
|
|
115
115
|
|
|
116
116
|
路径规则 `encryption: required / disabled` 可以让内部接口保持加密、外部接口接收普通 HTTPS 请求;模式冲突或缺少必需加密装配会拒绝创建宿主。Fullstack 管理模板固定要求 transport,使用路径规则设置明文例外。完整配置与验证见[接口访问和加密](../../docs/usage/configuration/request-access.md)。
|
|
117
117
|
|
|
118
|
+
### 可选 HTTPS 证书
|
|
119
|
+
|
|
120
|
+
`pnpm run deploy` 为所有容器模板统一提供“不启用 / 已有 PEM 证书和私钥路径 / Let’s Encrypt”。相对路径以工程根为基准,已有证书校验域名、有效期和密钥匹配后复制到私有发布包。Let’s Encrypt 使用固定版本官方 Certbot 镜像申请,每 12 小时检查续期,Nginx 自动重载。需要确认服务条款、真实邮箱、公网 DNS、80 端口和 CA 网络;隔离环境使用已有证书。证书状态保留在服务器,私钥不进入应用镜像。`--yes` 复用保存配置。
|
|
121
|
+
|
|
122
|
+
配置为 `hai.json.deploy.provider.expose.https`,也可用环境私有文件覆盖。默认 HTTPS 443、HTTP 跳转开启,未配置保持 HTTP;启停或更改模式、域名、端口、本地证书需全量部署。配置和续期边界见[HTTPS 手册](../../docs/usage/configuration/delivery.md#可选https证书)。`--plan` 的 `root` 表示工程根,`serviceDir` 表示部署服务源码与配置目录,仅显示公开证书元数据。
|
|
123
|
+
|
|
118
124
|
### 构建与部署
|
|
119
125
|
|
|
126
|
+
部署向导的默认/自定义模式保留同后端完整配置,包括未出现在表单中的 `publicEndpoint`、连接池及操作日志;自建或云开通只重新定稿连接与认证。旧版已保存的缺字段父 JSON 需先补回再打包,见[中间件配置说明](../deploy/README.md#按应用真正需要的中间件处理)。
|
|
127
|
+
|
|
128
|
+
Node 后端(Serv / SvelteKit SSR)默认在每次启动时重读发布目录的 `.env.runtime`,修改后 `docker restart <容器名>` 或 `podman restart <容器名>` 即可,无需重建镜像或额外 override。旧部署先用新版 CLI 发布一次。删除的字段不会从旧 Compose 注入中复活;服务器托管连接的 `middleware.env` 保持原有更高优先级,私有代理标记和 Node 启动参数仍由部署装配管理。静态 Web、中间件、端口/挂载和 Nginx 限额不在该重载范围。手工修改需备份;下一次后端发布会从工程环境重新生成,需要长期保留的配置同步回源环境。
|
|
129
|
+
|
|
130
|
+
镜像默认最多并行两项,`--concurrency 1` 可降低资源占用。Dockerfile 在复制源码前安装依赖;前后端仅复制各自必要源码,复用安装层和驱动缓存。运行镜像移除应用自身的声明文件、源码映射和说明文件。打包按镜像内容 ID 复用并校验中间件归档,复制应用镜像时同时计算摘要。默认交付压缩为 `.tar.gz`,显式 `--output release.tar` 可保留未压缩格式;README 仅保留外层一份。成功部署后清理本次 incoming 上传和解包目录,release 保留恢复配置和状态,镜像由容器引擎保存。
|
|
131
|
+
|
|
120
132
|
数据库连接保存前使用所选后端的真实公开 Schema 校验:MySQL `ssl` 仅 `false` 或严格 TLS 对象,`{}` 默认校验证书链和 DNS 身份;PostgreSQL 保留其模式。CLI 已内联纯 Schema 和 Zod,配置校验不要求目标应用安装数据库包/驱动;实际运行应用仍需相应依赖。部署功能仍须能解析已安装的 `@h-ai/deploy`(生成工程将其作为开发依赖)。
|
|
121
133
|
|
|
122
134
|
`pnpm build` 只编译源码。镜像使用 `images/` 中独立 Dockerfile,由项目根 `hai.json` 的 `build.images` 指定文件,部署参数放在同文件的 `deploy`;`--images` 决定构建哪些镜像,`--services` 决定更新哪些服务。容器引擎 auto 优先 Podman,再尝试 Docker。下载、安装和整理生产依赖共用包缓存与 SQLite 驱动缓存,避免重复下载。
|
|
@@ -128,7 +140,7 @@ CLI 在过滤调用者的 `HAI_/PUBLIC_/VITE_` 后,只注入内部生成的 `H
|
|
|
128
140
|
交付角色统一为 `serv`(独立 API 后端)、`web`(静态或 SSR 浏览器站点)、`app`(Android/iOS 手机安装包)、`desktop`(桌面安装包)。Fullstack 容器为 serv + 可选 web,API 为 serv,admin/website/h5/mobile-app 的浏览器镜像为 web;原生 app/desktop 不作为服务器 Compose 服务。`--images` 与 `--services` 使用 serv/web,`--target app` 与 `--target desktop` 生成原生包。API workspace 的服务目录为 `apps/<项目>-serv`。镜像与容器共用工程根 `package.json.name` 的归一化身份(去 scope、转小写、非法字符合并为连字符);名称缺失或无效时报错,不回退目录名。镜像为 `localhost/hai-<项目>-<角色>:<buildId>`,容器为 `hai-<项目>-<环境>-<角色>`,镜像可跨环境复用。
|
|
129
141
|
|
|
130
142
|
```sh
|
|
131
|
-
pnpm build --target
|
|
143
|
+
pnpm build --target image
|
|
132
144
|
pnpm run deploy --env prod
|
|
133
145
|
pnpm run deploy --env prod --build --services web
|
|
134
146
|
# 多个服务共用一个 --services,用英文逗号分隔;加引号兼容 PowerShell
|
|
@@ -136,7 +148,7 @@ pnpm run deploy --env prod --build --services "serv,web"
|
|
|
136
148
|
pnpm run deploy --env prod --build --bundle-only
|
|
137
149
|
```
|
|
138
150
|
|
|
139
|
-
默认部署名取工程根(最近的 `hai.json` 或锁文件所在目录)的 `package.json.name`,缺失时报错,再附加显式环境后缀。例如 fullstack 工程 `hai-delivery` 扫描 `packages/hai-delivery-serv`,`--env test` 生成 `/opt/hai/apps/hai-delivery-test` 和 `bundle-hai-delivery-test-<部署ID>-<版本>.tar`。远端目录、交付包、Compose 项目、API/Web/中间件容器、数据卷、服务器凭据状态及增量基线统一使用该名称;不会按字符串删除真实项目名中的 `-serv`。
|
|
151
|
+
默认部署名取工程根(最近的 `hai.json` 或锁文件所在目录)的 `package.json.name`,缺失时报错,再附加显式环境后缀。例如 fullstack 工程 `hai-delivery` 扫描 `packages/hai-delivery-serv`,`--env test` 生成 `/opt/hai/apps/hai-delivery-test` 和 `bundle-hai-delivery-test-<部署ID>-<版本>.tar.gz`。远端目录、交付包、Compose 项目、API/Web/中间件容器、数据卷、服务器凭据状态及增量基线统一使用该名称;不会按字符串删除真实项目名中的 `-serv`。
|
|
140
152
|
|
|
141
153
|
制品格式4和5都记录 primaryService(serv/web),hasWeb 表示完整工程是否包含浏览器端;格式5另记录非根目录webBasePath。只有 serv + web 才生成同源 API 代理。格式1至3制品须重新构建。旧部署先备份并核对项目名、数据卷和受管凭据,再切换到新的完整部署基线;工具不自动跨项目迁移数据。完整部署仍会按 Compose 规则清理同项目的旧服务容器,不能仅修改 deploy-target.json.directory 完成迁移。
|
|
142
154
|
|
|
@@ -174,7 +186,7 @@ fullstack 的逐项开关、默认值、启用前提与使用影响见[配置化
|
|
|
174
186
|
|
|
175
187
|
### 问题反馈与离线分析
|
|
176
188
|
|
|
177
|
-
使用 `hai create my-app --type fullstack --frontends web --
|
|
189
|
+
使用 `hai create my-app --type fullstack --frontends web --defaults` 默认启用反馈;API 工程需显式选择 `--features feedback`。普通成员及业务操作员可提交反馈,business_operator 才显示管理菜单并能查看、处理、撤销和导出;自动补齐数据库、存储、触达与认证依赖。生成收集入口、分页管理页和服务端接口。生产使用共享 DB 和私有 S3;通知独立选择 disabled/console/reach,默认 console 只输出 metadata。需要摘要时显式设 consoleContent: summary,需要实际发送时再配置 Reach 通道与收件人。
|
|
178
190
|
|
|
179
191
|
业务扩展在 feedback.init(config, { collectEvidence }) 中 await 文本/ZIP 等材料;_feedback.yml 提供 businessCollectionTimeoutMs、webhookUrl/webhookSecret/webhookTimeoutMs。Webhook 独立持久重试,详情可查看状态并重试;密钥仅放服务端私有环境。见 [feedback 配置与示例](../feedback/README.md)。
|
|
180
192
|
|