@h-ai/cli 0.1.0-alpha.57 → 0.1.0-alpha.58
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 +37 -3
- package/README.ja.md +37 -3
- package/README.md +37 -3
- package/dist/chunk-2H7UOFLK.js +0 -0
- package/dist/{chunk-MJGUBOAV.js → chunk-F4IBPVZ5.js} +6 -42
- package/dist/chunk-F4IBPVZ5.js.map +1 -0
- package/dist/{chunk-O3ANVICQ.js → chunk-WUSFJFW5.js} +13 -7
- package/dist/chunk-WUSFJFW5.js.map +1 -0
- package/dist/cli-config-templates-6XA7V6CC.js +5 -0
- package/dist/{cli-config-templates-OWBEGBZQ.js.map → cli-config-templates-6XA7V6CC.js.map} +1 -1
- package/dist/{cli-skill-templates-ZYXES3NT.js → cli-skill-templates-45CK4RQ2.js} +3 -3
- package/dist/{cli-skill-templates-ZYXES3NT.js.map → cli-skill-templates-45CK4RQ2.js.map} +1 -1
- package/dist/index.js +107 -61
- package/dist/index.js.map +1 -1
- package/dist/{src-TBIET7YU.js → src-DUGLX4YB.js} +7270 -2119
- package/dist/src-DUGLX4YB.js.map +1 -0
- package/package.json +17 -17
- package/templates/README.md +4 -4
- package/templates/apps/admin/src/routes/+layout.svelte.hbs +7 -0
- package/templates/apps/admin/src/routes/+page.svelte.hbs +5 -4
- package/templates/apps/admin/src/routes/admin/+layout.svelte.hbs +2 -2
- package/templates/apps/api/.npmrc.hbs +1 -2
- package/templates/apps/api/Dockerfile.hbs +6 -5
- package/templates/apps/api/apps/{{projectName}}-contract/package.json.hbs +1 -1
- package/templates/apps/api/apps/{{projectName}}-contract/src/app-schemas.ts.hbs +2 -0
- package/templates/apps/api/apps/{{projectName}}-contract/tsup.config.ts.hbs +1 -1
- package/templates/apps/api/apps/{{projectName}}-service/config/_core.yml.hbs +8 -0
- package/templates/apps/api/apps/{{projectName}}-service/package.json.hbs +1 -1
- package/templates/apps/api/apps/{{projectName}}-service/src/app.ts.hbs +7 -8
- package/templates/apps/api/apps/{{projectName}}-service/src/index.ts.hbs +4 -3
- package/templates/apps/api/apps/{{projectName}}-service/src/lib/server/init.ts.hbs +0 -1
- package/templates/apps/api/apps/{{projectName}}-service/src/server/procedures/app-procedures.ts.hbs +4 -0
- package/templates/apps/api/apps/{{projectName}}-service/tests/service.test.ts.hbs +3 -1
- package/templates/apps/api/e2e/api-service.spec.ts.hbs +3 -1
- package/templates/apps/api/package.json.hbs +2 -2
- package/templates/apps/api/pnpm-workspace.yaml.hbs +26 -0
- package/templates/apps/api/tsconfig.base.json +0 -1
- package/templates/apps/fullstack/.dockerignore.hbs +3 -0
- package/templates/apps/fullstack/.npmrc.hbs +1 -2
- package/templates/apps/fullstack/Dockerfile.hbs +6 -5
- package/templates/apps/fullstack/apps/{{projectName}}-app/README.md.hbs +2 -2
- package/templates/apps/fullstack/apps/{{projectName}}-app/capacitor.config.ts.hbs +1 -1
- package/templates/apps/fullstack/apps/{{projectName}}-app/index.html.hbs +7 -2
- package/templates/apps/fullstack/apps/{{projectName}}-app/messages/en-US.json.hbs +1 -34
- package/templates/apps/fullstack/apps/{{projectName}}-app/messages/zh-CN.json.hbs +1 -34
- package/templates/apps/fullstack/apps/{{projectName}}-app/package.json.hbs +2 -2
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/App.svelte.hbs +30 -170
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.d.ts.hbs +1 -1
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/lib/capacitor.ts.hbs +6 -5
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/main.ts.hbs +1 -1
- package/templates/apps/fullstack/apps/{{projectName}}-app/vite.config.ts.hbs +48 -22
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/README.md.hbs +3 -1
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/index.html.hbs +6 -1
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/en-US.json.hbs +1 -28
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/zh-CN.json.hbs +1 -28
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/package.json.hbs +5 -4
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/App.svelte.hbs +10 -141
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/Cargo.toml.hbs +5 -5
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/tauri.conf.json.hbs +3 -3
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/vite.config.ts.hbs +21 -2
- package/templates/apps/fullstack/apps/{{projectName}}-web/README.md.hbs +2 -2
- package/templates/apps/fullstack/apps/{{projectName}}-web/index.html.hbs +6 -1
- package/templates/apps/fullstack/apps/{{projectName}}-web/messages/en-US.json.hbs +1 -28
- package/templates/apps/fullstack/apps/{{projectName}}-web/messages/zh-CN.json.hbs +1 -28
- package/templates/apps/fullstack/apps/{{projectName}}-web/package.json.hbs +2 -2
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/App.svelte.hbs +5 -143
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/app.d.ts.hbs +1 -1
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/main.ts.hbs +1 -1
- package/templates/apps/fullstack/apps/{{projectName}}-web/vite.config.ts.hbs +48 -22
- package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +206 -16
- package/templates/apps/fullstack/package.json.hbs +2 -2
- package/templates/apps/fullstack/packages/{{projectName}}-contract/README.md.hbs +2 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/package.json.hbs +1 -1
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-contract.ts.hbs +66 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-schemas.ts.hbs +96 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/app-schemas.ts.hbs +3 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/index.ts.hbs +3 -1
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +5 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/tests/contract.test.ts.hbs +3 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/tsup.config.ts.hbs +1 -1
- package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +13 -3
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_audit.yml.hbs +3 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_cache.yml.hbs +2 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_core.yml.hbs +10 -3
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_db.yml.hbs +3 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_iam.yml.hbs +21 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_serv.yml.hbs +10 -3
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_storage.yml.hbs +3 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +10 -3
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/app-server.ts.hbs +63 -28
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/index.ts.hbs +26 -11
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/admin-service.ts.hbs +276 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/messages.ts.hbs +29 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/admin-procedures.ts.hbs +94 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/app-procedures.ts.hbs +6 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/index.ts.hbs +5 -1
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/runtime.ts.hbs +98 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/app-server.test.ts.hbs +446 -33
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/runtime.test.ts.hbs +48 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tsup.config.ts.hbs +1 -1
- package/templates/apps/fullstack/packages/{{projectName}}-shared/README.md.hbs +19 -26
- package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/en-US.json.hbs +78 -15
- package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/zh-CN.json.hbs +78 -15
- package/templates/apps/fullstack/packages/{{projectName}}-shared/package.json.hbs +4 -1
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/index.ts.hbs +3 -4
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/api-client.ts.hbs +53 -27
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AdminWorkspace.svelte.hbs +73 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AppShell.svelte.hbs +55 -45
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AuditManagement.svelte.hbs +61 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/ProfileSettings.svelte.hbs +57 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/RoleManagement.svelte.hbs +49 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/UserManagement.svelte.hbs +174 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/management-store.svelte.ts.hbs +399 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/theme-store.svelte.ts.hbs +7 -39
- package/templates/apps/fullstack/packages/{{projectName}}-shared/svelte.config.js.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/api-client.test.ts.hbs +151 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/management-store.test.ts.hbs +101 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/vitest.config.ts.hbs +7 -0
- package/templates/apps/fullstack/playwright.config.ts.hbs +6 -0
- package/templates/apps/fullstack/pnpm-workspace.yaml.hbs +24 -0
- package/templates/apps/fullstack/tsconfig.base.json +0 -1
- package/templates/apps/h5/src/routes/+layout.svelte.hbs +4 -0
- package/templates/apps/h5/src/routes/+page.svelte.hbs +3 -2
- package/templates/apps/mobile-app/index.html.hbs +2 -2
- package/templates/apps/mobile-app/src/App.svelte.hbs +6 -2
- package/templates/apps/mobile-app/src/lib/app-config.ts.hbs +13 -0
- package/templates/apps/website/src/routes/+layout.svelte.hbs +8 -2
- package/templates/apps/website/src/routes/+page.svelte.hbs +4 -3
- package/templates/base/.npmrc.hbs +1 -15
- package/templates/base/Dockerfile.hbs +9 -8
- package/templates/base/e2e/app.spec.ts.hbs +1 -0
- package/templates/base/package.json.hbs +39 -42
- package/templates/base/pnpm-workspace.yaml.hbs +26 -0
- package/templates/base/src/app.d.ts.hbs +4 -0
- package/templates/base/src/hooks.server.ts.hbs +0 -8
- package/templates/base/src/lib/server/init.ts.hbs +26 -5
- package/templates/base/src/routes/+layout.server.ts.hbs +18 -0
- package/templates/base/tests/scaffold.test.ts.hbs +21 -1
- package/templates/base/vite.config.ts.hbs +21 -0
- package/templates/features/ai/routes/api/chat/+server.ts +6 -7
- package/templates/features/iam/routes-admin/(auth)/auth/login/+page.svelte.hbs +1 -1
- package/templates/features/iam/routes-h5/auth/login/+page.svelte.hbs +1 -1
- package/templates/features/iam/routes-shared/api/auth/login/+server.ts +14 -10
- package/templates/features/iam/routes-shared/api/auth/logout/+server.ts +6 -4
- package/templates/features/storage/routes/api/upload/+server.ts +10 -8
- package/templates/skills/CLAUDE.md +0 -14
- package/templates/skills/bridges/fullstack/AGENTS.md.hbs +13 -2
- package/templates/skills/bridges/fullstack/copilot-instructions.md.hbs +3 -0
- package/templates/skills/hai-api-client/SKILL.md +1 -1
- package/templates/skills/hai-app-create/development.md +6 -0
- package/templates/skills/hai-build/reference.md +4 -2
- package/templates/skills/hai-core/SKILL.md +2 -0
- package/templates/skills/hai-core/reference.md +6 -4
- package/templates/skills/hai-framework-sync/SKILL.md +1 -2
- package/templates/skills/hai-serv/SKILL.md +1 -0
- package/templates/skills/hai-serv/reference.md +3 -1
- package/templates/skills/hai-ui/SKILL.md +6 -0
- package/templates/skills/hai-ui/reference.md +7 -4
- package/templates/skills/hai-vecdb/reference.md +53 -49
- package/dist/chunk-MJGUBOAV.js.map +0 -1
- package/dist/chunk-O3ANVICQ.js.map +0 -1
- package/dist/cli-config-templates-OWBEGBZQ.js +0 -5
- package/dist/src-TBIET7YU.js.map +0 -1
- package/templates/apps/fullstack/apps/{{projectName}}-app/tests/api.test.ts.hbs +0 -28
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/tests/api.test.ts.hbs +0 -28
- package/templates/apps/fullstack/apps/{{projectName}}-web/tests/api.test.ts.hbs +0 -55
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/LanguageSwitcher.svelte.hbs +0 -27
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/ThemeSwitcher.svelte.hbs +0 -18
- package/templates/skills/bridges/admin/CLAUDE.md +0 -15
- package/templates/skills/bridges/api/CLAUDE.md +0 -15
- package/templates/skills/bridges/fullstack/CLAUDE.md.hbs +0 -9
- package/templates/skills/bridges/h5/CLAUDE.md +0 -15
- package/templates/skills/bridges/mobile-app/CLAUDE.md +0 -15
- package/templates/skills/bridges/website/CLAUDE.md +0 -15
- package/templates/skills/claude-skill.md.hbs +0 -7
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.58",
|
|
5
5
|
"description": "Hai Framework CLI for project scaffolding and code generation.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"keywords": [
|
|
@@ -27,36 +27,36 @@
|
|
|
27
27
|
"access": "public"
|
|
28
28
|
},
|
|
29
29
|
"engines": {
|
|
30
|
-
"node": "
|
|
30
|
+
"node": "^22.22.2 || ^24.15.0 || >=26.0.0"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
33
|
+
"@h-ai/core": "0.1.0-alpha.58",
|
|
34
|
+
"cac": "^7.0.1",
|
|
35
|
+
"chalk": "^6.0.1",
|
|
36
|
+
"fs-extra": "^11.4.1",
|
|
37
|
+
"handlebars": "^4.7.10",
|
|
38
|
+
"ora": "^9.4.1",
|
|
38
39
|
"prompts": "^2.4.2",
|
|
39
|
-
"yaml": "^2.
|
|
40
|
-
"@h-ai/core": "0.1.0-alpha.57"
|
|
40
|
+
"yaml": "^2.9.1"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
+
"@h-ai/cache": "0.1.0-alpha.58",
|
|
44
|
+
"@h-ai/deploy": "0.1.0-alpha.58",
|
|
45
|
+
"@h-ai/reach": "0.1.0-alpha.58",
|
|
46
|
+
"@h-ai/reldb": "0.1.0-alpha.58",
|
|
47
|
+
"@h-ai/storage": "0.1.0-alpha.58",
|
|
43
48
|
"@types/fs-extra": "^11.0.4",
|
|
44
|
-
"@types/node": "^
|
|
49
|
+
"@types/node": "^26.6.5",
|
|
45
50
|
"@types/prompts": "^2.4.9",
|
|
46
51
|
"rimraf": "^6.1.3",
|
|
47
52
|
"tsup": "^8.5.1",
|
|
48
53
|
"typescript": "^6.0.3",
|
|
49
|
-
"vitest": "^4.1.
|
|
50
|
-
"@h-ai/cache": "0.1.0-alpha.57",
|
|
51
|
-
"@h-ai/reldb": "0.1.0-alpha.57",
|
|
52
|
-
"@h-ai/deploy": "0.1.0-alpha.57",
|
|
53
|
-
"@h-ai/reach": "0.1.0-alpha.57",
|
|
54
|
-
"@h-ai/storage": "0.1.0-alpha.57"
|
|
54
|
+
"vitest": "^4.1.11"
|
|
55
55
|
},
|
|
56
56
|
"scripts": {
|
|
57
57
|
"build": "tsup",
|
|
58
58
|
"dev": "tsup --watch",
|
|
59
|
-
"typecheck": "
|
|
59
|
+
"typecheck": "node ../../scripts/typecheck.mjs --noEmit",
|
|
60
60
|
"lint": "eslint .",
|
|
61
61
|
"lint:fix": "eslint . --fix",
|
|
62
62
|
"test": "vitest run",
|
package/templates/README.md
CHANGED
|
@@ -57,7 +57,7 @@ templates/
|
|
|
57
57
|
│ └── settings.json # Paraglide 项目配置
|
|
58
58
|
│
|
|
59
59
|
└── skills/ # AI Skill 与各 appType 桥接指引
|
|
60
|
-
└── bridges/ # admin / api / website / h5 / mobile-app / fullstack 专属 AGENTS/Copilot
|
|
60
|
+
└── bridges/ # admin / api / website / h5 / mobile-app / fullstack 专属 AGENTS/Copilot
|
|
61
61
|
```
|
|
62
62
|
|
|
63
63
|
## AI Skill 模板(Single Source of Truth)
|
|
@@ -66,12 +66,12 @@ templates/
|
|
|
66
66
|
|
|
67
67
|
- `hai create` 会把 `templates/skills/` 下所有 `hai-*` Skill 目录复制到 `.agents/skills/<skill>/`,再按 appType 排除互斥项(例如 fullstack 不复制 `hai-kit`;admin / website / h5 不复制 `hai-serv`、`hai-api-contract`、`hai-api-client`、`hai-capacitor`;mobile-app 不复制 `hai-core`、`hai-kit`、`hai-serv`、`hai-api-contract`)
|
|
68
68
|
- `bridges/<appType>/copilot-instructions.md` 会复制到 `.github/copilot-instructions.md`;没有专属文件时回退到通用桥接文件
|
|
69
|
-
- `bridges/<appType>/AGENTS.md
|
|
69
|
+
- `bridges/<appType>/AGENTS.md` 会复制到项目根目录,确保不同样板工程使用自己的 AI 指引;通用 `CLAUDE.md` 仅包含 `@AGENTS.md`
|
|
70
70
|
- `opencode.json` 会复制到项目根目录
|
|
71
71
|
- `templates/skills/AGENTS.md`、`CLAUDE.md`、`copilot-instructions.md` 与 `opencode.json` 不是多余副本:它们是 generic fallback,主要服务于缺少 appType 上下文时的桥接复制与 `hai add` 回填 AI 支持
|
|
72
72
|
- `opencode.json` 使用 OpenCode 的 `instructions` 配置复用 `.github/copilot-instructions.md`;`.agents/skills/` 由 OpenCode 原生发现,不再写入过期的 `skills.paths`
|
|
73
|
-
- `CLAUDE.md`
|
|
74
|
-
- `hai add` 只补齐缺失的 AI 支持文件,不覆盖用户已自定义的桥接文件,也不会自动删除遗留的 `.github/skills/`
|
|
73
|
+
- `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)
|
|
74
|
+
- `hai add` / `hai init` 只补齐缺失的 AI 支持文件,不覆盖用户已自定义的桥接文件,也不会自动删除遗留的 `.github/skills/` 或 `.claude/`
|
|
75
75
|
|
|
76
76
|
## 文件类型说明
|
|
77
77
|
|
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
import type { Snippet } from 'svelte'
|
|
7
7
|
{{#if hasI18n}}
|
|
8
8
|
import { browser } from '$app/environment'
|
|
9
|
+
{{/if}}
|
|
10
|
+
import { page } from '$app/state'
|
|
11
|
+
{{#if hasI18n}}
|
|
9
12
|
import { getLocale } from '$lib/paraglide/runtime.js'
|
|
10
13
|
import { setGlobalLocale } from '@h-ai/ui'
|
|
11
14
|
{{/if}}
|
|
@@ -25,6 +28,10 @@
|
|
|
25
28
|
{{/if}}
|
|
26
29
|
</script>
|
|
27
30
|
|
|
31
|
+
<svelte:head>
|
|
32
|
+
<title>{page.data.appConfig.name}</title>
|
|
33
|
+
</svelte:head>
|
|
34
|
+
|
|
28
35
|
<div class='min-h-screen bg-base-200'>
|
|
29
36
|
{@render children()}
|
|
30
37
|
</div>
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* 管理后台首页 — 入口导航
|
|
5
5
|
*/
|
|
6
6
|
import { resolve } from '$app/paths'
|
|
7
|
+
import { page } from '$app/state'
|
|
7
8
|
{{#if hasI18n}}
|
|
8
9
|
import * as m from '$lib/paraglide/messages'
|
|
9
10
|
{{/if}}
|
|
@@ -12,9 +13,9 @@
|
|
|
12
13
|
|
|
13
14
|
<svelte:head>
|
|
14
15
|
{{#if hasI18n}}
|
|
15
|
-
<title>{
|
|
16
|
+
<title>{page.data.appConfig.name}</title>
|
|
16
17
|
{{else}}
|
|
17
|
-
<title
|
|
18
|
+
<title>{page.data.appConfig.name}</title>
|
|
18
19
|
{{/if}}
|
|
19
20
|
</svelte:head>
|
|
20
21
|
|
|
@@ -27,7 +28,7 @@
|
|
|
27
28
|
{m.page_home_badge()}
|
|
28
29
|
</Badge>
|
|
29
30
|
</div>
|
|
30
|
-
<h1 class='mt-4 text-4xl font-black tracking-tight'>{
|
|
31
|
+
<h1 class='mt-4 text-4xl font-black tracking-tight'>{page.data.appConfig.name}</h1>
|
|
31
32
|
<p class='mt-3 text-base-content/60'>{m.page_home_subtitle()}</p>
|
|
32
33
|
<div class='mt-8 flex flex-wrap gap-3 justify-center'>
|
|
33
34
|
<a href={resolve('/admin', {})} class='btn btn-primary'>
|
|
@@ -42,7 +43,7 @@
|
|
|
42
43
|
由 hai 驱动
|
|
43
44
|
</Badge>
|
|
44
45
|
</div>
|
|
45
|
-
<h1 class='mt-4 text-4xl font-black tracking-tight'
|
|
46
|
+
<h1 class='mt-4 text-4xl font-black tracking-tight'>{page.data.appConfig.name}</h1>
|
|
46
47
|
<p class='mt-3 text-base-content/60'>基于 hai Agent Framework 构建</p>
|
|
47
48
|
<div class='mt-8 flex flex-wrap gap-3 justify-center'>
|
|
48
49
|
<a href={resolve('/admin', {})} class='btn btn-primary'>
|
|
@@ -41,9 +41,9 @@
|
|
|
41
41
|
<div class='flex items-center gap-2 px-2 mb-6 text-xl font-bold'>
|
|
42
42
|
<span class='icon-[tabler--cube] size-6 text-primary'></span>
|
|
43
43
|
{{#if hasI18n}}
|
|
44
|
-
{
|
|
44
|
+
{page.data.appConfig.name}
|
|
45
45
|
{{else}}
|
|
46
|
-
|
|
46
|
+
{page.data.appConfig.name}
|
|
47
47
|
{{/if}}
|
|
48
48
|
</div>
|
|
49
49
|
<ul class='gap-1'>
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
shamefully-hoist=true
|
|
1
|
+
# 注册表与认证可配置在此;pnpm 专属设置统一位于 pnpm-workspace.yaml。
|
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
# syntax=docker/dockerfile:1.7
|
|
2
|
-
FROM node:
|
|
2
|
+
FROM node:24-bookworm-slim AS build
|
|
3
3
|
|
|
4
4
|
ENV PNPM_HOME=/pnpm
|
|
5
5
|
ENV PATH=$PNPM_HOME:$PATH
|
|
6
6
|
ENV CI=true
|
|
7
7
|
WORKDIR /workspace
|
|
8
8
|
|
|
9
|
-
RUN corepack enable && corepack prepare pnpm@
|
|
9
|
+
RUN corepack enable && corepack prepare pnpm@12.11.2 --activate
|
|
10
10
|
COPY pnpm-lock.yaml pnpm-workspace.yaml ./
|
|
11
|
-
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm fetch
|
|
11
|
+
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm fetch
|
|
12
12
|
COPY . .
|
|
13
13
|
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm install --offline --frozen-lockfile --ignore-scripts
|
|
14
14
|
RUN pnpm build
|
|
15
|
-
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm --filter {{api.servicePackageName}} --prod
|
|
15
|
+
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm pm deploy --filter {{api.servicePackageName}} --prod /prod/app
|
|
16
16
|
|
|
17
|
-
FROM node:
|
|
17
|
+
FROM node:24-bookworm-slim AS runtime-base
|
|
18
18
|
|
|
19
19
|
ENV NODE_ENV=production
|
|
20
|
+
ENV HAI_CORE_ENV=production
|
|
20
21
|
ENV HOST=0.0.0.0
|
|
21
22
|
ENV PORT=3000
|
|
22
23
|
WORKDIR /app
|
|
@@ -4,6 +4,8 @@ import { z } from 'zod'
|
|
|
4
4
|
export const AppInfoOutputDataSchema = z.object({
|
|
5
5
|
name: z.string(),
|
|
6
6
|
version: z.string(),
|
|
7
|
+
env: z.enum(['development', 'production', 'test', 'staging']),
|
|
8
|
+
defaultLocale: z.string(),
|
|
7
9
|
uptimeMs: z.number().int().nonnegative(),
|
|
8
10
|
transportEnabled: z.boolean(),
|
|
9
11
|
})
|
|
@@ -7,6 +7,14 @@ version: 0.1.0
|
|
|
7
7
|
env: ${HAI_ENV:development}
|
|
8
8
|
debug: ${HAI_DEBUG:false}
|
|
9
9
|
|
|
10
|
+
logging:
|
|
11
|
+
level: info
|
|
12
|
+
format: json
|
|
13
|
+
redact:
|
|
14
|
+
- password
|
|
15
|
+
- token
|
|
16
|
+
- secret
|
|
17
|
+
|
|
10
18
|
defaultLocale: {{defaultLocale}}
|
|
11
19
|
supportedLocales:
|
|
12
20
|
{{#if_eq defaultLocale 'en-US'}} - en-US
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import type { CoreConfig } from '@h-ai/core'
|
|
1
2
|
import type { ServConfig } from '@h-ai/serv'
|
|
2
3
|
import { core } from '@h-ai/core'
|
|
3
4
|
{{#if features.crypto}}import { crypto } from '@h-ai/crypto'
|
|
4
5
|
{{/if}}{{#if features.iam}}import { iam } from '@h-ai/iam'
|
|
5
6
|
{{/if}}import { serv } from '@h-ai/serv'
|
|
6
7
|
import { {{api.contractExportName}} } from '{{api.contractPackageName}}'
|
|
7
|
-
import pkg from '../package.json' with { type: 'json' }
|
|
8
8
|
import { {{api.serviceProceduresFactoryName}} } from './server/procedures/index.js'
|
|
9
9
|
|
|
10
10
|
const startedAt = Date.now()
|
|
@@ -14,15 +14,12 @@ interface CreateApiServiceAppOptions {
|
|
|
14
14
|
refreshCookie?: 'enabled' | 'disabled'
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
interface AppCoreConfig {
|
|
18
|
-
readonly env?: string
|
|
19
|
-
}
|
|
20
17
|
/** 创建 API Service HTTP 应用。 */
|
|
21
18
|
export function {{api.serviceAppFactoryName}}(_options: CreateApiServiceAppOptions = {}) {
|
|
22
19
|
const servConfig = core.config.getOrThrow<ServConfig>('serv')
|
|
23
|
-
const coreConfig = core.config.
|
|
20
|
+
const coreConfig = core.config.getOrThrow<CoreConfig>('core')
|
|
24
21
|
const security = serv.createRuntimeSecurityPolicy({
|
|
25
|
-
environment: coreConfig
|
|
22
|
+
environment: coreConfig.env,
|
|
26
23
|
corsOrigin: servConfig.cors.origin,
|
|
27
24
|
nativeOrigins: servConfig.cors.nativeOrigins,
|
|
28
25
|
})
|
|
@@ -46,8 +43,10 @@ export function {{api.serviceAppFactoryName}}(_options: CreateApiServiceAppOptio
|
|
|
46
43
|
procedures: {{api.serviceProceduresFactoryName}}({
|
|
47
44
|
app: {
|
|
48
45
|
info: {
|
|
49
|
-
name:
|
|
50
|
-
version:
|
|
46
|
+
name: coreConfig.name,
|
|
47
|
+
version: coreConfig.version,
|
|
48
|
+
env: coreConfig.env,
|
|
49
|
+
defaultLocale: coreConfig.defaultLocale,
|
|
51
50
|
transportEnabled: transport !== undefined,
|
|
52
51
|
},
|
|
53
52
|
startedAt,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { CoreConfig } from '@h-ai/core'
|
|
1
2
|
import type { ServConfig } from '@h-ai/serv'
|
|
2
3
|
import process from 'node:process'
|
|
3
4
|
import { core } from '@h-ai/core'
|
|
@@ -5,10 +6,10 @@ import { serv } from '@h-ai/serv'
|
|
|
5
6
|
import { {{api.serviceAppFactoryName}} } from './app.js'
|
|
6
7
|
import { closeApp, initApp } from './lib/server/init.js'
|
|
7
8
|
|
|
8
|
-
const logger = core.logger.child({ app: '{{api.servicePackageName}}', scope: 'entrypoint' })
|
|
9
|
-
|
|
10
9
|
async function main(): Promise<void> {
|
|
11
10
|
await initApp()
|
|
11
|
+
const config = core.config.getOrThrow<CoreConfig>('core')
|
|
12
|
+
const logger = core.logger.child({ app: config.name, scope: 'entrypoint' })
|
|
12
13
|
|
|
13
14
|
// host/port 来自 config/_serv.yml 的 server(HOST/PORT 环境变量高于配置文件)。
|
|
14
15
|
const { server } = core.config.getOrThrow<ServConfig>('serv')
|
|
@@ -21,6 +22,6 @@ async function main(): Promise<void> {
|
|
|
21
22
|
}
|
|
22
23
|
|
|
23
24
|
main().catch((error: unknown) => {
|
|
24
|
-
logger.error('API service failed to start', { error })
|
|
25
|
+
core.logger.error('API service failed to start', { error })
|
|
25
26
|
process.exitCode = 1
|
|
26
27
|
})
|
package/templates/apps/api/apps/{{projectName}}-service/src/server/procedures/app-procedures.ts.hbs
CHANGED
|
@@ -8,6 +8,8 @@ export interface AppProcedureDeps {
|
|
|
8
8
|
readonly info: {
|
|
9
9
|
readonly name: string
|
|
10
10
|
readonly version: string
|
|
11
|
+
readonly env: AppInfoOutputData['env']
|
|
12
|
+
readonly defaultLocale: string
|
|
11
13
|
readonly transportEnabled: boolean
|
|
12
14
|
}
|
|
13
15
|
readonly startedAt: number
|
|
@@ -22,6 +24,8 @@ export function createAppProcedures(deps: AppProcedureDeps) {
|
|
|
22
24
|
const data: AppInfoOutputData = {
|
|
23
25
|
name: deps.info.name,
|
|
24
26
|
version: deps.info.version,
|
|
27
|
+
env: deps.info.env,
|
|
28
|
+
defaultLocale: deps.info.defaultLocale,
|
|
25
29
|
transportEnabled: deps.info.transportEnabled,
|
|
26
30
|
uptimeMs: Math.max(0, Date.now() - deps.startedAt),
|
|
27
31
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { CoreConfig } from '@h-ai/core'
|
|
1
2
|
import type { ServConfig } from '@h-ai/serv'
|
|
2
3
|
import type { AddressInfo } from 'node:net'
|
|
3
4
|
import { mkdtempSync, rmSync } from 'node:fs'
|
|
@@ -130,7 +131,8 @@ describe('{{api.servicePackageName}}', () => {
|
|
|
130
131
|
|
|
131
132
|
expect(result.success).toBe(true)
|
|
132
133
|
if (result.success) {
|
|
133
|
-
|
|
134
|
+
const config = core.config.getOrThrow<CoreConfig>('core')
|
|
135
|
+
expect(result.data).toMatchObject({ name: config.name, version: config.version, env: config.env, defaultLocale: config.defaultLocale })
|
|
134
136
|
expect(typeof result.data.transportEnabled).toBe('boolean')
|
|
135
137
|
}
|
|
136
138
|
})
|
|
@@ -17,6 +17,8 @@ test('service app.info endpoint returns HaiResult', async ({ request }) => {
|
|
|
17
17
|
|
|
18
18
|
expect(response.status()).toBe(200)
|
|
19
19
|
expect(body.success).toBe(true)
|
|
20
|
-
expect(body.data.name).
|
|
20
|
+
expect(body.data.name).toBe(process.env.HAI_CORE_NAME ?? '{{projectName}} API Service')
|
|
21
|
+
expect(body.data.version).toBe(process.env.HAI_CORE_VERSION ?? '0.1.0')
|
|
22
|
+
expect(body.data.env).toBe(process.env.HAI_CORE_ENV ?? 'development')
|
|
21
23
|
expect(typeof body.data.transportEnabled).toBe('boolean')
|
|
22
24
|
})
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"engines": { "node": "
|
|
2
|
+
"engines": { "node": "^22.22.2 || ^24.15.0 || >=26.0.0" },
|
|
3
3
|
"name": "{{projectName}}",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"version": "0.1.0",
|
|
6
6
|
"private": true,
|
|
7
|
-
"packageManager": "pnpm@
|
|
7
|
+
"packageManager": "pnpm@12.11.2",
|
|
8
8
|
"description": "Typed hai API workspace with separated contract and service packages.",
|
|
9
9
|
"scripts": {
|
|
10
10
|
"dev": "pnpm --filter {{api.servicePackageName}} dev",
|
|
@@ -2,6 +2,32 @@
|
|
|
2
2
|
shellEmulator: true
|
|
3
3
|
|
|
4
4
|
trustPolicy: no-downgrade
|
|
5
|
+
# 上游构建工具仍要求 4.x;4.0.3 tarball 已核对原 lockfile 的 SHA-512。
|
|
6
|
+
trustPolicyExclude:
|
|
7
|
+
- chokidar@4.0.3
|
|
8
|
+
|
|
9
|
+
# pnpm 12 配置;原生依赖仅运行明确列出的安装脚本。
|
|
10
|
+
nodeLinker: hoisted
|
|
11
|
+
allowBuilds:
|
|
12
|
+
cpu-features: true
|
|
13
|
+
onnxruntime-node: true
|
|
14
|
+
protobufjs: true
|
|
15
|
+
ssh2: true
|
|
16
|
+
vue-demi: true
|
|
17
|
+
better-sqlite3: true
|
|
18
|
+
esbuild: true
|
|
19
|
+
core-js: false
|
|
20
|
+
|
|
21
|
+
overrides:
|
|
22
|
+
"@ai-sdk/provider-utils@>=4.0.0 <4.0.33": 4.0.57
|
|
23
|
+
cookie@<0.7.0: 0.7.2
|
|
24
|
+
esbuild@<0.28.1: 0.28.2
|
|
25
|
+
katex@<0.18.2: 0.18.10
|
|
26
|
+
sharp@<0.35.5: 0.35.5
|
|
27
|
+
tinypool@<2.1.2: 2.2.0
|
|
28
|
+
'@qdrant/js-client-rest>undici': 7.30.0
|
|
29
|
+
xcode>uuid: 11.1.1
|
|
30
|
+
"@types/node": "{{versions.nodeTypes}}"
|
|
5
31
|
|
|
6
32
|
packages:
|
|
7
33
|
- apps/*
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
shamefully-hoist=true
|
|
1
|
+
# 注册表与认证可配置在此;pnpm 专属设置统一位于 pnpm-workspace.yaml。
|
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
# syntax=docker/dockerfile:1.7
|
|
2
|
-
FROM node:
|
|
2
|
+
FROM node:24-bookworm-slim AS build
|
|
3
3
|
|
|
4
4
|
ENV PNPM_HOME=/pnpm
|
|
5
5
|
ENV PATH=$PNPM_HOME:$PATH
|
|
6
6
|
ENV CI=true
|
|
7
7
|
WORKDIR /workspace
|
|
8
8
|
|
|
9
|
-
RUN corepack enable && corepack prepare pnpm@
|
|
9
|
+
RUN corepack enable && corepack prepare pnpm@12.11.2 --activate
|
|
10
10
|
COPY pnpm-lock.yaml pnpm-workspace.yaml ./
|
|
11
|
-
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm fetch
|
|
11
|
+
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm fetch
|
|
12
12
|
COPY . .
|
|
13
13
|
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm install --offline --frozen-lockfile --ignore-scripts
|
|
14
14
|
RUN pnpm build
|
|
15
15
|
|
|
16
16
|
FROM build AS service-build
|
|
17
17
|
|
|
18
|
-
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm --filter {{fullstack.servPackageName}} --prod
|
|
18
|
+
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm pm deploy --filter {{fullstack.servPackageName}} --prod /prod/service
|
|
19
19
|
|
|
20
|
-
FROM node:
|
|
20
|
+
FROM node:24-bookworm-slim AS service
|
|
21
21
|
|
|
22
22
|
ENV NODE_ENV=production
|
|
23
|
+
ENV HAI_CORE_ENV=production
|
|
23
24
|
ENV HOST=0.0.0.0
|
|
24
25
|
ENV PORT=3000
|
|
25
26
|
WORKDIR /app
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
{{#if fullstack.frontends.app}}
|
|
3
3
|
# {{projectName}}-app
|
|
4
4
|
|
|
5
|
-
App/H5
|
|
5
|
+
App/H5 前端工程,复用 shared 的响应式 mini 后台,使用 Svelte 5 + Vite + Capacitor,可输出 Web 预览并同步 Android / iOS 原生工程。
|
|
6
6
|
|
|
7
7
|
## i18n 与 shared 协同
|
|
8
8
|
|
|
9
9
|
- 本端页面文案:`messages/{locale}.json` + `project.inlang/settings.json`
|
|
10
10
|
- 共享 Shell/主题/语言/API:`packages/{{fullstack.sharedPackageName}}`
|
|
11
11
|
- 语言切换通过 shared runtime 与本端 `src/lib/paraglide/runtime.js` 同步。
|
|
12
|
-
-
|
|
12
|
+
- 个人设置提供头像、语言、风格与改密,管理员可打开用户、角色与审计日志页面。原生端使用 Capacitor 安全 TokenStorage;浏览器预览使用 httpOnly refresh Cookie。
|
|
13
13
|
|
|
14
14
|
自定义建议:移动端独有引导、运营位、按钮文案放在本目录 `messages/`;跨端通用组件放到 shared。
|
|
15
15
|
|
|
@@ -5,7 +5,7 @@ import process from 'node:process'
|
|
|
5
5
|
|
|
6
6
|
const config: CapacitorConfig = {
|
|
7
7
|
appId: 'com.hai.{{fullstack.nativeAppIdSegment}}.app',
|
|
8
|
-
appName:
|
|
8
|
+
appName: {{jsString fullstack.appName}},
|
|
9
9
|
webDir: 'dist',
|
|
10
10
|
server: {
|
|
11
11
|
// 仅用于 Capacitor live reload 前端页面;API 地址由前端配置或 shared client 参数控制。
|
|
@@ -6,11 +6,16 @@
|
|
|
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
|
-
<title>{{
|
|
9
|
+
<title>{{html fullstack.appName}}</title>
|
|
10
|
+
<link
|
|
11
|
+
rel="icon"
|
|
12
|
+
type="image/svg+xml"
|
|
13
|
+
href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='8' fill='%234438df'/%3E%3Cpath d='M10 8v16M22 8v16M10 16h12' fill='none' stroke='white' stroke-width='3'/%3E%3C/svg%3E"
|
|
14
|
+
/>
|
|
10
15
|
</head>
|
|
11
16
|
<body>
|
|
12
17
|
<div id="app"></div>
|
|
13
18
|
<script type="module" src="/src/main.ts"></script>
|
|
14
19
|
</body>
|
|
15
20
|
</html>
|
|
16
|
-
{{/if}}
|
|
21
|
+
{{/if}}
|
|
@@ -2,39 +2,6 @@
|
|
|
2
2
|
{{#if fullstack.frontends.app}}
|
|
3
3
|
{
|
|
4
4
|
"$schema": "https://inlang.com/schema/inlang-message-format",
|
|
5
|
-
"page_title": "{name}
|
|
6
|
-
"platform_name": "App/H5",
|
|
7
|
-
"nav_workspace": "Workspace",
|
|
8
|
-
"nav_status": "Status",
|
|
9
|
-
"nav_settings": "Settings",
|
|
10
|
-
"settings_description": "Switch theme and language here to verify shared theme and i18n state take effect instantly on mobile.",
|
|
11
|
-
"settings_theme_description": "Theme switching reuses the shared theme store and persists the preference on the device.",
|
|
12
|
-
"settings_language_description": "Language switching keeps the shared runtime and the app runtime in sync.",
|
|
13
|
-
"hero_badge": "Mobile workspace",
|
|
14
|
-
"hero_title": "{name} App Experience",
|
|
15
|
-
"hero_subtitle": "A mobile and H5 oriented entry point. This app keeps its own messages so onboarding and campaign copy can evolve independently.",
|
|
16
|
-
"hero_primary_action": "View service status",
|
|
17
|
-
"hero_secondary_action": "Customize the starter",
|
|
18
|
-
"preview_title": "Mobile-first interface",
|
|
19
|
-
"preview_body": "Ready for H5, Capacitor or embedded WebViews",
|
|
20
|
-
"preview_metric_shared": "Shared shell and API",
|
|
21
|
-
"preview_metric_local": "App-owned messages",
|
|
22
|
-
"preview_metric_theme": "Theme from config",
|
|
23
|
-
"status_title": "Service connectivity",
|
|
24
|
-
"status_description": "The mobile page calls the same backend API to verify cross-platform contract and shared API client wiring.",
|
|
25
|
-
"status_online": "{name} is connected",
|
|
26
|
-
"status_version": "Service version",
|
|
27
|
-
"status_started": "Started at: {time}",
|
|
28
|
-
"status_frontends": "Service frontends: {list}",
|
|
29
|
-
"status_frontends_count": "{count} frontend targets",
|
|
30
|
-
"custom_shared_title": "Shared owns common capabilities",
|
|
31
|
-
"custom_shared_body": "Keep cross-platform layout, locale, theme and API access in packages/{{projectName}}-shared.",
|
|
32
|
-
"custom_local_title": "App owns mobile copy",
|
|
33
|
-
"custom_local_body": "Write App-specific copy in apps/{{projectName}}-app/messages so mobile UX can iterate independently.",
|
|
34
|
-
"flow_title": "Collaboration boundary",
|
|
35
|
-
"flow_contract": "Contract constrains requests/responses",
|
|
36
|
-
"flow_service": "Service exposes unified APIs",
|
|
37
|
-
"flow_shared": "Shared reuses cross-platform capabilities",
|
|
38
|
-
"flow_frontend": "App composes the mobile experience"
|
|
5
|
+
"page_title": "{name}"
|
|
39
6
|
}
|
|
40
7
|
{{/if}}
|
|
@@ -2,39 +2,6 @@
|
|
|
2
2
|
{{#if fullstack.frontends.app}}
|
|
3
3
|
{
|
|
4
4
|
"$schema": "https://inlang.com/schema/inlang-message-format",
|
|
5
|
-
"page_title": "{name}
|
|
6
|
-
"platform_name": "App/H5",
|
|
7
|
-
"nav_workspace": "工作台",
|
|
8
|
-
"nav_status": "状态",
|
|
9
|
-
"nav_settings": "设置",
|
|
10
|
-
"settings_description": "在这里切换主题与语言,验证 shared 的主题与 i18n 在移动端即时生效。",
|
|
11
|
-
"settings_theme_description": "主题切换复用 shared theme store,并将偏好持久化到本地设备。",
|
|
12
|
-
"settings_language_description": "语言切换会同时同步 shared runtime 与当前 App runtime。",
|
|
13
|
-
"hero_badge": "移动端工作台",
|
|
14
|
-
"hero_title": "{name} App 体验",
|
|
15
|
-
"hero_subtitle": "面向移动端与 H5 场景的轻量入口,保留本端 messages 以便独立调整文案、引导语和运营内容。",
|
|
16
|
-
"hero_primary_action": "查看服务状态",
|
|
17
|
-
"hero_secondary_action": "了解如何自定义",
|
|
18
|
-
"preview_title": "移动优先界面",
|
|
19
|
-
"preview_body": "适合 H5、Capacitor 或内嵌 WebView",
|
|
20
|
-
"preview_metric_shared": "共享 Shell 与接口",
|
|
21
|
-
"preview_metric_local": "App 自有 messages",
|
|
22
|
-
"preview_metric_theme": "主题跟随配置",
|
|
23
|
-
"status_title": "服务联通状态",
|
|
24
|
-
"status_description": "移动端页面会调用同一套后端 API,验证跨端 contract 与 shared API client 正常工作。",
|
|
25
|
-
"status_online": "{name} 已连接",
|
|
26
|
-
"status_version": "服务版本",
|
|
27
|
-
"status_started": "启动时间:{time}",
|
|
28
|
-
"status_frontends": "服务声明的前端:{list}",
|
|
29
|
-
"status_frontends_count": "{count} 个前端目标",
|
|
30
|
-
"custom_shared_title": "共享层放通用能力",
|
|
31
|
-
"custom_shared_body": "跨端一致的布局、语言、主题和 API 访问都放在 packages/{{projectName}}-shared。",
|
|
32
|
-
"custom_local_title": "App 层放移动文案",
|
|
33
|
-
"custom_local_body": "App 独有文案写在 apps/{{projectName}}-app/messages,便于移动端独立迭代。",
|
|
34
|
-
"flow_title": "协同边界",
|
|
35
|
-
"flow_contract": "Contract 约束请求响应",
|
|
36
|
-
"flow_service": "Service 提供统一 API",
|
|
37
|
-
"flow_shared": "Shared 复用跨端能力",
|
|
38
|
-
"flow_frontend": "App 组织移动端体验"
|
|
5
|
+
"page_title": "{name}"
|
|
39
6
|
}
|
|
40
7
|
{{/if}}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"type": "module",
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"private": true,
|
|
8
|
-
"engines": { "node": "
|
|
8
|
+
"engines": { "node": "^22.22.2 || ^24.15.0 || >=26.0.0" },
|
|
9
9
|
"scripts": {
|
|
10
10
|
"paraglide:compile": "paraglide-js compile --project ./project.inlang --outdir ./src/lib/paraglide",
|
|
11
11
|
"paraglide:watch": "paraglide-js compile --project ./project.inlang --outdir ./src/lib/paraglide --watch",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"preview": "vite preview --host 127.0.0.1 --port {{fullstack.ports.app}} --strictPort",
|
|
17
17
|
"typecheck": "pnpm paraglide:compile && svelte-check --tsconfig ./tsconfig.json",
|
|
18
18
|
"lint": "eslint .",
|
|
19
|
-
"test": "pnpm paraglide:compile && vitest run",
|
|
19
|
+
"test": "pnpm paraglide:compile && vitest run --passWithNoTests",
|
|
20
20
|
"test:watch": "pnpm paraglide:compile && vitest",
|
|
21
21
|
"clean": "rimraf dist build android ios .turbo src/lib/paraglide",
|
|
22
22
|
"cap:add:android": "cap add android",
|