@h-ai/cli 0.1.0-alpha.56 → 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 (208) hide show
  1. package/README.en.md +239 -0
  2. package/README.ja.md +239 -0
  3. package/README.md +51 -1
  4. package/dist/chunk-2H7UOFLK.js +0 -0
  5. package/dist/chunk-F4IBPVZ5.js +355 -0
  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-ZIWYMS4Y.js → cli-skill-templates-45CK4RQ2.js} +3 -3
  12. package/dist/{cli-skill-templates-ZIWYMS4Y.js.map → cli-skill-templates-45CK4RQ2.js.map} +1 -1
  13. package/dist/index.js +134 -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 +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/.gitignore.hbs +13 -0
  23. package/templates/apps/api/.npmrc.hbs +1 -0
  24. package/templates/apps/api/Dockerfile.hbs +6 -5
  25. package/templates/apps/api/apps/{{projectName}}-contract/package.json.hbs +1 -1
  26. package/templates/apps/api/apps/{{projectName}}-contract/src/app-schemas.ts.hbs +2 -0
  27. package/templates/apps/api/apps/{{projectName}}-contract/tsup.config.ts.hbs +1 -1
  28. package/templates/apps/api/apps/{{projectName}}-service/config/_core.yml.hbs +8 -0
  29. package/templates/apps/api/apps/{{projectName}}-service/package.json.hbs +1 -1
  30. package/templates/apps/api/apps/{{projectName}}-service/src/app.ts.hbs +7 -8
  31. package/templates/apps/api/apps/{{projectName}}-service/src/index.ts.hbs +4 -3
  32. package/templates/apps/api/apps/{{projectName}}-service/src/lib/server/init.ts.hbs +0 -1
  33. package/templates/apps/api/apps/{{projectName}}-service/src/server/procedures/app-procedures.ts.hbs +4 -0
  34. package/templates/apps/api/apps/{{projectName}}-service/tests/service.test.ts.hbs +3 -1
  35. package/templates/apps/api/e2e/api-service.spec.ts.hbs +4 -2
  36. package/templates/apps/api/{eslint.config.js → eslint.config.js.hbs} +6 -8
  37. package/templates/apps/api/package.json.hbs +3 -3
  38. package/templates/apps/api/pnpm-workspace.yaml.hbs +26 -0
  39. package/templates/apps/api/tsconfig.base.json +0 -1
  40. package/templates/apps/fullstack/.dockerignore.hbs +3 -0
  41. package/templates/apps/fullstack/.gitignore.hbs +16 -0
  42. package/templates/apps/fullstack/.npmrc.hbs +1 -0
  43. package/templates/apps/fullstack/Dockerfile.hbs +6 -5
  44. package/templates/apps/fullstack/apps/{{projectName}}-app/README.md.hbs +2 -2
  45. package/templates/apps/fullstack/apps/{{projectName}}-app/capacitor.config.ts.hbs +1 -1
  46. package/templates/apps/fullstack/apps/{{projectName}}-app/eslint.config.js.hbs +5 -8
  47. package/templates/apps/fullstack/apps/{{projectName}}-app/index.html.hbs +7 -2
  48. package/templates/apps/fullstack/apps/{{projectName}}-app/messages/en-US.json.hbs +1 -34
  49. package/templates/apps/fullstack/apps/{{projectName}}-app/messages/zh-CN.json.hbs +1 -34
  50. package/templates/apps/fullstack/apps/{{projectName}}-app/package.json.hbs +2 -2
  51. package/templates/apps/fullstack/apps/{{projectName}}-app/src/App.svelte.hbs +30 -170
  52. package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.d.ts.hbs +1 -1
  53. package/templates/apps/fullstack/apps/{{projectName}}-app/src/lib/capacitor.ts.hbs +6 -5
  54. package/templates/apps/fullstack/apps/{{projectName}}-app/src/main.ts.hbs +1 -1
  55. package/templates/apps/fullstack/apps/{{projectName}}-app/vite.config.ts.hbs +48 -22
  56. package/templates/apps/fullstack/apps/{{projectName}}-desktop/README.md.hbs +3 -1
  57. package/templates/apps/fullstack/apps/{{projectName}}-desktop/eslint.config.js.hbs +5 -8
  58. package/templates/apps/fullstack/apps/{{projectName}}-desktop/index.html.hbs +6 -1
  59. package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/en-US.json.hbs +1 -28
  60. package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/zh-CN.json.hbs +1 -28
  61. package/templates/apps/fullstack/apps/{{projectName}}-desktop/package.json.hbs +5 -4
  62. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/App.svelte.hbs +10 -141
  63. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/Cargo.toml.hbs +5 -5
  64. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/tauri.conf.json.hbs +3 -3
  65. package/templates/apps/fullstack/apps/{{projectName}}-desktop/vite.config.ts.hbs +21 -2
  66. package/templates/apps/fullstack/apps/{{projectName}}-web/README.md.hbs +2 -2
  67. package/templates/apps/fullstack/apps/{{projectName}}-web/eslint.config.js.hbs +5 -8
  68. package/templates/apps/fullstack/apps/{{projectName}}-web/index.html.hbs +6 -1
  69. package/templates/apps/fullstack/apps/{{projectName}}-web/messages/en-US.json.hbs +1 -28
  70. package/templates/apps/fullstack/apps/{{projectName}}-web/messages/zh-CN.json.hbs +1 -28
  71. package/templates/apps/fullstack/apps/{{projectName}}-web/package.json.hbs +2 -2
  72. package/templates/apps/fullstack/apps/{{projectName}}-web/src/App.svelte.hbs +5 -143
  73. package/templates/apps/fullstack/apps/{{projectName}}-web/src/app.d.ts.hbs +1 -1
  74. package/templates/apps/fullstack/apps/{{projectName}}-web/src/main.ts.hbs +1 -1
  75. package/templates/apps/fullstack/apps/{{projectName}}-web/vite.config.ts.hbs +48 -22
  76. package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +207 -17
  77. package/templates/apps/fullstack/{eslint.config.js → eslint.config.js.hbs} +6 -8
  78. package/templates/apps/fullstack/package.json.hbs +3 -3
  79. package/templates/apps/fullstack/packages/{{projectName}}-contract/README.md.hbs +2 -0
  80. package/templates/apps/fullstack/packages/{{projectName}}-contract/package.json.hbs +1 -1
  81. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-contract.ts.hbs +66 -0
  82. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-schemas.ts.hbs +96 -0
  83. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/app-schemas.ts.hbs +3 -0
  84. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/index.ts.hbs +3 -1
  85. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +5 -0
  86. package/templates/apps/fullstack/packages/{{projectName}}-contract/tests/contract.test.ts.hbs +3 -0
  87. package/templates/apps/fullstack/packages/{{projectName}}-contract/tsup.config.ts.hbs +1 -1
  88. package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +13 -3
  89. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_audit.yml.hbs +3 -0
  90. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_cache.yml.hbs +2 -0
  91. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_core.yml.hbs +10 -3
  92. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_db.yml.hbs +3 -0
  93. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_iam.yml.hbs +21 -0
  94. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_serv.yml.hbs +10 -3
  95. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_storage.yml.hbs +3 -0
  96. package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +10 -3
  97. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/app-server.ts.hbs +63 -28
  98. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/index.ts.hbs +26 -11
  99. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/admin-service.ts.hbs +276 -0
  100. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/messages.ts.hbs +29 -0
  101. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/admin-procedures.ts.hbs +94 -0
  102. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/app-procedures.ts.hbs +6 -0
  103. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/index.ts.hbs +5 -1
  104. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/runtime.ts.hbs +98 -0
  105. package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/app-server.test.ts.hbs +446 -33
  106. package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/runtime.test.ts.hbs +48 -0
  107. package/templates/apps/fullstack/packages/{{projectName}}-serv/tsup.config.ts.hbs +1 -1
  108. package/templates/apps/fullstack/packages/{{projectName}}-shared/README.md.hbs +19 -26
  109. package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/en-US.json.hbs +78 -15
  110. package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/zh-CN.json.hbs +78 -15
  111. package/templates/apps/fullstack/packages/{{projectName}}-shared/package.json.hbs +4 -1
  112. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/index.ts.hbs +3 -4
  113. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/api-client.ts.hbs +53 -27
  114. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AdminWorkspace.svelte.hbs +73 -0
  115. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AppShell.svelte.hbs +55 -45
  116. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AuditManagement.svelte.hbs +61 -0
  117. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/ProfileSettings.svelte.hbs +57 -0
  118. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/RoleManagement.svelte.hbs +49 -0
  119. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/UserManagement.svelte.hbs +174 -0
  120. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/management-store.svelte.ts.hbs +399 -0
  121. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/theme-store.svelte.ts.hbs +7 -39
  122. package/templates/apps/fullstack/packages/{{projectName}}-shared/svelte.config.js.hbs +1 -0
  123. package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/api-client.test.ts.hbs +151 -0
  124. package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/management-store.test.ts.hbs +101 -0
  125. package/templates/apps/fullstack/packages/{{projectName}}-shared/vitest.config.ts.hbs +7 -0
  126. package/templates/apps/fullstack/playwright.config.ts.hbs +6 -0
  127. package/templates/apps/fullstack/pnpm-workspace.yaml.hbs +24 -0
  128. package/templates/apps/fullstack/tsconfig.base.json +0 -1
  129. package/templates/apps/h5/src/routes/+layout.svelte.hbs +4 -0
  130. package/templates/apps/h5/src/routes/+page.svelte.hbs +3 -2
  131. package/templates/apps/mobile-app/index.html.hbs +2 -2
  132. package/templates/apps/mobile-app/src/App.svelte.hbs +6 -2
  133. package/templates/apps/mobile-app/src/lib/app-config.ts.hbs +13 -0
  134. package/templates/apps/website/src/routes/+layout.svelte.hbs +8 -2
  135. package/templates/apps/website/src/routes/+page.svelte.hbs +4 -3
  136. package/templates/base/.npmrc.hbs +1 -0
  137. package/templates/base/Dockerfile.hbs +9 -8
  138. package/templates/base/e2e/app.spec.ts.hbs +1 -0
  139. package/templates/base/eslint-rules.js +45 -0
  140. package/templates/base/eslint.config.js.hbs +6 -8
  141. package/templates/base/package.json.hbs +39 -42
  142. package/templates/base/pnpm-workspace.yaml.hbs +26 -0
  143. package/templates/base/src/app.d.ts.hbs +4 -0
  144. package/templates/base/src/hooks.server.ts.hbs +0 -8
  145. package/templates/base/src/lib/server/init.ts.hbs +26 -5
  146. package/templates/base/src/routes/+layout.server.ts.hbs +18 -0
  147. package/templates/base/tests/scaffold.test.ts.hbs +21 -1
  148. package/templates/base/vite.config.ts.hbs +21 -0
  149. package/templates/features/ai/routes/api/chat/+server.ts +6 -7
  150. package/templates/features/iam/routes-admin/(auth)/auth/login/+page.svelte.hbs +1 -1
  151. package/templates/features/iam/routes-h5/auth/login/+page.svelte.hbs +1 -1
  152. package/templates/features/iam/routes-shared/api/auth/login/+server.ts +14 -10
  153. package/templates/features/iam/routes-shared/api/auth/logout/+server.ts +6 -4
  154. package/templates/features/storage/routes/api/upload/+server.ts +10 -8
  155. package/templates/skills/AGENTS.md +9 -8
  156. package/templates/skills/CLAUDE.md +0 -10
  157. package/templates/skills/bridges/admin/AGENTS.md +8 -0
  158. package/templates/skills/bridges/admin/copilot-instructions.md +2 -0
  159. package/templates/skills/bridges/api/AGENTS.md +8 -1
  160. package/templates/skills/bridges/api/copilot-instructions.md +2 -0
  161. package/templates/skills/bridges/fullstack/AGENTS.md.hbs +21 -4
  162. package/templates/skills/bridges/fullstack/copilot-instructions.md.hbs +5 -0
  163. package/templates/skills/bridges/h5/AGENTS.md +8 -0
  164. package/templates/skills/bridges/h5/copilot-instructions.md +2 -0
  165. package/templates/skills/bridges/mobile-app/AGENTS.md +8 -0
  166. package/templates/skills/bridges/mobile-app/copilot-instructions.md +2 -0
  167. package/templates/skills/bridges/website/AGENTS.md +8 -0
  168. package/templates/skills/bridges/website/copilot-instructions.md +2 -0
  169. package/templates/skills/copilot-instructions.md +2 -0
  170. package/templates/skills/hai-api-client/SKILL.md +2 -0
  171. package/templates/skills/hai-app-create/SKILL.md +9 -7
  172. package/templates/skills/hai-app-create/development.md +72 -0
  173. package/templates/skills/hai-app-create/reference.md +44 -32
  174. package/templates/skills/hai-app-review/SKILL.md +50 -144
  175. package/templates/skills/hai-app-tests/SKILL.md +3 -1
  176. package/templates/skills/hai-app-tests/reference.md +47 -27
  177. package/templates/skills/hai-build/SKILL.md +5 -4
  178. package/templates/skills/hai-build/reference.md +56 -34
  179. package/templates/skills/hai-ci/SKILL.md +8 -15
  180. package/templates/skills/hai-core/SKILL.md +2 -0
  181. package/templates/skills/hai-core/reference.md +6 -4
  182. package/templates/skills/hai-framework-sync/SKILL.md +8 -2
  183. package/templates/skills/hai-pr-review/SKILL.md +5 -4
  184. package/templates/skills/hai-reldb/SKILL.md +1 -0
  185. package/templates/skills/hai-reldb/reference.md +3 -0
  186. package/templates/skills/hai-scheduler/SKILL.md +3 -0
  187. package/templates/skills/hai-serv/SKILL.md +2 -0
  188. package/templates/skills/hai-serv/reference.md +18 -2
  189. package/templates/skills/hai-storage/SKILL.md +3 -1
  190. package/templates/skills/hai-ui/SKILL.md +6 -0
  191. package/templates/skills/hai-ui/reference.md +7 -4
  192. package/templates/skills/hai-vecdb/reference.md +53 -49
  193. package/dist/chunk-O3ANVICQ.js.map +0 -1
  194. package/dist/chunk-WUYLYCW2.js +0 -237
  195. package/dist/chunk-WUYLYCW2.js.map +0 -1
  196. package/dist/cli-config-templates-OWBEGBZQ.js +0 -5
  197. package/dist/src-TBIET7YU.js.map +0 -1
  198. package/templates/apps/fullstack/apps/{{projectName}}-app/tests/api.test.ts.hbs +0 -28
  199. package/templates/apps/fullstack/apps/{{projectName}}-desktop/tests/api.test.ts.hbs +0 -28
  200. package/templates/apps/fullstack/apps/{{projectName}}-web/tests/api.test.ts.hbs +0 -55
  201. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/LanguageSwitcher.svelte.hbs +0 -27
  202. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/ThemeSwitcher.svelte.hbs +0 -18
  203. package/templates/skills/bridges/admin/CLAUDE.md +0 -11
  204. package/templates/skills/bridges/api/CLAUDE.md +0 -11
  205. package/templates/skills/bridges/fullstack/CLAUDE.md.hbs +0 -5
  206. package/templates/skills/bridges/h5/CLAUDE.md +0 -11
  207. package/templates/skills/bridges/mobile-app/CLAUDE.md +0 -11
  208. package/templates/skills/bridges/website/CLAUDE.md +0 -11
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { generateConfigFile } from './chunk-O3ANVICQ.js';
3
- import './chunk-WUYLYCW2.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`,
@@ -680,13 +702,15 @@ async function generateFromTemplates(projectPath, context) {
680
702
  const includeBaseTemplate = context.appType !== "fullstack" && !context.isApiWorkspace;
681
703
  if (includeBaseTemplate) {
682
704
  await copyStaticDir(path2.join(root, "base"), projectPath);
705
+ } else {
706
+ await fse.copy(path2.join(root, "base", "eslint-rules.js"), path2.join(projectPath, "eslint-rules.js"));
683
707
  }
684
708
  const appDir = path2.join(root, "apps", context.appType);
685
709
  if (await fse.pathExists(appDir)) {
686
710
  const appExcludes = context.hasI18n ? [] : ["messages"];
687
711
  await copyStaticDir(appDir, projectPath, appExcludes);
688
712
  }
689
- if (!context.isApiWorkspace) {
713
+ if (!context.isApiWorkspace && context.appType !== "fullstack") {
690
714
  for (const featureId of Object.keys(context.features)) {
691
715
  if (context.isSvelteOnlyApp) {
692
716
  continue;
@@ -740,7 +764,7 @@ async function renderDynamicFiles(templatesRoot, projectPath, context) {
740
764
  await renderHbsInDir(dir, projectPath, context);
741
765
  await copyRenderedStaticPathFiles(dir, projectPath, context);
742
766
  }
743
- if (context.isApiWorkspace) {
767
+ if (context.isApiWorkspace || context.appType === "fullstack") {
744
768
  return;
745
769
  }
746
770
  const routesDest = path2.join(projectPath, "src", "routes");
@@ -778,7 +802,7 @@ async function renderHbsInDir(dir, destRoot, context) {
778
802
  const srcPath = path2.join(dir, relPath);
779
803
  const outRelPathTemplate = relPath.replace(HBS_SUFFIX_REGEX, "");
780
804
  const template = await fse.readFile(srcPath, "utf-8");
781
- const compiled = Handlebars.compile(template, { noEscape: true });
805
+ const compiled = Handlebars2.compile(template, { noEscape: true });
782
806
  const rendered = compiled(context);
783
807
  if (shouldSkipRenderedFile(template, rendered)) {
784
808
  continue;
@@ -839,7 +863,7 @@ function shouldSkipRenderedFile(template, rendered) {
839
863
  }
840
864
  function renderOutputPath(pathTemplate, context) {
841
865
  const normalizedTemplate = pathTemplate.split(path2.sep).join("/");
842
- return Handlebars.compile(normalizedTemplate, { noEscape: true })(context);
866
+ return Handlebars2.compile(normalizedTemplate, { noEscape: true })(context);
843
867
  }
844
868
  function isSafeRelativePath(relativePath) {
845
869
  const normalized = path2.normalize(relativePath);
@@ -877,8 +901,8 @@ var APP_TYPES = {
877
901
  },
878
902
  "fullstack": {
879
903
  name: "\u524D\u540E\u7AEF\u5206\u79BB\u5DE5\u7A0B",
880
- description: "\u591A\u5305\u5DE5\u4F5C\u533A\uFF0C\u5305\u542B contract\u3001serv\u3001Web/App/Desktop \u524D\u7AEF",
881
- 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"]
882
906
  }
883
907
  };
884
908
  var FRONTEND_TARGETS = {
@@ -1075,20 +1099,21 @@ async function createProject(options) {
1075
1099
  packageManager: resolvedOptions.packageManager
1076
1100
  });
1077
1101
  await generateFromTemplates(projectPath, context);
1078
- if (resolvedOptions.appType !== "fullstack") {
1079
- const { generateConfigFile: generateConfigFile2, generateEnvExample } = await import('./cli-config-templates-OWBEGBZQ.js');
1102
+ {
1103
+ const { generateConfigFile: generateConfigFile2, generateEnvExample } = await import('./cli-config-templates-6XA7V6CC.js');
1080
1104
  const configs = resolvedOptions.moduleConfigs;
1081
1105
  const isApiWorkspace = resolvedOptions.appType === "api";
1082
- 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");
1083
1108
  const envExamplePath = isApiWorkspace ? path2.join(projectPath, "apps", `${resolvedOptions.name}-service`, ".env.example") : path2.join(projectPath, ".env.example");
1084
1109
  for (const featureId of resolvedOptions.features) {
1085
1110
  const configKey = getFeatureConfigKey(featureId);
1086
1111
  if (configKey) {
1087
- const content = generateConfigFile2(configKey, configs);
1112
+ const content = isFullstack && configKey === "iam" ? generateConfigFile2(configKey, configs).replace("seedDefaultData: true", "seedDefaultData: false") : generateConfigFile2(configKey, configs);
1088
1113
  await writeFile(path2.join(configDir, `_${configKey}.yml`), content);
1089
1114
  }
1090
1115
  }
1091
- if (!isApiWorkspace) {
1116
+ if (!isApiWorkspace && !isFullstack) {
1092
1117
  await writeFile(
1093
1118
  path2.join(configDir, "_core.yml"),
1094
1119
  generateConfigFile2("core", configs)
@@ -1099,10 +1124,21 @@ async function createProject(options) {
1099
1124
  # Service Runtime
1100
1125
  # =============================================================================
1101
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
1102
1133
  ` : generateEnvExample(resolvedOptions.features, configs);
1103
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
+ }
1104
1140
  }
1105
- const { generateSkillFiles } = await import('./cli-skill-templates-ZIWYMS4Y.js');
1141
+ const { generateSkillFiles } = await import('./cli-skill-templates-45CK4RQ2.js');
1106
1142
  await generateSkillFiles(
1107
1143
  projectPath,
1108
1144
  resolvedOptions.features,
@@ -1211,7 +1247,7 @@ async function resolveOptions(options) {
1211
1247
  let selectedFeatures = [];
1212
1248
  const appTypeDefaults = APP_TYPES[selectedAppType].defaultFeatures;
1213
1249
  if (selectedAppType === "fullstack") {
1214
- selectedFeatures = [];
1250
+ selectedFeatures = resolveFeatureDependencies(appTypeDefaults);
1215
1251
  } else if (selectedTemplate === "custom" && !options.features && useDefaults) {
1216
1252
  selectedFeatures = resolveFeatureDependencies(appTypeDefaults);
1217
1253
  } else if (selectedTemplate === "custom" && !options.features) {
@@ -1237,7 +1273,7 @@ async function resolveOptions(options) {
1237
1273
  const merged = /* @__PURE__ */ new Set([...templateFeatures, ...appTypeDefaults]);
1238
1274
  selectedFeatures = resolveFeatureDependencies(Array.from(merged));
1239
1275
  }
1240
- 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));
1241
1277
  let addExamples = options.examples;
1242
1278
  if (addExamples === void 0 && useDefaults) {
1243
1279
  addExamples = true;
@@ -1612,6 +1648,19 @@ function normalizeChildOutput(output) {
1612
1648
  }
1613
1649
  return "";
1614
1650
  }
1651
+ function generateAiDevelopmentReadme() {
1652
+ return `## AI \u8F85\u52A9\u5F00\u53D1
1653
+
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
1655
+
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
1657
+
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
1659
+
1660
+ \u5DF2\u6709 hai \u9879\u76EE\u53EF\u8FD0\u884C hai init \u8865\u9F50\u7F3A\u5931\u7684 AI \u652F\u6301\u6587\u4EF6\u4E0E\u53C2\u8003\u8D44\u6E90\uFF1B\u5DF2\u6709 AGENTS.md\u3001Skill \u548C\u81EA\u5B9A\u4E49\u89C4\u5219\u4F1A\u4FDD\u7559\uFF0C\u5347\u7EA7\u65F6\u9700\u5C06\u4E0A\u8FF0\u666E\u901A\u5F00\u53D1\u5165\u53E3\u4E0E\u89C4\u8303\u663E\u5F0F\u5408\u5E76\u5230\u65E7\u6307\u5F15\u3002
1661
+
1662
+ `;
1663
+ }
1615
1664
  function generateReadme(name, appTypeLabel, pm, appType) {
1616
1665
  const install = getInstallCommand(pm);
1617
1666
  const isStaticImage = appType === "mobile-app";
@@ -1676,7 +1725,7 @@ docker stop ${name}
1676
1725
 
1677
1726
  ${runtimeNotes}
1678
1727
 
1679
- ## \u6587\u6863
1728
+ ${generateAiDevelopmentReadme()}## \u6587\u6863
1680
1729
 
1681
1730
  - [hai Agent Framework](https://github.com/hai-series/hai-framework)
1682
1731
  - [Svelte 5](https://svelte.dev/)
@@ -1760,7 +1809,7 @@ docker stop ${name}
1760
1809
  - \u5728 \`${name}-service\` \u4E2D\u6269\u5C55 procedures\u3001\u6A21\u5757\u521D\u59CB\u5316\u4E0E\u914D\u7F6E\u3002
1761
1810
  - \u9700\u8981 IAM / storage / ai \u65F6\uFF0C\u4F18\u5148\u590D\u7528 \`@h-ai/api-contract\` \u4E0E \`@h-ai/serv/features/*\`\u3002
1762
1811
 
1763
- ## \u6587\u6863
1812
+ ${generateAiDevelopmentReadme()}## \u6587\u6863
1764
1813
 
1765
1814
  - [hai Agent Framework](https://github.com/hai-series/hai-framework)
1766
1815
  - [@h-ai/serv](./.agents/skills/hai-serv/SKILL.md)
@@ -1800,6 +1849,18 @@ curl --fail http://127.0.0.1:8080/runtime-config.js
1800
1849
 
1801
1850
  \u5DF2\u542F\u7528\u524D\u7AEF\uFF1A${enabledFrontends || "Web / App / Desktop"}
1802
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
+
1803
1864
  ## \u5F00\u53D1\u3001\u7F16\u8BD1\u4E0E\u6253\u5305
1804
1865
 
1805
1866
  \`\`\`bash
@@ -1849,8 +1910,6 @@ ${webRunCommand}
1849
1910
  \`\`\`bash
1850
1911
  curl --fail http://127.0.0.1:3000/health
1851
1912
  curl --fail http://127.0.0.1:3000/ready
1852
- curl --fail --request POST http://127.0.0.1:3000/api/v1/app/info \\
1853
- --header "Content-Type: application/json" --data '{}'
1854
1913
  ${webTestCommands}docker stop ${containerNames}
1855
1914
  \`\`\`
1856
1915
 
@@ -1892,11 +1951,12 @@ ${frontends.includes("web") ? `- Web \u4F7F\u7528\u72EC\u7ACB\u9759\u6001\u955C\
1892
1951
  \`\`\`bash
1893
1952
  ${pm} typecheck
1894
1953
  ${pm} lint
1954
+ ${pm} build
1895
1955
  ${pm} test
1896
1956
  ${pm} test:e2e
1897
1957
  \`\`\`
1898
1958
 
1899
- ## \u6587\u6863
1959
+ ${generateAiDevelopmentReadme()}## \u6587\u6863
1900
1960
 
1901
1961
  - [hai Agent Framework](https://github.com/hai-series/hai-framework)
1902
1962
  - [@h-ai/serv](./.agents/skills/hai-serv/SKILL.md)
@@ -1919,6 +1979,8 @@ function printCompletionMessage(options) {
1919
1979
  }
1920
1980
  core.logger.info("\u4E0B\u4E00\u6B65\uFF1A");
1921
1981
  core.logger.info(chalk.cyan(` cd ${options.name}`));
1982
+ if (options.appType === "fullstack")
1983
+ core.logger.info(chalk.cyan(cliM("cli_adminPasswordSaved")));
1922
1984
  if (!options.install) {
1923
1985
  core.logger.info(chalk.cyan(` ${getInstallCommand(options.packageManager)}`));
1924
1986
  }
@@ -2012,7 +2074,7 @@ async function addModule(options) {
2012
2074
  core.logger.info(`\u53EF\u7528\u6A21\u5757: ${Object.keys(MODULE_MAP).join(", ")}`);
2013
2075
  return;
2014
2076
  }
2015
- const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates-ZIWYMS4Y.js');
2077
+ const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates-45CK4RQ2.js');
2016
2078
  if (moduleDef.packages.every((p) => project.haiPackages.includes(p))) {
2017
2079
  const generatedFiles2 = await generateProjectAiSupport(
2018
2080
  cwd,
@@ -2118,69 +2180,6 @@ async function addModule(options) {
2118
2180
  throw error;
2119
2181
  }
2120
2182
  }
2121
-
2122
- // messages/en-US.json
2123
- var en_US_default = {
2124
- cli_invalidGenerateName: "Use a name starting with a letter, with only letters, digits, hyphens or underscores",
2125
- cli_generateOutsideWorkspace: "Generated files must remain inside the workspace, including symbolic link targets",
2126
- cli_generateExists: "File already exists: {path}. Use --force to overwrite it",
2127
- cli_deploy_module_missing: "Deploy module not found. Install @h-ai/deploy first:",
2128
- cli_deploy_load_credentials: "Loading credentials...",
2129
- cli_deploy_credentials_failed: "Failed to load credentials: {message}",
2130
- cli_deploy_credentials_loaded: "Loaded {count} credentials",
2131
- cli_deploy_load_config: "Loading deploy config...",
2132
- cli_deploy_config_missing: "Deploy config not found: {path}",
2133
- cli_deploy_config_hint: "Run: hai add deploy to generate config template",
2134
- cli_deploy_config_loaded: "Deploy config loaded",
2135
- cli_deploy_scanning: "Scanning application...",
2136
- cli_deploy_scan_failed: "Scan failed: {message}",
2137
- cli_deploy_scanned: "Scanned: {name} (SvelteKit: {sveltekit}, Services: {services})",
2138
- cli_deploy_none: "none",
2139
- cli_deploy_initializing: "Initializing deploy module...",
2140
- cli_deploy_init_failed: "Init failed: {message}",
2141
- cli_deploy_initialized: "Deploy module initialized",
2142
- cli_deploy_deploying: "Deploying application...",
2143
- cli_deploy_failed: "Deploy failed: {message}",
2144
- cli_deploy_success: "Deployment successful!",
2145
- cli_deploy_url: " URL: {url}",
2146
- cli_deploy_id: " ID: {id}",
2147
- cli_deploy_env: " Env: {names}",
2148
- cli_deploy_command_failed: "Deploy command failed"
2149
- };
2150
-
2151
- // messages/zh-CN.json
2152
- var zh_CN_default = {
2153
- cli_invalidGenerateName: "\u540D\u79F0\u5FC5\u987B\u4EE5\u5B57\u6BCD\u5F00\u5934\uFF0C\u4E14\u4EC5\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u77ED\u6A2A\u7EBF\u6216\u4E0B\u5212\u7EBF",
2154
- cli_generateOutsideWorkspace: "\u751F\u6210\u6587\u4EF6\u5FC5\u987B\u4F4D\u4E8E\u5DE5\u4F5C\u76EE\u5F55\u5185\uFF0C\u7B26\u53F7\u94FE\u63A5\u76EE\u6807\u4E5F\u4E0D\u5F97\u8D8A\u754C",
2155
- cli_generateExists: "\u6587\u4EF6\u5DF2\u5B58\u5728\uFF1A{path}\u3002\u4F7F\u7528 --force \u624D\u53EF\u8986\u76D6",
2156
- cli_deploy_module_missing: "\u672A\u627E\u5230\u90E8\u7F72\u6A21\u5757\uFF0C\u8BF7\u5148\u5B89\u88C5 @h-ai/deploy\uFF1A",
2157
- cli_deploy_load_credentials: "\u6B63\u5728\u52A0\u8F7D\u51ED\u8BC1\u2026",
2158
- cli_deploy_credentials_failed: "\u52A0\u8F7D\u51ED\u8BC1\u5931\u8D25\uFF1A{message}",
2159
- cli_deploy_credentials_loaded: "\u5DF2\u52A0\u8F7D {count} \u9879\u51ED\u8BC1",
2160
- cli_deploy_load_config: "\u6B63\u5728\u52A0\u8F7D\u90E8\u7F72\u914D\u7F6E\u2026",
2161
- cli_deploy_config_missing: "\u672A\u627E\u5230\u90E8\u7F72\u914D\u7F6E\uFF1A{path}",
2162
- cli_deploy_config_hint: "\u8FD0\u884C hai add deploy \u751F\u6210\u90E8\u7F72\u914D\u7F6E\u6A21\u677F",
2163
- cli_deploy_config_loaded: "\u90E8\u7F72\u914D\u7F6E\u5DF2\u52A0\u8F7D",
2164
- cli_deploy_scanning: "\u6B63\u5728\u626B\u63CF\u5E94\u7528\u2026",
2165
- cli_deploy_scan_failed: "\u626B\u63CF\u5931\u8D25\uFF1A{message}",
2166
- cli_deploy_scanned: "\u5DF2\u626B\u63CF\uFF1A{name}\uFF08SvelteKit\uFF1A{sveltekit}\uFF0C\u670D\u52A1\uFF1A{services}\uFF09",
2167
- cli_deploy_none: "\u65E0",
2168
- cli_deploy_initializing: "\u6B63\u5728\u521D\u59CB\u5316\u90E8\u7F72\u6A21\u5757\u2026",
2169
- cli_deploy_init_failed: "\u521D\u59CB\u5316\u5931\u8D25\uFF1A{message}",
2170
- cli_deploy_initialized: "\u90E8\u7F72\u6A21\u5757\u5DF2\u521D\u59CB\u5316",
2171
- cli_deploy_deploying: "\u6B63\u5728\u90E8\u7F72\u5E94\u7528\u2026",
2172
- cli_deploy_failed: "\u90E8\u7F72\u5931\u8D25\uFF1A{message}",
2173
- cli_deploy_success: "\u90E8\u7F72\u6210\u529F\uFF01",
2174
- cli_deploy_url: " \u5730\u5740\uFF1A{url}",
2175
- cli_deploy_id: " \u6807\u8BC6\uFF1A{id}",
2176
- cli_deploy_env: " \u73AF\u5883\u53D8\u91CF\uFF1A{names}",
2177
- cli_deploy_command_failed: "\u90E8\u7F72\u547D\u4EE4\u5931\u8D25"
2178
- };
2179
-
2180
- // src/cli-i18n.ts
2181
- var cliM = core.i18n.createMessageGetter({ "en-US": en_US_default, "zh-CN": zh_CN_default });
2182
-
2183
- // src/commands/cli-deploy.ts
2184
2183
  async function deployCommand(options) {
2185
2184
  const spinner = ora();
2186
2185
  const cwd = options.cwd ?? process3.cwd();
@@ -2189,7 +2188,7 @@ async function deployCommand(options) {
2189
2188
  try {
2190
2189
  let deployModule;
2191
2190
  try {
2192
- deployModule = await import('./src-TBIET7YU.js');
2191
+ deployModule = await import('./src-DUGLX4YB.js');
2193
2192
  } catch {
2194
2193
  core.logger.error(chalk.red(cliM("cli_deploy_module_missing")));
2195
2194
  core.logger.info(chalk.cyan(" pnpm add @h-ai/deploy"));
@@ -2609,6 +2608,16 @@ async function initProject(options) {
2609
2608
  }
2610
2609
  const { project, existing, missing } = result;
2611
2610
  spinner.succeed(`\u68C0\u6D4B\u5230\u9879\u76EE: ${chalk.cyan(project.name)}`);
2611
+ if (project.isHaiProject) {
2612
+ const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates-45CK4RQ2.js');
2613
+ const generatedFiles = await generateProjectAiSupport(cwd, resolveSkillNamesForPackages(project.haiPackages), {
2614
+ overwriteSkills: false,
2615
+ overwriteBridgeFiles: false
2616
+ });
2617
+ for (const generatedFile of generatedFiles) {
2618
+ core.logger.info(chalk.gray(` + ${generatedFile}`));
2619
+ }
2620
+ }
2612
2621
  core.logger.info("");
2613
2622
  core.logger.info(chalk.bold("\u9879\u76EE\u72B6\u6001:"));
2614
2623
  core.logger.info(` \u540D\u79F0: ${chalk.cyan(project.name)}`);