create-bubbles 0.1.26 → 0.1.28
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/dist/index.js +4 -4
- package/package.json +10 -2
- package/template-pnpm-vp-monorepo/.changeset/README.md +8 -0
- package/template-pnpm-vp-monorepo/.changeset/config.json +11 -0
- package/template-pnpm-vp-monorepo/.gitattributes +5 -0
- package/template-pnpm-vp-monorepo/.github/workflows/ci.yml +33 -0
- package/template-pnpm-vp-monorepo/.github/workflows/docs.yml +55 -0
- package/template-pnpm-vp-monorepo/.github/workflows/release.yml +54 -0
- package/template-pnpm-vp-monorepo/.vite-hooks/commit-msg +1 -0
- package/template-pnpm-vp-monorepo/.vite-hooks/pre-commit +1 -0
- package/template-pnpm-vp-monorepo/.vite-hooks/run.mjs +17 -0
- package/template-pnpm-vp-monorepo/.vscode/settings.json +23 -0
- package/{LICENSE → template-pnpm-vp-monorepo/LICENSE} +2 -2
- package/template-pnpm-vp-monorepo/README.md +93 -0
- package/template-pnpm-vp-monorepo/_gitignore +43 -0
- package/template-pnpm-vp-monorepo/apps/docs/.vitepress/config.mts +69 -0
- package/template-pnpm-vp-monorepo/apps/docs/guide/getting-started.md +70 -0
- package/template-pnpm-vp-monorepo/apps/docs/guide/release.md +73 -0
- package/template-pnpm-vp-monorepo/apps/docs/guide/workspace.md +84 -0
- package/template-pnpm-vp-monorepo/apps/docs/index.md +22 -0
- package/template-pnpm-vp-monorepo/apps/docs/package.json +23 -0
- package/template-pnpm-vp-monorepo/apps/docs/tsconfig.json +7 -0
- package/template-pnpm-vp-monorepo/apps/docs/vite.config.ts +12 -0
- package/template-pnpm-vp-monorepo/apps/playground/index.html +14 -0
- package/template-pnpm-vp-monorepo/apps/playground/package.json +24 -0
- package/template-pnpm-vp-monorepo/apps/playground/src/App.vue +214 -0
- package/template-pnpm-vp-monorepo/apps/playground/src/env.d.ts +6 -0
- package/template-pnpm-vp-monorepo/apps/playground/src/main.ts +6 -0
- package/template-pnpm-vp-monorepo/apps/playground/src/style.css +728 -0
- package/template-pnpm-vp-monorepo/apps/playground/tsconfig.json +10 -0
- package/template-pnpm-vp-monorepo/apps/playground/vite.config.ts +29 -0
- package/template-pnpm-vp-monorepo/commitlint.config.mjs +3 -0
- package/template-pnpm-vp-monorepo/eslint.config.mjs +22 -0
- package/template-pnpm-vp-monorepo/mise.toml +3 -0
- package/template-pnpm-vp-monorepo/package.json +40 -0
- package/template-pnpm-vp-monorepo/packages/utils/LICENSE +21 -0
- package/template-pnpm-vp-monorepo/packages/utils/README.md +26 -0
- package/template-pnpm-vp-monorepo/packages/utils/_gitignore +4 -0
- package/template-pnpm-vp-monorepo/packages/utils/package.json +42 -0
- package/template-pnpm-vp-monorepo/packages/utils/scripts/verify-package.mjs +127 -0
- package/template-pnpm-vp-monorepo/packages/utils/src/index.ts +12 -0
- package/template-pnpm-vp-monorepo/packages/utils/tests/consumer/commonjs.cts +20 -0
- package/template-pnpm-vp-monorepo/packages/utils/tests/consumer/esm.mts +20 -0
- package/template-pnpm-vp-monorepo/packages/utils/tests/consumer/tsconfig.json +10 -0
- package/template-pnpm-vp-monorepo/packages/utils/tests/index.test.ts +30 -0
- package/template-pnpm-vp-monorepo/packages/utils/tsconfig.json +4 -0
- package/template-pnpm-vp-monorepo/packages/utils/vite.config.ts +20 -0
- package/template-pnpm-vp-monorepo/pnpm-workspace.yaml +27 -0
- package/template-pnpm-vp-monorepo/tsconfig/base.json +22 -0
- package/template-pnpm-vp-monorepo/tsconfig/node.json +8 -0
- package/template-pnpm-vp-monorepo/tsconfig/vue.json +7 -0
- package/template-pnpm-vp-monorepo/tsconfig.json +4 -0
- package/template-pnpm-vp-monorepo/vite.config.ts +38 -0
- package/template-vp-monorepo-react-nestjs/.agents/rules//345/205/261/344/272/253/344/273/243/347/240/201.md +2 -2
- package/template-vp-monorepo-react-nestjs/.agents/rules//351/234/200/346/261/202/344/270/216/350/256/276/350/256/241/346/226/207/346/241/243.md +50 -0
- package/template-vp-monorepo-react-nestjs/.codegraph/.gitignore +5 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225/PRD.md +121 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225/ui/cleanup-empty-preview.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225/ui/company-created.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225/ui/login-desktop.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225/ui/member-role-assigned.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225/ui/permission-revoked.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225/ui/platform-menu-recovery.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225/ui/project-created.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225/ui/project-member-home.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225/ui/replacement-administrator.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225/ui/workspace-empty.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225//345/206/263/347/255/226/350/256/260/345/275/225.md +29 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225//345/211/215/347/253/257/344/272/244/346/216/245.md +74 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225//345/220/216/347/253/257/346/265/213/350/257/225/346/212/245/345/221/212.md +115 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225//346/212/200/346/234/257/345/245/221/347/272/246.md +580 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225//346/265/213/350/257/225/346/212/245/345/221/212.md +137 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225//346/265/213/350/257/225/350/257/201/346/215/256/browser.json +84 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225//346/265/213/350/257/225/350/257/201/346/215/256/http.json +108 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225//346/265/213/350/257/225/350/257/201/346/215/256/legacy-http.json +18 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225//346/265/213/350/257/225/350/257/201/346/215/256/legacy.json +24 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225//350/201/224/350/260/203/350/256/260/345/275/225.md +76 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225//350/277/220/350/241/214/350/257/264/346/230/216.md +117 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225//351/234/200/346/261/202/346/226/207/346/241/243.md +275 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//347/273/204/347/273/207/346/236/266/346/236/204//345/206/263/347/255/226/350/256/260/345/275/225.md +35 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//347/273/204/347/273/207/346/236/266/346/236/204//346/212/200/346/234/257/345/245/221/347/272/246.md +744 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//347/273/204/347/273/207/346/236/266/346/236/204//346/265/213/350/257/225/346/212/245/345/221/212.md +174 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//347/273/204/347/273/207/346/236/266/346/236/204//350/201/224/350/260/203/350/256/260/345/275/225.md +137 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//347/273/204/347/273/207/346/236/266/346/236/204//350/256/276/350/256/241/346/226/271/346/241/210.md +215 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//347/273/204/347/273/207/346/236/266/346/236/204//351/234/200/346/261/202/346/226/207/346/241/243.md +421 -0
- package/template-vp-monorepo-react-nestjs/.spaces/{server/05./344/270/212/344/274/240/346/224/271/351/200/240/346/226/271/346/241/210/README.md → 02./344/270/212/344/274/240/344/270/216/346/226/207/344/273/266//344/270/212/344/274/240/346/224/271/351/200/240//350/256/276/350/256/241/346/226/271/346/241/210.md} +13 -20
- package/template-vp-monorepo-react-nestjs/.spaces/{server/06./345/205/254/345/205/261/351/230/237/345/210/227/346/216/245/345/205/245/346/226/271/346/241/210//344/270/212/344/274/240/346/270/205/347/220/206.md → 02./344/270/212/344/274/240/344/270/216/346/226/207/344/273/266//344/270/212/344/274/240/346/270/205/347/220/206//350/256/276/350/256/241/346/226/271/346/241/210.md} +13 -8
- package/template-vp-monorepo-react-nestjs/.spaces/{server/04.upload.md → 02./344/270/212/344/274/240/344/270/216/346/226/207/344/273/266//345/210/206/347/211/207/344/270/212/344/274/240//345/256/236/346/226/275/346/225/231/347/250/213.md} +21 -18
- package/template-vp-monorepo-react-nestjs/.spaces/{server/06./345/205/254/345/205/261/351/230/237/345/210/227/346/216/245/345/205/245/346/226/271/346/241/210/README.md → 03./344/273/273/345/212/241/351/230/237/345/210/227//345/205/254/345/205/261/351/230/237/345/210/227//350/256/276/350/256/241/346/226/271/346/241/210.md} +13 -6
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/accounts-mobile-320.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/accounts-mobile-360.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/accounts-mobile-390.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/companies-desktop-data.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/companies-desktop-empty.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/companies-mobile-320.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/companies-mobile-360.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/companies-mobile-390.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/company-create-dialog.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/company-projects-1440.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/company-projects-390.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/login-1440.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/login-390.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/project-home-1440.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/project-home-390.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/register-1440.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/register-390.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/workspaces-1440.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/workspaces-390.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/workspaces-empty.png +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273//345/267/245/345/205/267/fixtures.mjs +132 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273//345/267/245/345/205/267/visual-check.mjs +274 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273//346/265/213/350/257/225/350/257/201/346/215/256/visual-report.json +104 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273//351/252/214/350/257/201/350/257/264/346/230/216.md +25 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//344/272/244/344/273/230/350/256/260/345/275/225.md +21 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//345/217/221/345/270/203/350/257/204/344/274/260.md +93 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//345/267/245/345/205/267//350/277/220/350/241/214/346/227/266/345/217/221/345/270/203/346/243/200/346/237/245.mjs +340 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/346/212/245/345/221/212.md +41 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256/cli-/346/211/253/346/217/217/350/276/271/347/225/214/comment-clean/catalog/en_US.json +4 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256/cli-/346/211/253/346/217/217/350/276/271/347/225/214/comment-clean/i18n.config.mjs +9 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256/cli-/346/211/253/346/217/217/350/276/271/347/225/214/comment-clean/report.json +16 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256/cli-/346/211/253/346/217/217/350/276/271/347/225/214/comment-clean/source/app.ts +2 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256/cli-/346/211/253/346/217/217/350/276/271/347/225/214/empty-scan/catalog/en_US.json +4 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256/cli-/346/211/253/346/217/217/350/276/271/347/225/214/empty-scan/i18n.config.mjs +9 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256/cli-/346/211/253/346/217/217/350/276/271/347/225/214/empty-scan/report.json +19 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256/cli-/346/211/253/346/217/217/350/276/271/347/225/214/output.json +84 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256/cli-/346/211/253/346/217/217/350/276/271/347/225/214//345/275/223/345/211/215/345/244/215/351/252/214.json +86 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256/cli-/346/211/253/346/217/217/350/276/271/347/225/214//346/243/200/346/237/245/347/273/223/346/236/234.json +30 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256/cli-/346/211/253/346/217/217/350/276/271/347/225/214//346/263/250/351/207/212/345/233/236/345/275/222.json +40 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256//345/214/205/345/217/221/345/270/203/bubblesjs-i18n-core-0.0.0.tgz +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256//345/214/205/345/217/221/345/270/203/bubblesjs-i18n-react-0.0.0.tgz +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256//345/214/205/345/217/221/345/270/203/bubblesjs-i18n-vue-0.0.1.tgz +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256//345/214/205/345/217/221/345/270/203//344/272/247/347/211/251/345/244/215/351/252/214.json +419 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256//345/214/205/345/217/221/345/270/203//346/243/200/346/237/245/347/273/223/346/236/234.json +339 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256//350/277/220/350/241/214/346/227/266/345/217/221/345/270/203/346/243/200/346/237/245.json +131 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//350/256/276/350/256/241/346/226/271/346/241/210.md +37 -0
- package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//351/234/200/346/261/202/346/226/207/346/241/243.md +42 -0
- package/template-vp-monorepo-react-nestjs/.spaces/05./350/277/220/350/241/214/347/273/264/346/212/244//345/271/263/345/217/260/346/223/215/344/275/234/346/211/213/345/206/214.md +397 -0
- package/template-vp-monorepo-react-nestjs/.spaces/05./350/277/220/350/241/214/347/273/264/346/212/244//346/225/260/346/215/256/345/272/223/350/277/201/347/247/273//345/244/207/344/273/275/backup.dump +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/05./350/277/220/350/241/214/347/273/264/346/212/244//346/225/260/346/215/256/345/272/223/350/277/201/347/247/273//345/244/207/344/273/275/export-dump.ps1 +34 -0
- package/template-vp-monorepo-react-nestjs/.spaces/05./350/277/220/350/241/214/347/273/264/346/212/244//346/225/260/346/215/256/345/272/223/350/277/201/347/247/273//345/244/207/344/273/275/restore-dump.ps1 +73 -0
- package/template-vp-monorepo-react-nestjs/.spaces/05./350/277/220/350/241/214/347/273/264/346/212/244//346/225/260/346/215/256/345/272/223/350/277/201/347/247/273//346/223/215/344/275/234/346/214/207/345/215/227.md +227 -0
- package/template-vp-monorepo-react-nestjs/.spaces/05./350/277/220/350/241/214/347/273/264/346/212/244//346/225/260/346/215/256/345/272/223/350/277/201/347/247/273//351/234/200/346/261/202/346/226/207/346/241/243.md +31 -0
- package/template-vp-monorepo-react-nestjs/.spaces/06./350/256/244/350/257/201/344/270/216/344/274/232/350/257/235//344/274/232/350/257/235/347/256/241/347/220/206//346/212/200/346/234/257/345/245/221/347/272/246.md +96 -0
- package/template-vp-monorepo-react-nestjs/.spaces/06./350/256/244/350/257/201/344/270/216/344/274/232/350/257/235//344/274/232/350/257/235/347/256/241/347/220/206//351/234/200/346/261/202/346/226/207/346/241/243.md +88 -0
- package/template-vp-monorepo-react-nestjs/.spaces/06./350/256/244/350/257/201/344/270/216/344/274/232/350/257/235//344/277/256/346/224/271/345/257/206/347/240/201/PRD.md +56 -0
- package/template-vp-monorepo-react-nestjs/.spaces/06./350/256/244/350/257/201/344/270/216/344/274/232/350/257/235//344/277/256/346/224/271/345/257/206/347/240/201//346/212/200/346/234/257/345/245/221/347/272/246.md +93 -0
- package/template-vp-monorepo-react-nestjs/.spaces/06./350/256/244/350/257/201/344/270/216/344/274/232/350/257/235//344/277/256/346/224/271/345/257/206/347/240/201//346/265/213/350/257/225/346/212/245/345/221/212.md +41 -0
- package/template-vp-monorepo-react-nestjs/.spaces/06./350/256/244/350/257/201/344/270/216/344/274/232/350/257/235//344/277/256/346/224/271/345/257/206/347/240/201//350/201/224/350/260/203/350/256/260/345/275/225.md +27 -0
- package/template-vp-monorepo-react-nestjs/.spaces/06./350/256/244/350/257/201/344/270/216/344/274/232/350/257/235//344/277/256/346/224/271/345/257/206/347/240/201//350/256/276/350/256/241/346/226/271/346/241/210.md +54 -0
- package/template-vp-monorepo-react-nestjs/.spaces/06./350/256/244/350/257/201/344/270/216/344/274/232/350/257/235//344/277/256/346/224/271/345/257/206/347/240/201//351/234/200/346/261/202/346/226/207/346/241/243.md +64 -0
- package/template-vp-monorepo-react-nestjs/.spaces/07.API/344/270/216/351/224/231/350/257/257//346/212/200/346/234/257/345/245/221/347/272/246.md +95 -0
- package/template-vp-monorepo-react-nestjs/.spaces/README.md +86 -0
- package/template-vp-monorepo-react-nestjs/.spaces//346/226/207/346/241/243/350/247/204/350/214/203.md +97 -0
- package/template-vp-monorepo-react-nestjs/AGENTS.md +12 -0
- package/template-vp-monorepo-react-nestjs/README.md +3 -27
- package/template-vp-monorepo-react-nestjs/apps/server/drizzle/0002_enterprise_access.sql +182 -0
- package/template-vp-monorepo-react-nestjs/apps/server/drizzle/0003_cute_killmonger.sql +357 -0
- package/template-vp-monorepo-react-nestjs/apps/server/drizzle/0004_company-member-invitations.sql +25 -0
- package/template-vp-monorepo-react-nestjs/apps/server/drizzle/0005_menu_svg_icons.sql +54 -0
- package/template-vp-monorepo-react-nestjs/apps/server/drizzle/meta/0002_snapshot.json +1801 -0
- package/template-vp-monorepo-react-nestjs/apps/server/drizzle/meta/0003_snapshot.json +3511 -0
- package/template-vp-monorepo-react-nestjs/apps/server/drizzle/meta/0004_snapshot.json +3713 -0
- package/template-vp-monorepo-react-nestjs/apps/server/drizzle/meta/_journal.json +29 -1
- package/template-vp-monorepo-react-nestjs/apps/server/drizzle/rollback/0003_organization_backfill.sql +32 -0
- package/template-vp-monorepo-react-nestjs/apps/server/package.json +6 -4
- package/template-vp-monorepo-react-nestjs/apps/server/src/access-init.ts +45 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/app.controller.ts +3 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/app.module.ts +28 -5
- package/template-vp-monorepo-react-nestjs/apps/server/src/app.service.ts +3 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/common/adapters/fastify.adapter.ts +11 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/common/constants/session.constants.ts +9 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/common/decorators/access-policy.decorator.ts +18 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/common/decorators/current-auth.decorator.ts +4 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/common/decorators/public.decorator.ts +3 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/common/exceptions/app.exception.ts +9 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/common/filters/global-exception.filter.ts +38 -5
- package/template-vp-monorepo-react-nestjs/apps/server/src/common/security/password-security-event.ts +98 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/config/app.config.ts +3 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/config/database.config.ts +3 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/config/llm.config.ts +3 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/config/queue.config.ts +14 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/config/redis.config.ts +3 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/config/session.config.ts +7 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/config/storage.config.ts +9 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/database/access.schema.ts +394 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/database/db.module.ts +3 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/database/organization.schema.ts +453 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/database/schema.ts +6 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/main.ts +4 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access-http.ts +29 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access.errors.ts +130 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access.guard.ts +63 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access.module.ts +27 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access.service.ts +441 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access.store.ts +68 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access.validation.ts +44 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/maintenance/permissions-cleanup.controller.ts +27 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/maintenance/permissions-cleanup.service.ts +260 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/maintenance/permissions-cleanup.validation.ts +7 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/roles/roles.controller.ts +80 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/roles/roles.service.ts +249 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/roles/roles.validation.ts +24 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/seed/access-seed.service.ts +183 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/workspaces/workspaces.controller.ts +28 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/workspaces/workspaces.service.ts +94 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/workspaces/workspaces.validation.ts +5 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/audit/audit.controller.ts +26 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/audit/audit.module.ts +11 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/audit/audit.service.ts +74 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/audit/audit.validation.ts +11 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.controller.ts +25 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.errors.ts +10 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.module.ts +1 -1
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.repository.ts +60 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.service.ts +69 -11
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/dto/register.dto.ts +1 -1
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/guards/session-auth.guard.ts +8 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/password/change-password.dto.ts +17 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/password.service.ts +6 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/session/session-store.service.ts +46 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/session/session-token.service.ts +12 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/session/session.script.ts +7 -1
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/companies/companies.controller.ts +105 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/companies/companies.module.ts +12 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/companies/companies.service.ts +523 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/accounts/accounts.controller.ts +72 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/accounts/accounts.service.ts +154 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/accounts/accounts.validation.ts +8 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/accounts/password-reset/password-reset.service.ts +81 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/accounts/password-reset/reset-password.validation.ts +13 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/administrators/administrators.service.ts +116 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/administrators/administrators.validation.ts +1 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/invitations/company-member-invitations.controller.ts +69 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/invitations/member-invitation-acceptance.controller.ts +23 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/invitations/member-invitations.service.ts +344 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/invitations/member-invitations.validation.ts +23 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/members.controller.ts +88 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/members.module.ts +31 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/members.service.ts +573 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/members.validation.ts +19 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/menus/menus.controller.ts +56 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/menus/menus.module.ts +11 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/menus/menus.service.ts +230 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/menus/menus.validation.ts +30 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/candidates/global-account/global-account-candidates.controller.ts +35 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/candidates/global-account/global-account-candidates.service.ts +109 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/candidates/member-candidates.controller.ts +60 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/candidates/member-candidates.service.ts +939 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/initialization/project-organization-initialization.service.ts +189 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/organization.module.ts +34 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/organization.store.ts +150 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/organization.validation.ts +23 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/positions/positions.controller.ts +160 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/positions/positions.service.ts +636 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/templates/organization-templates.controller.ts +77 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/templates/organization-templates.service.ts +501 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/templates/organization-templates.store.ts +163 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/units/organization-units.controller.ts +187 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/units/organization-units.service.ts +947 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/projects/projects.controller.ts +94 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/projects/projects.module.ts +13 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/projects/projects.service.ts +369 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/queue-worker.bootstrap.ts +3 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.contracts.ts +4 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.module.ts +5 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.processor.ts +13 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.service.ts +9 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/db/db.controller.ts +9 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/db/db.service.ts +9 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/redis/redis.controller.ts +9 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/redis/redis.service.ts +18 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/dto/upload-params.dto.ts +1 -1
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/storage/exact-size.transform.ts +14 -3
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/storage/minio-storage.adapter.ts +37 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/storage/storage.port.ts +21 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.constants.ts +9 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.controller.ts +25 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.reponsitory.ts +27 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.service.ts +78 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/utils/object-key.ts +4 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/utils/server-address.ts +6 -0
- package/template-vp-monorepo-react-nestjs/apps/server/test/access/access-policy.spec.ts +95 -0
- package/template-vp-monorepo-react-nestjs/apps/server/test/access/access.integration.spec.ts +2250 -0
- package/template-vp-monorepo-react-nestjs/apps/server/test/access/member-onboarding.validation.spec.ts +78 -0
- package/template-vp-monorepo-react-nestjs/apps/server/test/auth/password/password-operations.spec.ts +433 -0
- package/template-vp-monorepo-react-nestjs/apps/server/test/auth/password/password.integration.spec.ts +300 -0
- package/template-vp-monorepo-react-nestjs/apps/server/test/error-catalog.spec.ts +6 -1
- package/template-vp-monorepo-react-nestjs/apps/server/test/menus.validation.spec.ts +28 -0
- package/template-vp-monorepo-react-nestjs/apps/server/test/organization/organization-domain.spec.ts +260 -0
- package/template-vp-monorepo-react-nestjs/apps/server/tsconfig.scripts.json +5 -0
- package/template-vp-monorepo-react-nestjs/apps/web/.agents/rules//347/273/204/344/273/266/345/244/215/347/224/250.md +7 -0
- package/template-vp-monorepo-react-nestjs/apps/web/.agents/rules//350/241/250/345/215/225/345/233/236/345/241/253.md +4 -0
- package/template-vp-monorepo-react-nestjs/apps/web/AGENTS.md +17 -8
- package/template-vp-monorepo-react-nestjs/apps/web/README.MD +36 -8
- package/template-vp-monorepo-react-nestjs/apps/web/index.html +2 -2
- package/template-vp-monorepo-react-nestjs/apps/web/package.json +1 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/App.tsx +19 -8
- package/template-vp-monorepo-react-nestjs/apps/web/src/api/auth.ts +14 -1
- package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/accounts.svg +4 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/audit-log.svg +4 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/companies.svg +5 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/dashboard.svg +6 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/home.svg +4 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/members.svg +4 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/menu-item.svg +4 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/menus.svg +6 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/organization-template.svg +4 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/organization.svg +6 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/positions.svg +4 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/profile.svg +5 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/projects.svg +4 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/roles.svg +4 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Brand/Brand.module.css +125 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Brand/Brand.tsx +56 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/DraftProTable/DraftProTable.tsx +11 -5
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/SvgAsset/IconSelector.tsx +38 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/SvgAsset/SvgAssetIcon.tsx +14 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/SvgAsset/SvgAssetRegistry.ts +32 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/SvgAsset/index.ts +10 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/svg-icon/SvgIcon.tsx +0 -2
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Loading/PageLoading.tsx +5 -1
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/LocaleSwitch/LocaleSwitch.tsx +52 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/PasswordActions/ChangePasswordDialog.tsx +90 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/PasswordActions/PasswordFields.module.css +12 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/PasswordActions/PasswordFields.tsx +54 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/PasswordActions/ResetAccountPasswordDialog.tsx +100 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/PasswordActions/change-password-session.ts +13 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/RouteTransition/RouteTransition.css +60 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/RouteTransition/RouteTransition.tsx +44 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/BasicTableSelector/BasicTableSelector.tsx +218 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/BasicTableSelector/BasicTableSelectorSelection.ts +91 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/BasicTableSelector/BasicTableSelectorTypes.ts +60 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/BasicTableSelector/README.md +110 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/BasicTableSelector/index.ts +7 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/GlobalAccountSelect/GlobalAccountSelect.tsx +211 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/GlobalAccountSelect/GlobalAccountSelectTypes.ts +75 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/GlobalAccountSelect/README.md +35 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/GlobalAccountSelect/index.ts +9 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/OrganizationMemberBrowser.tsx +146 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/OrganizationMemberCandidateColumns.tsx +137 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/OrganizationMemberFilterPanel.tsx +209 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/OrganizationMemberSelector.tsx +196 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/OrganizationMemberSelectorTypes.ts +103 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/README.md +8 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/index.ts +13 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/README.md +13 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/index.ts +30 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/config/theme.ts +41 -9
- package/template-vp-monorepo-react-nestjs/apps/web/src/hooks/useLatestDialogRequest.ts +71 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/i18n/config.ts +40 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/i18n/index.ts +10 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/i18n/instance.ts +36 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/i18n/ui-locale.ts +30 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/{BasicLayout.tsx → BasicLayout/index.tsx} +42 -35
- package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/WorkspaceLayout/components/WorkspaceNavigationBoundary.tsx +50 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/WorkspaceLayout/index.tsx +196 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/WorkspaceLayout/workspace-landing.css +119 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/WorkspaceLayout/workspace-surfaces.css +110 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/WorkspaceLayout/workspace.css +223 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/locales/en_US.json +639 -1
- package/template-vp-monorepo-react-nestjs/apps/web/src/locales/zh_CN.json +621 -1
- package/template-vp-monorepo-react-nestjs/apps/web/src/main.tsx +8 -2
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/api.ts +226 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/audit.tsx +169 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/AdministratorDialog.tsx +128 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/CleanupDialog.tsx +140 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/CompanyHierarchyDialog.tsx +244 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/EntityFormDialog.tsx +285 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/EntitySelectors/index.ts +6 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/EntitySelectors/selector-requests.ts +59 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberAffiliations/MemberOrganizationsDialog.tsx +188 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberAffiliations/MemberPositionsDialog.tsx +116 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberAffiliations/affiliation-loaders.ts +18 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberAffiliations/index.ts +5 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/AddProjectMemberDialog.tsx +75 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/CompanyMemberInvitation/CompanyMemberInvitationDialog.tsx +246 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/CompanyMemberInvitation/InvitationRecordsTable.tsx +152 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/CompanyMemberInvitation/invitation-link.ts +9 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/MemberOnboardingActions.tsx +79 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/RegisterCompanyMember/RegisterCompanyMemberDialog.module.css +12 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/RegisterCompanyMember/RegisterCompanyMemberDialog.tsx +122 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberRolesDialog.tsx +80 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberTable/MemberTableColumns.tsx +234 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberTable/index.ts +2 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberTable/member-candidate-cache.ts +12 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MenuFormDialog.tsx +251 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/RoleFormDialog.tsx +73 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/RolePermissionsDialog.tsx +185 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/entities.tsx +268 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/home.tsx +67 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/members.tsx +310 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/menus/api.ts +74 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/menus/index.tsx +325 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/profile.tsx +160 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/roles.tsx +173 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/use-access.ts +35 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/error/404.tsx +20 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/error/error.tsx +42 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/i18n/index.tsx +20 -38
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/components/ProjectFormDialog.tsx +46 -41
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/config/columns.tsx +20 -15
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/config/index.ts +32 -22
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/components/DraftProjectFormDialog.tsx +41 -34
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/config/columns.tsx +27 -20
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/config/projects.ts +21 -13
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/index.tsx +47 -27
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/index.tsx +51 -36
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/home/index.tsx +9 -6
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/login/api.ts +3 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/login/index.tsx +62 -82
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/login/login-form.css +199 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/login/login.css +146 -124
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/member-invitations/accept.css +47 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/member-invitations/accept.tsx +143 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/member-invitations/api.ts +20 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/api.ts +91 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/MoveOrganizationUnitDialog.tsx +82 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/OrganizationMemberColumns.tsx +87 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/OrganizationMemberHeader.tsx +102 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/OrganizationTreeModel.tsx +59 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/OrganizationTreePanel.tsx +88 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/index.ts +11 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/organization-loaders.ts +47 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/organization-member-filter-loaders.ts +187 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationMembersDialog.tsx +207 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationUnitDialog.tsx +110 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/index.tsx +258 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization-templates/api.ts +53 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization-templates/components/OrganizationTemplateDialog/TemplateDefinitionTabs.tsx +189 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization-templates/components/OrganizationTemplateDialog/index.tsx +135 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization-templates/components/OrganizationTemplateDialog/types.ts +25 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization-templates/index.tsx +201 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/positions/api.ts +81 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/positions/components/PositionFormDialog.tsx +86 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/positions/components/PositionMembersDialog.tsx +102 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/positions/index.tsx +198 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/positions/loaders.ts +35 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/register/api.ts +14 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/register/index.tsx +157 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/workspaces/api.ts +32 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/workspaces/index.tsx +146 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/workspaces/state.ts +24 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/router/AGENTS.MD +6 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/router/index.tsx +2 -46
- package/template-vp-monorepo-react-nestjs/apps/web/src/router/lazy-load/index.tsx +26 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/router/middleware/README.md +23 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/router/middleware/auth.ts +6 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/router/middleware/index.ts +4 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/router/middleware/workspace/access.ts +23 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/router/middleware/workspace/data.ts +55 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/router/middleware/workspace/entry.ts +52 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/access/page.tsx +20 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/auth.tsx +17 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/company.tsx +30 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/entry.tsx +20 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/examples.tsx +23 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/fallback.tsx +13 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/index.tsx +32 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/platform.tsx +27 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/project.tsx +28 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/router/page-registry.tsx +94 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/styles/dream.css +34 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/styles/index.css +6 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/types/auto-imports.d.ts +26 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/utils/organization-assignment.ts +66 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/utils/request/core/index.ts +48 -13
- package/template-vp-monorepo-react-nestjs/apps/web/src/utils/request/core/utils.ts +5 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/utils/request/index.ts +7 -2
- package/template-vp-monorepo-react-nestjs/apps/web/src/utils/request/workspace.ts +82 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/utils/safe-next.ts +36 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/utils/storage/cookie.ts +1 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/utils/storage/session.ts +1 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/i18n-locale.spec.ts +22 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/icon-selector.spec.tsx +23 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/latest-dialog-request.spec.ts +89 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/member-invitation-navigation.spec.ts +34 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/organization-assignment.spec.ts +137 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/password/password-actions.spec.ts +40 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/password/password-reset-action.spec.ts +66 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/password/workspaces-password-entry.spec.tsx +71 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/request.spec.ts +1 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/router/access.spec.ts +136 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/router/config.ts +140 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/router/entry.spec.ts +179 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/router/workspace-data.spec.ts +112 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/selector/global-account-select.spec.ts +311 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/selector/organization-member-selector.spec.ts +454 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/selector/selector-selection.spec.ts +132 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/storage.spec.ts +1 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/tsconfig.json +2 -2
- package/template-vp-monorepo-react-nestjs/apps/web/test/workspace-navigation-boundary.spec.tsx +169 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/workspace-navigation.spec.ts +105 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/workspace-requests.spec.ts +174 -0
- package/template-vp-monorepo-react-nestjs/apps/web/vite.config.ts +84 -35
- package/template-vp-monorepo-react-nestjs/apps/web-vue/package.json +2 -0
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/api/index.ts +1 -0
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/hooks/chart/useEcharts.ts +13 -1
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/layout/default/header/index.vue +1 -0
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/layout/default/index.vue +6 -2
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/router/guard/index.ts +1 -0
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/router/guard/permissionGuard.ts +1 -0
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/router/index.ts +1 -0
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/store/index.ts +1 -0
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/store/modules/user.ts +1 -0
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/types/auto-import.d.ts +2 -0
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/utils/request/core/index.ts +30 -0
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/utils/request/core/utils.ts +5 -0
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/utils/request/index.ts +2 -0
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/views/example/echart/config.ts +1 -0
- package/template-vp-monorepo-react-nestjs/apps/web-vue/tsconfig.tsbuildinfo +1 -1
- package/template-vp-monorepo-react-nestjs/package.json +1 -8
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/README.md +2 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/command.ts +22 -2
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/config.ts +1 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/files.ts +1 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/load-config.ts +8 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/report.ts +2 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/scanner.test.ts +88 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/scanner.ts +42 -8
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/sync.ts +12 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/test/command.test.ts +37 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/test/temporary-directory.ts +5 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/core/src/format.ts +1 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/core/src/i18n.ts +14 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/core/src/storage.ts +8 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/core/src/store.ts +9 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/react/src/index.tsx +5 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/react/src/use-store.ts +18 -5
- package/template-vp-monorepo-react-nestjs/packages/i18n/vue/src/index.ts +6 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/vue/src/use-store.ts +3 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/package.json +5 -1
- package/template-vp-monorepo-react-nestjs/packages/shared/src/index.ts +2 -13
- package/template-vp-monorepo-react-nestjs/packages/shared/src/types/access-maintenance.ts +68 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/src/types/access-menus.ts +94 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/src/types/access-resources.ts +168 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/src/types/access.ts +71 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/src/types/auth.ts +23 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/src/types/index.ts +9 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/src/types/organization/models.ts +361 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/access-catalog.ts +304 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/access-scope.ts +97 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/account.ts +1 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/index.ts +65 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/organization/contracts.ts +237 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/record.ts +10 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/session-terminal.ts +1 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/test/access.spec.ts +194 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/test/organization.spec.ts +168 -0
- package/template-vp-monorepo-react-nestjs/pnpm-workspace.yaml +103 -69
- package/template-vp-monorepo-react-nestjs/scripts/enterprise-qa/browser.mjs +696 -0
- package/template-vp-monorepo-react-nestjs/scripts/enterprise-qa/http-support.mjs +105 -0
- package/template-vp-monorepo-react-nestjs/scripts/enterprise-qa/http.mjs +1091 -0
- package/template-vp-monorepo-react-nestjs/scripts/enterprise-qa/legacy-http.mjs +140 -0
- package/template-vp-monorepo-react-nestjs/scripts/enterprise-qa/legacy.mjs +196 -0
- package/template-vp-monorepo-react-nestjs/scripts/enterprise-qa/runtime.mjs +110 -0
- package/template-vp-monorepo-react-nestjs/scripts/with-enterprise-test-env.mjs +80 -0
- package/template-vp-monorepo-react-nestjs/src/types/auto-imports.d.ts +60 -0
- package/template-vp-monorepo-react-nestjs/tsconfig.lib.json +1 -1
- package/template-vp-react/package.json +12 -12
- package/template-vp-react/src/types/auto-imports.d.ts +2 -0
- package/template-vp-vue-eslint-vapor/.vscode/settings.json +53 -0
- package/template-vp-vue-eslint-vapor/package.json +21 -20
- package/template-vp-vue-eslint-vapor/pnpm-workspace.yaml +0 -24
- package/template-vp-vue-eslint-vapor/src/main.ts +2 -3
- package/template-vp-vue-eslint-vapor/vite.config.ts +26 -31
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//351/234/200/346/261/202/346/226/207/346/241/243.md +0 -177
- package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/BasicLayout.module.css +0 -17
- package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/.gitkeep +0 -0
- package/template-vp-react/.agents/rules/SVG/344/275/277/347/224/250.md +0 -8
- package/template-vp-react/.vscode/settings.json +0 -11
- package/template-vp-react/AGENTS.md +0 -11
- /package/{template-vp-vue-eslint-vapor → template-pnpm-vp-monorepo}/.vscode/extensions.json +0 -0
- /package/template-vp-monorepo-react-nestjs/apps/web/src/assets/{hero.png → image/hero.png} +0 -0
- /package/template-vp-monorepo-react-nestjs/apps/web/src/assets/{react.svg → svg/react.svg} +0 -0
- /package/template-vp-monorepo-react-nestjs/apps/web/src/assets/{vite.svg → svg/vite.svg} +0 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
# 企业/项目组织架构、岗位与成员选择器测试报告
|
|
2
|
+
|
|
3
|
+
状态:独立企业方案 QA 待复验;企业邀请只确认入口,现有邀请实现和自动化不计入验收。企业/项目内部组织、岗位和选择器的既有证据保留,真实浏览器 E2E 仍受 Playwright 环境限制。日期:2026-09-18。
|
|
4
|
+
|
|
5
|
+
本报告依据当前 [需求文档](./需求文档.md)、[技术契约](./技术契约.md) 和 [联调记录](./联调记录.md),逐条核对 AC-01~AC-36。2026-09-17 取消企业间父子关系后,旧企业层级方案的实现、迁移和测试证据已经失效;2026-09-18 又明确企业邀请仅确认入口,现有邀请代码、页面、迁移和自动化同样不能作为现行验收证据。在独立企业边界完成实现同步并复验、邀请协议完成确认前,不能沿用旧报告的整体验收结论。
|
|
6
|
+
|
|
7
|
+
## 1. 当前结论
|
|
8
|
+
|
|
9
|
+
| 状态 | 数量 | 验收项 |
|
|
10
|
+
| ---------------------------- | ---: | ------------------------------------------------------ |
|
|
11
|
+
| 通过 | 22 | AC-01~AC-02、AC-07~AC-11、AC-13~AC-24、AC-33~AC-35 |
|
|
12
|
+
| 失败 | 0 | 无 |
|
|
13
|
+
| 待实现同步与复验 | 5 | AC-03~AC-06、AC-36 |
|
|
14
|
+
| 无法完整验证(部分证据通过) | 9 | AC-12、AC-25~AC-32 |
|
|
15
|
+
| 合计 | 36 | AC-01~AC-36 |
|
|
16
|
+
|
|
17
|
+
当前结论不是“整体通过”:
|
|
18
|
+
|
|
19
|
+
- AC-03~AC-06 和 AC-36 必须在移除企业父级、企业类型、企业排序、企业树查询/移动及相关权限后重新验证。
|
|
20
|
+
- AC-31 仅保留已确认部分的有效证据:企业直接注册,以及项目成员从所属企业有效成员中按 `userId` 选择、排除已加入者并在服务端再次校验。企业侧同时存在“邀请”入口这一产品边界已确认,但邀请入口之后的实现和自动化不得计入验收;旧“完整账号添加成员”证据继续失效。
|
|
21
|
+
- AC-25 的模板创建事务证据仍可参考,但旧版 `0003` 迁移证据属于已取消方案;当前待交付的 `0003` 尚未应用到当前数据库,也未按独立企业方案重跑。
|
|
22
|
+
- AC-12、AC-26~AC-32 仍缺真实浏览器关键路径验收;AC-31 的直接注册与项目成员候选已有部分自动化证据,邀请协议本身仍待确认,不能把缺口简化为只差浏览器截图。
|
|
23
|
+
- 企业/项目内部组织树、岗位、成员关系、模板和选择器的既有证据不等于独立企业边界已经验证通过。
|
|
24
|
+
|
|
25
|
+
## 2. 证据边界
|
|
26
|
+
|
|
27
|
+
### 2.1 2026-09-16 已执行记录
|
|
28
|
+
|
|
29
|
+
以下命令在取消企业间父子关系前执行。结果可作为未受本次产品变更影响能力的回归参考,不能证明独立企业边界已经落地;实现同步后必须重新执行相关测试与构建。
|
|
30
|
+
|
|
31
|
+
| 层级 | 历史命令 | 历史结果 | 当前适用范围 |
|
|
32
|
+
| ------------------ | ------------------------------------------------------- | ----------------------------------------- | ---------------------------------------------------- |
|
|
33
|
+
| Shared 测试 | `pnpm --filter shared test` | 2 个文件,14/14 通过 | 组织 DTO、规范化和候选能力可参考;企业禁用字段需复验 |
|
|
34
|
+
| Shared 构建 | `pnpm --filter shared build` | 成功,9 个产物文件 | 实现同步后复跑 |
|
|
35
|
+
| Server 普通测试 | `pnpm --filter server test` | 26/26 个已运行用例通过,20 个环境门控跳过 | 组织领域单测可参考;独立企业与迁移需复验 |
|
|
36
|
+
| Server 类型检查 | `pnpm exec tsc --noEmit -p apps/server/tsconfig.json` | 通过 | 实现同步后复跑 |
|
|
37
|
+
| Server 构建 | `pnpm --filter server build` | 成功,127 个文件编译完成 | 实现同步后复跑 |
|
|
38
|
+
| Web 全量测试 | `pnpm --filter web test` | 14 个文件、106/106 通过 | 组织、岗位、选择器和工作空间隔离证据继续保留 |
|
|
39
|
+
| Web 类型检查与构建 | `pnpm --filter web build` | 通过 | Web 代码变化后复跑 |
|
|
40
|
+
| Web 测试类型检查 | `pnpm exec tsc --noEmit -p apps/web/test/tsconfig.json` | 通过 | Web 测试变化后复跑 |
|
|
41
|
+
| Playwright 可用性 | `pnpm exec playwright --version` | 命令不存在 | 真实浏览器流程未验证 |
|
|
42
|
+
|
|
43
|
+
Server 的 20 个跳过项包括 19 个访问/组织真实集成用例和 1 个队列真实集成用例;跳过项没有计入 26 个通过项。
|
|
44
|
+
|
|
45
|
+
### 2.2 历史真实环境证据
|
|
46
|
+
|
|
47
|
+
同一开发会话此前在隔离 PostgreSQL/Redis 中设置 `RUN_ACCESS_INTEGRATION=true` 并运行 `apps/server/test/access/access.integration.spec.ts`,历史结果为 19/19 通过。该测试创建随机数据库、连续执行两次 migrate,并在结束后删除测试数据库。
|
|
48
|
+
|
|
49
|
+
该结果运行于旧企业层级方案:
|
|
50
|
+
|
|
51
|
+
- 组织单元、岗位、模板、成员关系、项目创建回滚和选择器候选相关断言可作为回归参考。
|
|
52
|
+
- 与 `entityType`、企业父子关系、企业移动、企业同父约束、企业层级权限或旧版 `0003` 结构有关的断言全部失效。
|
|
53
|
+
- 跨企业隔离和项目直接归属虽然有历史证据,但实现边界已经调整,AC-05、AC-06 仍须在独立企业代码与迁移上重跑。
|
|
54
|
+
|
|
55
|
+
本次文档同步没有 PostgreSQL/Redis 连接参数,也没有重新执行真实集成测试。
|
|
56
|
+
|
|
57
|
+
### 2.3 当前契约目标与尚待复验项
|
|
58
|
+
|
|
59
|
+
| 项目 | 当前契约目标 | 当前 QA 状态 |
|
|
60
|
+
| -------------- | ---------------------------: | ------------------------------------------------------------------------------------------------------------ |
|
|
61
|
+
| 实际受影响端点 | 现行组织契约 45 | 41 个契约表端点 + 4 个既有行为变更端点,待复验 |
|
|
62
|
+
| 新增权限 key | 21 | 旧版 22 个统计失效,待移除企业层级权限后复核 |
|
|
63
|
+
| 新增领域错误码 | 7 | 错误码集合未因独立企业变更调整,仍需随实现复跑 |
|
|
64
|
+
| 新增组织相关表 | 10 | 表清单沿用,待最终迁移验证 |
|
|
65
|
+
| 新增字段 | 97 | `companies` 应为零新增字段;旧版 101 个统计失效 |
|
|
66
|
+
| 数据库 `0003` | 尚未应用 | 必须先清理企业层级 DDL/预检/索引/约束并完成隔离环境验证 |
|
|
67
|
+
| 成员入口 | 部分证据有效;邀请协议待确认 | 企业只确认直接注册与邀请两个入口;直接注册和项目企业成员 `userId` 选择可继续复验,邀请实现与自动化不计入验收 |
|
|
68
|
+
|
|
69
|
+
`AccessScope` 仍只有 `platform | company | project`;组织、岗位和模板稳定资源继续不提供物理删除接口。这些结构原则没有因独立企业决策改变。
|
|
70
|
+
|
|
71
|
+
### 2.4 Web 自动化证据
|
|
72
|
+
|
|
73
|
+
前端第 6 轮修复后的 Web 历史全量结果为 14 个文件、106/106 通过。以下专项测试仍能证明不依赖企业间层级的请求所有者绑定、导航边界、选择器回显、跨页选择、关系禁选和最新请求协调逻辑:
|
|
74
|
+
|
|
75
|
+
- `apps/web/test/workspace-requests.spec.ts`
|
|
76
|
+
- `apps/web/test/workspace-navigation-boundary.spec.tsx`
|
|
77
|
+
- `apps/web/test/router/entry.spec.ts`
|
|
78
|
+
- `apps/web/test/router/workspace-data.spec.ts`
|
|
79
|
+
- `apps/web/test/selector/global-account-select.spec.ts`
|
|
80
|
+
- `apps/web/test/selector/selector-selection.spec.ts`
|
|
81
|
+
- `apps/web/test/selector/organization-member-selector.spec.ts`
|
|
82
|
+
- `apps/web/test/organization-assignment.spec.ts`
|
|
83
|
+
- `apps/web/test/latest-dialog-request.spec.ts`
|
|
84
|
+
|
|
85
|
+
这些自动化覆盖 A→B→C 工作空间切换、旧请求隔离、导航卸载、权限重校验时的 `hidden + inert`、静态 Modal 清理、选择器快照补查和迟到请求保护。它们不能替代真实浏览器中的 Router pending、Ant Design portal、原生 `inert`、焦点/鼠标/键盘和逐角色权限验收。
|
|
86
|
+
|
|
87
|
+
### 2.5 明确失效的旧证据
|
|
88
|
+
|
|
89
|
+
以下内容不得再标记为当前方案“通过”:
|
|
90
|
+
|
|
91
|
+
- `CompanyRecord` 或请求中存在 `parentCompanyId`、`entityType`、企业层级 `sort` 等字段。
|
|
92
|
+
- 平台企业树、父级选择、企业移动、企业循环保护、企业同父名称/排序及相关权限、审计或页面。
|
|
93
|
+
- 把集团作为企业类型表达的旧结论。
|
|
94
|
+
- Drizzle 快照中 `companies` 新增 4 个字段以及 101 个总字段变更。
|
|
95
|
+
- 将旧版 47 个受影响端点继续当作现行目标,或把未经确认的邀请端点计入组织专项统计。
|
|
96
|
+
- 旧版 `0003` 在随机测试库通过即可代表当前迁移已验证的结论。
|
|
97
|
+
- 企业或项目成员继续按完整账号直接添加的旧接口、页面与测试结论。
|
|
98
|
+
- 以当前邀请代码、前端页面、自动化测试或 `0004_company-member-invitations.sql` 证明邀请需求已经确认;这些材料只能证明实现存在,不能证明产品协议成立。
|
|
99
|
+
|
|
100
|
+
## 3. AC-01~AC-36 验收矩阵
|
|
101
|
+
|
|
102
|
+
状态说明:
|
|
103
|
+
|
|
104
|
+
- “通过”表示现有证据仍与当前独立企业方案中的该项行为匹配。
|
|
105
|
+
- “待实现同步与复验”表示需求与契约已经确认,但实现、迁移、增量测试或禁用概念扫描尚未按新方案形成完整证据。
|
|
106
|
+
- “无法完整验证(部分证据通过)”表示已有单元、接口或静态证据,但仍缺迁移、真实浏览器或前后端一致性验收。
|
|
107
|
+
|
|
108
|
+
| AC | 状态 | 主要证据与结论 |
|
|
109
|
+
| ---------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
110
|
+
| AC-01 全局人员标识 | 通过 | 历史真实集成测试覆盖同名账号按不同 `userId` 区分;Shared 与选择器持久值使用 `userId`。 |
|
|
111
|
+
| AC-02 作用域保持 | 通过 | Shared 与既有实现均只使用 platform、company、project;组织单元和岗位没有形成第四种工作空间。 |
|
|
112
|
+
| AC-03 独立企业模型 | 待实现同步与复验 | 目标是 `companies` 不新增企业父级、类型、排序或层级规范键。旧 Schema/DTO 证据与该目标冲突,必须清理后做快照和全仓扫描。 |
|
|
113
|
+
| AC-04 无企业间树能力 | 待实现同步与复验 | 旧企业树、父级选择、企业移动和循环保护证据全部失效;需确认路由、权限、页面、审计和测试中均无此能力。 |
|
|
114
|
+
| AC-05 跨企业隔离 | 待实现同步与复验 | 历史隔离测试可作参考,但需在无企业父子模型的 Repository、权限和候选查询上重新执行跨企业 404/无数据泄露测试。 |
|
|
115
|
+
| AC-06 项目直接归属 | 待实现同步与复验 | 项目直接 `companyId` 的历史证据仍可参考;企业层级代码清理后需确认项目归属、模板和组织校验没有残余父企业/兄弟企业语义。 |
|
|
116
|
+
| AC-07 企业项目分树 | 通过 | 组织树按企业/项目作用域独立建模,领域测试覆盖路径、深度、有效状态与 `hasChildren`;这里的树只指作用域内部组织树。 |
|
|
117
|
+
| AC-08 跨树写入拒绝 | 通过 | 组织 Repository 以组织树和作用域约束资源,历史真实集成测试覆盖跨企业组织资源隔离。 |
|
|
118
|
+
| AC-09 组织命名、深度与路径 | 通过 | Shared 测试覆盖 NFKC;领域测试覆盖 10 层、缺父节点和组织单元循环;同树编码及同一组织父单元下名称唯一。 |
|
|
119
|
+
| AC-10 整数排序 | 通过 | strict schema 只接受范围内整数;组织单元按 `sort ASC, id ASC` 返回,数据库只持久化单一整数 `sort`。 |
|
|
120
|
+
| AC-11 默认排序 | 通过 | 领域测试覆盖首个同级组织单元为 1、后续最大值加一及排序上限耗尽。 |
|
|
121
|
+
| AC-12 移动排序 | 无法完整验证(部分证据通过) | 服务和领域测试覆盖组织单元同树移动、路径与深度重算;尚未在真实浏览器验证缓存中的节点及后代均及时刷新。 |
|
|
122
|
+
| AC-13 多组织关系 | 通过 | 企业与项目成员关系表彼此独立,历史真实集成测试确认同一成员可加入多个本作用域组织单元。 |
|
|
123
|
+
| AC-14 无主归属 | 通过 | DTO、数据库、接口和 Web 证据均无主归属/默认组织字段,关系语义不依赖数组顺序。 |
|
|
124
|
+
| AC-15 关系唯一与默认顺序 | 通过 | 复合唯一约束、事务替换、作用域校验和关系排序已有 Shared、服务及历史集成证据;无 `memberSort`。 |
|
|
125
|
+
| AC-16 主要负责人唯一 | 通过 | 历史真实集成测试覆盖 leader 原子交接、双 leader 整批失败及同一人负责多个组织单元。 |
|
|
126
|
+
| AC-17 负责人职责与资格 | 通过 | Shared 枚举和服务校验覆盖 member、leader、deputy;组织职责不写 RBAC 角色。 |
|
|
127
|
+
| AC-18 未归属视图 | 通过 | 服务按“有效成员且无组织关系”查询虚拟分组,数据库没有未归属实体记录。 |
|
|
128
|
+
| AC-19 岗位完全独立 | 通过 | strict DTO 拒绝岗位与组织单元/组织树/模板节点关联字段,相关表也不持久化这些关联。 |
|
|
129
|
+
| AC-20 多岗位与唯一规则 | 通过 | 岗位任职复合唯一约束、集合替换、code 规范化和岗位候选作用域已有自动化或历史真实环境证据。 |
|
|
130
|
+
| AC-21 组织岗位解耦 | 通过 | 组织关系与岗位任职使用独立表、端点和服务,除成员清理外不存在互相联动。 |
|
|
131
|
+
| AC-22 模板初始化方式 | 通过 | Shared 判别联合、模板树领域校验及历史真实集成测试覆盖版本、状态与直接所属企业约束。 |
|
|
132
|
+
| AC-23 模板复制边界 | 通过 | 领域测试覆盖模板组织节点父子 ID 重映射;历史集成测试确认只复制组织与独立岗位,不复制成员、负责人、任职或角色。 |
|
|
133
|
+
| AC-24 项目独立演进 | 通过 | 历史真实集成测试确认项目保存模板快照,来源模板后续变化不回写项目组织或岗位。 |
|
|
134
|
+
| AC-25 初始化与存量迁移事务 | 无法完整验证(部分证据通过) | 项目创建审计失败整体回滚和模板复制事务有历史证据;旧版 `0003` 迁移证据失效,当前迁移未应用且尚未按独立企业方案完成空库、重复执行、存量 backfill 与 rollback 验证。 |
|
|
135
|
+
| AC-26 页面作用域 | 无法完整验证(部分证据通过) | 自动化覆盖请求 owner key、A→B→C、导航卸载、重校验状态保留及 `hidden + inert`;尚缺真实浏览器全过程。 |
|
|
136
|
+
| AC-27 组织成员候选范围 | 无法完整验证(部分证据通过) | 服务、领域测试和历史集成测试覆盖作用域与 purpose 裁剪;尚缺真实浏览器筛选组合及展示验收。 |
|
|
137
|
+
| AC-28 弹窗搜索与去重 | 无法完整验证(部分证据通过) | 服务端分页、按 `userId` 去重聚合及前端跨页/最新请求测试已有证据;仍待浏览器交互验收。 |
|
|
138
|
+
| AC-29 同名信息展示 | 无法完整验证(部分证据通过) | 响应包含完整账号、来源和组织完整路径,历史集成测试覆盖同名账号;仍待真实渲染、溢出和筛选验收。 |
|
|
139
|
+
| AC-30 禁选状态 | 无法完整验证(部分证据通过) | Shared/Server 校验和前端关系测试覆盖停用、越权与无效 ID;尚缺浏览器禁选原因、清空流程和前后端一致性验收。 |
|
|
140
|
+
| AC-31 账号新增与成员入口边界 | 无法完整验证(部分证据通过) | GlobalAccountSelect 只服务平台授权场景;企业成员只确认直接注册和邀请两个入口,项目成员只能从所属企业有效成员中按 `userId` 选择并排除已加入者。直接注册、项目候选与保存校验的既有证据可继续复验;邀请对象、流程、状态和技术协议尚未确认,现有邀请测试不得计入验收。 |
|
|
141
|
+
| AC-32 权限能力拆分 | 无法完整验证(部分证据通过) | Controller 策略和 purpose 最小权限已有历史证据;旧版 22 个 key 统计失效,需按 21 个当前 key 复核并完成逐角色浏览器验收。 |
|
|
142
|
+
| AC-33 资源归属保护 | 通过 | 组织、岗位、模板和关系 Repository 以公司/项目归属约束资源,跨作用域与不存在资源统一按 404 处理。 |
|
|
143
|
+
| AC-34 生命周期与清理 | 通过 | 组织、岗位、模板无 DELETE;历史真实集成测试覆盖成员移除清理且不影响其他企业的独立关系。 |
|
|
144
|
+
| AC-35 审计一致性 | 通过 | 组织、岗位、模板和关系写入与成功审计同事务,历史测试覆盖项目创建审计失败回滚;日志未引入密码或 token。 |
|
|
145
|
+
| AC-36 排除范围验证 | 待实现同步与复验 | 项目小组、主归属、岗位-组织关联和工作流仍有旧扫描证据;企业间父子关系与旧完整账号成员入口都必须在代码和迁移清理完成后重新全仓扫描,当前不能记为通过。 |
|
|
146
|
+
|
|
147
|
+
## 4. 浏览器验收缺口
|
|
148
|
+
|
|
149
|
+
真实浏览器验收不是当前唯一阻塞项;必须先完成独立企业实现与迁移同步,并在测试邀请流程前完成邀请协议的产品确认。此后若准备 Playwright 环境,至少覆盖:
|
|
150
|
+
|
|
151
|
+
1. 企业/项目工作空间入口、A→B→C 快速切换和同路由权限重校验,确认旧树、筛选、分页、选择和迟到请求均不污染新作用域。
|
|
152
|
+
2. 组织单元创建、同树移动、重命名、停用/恢复后,当前节点和已加载后代的 fullPath、depth、effective 与 hasChildren 正确刷新。
|
|
153
|
+
3. 组织成员选择器的服务端分页、姓名/完整账号搜索、同名账号、同名组织完整路径、标签独立、去重和禁选原因。
|
|
154
|
+
4. GlobalAccountSelect 只在平台授权场景出现;企业成员页面提供直接注册和邀请两个入口,当前只验收入口边界与直接注册流程;邀请管理和接受流程须在协议确认后另行补充。项目成员选择只返回所属企业有效成员、按 `userId` 提交并排除已加入者。
|
|
155
|
+
5. 仅查看、可分配、可维护等典型角色下,页面按钮、筛选能力和服务端 403/404 一致。
|
|
156
|
+
6. 同一页面连续打开 A→B 弹窗时,A 的迟到成功、失败和 `finally` 均不能覆盖 B 的内容或 loading。
|
|
157
|
+
|
|
158
|
+
## 5. 发布前必须完成
|
|
159
|
+
|
|
160
|
+
- 清理当前 Shared、Schema、Server、Web、测试及 `0003_cute_killmonger.sql` 中的企业层级残留后,重新执行禁用概念全仓扫描。
|
|
161
|
+
- 隔离当前邀请代码、页面、自动化测试及 `0004_company-member-invitations.sql`;产品确认邀请协议并更新现行契约前,不得迁移、发布或计入验收。
|
|
162
|
+
- 为企业直接注册和项目企业成员候选补充真实浏览器全过程证据;相关既有 Shared、Server、Web 自动化与真实数据库集成结果只作为复验参考。
|
|
163
|
+
- 按当前契约复核 45 个组织专项受影响端点、21 个新增权限 key、7 个组织领域错误码、10 张新表、97 个新增字段,以及 `companies` 零新增层级字段。
|
|
164
|
+
- 修订 `0003` 后在隔离环境完成空库、连续 migrate、存量 backfill 与受保护 rollback;验证完成前不向当前数据库执行该迁移。
|
|
165
|
+
- 重跑 Shared、Server、Web 测试与构建,并在真实 PostgreSQL/Redis 中复验 AC-03~AC-06、AC-25、AC-31 已确认部分、AC-32 和 AC-36;邀请协议确认后再单独补充对应 AC-31 证据。
|
|
166
|
+
- 由用户选择准备 Playwright 环境继续 E2E,或明确接受现有自动化作为浏览器项的替代证据;未补齐前保留对应“无法完整验证”状态。
|
|
167
|
+
- 收口时执行变更文件定向检查、`git diff --check` 与必要的 staged 检查,不得复用旧企业层级通过结论。
|
|
168
|
+
|
|
169
|
+
## 6. 变更记录
|
|
170
|
+
|
|
171
|
+
| 日期 | 变更摘要 | 原因 | 影响范围 |
|
|
172
|
+
| ---------- | ----------------------------------------------------------------------------------------------------------------- | ------------------------------------ | ------------------------------------- |
|
|
173
|
+
| 2026-09-18 | 撤回邀请流程“自动化通过”结论,只保留入口存在及直接注册/项目候选的有效证据;`0004` 与邀请自动化记为实现存在性材料 | 邀请协议尚未获得产品确认 | AC-31、证据边界、浏览器缺口与发布门槛 |
|
|
174
|
+
| 2026-09-18 | 明确当前各实现层和 `0003` 的企业层级残留必须清理复验 | 历史测试不能证明独立企业边界已经落地 | AC-03~AC-06、AC-25、AC-36 |
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# 企业/项目组织架构、岗位与成员选择器联调记录
|
|
2
|
+
|
|
3
|
+
状态:独立企业方案尚待实现同步与复验;企业邀请只确认入口,现有邀请实现不计入联调完成结论。企业/项目内部组织树、岗位、成员关系与选择器的既有联调证据保留。日期:2026-09-18。
|
|
4
|
+
|
|
5
|
+
本记录依据当前 [需求文档](./需求文档.md) 与 [技术契约](./技术契约.md),记录 Shared、数据库、Server、React Web 的联调状态。2026-09-17 已确认平台下企业彼此独立,该决策覆盖此前的企业间父子层级方案;2026-09-18 明确企业邀请只确认产品入口,具体协议仍待确认。旧层级方案和未经确认的邀请实现与测试只能作为偏差或历史记录,不能作为当前方案的验收证据。最终验收状态见 [测试报告](./测试报告.md)。
|
|
6
|
+
|
|
7
|
+
## 1. 当前联调结论
|
|
8
|
+
|
|
9
|
+
- 企业间父子关系、企业类型、企业树查询/移动、企业同父约束及相关权限已经从产品和技术契约中取消。此前关于 `entityType = group`、`parentCompanyId`、企业层级排序或循环保护的联调结论全部失效。
|
|
10
|
+
- 当前契约目标为 45 个实际受影响端点、21 个新增权限 key、7 个新增领域错误码,以及 10 张组织相关新表、97 个新增字段;`companies` 不新增企业层级字段。旧记录中的 47 个端点、22 个权限 key 和 `97 + 4 = 101` 个字段属于已废弃方案,不能继续作为完成统计。
|
|
11
|
+
- 最新成员入口只确认企业侧保留直接注册和邀请两个入口;直接注册与项目成员从所属企业有效成员按 `userId` 选择的既有联调结果可继续核对。邀请对象、流程和技术协议尚未确认,当前邀请代码、页面、自动化及 `0004` 不构成已接通结论。旧“按完整账号新增企业/项目成员”的入口仍不属于当前产品规则。
|
|
12
|
+
- 当前待交付的数据库 `0003` 尚未应用到当前数据库。旧版 `0003` 曾在随机测试库随真实集成测试执行,但它包含已取消的企业层级变更;完成 Schema、迁移与实现清理并重新验证前,不得执行正式迁移。
|
|
13
|
+
- 企业/项目内部组织树、成员多组织关系、独立岗位库、模板复制、GlobalAccountSelect、OrganizationMemberSelector 和跨工作空间前端隔离已有自动化或历史真实环境证据。这些证据不自动证明独立企业边界已经落地。
|
|
14
|
+
- 2026-09-16 的真实 PostgreSQL/Redis 集成测试为 19/19 通过,但运行基线仍含旧企业层级方案。组织、岗位、模板、关系和选择器相关结果可作为回归参考;涉及企业层级或 `0003` 最终结构的结论已失效,独立企业边界必须重新执行集成测试。
|
|
15
|
+
- 当前项目仍没有可执行的 Playwright 环境,真实浏览器关键流程继续保留为验收缺口。
|
|
16
|
+
|
|
17
|
+
## 2. 契约同步状态
|
|
18
|
+
|
|
19
|
+
### 2.1 Shared
|
|
20
|
+
|
|
21
|
+
- `AccessScope` 继续只有 `platform | company | project`,不新增集团或组织访问作用域。
|
|
22
|
+
- 当前契约不允许企业 DTO、响应或请求出现企业间父级、企业类型、企业排序等层级字段;实现同步后必须通过 strict schema 与全仓扫描确认这些字段已经移除。
|
|
23
|
+
- 企业成员入口概念已收敛为“直接注册/邀请”,项目成员新增 DTO 以 `userId` 表达所选企业成员;邀请 DTO、状态、端点及其他协议均待产品确认,Shared 中已经存在的相关类型只能记为实现偏差,组织模块不得补造或引用平行协议。
|
|
24
|
+
- 组织、岗位、模板和候选 DTO 继续使用稳定 `userId`、单整数 `sort`、独立岗位以及无主归属关系模型。
|
|
25
|
+
- 既有 `pnpm --filter shared test` 结果为 2 个文件、14/14 通过,`pnpm --filter shared build` 构建成功;该结果可证明既有组织共享能力,但不能替代独立企业边界变更后的复跑。
|
|
26
|
+
|
|
27
|
+
### 2.2 数据库与迁移
|
|
28
|
+
|
|
29
|
+
独立企业方案的目标差异为:
|
|
30
|
+
|
|
31
|
+
| 项目 | 契约目标 | 当前证据状态 |
|
|
32
|
+
| -------------------- | -------: | ------------------------------------------------ |
|
|
33
|
+
| 新增组织相关表 | 10 | 表清单沿用,待最终迁移复验 |
|
|
34
|
+
| 新增表字段 | 97 | 组织、岗位、关系和模板字段沿用,待最终迁移复验 |
|
|
35
|
+
| `companies` 新增字段 | 0 | 旧版 4 个层级字段必须从 Schema、快照和迁移中移除 |
|
|
36
|
+
| 总字段变更 | 97 | 旧版 101 个字段统计已失效 |
|
|
37
|
+
|
|
38
|
+
10 张组织相关新表仍为:
|
|
39
|
+
|
|
40
|
+
1. `organization_trees`
|
|
41
|
+
2. `organization_units`
|
|
42
|
+
3. `company_organization_unit_members`
|
|
43
|
+
4. `project_organization_unit_members`
|
|
44
|
+
5. `positions`
|
|
45
|
+
6. `company_position_members`
|
|
46
|
+
7. `project_position_members`
|
|
47
|
+
8. `organization_templates`
|
|
48
|
+
9. `organization_template_units`
|
|
49
|
+
10. `organization_template_positions`
|
|
50
|
+
|
|
51
|
+
`0003_cute_killmonger.sql` 仍需按当前契约清理企业父级、类型、企业排序、企业名称层级规范键及其预检/索引/约束,只保留企业/项目 code 预检、每个企业与项目的空组织树补建和批次标记。`rollback/0003_organization_backfill.sql` 仍只允许回滚本批次创建、保持为空且无业务引用的组织树。迁移修订后必须在随机空库连续 migrate 两次,并在含存量企业、项目和非空组织数据的隔离旧库演练 backfill 与受保护 rollback。
|
|
52
|
+
|
|
53
|
+
### 2.3 Server 端点
|
|
54
|
+
|
|
55
|
+
当前技术契约固定 45 个实际受影响端点,统计口径如下;这是同步目标,不代表旧实现已经按新口径复验完成:
|
|
56
|
+
|
|
57
|
+
| 能力组 | 实际端点数 | 说明 |
|
|
58
|
+
| ------------------------------------------------------ | ---------: | ------------------------------------------ |
|
|
59
|
+
| 全局账号候选及 4 个修改请求 DTO 的既有创建/管理员端点 | 6 | 不接受企业层级字段 |
|
|
60
|
+
| 企业/项目组织单元与组织关系 | 14 | 仅在各自组织树内维护 |
|
|
61
|
+
| 企业/项目岗位与岗位任职 | 12 | 岗位与组织单元独立 |
|
|
62
|
+
| 企业/项目组织成员候选搜索与 resolve | 4 | 按当前 URL 作用域查询 |
|
|
63
|
+
| 企业项目组织模板 | 5 | 仅供所属企业的项目初始化 |
|
|
64
|
+
| 企业/项目资料更新及成员移除行为变更 | 4 | 既有路由,新增规范化或清理行为 |
|
|
65
|
+
| 合计 | 45 | 41 个契约表实际端点 + 4 个既有行为变更端点 |
|
|
66
|
+
|
|
67
|
+
组织相关 Controller 的 `@AccessPolicy`、候选服务的 purpose 最小权限和响应裁剪仍属于有效联调范围。实现同步后需重新核对企业 Controller 不再暴露企业树查询、父级选择或企业移动端点。
|
|
68
|
+
|
|
69
|
+
成员入口业务边界仅部分接通:企业侧直接注册,以及项目侧从所属企业有效成员中按 `userId` 选择、排除已加入者并在保存端再次校验的流程,可按已确认规则继续联调;企业侧邀请只确认入口,现有邀请接口和行为均为待处理偏差,不计入组织专项 45 个端点或任何现行契约统计。
|
|
70
|
+
|
|
71
|
+
### 2.4 权限、错误码与审计
|
|
72
|
+
|
|
73
|
+
- 当前契约新增权限为 21 个 key;旧方案多出的企业层级权限必须从共享目录、服务端策略、菜单种子及前端判断中移除,再重新执行数量与名称核对。
|
|
74
|
+
- 企业、项目工作空间中的组织、岗位和企业项目组织模板页面继续保留;平台企业管理沿用既有列表与权限,不增加企业层级页面或权限。
|
|
75
|
+
- 7 个组织领域错误码继续保留:`ORGANIZATION_CYCLE`、`ORGANIZATION_DEPTH_EXCEEDED`、`ORGANIZATION_LEADER_CONFLICT`、`ORGANIZATION_SORT_EXHAUSTED`、`INVALID_MEMBER_RELATION`、`TEMPLATE_VERSION_CONFLICT`、`TEMPLATE_UNAVAILABLE`。
|
|
76
|
+
- 组织、岗位、模板、项目初始化和关系替换继续要求业务写入与成功审计同事务;企业间父子移动及其审计动作不再属于当前方案。
|
|
77
|
+
|
|
78
|
+
## 3. 前后端已接通能力
|
|
79
|
+
|
|
80
|
+
以下联调结果不依赖企业间层级,继续保留:
|
|
81
|
+
|
|
82
|
+
- 企业和项目工作空间分别注册组织、岗位页面,企业额外注册项目组织模板页面。
|
|
83
|
+
- `GlobalAccountSelect` 以 `userId` 为值,支持搜索、resolve、快照回显、取消和失败去重。
|
|
84
|
+
- `OrganizationMemberSelector` 独立于 `BasicTableSelector`,按当前 URL 作用域查询既有成员,并保持组织、岗位和角色标签相互独立。
|
|
85
|
+
- 项目成员新增已使用 `addProjectMember` purpose 接通企业成员候选:只允许选择项目所属企业的有效成员,以 `userId` 提交并排除已加入者;保存端再次校验。企业直接注册可继续按已确认规则核对;现有邀请列表、创建、撤销、重发、接受页面和请求不构成现行联调结论。
|
|
86
|
+
- 企业/项目内部组织树支持懒加载、同树移动、完整路径、有效状态、成员关系和整数排序;这里的父子关系仅指单个企业或项目内部的组织单元,不代表企业之间存在层级。
|
|
87
|
+
- 企业/项目岗位、成员归属和模板页面均通过 Shared 类型调用 Server 端点。
|
|
88
|
+
- 请求、组织树缓存、筛选、分页和已选结果均绑定所有者 `workspaceKey`;工作空间切换后,旧作用域不能借用新 generation 发出请求,迟到结果会被取消或丢弃。
|
|
89
|
+
- 跨路由导航等待时卸载旧页面及 React portal;同路由权限重校验时保留页面本地状态,同时对页面 surface 与专属 portal host 设置 `hidden + inert`,并清理不受上下文管理的静态 Modal。
|
|
90
|
+
|
|
91
|
+
## 4. 历史缺陷回流的有效范围
|
|
92
|
+
|
|
93
|
+
此前完成的六轮跨层回流中,以下结果仍可作为当前方案的回归基础:
|
|
94
|
+
|
|
95
|
+
1. 平台全局账号 search/resolve、Query 数组兼容和岗位候选作用域校验;其中企业层级鉴权部分已失效。
|
|
96
|
+
2. leader 原子交接、当前项目权限读取边界,以及 GlobalAccountSelect 的 resolve/取消/缓存行为。
|
|
97
|
+
3. GlobalAccountSelect 初始 resolve 与搜索 effect 的竞态修复。
|
|
98
|
+
4. 同一作用域连续 A→B 操作时的最新请求保护,以及组织成员候选的快照补查和上下文切换保护。
|
|
99
|
+
5. 跨工作空间导航期间旧页面 portal 与旧 API 工厂请求的隔离。
|
|
100
|
+
6. 跨路由导航与同路由权限重校验的不同状态保留和交互隔离策略。
|
|
101
|
+
|
|
102
|
+
旧实现中专门支持企业父子层级的 DTO、Repository、Controller、权限、页面或测试不再属于缺陷修复成果,应在实现同步中删除或改回独立企业列表语义。
|
|
103
|
+
|
|
104
|
+
## 5. 既有验证记录与适用边界
|
|
105
|
+
|
|
106
|
+
| 检查 | 历史命令/证据 | 结果与当前适用范围 |
|
|
107
|
+
| ----------------------- | ----------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
|
|
108
|
+
| Shared 单元测试 | `pnpm --filter shared test` | 2 文件、14/14 通过;独立企业变更后需复跑 |
|
|
109
|
+
| Shared 构建 | `pnpm --filter shared build` | 通过;独立企业变更后需复跑 |
|
|
110
|
+
| Server 普通测试 | `pnpm --filter server test` | 26/26 已运行用例通过、20 项环境门控跳过;独立企业变更后需复跑 |
|
|
111
|
+
| Server TypeScript/构建 | `tsc --noEmit`、`pnpm --filter server build` | 历史结果通过;同步实现后需复跑 |
|
|
112
|
+
| Web 全量测试 | `pnpm --filter web test` | 14 文件、106/106 通过;组织、岗位、选择器和工作空间隔离证据继续有效,代码变化后仍需复跑 |
|
|
113
|
+
| Web TypeScript/构建 | 测试 TypeScript 检查、`pnpm --filter web build` | 历史结果通过;代码变化后需复跑 |
|
|
114
|
+
| 真实 PostgreSQL/Redis | `access.integration.spec.ts` | 旧方案 19/19 通过;企业层级及旧迁移证据失效,独立企业边界需复验 |
|
|
115
|
+
| 表/字段核对 | 旧版 `0002` 与 `0003` 快照 | 旧结果 10 张表、101 个字段已失效;新目标为 10 张表、97 个字段且 `companies` 零新增字段 |
|
|
116
|
+
| 权限目录核对 | 旧版 Shared 构建产物 | 旧结果 22 个 key 已失效;新目标 21 个,待复验 |
|
|
117
|
+
| 成员入口 | 旧版完整账号添加及当前邀请自动化 | 完整账号证据已失效;直接注册与项目企业成员 `userId` 选择可继续复验,邀请自动化只证明实现存在,不证明需求已确认 |
|
|
118
|
+
| Playwright 能力 | `pnpm exec playwright --version` | 命令不存在;未安装 |
|
|
119
|
+
|
|
120
|
+
普通 Server 测试中的 20 个跳过项包含 19 个访问/组织真实集成用例和 1 个队列真实集成用例。不得把跳过项或旧层级方案的历史集成结果计入当前独立企业方案的通过数。
|
|
121
|
+
|
|
122
|
+
## 6. 剩余联调与发布前检查
|
|
123
|
+
|
|
124
|
+
1. 清理当前 Schema、Shared、Server、Web、测试及 `0003_cute_killmonger.sql` 中仍存在的企业间父子关系、企业类型、企业排序、企业树查询/移动及相关权限、审计和 UI;完成前不得迁移或发布。
|
|
125
|
+
2. 隔离现有邀请代码、页面、自动化测试及 `0004_company-member-invitations.sql`,不得把它们计入现行契约、联调或验收;产品确认邀请对象、流程和完整技术协议后,再更新文档并重新进入联调。
|
|
126
|
+
3. 重新核对 45 个组织专项受影响端点、21 个新增权限 key、7 个组织领域错误码、10 张新表和 97 个新增字段,并执行企业层级与旧成员入口禁用概念全仓扫描。
|
|
127
|
+
4. 修订 `0003` 后先在隔离环境完成空库、重复 migrate、存量 backfill 与受保护 rollback;当前数据库在此之前不执行该迁移。
|
|
128
|
+
5. 重跑 Shared、Server、Web 测试与构建,并在真实 PostgreSQL/Redis 中覆盖无企业层级字段/端点、跨企业隔离、项目直接归属、企业直接注册、项目成员候选和组织树边界;邀请流程在协议确认前不进入通过统计。
|
|
129
|
+
6. 若继续浏览器 E2E,应覆盖组织树移动后的缓存失效、工作空间快速切换、已确认的成员入口边界、选择器分页/搜索/同名展示/禁选、逐角色权限和服务端 403/404 一致性。
|
|
130
|
+
7. 收口时执行目标文件与相关代码的定向检查及 `git diff --check`;不得把旧企业层级或完整账号添加证据重新标记为当前方案通过。
|
|
131
|
+
|
|
132
|
+
## 7. 变更记录
|
|
133
|
+
|
|
134
|
+
| 日期 | 变更摘要 | 原因 | 影响范围 |
|
|
135
|
+
| ---------- | ------------------------------------------------------------------------------ | ---------------------------- | ------------------------------------- |
|
|
136
|
+
| 2026-09-18 | 撤回先前的邀请流程完成结论,只保留两类产品入口;现有邀请实现及 `0004` 记为偏差 | 邀请协议尚未获得产品确认 | Shared、Server、Web、迁移、联调与验收 |
|
|
137
|
+
| 2026-09-18 | 明确各实现层和 `0003` 的企业层级残留为发布阻断 | 当前实现尚未符合独立企业契约 | 清理、迁移与复验 |
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# 企业/项目组织架构、岗位与成员选择器设计
|
|
2
|
+
|
|
3
|
+
> 产品方案:组织架构主体已确认,并于 2026-09-17 明确平台下企业彼此独立;企业邀请只确认入口,具体协议待确认
|
|
4
|
+
>
|
|
5
|
+
> 技术契约:已同步独立企业边界与成员入口边界;当前企业层级残留和未经确认的邀请实现均需清理或隔离后复验
|
|
6
|
+
>
|
|
7
|
+
> 日期:2026-09-18
|
|
8
|
+
|
|
9
|
+
本文只保留当前已确认产品方案的精简说明。产品需求以同目录的 [需求文档](./需求文档.md) 为单一真相源;实现细节以同目录的 [技术契约](./技术契约.md) 为准。本文不重复端点、字段和数据库约束。
|
|
10
|
+
|
|
11
|
+
## 一、核心结论
|
|
12
|
+
|
|
13
|
+
1. 平台下的企业彼此独立,不建立企业间父子关系;每个企业继续使用现有 `companyId` 作为边界。
|
|
14
|
+
2. 项目始终直接属于一个企业。企业 A 的成员、角色、权限、组织和项目数据不会继承或传播到企业 B。
|
|
15
|
+
3. 每个企业有一棵企业组织树,每个项目有一棵项目组织树。界面可以聚合浏览,数据库不建立跨树父子关系。
|
|
16
|
+
4. 树节点统一称为“组织单元”。事业群、分公司、部门、中心、科室和班组都可以是客户在单个企业内部对组织单元的命名和用法。
|
|
17
|
+
5. 企业组织主要表达企业治理、共享职能和人员归属;项目组织主要表达项目执行结构。两者分别维护,避免项目差异污染企业标准。
|
|
18
|
+
6. 一个成员可以加入当前作用域的多个组织单元,也可以担任多个岗位;所有组织关系地位相同,不设置默认或主要归属。
|
|
19
|
+
7. 岗位保留,但岗位是企业/项目作用域内的平面列表,与组织单元完全独立。
|
|
20
|
+
8. 不建设项目小组。稳定协作结构使用项目组织单元,临时协作由具体业务选择成员。
|
|
21
|
+
9. 组织单元排序只使用一个非负整数 `sort`,不拆分输入,不使用小数。
|
|
22
|
+
10. 平台账号以全局 `userId` 唯一标识;姓名可以重复,界面必须结合完整账号和来源作用域帮助识别。
|
|
23
|
+
|
|
24
|
+
## 二、企业与组织树的边界
|
|
25
|
+
|
|
26
|
+
### 2.1 独立企业边界
|
|
27
|
+
|
|
28
|
+
平台只管理彼此独立的企业列表,不建立企业父子树。
|
|
29
|
+
|
|
30
|
+
- 企业沿用现有 `companyId`、名称、编码、状态和版本等模型,不新增企业间父级、类型、排序、规范名称或层级查询/移动能力。
|
|
31
|
+
- 每个企业拥有独立成员、管理员、角色、组织、数据、审计和直接项目。
|
|
32
|
+
- 项目始终只保存一个所属企业 `companyId`,其他企业不会因此获得隐式关系或访问权。
|
|
33
|
+
- 企业组织与权限严格限定在当前企业,不能跨企业继承、查询、分配或授权;跨企业资源继续按不可见处理。
|
|
34
|
+
|
|
35
|
+
需要独立成员目录、管理员、RBAC、数据和项目归属的单位,应建立为平台下的独立企业;只用于同一企业内部层级、汇报或分类的事业群、分公司等名称,应使用组织单元表达。
|
|
36
|
+
|
|
37
|
+
### 2.2 企业组织树与项目组织树
|
|
38
|
+
|
|
39
|
+
企业和项目分别拥有独立组织树:
|
|
40
|
+
|
|
41
|
+
```text
|
|
42
|
+
企业 A
|
|
43
|
+
├─ 企业组织树
|
|
44
|
+
│ ├─ 财务中心
|
|
45
|
+
│ └─ 人力资源部
|
|
46
|
+
└─ 项目甲
|
|
47
|
+
└─ 项目组织树
|
|
48
|
+
├─ 工程部
|
|
49
|
+
└─ 商务部
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
- 企业组织单元的父节点只能来自同一企业组织树。
|
|
53
|
+
- 项目组织单元的父节点只能来自同一项目树。
|
|
54
|
+
- 企业与项目本身是界面虚拟根,不创建持久化根节点。
|
|
55
|
+
- 组织单元只能在本树内移动,移动时保持 ID 不变。
|
|
56
|
+
- 每棵树最多 10 层,顶级真实组织单元计为第 1 层。
|
|
57
|
+
- 树按父节点懒加载,每次返回一个层级、完整路径和 `hasChildren`。
|
|
58
|
+
- 节点的完整路径和有效状态会受祖先变化影响;移动、重命名或状态变更后,前端必须刷新受影响节点及全部后代,无法可靠追踪时直接清空当前作用域组织树缓存。
|
|
59
|
+
- 同树编码唯一,同父名称唯一;唯一比较使用 `lower(NFKC(trim(value)))`。
|
|
60
|
+
- 编码接受 ASCII 大小写输入,新建或更新时统一保存并返回小写;名称只去除首尾空白并保留展示大小写。
|
|
61
|
+
|
|
62
|
+
## 三、成员、负责人和岗位
|
|
63
|
+
|
|
64
|
+
### 3.1 组织成员关系
|
|
65
|
+
|
|
66
|
+
- 企业组织关系只能绑定当前企业成员,项目组织关系只能绑定当前项目成员。
|
|
67
|
+
- 同一成员可加入多个本作用域组织单元,但同一成员与同一组织单元只有一条关系。
|
|
68
|
+
- 成员可以不属于任何组织单元;“未归属组织”只是查询和界面虚拟分组。
|
|
69
|
+
- 每条关系的职责固定为 `member | leader | deputy`。
|
|
70
|
+
- 每个组织单元最多一名 `leader`,可以有多名 `deputy`。
|
|
71
|
+
- 同一人可以负责多个组织单元;负责人身份不会自动授予管理员权限。
|
|
72
|
+
- 既支持按成员替换其全部组织关系,也支持在组织详情中按组织单元替换全部成员;后者只修改当前单元,不覆盖成员在其他单元的关系。两种方式均原子保存,空数组分别表示解除该成员全部组织关系或清空当前单元。
|
|
73
|
+
- 组织成员默认按 `leader → deputy → member`,再按关系 ID 稳定返回,不提供人工成员排序。
|
|
74
|
+
|
|
75
|
+
### 3.2 岗位
|
|
76
|
+
|
|
77
|
+
岗位用于表达董事、财务负责人、项目经理、资料员等稳定业务任职。
|
|
78
|
+
|
|
79
|
+
- 企业岗位只属于一个企业,项目岗位只属于一个项目。
|
|
80
|
+
- 岗位是平面列表,不设置父级,不进入组织树。
|
|
81
|
+
- 岗位、任职关系和模板岗位均不保存组织单元字段。
|
|
82
|
+
- 一人可以多岗,一岗可以多人;同一成员不能重复担任同一岗位。
|
|
83
|
+
- 任职既支持按成员批量维护,也支持在岗位详情中按岗位批量维护成员;按岗位保存不覆盖成员的其他岗位,空数组可清空当前岗位任职。
|
|
84
|
+
- 组织归属、岗位任职和 RBAC 角色分别维护、分别审计,任一方变化不会自动修改另外两方。
|
|
85
|
+
|
|
86
|
+
## 四、排序与状态
|
|
87
|
+
|
|
88
|
+
### 4.1 单整数排序
|
|
89
|
+
|
|
90
|
+
- 组织单元同级使用 `0~999999999` 的整数 `sort`。
|
|
91
|
+
- 前端只显示一个整数输入框,编辑时直接回显和提交原值。
|
|
92
|
+
- 同级统一按 `sort ASC, id ASC` 返回,相同 `sort` 合法。
|
|
93
|
+
- 首个同级节点默认 `sort = 1`,其余默认使用当前同级最大值加一。
|
|
94
|
+
- 达到上限时停止自动递增,要求用户先调整现有顺序。
|
|
95
|
+
- 移动时可显式填写新 `sort`;省略时排到目标父级最后。
|
|
96
|
+
|
|
97
|
+
### 4.2 停用与关系处理
|
|
98
|
+
|
|
99
|
+
组织单元、岗位和模板首期只支持停用/恢复,不提供物理删除。
|
|
100
|
+
|
|
101
|
+
- 停用组织单元保留节点、下级节点、成员关系和历史引用。
|
|
102
|
+
- 停用岗位保留岗位及任职关系。
|
|
103
|
+
- 停用成员保留组织关系和岗位任职,恢复后按当前关系重新可见。
|
|
104
|
+
- 全量替换时,既有停用关系可以原样保留或解除;按成员保存空数组表示解除该成员在当前作用域内的全部对应关系,按组织单元或岗位保存空数组表示清空当前资源的全部成员关系。
|
|
105
|
+
- 停用成员不能新增组织关系或岗位任职,也不能升级组织职责;既有职责只允许保留、移除或按 `leader → deputy → member` 降级。
|
|
106
|
+
- 停用或受无效祖先影响的组织单元不能新增成员或升级职责,停用岗位不能新增任职。
|
|
107
|
+
|
|
108
|
+
## 五、项目组织模板
|
|
109
|
+
|
|
110
|
+
企业通过项目组织模板提供通用标准,项目创建后仍可独立调整。
|
|
111
|
+
|
|
112
|
+
- 创建项目必须显式选择 `blank` 或 `template`。
|
|
113
|
+
- `blank` 不携带模板信息;`template` 必须携带模板 ID 和精确版本。
|
|
114
|
+
- 模板只可用于其所属企业下的项目,且必须处于有效状态。
|
|
115
|
+
- 模板分别保存组织结构和岗位定义,两者不建立关联。
|
|
116
|
+
- 初始化复制组织层级、名称、编码、说明、排序和岗位定义,并为项目生成新 ID。
|
|
117
|
+
- 模板组织单元不单独设置状态,存在的节点初始化为 active;模板岗位保留状态,disabled 岗位按 disabled 复制并由项目后续独立启用。
|
|
118
|
+
- 不复制真实成员、负责人、组织关系、岗位任职或角色。
|
|
119
|
+
- 模板的组织单元/岗位使用完整子项版本快照;项目只读取明确的 `templateId + templateVersion`。模板名称、说明、状态和默认标记只保存当前值,历史变化由审计记录,不承诺从模板表重建历史主表状态。
|
|
120
|
+
- 每个企业最多一个有效默认模板。设置新默认模板时,旧默认模板也生成保留完整子项的下一版本、递增版本并写审计。
|
|
121
|
+
- 模板后续修改、停用或恢复不会自动同步既有项目。
|
|
122
|
+
|
|
123
|
+
## 六、账号与成员选择器
|
|
124
|
+
|
|
125
|
+
### 6.1 成员接入边界
|
|
126
|
+
|
|
127
|
+
- 平台开通企业或设置企业管理员时使用 `GlobalAccountSelect`,稳定值为 `userId`,请求字段为 `administratorUserId`;服务端提交时仍需复核账号有效性。
|
|
128
|
+
- 企业新增普通成员只有两条已确认的产品路径:直接注册新账号并立即加入企业,或使用企业邀请;不允许通过完整账号直接挂接既有全局账号。
|
|
129
|
+
- “企业邀请”在本阶段仅表示入口名称。邀请对象、是否绑定账号、载体、有效期、状态、接受/拒绝、撤销/重发、发送渠道、DTO、端点、Token、安全、事务、审计和验收标准均待产品确认;现有邀请代码、页面、自动化测试及 `0004_company-member-invitations.sql` 不构成设计依据,组织模块也不得从其他专项复制或补造协议。
|
|
130
|
+
- 项目新增成员使用 `OrganizationMemberSelector` 的 `purpose=addProjectMember`,只返回所属企业的有效成员并排除已加入当前项目者,不返回组织、岗位或角色标签;只要求 `project.members.add`,提交 `{ userId }` 后服务端再次校验资格、状态和重复关系。
|
|
131
|
+
- 企业和项目成员入口均不允许通过完整账号直接挂接既有全局账号。
|
|
132
|
+
|
|
133
|
+
### 6.2 全局账号选择
|
|
134
|
+
|
|
135
|
+
`GlobalAccountSelect` 只用于有权搜索平台账号的管理场景:
|
|
136
|
+
|
|
137
|
+
- 稳定值为 `userId`,不以姓名或账号作为关系主键。
|
|
138
|
+
- 支持远程搜索和按 `userId` 回显。
|
|
139
|
+
- 同名账号显示完整账号和状态。
|
|
140
|
+
- 普通企业或项目操作者不能借此枚举平台账号。
|
|
141
|
+
- 企业侧新增普通成员不使用全局账号选择器,其直接注册与邀请边界按 6.1 节执行。
|
|
142
|
+
|
|
143
|
+
### 6.3 组织成员选择
|
|
144
|
+
|
|
145
|
+
`OrganizationMemberSelector` 只选择调用者当前可见的既有企业/项目成员:
|
|
146
|
+
|
|
147
|
+
- 表单中表现为 Select 风格字段,点击后打开弹窗式组织浏览器。
|
|
148
|
+
- 左侧按可见作用域、组织、岗位或角色筛选,右侧分页展示人员和已选项。
|
|
149
|
+
- 企业工作空间可在权限允许时查看本企业及其可见项目;项目工作空间只查看当前项目。
|
|
150
|
+
- 企业端读取项目身份先要求 `company.projects.read`,项目组织、岗位、角色标签和相应筛选再逐项目要求 `project.organization.read`、`project.positions.read`、`project.roles.read`,不能用企业项目查看权限替代。
|
|
151
|
+
- 搜索支持姓名或完整账号,结果按全局 `userId` 去重并聚合可见身份。
|
|
152
|
+
- 选择器保存值始终只有 `userId`;企业/项目作用域由调用和保存动作的 URL 决定,项目身份只用于展示、筛选和辨识。
|
|
153
|
+
- 组织标签显示完整路径,组织和岗位标签分栏,不暗示两者有关联。
|
|
154
|
+
- 组织成员维护返回关系 ID 和职责;单组织成员视图按职责和关系 ID 稳定分页。
|
|
155
|
+
- 岗位分配使用独立 purpose,只要求岗位查看与分配权限,不隐式要求组织查看权限。
|
|
156
|
+
- 停用候选显示禁选原因;既有停用关系可稳定回显和解除,但不能作为新增关系提交。
|
|
157
|
+
- 添加项目成员使用独立的 `addProjectMember` purpose,只返回所属企业有效且尚未加入当前项目的成员;保存 `userId`,后端提交时再次校验成员资格和重复关系。
|
|
158
|
+
|
|
159
|
+
组件目录继续按功能拆分:`BasicTableSelector`、`GlobalAccountSelect`、`OrganizationMemberSelector` 各自独立,`Selector/src/Selector.tsx` 只负责统一导出,不做庞大的 mode 组件。
|
|
160
|
+
|
|
161
|
+
## 七、页面与权限
|
|
162
|
+
|
|
163
|
+
企业和项目分别从现有工作空间进入“人员与组织”,页面内部不再提供第二套企业/项目切换器。
|
|
164
|
+
|
|
165
|
+
页面包含三个并列入口:
|
|
166
|
+
|
|
167
|
+
1. 组织架构:懒加载组织树、全部成员、未归属成员、组织详情、负责人和成员关系。
|
|
168
|
+
2. 岗位:平面岗位列表、状态和任职人数。
|
|
169
|
+
3. 成员:当前作用域成员的全部组织和岗位标签。
|
|
170
|
+
|
|
171
|
+
权限继续依附现有 `platform | company | project` 三种 `AccessScope`:
|
|
172
|
+
|
|
173
|
+
- 查看、创建、更新、移动、成员分配、岗位维护、岗位分配和模板维护分别授权。
|
|
174
|
+
- 加入组织、担任岗位或成为负责人均不会自动获得 RBAC 权限。
|
|
175
|
+
- 后端按登录状态、作用域成员资格、功能权限和资源归属逐层校验。
|
|
176
|
+
- 跨企业、跨项目、跨组织树和不存在资源统一返回 404;当前作用域内权限不足返回 403。
|
|
177
|
+
- 所有写操作与成功审计保持同一事务,失败不得留下部分数据或成功审计。
|
|
178
|
+
|
|
179
|
+
## 八、实施基线
|
|
180
|
+
|
|
181
|
+
- `companies` 继续沿用原有独立企业模型,不增加企业间父子关系专属字段、规范键、排序约束、接口或权限。
|
|
182
|
+
- 组织树、组织单元、成员关系、岗位、任职和模板仍按企业/项目作用域建设。
|
|
183
|
+
- 数据库 `0003` 尚未应用;当前 Schema、Shared、Server、Web、测试及 `0003_cute_killmonger.sql` 仍残留企业间父子关系专属变更,执行迁移前必须清理并重新核对端点、字段、权限和错误码数量。
|
|
184
|
+
- 当前邀请代码、页面、自动化测试及 `0004_company-member-invitations.sql` 是先于产品确认产生的实现偏差;邀请协议确认前必须与现行交付隔离,不得迁移、发布或计入验收。
|
|
185
|
+
|
|
186
|
+
管理员选择统一使用 `administratorUserId`,不保留 `administratorAccount` 双字段兼容期。写事务使用 READ COMMITTED 与全局管理锁,聚合只读使用 REPEATABLE READ + READ ONLY。
|
|
187
|
+
|
|
188
|
+
准确的 DTO、端点、数据库约束、事务、错误码和迁移顺序全部以 [技术契约](./技术契约.md) 为准。
|
|
189
|
+
|
|
190
|
+
## 九、本期明确不做
|
|
191
|
+
|
|
192
|
+
- 项目小组或第四种访问作用域。
|
|
193
|
+
- 企业间父子关系,以及相关的企业间排序、规范名称、层级查询或移动。
|
|
194
|
+
- 默认组织、主要归属或按数组顺序推导的特殊组织关系。
|
|
195
|
+
- 岗位与组织单元的持久关联。
|
|
196
|
+
- 成员人工排序和双框排序交互。
|
|
197
|
+
- 跨企业、跨项目移动组织单元。
|
|
198
|
+
- 模板对既有项目的后台自动同步。
|
|
199
|
+
- 完整流程引擎及其配套运行时能力;如后续需要,单独编写 PRD 和技术契约。
|
|
200
|
+
- 组织单元、岗位和模板的物理删除。
|
|
201
|
+
|
|
202
|
+
## 十、当前确认门
|
|
203
|
+
|
|
204
|
+
产品方案已按“平台下企业彼此独立”更新确认。当前 Schema、Shared、Server、Web、测试和 `0003` 仍有企业间父子关系残留,必须同步移除并重新验证后,才能执行数据库迁移和继续交付;若后续重新提出跨企业管理,应单独立项,不能复用组织单元暗中形成跨企业权限继承。
|
|
205
|
+
|
|
206
|
+
企业成员新增只确认直接注册和邀请两条产品入口;邀请入口之后的业务流程与技术协议尚未确认,现有实现不得计入现行方案或自动化验收。项目成员新增已固定为从所属企业有效成员中按 `userId` 选择。不得以旧完整账号添加方式替代,也不得在组织模块另行定义邀请协议。
|
|
207
|
+
|
|
208
|
+
## 十一、变更记录
|
|
209
|
+
|
|
210
|
+
| 日期 | 变更摘要 | 原因 | 影响范围 |
|
|
211
|
+
| ---------- | -------------------------------------------------------------------------- | -------------------------------------------- | ---------------------------------- |
|
|
212
|
+
| 2026-09-18 | 邀请口径纠偏为“只确认入口,具体协议待确认”,现有邀请实现及 `0004` 记为偏差 | 产品尚未确认邀请协议,不能由代码反向固化设计 | 成员接入、实施基线、确认门与验收 |
|
|
213
|
+
| 2026-09-18 | 明确各实现层和 `0003` 当前仍残留企业层级 | 使目标设计与实际状态可区分 | 迁移、发布阻断与复验 |
|
|
214
|
+
| 2026-09-17 | 取消企业之间的父子层级 | 平台下企业彼此独立 | 企业边界、组织树、迁移、页面与测试 |
|
|
215
|
+
| 2026-09-17 | 企业成员改为直接注册/邀请;项目成员改为企业成员候选 `userId` 选择 | 最新成员边界确认 | 选择器、成员页面、接口与验收 |
|