@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.
Files changed (175) hide show
  1. package/README.en.md +37 -3
  2. package/README.ja.md +37 -3
  3. package/README.md +37 -3
  4. package/dist/chunk-2H7UOFLK.js +0 -0
  5. package/dist/{chunk-MJGUBOAV.js → chunk-F4IBPVZ5.js} +6 -42
  6. package/dist/chunk-F4IBPVZ5.js.map +1 -0
  7. package/dist/{chunk-O3ANVICQ.js → chunk-WUSFJFW5.js} +13 -7
  8. package/dist/chunk-WUSFJFW5.js.map +1 -0
  9. package/dist/cli-config-templates-6XA7V6CC.js +5 -0
  10. package/dist/{cli-config-templates-OWBEGBZQ.js.map → cli-config-templates-6XA7V6CC.js.map} +1 -1
  11. package/dist/{cli-skill-templates-ZYXES3NT.js → cli-skill-templates-45CK4RQ2.js} +3 -3
  12. package/dist/{cli-skill-templates-ZYXES3NT.js.map → cli-skill-templates-45CK4RQ2.js.map} +1 -1
  13. package/dist/index.js +107 -61
  14. package/dist/index.js.map +1 -1
  15. package/dist/{src-TBIET7YU.js → src-DUGLX4YB.js} +7270 -2119
  16. package/dist/src-DUGLX4YB.js.map +1 -0
  17. package/package.json +17 -17
  18. package/templates/README.md +4 -4
  19. package/templates/apps/admin/src/routes/+layout.svelte.hbs +7 -0
  20. package/templates/apps/admin/src/routes/+page.svelte.hbs +5 -4
  21. package/templates/apps/admin/src/routes/admin/+layout.svelte.hbs +2 -2
  22. package/templates/apps/api/.npmrc.hbs +1 -2
  23. package/templates/apps/api/Dockerfile.hbs +6 -5
  24. package/templates/apps/api/apps/{{projectName}}-contract/package.json.hbs +1 -1
  25. package/templates/apps/api/apps/{{projectName}}-contract/src/app-schemas.ts.hbs +2 -0
  26. package/templates/apps/api/apps/{{projectName}}-contract/tsup.config.ts.hbs +1 -1
  27. package/templates/apps/api/apps/{{projectName}}-service/config/_core.yml.hbs +8 -0
  28. package/templates/apps/api/apps/{{projectName}}-service/package.json.hbs +1 -1
  29. package/templates/apps/api/apps/{{projectName}}-service/src/app.ts.hbs +7 -8
  30. package/templates/apps/api/apps/{{projectName}}-service/src/index.ts.hbs +4 -3
  31. package/templates/apps/api/apps/{{projectName}}-service/src/lib/server/init.ts.hbs +0 -1
  32. package/templates/apps/api/apps/{{projectName}}-service/src/server/procedures/app-procedures.ts.hbs +4 -0
  33. package/templates/apps/api/apps/{{projectName}}-service/tests/service.test.ts.hbs +3 -1
  34. package/templates/apps/api/e2e/api-service.spec.ts.hbs +3 -1
  35. package/templates/apps/api/package.json.hbs +2 -2
  36. package/templates/apps/api/pnpm-workspace.yaml.hbs +26 -0
  37. package/templates/apps/api/tsconfig.base.json +0 -1
  38. package/templates/apps/fullstack/.dockerignore.hbs +3 -0
  39. package/templates/apps/fullstack/.npmrc.hbs +1 -2
  40. package/templates/apps/fullstack/Dockerfile.hbs +6 -5
  41. package/templates/apps/fullstack/apps/{{projectName}}-app/README.md.hbs +2 -2
  42. package/templates/apps/fullstack/apps/{{projectName}}-app/capacitor.config.ts.hbs +1 -1
  43. package/templates/apps/fullstack/apps/{{projectName}}-app/index.html.hbs +7 -2
  44. package/templates/apps/fullstack/apps/{{projectName}}-app/messages/en-US.json.hbs +1 -34
  45. package/templates/apps/fullstack/apps/{{projectName}}-app/messages/zh-CN.json.hbs +1 -34
  46. package/templates/apps/fullstack/apps/{{projectName}}-app/package.json.hbs +2 -2
  47. package/templates/apps/fullstack/apps/{{projectName}}-app/src/App.svelte.hbs +30 -170
  48. package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.d.ts.hbs +1 -1
  49. package/templates/apps/fullstack/apps/{{projectName}}-app/src/lib/capacitor.ts.hbs +6 -5
  50. package/templates/apps/fullstack/apps/{{projectName}}-app/src/main.ts.hbs +1 -1
  51. package/templates/apps/fullstack/apps/{{projectName}}-app/vite.config.ts.hbs +48 -22
  52. package/templates/apps/fullstack/apps/{{projectName}}-desktop/README.md.hbs +3 -1
  53. package/templates/apps/fullstack/apps/{{projectName}}-desktop/index.html.hbs +6 -1
  54. package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/en-US.json.hbs +1 -28
  55. package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/zh-CN.json.hbs +1 -28
  56. package/templates/apps/fullstack/apps/{{projectName}}-desktop/package.json.hbs +5 -4
  57. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/App.svelte.hbs +10 -141
  58. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/Cargo.toml.hbs +5 -5
  59. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/tauri.conf.json.hbs +3 -3
  60. package/templates/apps/fullstack/apps/{{projectName}}-desktop/vite.config.ts.hbs +21 -2
  61. package/templates/apps/fullstack/apps/{{projectName}}-web/README.md.hbs +2 -2
  62. package/templates/apps/fullstack/apps/{{projectName}}-web/index.html.hbs +6 -1
  63. package/templates/apps/fullstack/apps/{{projectName}}-web/messages/en-US.json.hbs +1 -28
  64. package/templates/apps/fullstack/apps/{{projectName}}-web/messages/zh-CN.json.hbs +1 -28
  65. package/templates/apps/fullstack/apps/{{projectName}}-web/package.json.hbs +2 -2
  66. package/templates/apps/fullstack/apps/{{projectName}}-web/src/App.svelte.hbs +5 -143
  67. package/templates/apps/fullstack/apps/{{projectName}}-web/src/app.d.ts.hbs +1 -1
  68. package/templates/apps/fullstack/apps/{{projectName}}-web/src/main.ts.hbs +1 -1
  69. package/templates/apps/fullstack/apps/{{projectName}}-web/vite.config.ts.hbs +48 -22
  70. package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +206 -16
  71. package/templates/apps/fullstack/package.json.hbs +2 -2
  72. package/templates/apps/fullstack/packages/{{projectName}}-contract/README.md.hbs +2 -0
  73. package/templates/apps/fullstack/packages/{{projectName}}-contract/package.json.hbs +1 -1
  74. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-contract.ts.hbs +66 -0
  75. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-schemas.ts.hbs +96 -0
  76. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/app-schemas.ts.hbs +3 -0
  77. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/index.ts.hbs +3 -1
  78. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +5 -0
  79. package/templates/apps/fullstack/packages/{{projectName}}-contract/tests/contract.test.ts.hbs +3 -0
  80. package/templates/apps/fullstack/packages/{{projectName}}-contract/tsup.config.ts.hbs +1 -1
  81. package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +13 -3
  82. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_audit.yml.hbs +3 -0
  83. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_cache.yml.hbs +2 -0
  84. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_core.yml.hbs +10 -3
  85. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_db.yml.hbs +3 -0
  86. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_iam.yml.hbs +21 -0
  87. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_serv.yml.hbs +10 -3
  88. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_storage.yml.hbs +3 -0
  89. package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +10 -3
  90. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/app-server.ts.hbs +63 -28
  91. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/index.ts.hbs +26 -11
  92. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/admin-service.ts.hbs +276 -0
  93. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/messages.ts.hbs +29 -0
  94. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/admin-procedures.ts.hbs +94 -0
  95. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/app-procedures.ts.hbs +6 -0
  96. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/index.ts.hbs +5 -1
  97. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/runtime.ts.hbs +98 -0
  98. package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/app-server.test.ts.hbs +446 -33
  99. package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/runtime.test.ts.hbs +48 -0
  100. package/templates/apps/fullstack/packages/{{projectName}}-serv/tsup.config.ts.hbs +1 -1
  101. package/templates/apps/fullstack/packages/{{projectName}}-shared/README.md.hbs +19 -26
  102. package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/en-US.json.hbs +78 -15
  103. package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/zh-CN.json.hbs +78 -15
  104. package/templates/apps/fullstack/packages/{{projectName}}-shared/package.json.hbs +4 -1
  105. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/index.ts.hbs +3 -4
  106. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/api-client.ts.hbs +53 -27
  107. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AdminWorkspace.svelte.hbs +73 -0
  108. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AppShell.svelte.hbs +55 -45
  109. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AuditManagement.svelte.hbs +61 -0
  110. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/ProfileSettings.svelte.hbs +57 -0
  111. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/RoleManagement.svelte.hbs +49 -0
  112. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/UserManagement.svelte.hbs +174 -0
  113. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/management-store.svelte.ts.hbs +399 -0
  114. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/theme-store.svelte.ts.hbs +7 -39
  115. package/templates/apps/fullstack/packages/{{projectName}}-shared/svelte.config.js.hbs +1 -0
  116. package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/api-client.test.ts.hbs +151 -0
  117. package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/management-store.test.ts.hbs +101 -0
  118. package/templates/apps/fullstack/packages/{{projectName}}-shared/vitest.config.ts.hbs +7 -0
  119. package/templates/apps/fullstack/playwright.config.ts.hbs +6 -0
  120. package/templates/apps/fullstack/pnpm-workspace.yaml.hbs +24 -0
  121. package/templates/apps/fullstack/tsconfig.base.json +0 -1
  122. package/templates/apps/h5/src/routes/+layout.svelte.hbs +4 -0
  123. package/templates/apps/h5/src/routes/+page.svelte.hbs +3 -2
  124. package/templates/apps/mobile-app/index.html.hbs +2 -2
  125. package/templates/apps/mobile-app/src/App.svelte.hbs +6 -2
  126. package/templates/apps/mobile-app/src/lib/app-config.ts.hbs +13 -0
  127. package/templates/apps/website/src/routes/+layout.svelte.hbs +8 -2
  128. package/templates/apps/website/src/routes/+page.svelte.hbs +4 -3
  129. package/templates/base/.npmrc.hbs +1 -15
  130. package/templates/base/Dockerfile.hbs +9 -8
  131. package/templates/base/e2e/app.spec.ts.hbs +1 -0
  132. package/templates/base/package.json.hbs +39 -42
  133. package/templates/base/pnpm-workspace.yaml.hbs +26 -0
  134. package/templates/base/src/app.d.ts.hbs +4 -0
  135. package/templates/base/src/hooks.server.ts.hbs +0 -8
  136. package/templates/base/src/lib/server/init.ts.hbs +26 -5
  137. package/templates/base/src/routes/+layout.server.ts.hbs +18 -0
  138. package/templates/base/tests/scaffold.test.ts.hbs +21 -1
  139. package/templates/base/vite.config.ts.hbs +21 -0
  140. package/templates/features/ai/routes/api/chat/+server.ts +6 -7
  141. package/templates/features/iam/routes-admin/(auth)/auth/login/+page.svelte.hbs +1 -1
  142. package/templates/features/iam/routes-h5/auth/login/+page.svelte.hbs +1 -1
  143. package/templates/features/iam/routes-shared/api/auth/login/+server.ts +14 -10
  144. package/templates/features/iam/routes-shared/api/auth/logout/+server.ts +6 -4
  145. package/templates/features/storage/routes/api/upload/+server.ts +10 -8
  146. package/templates/skills/CLAUDE.md +0 -14
  147. package/templates/skills/bridges/fullstack/AGENTS.md.hbs +13 -2
  148. package/templates/skills/bridges/fullstack/copilot-instructions.md.hbs +3 -0
  149. package/templates/skills/hai-api-client/SKILL.md +1 -1
  150. package/templates/skills/hai-app-create/development.md +6 -0
  151. package/templates/skills/hai-build/reference.md +4 -2
  152. package/templates/skills/hai-core/SKILL.md +2 -0
  153. package/templates/skills/hai-core/reference.md +6 -4
  154. package/templates/skills/hai-framework-sync/SKILL.md +1 -2
  155. package/templates/skills/hai-serv/SKILL.md +1 -0
  156. package/templates/skills/hai-serv/reference.md +3 -1
  157. package/templates/skills/hai-ui/SKILL.md +6 -0
  158. package/templates/skills/hai-ui/reference.md +7 -4
  159. package/templates/skills/hai-vecdb/reference.md +53 -49
  160. package/dist/chunk-MJGUBOAV.js.map +0 -1
  161. package/dist/chunk-O3ANVICQ.js.map +0 -1
  162. package/dist/cli-config-templates-OWBEGBZQ.js +0 -5
  163. package/dist/src-TBIET7YU.js.map +0 -1
  164. package/templates/apps/fullstack/apps/{{projectName}}-app/tests/api.test.ts.hbs +0 -28
  165. package/templates/apps/fullstack/apps/{{projectName}}-desktop/tests/api.test.ts.hbs +0 -28
  166. package/templates/apps/fullstack/apps/{{projectName}}-web/tests/api.test.ts.hbs +0 -55
  167. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/LanguageSwitcher.svelte.hbs +0 -27
  168. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/ThemeSwitcher.svelte.hbs +0 -18
  169. package/templates/skills/bridges/admin/CLAUDE.md +0 -15
  170. package/templates/skills/bridges/api/CLAUDE.md +0 -15
  171. package/templates/skills/bridges/fullstack/CLAUDE.md.hbs +0 -9
  172. package/templates/skills/bridges/h5/CLAUDE.md +0 -15
  173. package/templates/skills/bridges/mobile-app/CLAUDE.md +0 -15
  174. package/templates/skills/bridges/website/CLAUDE.md +0 -15
  175. package/templates/skills/claude-skill.md.hbs +0 -7
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { generateConfigFile } from './chunk-O3ANVICQ.js';
3
- import { cliM } from './chunk-MJGUBOAV.js';
2
+ import { generateConfigFile } from './chunk-WUSFJFW5.js';
3
+ import { cliM } from './chunk-F4IBPVZ5.js';
4
4
  import './chunk-2H7UOFLK.js';
