@h-ai/cli 0.1.0-alpha.66 → 0.1.0-alpha.67
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 +66 -257
- package/README.ja.md +66 -257
- package/README.md +66 -257
- package/dist/{chunk-QYX6V7H2.js → chunk-7DSURTJ4.js} +22 -79
- package/dist/chunk-7DSURTJ4.js.map +1 -0
- package/dist/{chunk-FWN5B54L.js → chunk-AOQ4N657.js} +182 -10
- package/dist/chunk-AOQ4N657.js.map +1 -0
- package/dist/cli-config-templates-6AHNUGBN.js +5 -0
- package/dist/{cli-config-templates-3XSFIXBP.js.map → cli-config-templates-6AHNUGBN.js.map} +1 -1
- package/dist/{cli-skill-templates-TSYEQTCY.js → cli-skill-templates-FC3QRKDO.js} +3 -3
- package/dist/{cli-skill-templates-TSYEQTCY.js.map → cli-skill-templates-FC3QRKDO.js.map} +1 -1
- package/dist/index.js +435 -247
- package/dist/index.js.map +1 -1
- package/dist/{src-RDQ2EIBT.js → src-2V6VP4I5.js} +553 -119
- package/dist/src-2V6VP4I5.js.map +1 -0
- package/package.json +8 -8
- package/templates/README.md +48 -145
- package/templates/apps/admin/src/routes/admin/+layout.svelte.hbs +1 -1
- package/templates/apps/api/.dockerignore.hbs +14 -7
- package/templates/apps/api/.gitignore.hbs +7 -0
- package/templates/apps/api/apps/{{projectName}}-contract/README.md.hbs +23 -2
- package/templates/apps/api/apps/{{projectName}}-service/README.md.hbs +28 -7
- package/templates/apps/api/apps/{{projectName}}-service/package.json.hbs +1 -2
- package/templates/apps/api/hai.build.json.hbs +1 -1
- package/templates/apps/api/images/app.Dockerfile.hbs +35 -0
- package/templates/apps/api/package.json.hbs +5 -0
- package/templates/apps/fullstack/.dockerignore.hbs +14 -9
- package/templates/apps/fullstack/.gitignore.hbs +7 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/README.md.hbs +23 -5
- package/templates/apps/fullstack/apps/{{projectName}}-app/index.html.hbs +1 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/public/runtime-config.js.hbs +4 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/vite.config.ts.hbs +1 -1
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/README.md.hbs +22 -4
- package/templates/apps/fullstack/apps/{{projectName}}-miniapp/README.md.hbs +16 -6
- package/templates/apps/fullstack/apps/{{projectName}}-web/README.md.hbs +23 -5
- package/templates/apps/fullstack/apps/{{projectName}}-web/vite.config.ts.hbs +1 -1
- package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +11 -1
- package/templates/apps/fullstack/hai.build.json.hbs +2 -2
- package/templates/apps/fullstack/images/app.Dockerfile.hbs +36 -0
- package/templates/apps/fullstack/images/web.Dockerfile.hbs +34 -0
- package/templates/apps/fullstack/package.json.hbs +2 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/README.md.hbs +23 -2
- package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +27 -6
- package/templates/apps/fullstack/packages/{{projectName}}-shared/.gitignore.hbs +7 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/README.md.hbs +32 -11
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AppShell.svelte.hbs +2 -2
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/settings.svelte.hbs +3 -3
- package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/api-client.test.ts.hbs +2 -2
- package/templates/apps/h5/src/routes/+layout.svelte.hbs +2 -2
- package/templates/apps/mobile-app/src/App.svelte.hbs +2 -2
- package/templates/apps/mobile-app/src/lib/pages/home.svelte.hbs +2 -2
- package/templates/apps/website/src/routes/+layout.svelte.hbs +3 -3
- package/templates/apps/website/src/routes/services/+page.svelte.hbs +1 -1
- package/templates/base/.dockerignore.hbs +14 -8
- package/templates/base/.gitignore.hbs +7 -0
- package/templates/base/e2e/app.spec.ts.hbs +10 -0
- package/templates/base/hai.build.json.hbs +1 -1
- package/templates/base/{Dockerfile.hbs → images/app.Dockerfile.hbs} +19 -17
- package/templates/base/package.json.hbs +8 -3
- package/templates/base/vite.config.ts.hbs +3 -1
- package/templates/shared/.gitattributes +6 -0
- package/templates/skills/AGENTS.md +3 -3
- package/templates/skills/bridges/admin/AGENTS.md +1 -1
- package/templates/skills/bridges/api/AGENTS.md +1 -1
- package/templates/skills/bridges/fullstack/AGENTS.md.hbs +1 -1
- package/templates/skills/bridges/h5/AGENTS.md +1 -1
- package/templates/skills/bridges/mobile-app/AGENTS.md +1 -1
- package/templates/skills/bridges/website/AGENTS.md +1 -1
- package/templates/skills/hai-api-client/SKILL.md +14 -161
- package/templates/skills/hai-api-client/reference.md +166 -0
- package/templates/skills/hai-api-contract/SKILL.md +15 -273
- package/templates/skills/hai-api-contract/reference.md +278 -0
- package/templates/skills/hai-app-create/SKILL.md +2 -2
- package/templates/skills/hai-app-create/development.md +4 -4
- package/templates/skills/hai-app-create/reference.md +5 -4
- package/templates/skills/hai-app-review/SKILL.md +1 -1
- package/templates/skills/hai-app-tests/SKILL.md +4 -3
- package/templates/skills/hai-app-tests/reference.md +2 -2
- package/templates/skills/hai-app-tests/validation.md +31 -0
- package/templates/skills/hai-audit/SKILL.md +17 -142
- package/templates/skills/hai-audit/reference.md +145 -0
- package/templates/skills/hai-build/SKILL.md +14 -8
- package/templates/skills/hai-build/reference.md +10 -9
- package/templates/skills/hai-cache/SKILL.md +15 -182
- package/templates/skills/hai-cache/reference.md +187 -0
- package/templates/skills/hai-capacitor/SKILL.md +4 -3
- package/templates/skills/hai-capacitor/reference.md +6 -4
- package/templates/skills/hai-ci/SKILL.md +2 -0
- package/templates/skills/hai-core/SKILL.md +3 -3
- package/templates/skills/hai-crypto/SKILL.md +16 -252
- package/templates/skills/hai-crypto/reference.md +256 -0
- package/templates/skills/hai-datapipe/SKILL.md +15 -196
- package/templates/skills/hai-datapipe/reference.md +202 -0
- package/templates/skills/hai-deploy/SKILL.md +20 -55
- package/templates/skills/hai-deploy/middleware.md +5 -11
- package/templates/skills/hai-framework-sync/SKILL.md +2 -2
- package/templates/skills/hai-framework-sync/sync.md +1 -1
- package/templates/skills/hai-iam/SKILL.md +1 -3
- package/templates/skills/hai-kit/SKILL.md +12 -167
- package/templates/skills/hai-kit/reference.md +172 -0
- package/templates/skills/hai-payment/SKILL.md +19 -251
- package/templates/skills/hai-payment/reference.md +256 -0
- package/templates/skills/hai-pr-review/SKILL.md +4 -4
- package/templates/skills/hai-reach/SKILL.md +2 -2
- package/templates/skills/hai-reldb/SKILL.md +1 -1
- package/templates/skills/hai-scheduler/SKILL.md +15 -195
- package/templates/skills/hai-scheduler/reference.md +202 -0
- package/templates/skills/hai-serv/SKILL.md +2 -2
- package/templates/skills/hai-spec-implement/SKILL.md +1 -1
- package/templates/skills/hai-spec-implement/workflow.md +3 -3
- package/templates/skills/hai-storage/SKILL.md +17 -238
- package/templates/skills/hai-storage/reference.md +243 -0
- package/templates/skills/hai-ui/SKILL.md +1 -1
- package/templates/skills/hai-ui/reference.md +9 -5
- package/templates/skills/hai-vecdb/SKILL.md +2 -2
- package/dist/chunk-FWN5B54L.js.map +0 -1
- package/dist/chunk-QYX6V7H2.js.map +0 -1
- package/dist/cli-config-templates-3XSFIXBP.js +0 -5
- package/dist/src-RDQ2EIBT.js.map +0 -1
- package/templates/apps/api/Dockerfile.hbs +0 -35
- package/templates/apps/fullstack/Dockerfile.hbs +0 -57
- /package/templates/apps/fullstack/{docker → images/web}/19-runtime-config.envsh.hbs +0 -0
- /package/templates/apps/fullstack/{docker → images/web}/nginx.conf.hbs +0 -0
- /package/templates/apps/fullstack/{docker → images/web}/runtime-config.js.template.hbs +0 -0
- /package/templates/base/{docker → images/web}/nginx.conf.hbs +0 -0
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@h-ai/cli",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.1.0-alpha.
|
|
4
|
+
"version": "0.1.0-alpha.67",
|
|
5
5
|
"description": "Hai Framework CLI for project scaffolding and code generation.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"keywords": [
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"node": "^22.22.2 || ^24.15.0 || >=26.0.0"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@h-ai/core": "0.1.0-alpha.
|
|
33
|
+
"@h-ai/core": "0.1.0-alpha.67",
|
|
34
34
|
"cac": "^7.0.1",
|
|
35
35
|
"chalk": "^6.0.1",
|
|
36
36
|
"fast-wrap-ansi": "^0.2.2",
|
|
@@ -41,12 +41,12 @@
|
|
|
41
41
|
"yaml": "^2.9.1"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
|
-
"@h-ai/cache": "0.1.0-alpha.
|
|
45
|
-
"@h-ai/crypto": "0.1.0-alpha.
|
|
46
|
-
"@h-ai/deploy": "0.1.0-alpha.
|
|
47
|
-
"@h-ai/reach": "0.1.0-alpha.
|
|
48
|
-
"@h-ai/reldb": "0.1.0-alpha.
|
|
49
|
-
"@h-ai/storage": "0.1.0-alpha.
|
|
44
|
+
"@h-ai/cache": "0.1.0-alpha.67",
|
|
45
|
+
"@h-ai/crypto": "0.1.0-alpha.67",
|
|
46
|
+
"@h-ai/deploy": "0.1.0-alpha.67",
|
|
47
|
+
"@h-ai/reach": "0.1.0-alpha.67",
|
|
48
|
+
"@h-ai/reldb": "0.1.0-alpha.67",
|
|
49
|
+
"@h-ai/storage": "0.1.0-alpha.67",
|
|
50
50
|
"@types/fs-extra": "^11.0.4",
|
|
51
51
|
"@types/node": "^26.6.5",
|
|
52
52
|
"@types/prompts": "^2.4.9",
|
package/templates/README.md
CHANGED
|
@@ -1,163 +1,66 @@
|
|
|
1
|
-
# CLI
|
|
1
|
+
# CLI 项目模板
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## 简介
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
这里保存 `hai create` 生成应用时使用的源码、配置和 AI 指引。维护模板后,需要生成真实项目验证,不能只检查模板文件本身。
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
templates/
|
|
9
|
-
├── base/ # 所有应用类型共用的骨架文件
|
|
10
|
-
│ ├── package.json.hbs # 动态:按 features 注入依赖
|
|
11
|
-
│ ├── vite.config.ts.hbs # 动态:按 hasI18n / hasUi 注入插件
|
|
12
|
-
│ ├── tsconfig.json.hbs # 动态:SvelteKit / 纯 Svelte 5 分支
|
|
13
|
-
│ ├── svelte.config.js.hbs # 动态:SvelteKit / 纯 Svelte 5 分支
|
|
14
|
-
│ ├── .gitignore.hbs # 动态:纯 Svelte 5 应用不输出 .svelte-kit
|
|
15
|
-
│ ├── playwright.config.ts
|
|
16
|
-
│ └── src/
|
|
17
|
-
│ ├── app.html.hbs # 动态:SvelteKit 应用输出 app shell
|
|
18
|
-
│ ├── app.d.ts.hbs # 动态:SvelteKit 应用输出 App namespace
|
|
19
|
-
│ ├── app.css
|
|
20
|
-
│ ├── hooks.server.ts.hbs # 动态:按 features / hasI18n 组装 handle 序列
|
|
21
|
-
│ └── lib/server/
|
|
22
|
-
│ └── init.ts.hbs # 动态:按 features 注入模块初始化
|
|
23
|
-
│
|
|
24
|
-
├── apps/ # 应用类型专属路由与页面
|
|
25
|
-
│ ├── admin/ # 管理后台
|
|
26
|
-
│ │ ├── messages/ # i18n 消息文件(zh-CN / en-US)
|
|
27
|
-
│ │ └── src/routes/ # +page / +layout .svelte.hbs
|
|
28
|
-
│ ├── website/ # 企业官网
|
|
29
|
-
│ │ ├── messages/
|
|
30
|
-
│ │ └── src/routes/
|
|
31
|
-
│ ├── h5/ # H5 移动端
|
|
32
|
-
│ │ ├── messages/
|
|
33
|
-
│ │ └── src/routes/
|
|
34
|
-
│ ├── api/ # 纯 API 服务(无 UI / 无 i18n)
|
|
35
|
-
│ │ └── src/routes/
|
|
36
|
-
│ ├── mobile-app/ # Svelte 5 + Vite + Capacitor 移动应用
|
|
37
|
-
│ │ ├── index.html.hbs
|
|
38
|
-
│ │ ├── messages/
|
|
39
|
-
│ │ └── src/App.svelte.hbs
|
|
40
|
-
│ └── fullstack/ # 前后端分离多包工程(contract / serv / web / app / desktop / miniapp 占位)
|
|
41
|
-
│ ├── packages/ # 共享 contract 与后端 serv 包
|
|
42
|
-
│ ├── apps/ # 多前端目标,按用户选择条件生成
|
|
43
|
-
│ └── e2e/ # 服务端 + 页面级 Playwright 流程
|
|
44
|
-
│
|
|
45
|
-
├── features/ # 可选 feature 路由(叠加到 src/routes/)
|
|
46
|
-
│ ├── iam/
|
|
47
|
-
│ │ ├── routes-shared/ # 所有应用类型共用(API 端点)
|
|
48
|
-
│ │ ├── routes-admin/ # admin 专属(登录/注册页 .hbs)
|
|
49
|
-
│ │ └── routes-h5/ # h5 专属(登录/注册页 .hbs)
|
|
50
|
-
│ ├── storage/
|
|
51
|
-
│ │ └── routes/ # 上传 API
|
|
52
|
-
│ └── ai/
|
|
53
|
-
│ └── routes/ # 聊天流 API
|
|
54
|
-
│
|
|
55
|
-
├── i18n/ # i18n 脚手架(hasI18n 时复制到项目根)
|
|
56
|
-
│ └── project.inlang/
|
|
57
|
-
│ └── settings.json # Paraglide 项目配置
|
|
58
|
-
│
|
|
59
|
-
└── skills/ # AI Skill 与各 appType 桥接指引
|
|
60
|
-
└── bridges/ # admin / api / website / h5 / mobile-app / fullstack 专属 AGENTS
|
|
61
|
-
```
|
|
7
|
+
## 核心功能清单
|
|
62
8
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
`
|
|
66
|
-
|
|
67
|
-
-
|
|
68
|
-
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
- `opencode.json` 使用 OpenCode 的 `instructions` 配置直接引用 `AGENTS.md`;`.agents/skills/` 由 OpenCode 原生发现,不再写入过期的 `skills.paths`
|
|
74
|
-
- `CLAUDE.md` 通过 `@AGENTS.md` 复用共享规范,Claude Code 按其中的任务导航读取 `.agents/skills/` 正文与参考。CLI 不生成 `.claude/` 技能副本;此模式不提供 Claude 原生技能自动发现或 `/skill` 命令。依据:[Claude Code 项目指引](https://code.claude.com/docs/en/memory)、[原生 skills](https://code.claude.com/docs/en/skills)
|
|
75
|
-
- `hai add` / `hai init` 只补齐缺失的 AI 支持文件,不覆盖用户已自定义的桥接文件,也不会自动删除遗留的 `.github/skills/` 或 `.claude/`
|
|
76
|
-
|
|
77
|
-
## 文件类型说明
|
|
78
|
-
|
|
79
|
-
| 类型 | 处理方式 |
|
|
80
|
-
| ------------------------------------------ | -------------------------------------------- |
|
|
81
|
-
| 普通文件(`.ts` / `.svelte` / `.json` 等) | 直接复制,内容不变 |
|
|
82
|
-
| `.hbs` 文件 | 经 Handlebars 渲染后输出(去掉 `.hbs` 后缀) |
|
|
83
|
-
|
|
84
|
-
## 渲染上下文(TemplateContext)
|
|
85
|
-
|
|
86
|
-
所有 `.hbs` 文件可使用以下变量:
|
|
87
|
-
|
|
88
|
-
| 变量 | 类型 | 说明 |
|
|
89
|
-
| ---------------------- | --------- | ----------------------------------------- |
|
|
90
|
-
| `{{projectName}}` | `string` | 项目名称(如 `my-app`) |
|
|
91
|
-
| `{{appType}}` | `string` | 应用类型 |
|
|
92
|
-
| `{{hasUi}}` | `boolean` | 是否包含 UI(非 `api` 类型为 `true`) |
|
|
93
|
-
| `{{hasI18n}}` | `boolean` | 是否启用 i18n(非 `api` 类型为 `true`) |
|
|
94
|
-
| `{{isSvelteOnlyApp}}` | `boolean` | 是否为不依赖 SvelteKit 的纯 Svelte 5 应用 |
|
|
95
|
-
| `{{isCapacitorApp}}` | `boolean` | 是否为 Capacitor 移动应用 |
|
|
96
|
-
| `{{defaultLocale}}` | `string` | 默认语言,如 `zh-CN` |
|
|
97
|
-
| `{{packageManager}}` | `string` | 包管理器:`pnpm` / `npm` / `yarn` |
|
|
98
|
-
| `{{fullstack.*}}` | `object` | fullstack 类型专用上下文 |
|
|
99
|
-
| `{{features.iam}}` | `boolean` | 是否选中 iam feature |
|
|
100
|
-
| `{{features.db}}` | `boolean` | 是否选中 db feature |
|
|
101
|
-
| `{{features.cache}}` | `boolean` | 是否选中 cache feature |
|
|
102
|
-
| `{{features.crypto}}` | `boolean` | 是否选中 crypto feature |
|
|
103
|
-
| `{{features.storage}}` | `boolean` | 是否选中 storage feature |
|
|
104
|
-
| `{{features.ai}}` | `boolean` | 是否选中 ai feature |
|
|
105
|
-
|
|
106
|
-
`appType` 支持 `admin` / `website` / `h5` / `api` / `mobile-app` / `fullstack`。
|
|
107
|
-
|
|
108
|
-
H5 业务页面复用 `@h-ai/ui` 的 `BottomNav` 和移动端壳样式,桌面预览保持居中限宽,认证路由独立显示。
|
|
109
|
-
|
|
110
|
-
`fullstack.*` 包含包名、前端选择、依赖版本、`contractExportName` 和原生壳 `nativeAppIdSegment`,用于渲染 contract / serv / 多端 UI / Capacitor / Tauri 模板。
|
|
111
|
-
|
|
112
|
-
`moduleConfigs` 保留创建时指定的模块值。Fullstack 的模块 YAML 用 `{{{moduleConfig 'db' true}}}` 等 helper 复用 `cli-config-templates.ts`;可选模块传 `features.ai` 等开关,未选择时整份注释。创建流程保留已渲染的配置,不再用精简内容覆盖;core、serv、Reach 保留应用专用默认值及完整的可选字段。新增 Schema 字段同步此生成器和相应模板。
|
|
113
|
-
|
|
114
|
-
所有根 `.gitignore`(base / api / fullstack)保留 `**/data/`,包括 `.gitkeep` 在内的运行数据不跟踪。Fullstack 服务端 config 始终含 core、serv、db、cache、iam、storage、audit、reach、ai、vecdb、payment、scheduler、deploy 共 13 份 YAML;不为无配置入口的 crypto/datapipe 生成 YAML。未启用块的后续接入步骤见 [CLI 配置说明](../README.md#应用配置与显示)。
|
|
115
|
-
|
|
116
|
-
### 常用条件写法
|
|
117
|
-
|
|
118
|
-
```handlebars
|
|
119
|
-
{{!-- 按 feature 条件注入内容 --}}
|
|
120
|
-
{{#if features.iam}}
|
|
121
|
-
import { iam } from '@h-ai/iam'
|
|
122
|
-
{{/if}}
|
|
123
|
-
|
|
124
|
-
{{!-- 按 i18n 条件切换内容 --}}
|
|
125
|
-
{{#if hasI18n}}
|
|
126
|
-
<title>{m.page_title()}</title>
|
|
127
|
-
{{else}}
|
|
128
|
-
<title>首页</title>
|
|
129
|
-
{{/if}}
|
|
130
|
-
```
|
|
9
|
+
- `admin`、`website`、`h5`:SvelteKit 应用。
|
|
10
|
+
- `api`:共享 contract 与 API service 的 workspace。
|
|
11
|
+
- `mobile-app`:Svelte + Vite + Capacitor 应用。
|
|
12
|
+
- `fullstack`:contract、API、共享界面,以及按需选择的 Web/App/Desktop;miniapp 仅预留说明。
|
|
13
|
+
- 后台工作区随窗口扩展;手机壳支持宽屏,表格在内部滚动,文章与认证表单保留阅读宽度。
|
|
14
|
+
- 默认部署工具、独立镜像 Dockerfile、环境示例和可复制的 AI 技能。
|
|
15
|
+
|
|
16
|
+
## 使用入门
|
|
17
|
+
|
|
18
|
+
### 文件如何组合
|
|
131
19
|
|
|
132
|
-
|
|
20
|
+
| 目录 | 用途 |
|
|
21
|
+
| -------------- | ------------------------------------------------------------------- |
|
|
22
|
+
| `base/` | 普通应用共用的配置、脚本和入口 |
|
|
23
|
+
| `apps/<类型>/` | 应用专属页面、workspace、原生壳与配置;API/fullstack 维护自己的骨架 |
|
|
24
|
+
| `features/` | 按所选模块叠加的路由和页面 |
|
|
25
|
+
| `i18n/` | Paraglide 工程配置 |
|
|
26
|
+
| `skills/` | 完整的技能目录与各类型 AI 入口 |
|
|
133
27
|
|
|
134
|
-
|
|
28
|
+
普通文件直接复制,`.hbs` 经 Handlebars 渲染并去掉后缀。`cli-template-engine.ts` 决定适用目录与条件;`cli-create.ts` 完成配置、镜像定义和根 README 等生成工作。修改前先查实际调用路径,API/fullstack 不套用 SvelteKit 文件路由。
|
|
135
29
|
|
|
136
|
-
|
|
137
|
-
2. **复制 `apps/{appType}/` 专属文件** → 项目根(`messages/` 仅 `hasI18n` 时复制)
|
|
138
|
-
3. **叠加 feature 静态路由** → `src/routes/`(纯 Svelte 5 应用跳过 SvelteKit 路由)
|
|
139
|
-
4. **渲染所有 `.hbs` 文件** — `base/` + `apps/{appType}/` 输出到项目根;`features/*/routes*/` 输出到 `src/routes/`
|
|
140
|
-
5. **复制 `i18n/` 脚手架** → 项目根(仅 `hasI18n` 时)
|
|
141
|
-
6. **确保 `static/` 目录存在**
|
|
30
|
+
### 配置与构建
|
|
142
31
|
|
|
143
|
-
|
|
32
|
+
模板通过 `projectName`、`appType`、`features`、`hasUi`、`hasI18n`、`versions` 以及 `api`/`fullstack` 上下文渲染,完整字段见 [cli-types.ts](../src/cli-types.ts)。模块 YAML 使用 `moduleConfig` helper,与 [配置生成器](../src/commands/cli-config-templates.ts) 共用字段和默认值。
|
|
144
33
|
|
|
145
|
-
|
|
34
|
+
部署默认启用,`--no-deploy` 可关闭;SDK 是开发依赖。每个镜像使用 `images/` 中独立 Dockerfile,Web 资源放 `images/web/`。`hai.build.json` 直接选择文件;依赖输入由构建器生成到 `images/dependencies/`。所有根 `.gitignore` 均忽略 `**/images/dependencies/`、运行数据和私有环境文件。
|
|
146
35
|
|
|
147
|
-
|
|
36
|
+
Fullstack 服务端保留各模块的配置示例,未使用模块保持注释。安装依赖、校验和初始化、接入业务后才启用对应配置。修改公开 Schema 时同步配置生成器、环境变量说明、调用方与技能。
|
|
148
37
|
|
|
149
|
-
###
|
|
38
|
+
### AI 指引
|
|
150
39
|
|
|
151
|
-
|
|
40
|
+
`skills/hai-*` 的完整目录复制到生成应用 `.agents/skills/`,按应用架构排除不适用项。`bridges/<类型>/AGENTS.md` 提供根入口;Claude/Copilot/OpenCode 配置只引用共享规则。新增参考文件必须随 skill 一起复制,不能链接回框架私有路径。
|
|
152
41
|
|
|
153
|
-
|
|
42
|
+
`hai add` / `hai init` 补齐缺失文件,保留应用已有的自定义内容。框架升级时按目标发布版本比较并合并,不直接覆盖应用规则。
|
|
154
43
|
|
|
155
|
-
|
|
44
|
+
### 页面与文案
|
|
156
45
|
|
|
157
|
-
|
|
46
|
+
用户可见文本加入对应 messages。认证复用 AuthPanel 与服务端公开 IAM 配置;表单复用 Form/FormLayout/FormField。业务规则由应用需求决定,模板默认角色、流程和限额可调整,修改时同步授权、界面、测试和文档。
|
|
47
|
+
|
|
48
|
+
## 开发测试
|
|
49
|
+
|
|
50
|
+
维护模板时保留 `shared/.gitattributes`,让生成工程的 `.dockerignore`、Dockerfile 和 POSIX 脚本统一使用 LF,保持跨平台输入一致并确保 Linux 脚本可运行。在仓库根执行:
|
|
51
|
+
|
|
52
|
+
```sh
|
|
53
|
+
pnpm --filter @h-ai/cli typecheck
|
|
54
|
+
pnpm --filter @h-ai/cli lint
|
|
55
|
+
pnpm --filter @h-ai/cli build
|
|
56
|
+
pnpm --filter @h-ai/cli test
|
|
57
|
+
pnpm check:skills
|
|
58
|
+
pnpm --filter @h-ai/cli test:scaffold-gates
|
|
59
|
+
pnpm --filter @h-ai/cli test:deploy-gates
|
|
60
|
+
```
|
|
158
61
|
|
|
159
|
-
|
|
62
|
+
脚手架门禁会生成项目并执行安装、类型检查、lint、构建、测试和浏览器流程。部署门禁另需可用 Podman/Docker,验证镜像构建、隔离服务器上的 SSH/人工部署与部分更新。原生安装包和真实第三方服务需要各自的验收环境。
|
|
160
63
|
|
|
161
|
-
##
|
|
64
|
+
## 许可证
|
|
162
65
|
|
|
163
|
-
|
|
66
|
+
Apache-2.0
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
|
|
30
30
|
<div class='drawer lg:drawer-open'>
|
|
31
31
|
<input id='admin-drawer' type='checkbox' class='drawer-toggle' />
|
|
32
|
-
<div class='drawer-content p-6'>
|
|
32
|
+
<div class='drawer-content min-w-0 p-4 sm:p-6'>
|
|
33
33
|
<label for='admin-drawer' class='btn btn-ghost btn-sm drawer-button lg:hidden mb-4'>
|
|
34
34
|
<span class='icon-[tabler--menu-2] size-5'></span>
|
|
35
35
|
</label>
|
|
@@ -1,16 +1,23 @@
|
|
|
1
|
-
|
|
1
|
+
**/.git
|
|
2
|
+
**/node_modules
|
|
3
|
+
**/.pnpm-store
|
|
4
|
+
**/.cache
|
|
5
|
+
**/.svelte-kit
|
|
6
|
+
**/.turbo
|
|
7
|
+
**/build
|
|
8
|
+
**/dist
|
|
9
|
+
**/coverage
|
|
10
|
+
**/playwright-report
|
|
11
|
+
**/test-results
|
|
12
|
+
**/src-tauri/target
|
|
13
|
+
**/hash-core/target
|
|
14
|
+
tmp
|
|
2
15
|
**/*.tar
|
|
3
16
|
.github
|
|
4
17
|
.agents
|
|
5
18
|
.claude
|
|
6
19
|
.codex
|
|
7
20
|
.opencode
|
|
8
|
-
.turbo
|
|
9
|
-
build
|
|
10
|
-
dist
|
|
11
|
-
node_modules
|
|
12
|
-
playwright-report
|
|
13
|
-
test-results
|
|
14
21
|
**/data
|
|
15
22
|
*.log
|
|
16
23
|
# 仅保留公共基础 .env;分环境配置、私有覆盖及已有交付包不进入构建上下文。
|
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
# {{api.contractPackageName}}
|
|
2
2
|
|
|
3
|
+
## 简介
|
|
4
|
+
|
|
3
5
|
{{projectName}} API service 的共享 contract 包。
|
|
4
6
|
|
|
5
|
-
##
|
|
7
|
+
## 核心功能清单
|
|
8
|
+
|
|
9
|
+
- 共享接口路径、输入输出 Schema 和类型。
|
|
10
|
+
- 客户端与服务端使用同一份 contract。
|
|
11
|
+
- 不包含服务端业务实现,也不加载私有配置。
|
|
12
|
+
|
|
13
|
+
## 使用入门
|
|
14
|
+
|
|
15
|
+
### 包含内容
|
|
6
16
|
|
|
7
17
|
- `app-contract.ts`:应用级接口定义,业务 path 与一次性输出 Schema 就近内联
|
|
8
18
|
- `app-schemas.ts`:跨接口、跨层复用的输入/数据 Zod Schema
|
|
@@ -10,9 +20,20 @@
|
|
|
10
20
|
|
|
11
21
|
API 前缀、健康检查与跨端 Header 等传输配置位于 service 的 `config/_serv.yml`。
|
|
12
22
|
|
|
13
|
-
|
|
23
|
+
### 常用命令
|
|
14
24
|
|
|
15
25
|
```bash
|
|
16
26
|
pnpm --filter {{api.contractPackageName}} build
|
|
17
27
|
pnpm --filter {{api.contractPackageName}} test
|
|
18
28
|
```
|
|
29
|
+
|
|
30
|
+
## 开发测试
|
|
31
|
+
|
|
32
|
+
```sh
|
|
33
|
+
pnpm --filter {{api.contractPackageName}} typecheck
|
|
34
|
+
pnpm --filter {{api.contractPackageName}} test
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 许可证
|
|
38
|
+
|
|
39
|
+
Apache-2.0
|
|
@@ -1,21 +1,31 @@
|
|
|
1
1
|
# {{api.servicePackageName}}
|
|
2
2
|
|
|
3
|
+
## 简介
|
|
4
|
+
|
|
3
5
|
{{projectName}} API service 包,负责模块初始化、procedure 装配与 HTTP 入口。
|
|
4
6
|
|
|
5
|
-
##
|
|
7
|
+
## 核心功能清单
|
|
8
|
+
|
|
9
|
+
- 初始化所选框架模块,装配共享接口并提供 HTTP 服务。
|
|
10
|
+
- 配置、健康检查和应用 procedures 各有明确入口。
|
|
11
|
+
- 从工程根构建镜像,支持自动发布与离线包。
|
|
12
|
+
|
|
13
|
+
## 使用入门
|
|
14
|
+
|
|
15
|
+
### 常用命令
|
|
6
16
|
|
|
7
17
|
```bash
|
|
8
18
|
pnpm --filter {{api.servicePackageName}} dev
|
|
9
19
|
pnpm --filter {{api.servicePackageName}} test
|
|
10
20
|
```
|
|
11
21
|
|
|
12
|
-
|
|
22
|
+
### 容器运行
|
|
23
|
+
|
|
13
24
|
|
|
14
|
-
从工程根运行 `pnpm build --target docker` 构建并导出镜像,再运行 `pnpm deploy --env test`。deploy 只消费已构建镜像;含 Web 时一并发布 API/Web。网络不通用 `pnpm deploy --env prod --bundle-only`,按输出说明手工搬运 tar。
|
|
15
25
|
- 配置默认打包自本目录 `config/`,可在运行时只读挂载到 `/app/config`,敏感值通过环境变量注入。
|
|
16
|
-
从工程根运行 `pnpm build --target docker` 构建并导出镜像,再运行 `pnpm deploy --env test`。deploy 只消费已构建镜像;含 Web 时一并发布 API/Web。网络不通用 `pnpm deploy --env prod --bundle-only`,按输出说明手工搬运 tar。
|
|
17
26
|
|
|
18
|
-
|
|
27
|
+
|
|
28
|
+
### 关键目录
|
|
19
29
|
|
|
20
30
|
- `config/`:service 配置
|
|
21
31
|
- `src/app.ts`:HTTP App 装配
|
|
@@ -23,9 +33,9 @@ pnpm --filter {{api.servicePackageName}} test
|
|
|
23
33
|
- `src/server/procedures/`:应用级 procedures
|
|
24
34
|
|
|
25
35
|
{{#if features.iam}}
|
|
26
|
-
|
|
36
|
+
### IAM 认证配置
|
|
27
37
|
|
|
28
|
-
服务端 `config/_iam.yml` 统一控制登录、注册、重置、协议与 `ui` 品牌。邮件/短信可用 `_reach.yml` 中的 Provider/标准模板或自定义发送回调。客户端可通过安全公开配置和框架认证动作接入 `AuthPanel
|
|
38
|
+
服务端 `config/_iam.yml` 统一控制登录、注册、重置、协议与 `ui` 品牌。邮件/短信可用 `_reach.yml` 中的 Provider/标准模板或自定义发送回调。客户端可通过安全公开配置和框架认证动作接入 `AuthPanel`。单实例可使用 Memory;多实例需共享数据库与 Redis,并按工程根 README 配置写入路由和传输会话。
|
|
29
39
|
|
|
30
40
|
LDAP/Reach 均可选:基础认证无需安装。默认 LDAP 客户端需在 IAM 服务端 workspace 安装 ldapts,再配置 login.ldap 与连接信息。自定义 onOtpSendEmail/onOtpSendSms/onPasswordResetRequest 回调可独立于 Reach 使用,投递失败须拒绝 Promise。协议在 Modal 显示;LoginForm/RegisterForm 提供 header/extraFields/footer,AuthPanel 透传 loginHeader/loginFields/loginFooter 和 registerHeader/registerFields/registerFooter。配置及例子见生成项目的 hai-iam/hai-ui skills。
|
|
31
41
|
|
|
@@ -33,3 +43,14 @@ LDAP/Reach 均可选:基础认证无需安装。默认 LDAP 客户端需在 IA
|
|
|
33
43
|
|
|
34
44
|
完整契约见生成应用的 `.agents/skills/hai-iam/reference.md`。
|
|
35
45
|
{{/if}}
|
|
46
|
+
|
|
47
|
+
## 开发测试
|
|
48
|
+
|
|
49
|
+
```sh
|
|
50
|
+
pnpm --filter {{api.servicePackageName}} typecheck
|
|
51
|
+
pnpm --filter {{api.servicePackageName}} test
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 许可证
|
|
55
|
+
|
|
56
|
+
Apache-2.0
|
|
@@ -43,8 +43,7 @@
|
|
|
43
43
|
"@h-ai/audit": "{{haiPackageSpecifier}}"{{/if}}{{#if features.cache}},
|
|
44
44
|
"@h-ai/cache": "{{haiPackageSpecifier}}"{{/if}}{{#if features.crypto}},
|
|
45
45
|
"@h-ai/crypto": "{{haiPackageSpecifier}}"{{/if}}{{#if features.datapipe}},
|
|
46
|
-
"@h-ai/datapipe": "{{haiPackageSpecifier}}"{{/if}}{{#if features.
|
|
47
|
-
"@h-ai/deploy": "{{haiPackageSpecifier}}"{{/if}}{{#if features.iam}},
|
|
46
|
+
"@h-ai/datapipe": "{{haiPackageSpecifier}}"{{/if}}{{#if features.iam}},
|
|
48
47
|
"@h-ai/iam": "{{haiPackageSpecifier}}"{{/if}}{{#if features.payment}},
|
|
49
48
|
"@h-ai/payment": "{{haiPackageSpecifier}}"{{/if}}{{#if features.reach}},
|
|
50
49
|
"@h-ai/reach": "{{haiPackageSpecifier}}"{{/if}}{{#if features.db}},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{ "images": [{ "name": "app", "
|
|
1
|
+
{ "images": [{ "name": "app", "dockerfile": "images/app.Dockerfile", "containerPort": 3000 }] }
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
FROM node:24.22.1-bookworm-slim AS build
|
|
2
|
+
ARG SQLITE_PREBUILD_MIRROR=
|
|
3
|
+
ENV npm_config_better_sqlite3_binary_host_mirror=$SQLITE_PREBUILD_MIRROR
|
|
4
|
+
|
|
5
|
+
ENV PNPM_HOME=/pnpm
|
|
6
|
+
ENV PATH=$PNPM_HOME:$PATH
|
|
7
|
+
ENV CI=true
|
|
8
|
+
ENV ONNXRUNTIME_NODE_INSTALL_CUDA=skip
|
|
9
|
+
WORKDIR /workspace
|
|
10
|
+
|
|
11
|
+
RUN corepack enable && corepack prepare pnpm@12.11.2 --activate && pnpm config set store-dir /pnpm/store
|
|
12
|
+
COPY pnpm-lock.yaml pnpm-workspace.yaml ./
|
|
13
|
+
COPY images/dependencies/ ./
|
|
14
|
+
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm fetch --ignore-scripts
|
|
15
|
+
COPY . .
|
|
16
|
+
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm install --offline --frozen-lockfile --ignore-scripts
|
|
17
|
+
RUN pnpm compile
|
|
18
|
+
RUN --mount=type=cache,id={{projectName}}-sqlite,target=/root/.npm/_prebuilds if [ -d node_modules/better-sqlite3 ]; then cd node_modules/better-sqlite3; for attempt in 1 2 3; do node -e "require('node:child_process').execFileSync(process.execPath,[require.resolve('prebuild-install/bin.js'),'--verbose'],{stdio:'inherit'})" && break; [ "$attempt" = 3 ] && exit 1; sleep 3; done; fi
|
|
19
|
+
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store --mount=type=cache,id={{projectName}}-sqlite,target=/root/.npm/_prebuilds pnpm pm deploy --filter {{api.servicePackageName}} --prod /prod/app
|
|
20
|
+
|
|
21
|
+
FROM node:24.22.1-bookworm-slim AS runtime-base
|
|
22
|
+
|
|
23
|
+
ENV NODE_ENV=production
|
|
24
|
+
ENV HOST=0.0.0.0
|
|
25
|
+
ENV PORT=3000
|
|
26
|
+
WORKDIR /app
|
|
27
|
+
|
|
28
|
+
COPY --from=build --chown=node:node /prod/app ./
|
|
29
|
+
RUN mkdir -p /app/data && chown node:node /app/data
|
|
30
|
+
|
|
31
|
+
USER node
|
|
32
|
+
EXPOSE 3000
|
|
33
|
+
HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \
|
|
34
|
+
CMD node -e "fetch('http://127.0.0.1:'+process.env.PORT+'/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"
|
|
35
|
+
CMD ["node", "dist/index.js"]
|
|
@@ -15,7 +15,9 @@
|
|
|
15
15
|
"dev:prod": "pnpm --filter {{api.servicePackageName}} dev:prod",
|
|
16
16
|
"compile": "pnpm --filter {{api.contractPackageName}} build && pnpm -r --if-present build",
|
|
17
17
|
"build": "hai build",
|
|
18
|
+
{{#if features.deploy}}
|
|
18
19
|
"deploy": "hai deploy apps/{{projectName}}-service",
|
|
20
|
+
{{/if}}
|
|
19
21
|
"check": "pnpm typecheck",
|
|
20
22
|
"typecheck": "pnpm --filter {{api.contractPackageName}} build && pnpm -r --if-present typecheck",
|
|
21
23
|
"lint": "eslint *.js *.ts e2e && pnpm -r --if-present lint",
|
|
@@ -30,6 +32,9 @@
|
|
|
30
32
|
"{{api.contractPackageName}}": "workspace:*"
|
|
31
33
|
},
|
|
32
34
|
"devDependencies": {
|
|
35
|
+
{{#if features.deploy}}
|
|
36
|
+
"@h-ai/deploy": "{{haiPackageSpecifier}}",
|
|
37
|
+
{{/if}}
|
|
33
38
|
"@h-ai/cli": "{{haiPackageSpecifier}}",
|
|
34
39
|
"@h-ai/api-client": "{{haiPackageSpecifier}}",
|
|
35
40
|
{{#if features.crypto}}
|
|
@@ -1,18 +1,23 @@
|
|
|
1
|
-
|
|
1
|
+
**/.git
|
|
2
|
+
**/node_modules
|
|
3
|
+
**/.pnpm-store
|
|
4
|
+
**/.cache
|
|
5
|
+
**/.svelte-kit
|
|
6
|
+
**/.turbo
|
|
7
|
+
**/build
|
|
8
|
+
**/dist
|
|
9
|
+
**/coverage
|
|
10
|
+
**/playwright-report
|
|
11
|
+
**/test-results
|
|
12
|
+
**/src-tauri/target
|
|
13
|
+
**/hash-core/target
|
|
14
|
+
tmp
|
|
2
15
|
**/*.tar
|
|
3
|
-
Dockerfile
|
|
4
16
|
.github
|
|
5
17
|
.agents
|
|
6
18
|
.claude
|
|
7
19
|
.codex
|
|
8
20
|
.opencode
|
|
9
|
-
.turbo
|
|
10
|
-
**/build
|
|
11
|
-
**/dist
|
|
12
|
-
**/node_modules
|
|
13
|
-
node_modules
|
|
14
|
-
playwright-report
|
|
15
|
-
test-results
|
|
16
21
|
**/data
|
|
17
22
|
*.log
|
|
18
23
|
# 仅保留公共基础 .env;分环境配置、私有覆盖及已有交付包不进入构建上下文。
|
|
@@ -2,9 +2,19 @@
|
|
|
2
2
|
{{#if fullstack.frontends.app}}
|
|
3
3
|
# {{projectName}}-app
|
|
4
4
|
|
|
5
|
+
## 简介
|
|
6
|
+
|
|
5
7
|
App/H5 前端工程,复用 shared 的响应式 mini 后台,使用 Svelte 5 + Vite + Capacitor,可输出 Web 预览并同步 Android / iOS 原生工程。
|
|
6
8
|
|
|
7
|
-
##
|
|
9
|
+
## 核心功能清单
|
|
10
|
+
|
|
11
|
+
- 响应式 H5 页面与 Capacitor Android/iOS 原生壳。
|
|
12
|
+
- 共享管理界面、个人设置和接口客户端。
|
|
13
|
+
- 原生使用安全 TokenStorage,浏览器预览使用 Cookie 刷新。
|
|
14
|
+
|
|
15
|
+
## 使用入门
|
|
16
|
+
|
|
17
|
+
### i18n 与 shared 协同
|
|
8
18
|
|
|
9
19
|
- 本端页面文案:`messages/{locale}.json` + `project.inlang/settings.json`
|
|
10
20
|
- 共享 Shell/主题/语言/API:`packages/{{fullstack.sharedPackageName}}`
|
|
@@ -13,7 +23,7 @@ App/H5 前端工程,复用 shared 的响应式 mini 后台,使用 Svelte 5 +
|
|
|
13
23
|
|
|
14
24
|
自定义建议:移动端独有引导、运营位、按钮文案放在本目录 `messages/`;跨端通用组件放到 shared。
|
|
15
25
|
|
|
16
|
-
|
|
26
|
+
### 编译、打包与部署
|
|
17
27
|
|
|
18
28
|
```bash
|
|
19
29
|
# 开发预览,默认端口 {{fullstack.ports.app}}
|
|
@@ -31,15 +41,23 @@ pnpm --filter {{projectName}}-app cap:build:android:release
|
|
|
31
41
|
pnpm --filter {{projectName}}-app cap:build:ios
|
|
32
42
|
```
|
|
33
43
|
|
|
34
|
-
|
|
44
|
+
本地开发通过根 `.env` 的 `PUBLIC_API_BASE` 配置代理。原生打包前,在本端 `public/runtime-config.js` 中设置 `globalThis.__HAI_PUBLIC_CONFIG__ = { apiBase: 'https://api.example.com/api/v1' }`,再编译并同步原生工程;这里只能放公开地址,不能放密钥。Android 模拟器访问宿主机通常使用 `http://10.0.2.2:3000/api/v1`。
|
|
35
45
|
|
|
36
|
-
|
|
46
|
+
### IAM 认证配置
|
|
37
47
|
|
|
38
|
-
服务端 `config/_iam.yml` 统一控制登录、注册、重置、协议与 `ui` 品牌。邮件/短信可用 `_reach.yml` 中的 Provider/标准模板或自定义发送回调。`AuthPanel` 使用安全公开配置及框架认证动作;无需在页面适配 Token
|
|
48
|
+
服务端 `config/_iam.yml` 统一控制登录、注册、重置、协议与 `ui` 品牌。邮件/短信可用 `_reach.yml` 中的 Provider/标准模板或自定义发送回调。`AuthPanel` 使用安全公开配置及框架认证动作;无需在页面适配 Token、验证码倒计时和错误提示。单实例可使用 Memory;多实例需共享数据库与 Redis,并按工程根 README 配置写入路由和传输会话。
|
|
39
49
|
|
|
40
50
|
LDAP/Reach 均可选:基础认证无需安装。默认 LDAP 客户端需在 IAM 服务端 workspace 安装 ldapts,再配置 login.ldap 与连接信息。自定义 onOtpSendEmail/onOtpSendSms/onPasswordResetRequest 回调可独立于 Reach 使用,投递失败须拒绝 Promise。协议在 Modal 显示;LoginForm/RegisterForm 提供 header/extraFields/footer,AuthPanel 透传 loginHeader/loginFields/loginFooter 和 registerHeader/registerFields/registerFooter。配置及例子见生成项目的 hai-iam/hai-ui skills。
|
|
41
51
|
|
|
42
52
|
协议支持配置中的 userAgreementMarkdown/privacyPolicyMarkdown 正文及 URL;同主题优先 Markdown,由安全渲染器在弹窗显示。
|
|
43
53
|
|
|
44
54
|
完整契约见生成应用的 `.agents/skills/hai-iam/reference.md`。
|
|
55
|
+
|
|
56
|
+
## 开发测试
|
|
57
|
+
|
|
58
|
+
从工程根执行 `pnpm typecheck`、`pnpm lint`、`pnpm build`、`pnpm test` 和 `pnpm test:e2e`。浏览器预览通过后,原生壳仍需在对应系统或设备单独验收。
|
|
59
|
+
|
|
60
|
+
## 许可证
|
|
61
|
+
|
|
62
|
+
Apache-2.0
|
|
45
63
|
{{/if}}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
<meta charset="UTF-8" />
|
|
7
7
|
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
|
8
8
|
<meta name="theme-color" content="#2563eb" />
|
|
9
|
+
<script src="/runtime-config.js"></script>
|
|
9
10
|
<title>{{html fullstack.appName}}</title>
|
|
10
11
|
<link
|
|
11
12
|
rel="icon"
|
|
@@ -51,7 +51,7 @@ export default defineConfig(({ mode, command }) => {
|
|
|
51
51
|
},
|
|
52
52
|
envPrefix: ['VITE_', 'PUBLIC_'],
|
|
53
53
|
ssr: {
|
|
54
|
-
noExternal: [
|
|
54
|
+
noExternal: ['@h-ai/ui', /{{fullstack.sharedPackageName}}/],
|
|
55
55
|
},
|
|
56
56
|
test: {
|
|
57
57
|
environment: 'node',
|