@h-ai/cli 0.1.0-alpha.57 → 0.1.0-alpha.59

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 (177) hide show
  1. package/README.en.md +70 -21
  2. package/README.ja.md +70 -21
  3. package/README.md +70 -21
  4. package/dist/chunk-2H7UOFLK.js +0 -0
  5. package/dist/{chunk-O3ANVICQ.js → chunk-WUSFJFW5.js} +13 -7
  6. package/dist/chunk-WUSFJFW5.js.map +1 -0
  7. package/dist/{chunk-MJGUBOAV.js → chunk-WWG3U5ZD.js} +24 -42
  8. package/dist/chunk-WWG3U5ZD.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-2KDUACT6.js} +3 -3
  12. package/dist/{cli-skill-templates-ZYXES3NT.js.map → cli-skill-templates-2KDUACT6.js.map} +1 -1
  13. package/dist/index.js +192 -125
  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 +19 -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/SKILL.md +2 -0
  151. package/templates/skills/hai-app-create/development.md +21 -0
  152. package/templates/skills/hai-build/reference.md +4 -2
  153. package/templates/skills/hai-core/SKILL.md +2 -0
  154. package/templates/skills/hai-core/reference.md +6 -4
  155. package/templates/skills/hai-deploy/SKILL.md +2 -0
  156. package/templates/skills/hai-framework-sync/SKILL.md +5 -2
  157. package/templates/skills/hai-serv/SKILL.md +1 -0
  158. package/templates/skills/hai-serv/reference.md +3 -1
  159. package/templates/skills/hai-ui/SKILL.md +6 -0
  160. package/templates/skills/hai-ui/reference.md +7 -4
  161. package/templates/skills/hai-vecdb/reference.md +53 -49
  162. package/dist/chunk-MJGUBOAV.js.map +0 -1
  163. package/dist/chunk-O3ANVICQ.js.map +0 -1
  164. package/dist/cli-config-templates-OWBEGBZQ.js +0 -5
  165. package/dist/src-TBIET7YU.js.map +0 -1
  166. package/templates/apps/fullstack/apps/{{projectName}}-app/tests/api.test.ts.hbs +0 -28
  167. package/templates/apps/fullstack/apps/{{projectName}}-desktop/tests/api.test.ts.hbs +0 -28
  168. package/templates/apps/fullstack/apps/{{projectName}}-web/tests/api.test.ts.hbs +0 -55
  169. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/LanguageSwitcher.svelte.hbs +0 -27
  170. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/ThemeSwitcher.svelte.hbs +0 -18
  171. package/templates/skills/bridges/admin/CLAUDE.md +0 -15
  172. package/templates/skills/bridges/api/CLAUDE.md +0 -15
  173. package/templates/skills/bridges/fullstack/CLAUDE.md.hbs +0 -9
  174. package/templates/skills/bridges/h5/CLAUDE.md +0 -15
  175. package/templates/skills/bridges/mobile-app/CLAUDE.md +0 -15
  176. package/templates/skills/bridges/website/CLAUDE.md +0 -15
  177. package/templates/skills/claude-skill.md.hbs +0 -7
package/dist/index.js CHANGED
@@ -1,24 +1,40 @@
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-WWG3U5ZD.js';
4
4
  import './chunk-2H7UOFLK.js';
5
- import process3 from 'process';
6
- import { core } from '@h-ai/core';
5
+ import process4 from 'process';
7
6
  import { cac } from 'cac';
8
7
  import chalk from 'chalk';
9
8
  import path2, { resolve } from 'path';
10
9
  import { fileURLToPath } from 'url';
10
+ import { wrapAnsi } from 'fast-wrap-ansi';
11
11
  import fse from 'fs-extra';
12
- import Handlebars from 'handlebars';
12
+ import Handlebars2 from 'handlebars';
13
+ import { core } from '@h-ai/core';
13
14
  import ora from 'ora';
14
15
  import prompts from 'prompts';
15
16
  import { Buffer } from 'buffer';
16
17
  import { execSync, execFileSync } from 'child_process';
18
+ import { randomBytes } from 'crypto';
19
+ import { stringify, parse } from 'yaml';
17
20
  import { existsSync, readFileSync } from 'fs';
18
- import { parse } from 'yaml';
19
21
 
20
22
  var CAMEL_CASE_SEPARATOR_REGEX = /[-_\s]+(.)?/g;
21
23
  var LEADING_CHAR_REGEX = /^./;
24
+ function writeCliMessage(message) {
25
+ process4.stdout.write(`${message}
26
+ `);
27
+ }
28
+ function writeCliError(message, error) {
29
+ process4.stderr.write(`${message}
30
+ `);
31
+ if (error !== void 0)
32
+ process4.stderr.write(`${error instanceof Error ? error.message : String(error)}
33
+ `);
34
+ }
35
+ function formatPromptDescription(description) {
36
+ return wrapAnsi(description, Math.max(1, (process4.stdout.columns || 80) - 32), { hard: true });
37
+ }
22
38
  function toCamelCase(str) {
23
39
  return str.replace(CAMEL_CASE_SEPARATOR_REGEX, (_, c) => c ? c.toUpperCase() : "").replace(LEADING_CHAR_REGEX, (c) => c.toLowerCase());
24
40
  }
@@ -79,26 +95,30 @@ async function detectPackageManager(cwd) {
79
95
  return "npm";
80
96
  }
