@h-ai/cli 0.1.0-alpha9 → 1.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +229 -0
- package/README.ja.md +229 -0
- package/README.md +175 -113
- package/dist/chunk-AKV2CQZV.js +1497 -0
- package/dist/chunk-AKV2CQZV.js.map +1 -0
- package/dist/chunk-EF7WOFWZ.js +7557 -0
- package/dist/chunk-EF7WOFWZ.js.map +1 -0
- package/dist/chunk-MUHRBJSW.js +29272 -0
- package/dist/chunk-MUHRBJSW.js.map +1 -0
- package/dist/chunk-ZSDEVXZ7.js +38 -0
- package/dist/{chunk-2H7UOFLK.js.map → chunk-ZSDEVXZ7.js.map} +1 -1
- package/dist/cli-config-templates-HHFHNXBN.js +5 -0
- package/dist/cli-config-templates-HHFHNXBN.js.map +1 -0
- package/dist/cli-skill-templates-PN4FLGBC.js +5 -0
- package/dist/cli-skill-templates-PN4FLGBC.js.map +1 -0
- package/dist/index.js +4444 -554
- package/dist/index.js.map +1 -1
- package/dist/metafile-esm.json +1 -0
- package/dist/src-TEBHR5I5.js +5 -0
- package/dist/src-TEBHR5I5.js.map +1 -0
- package/package.json +35 -15
- package/templates/README.md +56 -114
- package/templates/apps/admin/messages/en-US.json +7 -0
- package/templates/apps/admin/messages/ja-JP.json +40 -0
- package/templates/apps/admin/messages/zh-CN.json +7 -0
- package/templates/apps/admin/src/routes/+layout.svelte.hbs +65 -8
- package/templates/apps/admin/src/routes/+page.svelte.hbs +35 -14
- package/templates/apps/admin/src/routes/admin/+layout.svelte.hbs +54 -22
- package/templates/apps/admin/src/routes/admin/+page.svelte.hbs +33 -24
- package/templates/apps/admin/src/routes/admin/settings/+page.svelte.hbs +16 -13
- package/templates/apps/api/.dockerignore.hbs +25 -0
- package/templates/apps/api/.gitignore.hbs +22 -0
- package/templates/apps/api/.npmrc.hbs +1 -0
- package/templates/apps/api/apps/{{projectName}}-contract/README.md.hbs +39 -0
- package/templates/apps/api/apps/{{projectName}}-contract/package.json.hbs +41 -0
- package/templates/apps/api/apps/{{projectName}}-contract/src/app-contract.ts.hbs +27 -0
- package/templates/apps/api/apps/{{projectName}}-contract/src/app-schemas.ts.hbs +28 -0
- package/templates/apps/api/apps/{{projectName}}-contract/src/index.ts.hbs +5 -0
- package/templates/apps/api/apps/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +16 -0
- package/templates/apps/api/apps/{{projectName}}-contract/tests/contract.test.ts.hbs +18 -0
- package/templates/apps/api/apps/{{projectName}}-contract/tsconfig.json.hbs +12 -0
- package/templates/apps/api/apps/{{projectName}}-contract/tsup.config.ts.hbs +11 -0
- package/templates/apps/api/apps/{{projectName}}-contract/vitest.config.ts.hbs +9 -0
- package/templates/apps/api/apps/{{projectName}}-serv/README.md.hbs +60 -0
- package/templates/apps/api/apps/{{projectName}}-serv/config/_core.yml.hbs +17 -0
- package/templates/apps/api/apps/{{projectName}}-serv/config/_serv.yml.hbs +54 -0
- package/templates/apps/api/apps/{{projectName}}-serv/data/.gitkeep.hbs +1 -0
- package/templates/apps/api/apps/{{projectName}}-serv/package.json.hbs +66 -0
- package/templates/apps/api/apps/{{projectName}}-serv/src/app.ts.hbs +119 -0
- package/templates/apps/api/apps/{{projectName}}-serv/src/build-metadata.ts.hbs +7 -0
- package/templates/apps/api/apps/{{projectName}}-serv/src/index.ts.hbs +41 -0
- package/templates/apps/api/apps/{{projectName}}-serv/src/lib/server/init.ts.hbs +165 -0
- package/templates/apps/api/apps/{{projectName}}-serv/src/server/procedures/app-procedures.ts.hbs +57 -0
- package/templates/apps/api/apps/{{projectName}}-serv/src/server/procedures/index.ts.hbs +41 -0
- package/templates/apps/api/apps/{{projectName}}-serv/tests/service.test.ts.hbs +176 -0
- package/templates/apps/api/apps/{{projectName}}-serv/tsconfig.json.hbs +16 -0
- package/templates/apps/api/apps/{{projectName}}-serv/tsup.config.ts.hbs +20 -0
- package/templates/apps/api/apps/{{projectName}}-serv/vitest.config.ts.hbs +12 -0
- package/templates/apps/api/e2e/api-serv.spec.ts.hbs +113 -0
- package/templates/apps/api/e2e/capture-evidence.ts.hbs +23 -0
- package/templates/apps/api/eslint.config.js.hbs +30 -0
- package/templates/apps/api/hai.json.hbs +4 -0
- package/templates/apps/api/images/serv.Dockerfile.hbs +37 -0
- package/templates/apps/api/package.json.hbs +53 -0
- package/templates/apps/api/playwright.config.ts.hbs +67 -0
- package/templates/apps/api/pnpm-workspace.yaml.hbs +40 -0
- package/templates/apps/api/tsconfig.base.json +14 -0
- package/templates/apps/fullstack/.dockerignore.hbs +25 -0
- package/templates/apps/fullstack/.gitignore.hbs +38 -0
- package/templates/apps/fullstack/.npmrc.hbs +1 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/.env.example.hbs +10 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/README.md.hbs +67 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/capacitor.config.ts.hbs +20 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/eslint.config.js.hbs +20 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/index.html.hbs +22 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/messages/en-US.json.hbs +7 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/messages/ja-JP.json.hbs +7 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/messages/zh-CN.json.hbs +7 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/package.json.hbs +86 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/project.inlang/settings.json.hbs +17 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/public/runtime-config.js.hbs +4 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/App.svelte.hbs +59 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.css.hbs +20 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.d.ts.hbs +8 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/build-metadata.ts.hbs +9 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/lib/capacitor.ts.hbs +19 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/main.ts.hbs +21 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/svelte.config.js.hbs +16 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/tsconfig.json.hbs +23 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/vite.config.ts.hbs +74 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/.env.example.hbs +6 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/README.md.hbs +64 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/eslint.config.js.hbs +20 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/index.html.hbs +20 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/en-US.json.hbs +7 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/ja-JP.json.hbs +7 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/zh-CN.json.hbs +7 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/package.json.hbs +66 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/project.inlang/settings.json.hbs +17 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/App.svelte.hbs +25 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/app.css.hbs +18 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/app.d.ts.hbs +8 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/build-metadata.ts.hbs +9 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/main.ts.hbs +20 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/Cargo.toml.hbs +33 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/build.rs.hbs +6 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/capabilities/default.json.hbs +16 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/128x128.png +0 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/128x128@2x.png +0 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/32x32.png +0 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/icon.icns +0 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/icon.ico +0 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/src/lib.rs.hbs +91 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/src/main.rs.hbs +8 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/tauri.conf.json.hbs +46 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/svelte.config.js.hbs +14 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/tsconfig.json.hbs +22 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/vite.config.ts.hbs +89 -0
- package/templates/apps/fullstack/apps/{{projectName}}-miniapp/README.md.hbs +25 -0
- package/templates/apps/fullstack/apps/{{projectName}}-miniapp/messages/en-US.json.hbs +12 -0
- package/templates/apps/fullstack/apps/{{projectName}}-miniapp/messages/ja-JP.json.hbs +12 -0
- package/templates/apps/fullstack/apps/{{projectName}}-miniapp/messages/zh-CN.json.hbs +12 -0
- package/templates/apps/fullstack/apps/{{projectName}}-miniapp/project.inlang/settings.json.hbs +17 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/README.md.hbs +54 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/eslint.config.js.hbs +20 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/index.html.hbs +21 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/messages/en-US.json.hbs +7 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/messages/ja-JP.json.hbs +7 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/messages/zh-CN.json.hbs +7 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/package.json.hbs +53 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/project.inlang/settings.json.hbs +17 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/public/runtime-config.js.hbs +1 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/App.svelte.hbs +18 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/app.css.hbs +18 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/app.d.ts.hbs +8 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/build-metadata.ts.hbs +9 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/main.ts.hbs +14 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/svelte.config.js.hbs +16 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/tsconfig.json.hbs +23 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/vite.config.ts.hbs +76 -0
- package/templates/apps/fullstack/docs/security-configuration.md.hbs +349 -0
- package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +988 -0
- package/templates/apps/fullstack/e2e/session-close.spec.ts.hbs +119 -0
- package/templates/apps/fullstack/eslint.config.js.hbs +41 -0
- package/templates/apps/fullstack/hai.json.hbs +11 -0
- package/templates/apps/fullstack/images/serv.Dockerfile.hbs +38 -0
- package/templates/apps/fullstack/images/web/19-runtime-config.envsh.hbs +5 -0
- package/templates/apps/fullstack/images/web/nginx.conf.hbs +24 -0
- package/templates/apps/fullstack/images/web/runtime-config.js.template.hbs +3 -0
- package/templates/apps/fullstack/images/web.Dockerfile.hbs +37 -0
- package/templates/apps/fullstack/package.json.hbs +61 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/README.md.hbs +40 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/package.json.hbs +30 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-contract.ts.hbs +78 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-schemas.ts.hbs +134 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/app-contract.ts.hbs +20 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/app-schemas.ts.hbs +35 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/index.ts.hbs +7 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +23 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/tests/contract.test.ts.hbs +31 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/tsconfig.json.hbs +9 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/tsup.config.ts.hbs +9 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +84 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_ai.yml.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_audit.yml.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_cache.yml.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_core.yml.hbs +22 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_db.yml.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_feedback.yml.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_iam.yml.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_payment.yml.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_reach.yml.hbs +60 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_scheduler.yml.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_serv.yml.hbs +64 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_storage.yml.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_vecdb.yml.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/data/.gitkeep.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +62 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/app-server.ts.hbs +115 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/build-metadata.ts.hbs +7 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/index.ts.hbs +40 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/admin-service.ts.hbs +294 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/audit-jobs.ts.hbs +28 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/business-settings.ts.hbs +50 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/messages.ts.hbs +50 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/admin-procedures.ts.hbs +106 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/app-procedures.ts.hbs +49 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/index.ts.hbs +34 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/runtime.ts.hbs +159 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/security-roles.ts.hbs +73 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/app-server.test.ts.hbs +505 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/runtime.test.ts.hbs +72 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/security.test.ts.hbs +183 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tsconfig.json.hbs +10 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tsup.config.ts.hbs +18 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/vitest.config.ts.hbs +12 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/.gitignore.hbs +10 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/README.md.hbs +97 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/en-US.json.hbs +164 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/ja-JP.json.hbs +164 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/zh-CN.json.hbs +164 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/package.json.hbs +55 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/project.inlang/settings.json.hbs +11 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/index.ts.hbs +7 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/api-client.ts.hbs +94 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/feedback-client.ts.hbs +36 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/sensitive-actions.svelte.ts.hbs +16 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/session-recovery.svelte.ts.hbs +4 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AdminWorkspace.svelte.hbs +122 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AppShell.svelte.hbs +90 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/FeedbackEntry.svelte.hbs +86 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/audit.svelte.hbs +94 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/configuration.svelte.hbs +25 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/feedback.svelte.hbs +157 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/roles.svelte.hbs +77 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/settings.svelte.hbs +44 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/users.svelte.hbs +216 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/security/role-label.ts.hbs +12 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/guide-store.ts.hbs +55 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/management-store.svelte.ts.hbs +614 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/theme-store.svelte.ts.hbs +23 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/svelte.config.js.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/api-client.test.ts.hbs +150 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/management-store.test.ts.hbs +253 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/tsconfig.json.hbs +17 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/vitest.config.ts.hbs +7 -0
- package/templates/apps/fullstack/playwright.config.ts.hbs +114 -0
- package/templates/apps/fullstack/playwright.session-close.config.ts.hbs +18 -0
- package/templates/apps/fullstack/pnpm-workspace.yaml.hbs +38 -0
- package/templates/apps/fullstack/tsconfig.base.json +14 -0
- package/templates/apps/h5/messages/en-US.json +3 -0
- package/templates/apps/h5/messages/ja-JP.json +40 -0
- package/templates/apps/h5/messages/zh-CN.json +3 -0
- package/templates/apps/h5/src/routes/+layout.svelte.hbs +85 -30
- package/templates/apps/h5/src/routes/+page.svelte.hbs +20 -8
- package/templates/apps/h5/src/routes/discover/+page.svelte.hbs +17 -6
- package/templates/apps/h5/src/routes/profile/+page.svelte.hbs +17 -6
- package/templates/apps/mobile-app/.env.hbs +3 -0
- package/templates/apps/{android-app → mobile-app}/capacitor.config.ts.hbs +2 -2
- package/templates/apps/mobile-app/index.html.hbs +14 -0
- package/templates/apps/mobile-app/messages/en-US.json +36 -0
- package/templates/apps/mobile-app/messages/ja-JP.json +36 -0
- package/templates/apps/mobile-app/messages/zh-CN.json +36 -0
- package/templates/apps/mobile-app/public/runtime-config.js +1 -0
- package/templates/apps/mobile-app/src/App.svelte.hbs +153 -0
- package/templates/apps/mobile-app/src/lib/api.ts.hbs +213 -0
- package/templates/apps/mobile-app/src/lib/app-config.ts.hbs +14 -0
- package/templates/apps/{android-app → mobile-app}/src/lib/capacitor.ts +6 -7
- package/templates/apps/mobile-app/src/lib/pages/home.svelte.hbs +58 -0
- package/templates/apps/mobile-app/src/lib/pages/profile.svelte.hbs +13 -0
- package/templates/apps/mobile-app/src/lib/pages/tasks.svelte.hbs +16 -0
- package/templates/apps/mobile-app/src/main.ts.hbs +11 -0
- package/templates/apps/website/messages/en-US.json +4 -2
- package/templates/apps/website/messages/ja-JP.json +34 -0
- package/templates/apps/website/messages/zh-CN.json +4 -2
- package/templates/apps/website/scripts/static-website.mjs.hbs +67 -0
- package/templates/apps/website/src/routes/+layout.svelte.hbs +77 -26
- package/templates/apps/website/src/routes/+layout.ts +3 -0
- package/templates/apps/website/src/routes/+page.svelte.hbs +31 -12
- package/templates/apps/website/src/routes/about/+page.svelte.hbs +11 -6
- package/templates/apps/website/src/routes/api/health/+server.ts +3 -0
- package/templates/apps/website/src/routes/contact/+page.svelte.hbs +44 -34
- package/templates/apps/website/src/routes/services/+page.svelte.hbs +27 -40
- package/templates/base/.dockerignore.hbs +27 -0
- package/templates/base/.gitignore.hbs +41 -0
- package/templates/base/.npmrc.hbs +1 -0
- package/templates/base/e2e/app.spec.ts.hbs +213 -0
- package/templates/base/e2e/helpers.ts +1 -1
- package/templates/base/eslint-rules.js +45 -0
- package/templates/base/eslint.config.js.hbs +34 -0
- package/templates/base/hai.json.hbs +4 -0
- package/templates/base/images/web/nginx.conf.hbs +24 -0
- package/templates/base/images/web.Dockerfile.hbs +72 -0
- package/templates/base/package.json.hbs +125 -49
- package/templates/base/playwright.config.ts +44 -6
- package/templates/base/pnpm-workspace.yaml.hbs +40 -0
- package/templates/base/src/app.css.hbs +40 -0
- package/templates/base/src/app.d.ts.hbs +14 -1
- package/templates/base/src/app.html.hbs +13 -0
- package/templates/base/src/hooks.server.ts.hbs +115 -43
- package/templates/base/src/lib/build-metadata.ts.hbs +7 -0
- package/templates/base/src/lib/server/init.ts.hbs +125 -152
- package/templates/base/src/lib/server/kit-config.ts.hbs +40 -0
- package/templates/base/src/routes/+layout.server.ts.hbs +35 -0
- package/templates/base/static/favicon.png +0 -0
- package/templates/base/svelte.config.js.hbs +84 -5
- package/templates/base/tests/scaffold.test.ts.hbs +102 -0
- package/templates/base/tsconfig.json.hbs +50 -0
- package/templates/base/vite.config.ts.hbs +117 -12
- package/templates/base/vitest.config.ts.hbs +19 -0
- package/templates/features/ai/routes/api/chat/+server.ts +6 -7
- package/templates/features/iam/routes-admin/(auth)/+layout.svelte.hbs +3 -17
- package/templates/features/iam/routes-admin/(auth)/auth/forgot-password/+page.svelte.hbs +10 -0
- package/templates/features/iam/routes-admin/(auth)/auth/login/+page.svelte.hbs +9 -96
- package/templates/features/iam/routes-admin/(auth)/auth/register/+page.svelte.hbs +9 -122
- package/templates/features/iam/routes-admin/(auth)/auth/reset-password/+page.svelte.hbs +10 -0
- package/templates/features/iam/routes-h5/auth/forgot-password/+page.svelte.hbs +10 -0
- package/templates/features/iam/routes-h5/auth/login/+page.svelte.hbs +9 -96
- package/templates/features/iam/routes-h5/auth/register/+page.svelte.hbs +9 -112
- package/templates/features/iam/routes-h5/auth/reset-password/+page.svelte.hbs +10 -0
- package/templates/features/iam/routes-shared/api/auth/captcha/+server.ts.hbs +4 -0
- package/templates/features/iam/routes-shared/api/auth/config/+server.ts +4 -0
- package/templates/features/iam/routes-shared/api/auth/login/+server.ts +1 -29
- package/templates/features/iam/routes-shared/api/auth/login/ldap/+server.ts +4 -0
- package/templates/features/iam/routes-shared/api/auth/login/otp/+server.ts +4 -0
- package/templates/features/iam/routes-shared/api/auth/logout/+server.ts +13 -6
- package/templates/features/iam/routes-shared/api/auth/otp/send/+server.ts +4 -0
- package/templates/features/iam/routes-shared/api/auth/password/renew/+server.ts +5 -0
- package/templates/features/iam/routes-shared/api/auth/password-reset/confirm/+server.ts +4 -0
- package/templates/features/iam/routes-shared/api/auth/password-reset/request/+server.ts +4 -0
- package/templates/features/iam/routes-shared/api/auth/reauthenticate/+server.ts +5 -0
- package/templates/features/iam/routes-shared/api/auth/register/+server.ts +1 -23
- package/templates/features/iam/routes-shared/api/auth/session/close/+server.ts.hbs +4 -0
- package/templates/features/iam/routes-website/auth/forgot-password/+page.svelte.hbs +10 -0
- package/templates/features/iam/routes-website/auth/login/+page.svelte.hbs +11 -0
- package/templates/features/iam/routes-website/auth/register/+page.svelte.hbs +11 -0
- package/templates/features/iam/routes-website/auth/reset-password/+page.svelte.hbs +10 -0
- package/templates/features/payment/routes/api/v1/payment/create/+server.ts +25 -23
- package/templates/features/payment/routes/api/v1/payment/notify/[provider]/+server.ts +5 -2
- package/templates/features/storage/routes/api/upload/+server.ts +10 -8
- package/templates/i18n/project.inlang/settings.json +2 -2
- package/templates/shared/.gitattributes +11 -0
- package/templates/shared/build-metadata.ts +42 -0
- package/templates/shared/container-runtime-config.sh +30 -0
- package/templates/shared/e2e-env.ts +98 -0
- package/templates/shared/hash-router.svelte.ts +83 -0
- package/templates/shared/public-base-path.mjs +19 -0
- package/templates/shared/run-e2e.mjs +104 -0
- package/templates/shared/vite-runtime-config.ts +56 -0
- package/templates/skills/AGENTS.md +75 -16
- package/templates/skills/CLAUDE.md +0 -11
- package/templates/skills/bridges/admin/AGENTS.md +89 -0
- package/templates/skills/bridges/api/AGENTS.md +83 -0
- package/templates/skills/bridges/fullstack/AGENTS.md.hbs +102 -0
- package/templates/skills/bridges/h5/AGENTS.md +88 -0
- package/templates/skills/bridges/mobile-app/AGENTS.md +100 -0
- package/templates/skills/bridges/website/AGENTS.md +88 -0
- package/templates/skills/copilot-instructions.md +3 -59
- package/templates/skills/hai-ai/SKILL.md +44 -715
- package/templates/skills/hai-ai/guide.md +457 -0
- package/templates/skills/hai-ai/reference.md +292 -0
- package/templates/skills/hai-api-client/SKILL.md +26 -339
- package/templates/skills/hai-api-client/reference.md +180 -0
- package/templates/skills/hai-api-contract/SKILL.md +36 -0
- package/templates/skills/hai-api-contract/reference.md +280 -0
- package/templates/skills/hai-app-create/SKILL.md +38 -351
- package/templates/skills/hai-app-create/collaboration.md +52 -0
- package/templates/skills/hai-app-create/development.md +243 -0
- package/templates/skills/hai-app-create/reference.md +376 -0
- package/templates/skills/hai-app-review/SKILL.md +57 -126
- package/templates/skills/hai-app-review/differential.md +34 -0
- package/templates/skills/hai-app-tests/SKILL.md +34 -454
- package/templates/skills/hai-app-tests/reference.md +462 -0
- package/templates/skills/hai-app-tests/validation.md +42 -0
- package/templates/skills/hai-audit/SKILL.md +37 -122
- package/templates/skills/hai-audit/reference.md +184 -0
- package/templates/skills/hai-build/SKILL.md +62 -315
- package/templates/skills/hai-build/paths.md +30 -0
- package/templates/skills/hai-build/reference.md +353 -0
- package/templates/skills/hai-cache/SKILL.md +26 -175
- package/templates/skills/hai-cache/reference.md +229 -0
- package/templates/skills/hai-capacitor/SKILL.md +24 -364
- package/templates/skills/hai-capacitor/reference.md +358 -0
- package/templates/skills/hai-change-plan/SKILL.md +46 -0
- package/templates/skills/hai-ci/SKILL.md +114 -0
- package/templates/skills/hai-core/SKILL.md +31 -469
- package/templates/skills/hai-core/reference.md +557 -0
- package/templates/skills/hai-core/request-access.md +65 -0
- package/templates/skills/hai-crypto/SKILL.md +29 -180
- package/templates/skills/hai-crypto/reference.md +317 -0
- package/templates/skills/hai-datapipe/SKILL.md +24 -207
- package/templates/skills/hai-datapipe/reference.md +204 -0
- package/templates/skills/hai-deploy/SKILL.md +53 -178
- package/templates/skills/hai-deploy/credentials.md +19 -0
- package/templates/skills/hai-deploy/middleware.md +129 -0
- package/templates/skills/hai-feedback/SKILL.md +85 -0
- package/templates/skills/hai-framework-sync/SKILL.md +105 -0
- package/templates/skills/hai-framework-sync/sync.md +49 -0
- package/templates/skills/hai-iam/SKILL.md +53 -325
- package/templates/skills/hai-iam/reference.md +535 -0
- package/templates/skills/hai-kit/SKILL.md +33 -329
- package/templates/skills/hai-kit/reference.md +202 -0
- package/templates/skills/hai-payment/SKILL.md +28 -262
- package/templates/skills/hai-payment/reference.md +295 -0
- package/templates/skills/hai-pr-review/SKILL.md +41 -0
- package/templates/skills/hai-reach/SKILL.md +28 -300
- package/templates/skills/hai-reach/reference.md +363 -0
- package/templates/skills/hai-reldb/SKILL.md +28 -449
- package/templates/skills/hai-reldb/reference.md +500 -0
- package/templates/skills/hai-scheduler/SKILL.md +26 -174
- package/templates/skills/hai-scheduler/reference.md +216 -0
- package/templates/skills/hai-serv/SKILL.md +60 -0
- package/templates/skills/hai-serv/reference.md +792 -0
- package/templates/skills/hai-spec-implement/SKILL.md +50 -0
- package/templates/skills/hai-spec-implement/changes.md +67 -0
- package/templates/skills/hai-spec-implement/evaluation.md +18 -0
- package/templates/skills/hai-spec-implement/handoff.md +47 -0
- package/templates/skills/hai-spec-implement/templates.md +117 -0
- package/templates/skills/hai-spec-implement/workflow.md +56 -0
- package/templates/skills/hai-spec-review/SKILL.md +57 -0
- package/templates/skills/hai-spec-review/checklist.md +71 -0
- package/templates/skills/hai-storage/SKILL.md +31 -262
- package/templates/skills/hai-storage/reference.md +284 -0
- package/templates/skills/hai-ui/SKILL.md +62 -238
- package/templates/skills/hai-ui/guide.md +81 -0
- package/templates/skills/hai-ui/reference.md +705 -0
- package/templates/skills/hai-ui-design/SKILL.md +31 -0
- package/templates/skills/hai-ui-design/patterns.md +31 -0
- package/templates/skills/hai-ui-review/SKILL.md +32 -0
- package/templates/skills/hai-ui-review/checklist.md +29 -0
- package/templates/skills/hai-vecdb/SKILL.md +25 -267
- package/templates/skills/hai-vecdb/reference.md +325 -0
- package/templates/skills/opencode.json +0 -5
- package/dist/chunk-2H7UOFLK.js +0 -10
- package/dist/chunk-LANIDJC7.js +0 -659
- package/dist/chunk-LANIDJC7.js.map +0 -1
- package/dist/chunk-YV7WPUI6.js +0 -206
- package/dist/chunk-YV7WPUI6.js.map +0 -1
- package/dist/config-templates-S5RI2MC6.js +0 -5
- package/dist/config-templates-S5RI2MC6.js.map +0 -1
- package/dist/skill-templates-N5DU5FNX.js +0 -5
- package/dist/skill-templates-N5DU5FNX.js.map +0 -1
- package/dist/src-XJ6YXNAF.js +0 -15030
- package/dist/src-XJ6YXNAF.js.map +0 -1
- package/templates/apps/android-app/.env.hbs +0 -3
- package/templates/apps/android-app/messages/en-US.json +0 -24
- package/templates/apps/android-app/messages/zh-CN.json +0 -24
- package/templates/apps/android-app/src/lib/api.ts.hbs +0 -30
- package/templates/apps/android-app/src/routes/+layout.svelte.hbs +0 -42
- package/templates/apps/android-app/src/routes/+layout.ts +0 -7
- package/templates/apps/android-app/src/routes/+page.svelte.hbs +0 -27
- package/templates/apps/api/src/routes/+layout.svelte +0 -14
- package/templates/apps/api/src/routes/+page.svelte +0 -11
- package/templates/apps/api/src/routes/api/v1/health/+server.ts +0 -14
- package/templates/apps/api/src/routes/api/v1/items/+server.ts +0 -37
- package/templates/apps/api/src/routes/api/v1/items/[id]/+server.ts +0 -30
- package/templates/base/src/app.css +0 -2
- package/templates/base/tsconfig.json +0 -8
|
@@ -1,484 +1,46 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: hai-core
|
|
3
|
-
description:
|
|
3
|
+
description: "配置 hai 应用启动、YAML/环境变量、日志、i18n 与 HaiResult;排查配置覆盖和错误本地化。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# hai-core
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
## 能力契约
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
|
17
|
-
|------|---------|--------|
|
|
18
|
-
| `core.logger` | ✅ pino(结构化 JSON / pretty) | ✅ loglevel(DevTools console) |
|
|
19
|
-
| `core.config` | ✅ 完整(YAML 加载、watch、validate) | ⚠️ 仅支持 `core.init({ ... })` 传入配置 |
|
|
20
|
-
| `core.i18n` | ✅ | ✅ |
|
|
21
|
-
| `core.id` | ✅ | ✅ |
|
|
22
|
-
| 工具函数 | ✅ | ✅ |
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## 适用场景
|
|
27
|
-
|
|
28
|
-
- 项目初始化与配置加载
|
|
29
|
-
- 使用 `core.logger` 记录日志
|
|
30
|
-
- 使用 `core.config` 读取/校验模块配置
|
|
31
|
-
- 使用 `core.i18n` 管理多语言
|
|
32
|
-
- 使用 `ok()` / `err()` 构建 HaiResult 类型返回值
|
|
33
|
-
- 创建模块级 logger 或 i18n 消息获取器
|
|
34
|
-
|
|
35
|
-
---
|
|
36
|
-
|
|
37
|
-
## 使用步骤
|
|
38
|
-
|
|
39
|
-
### 1. 初始化
|
|
40
|
-
|
|
41
|
-
```typescript
|
|
42
|
-
import { core } from '@h-ai/core'
|
|
43
|
-
|
|
44
|
-
// 自动加载 config/ 目录下的所有 _*.yml 和 *.yml
|
|
45
|
-
core.init({ configDir: './config' })
|
|
46
|
-
|
|
47
|
-
// 也可指定日志级别和配置监听
|
|
48
|
-
core.init({ configDir: './config', watchConfig: true })
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
### 2. 使用功能
|
|
52
|
-
|
|
53
|
-
```typescript
|
|
54
|
-
// 日志
|
|
55
|
-
core.logger.info('Server started', { port: 3000 })
|
|
56
|
-
|
|
57
|
-
// 配置
|
|
58
|
-
const dbConfig = core.config.get('db')
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
---
|
|
62
|
-
|
|
63
|
-
## 核心 API
|
|
64
|
-
|
|
65
|
-
### 生命周期
|
|
66
|
-
|
|
67
|
-
| 方法 | 签名 | 说明 |
|
|
68
|
-
| ----------- | --------------------------------- | ----------------------------------------- |
|
|
69
|
-
| `core.init` | `(options?: CoreOptions) => void` | 初始化(同步,加载配置目录中的所有 YAML) |
|
|
70
|
-
|
|
71
|
-
> `CoreOptions`:`{ logging?: Partial<LoggingConfig>, configDir?: string, watchConfig?: boolean }`
|
|
72
|
-
>
|
|
73
|
-
> 注意:core 没有 `close()` 方法,初始化后持续可用。
|
|
74
|
-
|
|
75
|
-
### 配置管理 — `core.config`
|
|
76
|
-
|
|
77
|
-
| 方法 | 签名 | 说明 |
|
|
78
|
-
| ------------ | -------------------------------------------------------------- | ------------------------------ |
|
|
79
|
-
| `get` | `<T>(name: string) => T \| undefined` | 获取模块配置段 |
|
|
80
|
-
| `getOrThrow` | `<T>(name: string) => T` | 获取配置(未加载时抛异常) |
|
|
81
|
-
| `load` | `<T>(name, filePath, schema?) => HaiResult<T>` | 手动加载配置文件 |
|
|
82
|
-
| `validate` | `<T>(name: string, schema: ZodType) => HaiResult<T>` | 用 Zod Schema 校验已加载的配置 |
|
|
83
|
-
| `has` | `(name: string) => boolean` | 检查配置段是否存在 |
|
|
84
|
-
| `reload` | `(name: string) => HaiResult<unknown>` | 重新从磁盘加载配置 |
|
|
85
|
-
| `clear` | `(name?: string) => void` | 清除配置缓存 |
|
|
86
|
-
| `keys` | `() => string[]` | 获取所有已加载的配置名称 |
|
|
87
|
-
| `watch` | `<T>(name, callback) => () => void` | 监听配置文件变更并自动重载 |
|
|
88
|
-
| `unwatch` | `(name?: string) => void` | 停止配置文件监听 |
|
|
89
|
-
| `isWatching` | `(name: string) => boolean` | 检查是否正在监听某个配置 |
|
|
90
|
-
|
|
91
|
-
**`watch()` 回调处理**:
|
|
92
|
-
|
|
93
|
-
```typescript
|
|
94
|
-
// watch 回调签名:(config: T | null, error?: HaiError) => void
|
|
95
|
-
// - 成功重载时:传入新配置,error 为 undefined
|
|
96
|
-
// - 重载失败时:config 为 null,error 为错误详情(包含 code 和 message)
|
|
97
|
-
|
|
98
|
-
const unwatch = core.config.watch('db', (cfg, error) => {
|
|
99
|
-
if (error) {
|
|
100
|
-
// 处理重载失败(如文件解析错误),不应更新本地使用的配置
|
|
101
|
-
core.logger.error('Config reload failed', {
|
|
102
|
-
name: 'db',
|
|
103
|
-
code: error.code,
|
|
104
|
-
message: error.message,
|
|
105
|
-
})
|
|
106
|
-
return
|
|
107
|
-
}
|
|
108
|
-
// 使用新配置
|
|
109
|
-
// 注意:此时 core.config.get('db') 已经指向新数据
|
|
110
|
-
core.logger.info('Config updated', { db: cfg })
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
// 调用 unwatch() 停止监听
|
|
114
|
-
unwatch()
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
配置文件格式(YAML,支持环境变量插值):
|
|
118
|
-
|
|
119
|
-
- `${VAR}` — 读取 `process.env.VAR`;缺失则返回 `HaiConfigError.CONFIG_ENV_VAR_MISSING` 错误
|
|
120
|
-
- `${VAR:default}` — 读取 `process.env.VAR`;缺失则使用默认值
|
|
121
|
-
- **类型还原**:整个值恰好是单个变量表达式时,结果还原为原生类型(number / boolean 等);混合文本始终为字符串
|
|
122
|
-
|
|
123
|
-
```yaml
|
|
124
|
-
# config/_core.yml
|
|
125
|
-
app:
|
|
126
|
-
name: ${HAI_APP_NAME:my-app} # → string
|
|
127
|
-
env: ${HAI_ENV:development} # → string
|
|
128
|
-
log:
|
|
129
|
-
level: ${HAI_LOG_LEVEL:info} # → string
|
|
130
|
-
format: ${HAI_LOG_FORMAT:pretty} # → string,pretty | json
|
|
131
|
-
feature:
|
|
132
|
-
debug: ${DEBUG:false} # → boolean false(类型还原)
|
|
133
|
-
maxRetries: ${MAX_RETRIES:3} # → number 3(类型还原)
|
|
134
|
-
url: http://${HOST}:${PORT} # → string(混合文本,不还原)
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
### 日志 — `core.logger`
|
|
138
|
-
|
|
139
|
-
`core.logger` 既是默认 Logger 实例,也是日志管理的统一入口。
|
|
140
|
-
|
|
141
|
-
**日志记录**(实例方法):`trace` / `debug` / `info` / `warn` / `error` / `fatal`
|
|
142
|
-
|
|
143
|
-
```typescript
|
|
144
|
-
core.logger.info('User created', { userId: '123' })
|
|
145
|
-
core.logger.error('Failed to connect', { error })
|
|
146
|
-
core.logger.debug('Processing item', { id, step: 'validation' })
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
**管理方法**:
|
|
150
|
-
|
|
151
|
-
| 方法 | 签名 | 说明 |
|
|
152
|
-
| ----------- | -------------------------------------- | ------------------------ |
|
|
153
|
-
| `create` | `(options?: LoggerOptions) => Logger` | 创建新 Logger 实例 |
|
|
154
|
-
| `child` | `(context: Record<string, unknown>) => Logger` | 创建携带固定上下文的子 Logger |
|
|
155
|
-
| `configure` | `(config: Partial<LoggingConfig>) => void` | 配置全局日志选项(级别、格式等) |
|
|
156
|
-
| `setLevel` | `(level: LogLevel) => void` | 设置全局日志级别 |
|
|
157
|
-
| `getLevel` | `() => LogLevel` | 获取当前全局日志级别 |
|
|
158
|
-
|
|
159
|
-
```typescript
|
|
160
|
-
// 创建模块级 logger
|
|
161
|
-
const logger = core.logger.create({ name: 'my-module' })
|
|
162
|
-
logger.info('Module initialized')
|
|
163
|
-
|
|
164
|
-
// 创建携带固定上下文的子 logger(自动合并到每条日志)
|
|
165
|
-
const reqLogger = core.logger.child({ requestId: 'req-001' })
|
|
166
|
-
reqLogger.info('Request started') // 日志中自动包含 requestId
|
|
167
|
-
|
|
168
|
-
// 配置输出格式和级别
|
|
169
|
-
core.logger.configure({
|
|
170
|
-
level: 'warn',
|
|
171
|
-
format: 'json',
|
|
172
|
-
redact: ['password', 'token'], // 脱敏字段
|
|
173
|
-
}) // Node.js 支持
|
|
174
|
-
core.logger.setLevel('debug')
|
|
175
|
-
const level = core.logger.getLevel() // 'debug'
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
**日志级别规范**:
|
|
179
|
-
|
|
180
|
-
| 级别 | 适用场景 |
|
|
181
|
-
| ------- | ---------------------------------- |
|
|
182
|
-
| `trace` | 循环内详细调试数据 |
|
|
183
|
-
| `debug` | 函数进入、参数概要、读操作 |
|
|
184
|
-
| `info` | 业务事件(初始化完成、写操作成功) |
|
|
185
|
-
| `warn` | 异常但可恢复(校验失败、重试) |
|
|
186
|
-
| `error` | 操作失败(需人工排查) |
|
|
187
|
-
| `fatal` | 致命错误(服务无法继续) |
|
|
188
|
-
|
|
189
|
-
### 国际化 — `core.i18n`
|
|
190
|
-
|
|
191
|
-
| 方法 | 签名 | 说明 |
|
|
192
|
-
| --------------------- | --------------------------------------------------------------------- | -------------- |
|
|
193
|
-
| `getGlobalLocale` | `() => string` | 获取当前语言 |
|
|
194
|
-
| `setGlobalLocale` | `(locale: string) => void` | 设置全局语言 |
|
|
195
|
-
| `createMessageGetter` | `(messages: Record<string, Record<string, string>>) => MessageGetter` | 创建消息获取器 |
|
|
196
|
-
|
|
197
|
-
创建模块 i18n:
|
|
198
|
-
|
|
199
|
-
```typescript
|
|
200
|
-
import enUS from '../messages/en-US.json'
|
|
201
|
-
import zhCN from '../messages/zh-CN.json'
|
|
202
|
-
|
|
203
|
-
const m = core.i18n.createMessageGetter({
|
|
204
|
-
'zh-CN': zhCN,
|
|
205
|
-
'en-US': enUS,
|
|
206
|
-
})
|
|
207
|
-
|
|
208
|
-
// 使用
|
|
209
|
-
m('user_created') // "用户已创建"
|
|
210
|
-
m('welcome', { params: { name: '张三' } }) // "欢迎,张三"
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
### ID 生成 — `core.id`
|
|
214
|
-
|
|
215
|
-
| 方法 | 签名 | 说明 |
|
|
216
|
-
| -------------- | --------------------------------------- | ----------------------------- |
|
|
217
|
-
| `generate` | `(size?: number) => string` | nanoid(默认 21 字符) |
|
|
218
|
-
| `short` | `() => string` | 10 字符短 ID |
|
|
219
|
-
| `withPrefix` | `(prefix: string, length?: number) => string` | 带前缀的 nanoid |
|
|
220
|
-
| `trace` | `() => string` | `trace-` 前缀 ID |
|
|
221
|
-
| `request` | `() => string` | `req-` 前缀 ID |
|
|
222
|
-
| `uuid` | `() => string` | UUID v4 |
|
|
223
|
-
| `isValidUUID` | `(value: string) => boolean` | 校验 UUID 格式 |
|
|
224
|
-
| `isValidNanoId`| `(value: string, size?: number) => boolean` | 校验 nanoid 格式 |
|
|
225
|
-
|
|
226
|
-
```typescript
|
|
227
|
-
const id = core.id.generate() // 'V1StGXR_Z5j3eK4uA9b8c'
|
|
228
|
-
const shortId = core.id.short() // 10 字符
|
|
229
|
-
const prefixed = core.id.withPrefix('order_') // 'order_V1StGXR...'
|
|
230
|
-
const traceId = core.id.trace() // 'trace-V1StGXR...'
|
|
231
|
-
const reqId = core.id.request() // 'req-V1StGXR...'
|
|
232
|
-
const uuid = core.id.uuid() // UUID v4
|
|
233
|
-
|
|
234
|
-
core.id.isValidUUID('f47ac10b-...') // true/false
|
|
235
|
-
core.id.isValidNanoId('abc123', 6) // true/false
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
### 工具函数
|
|
239
|
-
|
|
240
|
-
#### 类型检查 — `core.typeUtils`
|
|
241
|
-
|
|
242
|
-
`isDefined` / `isObject` / `isFunction` / `isPromise` / `isString` / `isNumber` / `isBoolean` / `isArray`
|
|
243
|
-
|
|
244
|
-
#### 对象操作 — `core.object`
|
|
245
|
-
|
|
246
|
-
`deepClone` / `deepMerge` / `pick` / `omit` / `keys` / `values` / `entries` / `fromEntries`
|
|
247
|
-
|
|
248
|
-
```typescript
|
|
249
|
-
core.object.deepMerge(a, b, c) // 递归合并(防原型污染)
|
|
250
|
-
core.object.pick(obj, ['a', 'b'])
|
|
251
|
-
core.object.omit(obj, ['c', 'd'])
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
#### 字符串操作 — `core.string`
|
|
255
|
-
|
|
256
|
-
`capitalize` / `kebabCase` / `camelCase` / `snakeCase` / `pascalCase` / `truncate` / `trim` / `isBlank` / `isNotBlank` / `padStart` / `padEnd` / `constantTimeEqual`
|
|
257
|
-
|
|
258
|
-
```typescript
|
|
259
|
-
core.string.capitalize('hello') // 'Hello'
|
|
260
|
-
core.string.kebabCase('helloWorld') // 'hello-world'
|
|
261
|
-
core.string.constantTimeEqual(a, b) // 防时序攻击比较
|
|
262
|
-
```
|
|
263
|
-
|
|
264
|
-
#### 数组操作 — `core.array`
|
|
265
|
-
|
|
266
|
-
`unique` / `chunk` / `groupBy` / `first` / `last` / `flatten` / `compact` / `shuffle` / `intersection` / `difference`
|
|
267
|
-
|
|
268
|
-
```typescript
|
|
269
|
-
core.array.unique([1, 1, 2]) // [1, 2]
|
|
270
|
-
core.array.chunk([1, 2, 3, 4], 2) // [[1,2], [3,4]]
|
|
271
|
-
core.array.groupBy(items, item => item.type) // Record<string, T[]>
|
|
272
|
-
core.array.intersection([1, 2], [2, 3]) // [2]
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
#### 异步操作 — `core.async`
|
|
276
|
-
|
|
277
|
-
`delay` / `withTimeout` / `retry` / `parallel` / `serial` / `debounce` / `throttle`
|
|
278
|
-
|
|
279
|
-
```typescript
|
|
280
|
-
await core.async.delay(1000)
|
|
281
|
-
await core.async.withTimeout(fetch('/api'), 5000)
|
|
282
|
-
await core.async.retry(fn, { maxRetries: 3, delay: 1000 })
|
|
283
|
-
await core.async.parallel(items, processFn, 5) // 并发限制
|
|
284
|
-
const debouncedFn = core.async.debounce(fn, 300)
|
|
285
|
-
```
|
|
286
|
-
|
|
287
|
-
#### 时间操作 — `core.time`
|
|
288
|
-
|
|
289
|
-
`formatDate` / `timeAgo` / `now` / `nowSeconds` / `parseDate` / `isValidDate` / `addDays` / `addHours` / `startOfDay` / `endOfDay`
|
|
290
|
-
|
|
291
|
-
```typescript
|
|
292
|
-
core.time.formatDate(new Date(), 'YYYY-MM-DD HH:mm:ss')
|
|
293
|
-
core.time.timeAgo(new Date(Date.now() - 60000)) // '1 分钟前'
|
|
294
|
-
core.time.addDays(date, 7)
|
|
295
|
-
```
|
|
296
|
-
|
|
297
|
-
### HaiResult 模型与错误处理
|
|
298
|
-
|
|
299
|
-
所有 hai 模块操作返回 `HaiResult<T>` 类型,强制处理成功/失败分支:
|
|
300
|
-
|
|
301
|
-
```typescript
|
|
302
|
-
import { ok, err, HaiCommonError } from '@h-ai/core'
|
|
303
|
-
|
|
304
|
-
// 成功
|
|
305
|
-
return ok(data)
|
|
306
|
-
|
|
307
|
-
// 失败
|
|
308
|
-
return err(HaiCommonError.NOT_FOUND, 'Resource not found')
|
|
309
|
-
```
|
|
310
|
-
|
|
311
|
-
**使用模式**:
|
|
312
|
-
|
|
313
|
-
```typescript
|
|
314
|
-
const result = await someOperation()
|
|
315
|
-
|
|
316
|
-
// 模式1:直接检查
|
|
317
|
-
if (!result.success) {
|
|
318
|
-
core.logger.error('Operation failed', { error: result.error })
|
|
319
|
-
return result // 直接透传错误
|
|
320
|
-
}
|
|
321
|
-
const data = result.data
|
|
322
|
-
|
|
323
|
-
// 模式2:提前返回
|
|
324
|
-
if (!result.success)
|
|
325
|
-
return result
|
|
326
|
-
// 后续代码可安全使用 result.data
|
|
327
|
-
```
|
|
328
|
-
|
|
329
|
-
## 错误码
|
|
330
|
-
|
|
331
|
-
Core 模块定义了两组标准错误码:
|
|
332
|
-
|
|
333
|
-
### `HaiCommonError`(通用错误)
|
|
334
|
-
|
|
335
|
-
| 错误码 | code | 说明 |
|
|
336
|
-
|--------|------|------|
|
|
337
|
-
| `HaiCommonError.NOT_INITIALIZED` | `hai:common:001` | 模块未初始化 |
|
|
338
|
-
| `HaiCommonError.INIT_FAILED` | `hai:common:002` | 初始化失败 |
|
|
339
|
-
| `HaiCommonError.INIT_IN_PROGRESS` | `hai:common:004` | 正在初始化中 |
|
|
340
|
-
| `HaiCommonError.UNAUTHORIZED` | `hai:common:100` | 未认证 |
|
|
341
|
-
| `HaiCommonError.FORBIDDEN` | `hai:common:101` | 无权限 |
|
|
342
|
-
| `HaiCommonError.TOKEN_EXPIRED` | `hai:common:102` | Token 已过期 |
|
|
343
|
-
| `HaiCommonError.TOKEN_INVALID` | `hai:common:103` | Token 无效 |
|
|
344
|
-
| `HaiCommonError.VALIDATION_ERROR` | `hai:common:200` | 校验失败 |
|
|
345
|
-
| `HaiCommonError.INVALID_REQUEST` | `hai:common:201` | 请求无效 |
|
|
346
|
-
| `HaiCommonError.PARAMETER_MISSING` | `hai:common:202` | 参数缺失 |
|
|
347
|
-
| `HaiCommonError.NOT_FOUND` | `hai:common:300` | 资源不存在 |
|
|
348
|
-
| `HaiCommonError.ALREADY_EXISTS` | `hai:common:301` | 资源已存在 |
|
|
349
|
-
| `HaiCommonError.CONFLICT` | `hai:common:302` | 冲突 |
|
|
350
|
-
| `HaiCommonError.API_ERROR` | `hai:common:400` | API 错误 |
|
|
351
|
-
| `HaiCommonError.NETWORK_ERROR` | `hai:common:401` | 网络错误 |
|
|
352
|
-
| `HaiCommonError.TIMEOUT` | `hai:common:402` | 超时 |
|
|
353
|
-
| `HaiCommonError.SERVICE_UNAVAILABLE` | `hai:common:403` | 服务不可用 |
|
|
354
|
-
| `HaiCommonError.INTERNAL_ERROR` | `hai:common:500` | 内部错误 |
|
|
355
|
-
| `HaiCommonError.DATABASE_ERROR` | `hai:common:501` | 数据库错误 |
|
|
356
|
-
| `HaiCommonError.UNKNOWN_ERROR` | `hai:common:599` | 未知错误 |
|
|
357
|
-
|
|
358
|
-
**使用示例**:
|
|
359
|
-
|
|
360
|
-
```typescript
|
|
361
|
-
import { HaiCommonError, err } from '@h-ai/core'
|
|
362
|
-
|
|
363
|
-
// 创建错误实例
|
|
364
|
-
err(HaiCommonError.NOT_FOUND, 'User not found')
|
|
365
|
-
err(HaiCommonError.VALIDATION_ERROR, 'Invalid email', validationErrors)
|
|
366
|
-
```
|
|
367
|
-
|
|
368
|
-
### `HaiConfigError`(配置错误)
|
|
369
|
-
|
|
370
|
-
| 错误码 | code | 说明 |
|
|
371
|
-
|--------|------|------|
|
|
372
|
-
| `HaiConfigError.CONFIG_FILE_NOT_FOUND` | `hai:core:010` | 配置文件不存在 |
|
|
373
|
-
| `HaiConfigError.CONFIG_PARSE_ERROR` | `hai:core:011` | YAML 解析失败 |
|
|
374
|
-
| `HaiConfigError.CONFIG_VALIDATION_ERROR` | `hai:core:012` | Schema 校验失败 |
|
|
375
|
-
| `HaiConfigError.CONFIG_ENV_VAR_MISSING` | `hai:core:013` | 必需环境变量缺失 |
|
|
376
|
-
| `HaiConfigError.CONFIG_NOT_LOADED` | `hai:core:014` | 配置未加载 |
|
|
377
|
-
|
|
378
|
-
**使用场景**:
|
|
379
|
-
|
|
380
|
-
```typescript
|
|
381
|
-
import { core, HaiConfigError } from '@h-ai/core'
|
|
382
|
-
|
|
383
|
-
const result = core.config.load('db', './config/db.yml', schema)
|
|
384
|
-
if (!result.success) {
|
|
385
|
-
if (result.error.code === HaiConfigError.CONFIG_FILE_NOT_FOUND.code) {
|
|
386
|
-
core.logger.error('Config file missing')
|
|
387
|
-
}
|
|
388
|
-
else if (result.error.code === HaiConfigError.CONFIG_VALIDATION_ERROR.code) {
|
|
389
|
-
core.logger.error('Config validation failed', { issues: result.error.cause })
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
```
|
|
393
|
-
|
|
394
|
-
## 常见模式
|
|
395
|
-
|
|
396
|
-
### 服务端初始化(SvelteKit hooks.server.ts)
|
|
397
|
-
|
|
398
|
-
```typescript
|
|
399
|
-
import { initModules } from '$lib/server/init'
|
|
400
|
-
|
|
401
|
-
// init.ts
|
|
402
|
-
import { core } from '@h-ai/core'
|
|
403
|
-
|
|
404
|
-
const appHandle = kit.createHandle({ /* ... */ })
|
|
405
|
-
|
|
406
|
-
export const handle = kit.sequence(appHandle)
|
|
407
|
-
|
|
408
|
-
let initialized = false
|
|
409
|
-
export async function initModules() {
|
|
410
|
-
if (initialized)
|
|
411
|
-
return
|
|
412
|
-
core.init({ configDir: './config' })
|
|
413
|
-
// ... 其他模块 init
|
|
414
|
-
initialized = true
|
|
415
|
-
}
|
|
416
|
-
```
|
|
417
|
-
|
|
418
|
-
### 配置校验最佳实践
|
|
419
|
-
|
|
420
|
-
```typescript
|
|
421
|
-
import { z } from 'zod'
|
|
422
|
-
|
|
423
|
-
const MyConfigSchema = z.object({
|
|
424
|
-
apiKey: z.string().min(1),
|
|
425
|
-
timeout: z.number().positive().default(5000),
|
|
426
|
-
})
|
|
427
|
-
|
|
428
|
-
// 模块初始化时校验
|
|
429
|
-
const result = core.config.validate('myModule', MyConfigSchema)
|
|
430
|
-
if (!result.success) {
|
|
431
|
-
core.logger.error('Invalid config', { error: result.error })
|
|
432
|
-
return result
|
|
433
|
-
}
|
|
434
|
-
const config = result.data // 类型安全
|
|
435
|
-
```
|
|
436
|
-
|
|
437
|
-
---
|
|
438
|
-
|
|
439
|
-
## 相关 Skills
|
|
440
|
-
|
|
441
|
-
- `hai-build`:项目整体架构与技能导航
|
|
442
|
-
- `hai-kit`:SvelteKit 集成层(Handle/Guard/Middleware)
|
|
443
|
-
- `hai-reldb` / `hai-cache` / `hai-iam`:使用 core.config 读取配置的下游模块
|
|
444
|
-
|
|
445
|
-
---
|
|
446
|
-
|
|
447
|
-
## 浏览器侧使用
|
|
448
|
-
|
|
449
|
-
> **禁止在应用中直接引入 `loglevel`。** `core.logger` 在浏览器端自动使用 loglevel 作为后端,API 与 Node.js 完全一致。
|
|
450
|
-
|
|
451
|
-
### 初始化
|
|
452
|
-
|
|
453
|
-
浏览器端无文件系统,不需要 `configDir`。在 `+layout.svelte` 或应用入口调用:
|
|
10
|
+
| 项目 | 契约 |
|
|
11
|
+
| --- | --- |
|
|
12
|
+
| 能力 | 使用 @h-ai/core 配置、日志、i18n、ID、Zod 错误本地化和 HaiResult |
|
|
13
|
+
| 适用场景 | 启动配置、日志脱敏、国际化或公共错误处理 |
|
|
14
|
+
| 输入 | CoreOptions、YAML、环境变量、locale、日志上下文 |
|
|
15
|
+
| 输出 | core.init 为同步 void;配置校验为 HaiResult;工具返回直接值 |
|
|
16
|
+
| 限制 | core 无 close;浏览器不加载 YAML。配置日志需脱敏,ID 不能当作密钥。 |
|
|
454
17
|
|
|
455
|
-
|
|
456
|
-
import { core } from '@h-ai/core'
|
|
18
|
+
## 使用路径
|
|
457
19
|
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
20
|
+
- Node 启动用 core.init({ configDir }) 加载配置;勿传 logging 覆盖 _core.yml 中的日志设置,除非任务明确要求。
|
|
21
|
+
- 自动加载和监听配置目录内所有 YAML;项目根 `hai.json` 的 `build` / `deploy` 由 CLI 读取,不进入运行时配置。单项 load 返回失败时记日志并继续,必需配置须 validate 并检查 success;目录扫描、日志设置等异常仍可能传播。
|
|
22
|
+
- 应用名称、版本、环境、默认语言和日志设置统一从 `_core.yml` 经 core.config 获取,日志使用 core.logger;UI 不另维护硬编码副本。SvelteKit layout / fullstack app.info 仅下发公开字段白名单;独立 Vite mobile-app 在 Node 构建时解析并注入公开默认值,修改这些编译默认值需要重新构建。静态 Web 的公开 API 地址等通过 `runtime-config.js` 覆盖时无需重建镜像,原生包在复制静态资源前准备配置入口。浏览器不加载 YAML,不接收完整模块配置、密钥或日志脱敏上下文。
|
|
23
|
+
- `HAI_<配置名>_<路径>` 可整体覆盖根/对象/数组;父节点优先,未覆盖时才遍历已有叶子。camelCase 不拆词,约定变量优先于显式插值。
|
|
24
|
+
- 环境文件采用六类:`.env.example` 完整列出字段用途、默认值、枚举和范围;`.env` 为公共基础;`.env.dev`、`.env.test`、`.env.prod` 为公共环境覆盖,这五类均提交 Git。`.env.local` 为本机私有配置,不提交 Git。优先级为进程环境 > `.env.local` > 环境文件 > `.env`;Vite 在 Node 配置阶段调用 `core.config.loadEnvFiles({ mode, envDir })` 并检查 success 后注入进程,Node 脚本按相同顺序传入 `--env-file`。`core.init` 不自行读取 dotenv。
|
|
25
|
+
- 配置 getter 与 ID/logger 方法不是 HaiResult;validate/load 等须检查 success。
|
|
26
|
+
- 日志可用 `{ error }` 记录原生 Error;两端先规范化诊断再字段/URL 脱敏,配置 redact 路径仍生效。默认包含 passwordHash、passwd、secretKey 等实际凭据字段;异常文本清理显式凭据标签和 URL,不保证识别无标签秘密。原异常不变,错误子图循环/深度用固定标记;业务隐私仍由调用方清理或遮蔽整条路径。
|
|
27
|
+
- 初始化前创建的默认、模块与嵌套 child Logger 在后续输出中应用当前全局 logging;configure/setLevel 也作用于已有实例。create 的显式 level/format/context 优先,未指定项动态继承。浏览器 json/pretty 与附加 redact 路径实际生效,消息文本仍由调用方脱敏。
|
|
461
28
|
|
|
462
|
-
|
|
29
|
+
错误提示与诊断分离:HTTP/UI 边界用 core.error.toPublic,仅公开 i18n 安全消息及 error.traceId;重新翻译后用 core.error.formatMessage 保留关联。ToastContainer 默认只显示可读说明,自动将编号移入排查信息图标,展开后可查看、复制并提供给客户支持或开发人员。前后端日志传完整 Error 和操作上下文,使用同一 requestId/traceId 并脱敏;禁止只写通用错误标题,也不能把 cause/ext/SQL/绑定值直接返回用户。数据库日志保留安全的驱动错误码、消息和堆栈。
|
|
463
30
|
|
|
464
|
-
|
|
465
|
-
// 与 Node.js 完全一致的 API
|
|
466
|
-
core.logger.info('Page loaded', { route: '/home' })
|
|
467
|
-
core.logger.error('API call failed', { url, status })
|
|
31
|
+
## 按需参考
|
|
468
32
|
|
|
469
|
-
|
|
470
|
-
const logger = core.logger.create({ name: 'my-page' })
|
|
471
|
-
logger.debug('Data fetched', { count: items.length })
|
|
33
|
+
真实客户端地址、每次请求的 IP/时间/路径策略、独立 YAML 及部署边界读取[请求访问控制](request-access.md);执行工具只从 Node `core.access` 使用。
|
|
472
34
|
|
|
473
|
-
|
|
474
|
-
// import log from 'loglevel' ← 不要这样做
|
|
475
|
-
```
|
|
35
|
+
按任务读取 [reference.md](reference.md) 的对应小节;签名以当前源码或安装版本的公开类型为准,不默认加载全部资料。示例中的业务变量由应用提供。
|
|
476
36
|
|
|
477
|
-
|
|
37
|
+
- 运行环境
|
|
38
|
+
- 适用场景
|
|
39
|
+
- 使用步骤
|
|
40
|
+
- 核心 API
|
|
41
|
+
- 错误码
|
|
42
|
+
- 常见模式
|
|
43
|
+
- 相关 Skills
|
|
44
|
+
- 浏览器侧使用
|
|
478
45
|
|
|
479
|
-
|
|
480
|
-
|------|------|
|
|
481
|
-
| `format: 'json' \| 'pretty'` | 被忽略(始终输出到 DevTools console) |
|
|
482
|
-
| `redact` 字段脱敏 | 不生效(需手动脱敏) |
|
|
483
|
-
| `fatal` 级别 | 映射为 `console.error`(带 `[FATAL]` 前缀) |
|
|
484
|
-
| context 输出 | JSON 字符串追加到消息末尾(非结构化对象) |
|
|
46
|
+
Node 请求/SSR 必须用 `core.i18n.runWithLocale(locale, callback)`(kit 同名方法)包裹实际异步 resolve;serv 自动建立请求语言上下文。浏览器 setGlobalLocale/createLocaleStore 继续管理应用语言,SSR 的 UI setter/store 不写全局值。显式 MessageOptions.locale 优先;进程默认语言仅在启动时设置。
|