@h-ai/cli 1.0.0-beta.2 → 1.0.0-beta.21
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 +74 -154
- package/README.ja.md +74 -154
- package/README.md +74 -154
- package/dist/{chunk-AKV2CQZV.js → chunk-2ZL5ORQ2.js} +316 -97
- package/dist/chunk-2ZL5ORQ2.js.map +1 -0
- package/dist/{chunk-EF7WOFWZ.js → chunk-L53P43B2.js} +1312 -163
- package/dist/chunk-L53P43B2.js.map +1 -0
- package/dist/cli-config-templates-LWMD2I6V.js +5 -0
- package/dist/{cli-config-templates-HHFHNXBN.js.map → cli-config-templates-LWMD2I6V.js.map} +1 -1
- package/dist/{cli-skill-templates-PN4FLGBC.js → cli-skill-templates-D6S2OQ6X.js} +3 -3
- package/dist/{cli-skill-templates-PN4FLGBC.js.map → cli-skill-templates-D6S2OQ6X.js.map} +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +30118 -3253
- package/dist/index.js.map +1 -1
- package/dist/metafile-esm.json +1 -1
- package/package.json +22 -18
- package/templates/README.md +45 -30
- package/templates/apps/admin/src/routes/+layout.svelte.hbs +16 -10
- package/templates/apps/admin/src/routes/+page.svelte.hbs +4 -4
- package/templates/apps/admin/src/routes/admin/+layout.svelte.hbs +17 -7
- package/templates/apps/admin/src/routes/admin/+page.svelte.hbs +26 -6
- package/templates/apps/admin/src/routes/admin/settings/+page.svelte.hbs +2 -2
- package/templates/apps/api/.dockerignore.hbs +10 -0
- package/templates/apps/api/apps/{{projectName}}-contract/README.md.hbs +8 -0
- package/templates/apps/api/apps/{{projectName}}-contract/src/app-schemas.ts.hbs +6 -1
- package/templates/apps/api/apps/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +13 -5
- package/templates/apps/api/apps/{{projectName}}-contract/tests/contract.test.ts.hbs +13 -5
- package/templates/apps/api/apps/{{projectName}}-contract/tsup.config.ts.hbs +3 -1
- package/templates/apps/api/apps/{{projectName}}-serv/README.md.hbs +6 -2
- package/templates/apps/api/apps/{{projectName}}-serv/config/_serv.yml.hbs +24 -2
- package/templates/apps/api/apps/{{projectName}}-serv/package.json.hbs +4 -4
- package/templates/apps/api/apps/{{projectName}}-serv/src/app.ts.hbs +74 -24
- package/templates/apps/api/apps/{{projectName}}-serv/src/build-metadata.ts.hbs +0 -1
- package/templates/apps/api/apps/{{projectName}}-serv/src/lib/server/init.ts.hbs +153 -37
- package/templates/apps/api/apps/{{projectName}}-serv/src/server/procedures/index.ts.hbs +39 -13
- package/templates/apps/api/apps/{{projectName}}-serv/tests/service.test.ts.hbs +106 -33
- package/templates/apps/api/apps/{{projectName}}-serv/tsup.config.ts.hbs +3 -1
- package/templates/apps/api/apps/{{projectName}}-serv/vitest.config.ts.hbs +3 -1
- package/templates/apps/api/e2e/api-serv.spec.ts.hbs +20 -3
- package/templates/apps/api/e2e/capture-evidence.ts.hbs +4 -1
- package/templates/apps/api/eslint.config.js.hbs +3 -1
- package/templates/apps/api/images/serv.Dockerfile.hbs +15 -10
- package/templates/apps/api/playwright.config.ts.hbs +23 -19
- package/templates/apps/api/pnpm-workspace.yaml.hbs +27 -16
- package/templates/apps/fullstack/.dockerignore.hbs +10 -0
- package/templates/apps/fullstack/.gitignore.hbs +7 -2
- package/templates/apps/fullstack/apps/{{projectName}}-app/README.md.hbs +14 -12
- package/templates/apps/fullstack/apps/{{projectName}}-app/capacitor.config.ts.hbs +5 -3
- package/templates/apps/fullstack/apps/{{projectName}}-app/eslint.config.js.hbs +10 -2
- package/templates/apps/fullstack/apps/{{projectName}}-app/package.json.hbs +1 -1
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/App.svelte.hbs +10 -2
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/build-metadata.ts.hbs +0 -1
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/lib/capacitor.ts.hbs +0 -1
- package/templates/apps/fullstack/apps/{{projectName}}-app/svelte.config.js.hbs +4 -1
- package/templates/apps/fullstack/apps/{{projectName}}-app/vite.config.ts.hbs +16 -4
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/README.md.hbs +10 -8
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/package.json.hbs +3 -3
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/App.svelte.hbs +8 -2
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/build-metadata.ts.hbs +0 -1
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/tauri.conf.json.hbs +0 -2
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/svelte.config.js.hbs +4 -1
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/vite.config.ts.hbs +16 -4
- package/templates/apps/fullstack/apps/{{projectName}}-miniapp/README.md.hbs +2 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/README.md.hbs +9 -9
- package/templates/apps/fullstack/apps/{{projectName}}-web/eslint.config.js.hbs +10 -2
- package/templates/apps/fullstack/apps/{{projectName}}-web/index.html.hbs +1 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/build-metadata.ts.hbs +0 -1
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/main.ts.hbs +0 -2
- package/templates/apps/fullstack/apps/{{projectName}}-web/svelte.config.js.hbs +4 -1
- package/templates/apps/fullstack/apps/{{projectName}}-web/vite.config.ts.hbs +19 -5
- package/templates/apps/fullstack/docs/security-configuration.md.hbs +4 -1
- package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +140 -28
- package/templates/apps/fullstack/e2e/session-close.spec.ts.hbs +19 -5
- package/templates/apps/fullstack/eslint.config.js.hbs +3 -1
- package/templates/apps/fullstack/images/serv.Dockerfile.hbs +19 -11
- package/templates/apps/fullstack/images/web.Dockerfile.hbs +17 -8
- package/templates/apps/fullstack/package.json.hbs +2 -1
- package/templates/apps/fullstack/packages/{{projectName}}-contract/README.md.hbs +7 -5
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-contract.ts.hbs +114 -23
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-schemas.ts.hbs +57 -11
- package/templates/apps/fullstack/packages/{{projectName}}-contract/tsup.config.ts.hbs +3 -1
- package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +17 -7
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_reach.yml.hbs +13 -7
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_serv.yml.hbs +17 -7
- package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +10 -4
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/app-server.ts.hbs +65 -30
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/build-metadata.ts.hbs +0 -1
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/index.ts.hbs +1 -2
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/admin-service.ts.hbs +69 -21
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/business-settings.ts.hbs +21 -5
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/admin-procedures.ts.hbs +63 -11
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/app-procedures.ts.hbs +6 -1
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/index.ts.hbs +3 -1
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/runtime.ts.hbs +147 -33
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/security-roles.ts.hbs +43 -12
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/app-server.test.ts.hbs +146 -30
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/runtime.test.ts.hbs +33 -10
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/security.test.ts.hbs +142 -26
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tsup.config.ts.hbs +6 -2
- package/templates/apps/fullstack/packages/{{projectName}}-serv/vitest.config.ts.hbs +3 -1
- package/templates/apps/fullstack/packages/{{projectName}}-shared/README.md.hbs +48 -66
- package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/en-US.json.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/ja-JP.json.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/zh-CN.json.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/api-client.ts.hbs +9 -2
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/feedback-client.ts.hbs +0 -3
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/sensitive-actions.svelte.ts.hbs +15 -3
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AppShell.svelte.hbs +33 -7
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/FeedbackEntry.svelte.hbs +16 -2
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/audit.svelte.hbs +104 -13
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/feedback.svelte.hbs +37 -7
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/roles.svelte.hbs +9 -3
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/settings.svelte.hbs +25 -3
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/users.svelte.hbs +133 -19
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/security/role-label.ts.hbs +14 -2
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/guide-store.ts.hbs +66 -34
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/management-store.svelte.ts.hbs +132 -30
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/theme-store.svelte.ts.hbs +8 -2
- package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/api-client.test.ts.hbs +23 -5
- package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/management-store.test.ts.hbs +143 -21
- package/templates/apps/fullstack/packages/{{projectName}}-shared/vitest.config.ts.hbs +7 -2
- package/templates/apps/fullstack/playwright.config.ts.hbs +25 -3
- package/templates/apps/fullstack/pnpm-workspace.yaml.hbs +30 -14
- package/templates/apps/h5/src/routes/+layout.svelte.hbs +74 -30
- package/templates/apps/h5/src/routes/+page.svelte.hbs +2 -2
- package/templates/apps/h5/src/routes/discover/+page.svelte.hbs +2 -2
- package/templates/apps/h5/src/routes/profile/+page.svelte.hbs +2 -2
- package/templates/apps/mobile-app/capacitor.config.ts.hbs +5 -2
- package/templates/apps/mobile-app/messages/en-US.json +2 -2
- package/templates/apps/mobile-app/messages/ja-JP.json +2 -2
- package/templates/apps/mobile-app/messages/zh-CN.json +2 -2
- package/templates/apps/mobile-app/src/App.svelte.hbs +17 -5
- package/templates/apps/mobile-app/src/lib/api.ts.hbs +20 -6
- package/templates/apps/mobile-app/src/lib/app-config.ts.hbs +8 -1
- package/templates/apps/mobile-app/src/lib/pages/home.svelte.hbs +6 -2
- package/templates/apps/mobile-app/src/lib/pages/profile.svelte.hbs +13 -1
- package/templates/apps/mobile-app/src/lib/pages/tasks.svelte.hbs +5 -1
- package/templates/apps/website/scripts/static-website.mjs.hbs +19 -6
- package/templates/apps/website/src/routes/+layout.svelte.hbs +56 -29
- package/templates/apps/website/src/routes/+page.svelte.hbs +4 -4
- package/templates/apps/website/src/routes/about/+page.svelte.hbs +2 -2
- package/templates/apps/website/src/routes/contact/+page.svelte.hbs +2 -2
- package/templates/apps/website/src/routes/services/+page.svelte.hbs +20 -5
- package/templates/base/.dockerignore.hbs +10 -0
- package/templates/base/.gitignore.hbs +7 -2
- package/templates/base/e2e/app.spec.ts.hbs +130 -36
- package/templates/base/eslint-rules.js +44 -25
- package/templates/base/eslint.config.js.hbs +3 -1
- package/templates/base/images/web.Dockerfile.hbs +25 -14
- package/templates/base/package.json.hbs +13 -7
- package/templates/base/patches/daisyui-5.7.50.patch +8 -0
- package/templates/base/patches/deepmerge-4.3.1.patch +51 -0
- package/templates/base/playwright.config.ts +3 -1
- package/templates/base/pnpm-workspace.yaml.hbs +33 -16
- package/templates/base/src/app.d.ts.hbs +1 -1
- package/templates/base/src/app.html.hbs +1 -0
- package/templates/base/src/hooks.server.ts.hbs +44 -33
- package/templates/base/src/lib/build-metadata.ts.hbs +0 -1
- package/templates/base/src/lib/server/init.ts.hbs +146 -35
- package/templates/base/src/lib/server/kit-config.ts.hbs +7 -4
- package/templates/base/src/routes/+layout.server.ts.hbs +2 -2
- package/templates/base/svelte.config.js.hbs +10 -100
- package/templates/base/tests/scaffold.test.ts.hbs +12 -3
- package/templates/base/tsconfig.json.hbs +7 -4
- package/templates/base/vite.config.ts.hbs +108 -14
- package/templates/base/vitest.config.ts.hbs +6 -2
- package/templates/features/ai/routes/api/chat/+server.ts +3 -1
- package/templates/features/iam/routes-admin/(auth)/auth/forgot-password/+page.svelte.hbs +3 -3
- package/templates/features/iam/routes-admin/(auth)/auth/login/+page.svelte.hbs +3 -3
- package/templates/features/iam/routes-admin/(auth)/auth/register/+page.svelte.hbs +3 -3
- package/templates/features/iam/routes-admin/(auth)/auth/reset-password/+page.svelte.hbs +3 -3
- package/templates/features/iam/routes-h5/auth/forgot-password/+page.svelte.hbs +3 -3
- package/templates/features/iam/routes-h5/auth/login/+page.svelte.hbs +3 -3
- package/templates/features/iam/routes-h5/auth/register/+page.svelte.hbs +3 -3
- package/templates/features/iam/routes-h5/auth/reset-password/+page.svelte.hbs +3 -3
- package/templates/features/iam/routes-website/auth/forgot-password/+page.svelte.hbs +3 -3
- package/templates/features/iam/routes-website/auth/login/+page.svelte.hbs +3 -3
- package/templates/features/iam/routes-website/auth/register/+page.svelte.hbs +3 -3
- package/templates/features/iam/routes-website/auth/reset-password/+page.svelte.hbs +3 -3
- package/templates/features/payment/routes/api/v1/payment/create/+server.ts +14 -3
- package/templates/shared/browser-check/startup.js +115 -0
- package/templates/shared/browser-check/update.css +37 -0
- package/templates/shared/browser-check/update.html +19 -0
- package/templates/shared/browser-startup.spec.ts +23 -0
- package/templates/shared/build-metadata.ts +18 -4
- package/templates/shared/e2e-env.ts +22 -6
- package/templates/shared/native-name.d.mts +5 -0
- package/templates/shared/native-name.mjs +94 -0
- package/templates/shared/public-base-path.mjs +17 -4
- package/templates/shared/run-e2e.mjs +46 -12
- package/templates/shared/run-node.mjs +56 -0
- package/templates/shared/run-tauri.mjs +74 -0
- package/templates/shared/vite-runtime-config.ts +9 -3
- package/templates/skills/AGENTS.md +10 -73
- package/templates/skills/bridges/admin/AGENTS.md +9 -65
- package/templates/skills/bridges/api/AGENTS.md +8 -59
- package/templates/skills/bridges/fullstack/AGENTS.md.hbs +9 -54
- package/templates/skills/bridges/h5/AGENTS.md +8 -63
- package/templates/skills/bridges/mobile-app/AGENTS.md +8 -62
- package/templates/skills/bridges/website/AGENTS.md +8 -63
- package/templates/skills/hai-ai/SKILL.md +6 -2
- package/templates/skills/hai-ai/acp.md +153 -0
- package/templates/skills/hai-ai/guide.md +27 -12
- package/templates/skills/hai-ai/reference.md +24 -15
- package/templates/skills/hai-ai/resources.md +69 -0
- package/templates/skills/hai-api-client/SKILL.md +1 -1
- package/templates/skills/hai-api-client/reference.md +3 -1
- package/templates/skills/hai-app-create/collaboration.md +7 -0
- package/templates/skills/hai-app-create/development.md +19 -10
- package/templates/skills/hai-app-create/project.md +33 -0
- package/templates/skills/hai-app-create/reference.md +10 -10
- package/templates/skills/hai-app-tests/reference.md +1 -1
- package/templates/skills/hai-app-tests/validation.md +1 -0
- package/templates/skills/hai-build/SKILL.md +19 -9
- package/templates/skills/hai-build/paths.md +4 -2
- package/templates/skills/hai-build/reference.md +26 -8
- package/templates/skills/hai-cache/reference.md +6 -2
- package/templates/skills/hai-capacitor/SKILL.md +1 -0
- package/templates/skills/hai-capacitor/reference.md +24 -0
- package/templates/skills/hai-ci/SKILL.md +3 -0
- package/templates/skills/hai-core/SKILL.md +9 -4
- package/templates/skills/hai-core/reference.md +40 -10
- package/templates/skills/hai-core/request-access.md +2 -2
- package/templates/skills/hai-crypto/SKILL.md +2 -2
- package/templates/skills/hai-crypto/reference.md +7 -3
- package/templates/skills/hai-deploy/SKILL.md +41 -5
- package/templates/skills/hai-deploy/middleware.md +26 -14
- package/templates/skills/hai-framework-sync/SKILL.md +13 -9
- package/templates/skills/hai-framework-sync/sync.md +2 -0
- package/templates/skills/hai-iam/reference.md +2 -2
- package/templates/skills/hai-kit/SKILL.md +1 -1
- package/templates/skills/hai-kit/reference.md +19 -5
- package/templates/skills/hai-payment/reference.md +41 -17
- package/templates/skills/hai-reach/SKILL.md +3 -1
- package/templates/skills/hai-reach/reference.md +29 -9
- package/templates/skills/hai-reldb/SKILL.md +1 -1
- package/templates/skills/hai-reldb/reference.md +9 -2
- package/templates/skills/hai-scheduler/reference.md +1 -1
- package/templates/skills/hai-serv/SKILL.md +2 -1
- package/templates/skills/hai-serv/reference.md +26 -15
- package/templates/skills/hai-storage/reference.md +23 -6
- package/templates/skills/hai-ui/SKILL.md +11 -6
- package/templates/skills/hai-ui/charts.md +51 -0
- package/templates/skills/hai-ui/guide.md +1 -1
- package/templates/skills/hai-ui/reference.md +58 -38
- package/templates/skills/hai-vecdb/reference.md +8 -3
- package/dist/chunk-AKV2CQZV.js.map +0 -1
- package/dist/chunk-EF7WOFWZ.js.map +0 -1
- package/dist/chunk-MUHRBJSW.js +0 -29272
- package/dist/chunk-MUHRBJSW.js.map +0 -1
- package/dist/cli-config-templates-HHFHNXBN.js +0 -5
- package/dist/src-TEBHR5I5.js +0 -5
- package/dist/src-TEBHR5I5.js.map +0 -1
- package/templates/apps/fullstack/playwright.session-close.config.ts.hbs +0 -18
|
@@ -5,7 +5,10 @@ import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'
|
|
|
5
5
|
|
|
6
6
|
/** @type {import('@sveltejs/vite-plugin-svelte').SvelteConfig} */
|
|
7
7
|
const config = {
|
|
8
|
-
preprocess: [
|
|
8
|
+
preprocess: [
|
|
9
|
+
vitePreprocess(),
|
|
10
|
+
autoImportHaiUi(),
|
|
11
|
+
],
|
|
9
12
|
compilerOptions: {
|
|
10
13
|
// 使用 Svelte 5 Runes,和 @h-ai/ui 组件库保持一致。
|
|
11
14
|
runes: true,
|
|
@@ -14,7 +14,9 @@ import { resolveBuildMetadata } from '../../scripts/build-metadata.js'
|
|
|
14
14
|
const envDir = fileURLToPath(new URL('../../', import.meta.url))
|
|
15
15
|
|
|
16
16
|
export default defineConfig(({ mode, command }) => {
|
|
17
|
-
const envResult = command === 'build' || process.env.HAI_E2E === '1'
|
|
17
|
+
const envResult = command === 'build' || process.env.HAI_E2E === '1'
|
|
18
|
+
? { success: true as const, data: {} as Record<string, string> }
|
|
19
|
+
: core.config.loadEnvFiles({ mode, envDir })
|
|
18
20
|
if (!envResult.success)
|
|
19
21
|
throw new Error(envResult.error.message)
|
|
20
22
|
const env = envResult.data
|
|
@@ -23,15 +25,23 @@ export default defineConfig(({ mode, command }) => {
|
|
|
23
25
|
const metadataAsset: Plugin = {
|
|
24
26
|
name: 'hai-build-metadata',
|
|
25
27
|
generateBundle() {
|
|
26
|
-
this.emitFile({
|
|
28
|
+
this.emitFile({
|
|
29
|
+
type: 'asset',
|
|
30
|
+
fileName: 'build-metadata.json',
|
|
31
|
+
source: JSON.stringify(buildMetadata),
|
|
32
|
+
})
|
|
27
33
|
},
|
|
28
34
|
}
|
|
29
35
|
const target = (env.PUBLIC_API_BASE || process.env.SERVICE_BASE_URL || 'http://127.0.0.1:3000').replace(/\/api\/v1\/?$/, '')
|
|
30
|
-
const proxy = {
|
|
36
|
+
const proxy = {
|
|
37
|
+
'/api': { target, changeOrigin: true },
|
|
38
|
+
}
|
|
31
39
|
return {
|
|
32
40
|
base: './',
|
|
33
41
|
envDir: false,
|
|
34
|
-
define: {
|
|
42
|
+
define: {
|
|
43
|
+
__HAI_BUILD_METADATA__: JSON.stringify(buildMetadata),
|
|
44
|
+
},
|
|
35
45
|
server: { proxy },
|
|
36
46
|
preview: { proxy },
|
|
37
47
|
build: {
|
|
@@ -51,6 +61,8 @@ export default defineConfig(({ mode, command }) => {
|
|
|
51
61
|
metadataAsset,
|
|
52
62
|
svelte(),
|
|
53
63
|
paraglideVitePlugin({
|
|
64
|
+
// 共享物理消息产物供独立 Vitest/Node 工具读取。
|
|
65
|
+
outputStructure: 'message-modules',
|
|
54
66
|
project: './project.inlang',
|
|
55
67
|
outdir: './src/lib/paraglide',
|
|
56
68
|
strategy: ['cookie', 'baseLocale'],
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
## 简介
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Tauri v2 + Svelte 5 + Vite桌面工程,前端通过共享contract调用 `{{fullstack.servPackageName}}`。
|
|
8
8
|
|
|
9
9
|
## 核心功能清单
|
|
10
10
|
|
|
@@ -16,6 +16,8 @@
|
|
|
16
16
|
|
|
17
17
|
### i18n 与 shared 协同
|
|
18
18
|
|
|
19
|
+
先从工程根安装依赖、启动Serv并配置实际API地址,再运行tauri:dev。有效账号登录后使用相同共享管理界面;输入受权限允许的管理操作,输出与Web一致。关闭并重启原生程序后内存凭据不保留,需要重新登录;外观/语言属于服务器偏好,登录后恢复。
|
|
20
|
+
|
|
19
21
|
- 本端页面文案:`messages/{locale}.json` + `project.inlang/settings.json`
|
|
20
22
|
- 共享 Shell/主题/语言/API:`packages/{{fullstack.sharedPackageName}}`
|
|
21
23
|
- 个人设置保存语言与风格偏好到 IAM 元数据,并同步 shared 和本端 Paraglide runtime
|
|
@@ -26,6 +28,8 @@
|
|
|
26
28
|
|
|
27
29
|
### 编译、打包与部署
|
|
28
30
|
|
|
31
|
+
产品名和主窗口初始标题统一取工程根环境文件解析后的 `packages/{{fullstack.servPackageName}}/config/_core.yml` 的 `name`,可用 `HAI_CORE_NAME` 覆盖。`tauri:dev` 默认 `dev`、打包默认 `prod`;进程 `HAI_CORE_ENV` 可指定模式。请使用下面的 `pnpm` 入口,直接 `pnpm exec tauri` / `cargo tauri` 会绕过名称解析。入口通过 `--config` 覆盖,不回写 JSON;显式追加的 `--config` 保留最终覆盖权。
|
|
32
|
+
|
|
29
33
|
```bash
|
|
30
34
|
# 仅前端开发,默认端口 {{fullstack.ports.desktop}}
|
|
31
35
|
pnpm --filter {{projectName}}-desktop dev
|
|
@@ -40,17 +44,15 @@ pnpm --filter {{projectName}}-desktop build
|
|
|
40
44
|
pnpm build --target desktop --platform windows --arch x64
|
|
41
45
|
```
|
|
42
46
|
|
|
43
|
-
打包前需要安装 Rust 工具链和 Tauri
|
|
44
|
-
|
|
45
|
-
### IAM 认证配置
|
|
47
|
+
打包前需要安装 Rust 工具链和 Tauri 平台依赖。原生名称按 Core 规则读取环境文件,只将名称传入 Tauri 配置;前端源码编译不读取部署环境文件。启动已安装程序前设置进程 PUBLIC_API_BASE(HTTP(S),不含凭据、查询和片段)。Rust 会在页面加载前注入公开地址,仅将该 Origin 加入 CSP;不需要为 API 地址的 test/prod 切换重打安装包,修改原生名称仍需重新打包。缺省连接 http://localhost:3000/api/v1。
|
|
46
48
|
|
|
47
|
-
|
|
49
|
+
加 `--debug` 生成调试安装包。成功后 CLI 打印 `.hai/build/desktop/<平台>/<构建类型>/build-{{projectName}}-desktop-<平台>-<架构>-<类型>-YYYYMMDD-HHmmss-<随机串>-<版本>/` 中的归档路径。Windows 文件名如 `{{projectName}}-windows-x64-release-<版本>-setup.exe`;使用工程标识,产品显示名仍取 Core。
|
|
48
50
|
|
|
49
|
-
|
|
51
|
+
### 认证与模块导航
|
|
50
52
|
|
|
51
|
-
|
|
53
|
+
认证方式、注册、密码策略、协议与品牌由Serv的 `_iam.yml` 控制。前端只接收安全公开配置,使用共享AuthPanel和加密typed client;服务端再次核验权限。LDAP、通知回调、用途证明和会话限制在服务端接入,不把私密配置复制到客户端。
|
|
52
54
|
|
|
53
|
-
|
|
55
|
+
所有前端共用的偏好、认证存储、表单、审计与帮助行为见[共享工作区](../../packages/{{fullstack.sharedPackageName}}/README.md),详细配置见[生成应用IAM技能](../../.agents/skills/hai-iam/reference.md)。
|
|
54
56
|
|
|
55
57
|
启用反馈时使用 SDK 原生保存对话框,Tauri dialog/fs 插件只允许选择路径后写入。CSP 允许图片和视频 blob 预览、沙箱回放,脚本和网络来源限制保持明确;Web 浏览器验证不代替系统 WebView/安装包验收。
|
|
56
58
|
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
"test": "pnpm paraglide:compile && vitest run --passWithNoTests",
|
|
24
24
|
"test:watch": "pnpm paraglide:compile && vitest",
|
|
25
25
|
"clean": "rimraf dist .turbo src-tauri/target src/lib/paraglide",
|
|
26
|
-
"tauri": "tauri",
|
|
27
|
-
"tauri:dev": "tauri dev",
|
|
28
|
-
"tauri:build": "tauri build"
|
|
26
|
+
"tauri": "node ../../scripts/run-tauri.mjs ../.. packages/{{fullstack.servPackageName}}/config/_core.yml",
|
|
27
|
+
"tauri:dev": "pnpm tauri dev",
|
|
28
|
+
"tauri:build": "pnpm tauri build"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@h-ai/api-client": "{{haiPackageSpecifier}}",
|
|
@@ -12,8 +12,14 @@
|
|
|
12
12
|
const native = '__TAURI_INTERNALS__' in globalThis
|
|
13
13
|
const apiOptions: ManagementApiOptions = {
|
|
14
14
|
clientName: '{{projectName}}-desktop',
|
|
15
|
-
|
|
16
|
-
...(native
|
|
15
|
+
terminalType: 'desktop',
|
|
16
|
+
...(native
|
|
17
|
+
? {
|
|
18
|
+
requireApiBase: true,
|
|
19
|
+
tokenStorage: apiClient.tokenStorage.memory(),
|
|
20
|
+
headers: { 'X-HAI-Token-Transport': 'body' },
|
|
21
|
+
}
|
|
22
|
+
: {}),
|
|
17
23
|
}
|
|
18
24
|
|
|
19
25
|
function syncLocale(locale: string) {
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
{{#if fullstack.frontends.desktop}}
|
|
3
3
|
{
|
|
4
4
|
"$schema": "https://schema.tauri.app/config/2",
|
|
5
|
-
"productName": {{json fullstack.appName}},
|
|
6
5
|
"version": "../../../package.json",
|
|
7
6
|
"identifier": "com.hai.{{fullstack.nativeAppIdSegment}}.desktop",
|
|
8
7
|
"build": {
|
|
@@ -14,7 +13,6 @@
|
|
|
14
13
|
"app": {
|
|
15
14
|
"windows": [
|
|
16
15
|
{
|
|
17
|
-
"title": {{json fullstack.appName}},
|
|
18
16
|
"width": 1280,
|
|
19
17
|
"height": 800,
|
|
20
18
|
"resizable": true,
|
|
@@ -5,7 +5,10 @@ import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'
|
|
|
5
5
|
|
|
6
6
|
/** @type {import('@sveltejs/vite-plugin-svelte').SvelteConfig} */
|
|
7
7
|
export default {
|
|
8
|
-
preprocess: [
|
|
8
|
+
preprocess: [
|
|
9
|
+
vitePreprocess(),
|
|
10
|
+
autoImportHaiUi(),
|
|
11
|
+
],
|
|
9
12
|
compilerOptions: {
|
|
10
13
|
// 使用 Svelte 5 Runes,和 @h-ai/ui 组件库保持一致。
|
|
11
14
|
runes: true,
|
|
@@ -15,7 +15,9 @@ const host = process.env.TAURI_DEV_HOST
|
|
|
15
15
|
const envDir = fileURLToPath(new URL('../../', import.meta.url))
|
|
16
16
|
|
|
17
17
|
export default defineConfig(({ mode, command }) => {
|
|
18
|
-
const envResult = command === 'build' || process.env.HAI_E2E === '1'
|
|
18
|
+
const envResult = command === 'build' || process.env.HAI_E2E === '1'
|
|
19
|
+
? { success: true as const, data: {} as Record<string, string> }
|
|
20
|
+
: core.config.loadEnvFiles({ mode, envDir })
|
|
19
21
|
if (!envResult.success)
|
|
20
22
|
throw new Error(envResult.error.message)
|
|
21
23
|
const env = envResult.data
|
|
@@ -24,16 +26,24 @@ export default defineConfig(({ mode, command }) => {
|
|
|
24
26
|
const metadataAsset: Plugin = {
|
|
25
27
|
name: 'hai-build-metadata',
|
|
26
28
|
generateBundle() {
|
|
27
|
-
this.emitFile({
|
|
29
|
+
this.emitFile({
|
|
30
|
+
type: 'asset',
|
|
31
|
+
fileName: 'build-metadata.json',
|
|
32
|
+
source: JSON.stringify(buildMetadata),
|
|
33
|
+
})
|
|
28
34
|
},
|
|
29
35
|
}
|
|
30
36
|
const target = (env.PUBLIC_API_BASE || process.env.SERVICE_BASE_URL || 'http://127.0.0.1:3000').replace(/\/api\/v1\/?$/, '')
|
|
31
|
-
const proxy = {
|
|
37
|
+
const proxy = {
|
|
38
|
+
'/api': { target, changeOrigin: true },
|
|
39
|
+
}
|
|
32
40
|
|
|
33
41
|
return {
|
|
34
42
|
base: './',
|
|
35
43
|
envDir: false,
|
|
36
|
-
define: {
|
|
44
|
+
define: {
|
|
45
|
+
__HAI_BUILD_METADATA__: JSON.stringify(buildMetadata),
|
|
46
|
+
},
|
|
37
47
|
preview: { proxy },
|
|
38
48
|
build: {
|
|
39
49
|
rolldownOptions: {
|
|
@@ -53,6 +63,8 @@ export default defineConfig(({ mode, command }) => {
|
|
|
53
63
|
svelte(),
|
|
54
64
|
tailwindcss(),
|
|
55
65
|
paraglideVitePlugin({
|
|
66
|
+
// 共享物理消息产物供独立 Vitest/Node 工具读取。
|
|
67
|
+
outputStructure: 'message-modules',
|
|
56
68
|
project: './project.inlang',
|
|
57
69
|
outdir: './src/lib/paraglide',
|
|
58
70
|
strategy: ['cookie', 'baseLocale'],
|
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
|
|
16
16
|
选定小程序框架后再实现页面、请求适配和认证。小程序文案放本目录 `messages/`,跨端通用内容放 `packages/{{fullstack.sharedPackageName}}`;消息格式插件使用工程根已安装的依赖。
|
|
17
17
|
|
|
18
|
+
例如在messages加入一条中英日文业务提示,当前输出只是可供后续接入的消息资源,不会生成页面或安装包。引用contract只获得输入输出类型,不能自动获得请求传输、登录、安全存储或平台权限。建立真正的小程序工程后再加入workspace、运行脚本和发布流程。
|
|
19
|
+
|
|
18
20
|
## 开发测试
|
|
19
21
|
|
|
20
22
|
本目录不参与 workspace 构建、单元测试或 E2E。接入实际框架后增加对应命令,并在目标平台验证登录、请求、导航与发布包。
|
|
@@ -16,6 +16,8 @@
|
|
|
16
16
|
|
|
17
17
|
### i18n 与 shared 协同
|
|
18
18
|
|
|
19
|
+
从根目录安装依赖并启动Serv,再执行本页dev命令。输入有效测试账号后进入共享管理界面;普通用户只能看到被授权的功能。修改个人资料成功才结束编辑,失败保留输入。个人设置的主题/语言保存后,刷新并重新登录应能恢复。
|
|
20
|
+
|
|
19
21
|
- 本端页面文案:`messages/{locale}.json` + `project.inlang/settings.json`
|
|
20
22
|
- 共享 Shell/主题/语言/API:`packages/{{fullstack.sharedPackageName}}`
|
|
21
23
|
- 个人设置保存语言与风格偏好到 IAM 元数据,并同步 shared 和本端 Paraglide runtime
|
|
@@ -24,6 +26,8 @@
|
|
|
24
26
|
|
|
25
27
|
### 编译、打包与部署
|
|
26
28
|
|
|
29
|
+
入口 HTML 在主应用前执行 `public/_hai/browser-check/startup.js`。Chrome/Edge 低于 111、Firefox 低于 114、Safari 或 iOS/iPadOS 低于 16.4 时,独立升级页会显示当前版本、最低要求和厂商更新入口。发布时连同该目录的 HTML 和样式一起部署。
|
|
30
|
+
|
|
27
31
|
```bash
|
|
28
32
|
# 开发预览,默认端口 {{fullstack.ports.web}}
|
|
29
33
|
pnpm --filter {{projectName}}-web dev
|
|
@@ -32,21 +36,17 @@ pnpm --filter {{projectName}}-web dev
|
|
|
32
36
|
pnpm --filter {{projectName}}-web build
|
|
33
37
|
```
|
|
34
38
|
|
|
35
|
-
从工程根运行 `pnpm build --target
|
|
36
|
-
|
|
37
|
-
### IAM 认证配置
|
|
38
|
-
|
|
39
|
-
服务端 `config/_iam.yml` 统一控制登录、注册、重置、协议与 `ui` 品牌。邮件/短信可用 `_reach.yml` 中的 Provider/标准模板或自定义发送回调。`AuthPanel` 使用安全公开配置及框架认证动作;无需在页面适配 Token、验证码倒计时和错误提示。Memory 仅用于本地开发和显式测试;生产环境即使只有一个实例,也须使用框架支持的共享数据库与 Redis,并按工程根 README 配置写入路由和传输会话。
|
|
39
|
+
从工程根运行 `pnpm build --target image` 导出镜像。默认带部署工具,可运行 `pnpm run deploy --env test --build` 一次完成构建发布,或 `pnpm run deploy --env prod --bundle-only` 交付已有镜像及跨平台脚本。完整包包含自建中间件,人工部署与按服务更新见工程根 README。
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
### 认证与模块导航
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
认证方式、注册、密码策略、协议与品牌由Serv的 `_iam.yml` 控制。前端只接收安全公开配置,使用共享AuthPanel和加密typed client;服务端再次核验权限。LDAP、通知回调、用途证明和会话限制在服务端接入,不把私密配置复制到客户端。
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
所有前端共用的偏好、认证存储、表单、审计与帮助行为见[共享工作区](../../packages/{{fullstack.sharedPackageName}}/README.md),详细配置见[生成应用IAM技能](../../.agents/skills/hai-iam/reference.md)。
|
|
46
46
|
|
|
47
47
|
## 开发测试
|
|
48
48
|
|
|
49
|
-
从工程根执行 `pnpm typecheck`、`pnpm lint`、`pnpm build`、`pnpm test` 和 `pnpm test:e2e
|
|
49
|
+
从工程根执行 `pnpm typecheck`、`pnpm lint`、`pnpm build`、`pnpm test` 和 `pnpm test:e2e`。浏览器通过后仍需在实际公开地址验证部署、认证与持久数据。
|
|
50
50
|
|
|
51
51
|
## 许可证
|
|
52
52
|
|
|
@@ -5,9 +5,17 @@ import { haiQualityConfig } from '../../eslint-rules.js'
|
|
|
5
5
|
|
|
6
6
|
export default antfu({
|
|
7
7
|
// unused-imports 使用 TS 规则,JS 同样使用 TS parser 以保持 scope 契约一致。
|
|
8
|
-
typescript: {
|
|
8
|
+
typescript: {
|
|
9
|
+
files: [GLOB_SRC],
|
|
10
|
+
},
|
|
9
11
|
formatters: true,
|
|
10
|
-
ignores: [
|
|
12
|
+
ignores: [
|
|
13
|
+
'**/build/**',
|
|
14
|
+
'**/dist/**',
|
|
15
|
+
'**/*.d.ts',
|
|
16
|
+
'**/project.inlang/**',
|
|
17
|
+
'**/src/lib/paraglide/**',
|
|
18
|
+
],
|
|
11
19
|
svelte: true,
|
|
12
20
|
}, haiQualityConfig, {
|
|
13
21
|
files: ['**/*.svelte'],
|
|
@@ -5,7 +5,10 @@ import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'
|
|
|
5
5
|
|
|
6
6
|
/** @type {import('@sveltejs/vite-plugin-svelte').SvelteConfig} */
|
|
7
7
|
const config = {
|
|
8
|
-
preprocess: [
|
|
8
|
+
preprocess: [
|
|
9
|
+
vitePreprocess(),
|
|
10
|
+
autoImportHaiUi(),
|
|
11
|
+
],
|
|
9
12
|
compilerOptions: {
|
|
10
13
|
// 使用 Svelte 5 Runes,和 @h-ai/ui 组件库保持一致。
|
|
11
14
|
runes: true,
|
|
@@ -15,7 +15,9 @@ import { resolvePublicBasePath } from '../../scripts/public-base-path.mjs'
|
|
|
15
15
|
const envDir = fileURLToPath(new URL('../../', import.meta.url))
|
|
16
16
|
|
|
17
17
|
export default defineConfig(({ mode, command }) => {
|
|
18
|
-
const envResult = command === 'build' || process.env.HAI_E2E === '1'
|
|
18
|
+
const envResult = command === 'build' || process.env.HAI_E2E === '1'
|
|
19
|
+
? { success: true as const, data: {} as Record<string, string> }
|
|
20
|
+
: core.config.loadEnvFiles({ mode, envDir })
|
|
19
21
|
if (!envResult.success)
|
|
20
22
|
throw new Error(envResult.error.message)
|
|
21
23
|
const env = envResult.data
|
|
@@ -24,16 +26,26 @@ export default defineConfig(({ mode, command }) => {
|
|
|
24
26
|
const metadataAsset: Plugin = {
|
|
25
27
|
name: 'hai-build-metadata',
|
|
26
28
|
generateBundle() {
|
|
27
|
-
this.emitFile({
|
|
29
|
+
this.emitFile({
|
|
30
|
+
type: 'asset',
|
|
31
|
+
fileName: 'build-metadata.json',
|
|
32
|
+
source: JSON.stringify(buildMetadata),
|
|
33
|
+
})
|
|
28
34
|
},
|
|
29
35
|
}
|
|
30
36
|
const target = (env.PUBLIC_API_BASE || process.env.SERVICE_BASE_URL || 'http://127.0.0.1:3000').replace(/\/api\/v1\/?$/, '')
|
|
31
|
-
const proxy = {
|
|
37
|
+
const proxy = {
|
|
38
|
+
'/api': { target, changeOrigin: true },
|
|
39
|
+
}
|
|
32
40
|
const publicBase = resolvePublicBasePath()
|
|
33
41
|
return {
|
|
34
|
-
base: publicBase
|
|
42
|
+
base: publicBase
|
|
43
|
+
? `${publicBase}/`
|
|
44
|
+
: './',
|
|
35
45
|
envDir: false,
|
|
36
|
-
define: {
|
|
46
|
+
define: {
|
|
47
|
+
__HAI_BUILD_METADATA__: JSON.stringify(buildMetadata),
|
|
48
|
+
},
|
|
37
49
|
server: { proxy },
|
|
38
50
|
preview: { proxy },
|
|
39
51
|
build: {
|
|
@@ -53,6 +65,8 @@ export default defineConfig(({ mode, command }) => {
|
|
|
53
65
|
metadataAsset,
|
|
54
66
|
svelte(),
|
|
55
67
|
paraglideVitePlugin({
|
|
68
|
+
// 共享物理消息产物供独立 Vitest/Node 工具读取。
|
|
69
|
+
outputStructure: 'message-modules',
|
|
56
70
|
project: './project.inlang',
|
|
57
71
|
outdir: './src/lib/paraglide',
|
|
58
72
|
strategy: ['cookie', 'baseLocale'],
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
| 文件 | 用途 |
|
|
8
8
|
| ------------------------------------------------------------ | -------------------------------------------------- |
|
|
9
9
|
| `packages/{{projectName}}-serv/config/_iam.yml` | 账号、密码、验证码、锁定、敏感操作、登录限制、会话 |
|
|
10
|
+
| `packages/{{projectName}}-serv/config/_serv.yml` | API 传输加密及请求时间窗口 |
|
|
10
11
|
| `packages/{{projectName}}-serv/config/_audit.yml` | 审计采集、脱敏、保留、备份、告警 |
|
|
11
12
|
| `packages/{{projectName}}-serv/config/_reach.yml` | 邮件、短信或通知 API 及通知模板 |
|
|
12
13
|
| `packages/{{projectName}}-serv/config/_scheduler.yml` | 已有 Scheduler 的持久化及调度参数 |
|
|
@@ -30,6 +31,8 @@ HAI_AUDIT_BACKUP_ENABLED=true
|
|
|
30
31
|
|
|
31
32
|
这里列的是 fullstack 模板默认值,不是所有项目或底层 Schema 的普适限制。
|
|
32
33
|
|
|
34
|
+
加密请求默认有效 300 秒,允许客户端时间领先服务器最多 30 秒。可在 `_serv.yml` 的 `transport` 下设置 `maxRequestAgeSeconds`(1~600)和 `maxFutureSkewSeconds`(0~300),单位为整数秒。超限时,前端显示校验时的服务器 UTC 时间,提示用户开启设备自动校时或手工修改时间,然后刷新。升级旧版本后,从最后一个旧节点停止处理请求起等待 12 分钟,再把请求有效期调到 300 秒以上。
|
|
35
|
+
|
|
33
36
|
| 条目 | fullstack 默认及启用入口 | 使用影响 |
|
|
34
37
|
| ---------------------------- | --------------------------------------------------------------- | -------------------------------------------------------- |
|
|
35
38
|
| B03 长期/临时账号 | 用户管理中的账号类型、到期时间 | 临时账号必须有未来到期时间;到期后旧会话也不能继续使用 |
|
|
@@ -128,7 +131,7 @@ security:
|
|
|
128
131
|
|
|
129
132
|
## 独立初始凭据和安全邀请
|
|
130
133
|
|
|
131
|
-
CLI 创建完成时会提示四个用户名、职责及密码变量位置;不在终端打印明文密码。新项目已在 `.env.dev/.env.test/.env.prod` 中为 admin、audit_admin、config_admin、business_operator 分别生成独立随机密码,各环境也不同。服务首次启动才创建缺失账号;缺少对应初始密码时跳过该账号,已有账号不覆盖。Admin Console 仓库示例由部署者在私有环境/进程中提供下表四个变量,不能把模板随机密码当成示例的固定通用密码。同名进程变量或 `.env.local` 可覆盖;修改这些初始变量不会重设已有账号的密码。需要首次强改时,在首次创建这些账号前开启上一节的 `requireInitialChange`。
|
|
134
|
+
CLI 创建完成时会提示四个用户名、职责及密码变量位置;不在终端打印明文密码。新项目已在 `.env.dev.local/.env.test.local/.env.prod.local` 中为 admin、audit_admin、config_admin、business_operator 分别生成独立随机密码,各环境也不同。服务首次启动才创建缺失账号;缺少对应初始密码时跳过该账号,已有账号不覆盖。Admin Console 仓库示例由部署者在私有环境/进程中提供下表四个变量,不能把模板随机密码当成示例的固定通用密码。同名进程变量或 `.env.local` 可覆盖;修改这些初始变量不会重设已有账号的密码。需要首次强改时,在首次创建这些账号前开启上一节的 `requireInitialChange`。
|
|
132
135
|
|
|
133
136
|
日常创建业务账号希望改为一次性邀请,先配置真实发送通道,再设置:
|
|
134
137
|
|