81
97
  function registerHelpers() {
82
- Handlebars.registerHelper("if_eq", function(a, b, options) {
98
+ Handlebars2.registerHelper("if_eq", function(a, b, options) {
83
99
  return a === b ? options.fn(this) : options.inverse(this);
84
100
  });
85
- Handlebars.registerHelper("date", () => {
101
+ Handlebars2.registerHelper("date", () => {
86
102
  return (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
87
103
  });
88
- Handlebars.registerHelper("year", () => {
104
+ Handlebars2.registerHelper("year", () => {
89
105
  return (/* @__PURE__ */ new Date()).getFullYear();
90
106
  });
91
- Handlebars.registerHelper("upper", (str) => {
107
+ Handlebars2.registerHelper("upper", (str) => {
92
108
  return str.toUpperCase();
93
109
  });
94
- Handlebars.registerHelper("lower", (str) => {
110
+ Handlebars2.registerHelper("lower", (str) => {
95
111
  return str.toLowerCase();
96
112
  });
97
113
  }
98
114
  registerHelpers();
99
- Handlebars.registerHelper("if_eq", function(a, b, options) {
115
+ Handlebars2.registerHelper("if_eq", function(a, b, options) {
100
116
  return a === b ? options.fn(this) : options.inverse(this);
101
117
  });
118
+ Handlebars2.registerHelper("json", (value) => JSON.stringify(value));
119
+ Handlebars2.registerHelper("html", (value) => Handlebars2.escapeExpression(value));
120
+ Handlebars2.registerHelper("yaml", (key, value) => stringify({ [key]: value }).trim());
121
+ Handlebars2.registerHelper("jsString", (value) => `'${JSON.stringify(value).slice(1, -1).replace(/\\"/g, '"').replace(/'/g, "\\'")}'`);
102
122
  var TEMPLATE_SKIP_IF_EMPTY_MARKER = "@skipIfEmpty";
103
123
  var NORMALIZED_RENDER_EXTENSIONS = /* @__PURE__ */ new Set([".ts", ".js", ".svelte", ".json", ".css"]);
104
124
  var CAPACITOR_SKIPPED_SERVER_FILES = /* @__PURE__ */ new Set([
@@ -106,53 +126,56 @@ var CAPACITOR_SKIPPED_SERVER_FILES = /* @__PURE__ */ new Set([
106
126
  "src/lib/server/init.ts"
107
127
  ]);
108
128
  var VERSIONS = {
109
- antfuEslintConfig: "^9.0.0",
110
- capacitorSecureStorage: "^8.0.0",
129
+ antfuEslintConfig: "^9.5.1",
130
+ capacitorSecureStorage: "^8.0.1",
111
131
  // UI / Icon
112
- bitsUi: "^2.18.1",
113
- iconifyJsonTabler: "^1.2.35",
132
+ bitsUi: "^2.19.5",
133
+ iconifyJsonTabler: "^1.2.42",
114
134
  iconifyTailwind: "^1.2.3",
115
135
  // 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",
136
+ capacitorAndroid: "^8.5.3",
137
+ capacitorApp: "^8.1.2",
138
+ capacitorCamera: "^8.2.5",
139
+ capacitorCli: "^8.5.3",
140
+ capacitorCore: "^8.5.3",
141
+ capacitorDevice: "^8.0.3",
142
+ capacitorIos: "^8.5.3",
123
143
  capacitorPreferences: "^8.0.1",
124
- capacitorPushNotifications: "^8.0.1",
125
- capacitorStatusBar: "^8.0.1",
144
+ capacitorPushNotifications: "^8.1.3",
145
+ capacitorStatusBar: "^8.0.4",
126
146
  // Tailwind / DaisyUI
127
- daisyui: "^5.5.20",
128
- tailwindcss: "^4.3.0",
129
- tailwindcssVite: "^4.3.0",
147
+ daisyui: "^5.7.47",
148
+ tailwindcss: "^4.3.3",
149
+ tailwindcssVite: "^4.3.3",
130
150
  // i18n
131
- inlangParaglide: "^2.18.1",
132
- inlangMessageFormat: "^4.4.0",
151
+ inlangParaglide: "^2.27.0",
152
+ inlangMessageFormat: "^4.5.0",
133
153
  // Svelte / Vite
134
- svelte: "^5.55.9",
135
- svelteCheck: "^4.4.8",
136
- sveltePlugin: "^7.1.2",
154
+ svelte: "^5.57.2",
155
+ svelteKit: "^2.70.3",
156
+ svelteAdapterNode: "^5.5.7",
157
+ svelteCheck: "^4.7.6",
158
+ sveltePlugin: "^7.3.1",
137
159
  // Build / Test
138
- vite: "^8.0.14",
139
- vitest: "^4.1.7",
160
+ vite: "^8.3.4",
161
+ vitest: "^4.1.11",
140
162
  tsup: "^8.5.1",
141
163
  rimraf: "^6.1.3",
142
164
  // ESLint
143
- eslint: "^10.4.0",
165
+ eslint: "^10.12.0",
144
166
  eslintPluginFormat: "^2.0.1",
145
- eslintPluginSvelte: "^3.17.1",
146
- svelteEslintParser: "^1.6.1",
167
+ eslintPluginSvelte: "^3.23.1",
168
+ svelteEslintParser: "^1.9.0",
147
169
  // Node / TS
148
- nodeTypes: "^25.9.1",
170
+ nodeTypes: "^26.6.5",
171
+ // Svelte / ESLint / tsup 继续使用稳定的 JavaScript 编译 API。
149
172
  typescript: "^6.0.3",
150
173
  // E2E
151
- playwright: "^1.60.0",
174
+ playwright: "^1.64.0",
152
175
  // Validation
153
- zod: "^4.4.3",
176
+ zod: "^4.6.5",
154
177
  // Tauri
155
- tauriCli: "^2.10.1"
178
+ tauriCli: "^2.12.1"
156
179
  };
157
180
  var FRONTEND_PORTS_DEFAULT = {
158
181
  web: 4173,
@@ -169,7 +192,7 @@ var IMPLEMENTED_FRONTENDS = ["web", "app", "desktop"];
169
192
  var DEFAULT_FULLSTACK_FRONTENDS = ["web", "app", "desktop"];
170
193
  var DEFAULT_THEMES = ["light", "dark"];
171
194
  var DEFAULT_THEME_NAME = "light";
172
- var HAI_PACKAGE_VERSION = `^${getCliVersion()}`;
195
+ var HAI_PACKAGE_VERSION = getCliVersion();
173
196
  var HAI_PACKAGE_SPECIFIER_CATALOG = "catalog:";
174
197
  var HAI_CATALOG_PACKAGE_NAMES = [
175
198
  "@h-ai/ai",
@@ -261,11 +284,20 @@ var FULLSTACK_CONTRACT_CATALOG_PACKAGE_NAMES = [
261
284
  "zod"
262
285
  ];
263
286
  var FULLSTACK_SERV_CATALOG_PACKAGE_NAMES = [
287
+ "@h-ai/audit",
288
+ "@h-ai/cache",
264
289
  "@h-ai/core",
265
- "@h-ai/serv"
290
+ "@h-ai/crypto",
291
+ "@h-ai/iam",
292
+ "@h-ai/reldb",
293
+ "@h-ai/serv",
294
+ "@h-ai/storage",
295
+ "zod"
266
296
  ];
267
297
  var FULLSTACK_SHARED_CATALOG_PACKAGE_NAMES = [
268
298
  "@h-ai/api-client",
299
+ "@h-ai/core",
300
+ "@h-ai/crypto",
269
301
  "@h-ai/ui",
270
302
  "@inlang/paraglide-js",
271
303
  "@inlang/plugin-message-format",
@@ -534,6 +566,9 @@ function buildTemplateContext(options) {
534
566
  for (const f of options.features) {
535
567
  featureMap[f] = true;
536
568
  }
569
+ if (options.appType === "fullstack") {
570
+ for (const feature of ["iam", "db", "cache", "crypto", "storage", "audit"]) featureMap[feature] = true;
571
+ }
537
572
  if (featureMap.iam) {
538
573
  featureMap.db = true;
539
574
  featureMap.cache = true;
@@ -564,6 +599,7 @@ function buildTemplateContext(options) {
564
599
  }
565
600
  return {
566
601
  projectName: options.name,
602
+ versions: VERSIONS,
567
603
  useCatalogProtocol,
568
604
  haiPackageSpecifier: useCatalogProtocol ? HAI_PACKAGE_SPECIFIER_CATALOG : HAI_PACKAGE_VERSION,
569
605
  haiPackageVersion: HAI_PACKAGE_VERSION,
@@ -610,6 +646,7 @@ function buildFullstackTemplateContext(projectName, frontendsInput, moduleConfig
610
646
  port: portFor(target)
611
647
  }));
612
648
  return {
649
+ appName: moduleConfigs?.core?.name ?? projectName,
613
650
  versions: VERSIONS,
614
651
  packageSpecifiers: buildFullstackPackageSpecifiers(useCatalogProtocol),
615
652
  contractPackageName: `${projectName}-contract`,
@@ -688,7 +725,7 @@ async function generateFromTemplates(projectPath, context) {
688
725
  const appExcludes = context.hasI18n ? [] : ["messages"];
689
726
  await copyStaticDir(appDir, projectPath, appExcludes);
690
727
  }
691
- if (!context.isApiWorkspace) {
728
+ if (!context.isApiWorkspace && context.appType !== "fullstack") {
692
729
  for (const featureId of Object.keys(context.features)) {
693
730
  if (context.isSvelteOnlyApp) {
694
731
  continue;
@@ -742,7 +779,7 @@ async function renderDynamicFiles(templatesRoot, projectPath, context) {
742
779
  await renderHbsInDir(dir, projectPath, context);
743
780
  await copyRenderedStaticPathFiles(dir, projectPath, context);
744
781
  }
745
- if (context.isApiWorkspace) {
782
+ if (context.isApiWorkspace || context.appType === "fullstack") {
746
783
  return;
747
784
  }
748
785
  const routesDest = path2.join(projectPath, "src", "routes");
@@ -780,7 +817,7 @@ async function renderHbsInDir(dir, destRoot, context) {
780
817
  const srcPath = path2.join(dir, relPath);
781
818
  const outRelPathTemplate = relPath.replace(HBS_SUFFIX_REGEX, "");
782
819
  const template = await fse.readFile(srcPath, "utf-8");
783
- const compiled = Handlebars.compile(template, { noEscape: true });
820
+ const compiled = Handlebars2.compile(template, { noEscape: true });
784
821
  const rendered = compiled(context);
785
822
  if (shouldSkipRenderedFile(template, rendered)) {
786
823
  continue;
@@ -841,7 +878,7 @@ function shouldSkipRenderedFile(template, rendered) {
841
878
  }
842
879
  function renderOutputPath(pathTemplate, context) {
843
880
  const normalizedTemplate = pathTemplate.split(path2.sep).join("/");
844
- return Handlebars.compile(normalizedTemplate, { noEscape: true })(context);
881
+ return Handlebars2.compile(normalizedTemplate, { noEscape: true })(context);
845
882
  }
846
883
  function isSafeRelativePath(relativePath) {
847
884
  const normalized = path2.normalize(relativePath);
@@ -879,8 +916,8 @@ var APP_TYPES = {
879
916
  },
880
917
  "fullstack": {
881
918
  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: []
919
+ 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",
920
+ defaultFeatures: ["iam", "db", "cache", "crypto", "storage", "audit"]
884
921
  }
885
922
  };
886
923
  var FRONTEND_TARGETS = {
@@ -1047,7 +1084,7 @@ async function createProject(options) {
1047
1084
  try {
1048
1085
  const resolvedOptions = await resolveOptions(options);
1049
1086
  if (!PROJECT_NAME_REGEX.test(resolvedOptions.name)) {
1050
- core.logger.error(chalk.red(`\u9879\u76EE\u540D\u79F0\u4E0D\u5408\u6CD5: "${resolvedOptions.name}"\uFF0C\u53EA\u80FD\u5305\u542B\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u548C\u8FDE\u5B57\u7B26`));
1087
+ writeCliError(chalk.red(`\u9879\u76EE\u540D\u79F0\u4E0D\u5408\u6CD5: "${resolvedOptions.name}"\uFF0C\u53EA\u80FD\u5305\u542B\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u548C\u8FDE\u5B57\u7B26`));
1051
1088
  return;
1052
1089
  }
1053
1090
  const projectPath = path2.resolve(resolvedOptions.cwd ?? ".", resolvedOptions.name);
@@ -1059,7 +1096,7 @@ async function createProject(options) {
1059
1096
  initial: false
1060
1097
  });
1061
1098
  if (!overwrite) {
1062
- core.logger.info(chalk.yellow("\u5DF2\u53D6\u6D88"));
1099
+ writeCliMessage(chalk.yellow("\u5DF2\u53D6\u6D88"));
1063
1100
  return;
1064
1101
  }
1065
1102
  await fse.remove(projectPath);
@@ -1077,20 +1114,21 @@ async function createProject(options) {
1077
1114
  packageManager: resolvedOptions.packageManager
1078
1115
  });
1079
1116
  await generateFromTemplates(projectPath, context);
1080
- if (resolvedOptions.appType !== "fullstack") {
1081
- const { generateConfigFile: generateConfigFile2, generateEnvExample } = await import('./cli-config-templates-OWBEGBZQ.js');
1117
+ {
1118
+ const { generateConfigFile: generateConfigFile2, generateEnvExample } = await import('./cli-config-templates-6XA7V6CC.js');
1082
1119
  const configs = resolvedOptions.moduleConfigs;
1083
1120
  const isApiWorkspace = resolvedOptions.appType === "api";
1084
- const configDir = isApiWorkspace ? path2.join(projectPath, "apps", `${resolvedOptions.name}-service`, "config") : path2.join(projectPath, "config");
1121
+ const isFullstack = resolvedOptions.appType === "fullstack";
1122
+ 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
1123
  const envExamplePath = isApiWorkspace ? path2.join(projectPath, "apps", `${resolvedOptions.name}-service`, ".env.example") : path2.join(projectPath, ".env.example");
1086
1124
  for (const featureId of resolvedOptions.features) {
1087
1125
  const configKey = getFeatureConfigKey(featureId);
1088
1126
  if (configKey) {
1089
- const content = generateConfigFile2(configKey, configs);
1127
+ const content = isFullstack && configKey === "iam" ? generateConfigFile2(configKey, configs).replace("seedDefaultData: true", "seedDefaultData: false") : generateConfigFile2(configKey, configs);
1090
1128
  await writeFile(path2.join(configDir, `_${configKey}.yml`), content);
1091
1129
  }
1092
1130
  }
1093
- if (!isApiWorkspace) {
1131
+ if (!isApiWorkspace && !isFullstack) {
1094
1132
  await writeFile(
1095
1133
  path2.join(configDir, "_core.yml"),
1096
1134
  generateConfigFile2("core", configs)
@@ -1101,10 +1139,21 @@ async function createProject(options) {
1101
1139
  # Service Runtime
1102
1140
  # =============================================================================
1103
1141
  PORT=3000
1142
+ ` : isFullstack ? `${generateEnvExample(resolvedOptions.features, configs)}
1143
+ # First-start administrator password. The CLI generates a random value in .env.
1144
+ HAI_ADMIN_DEFAULT_PASSWORD=
1145
+
1146
+ # Local development API. Use your public API origin for deployment/native clients.
1147
+ PUBLIC_API_BASE=http://127.0.0.1:3000
1104
1148
  ` : generateEnvExample(resolvedOptions.features, configs);
1105
1149
  await writeFile(envExamplePath, envExample);
1150
+ if (isFullstack) {
1151
+ const password = `Aa1!${randomBytes(24).toString("base64url")}`;
1152
+ await fse.writeFile(path2.join(projectPath, ".env"), envExample.replace("HAI_ADMIN_DEFAULT_PASSWORD=\n", `HAI_ADMIN_DEFAULT_PASSWORD=${password}
1153
+ `), { mode: 384 });
1154
+ }
1106
1155
  }
1107
- const { generateSkillFiles } = await import('./cli-skill-templates-ZYXES3NT.js');
1156
+ const { generateSkillFiles } = await import('./cli-skill-templates-2KDUACT6.js');
1108
1157
  await generateSkillFiles(
1109
1158
  projectPath,
1110
1159
  resolvedOptions.features,
@@ -1139,19 +1188,19 @@ PORT=3000
1139
1188
  printCompletionMessage(resolvedOptions);
1140
1189
  } catch (error) {
1141
1190
  spinner.fail();
1142
- core.logger.error(chalk.red("\u521B\u5EFA\u9879\u76EE\u5931\u8D25:"), { error });
1191
+ writeCliError(chalk.red(cliM("cli_createFailed")), error);
1143
1192
  throw error;
1144
1193
  }
1145
1194
  }
1146
1195
  async function resolveOptions(options) {
1147
1196
  const useDefaults = options.yes ?? false;
1148
- core.logger.info("", {});
1149
- core.logger.info(chalk.bold.cyan(" \u{1F680} hai Agent Framework"));
1150
- core.logger.info(chalk.gray(" AI-Native \xB7 Configuration-Driven \xB7 Security-First"));
1151
- core.logger.info("", {});
1197
+ writeCliMessage("");
1198
+ writeCliMessage(chalk.bold.cyan(" \u{1F680} hai Agent Framework"));
1199
+ writeCliMessage(chalk.gray(" AI-Native \xB7 Configuration-Driven \xB7 Security-First"));
1200
+ writeCliMessage("");
1152
1201
  const onCancel = () => {
1153
- core.logger.info(chalk.red("\n\u5DF2\u53D6\u6D88"));
1154
- process3.exit(1);
1202
+ writeCliMessage(chalk.red("\n\u5DF2\u53D6\u6D88"));
1203
+ process4.exit(1);
1155
1204
  };
1156
1205
  let projectName = options.name;
1157
1206
  if (!projectName && useDefaults) {
@@ -1180,8 +1229,10 @@ async function resolveOptions(options) {
1180
1229
  type: "select",
1181
1230
  name: "appType",
1182
1231
  message: "\u5E94\u7528\u7C7B\u578B:",
1232
+ hint: cliM("cli_selectHint"),
1183
1233
  choices: Object.entries(APP_TYPES).map(([key, t]) => ({
1184
- title: `${chalk.bold(t.name.padEnd(10))} ${chalk.gray(t.description)}`,
1234
+ title: t.name,
1235
+ description: formatPromptDescription(t.description),
1185
1236
  value: key
1186
1237
  })),
1187
1238
  initial: 0
@@ -1201,8 +1252,10 @@ async function resolveOptions(options) {
1201
1252
  type: "select",
1202
1253
  name: "template",
1203
1254
  message: "\u9009\u62E9\u6A21\u677F:",
1255
+ hint: cliM("cli_selectHint"),
1204
1256
  choices: Object.values(PROJECT_TEMPLATES).map((t) => ({
1205
- title: `${chalk.bold(t.name.padEnd(10))} ${chalk.gray(t.description)}`,
1257
+ title: t.name,
1258
+ description: formatPromptDescription(t.description),
1206
1259
  value: t.name
1207
1260
  })),
1208
1261
  initial: 1
@@ -1213,21 +1266,22 @@ async function resolveOptions(options) {
1213
1266
  let selectedFeatures = [];
1214
1267
  const appTypeDefaults = APP_TYPES[selectedAppType].defaultFeatures;
1215
1268
  if (selectedAppType === "fullstack") {
1216
- selectedFeatures = [];
1269
+ selectedFeatures = resolveFeatureDependencies(appTypeDefaults);
1217
1270
  } else if (selectedTemplate === "custom" && !options.features && useDefaults) {
1218
1271
  selectedFeatures = resolveFeatureDependencies(appTypeDefaults);
1219
1272
  } else if (selectedTemplate === "custom" && !options.features) {
1220
1273
  const featureChoices = SELECTABLE_FEATURES.map((id) => ({
1221
- title: `${chalk.bold(FEATURES[id].name.padEnd(10))} ${chalk.gray(FEATURES[id].description)}`,
1274
+ title: FEATURES[id].name,
1275
+ description: formatPromptDescription(FEATURES[id].description),
1222
1276
  value: id,
1223
1277
  selected: appTypeDefaults.includes(id)
1224
1278
  }));
1225
1279
  const { features } = await prompts({
1226
1280
  type: "multiselect",
1227
1281
  name: "features",
1228
- message: "\u9009\u62E9\u529F\u80FD (\u7A7A\u683C\u9009\u62E9\uFF0C\u56DE\u8F66\u786E\u8BA4):",
1282
+ message: cliM("cli_featuresPrompt"),
1229
1283
  choices: featureChoices,
1230
- hint: "- \u7A7A\u683C\u9009\u62E9\uFF0C\u56DE\u8F66\u786E\u8BA4",
1284
+ hint: cliM("cli_multiselectHint"),
1231
1285
  instructions: false
1232
1286
  }, { onCancel });
1233
1287
  selectedFeatures = features || [];
@@ -1239,7 +1293,7 @@ async function resolveOptions(options) {
1239
1293
  const merged = /* @__PURE__ */ new Set([...templateFeatures, ...appTypeDefaults]);
1240
1294
  selectedFeatures = resolveFeatureDependencies(Array.from(merged));
1241
1295
  }
1242
- const moduleConfigs = selectedAppType === "fullstack" ? options.moduleConfigs ?? {} : options.moduleConfigs ?? (useDefaults ? buildDefaultModuleConfigs(selectedFeatures, projectName) : await promptModuleConfigs(selectedFeatures, projectName));
1296
+ const moduleConfigs = selectedAppType === "fullstack" ? { ...buildDefaultModuleConfigs(selectedFeatures, projectName), ...options.moduleConfigs } : options.moduleConfigs ?? (useDefaults ? buildDefaultModuleConfigs(selectedFeatures, projectName) : await promptModuleConfigs(selectedFeatures, projectName));
1243
1297
  let addExamples = options.examples;
1244
1298
  if (addExamples === void 0 && useDefaults) {
1245
1299
  addExamples = true;
@@ -1362,13 +1416,14 @@ async function resolveFrontendTargets(frontends, useDefaults, onCancel) {
1362
1416
  const { selectedFrontends } = await prompts({
1363
1417
  type: "multiselect",
1364
1418
  name: "selectedFrontends",
1365
- message: "\u9009\u62E9\u524D\u7AEF\u76EE\u6807 (\u7A7A\u683C\u9009\u62E9\uFF0C\u56DE\u8F66\u786E\u8BA4):",
1419
+ message: cliM("cli_frontendsPrompt"),
1366
1420
  choices: Object.entries(FRONTEND_TARGETS).map(([id, target]) => ({
1367
- title: `${chalk.bold(target.name.padEnd(8))} ${chalk.gray(target.description)}`,
1421
+ title: target.name,
1422
+ description: formatPromptDescription(target.description),
1368
1423
  value: id,
1369
1424
  selected: DEFAULT_FULLSTACK_FRONTENDS2.includes(id)
1370
1425
  })),
1371
- hint: "- \u5C0F\u7A0B\u5E8F\u5F53\u524D\u4E3A\u9884\u7559\u5360\u4F4D\uFF0C\u4E0D\u751F\u6210\u53EF\u8FD0\u884C\u5DE5\u7A0B",
1426
+ hint: cliM("cli_multiselectHint"),
1372
1427
  instructions: false
1373
1428
  }, { onCancel });
1374
1429
  return normalizeFrontendTargets(selectedFrontends ?? DEFAULT_FULLSTACK_FRONTENDS2);
@@ -1400,13 +1455,13 @@ function resolveFeatureDependencies(features) {
1400
1455
  async function promptModuleConfigs(features, projectName) {
1401
1456
  const configs = {};
1402
1457
  const onCancel = () => {
1403
- core.logger.info(chalk.red("\n\u5DF2\u53D6\u6D88"));
1404
- process3.exit(1);
1458
+ writeCliMessage(chalk.red("\n\u5DF2\u53D6\u6D88"));
1459
+ process4.exit(1);
1405
1460
  };
1406
- core.logger.info("");
1407
- core.logger.info(chalk.bold(" \u2699 \u6A21\u5757\u914D\u7F6E"));
1408
- core.logger.info(chalk.gray(" \u8BBE\u7F6E\u5173\u952E\u914D\u7F6E\u9879\uFF08\u56DE\u8F66\u4F7F\u7528\u9ED8\u8BA4\u503C\uFF09"));
1409
- core.logger.info("");
1461
+ writeCliMessage("");
1462
+ writeCliMessage(chalk.bold(" \u2699 \u6A21\u5757\u914D\u7F6E"));
1463
+ writeCliMessage(chalk.gray(" \u8BBE\u7F6E\u5173\u952E\u914D\u7F6E\u9879\uFF08\u56DE\u8F66\u4F7F\u7528\u9ED8\u8BA4\u503C\uFF09"));
1464
+ writeCliMessage("");
1410
1465
  configs.core = await promptCoreConfig(projectName, onCancel);
1411
1466
  if (features.includes("db")) {
1412
1467
  configs.db = await promptDbConfig(projectName, onCancel);
@@ -1426,7 +1481,7 @@ async function promptModuleConfigs(features, projectName) {
1426
1481
  return configs;
1427
1482
  }
1428
1483
  async function promptCoreConfig(projectName, onCancel) {
1429
- core.logger.info(chalk.cyan(" [core] \u5E94\u7528\u57FA\u7840\u914D\u7F6E"));
1484
+ writeCliMessage(chalk.cyan(" [core] \u5E94\u7528\u57FA\u7840\u914D\u7F6E"));
1430
1485
  const { defaultLocale } = await prompts({
1431
1486
  type: "select",
1432
1487
  name: "defaultLocale",
@@ -1440,7 +1495,7 @@ async function promptCoreConfig(projectName, onCancel) {
1440
1495
  return { name: projectName, defaultLocale };
1441
1496
  }
1442
1497
  async function promptDbConfig(projectName, onCancel) {
1443
- core.logger.info(chalk.cyan(" [db] \u6570\u636E\u5E93\u914D\u7F6E"));
1498
+ writeCliMessage(chalk.cyan(" [db] \u6570\u636E\u5E93\u914D\u7F6E"));
1444
1499
  const { type } = await prompts({
1445
1500
  type: "select",
1446
1501
  name: "type",
@@ -1469,7 +1524,7 @@ async function promptDbConfig(projectName, onCancel) {
1469
1524
  return { type, host: answers.host, port: answers.port, database: answers.database };
1470
1525
  }
1471
1526
  async function promptCacheConfig(onCancel) {
1472
- core.logger.info(chalk.cyan(" [cache] \u7F13\u5B58\u914D\u7F6E"));
1527
+ writeCliMessage(chalk.cyan(" [cache] \u7F13\u5B58\u914D\u7F6E"));
1473
1528
  const { type } = await prompts({
1474
1529
  type: "select",
1475
1530
  name: "type",
@@ -1489,7 +1544,7 @@ async function promptCacheConfig(onCancel) {
1489
1544
  return { type, host: answers.host, port: answers.port };
1490
1545
  }
1491
1546
  async function promptIamConfig(onCancel) {
1492
- core.logger.info(chalk.cyan(" [iam] \u8BA4\u8BC1\u6388\u6743\u914D\u7F6E"));
1547
+ writeCliMessage(chalk.cyan(" [iam] \u8BA4\u8BC1\u6388\u6743\u914D\u7F6E"));
1493
1548
  const answers = await prompts([
1494
1549
  { type: "confirm", name: "loginPassword", message: "\u542F\u7528\u5BC6\u7801\u767B\u5F55?", initial: true },
1495
1550
  { type: "confirm", name: "loginOtp", message: "\u542F\u7528 OTP \u9A8C\u8BC1\u7801\u767B\u5F55?", initial: false }
@@ -1497,7 +1552,7 @@ async function promptIamConfig(onCancel) {
1497
1552
  return { loginPassword: answers.loginPassword, loginOtp: answers.loginOtp };
1498
1553
  }
1499
1554
  async function promptStorageConfig(onCancel) {
1500
- core.logger.info(chalk.cyan(" [storage] \u6587\u4EF6\u5B58\u50A8\u914D\u7F6E"));
1555
+ writeCliMessage(chalk.cyan(" [storage] \u6587\u4EF6\u5B58\u50A8\u914D\u7F6E"));
1501
1556
  const { type } = await prompts({
1502
1557
  type: "select",
1503
1558
  name: "type",
@@ -1520,7 +1575,7 @@ async function promptStorageConfig(onCancel) {
1520
1575
  return { type };
1521
1576
  }
1522
1577
  async function promptAiConfig(onCancel) {
1523
- core.logger.info(chalk.cyan(" [ai] AI \u96C6\u6210\u914D\u7F6E"));
1578
+ writeCliMessage(chalk.cyan(" [ai] AI \u96C6\u6210\u914D\u7F6E"));
1524
1579
  const { defaultProvider } = await prompts({
1525
1580
  type: "select",
1526
1581
  name: "defaultProvider",
@@ -1581,21 +1636,21 @@ function installDependencies(projectPath, pm) {
1581
1636
  });
1582
1637
  } catch (error) {
1583
1638
  const details = formatCommandFailure(installCmd, error);
1584
- throw new Error(`\u5B89\u88C5\u4F9D\u8D56\u5931\u8D25\uFF08${pm}\uFF09\u3002
1639
+ throw new Error(`${cliM("cli_installFailed", { params: { pm } })}
1585
1640
  ${details}`);
1586
1641
  }
1587
1642
  }
1588
1643
  function formatCommandFailure(command, error) {
1589
1644
  if (!error || typeof error !== "object") {
1590
- return `\u547D\u4EE4: ${command}`;
1645
+ return cliM("cli_commandLabel", { params: { command } });
1591
1646
  }
1592
1647
  const failure = error;
1593
1648
  const stdout = normalizeChildOutput(failure.stdout);
1594
1649
  const stderr = normalizeChildOutput(failure.stderr);
1595
- const status = typeof failure.status === "number" ? `\u9000\u51FA\u7801: ${failure.status}` : "";
1596
- const signal = typeof failure.signal === "string" ? `\u4FE1\u53F7: ${failure.signal}` : "";
1650
+ const status = typeof failure.status === "number" ? cliM("cli_exitCode", { params: { code: failure.status } }) : "";
1651
+ const signal = typeof failure.signal === "string" ? cliM("cli_signal", { params: { signal: failure.signal } }) : "";
1597
1652
  const output = [
1598
- `\u547D\u4EE4: ${command}`,
1653
+ cliM("cli_commandLabel", { params: { command } }),
1599
1654
  status,
1600
1655
  signal,
1601
1656
  stderr ? `stderr:
@@ -1619,7 +1674,7 @@ function generateAiDevelopmentReadme() {
1619
1674
 
1620
1675
  \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
1676
 
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
1677
+ 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
1678
 
1624
1679
  \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
1680
 
@@ -1815,6 +1870,18 @@ curl --fail http://127.0.0.1:8080/runtime-config.js
1815
1870
 
1816
1871
  \u5DF2\u542F\u7528\u524D\u7AEF\uFF1A${enabledFrontends || "Web / App / Desktop"}
1817
1872
 
1873
+ ## \u9ED8\u8BA4\u7BA1\u7406\u529F\u80FD
1874
+
1875
+ \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
1876
+
1877
+ 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
1878
+
1879
+ \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
1880
+
1881
+ \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
1882
+
1883
+ \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
1884
+
1818
1885
  ## \u5F00\u53D1\u3001\u7F16\u8BD1\u4E0E\u6253\u5305
1819
1886
 
1820
1887
  \`\`\`bash
@@ -1864,8 +1931,6 @@ ${webRunCommand}
1864
1931
  \`\`\`bash
1865
1932
  curl --fail http://127.0.0.1:3000/health
1866
1933
  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
1934
  ${webTestCommands}docker stop ${containerNames}
1870
1935
  \`\`\`
1871
1936
 
@@ -1920,33 +1985,35 @@ ${generateAiDevelopmentReadme()}## \u6587\u6863
1920
1985
  `;
1921
1986
  }
1922
1987
  function printCompletionMessage(options) {
1923
- core.logger.info("", {});
1924
- core.logger.info(chalk.green("\u2714 \u9879\u76EE\u521B\u5EFA\u6210\u529F\uFF01"));
1925
- core.logger.info("", {});
1988
+ writeCliMessage("");
1989
+ writeCliMessage(chalk.green("\u2714 \u9879\u76EE\u521B\u5EFA\u6210\u529F\uFF01"));
1990
+ writeCliMessage("");
1926
1991
  if (options.features.length > 0) {
1927
- core.logger.info(chalk.bold("\u5DF2\u542F\u7528\u529F\u80FD:"));
1992
+ writeCliMessage(chalk.bold("\u5DF2\u542F\u7528\u529F\u80FD:"));
1928
1993
  for (const featureId of options.features) {
1929
1994
  const feature = FEATURES[featureId];
1930
1995
  if (feature) {
1931
- core.logger.info(chalk.gray(` \u2022 ${feature.name} (${featureId})`));
1996
+ writeCliMessage(chalk.gray(` \u2022 ${feature.name} (${featureId})`));
1932
1997
  }
1933
1998
  }
1934
- core.logger.info("", {});
1999
+ writeCliMessage("");
1935
2000
  }
1936
- core.logger.info("\u4E0B\u4E00\u6B65\uFF1A");
1937
- core.logger.info(chalk.cyan(` cd ${options.name}`));
2001
+ writeCliMessage("\u4E0B\u4E00\u6B65\uFF1A");
2002
+ writeCliMessage(chalk.cyan(` cd ${options.name}`));
2003
+ if (options.appType === "fullstack")
2004
+ writeCliMessage(chalk.cyan(cliM("cli_adminPasswordSaved")));
1938
2005
  if (!options.install) {
1939
- core.logger.info(chalk.cyan(` ${getInstallCommand(options.packageManager)}`));
2006
+ writeCliMessage(chalk.cyan(` ${getInstallCommand(options.packageManager)}`));
1940
2007
  }
1941
2008
  if (options.appType === "fullstack" || options.appType === "api") {
1942
- core.logger.info(chalk.cyan(` ${getRunCommand(options.packageManager, "dev")}`));
1943
- core.logger.info(chalk.cyan(` ${getRunCommand(options.packageManager, "typecheck")}`));
1944
- core.logger.info(chalk.cyan(` ${getRunCommand(options.packageManager, "test")}`));
1945
- core.logger.info(chalk.cyan(` ${getRunCommand(options.packageManager, "test:e2e")}`));
2009
+ writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, "dev")}`));
2010
+ writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, "typecheck")}`));
2011
+ writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, "test")}`));
2012
+ writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, "test:e2e")}`));
1946
2013
  } else {
1947
- core.logger.info(chalk.cyan(` ${getRunCommand(options.packageManager, "dev")}`));
2014
+ writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, "dev")}`));
1948
2015
  }
1949
- core.logger.info("", {});
2016
+ writeCliMessage("");
1950
2017
  }
1951
2018
  async function detectProject(cwd) {
1952
2019
  const pkgPath = path2.join(cwd, "package.json");
@@ -2028,7 +2095,7 @@ async function addModule(options) {
2028
2095
  core.logger.info(`\u53EF\u7528\u6A21\u5757: ${Object.keys(MODULE_MAP).join(", ")}`);
2029
2096
  return;
2030
2097
  }
2031
- const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates-ZYXES3NT.js');
2098
+ const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates-2KDUACT6.js');
2032
2099
  if (moduleDef.packages.every((p) => project.haiPackages.includes(p))) {
2033
2100
  const generatedFiles2 = await generateProjectAiSupport(
2034
2101
  cwd,
@@ -2065,7 +2132,7 @@ async function addModule(options) {
2065
2132
  if (!pkg.dependencies)
2066
2133
  pkg.dependencies = {};
2067
2134
  const existingHaiSpecifier = Object.entries(pkg.dependencies).find(([pkgName]) => pkgName.startsWith("@h-ai/"))?.[1];
2068
- const depVersion = existingHaiSpecifier === "catalog:" ? "catalog:" : `^${getCliVersion()}`;
2135
+ const depVersion = existingHaiSpecifier === "catalog:" ? "catalog:" : getCliVersion();
2069
2136
  for (const pkgName of allPackages) {
2070
2137
  if (!pkg.dependencies[pkgName]) {
2071
2138
  pkg.dependencies[pkgName] = depVersion;
@@ -2136,13 +2203,13 @@ async function addModule(options) {
2136
2203
  }
2137
2204
  async function deployCommand(options) {
2138
2205
  const spinner = ora();
2139
- const cwd = options.cwd ?? process3.cwd();
2206
+ const cwd = options.cwd ?? process4.cwd();
2140
2207
  const appDir = resolve(cwd, options.appDir ?? ".");
2141
2208
  let closeDeploy = null;
2142
2209
  try {
2143
2210
  let deployModule;
2144
2211
  try {
2145
- deployModule = await import('./src-TBIET7YU.js');
2212
+ deployModule = await import('./src-DUGLX4YB.js');
2146
2213
  } catch {
2147
2214
  core.logger.error(chalk.red(cliM("cli_deploy_module_missing")));
2148
2215
  core.logger.info(chalk.cyan(" pnpm add @h-ai/deploy"));
@@ -2212,14 +2279,14 @@ async function deployCommand(options) {
2212
2279
  await closeDeploy();
2213
2280
  } catch (error) {
2214
2281
  core.logger.error("Failed to close deploy module", { error });
2215
- process3.exitCode = 1;
2282
+ process4.exitCode = 1;
2216
2283
  }
2217
2284
  }
2218
2285
  }
2219
2286
  }
2220
2287
  function interpolateEnvFallback(content) {
2221
2288
  return content.replace(/\$\{([^:}]+)(?::([^}]*))?\}/g, (_match, key, defaultValue) => {
2222
- return process3.env[key] ?? defaultValue ?? "";
2289
+ return process4.env[key] ?? defaultValue ?? "";
2223
2290
  });
2224
2291
  }
2225
2292
  var GENERATORS = {
@@ -2563,7 +2630,7 @@ async function initProject(options) {
2563
2630
  const { project, existing, missing } = result;
2564
2631
  spinner.succeed(`\u68C0\u6D4B\u5230\u9879\u76EE: ${chalk.cyan(project.name)}`);
2565
2632
  if (project.isHaiProject) {
2566
- const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates-ZYXES3NT.js');
2633
+ const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates-2KDUACT6.js');
2567
2634
  const generatedFiles = await generateProjectAiSupport(cwd, resolveSkillNamesForPackages(project.haiPackages), {
2568
2635
  overwriteSkills: false,
2569
2636
  overwriteBridgeFiles: false
@@ -2667,7 +2734,7 @@ cli.command("create [name]", "\u521B\u5EFA\u65B0\u7684 hai \u9879\u76EE").option
2667
2734
  cwd: options.cwd
2668
2735
  });
2669
2736
  } catch {
2670
- process3.exit(1);
2737
+ process4.exitCode = 1;
2671
2738
  }
2672
2739
  });
2673
2740
  cli.command("add [module]", "\u5411\u73B0\u6709\u9879\u76EE\u6DFB\u52A0\u6A21\u5757").option("--no-install", "\u4E0D\u5B89\u88C5\u4F9D\u8D56").action(async (module, options) => {
@@ -2679,7 +2746,7 @@ cli.command("add [module]", "\u5411\u73B0\u6709\u9879\u76EE\u6DFB\u52A0\u6A21\u5
2679
2746
  cwd: options.cwd
2680
2747
  });
2681
2748
  } catch {
2682
- process3.exit(1);
2749
+ process4.exit(1);
2683
2750
  }
2684
2751
  });
2685
2752
  cli.command("init", "\u521D\u59CB\u5316/\u6821\u9A8C\u9879\u76EE\u914D\u7F6E").option("-f, --force", "\u5F3A\u5236\u91CD\u65B0\u751F\u6210\u914D\u7F6E").action(async (options) => {
@@ -2690,7 +2757,7 @@ cli.command("init", "\u521D\u59CB\u5316/\u6821\u9A8C\u9879\u76EE\u914D\u7F6E").o
2690
2757
  cwd: options.cwd
2691
2758
  });
2692
2759
  } catch {
2693
- process3.exit(1);
2760
+ process4.exit(1);
2694
2761
  }
2695
2762
  });
2696
2763
  cli.command("generate [type] [name]", "\u751F\u6210\u4EE3\u7801").alias("g").option("-o, --output <path>", "\u8F93\u51FA\u8DEF\u5F84").option("-f, --force", "\u8986\u76D6\u73B0\u6709\u6587\u4EF6").action(async (type, name, options) => {
@@ -2704,7 +2771,7 @@ cli.command("generate [type] [name]", "\u751F\u6210\u4EE3\u7801").alias("g").opt
2704
2771
  cwd: options.cwd
2705
2772
  });
2706
2773
  } catch {
2707
- process3.exit(1);
2774
+ process4.exit(1);
2708
2775
  }
2709
2776
  });
2710
2777
  cli.command("deploy [appDir]", "\u90E8\u7F72\u5E94\u7528\u5230\u4E91\u5E73\u53F0").option("--project-name <name>", "\u9879\u76EE\u540D\u79F0\uFF08\u9ED8\u8BA4\u4ECE package.json \u8BFB\u53D6\uFF09").option("--skip-provision", "\u8DF3\u8FC7\u57FA\u7840\u8BBE\u65BD\u5F00\u901A").option("--skip-build", "\u8DF3\u8FC7\u6784\u5EFA").action(async (appDir, options) => {
@@ -2718,7 +2785,7 @@ cli.command("deploy [appDir]", "\u90E8\u7F72\u5E94\u7528\u5230\u4E91\u5E73\u53F0
2718
2785
  cwd: options.cwd
2719
2786
  });
2720
2787
  } catch {
2721
- process3.exit(1);
2788
+ process4.exit(1);
2722
2789
  }
2723
2790
  });
2724
2791
  cli.command("g:page <name>", "\u751F\u6210\u9875\u9762").action(async (name, options) => {
@@ -2737,9 +2804,9 @@ cli.version(VERSION);
2737
2804
  cli.help();
2738
2805
  var parsed = cli.parse();
2739
2806
  if (!cli.matchedCommand && !parsed.options.help && !parsed.options.version) {
2740
- core.logger.info("", {});
2741
- core.logger.info(chalk.cyan("hai Agent Framework CLI"));
2742
- core.logger.info("", {});
2807
+ writeCliMessage("");
2808
+ writeCliMessage(chalk.cyan("hai Agent Framework CLI"));
2809
+ writeCliMessage("");
2743
2810
  cli.outputHelp();
2744
2811
  }
2745
2812
  //# sourceMappingURL=index.js.map