5
5
  import process3 from 'process';
6
6
  import { core } from '@h-ai/core';
@@ -9,13 +9,14 @@ import chalk from 'chalk';
9
9
  import path2, { resolve } from 'path';
10
10
  import { fileURLToPath } from 'url';
11
11
  import fse from 'fs-extra';
12
- import Handlebars from 'handlebars';
12
+ import Handlebars2 from 'handlebars';
13
13
  import ora from 'ora';
14
14
  import prompts from 'prompts';
15
15
  import { Buffer } from 'buffer';
16
16
  import { execSync, execFileSync } from 'child_process';
17
+ import { randomBytes } from 'crypto';
18
+ import { stringify, parse } from 'yaml';
17
19
  import { existsSync, readFileSync } from 'fs';
18
- import { parse } from 'yaml';
19
20
 
20
21
  var CAMEL_CASE_SEPARATOR_REGEX = /[-_\s]+(.)?/g;
21
22
  var LEADING_CHAR_REGEX = /^./;
@@ -79,26 +80,30 @@ async function detectPackageManager(cwd) {
79
80
  return "npm";
80
81
  }
81
82
  function registerHelpers() {
82
- Handlebars.registerHelper("if_eq", function(a, b, options) {
83
+ Handlebars2.registerHelper("if_eq", function(a, b, options) {
83
84
  return a === b ? options.fn(this) : options.inverse(this);
84
85
  });
85
- Handlebars.registerHelper("date", () => {
86
+ Handlebars2.registerHelper("date", () => {
86
87
  return (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
87
88
  });
88
- Handlebars.registerHelper("year", () => {
89
+ Handlebars2.registerHelper("year", () => {
89
90
  return (/* @__PURE__ */ new Date()).getFullYear();
90
91
  });
91
- Handlebars.registerHelper("upper", (str) => {
92
+ Handlebars2.registerHelper("upper", (str) => {
92
93
  return str.toUpperCase();
93
94
  });
94
- Handlebars.registerHelper("lower", (str) => {
95
+ Handlebars2.registerHelper("lower", (str) => {
95
96
  return str.toLowerCase();
96
97
  });
97
98
  }
98
99
  registerHelpers();
99
- Handlebars.registerHelper("if_eq", function(a, b, options) {
100
+ Handlebars2.registerHelper("if_eq", function(a, b, options) {
100
101
  return a === b ? options.fn(this) : options.inverse(this);
101
102
  });
103
+ Handlebars2.registerHelper("json", (value) => JSON.stringify(value));
104
+ Handlebars2.registerHelper("html", (value) => Handlebars2.escapeExpression(value));
105
+ Handlebars2.registerHelper("yaml", (key, value) => stringify({ [key]: value }).trim());
106
+ Handlebars2.registerHelper("jsString", (value) => `'${JSON.stringify(value).slice(1, -1).replace(/\\"/g, '"').replace(/'/g, "\\'")}'`);
102
107
  var TEMPLATE_SKIP_IF_EMPTY_MARKER = "@skipIfEmpty";
103
108
  var NORMALIZED_RENDER_EXTENSIONS = /* @__PURE__ */ new Set([".ts", ".js", ".svelte", ".json", ".css"]);
104
109
  var CAPACITOR_SKIPPED_SERVER_FILES = /* @__PURE__ */ new Set([
@@ -106,53 +111,56 @@ var CAPACITOR_SKIPPED_SERVER_FILES = /* @__PURE__ */ new Set([
106
111
  "src/lib/server/init.ts"
107
112
  ]);
108
113
  var VERSIONS = {
109
- antfuEslintConfig: "^9.0.0",
110
- capacitorSecureStorage: "^8.0.0",
114
+ antfuEslintConfig: "^9.5.1",
115
+ capacitorSecureStorage: "^8.0.1",
111
116
  // UI / Icon
112
- bitsUi: "^2.18.1",
113
- iconifyJsonTabler: "^1.2.35",
117
+ bitsUi: "^2.19.5",
118
+ iconifyJsonTabler: "^1.2.42",
114
119
  iconifyTailwind: "^1.2.3",
115
120
  // Capacitor
116
- capacitorAndroid: "^8.3.4",
117
- capacitorApp: "^8.0.1",
118
- capacitorCamera: "^8.0.1",
119
- capacitorCli: "^8.3.4",
120
- capacitorCore: "^8.3.4",
121
- capacitorDevice: "^8.0.1",
122
- capacitorIos: "^8.3.4",
121
+ capacitorAndroid: "^8.5.3",
122
+ capacitorApp: "^8.1.2",
123
+ capacitorCamera: "^8.2.5",
124
+ capacitorCli: "^8.5.3",
125
+ capacitorCore: "^8.5.3",
126
+ capacitorDevice: "^8.0.3",
127
+ capacitorIos: "^8.5.3",
123
128
  capacitorPreferences: "^8.0.1",
124
- capacitorPushNotifications: "^8.0.1",
125
- capacitorStatusBar: "^8.0.1",
129
+ capacitorPushNotifications: "^8.1.3",
130
+ capacitorStatusBar: "^8.0.4",
126
131
  // Tailwind / DaisyUI
127
- daisyui: "^5.5.20",
128
- tailwindcss: "^4.3.0",
129
- tailwindcssVite: "^4.3.0",
132
+ daisyui: "^5.7.47",
133
+ tailwindcss: "^4.3.3",
134
+ tailwindcssVite: "^4.3.3",
130
135
  // i18n
131
- inlangParaglide: "^2.18.1",
132
- inlangMessageFormat: "^4.4.0",
136
+ inlangParaglide: "^2.27.0",
137
+ inlangMessageFormat: "^4.5.0",
133
138
  // Svelte / Vite
134
- svelte: "^5.55.9",
135
- svelteCheck: "^4.4.8",
136
- sveltePlugin: "^7.1.2",
139
+ svelte: "^5.57.2",
140
+ svelteKit: "^2.70.3",
141
+ svelteAdapterNode: "^5.5.7",
142
+ svelteCheck: "^4.7.6",
143
+ sveltePlugin: "^7.3.1",
137
144
  // Build / Test
138
- vite: "^8.0.14",
139
- vitest: "^4.1.7",
145
+ vite: "^8.3.4",
146
+ vitest: "^4.1.11",
140
147
  tsup: "^8.5.1",
141
148
  rimraf: "^6.1.3",
142
149
  // ESLint
143
- eslint: "^10.4.0",
150
+ eslint: "^10.12.0",
144
151
  eslintPluginFormat: "^2.0.1",
145
- eslintPluginSvelte: "^3.17.1",
146
- svelteEslintParser: "^1.6.1",
152
+ eslintPluginSvelte: "^3.23.1",
153
+ svelteEslintParser: "^1.9.0",
147
154
  // Node / TS
148
- nodeTypes: "^25.9.1",
155
+ nodeTypes: "^26.6.5",
156
+ // Svelte / ESLint / tsup 继续使用稳定的 JavaScript 编译 API。
149
157
  typescript: "^6.0.3",
150
158
  // E2E
151
- playwright: "^1.60.0",
159
+ playwright: "^1.64.0",
152
160
  // Validation
153
- zod: "^4.4.3",
161
+ zod: "^4.6.5",
154
162
  // Tauri
155
- tauriCli: "^2.10.1"
163
+ tauriCli: "^2.12.1"
156
164
  };
157
165
  var FRONTEND_PORTS_DEFAULT = {
158
166
  web: 4173,
@@ -261,11 +269,20 @@ var FULLSTACK_CONTRACT_CATALOG_PACKAGE_NAMES = [
261
269
  "zod"
262
270
  ];
263
271
  var FULLSTACK_SERV_CATALOG_PACKAGE_NAMES = [
272
+ "@h-ai/audit",
273
+ "@h-ai/cache",
264
274
  "@h-ai/core",
265
- "@h-ai/serv"
275
+ "@h-ai/crypto",
276
+ "@h-ai/iam",
277
+ "@h-ai/reldb",
278
+ "@h-ai/serv",
279
+ "@h-ai/storage",
280
+ "zod"
266
281
  ];
267
282
  var FULLSTACK_SHARED_CATALOG_PACKAGE_NAMES = [
268
283
  "@h-ai/api-client",
284
+ "@h-ai/core",
285
+ "@h-ai/crypto",
269
286
  "@h-ai/ui",
270
287
  "@inlang/paraglide-js",
271
288
  "@inlang/plugin-message-format",
@@ -534,6 +551,9 @@ function buildTemplateContext(options) {
534
551
  for (const f of options.features) {
535
552
  featureMap[f] = true;
536
553
  }
554
+ if (options.appType === "fullstack") {
555
+ for (const feature of ["iam", "db", "cache", "crypto", "storage", "audit"]) featureMap[feature] = true;
556
+ }
537
557
  if (featureMap.iam) {
538
558
  featureMap.db = true;
539
559
  featureMap.cache = true;
@@ -564,6 +584,7 @@ function buildTemplateContext(options) {
564
584
  }
565
585
  return {
566
586
  projectName: options.name,
587
+ versions: VERSIONS,
567
588
  useCatalogProtocol,
568
589
  haiPackageSpecifier: useCatalogProtocol ? HAI_PACKAGE_SPECIFIER_CATALOG : HAI_PACKAGE_VERSION,
569
590
  haiPackageVersion: HAI_PACKAGE_VERSION,
@@ -610,6 +631,7 @@ function buildFullstackTemplateContext(projectName, frontendsInput, moduleConfig
610
631
  port: portFor(target)
611
632
  }));
612
633
  return {
634
+ appName: moduleConfigs?.core?.name ?? projectName,
613
635
  versions: VERSIONS,
614
636
  packageSpecifiers: buildFullstackPackageSpecifiers(useCatalogProtocol),
615
637
  contractPackageName: `${projectName}-contract`,
@@ -688,7 +710,7 @@ async function generateFromTemplates(projectPath, context) {
688
710
  const appExcludes = context.hasI18n ? [] : ["messages"];
689
711
  await copyStaticDir(appDir, projectPath, appExcludes);
690
712
  }
691
- if (!context.isApiWorkspace) {
713
+ if (!context.isApiWorkspace && context.appType !== "fullstack") {
692
714
  for (const featureId of Object.keys(context.features)) {
693
715
  if (context.isSvelteOnlyApp) {
694
716
  continue;
@@ -742,7 +764,7 @@ async function renderDynamicFiles(templatesRoot, projectPath, context) {
742
764
  await renderHbsInDir(dir, projectPath, context);
743
765
  await copyRenderedStaticPathFiles(dir, projectPath, context);
744
766
  }
745
- if (context.isApiWorkspace) {
767
+ if (context.isApiWorkspace || context.appType === "fullstack") {
746
768
  return;
747
769
  }
748
770
  const routesDest = path2.join(projectPath, "src", "routes");
@@ -780,7 +802,7 @@ async function renderHbsInDir(dir, destRoot, context) {
780
802
  const srcPath = path2.join(dir, relPath);
781
803
  const outRelPathTemplate = relPath.replace(HBS_SUFFIX_REGEX, "");
782
804
  const template = await fse.readFile(srcPath, "utf-8");
783
- const compiled = Handlebars.compile(template, { noEscape: true });
805
+ const compiled = Handlebars2.compile(template, { noEscape: true });
784
806
  const rendered = compiled(context);
785
807
  if (shouldSkipRenderedFile(template, rendered)) {
786
808
  continue;
@@ -841,7 +863,7 @@ function shouldSkipRenderedFile(template, rendered) {
841
863
  }
842
864
  function renderOutputPath(pathTemplate, context) {
843
865
  const normalizedTemplate = pathTemplate.split(path2.sep).join("/");
844
- return Handlebars.compile(normalizedTemplate, { noEscape: true })(context);
866
+ return Handlebars2.compile(normalizedTemplate, { noEscape: true })(context);
845
867
  }
846
868
  function isSafeRelativePath(relativePath) {
847
869
  const normalized = path2.normalize(relativePath);
@@ -879,8 +901,8 @@ var APP_TYPES = {
879
901
  },
880
902
  "fullstack": {
881
903
  name: "\u524D\u540E\u7AEF\u5206\u79BB\u5DE5\u7A0B",
882
- description: "\u591A\u5305\u5DE5\u4F5C\u533A\uFF0C\u5305\u542B contract\u3001serv\u3001Web/App/Desktop \u524D\u7AEF",
883
- defaultFeatures: []
904
+ description: "\u591A\u7AEF mini \u7BA1\u7406\u7CFB\u7EDF\uFF0C\u5305\u542B\u7528\u6237\u3001\u89D2\u8272\u3001\u5BA1\u8BA1\u3001\u4E2A\u4EBA\u8BBE\u7F6E\u4E0E\u53CC\u5411\u4F20\u8F93\u52A0\u5BC6",
905
+ defaultFeatures: ["iam", "db", "cache", "crypto", "storage", "audit"]
884
906
  }
885
907
  };
886
908
  var FRONTEND_TARGETS = {
@@ -1077,20 +1099,21 @@ async function createProject(options) {
1077
1099
  packageManager: resolvedOptions.packageManager
1078
1100
  });
1079
1101
  await generateFromTemplates(projectPath, context);
1080
- if (resolvedOptions.appType !== "fullstack") {
1081
- const { generateConfigFile: generateConfigFile2, generateEnvExample } = await import('./cli-config-templates-OWBEGBZQ.js');
1102
+ {
1103
+ const { generateConfigFile: generateConfigFile2, generateEnvExample } = await import('./cli-config-templates-6XA7V6CC.js');
1082
1104
  const configs = resolvedOptions.moduleConfigs;
1083
1105
  const isApiWorkspace = resolvedOptions.appType === "api";
1084
- const configDir = isApiWorkspace ? path2.join(projectPath, "apps", `${resolvedOptions.name}-service`, "config") : path2.join(projectPath, "config");
1106
+ const isFullstack = resolvedOptions.appType === "fullstack";
1107
+ const configDir = isApiWorkspace ? path2.join(projectPath, "apps", `${resolvedOptions.name}-service`, "config") : isFullstack ? path2.join(projectPath, "packages", `${resolvedOptions.name}-serv`, "config") : path2.join(projectPath, "config");
1085
1108
  const envExamplePath = isApiWorkspace ? path2.join(projectPath, "apps", `${resolvedOptions.name}-service`, ".env.example") : path2.join(projectPath, ".env.example");
1086
1109
  for (const featureId of resolvedOptions.features) {
1087
1110
  const configKey = getFeatureConfigKey(featureId);
1088
1111
  if (configKey) {
1089
- const content = generateConfigFile2(configKey, configs);
1112
+ const content = isFullstack && configKey === "iam" ? generateConfigFile2(configKey, configs).replace("seedDefaultData: true", "seedDefaultData: false") : generateConfigFile2(configKey, configs);
1090
1113
  await writeFile(path2.join(configDir, `_${configKey}.yml`), content);
1091
1114
  }
1092
1115
  }
1093
- if (!isApiWorkspace) {
1116
+ if (!isApiWorkspace && !isFullstack) {
1094
1117
  await writeFile(
1095
1118
  path2.join(configDir, "_core.yml"),
1096
1119
  generateConfigFile2("core", configs)
@@ -1101,10 +1124,21 @@ async function createProject(options) {
1101
1124
  # Service Runtime
1102
1125
  # =============================================================================
1103
1126
  PORT=3000
1127
+ ` : isFullstack ? `${generateEnvExample(resolvedOptions.features, configs)}
1128
+ # First-start administrator password. The CLI generates a random value in .env.
1129
+ HAI_ADMIN_DEFAULT_PASSWORD=
1130
+
1131
+ # Local development API. Use your public API origin for deployment/native clients.
1132
+ PUBLIC_API_BASE=http://127.0.0.1:3000
1104
1133
  ` : generateEnvExample(resolvedOptions.features, configs);
1105
1134
  await writeFile(envExamplePath, envExample);
1135
+ if (isFullstack) {
1136
+ const password = `Aa1!${randomBytes(24).toString("base64url")}`;
1137
+ await fse.writeFile(path2.join(projectPath, ".env"), envExample.replace("HAI_ADMIN_DEFAULT_PASSWORD=\n", `HAI_ADMIN_DEFAULT_PASSWORD=${password}
1138
+ `), { mode: 384 });
1139
+ }
1106
1140
  }
1107
- const { generateSkillFiles } = await import('./cli-skill-templates-ZYXES3NT.js');
1141
+ const { generateSkillFiles } = await import('./cli-skill-templates-45CK4RQ2.js');
1108
1142
  await generateSkillFiles(
1109
1143
  projectPath,
1110
1144
  resolvedOptions.features,
@@ -1213,7 +1247,7 @@ async function resolveOptions(options) {
1213
1247
  let selectedFeatures = [];
1214
1248
  const appTypeDefaults = APP_TYPES[selectedAppType].defaultFeatures;
1215
1249
  if (selectedAppType === "fullstack") {
1216
- selectedFeatures = [];
1250
+ selectedFeatures = resolveFeatureDependencies(appTypeDefaults);
1217
1251
  } else if (selectedTemplate === "custom" && !options.features && useDefaults) {
1218
1252
  selectedFeatures = resolveFeatureDependencies(appTypeDefaults);
1219
1253
  } else if (selectedTemplate === "custom" && !options.features) {
@@ -1239,7 +1273,7 @@ async function resolveOptions(options) {
1239
1273
  const merged = /* @__PURE__ */ new Set([...templateFeatures, ...appTypeDefaults]);
1240
1274
  selectedFeatures = resolveFeatureDependencies(Array.from(merged));
1241
1275
  }
1242
- const moduleConfigs = selectedAppType === "fullstack" ? options.moduleConfigs ?? {} : options.moduleConfigs ?? (useDefaults ? buildDefaultModuleConfigs(selectedFeatures, projectName) : await promptModuleConfigs(selectedFeatures, projectName));
1276
+ const moduleConfigs = selectedAppType === "fullstack" ? { ...buildDefaultModuleConfigs(selectedFeatures, projectName), ...options.moduleConfigs } : options.moduleConfigs ?? (useDefaults ? buildDefaultModuleConfigs(selectedFeatures, projectName) : await promptModuleConfigs(selectedFeatures, projectName));
1243
1277
  let addExamples = options.examples;
1244
1278
  if (addExamples === void 0 && useDefaults) {
1245
1279
  addExamples = true;
@@ -1619,7 +1653,7 @@ function generateAiDevelopmentReadme() {
1619
1653
 
1620
1654
  \u4ECE\u672C\u9879\u76EE\u6839\u76EE\u5F55\u6253\u5F00\u6240\u7528\u7F16\u7801\u5DE5\u5177\uFF0C\u5148\u8BFB\u53D6 [AGENTS.md](./AGENTS.md)\u3002Claude Code \u901A\u8FC7 [CLAUDE.md](./CLAUDE.md) \u52A0\u8F7D\u9879\u76EE\u89C4\u5219\uFF1BGitHub Copilot \u4F7F\u7528 [.github/copilot-instructions.md](./.github/copilot-instructions.md)\uFF0COpenCode \u4F7F\u7528 AGENTS.md \u548C [opencode.json](./opencode.json)\u3002
1621
1655
 
1622
- Codex\u3001Cursor\u3001Copilot\u3001OpenCode \u4ECE .agents/skills/ \u53D1\u73B0\u5171\u4EAB\u6280\u80FD\uFF1BClaude Code \u4ECE .claude/skills/ \u7684\u539F\u751F\u5165\u53E3\u8BFB\u53D6\u540C\u4E00\u4EFD\u5171\u4EAB\u6B63\u6587\u3002\u666E\u901A\u65B0\u589E\u3001\u4FEE\u6539\u3001\u4FEE\u590D\u4EFB\u52A1\u4F7F\u7528 [\u5E94\u7528\u5F00\u53D1 Skill](./.agents/skills/hai-app-create/SKILL.md) \u548C [\u5F00\u53D1\u89C4\u8303\u4E0E\u6846\u67B6\u80FD\u529B\u8DEF\u7531](./.agents/skills/hai-app-create/development.md)\uFF1B\u5177\u4F53\u6A21\u5757\u518D\u6309\u9700\u8BFB\u53D6\uFF0C\u4E0D\u80FD\u628A Skill \u5DF2\u4EA4\u4ED8\u5F53\u6210\u4F9D\u8D56\u5DF2\u5B89\u88C5\u6216\u914D\u7F6E\u5DF2\u542F\u7528\u3002
1656
+ Codex\u3001Cursor\u3001Copilot\u3001OpenCode \u4ECE .agents/skills/ \u53D1\u73B0\u5171\u4EAB\u6280\u80FD\uFF1BClaude Code \u901A\u8FC7 CLAUDE.md \u5F15\u7528 AGENTS.md\uFF0C\u5E76\u6309\u9879\u76EE\u6307\u5F15\u8BFB\u53D6 .agents/skills/ \u7684\u540C\u4E00\u4EFD\u6B63\u6587\u3002\u666E\u901A\u65B0\u589E\u3001\u4FEE\u6539\u3001\u4FEE\u590D\u4EFB\u52A1\u4F7F\u7528 [\u5E94\u7528\u5F00\u53D1 Skill](./.agents/skills/hai-app-create/SKILL.md) \u548C [\u5F00\u53D1\u89C4\u8303\u4E0E\u6846\u67B6\u80FD\u529B\u8DEF\u7531](./.agents/skills/hai-app-create/development.md)\uFF1B\u5177\u4F53\u6A21\u5757\u518D\u6309\u9700\u8BFB\u53D6\uFF0C\u4E0D\u80FD\u628A Skill \u5DF2\u4EA4\u4ED8\u5F53\u6210\u4F9D\u8D56\u5DF2\u5B89\u88C5\u6216\u914D\u7F6E\u5DF2\u542F\u7528\u3002
1623
1657
 
1624
1658
  \u4F18\u5148\u590D\u7528\u9002\u7528\u7684 hai-framework \u516C\u5F00 API \u4E0E\u5DF2\u6709\u4E1A\u52A1\u5B9E\u73B0\u3002\u5B8C\u6210\u65F6\u8BF4\u660E\u590D\u7528\u7684\u80FD\u529B\u3001\u76F8\u5173\u80FD\u529B\u672A\u91C7\u7528\u7684\u539F\u56E0\uFF0C\u4EE5\u53CA\u5B89\u5168\u8FB9\u754C\u548C\u7C7B\u578B\u3001\u914D\u7F6E\u3001\u6587\u6848\u3001\u8C03\u7528\u65B9\u7684\u540C\u6B65\u60C5\u51B5\u3002\u8D28\u91CF\u9A8C\u8BC1\u6309\u5F53\u524D package.json \u6267\u884C typecheck \u2192 lint \u2192 build \u2192 test\uFF1BUI\u3001\u8DEF\u7531\u4E0E\u7AEF\u5230\u7AEF\u6D41\u7A0B\u53E6\u8FD0\u884C test:e2e\uFF0C\u672A\u8FD0\u884C\u9879\u8BF4\u660E\u539F\u56E0\u3002\u5B89\u5168\u4E0E\u8D28\u91CF\u89C4\u5219\u65E2\u8981\u6309\u89C4\u8303\u5BA1\u67E5\uFF0C\u4E5F\u8981\u8FD0\u884C\u95E8\u7981\u9A8C\u8BC1\u3002
1625
1659
 
@@ -1815,6 +1849,18 @@ curl --fail http://127.0.0.1:8080/runtime-config.js
1815
1849
 
1816
1850
  \u5DF2\u542F\u7528\u524D\u7AEF\uFF1A${enabledFrontends || "Web / App / Desktop"}
1817
1851
 
1852
+ ## \u9ED8\u8BA4\u7BA1\u7406\u529F\u80FD
1853
+
1854
+ \u9ED8\u8BA4\u542F\u7528 IAM\u3001reldb\u3001cache\u3001audit\u3001storage \u548C crypto\u3002\u7BA1\u7406\u5458\u53EF\u4EE5\u7BA1\u7406\u7528\u6237\uFF08\u65B0\u589E\u3001\u7F16\u8F91\u3001\u7981\u7528\u3001\u5220\u9664\u3001\u89D2\u8272\u5206\u914D\u3001\u5934\u50CF\u4E0A\u4F20\uFF09\u3001\u67E5\u770B\u4E24\u79CD\u56FA\u5B9A\u89D2\u8272\u53CA\u4EBA\u6570\u3001\u7EF4\u62A4\u89D2\u8272\u8BF4\u660E\u3001\u5206\u9875\u7B5B\u9009\u5BA1\u8BA1\u65E5\u5FD7\uFF1B\u666E\u901A\u7528\u6237\u53EA\u80FD\u7EF4\u62A4\u4E2A\u4EBA\u8D44\u6599\u3001\u5934\u50CF\u3001\u8BED\u8A00\u3001\u4E3B\u9898\u548C\u5BC6\u7801\u3002\u5BC6\u7801\u4FEE\u6539\u540E\u5168\u90E8\u4F1A\u8BDD\u5931\u6548\uFF0C\u9700\u8981\u91CD\u65B0\u767B\u5F55\u3002
1855
+
1856
+ CLI \u5DF2\u5728\u6839\u76EE\u5F55\u751F\u6210 \`.env\`\uFF0C\u5176\u4E2D \`HAI_ADMIN_DEFAULT_PASSWORD\` \u662F\u6BCF\u4E2A\u9879\u76EE\u72EC\u7ACB\u751F\u6210\u7684\u968F\u673A\u5F3A\u5BC6\u7801\u3002\u76F4\u63A5\u8FD0\u884C \`dev\` / \`start\` \u5373\u53EF\uFF0C\u9996\u6B21\u767B\u5F55\u4F7F\u7528\u7528\u6237\u540D \`admin\` \u548C\u8BE5\u5BC6\u7801\uFF1B\u4E5F\u53EF\u901A\u8FC7\u540C\u540D\u73AF\u5883\u53D8\u91CF\u8986\u76D6\u3002\u5BC6\u7801\u987B\u6EE1\u8DB3 \`_iam.yml\` \u7B56\u7565\uFF0C\u542F\u52A8\u5931\u8D25\u4F1A\u663E\u793A\u5177\u4F53\u6821\u9A8C\u539F\u56E0\u53CA\u9519\u8BEF\u7801\u3002\`.env\` \u5DF2\u88AB Git \u548C\u5BB9\u5668\u6784\u5EFA\u5FFD\u7565\uFF0C\`.env.example\` \u4E0D\u542B\u771F\u5B9E\u5BC6\u7801\uFF1B\u90E8\u7F72\u65F6\u8BBE\u7F6E\u76EE\u6807\u73AF\u5883\u81EA\u5DF1\u7684\u5BC6\u7801\u3002\u5DF2\u6709\u7528\u6237\u65F6\u4E0D\u4F1A\u91CD\u590D\u521B\u5EFA\u7BA1\u7406\u5458\u6216\u91CD\u8BBE\u5BC6\u7801\u3002
1857
+
1858
+ \u672C\u5730\u5F00\u53D1\u9ED8\u8BA4 \`PUBLIC_API_BASE=http://127.0.0.1:3000\`\uFF0CVite \u4F7F\u7528\u540C\u6E90\u4EE3\u7406\uFF1B\u90E8\u7F72\u65F6\u6539\u4E3A\u5B9E\u9645\u516C\u7F51 API Origin\uFF0CAndroid \u6A21\u62DF\u5668\u8BBF\u95EE\u5BBF\u4E3B\u673A\u65F6\u4F7F\u7528 \`http://10.0.2.2:3000\`\u3002\u4E0D\u8981\u5C06\u5BC6\u94A5\u653E\u5165\u4EFB\u4F55 \`PUBLIC_\` \u6216 \`VITE_\` \u53D8\u91CF\u3002
1859
+
1860
+ \u6240\u6709\u4E1A\u52A1 JSON \u8BF7\u6C42\u548C\u54CD\u5E94\u9ED8\u8BA4\u901A\u8FC7 \`@h-ai/crypto\` transport \u53CC\u5411\u52A0\u5BC6\uFF08\u542B\u767B\u5F55\u3001\u5237\u65B0\u3001\u5934\u50CF\u4E0A\u4F20\uFF09\uFF1B\u524D\u7AEF\u7EDF\u4E00\u4F7F\u7528\u5171\u4EAB typed API client\u3002Web \u8BBF\u95EE\u4EE4\u724C\u4EC5\u5B58\u5185\u5B58\u3001\u5237\u65B0\u4EE4\u724C\u7531 HttpOnly Cookie \u4FDD\u5B58\uFF1B\u53D7\u4FE1\u539F\u751F\u7AEF\u4F7F\u7528\u5E73\u53F0\u5B89\u5168\u5B58\u50A8\u6216\u5185\u5B58\u3002\u5934\u50CF\u4E3A\u968F\u673A\u8DEF\u5F84\u53EA\u8BFB\u56FE\u7247\u8D44\u6E90\uFF0C\u652F\u6301 PNG/JPEG/WebP\uFF0C\u6700\u5927 512 KiB\u3002\u5065\u5EB7\u68C0\u67E5\u548C\u53EA\u8BFB\u5934\u50CF\u56FE\u7247\u53EF\u76F4\u63A5\u8BBF\u95EE\u3002
1861
+
1862
+ \u5E94\u7528\u663E\u793A\u540D\u79F0\u3001\u7248\u672C\u3001\u73AF\u5883\u3001\u9ED8\u8BA4\u8BED\u8A00\u548C\u65E5\u5FD7\u8BBE\u7F6E\u6765\u81EA\u540E\u7AEF \`config/_core.yml\`\uFF0C\u524D\u7AEF\u901A\u8FC7 \`app.info\` \u83B7\u53D6\u5B89\u5168\u5143\u4FE1\u606F\u3002\u9ED8\u8BA4 SQLite\u3001\u672C\u5730\u5B58\u50A8\u4E0E\u5185\u5B58\u7F13\u5B58\u9002\u5408\u5355\u5B9E\u4F8B\uFF0C\u7BA1\u7406\u5199\u5165\u4EC5\u652F\u6301\u5355\u5199\u5B9E\u4F8B\uFF1B\u591A\u5B9E\u4F8B\u8BFB\u53D6\u53EF\u4F7F\u7528\u5171\u4EAB\u6570\u636E\u5E93\u3001Redis cache \u548C S3 \u5B58\u50A8\uFF0C\u4F46\u7BA1\u7406\u5199\u8BF7\u6C42\u987B\u7EDF\u4E00\u8DEF\u7531\u5230\u540C\u4E00\u5199\u5B9E\u4F8B\u3002\u53E6\u9700\u4F1A\u8BDD\u7C98\u6027\u8DEF\u7531\u4F7F\u8BF7\u6C42\u547D\u4E2D\u540C\u4E00\u8FDB\u7A0B\u5185\u4F20\u8F93\u79C1\u94A5\uFF0C\u670D\u52A1\u91CD\u542F\u540E\u5BA2\u6237\u7AEF\u91CD\u65B0\u534F\u5546\u3002\u751F\u4EA7\u9700\u663E\u5F0F\u914D\u7F6E\u5141\u8BB8\u7684 CORS Origin\u3002\u4E1A\u52A1\u63D0\u4EA4\u540E\u7684\u5BA1\u8BA1\u5199\u5165\u91C7\u7528\u6700\u5927\u52AA\u529B\uFF0C\u5931\u8D25\u8BB0\u5F55\u7ED3\u6784\u5316\u9519\u8BEF\u65E5\u5FD7\uFF0C\u4FDD\u7559\u5DF2\u5B8C\u6210\u4E1A\u52A1\u7684\u539F\u59CB\u7ED3\u679C\u3002
1863
+
1818
1864
  ## \u5F00\u53D1\u3001\u7F16\u8BD1\u4E0E\u6253\u5305
1819
1865
 
1820
1866
  \`\`\`bash
@@ -1864,8 +1910,6 @@ ${webRunCommand}
1864
1910
  \`\`\`bash
1865
1911
  curl --fail http://127.0.0.1:3000/health
1866
1912
  curl --fail http://127.0.0.1:3000/ready
1867
- curl --fail --request POST http://127.0.0.1:3000/api/v1/app/info \\
1868
- --header "Content-Type: application/json" --data '{}'
1869
1913
  ${webTestCommands}docker stop ${containerNames}
1870
1914
  \`\`\`
1871
1915
 
@@ -1935,6 +1979,8 @@ function printCompletionMessage(options) {
1935
1979
  }
1936
1980
  core.logger.info("\u4E0B\u4E00\u6B65\uFF1A");
1937
1981
  core.logger.info(chalk.cyan(` cd ${options.name}`));
1982
+ if (options.appType === "fullstack")
1983
+ core.logger.info(chalk.cyan(cliM("cli_adminPasswordSaved")));
1938
1984
  if (!options.install) {
1939
1985
  core.logger.info(chalk.cyan(` ${getInstallCommand(options.packageManager)}`));
1940
1986
  }
@@ -2028,7 +2074,7 @@ async function addModule(options) {
2028
2074
  core.logger.info(`\u53EF\u7528\u6A21\u5757: ${Object.keys(MODULE_MAP).join(", ")}`);
2029
2075
  return;
2030
2076
  }
2031
- const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates-ZYXES3NT.js');
2077
+ const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates-45CK4RQ2.js');
2032
2078
  if (moduleDef.packages.every((p) => project.haiPackages.includes(p))) {
2033
2079
  const generatedFiles2 = await generateProjectAiSupport(
2034
2080
  cwd,
@@ -2142,7 +2188,7 @@ async function deployCommand(options) {
2142
2188
  try {
2143
2189
  let deployModule;
2144
2190
  try {
2145
- deployModule = await import('./src-TBIET7YU.js');
2191
+ deployModule = await import('./src-DUGLX4YB.js');
2146
2192
  } catch {
2147
2193
  core.logger.error(chalk.red(cliM("cli_deploy_module_missing")));
2148
2194
  core.logger.info(chalk.cyan(" pnpm add @h-ai/deploy"));
@@ -2563,7 +2609,7 @@ async function initProject(options) {
2563
2609
  const { project, existing, missing } = result;
2564
2610
  spinner.succeed(`\u68C0\u6D4B\u5230\u9879\u76EE: ${chalk.cyan(project.name)}`);
2565
2611
  if (project.isHaiProject) {
2566
- const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates-ZYXES3NT.js');
2612
+ const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates-45CK4RQ2.js');
2567
2613
  const generatedFiles = await generateProjectAiSupport(cwd, resolveSkillNamesForPackages(project.haiPackages), {
2568
2614
  overwriteSkills: false,
2569
2615
  overwriteBridgeFiles: false