create-bubbles 0.1.26 → 0.1.27
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/package.json +1 -1
- 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 +578 -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 +12 -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 +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//350/256/276/350/256/241/346/226/271/346/241/210.md +18 -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 +24 -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 +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/274/232/350/257/235/347/256/241/347/220/206//351/234/200/346/261/202/346/226/207/346/241/243.md +87 -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 +55 -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 +92 -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 +38 -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 +26 -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 +53 -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 +63 -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 +85 -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-operations.spec.ts +433 -0
- package/template-vp-monorepo-react-nestjs/apps/server/test/auth/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-actions.spec.ts +40 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/password-reset-action.spec.ts +64 -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/test/workspaces-password-entry.spec.tsx +71 -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/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.ts +11 -0
- 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 +1 -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 +3 -0
- 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-react/.vscode/settings.json +8 -1
- package/template-vp-react/package.json +10 -10
- package/template-vp-react/src/types/auto-imports.d.ts +2 -0
- package/template-vp-vue-eslint-vapor/package.json +20 -20
- 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/AGENTS.md +0 -11
- /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,137 @@
|
|
|
1
|
+
# 企业、项目与菜单权限独立验收报告
|
|
2
|
+
|
|
3
|
+
> 文档状态:历史基线+成员接入实现证据;企业邀请固定协议未获产品确认,当前成员入口的真实浏览器与正式环境证据待补。
|
|
4
|
+
|
|
5
|
+
历史验收日期:2026-09-09。该轮依据当时的 [PRD](./PRD.md) 和 [技术契约](./技术契约.md),独立 QA 的 HTTP、浏览器、旧库迁移及旧库 HTTP 共 35 组全部通过,0 失败、0 跳过;15 项验收在下述本机与受控夹具范围内通过。新增目录升级专项已用真实 PostgreSQL 复验。以上结果只说明当时版本,不代表当前需求已经验收通过。
|
|
6
|
+
|
|
7
|
+
当前已确认的成员接入边界为:平台创建企业、设置或更换企业管理员使用全局账号选择器并提交 `administratorUserId`;企业新增成员只保留“直接注册新账号并加入企业”和“企业邀请”两个入口;项目成员只从所属企业有效成员中按 `userId` 选择,并排除已经加入当前项目的成员。企业邀请的对象、有效期、Token、状态、接受、撤销、重发、端点和数据模型仍待确认。下述 2026-09-09 结果作为历史基线保留;后续实现证据单独记录,不用旧完整账号流程或未确认邀请实现替代产品验收。
|
|
8
|
+
|
|
9
|
+
## 2026-09-19 菜单 SVG 图标变更待验收
|
|
10
|
+
|
|
11
|
+
本轮将菜单图标�� Ant Design 名称映射改为 `apps/web/src/assets/svg/` 自动发现的 SVG key,新增图标选择器、页面及操作节点语义图标、旧数据迁移和未知 key 降级。操作节点默认图标补齐仍需本轮实现与验证;未执行登录后的真实浏览器菜单管理验收,因此 UI 证据仍待补。
|
|
12
|
+
|
|
13
|
+
自动化结果(2026-09-19):
|
|
14
|
+
|
|
15
|
+
- Shared(工作目录 `packages/shared`):`..\..\node_modules\.bin\vp.cmd pack` 通过;`..\..\node_modules\.bin\vp.cmd test --run` 2 个文件、14 项通过。
|
|
16
|
+
- Web:`tsc -p apps/web/tsconfig.json --noEmit` 通过;`vp build --mode dev` 通过(6365 个模块);`vp test --run` 16 个文件、110 项通过;本轮导航测试 6/6、图标选择器测试 1/1 通过。
|
|
17
|
+
- Server:`drizzle-kit check --config drizzle.config.ts` 通过;`vp test --run` 7 个文件通过、33 项通过,2 个集成文件共 23 项因环境门控跳过;新增菜单图标 key 校验 2/2 通过。
|
|
18
|
+
- SVG 静态检查:新增菜单 SVG 均包含 `viewBox`、`width="1em"`、`height="1em"` 和 `currentColor`;选择器通过注册表自动发现目录内全部 SVG(包括已有多色资源)。
|
|
19
|
+
|
|
20
|
+
未通过或未执行项:Server `nest build` 仍受仓库现有 Node ESM/CJS `glob` 依赖错误阻塞;Server 全量 `tsc` 受当前 TypeScript 6 与 `@types/node` 解析环境影响,目标菜单文件无新增类型错误;未启动真实数据库和登录浏览器,因此迁移执行与真实菜单管理 UI 回显尚未形成发布验收证据。必须覆盖的非法 URL、路径穿越、HTML、旧图标名已由 Server schema 测试覆盖;SQL 迁移结构由 `drizzle-kit check` 校验。
|
|
21
|
+
|
|
22
|
+
2026-09-19 菜单管理 UI 修复待验证:菜单管理恢复真实树形层级,名称列改为单行省略;只有存在真实子级的节点显示展开控件,叶子节点不显示误导性加号。需补充浏览器截图或 Playwright 证据确认树层级、长名称和叶子节点展开状态。
|
|
23
|
+
|
|
24
|
+
## 2026-09-18 成员接入证据状态
|
|
25
|
+
|
|
26
|
+
| 验收项 | 当前状态 | 必须补充的证据 |
|
|
27
|
+
| ------------------ | ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------- |
|
|
28
|
+
| AC-01 完整业务流程 | 部分自动化证据;浏览器/正式环境待补 | `administratorUserId`、企业直接注册、企业成员候选及项目 `{ userId }` 写入已有自动化证据;邀请协议未确认,不能形成完整业务流程验收 |
|
|
29
|
+
| AC-02 权限隔离 | 已有自动化证据;浏览器待补 | 企业侧不能枚举全局账号;项目候选只返回所属企业有效且尚未加入当前项目的成员。邀请实现的账号隔离断言不计入现行产品验收 |
|
|
30
|
+
| AC-06 管理约束 | 已有自动化证据;邀请规则待确认 | 直接注册账号冲突与失败回滚、项目跨企业/停用/重复关系拒绝已有证据;邀请过期、撤销、重发等属于未确认实现行为 |
|
|
31
|
+
| AC-07 数据与审计 | 已有自动化证据;邀请规则待确认 | 直接注册和项目成员新增的事务与审计已有证据;邀请 Token 与审计断言只证明未确认实现的技术行为 |
|
|
32
|
+
|
|
33
|
+
Shared/Server/Web 自动化、构建、国际化检查及真实 PostgreSQL/Redis 成员接入实现专项已有通过记录;这些结果可作为管理员选择、直接注册和项目成员 `userId` 边界的技术证据。邀请相关结果只证明当前 7 天/Token/5 端点/接受页/`0004` 实现行为,不代表产品确认、现行契约或验收通过。当前成员入口尚未生成真实浏览器全过程证据,也未在正式环境复验,不能把 2026-09-09 的旧截图当作新入口验收。
|
|
34
|
+
|
|
35
|
+
技术执行记录为:Shared 构建通过;Server 标准测试 31 项通过、23 项环境门控跳过,真实依赖成员接入实现专项 22 项通过,Server 构建通过;Web 15 个测试文件、109 项通过,Web 构建通过;国际化 1252 个词条无新增、废弃或缺失。测试数量保持原始事实,但其中邀请用例不得汇总为现行产品验收结果。
|
|
36
|
+
|
|
37
|
+
## 环境与证据来源
|
|
38
|
+
|
|
39
|
+
- 本机隔离 PostgreSQL 18:127.0.0.1:15432,主库 enterprise_test;Redis 8:127.0.0.1:16379;MinIO:127.0.0.1:19000,专属测试 bucket。未访问开发数据库或原对象存储。
|
|
40
|
+
- 主 HTTP 服务:http://127.0.0.1:3301;前端:http://127.0.0.1:5301,/api 代理到 3301。Chrome headless,1440×1000,中文环境。均连接真实后端,业务流程没有替换为 mock。
|
|
41
|
+
- 旧库验证新建随机 `enterprise_legacy_*` 库,重放原 0000/0001 后升级。旧账号 HTTP 验证临时启动当前构建服务于 3302,使用独立 Redis DB 2/3,验证后关闭该进程。
|
|
42
|
+
- 运行配置、测试账号、密码及会话仅保存于系统临时目录或进程内存。输出仅含用例 ID 和脱敏结果;截图遮挡完整测试账号,不保存含凭据的 trace 或 HAR。API 测试使用 mobile 会话槽、浏览器使用 web 槽,遵循现有同终端单会话规则。
|
|
43
|
+
- 独立 QA 直接执行并保存 [HTTP 17 组](./测试证据/http.json)、[浏览器 13 组](./测试证据/browser.json)、[旧库迁移 3 组](./测试证据/legacy.json)、[旧库 HTTP 2 组](./测试证据/legacy-http.json)。浏览器注册、登录、开通企业、创建项目、分配角色、管理员替换均通过真实 UI 操作。
|
|
44
|
+
- 后端提供的服务层、真实数据库/Redis 和策略测试由 QA 于 23:19 再次直接执行:6 文件、33/33 通过,0 跳过(14 项权限集成、5 项策略/DTO、14 项既有回归),包括新增目录升级。共享包于 23:20 直接执行、未使用任务缓存:7/7 通过。前端负责的 43 项回归和构建见 [前端交接](./前端交接.md),后端断言说明见 [后端报告](./后端测试报告.md)。这些结果与 QA 的 35 组分别统计,不混算为 35 个独立单一断言。
|
|
45
|
+
|
|
46
|
+
## 验收台账
|
|
47
|
+
|
|
48
|
+
本台账记录 2026-09-09 的历史结果。“历史通过”只表示当时版本在下列本机和受控夹具范围内符合当时要求,不表示当前需求或生产环境发布验收已经通过。
|
|
49
|
+
|
|
50
|
+
| 项目 | 状态 | 实际验证与证据 |
|
|
51
|
+
| ------------------------ | -------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
52
|
+
| AC-01 完整业务流程 | 历史通过;新入口部分自动化、浏览器待补 | HTTP 企业/项目创建及失败无残留;旧浏览器证据仍是当时完整账号流程,不覆盖新入口。管理员选择、直接注册和企业候选新增项目成员已有自动化与真实依赖证据;邀请协议未确认,当前无法形成完整新流程产品验收。 |
|
|
53
|
+
| AC-02 权限隔离 | 历史通过;确认边界已有自动化 | HTTP 跨企业/项目资源统一 404,平台身份不自动成为企业成员;本次增量覆盖企业侧不枚举全局账号、项目候选按所属企业裁剪。邀请账号隔离只属于未确认实现证据。 |
|
|
54
|
+
| AC-03 菜单一致性 | 历史通过 | HTTP 隐藏保留直接访问,停用及祖先停用阻断管理员;页面/操作权限共同校验。浏览器撤权后按钮消失;平台首页隐藏可直达,停用后可从其他授权导航进入菜单页并恢复。 |
|
|
55
|
+
| AC-04 即时撤权 | 历史通过 | HTTP 角色撤权、成员停用/移除、企业停用和账号禁用后重新请求立即拒绝;浏览器另一终端撤权后 focus 刷新显示 403。账号恢复后旧会话仍失效,需重新登录。 |
|
|
56
|
+
| AC-05 切换与缓存 | 历史通过 | Playwright 受控延迟旧企业 access 请求,切到项目再释放响应,目标 scope 与页面不被覆盖;退出换空账号无旧企业数据。前端回归另覆盖旧 401/403、请求取消及 Router AbortSignal。 |
|
|
57
|
+
| AC-06 管理约束 | 历史通过;确认边界已有自动化 | 历史约束继续保留;本次真实数据库增量覆盖直接注册冲突及项目成员跨企业/停用/重复拒绝。邀请过期、撤销、重发、并发幂等等结果只证明未确认实现。 |
|
|
58
|
+
| AC-07 数据与审计 | 历史通过;确认边界已有自动化 | 历史审计事务继续保留;本次增量验证直接注册和项目成员写入的事务一致性。邀请 Token、链接和审计脱敏断言只作为未确认实现的安全证据保留。 |
|
|
59
|
+
| AC-08 回归与迁移 | 历史通过 | 空库迁移、正式初始化 CLI;旧库真实迁移保留用户 ID、密码散列与上传 ownerId,不自动加入企业;重复 migrator 不重复变更。升级后旧账号在新服务真实 HTTP 登录、读取自己的旧上传记录,跨 owner 404。真实 MinIO 4 字节分片上传与完成成功。前端既有 storage/request、后端既有错误目录/队列回归通过。 |
|
|
60
|
+
| AC-09 停用与恢复 | 历史通过 | HTTP 企业/成员恢复保留子级原本的 disabled 状态;移除企业成员清理项目关系和授权,重加不恢复旧角色;禁用与启用账号均使旧会话失效。浏览器停用企业、替换管理员、保持停用、启用后新管理员可管理。 |
|
|
61
|
+
| AC-10 管理员补任与更换 | 历史通过;新选择入口自动化通过 | HTTP 平台禁用唯一企业管理员后可补任替换,旧账号恢复不重获已撤身份;新入口统一提交 `administratorUserId` 并校验有效全局账号。旧浏览器截图保留历史价值,GlobalAccountSelect 新交互仍待新增浏览器证据。 |
|
|
62
|
+
| AC-11 创建项目身份限制 | 历史通过 | 企业内置管理员可创建;HTTP 普通成员、项目管理员和非法授权请求均不能下放或绕过。浏览器自定义角色权限树不含“创建项目”,全选后普通成员仍无创建按钮。 |
|
|
63
|
+
| AC-12 内置角色与新增功能 | 历史通过 | HTTP 人工修改内置角色拒绝;重复 CLI 初始化保留菜单配置、角色分配,同账号安全、另一账号不能提权。真实 PG 升级专项在已有 bootstrap、角色、用户分配和定制菜单之后注入新版企业页面/操作目录,运行种子:只扩企业内置管理员并递增其版本,其他范围管理员、member/自定义权限不变,用户分配与既有菜单的父级/显示/状态/排序保持,新增页面和操作正确绑定;再运行种子完整快照不变。 |
|
|
64
|
+
| AC-13 前端版本兼容 | 历史通过(受控响应夹具) | Playwright 在浏览器响应中注入未知 routeKey 页面/空目录,验证过滤、未知 URL 404、服务端原始菜单不改变。前端菜单映射测试覆盖所属操作过滤、静态已注册页面按授权/菜单状态显示。没有实际部署两个前端版本。 |
|
|
65
|
+
| AC-14 废弃权限清理 | 历史通过(受控目录/部署证明夹具) | 首版无废弃项:HTTP 空预览、非法候选拒绝;浏览器显示空态且确认按钮 disabled。后端真实 DB 受控废弃目录与部署证明测试覆盖有效子项/活动功能/过期或变更证明/旧服务依赖/未选子项阻断,审计失败整体回滚、成功幂等、版本递增、tombstone 与种子不复活。没有在生产多实例环境执行清理。 |
|
|
66
|
+
| AC-15 在途写操作与撤权 | 历史通过 | QA 用真实 HTTP 请求及 PG advisory lock/pg_locks 排队确认:撤权先持锁时写请求等待,之后 403 且无成功审计;写先持锁时先成功提交,撤权随后完成,后续写被拒绝。后端独立真实 PG 集成再次覆盖两种顺序与锁内重新鉴权。 |
|
|
67
|
+
|
|
68
|
+
## 本轮问题回流与复验
|
|
69
|
+
|
|
70
|
+
以下实际业务缺陷已回派负责方修复,并在 2026-09-09 历史基线中通过相关 HTTP 和浏览器复验:
|
|
71
|
+
|
|
72
|
+
| 问题 | 修复及复验 |
|
|
73
|
+
| ------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------- |
|
|
74
|
+
| Bearer 接口全部 503,Redis validate Lua 缺局部 isValidDigest | 后端补定义;真实登录后的全部 HTTP 组、真实 Redis 集成通过。 |
|
|
75
|
+
| Redis revoke Lua 使用大写 DO 导致脚本错误 | 改为 Lua do;账号禁用、恢复及会话撤销真实验证通过。 |
|
|
76
|
+
| 拒绝停用最后平台管理员却提前注销原会话 | 会话撤销放到业务约束与审计之后;拒绝停用后原会话仍可请求,后端审计失败用例也保留会话。 |
|
|
77
|
+
| 上传会话 DTO 错用必需 partNumber 的分片 schema | 还原会话参数 schema;真实 MinIO 上传创建、分片、完成和归属校验通过。 |
|
|
78
|
+
| 首页停用后父布局失去导航,无法到菜单页恢复 | 前端保留父级 scope 上下文,并选择可见授权页面落点;浏览器完成首页停用→其他入口→菜单恢复→首页的完整流程。 |
|
|
79
|
+
| 资料保存没有更新本地 version,第二次编辑误报 409 | 保存后合并服务端最新实体与 version;浏览器连续两次保存均 200,最终内容正确。 |
|
|
80
|
+
|
|
81
|
+
QA 脚本另修正了定位与证据采集:AntD 图标参与按钮 accessible name;403/404 的数字是 SVG,按真实文案定位;审计采用响应请求 ID;API 与浏览器终端槽分离;截图等待页面就绪及弹窗稳定并禁用采集时动画。以上属于测试脚本修正,不列为产品缺陷。fetch 仅在非 GET/HEAD 且有内容时附请求体,未屏蔽 lint 规则。
|
|
82
|
+
|
|
83
|
+
## 截图证据
|
|
84
|
+
|
|
85
|
+
2026-09-09 历史验收的 9 张实际截图保存在 `ui/`,已解码并逐张视觉检查。页面没有空白或加载占位;完整测试账号已遮挡。紫色区域为 QA 凭据遮罩。这些截图不证明 2026-09-17 变更后的成员入口已经实现或通过。
|
|
86
|
+
|
|
87
|
+
| 文件 | 内容 |
|
|
88
|
+
| ------------------------------------------------------------------- | ---------------------------------------------- |
|
|
89
|
+
| [workspace-empty.png](./ui/workspace-empty.png) | 普通新账号等待企业管理员添加的空态 |
|
|
90
|
+
| [company-created.png](./ui/company-created.png) | 平台真实开通企业后的列表 |
|
|
91
|
+
| [project-created.png](./ui/project-created.png) | 企业管理员真实创建项目 |
|
|
92
|
+
| [member-role-assigned.png](./ui/member-role-assigned.png) | 成员列表中已分配的自定义角色 |
|
|
93
|
+
| [project-member-home.png](./ui/project-member-home.png) | 普通项目成员的工作台与有限导航 |
|
|
94
|
+
| [permission-revoked.png](./ui/permission-revoked.png) | 撤权后 403 页面与剩余可用导航 |
|
|
95
|
+
| [platform-menu-recovery.png](./ui/platform-menu-recovery.png) | 平台首页停用并恢复后的完整工作台 |
|
|
96
|
+
| [cleanup-empty-preview.png](./ui/cleanup-empty-preview.png) | 废弃权限为空、确认清理按钮禁用 |
|
|
97
|
+
| [replacement-administrator.png](./ui/replacement-administrator.png) | 替换管理员登录恢复后的企业,并具有创建项目入口 |
|
|
98
|
+
|
|
99
|
+
## 检查与复现
|
|
100
|
+
|
|
101
|
+
已执行 `vp check scripts/enterprise-qa .spaces/01.企业级项目级/权限与菜单/测试报告.md`:7 个文件格式正确,6 个脚本无 lint 警告、错误或类型错误;限定范围 `git diff --check` 通过。全仓原有 176 处格式问题,以及 `packages/i18n/core/src/i18n.ts` 的两处 console 类型错误、3 项警告由主控记录,本轮未批量改写无关文件;不把原有全仓失败描述为本轮全部检查通过。
|
|
102
|
+
|
|
103
|
+
主控先按 [运行说明](./运行说明.md) 准备独立运行环境、构建当前 shared/server、启动 3301/5301。配置绝对路径保存在系统临时目录,由下列命令作为参数传入,不将其内容粘贴到命令或仓库:
|
|
104
|
+
|
|
105
|
+
验收结束后,主控已于 2026-09-10 清理本次专属服务、容器、匿名卷和临时凭据;重新执行这些命令前需重新准备隔离环境。测试证据仍保留于本目录。
|
|
106
|
+
|
|
107
|
+
```powershell
|
|
108
|
+
$runtimePath = Join-Path ([System.IO.Path]::GetTempPath()) 'codex-enterprise-01a085-runtime.json'
|
|
109
|
+
node scripts/enterprise-qa/legacy.mjs $runtimePath prepare
|
|
110
|
+
node scripts/enterprise-qa/legacy.mjs $runtimePath verify
|
|
111
|
+
node scripts/enterprise-qa/legacy-http.mjs $runtimePath
|
|
112
|
+
node scripts/enterprise-qa/http.mjs $runtimePath
|
|
113
|
+
node scripts/enterprise-qa/browser.mjs $runtimePath
|
|
114
|
+
vp check scripts/enterprise-qa .spaces/01.企业级项目级/权限与菜单/测试报告.md
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
http.mjs 使用随机注册账号并调用正式首管理员初始化 CLI,保存供浏览器使用的私有状态;因此 browser.mjs 必须在其后运行。首次运行应使用独立新环境,重复测试不能借初始化更换平台首位管理员。legacy-http.mjs 只在 3302 空闲时启动自己的测试进程并在结束时关闭。主环境清理由主控统一执行,不清空其他 Redis、数据库或存储。
|
|
118
|
+
|
|
119
|
+
浏览器脚本无需安装新依赖。默认使用本机 Codex runtime 中的 Playwright 和已安装 Chrome,可通过 ENTERPRISE_QA_PLAYWRIGHT_ROOT 指定含 package.json 的运行时根目录、ENTERPRISE_QA_CHROME_PATH 指定 Chrome 可执行文件。默认路径只是本机 QA 工具位置,不属于产品运行要求。
|
|
120
|
+
|
|
121
|
+
## 验证边界
|
|
122
|
+
|
|
123
|
+
- 2026-09-09 历史轮次覆盖真实功能、数据库事务、锁时序、会话撤销、对象存储和当时的浏览器流程;当前成员入口只保留自动化与真实依赖专项记录,尚未完成真实浏览器全过程或正式环境复验。
|
|
124
|
+
- 邀请的 7 天/Token/5 端点/接受页/`0004` 未获产品确认;相关代码和测试不得作为运行、迁移、联调通过或产品验收依据。
|
|
125
|
+
- AC-13 使用未知前端路由响应夹具与静态注册映射测试,AC-14 使用受控废弃目录与部署证明,不声称已实际完成多版本前端部署或生产多实例滚动发布。
|
|
126
|
+
- 旧上传夹具验证历史数据库记录及 owner 归属,不声称夹具的旧对象已有真实二进制内容。真实 MinIO 写入由主 HTTP 上传回归另外验证。
|
|
127
|
+
- PostgreSQL 与 Redis 没有分布式原子事务。已验证业务检查失败、审计失败、真实用户行锁及正常撤销;未注入最终 COMMIT 与 Redis 同时故障的组合场景。
|
|
128
|
+
- 未执行、环境阻塞、跳过与仅静态检查均不计为真实 HTTP/浏览器通过;报告中不同层级的证据已分别标明。
|
|
129
|
+
|
|
130
|
+
## 变更记录
|
|
131
|
+
|
|
132
|
+
| 日期 | 变更摘要 | 影响范围 |
|
|
133
|
+
| ---------- | ------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------- |
|
|
134
|
+
| 2026-09-19 | 增加菜单 SVG 图标选择、回显、迁移、降级及资源规范的待验收范围;实际结果须在实现后回填 | AC-03、AC-08、AC-12、AC-13、前后端测试与 UI 证据 |
|
|
135
|
+
| 2026-09-18 | 回归菜单切换过渡:导航等待期间保留旧页面并隔离交互,目标提交后再替换;补充工作空间边界测试,验证页面状态、portal 宿主和加载层行为 | AC-05、工作空间布局、导航等待态与前端测试 |
|
|
136
|
+
| 2026-09-17 | 记录管理员选择、企业直接注册、邀请实现和项目成员候选的增量自动化与真实数据库结果;当时写入的固定邀请协议未获产品确认 | AC-01、AC-02、AC-06、AC-07、成员接入实现 |
|
|
137
|
+
| 2026-09-18 | 纠偏邀请验收口径:固定邀请实现与自动化降级为未确认技术证据;保留直接注册、项目成员企业候选已有证据,并明确当前浏览器/正式环境未复验 | AC-01、AC-02、AC-06、AC-07、邀请与项目成员候选 |
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
{
|
|
2
|
+
"suite": "browser",
|
|
3
|
+
"executedAt": "2026-09-09T15:11:39.148Z",
|
|
4
|
+
"results": [
|
|
5
|
+
{
|
|
6
|
+
"id": "browser-register-login-empty-workspace",
|
|
7
|
+
"acceptance": ["AC-01", "AC-08"],
|
|
8
|
+
"status": "passed",
|
|
9
|
+
"evidence": "ui/workspace-empty.png"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"id": "browser-platform-entry-and-create-company",
|
|
13
|
+
"acceptance": ["AC-01", "AC-02"],
|
|
14
|
+
"status": "passed",
|
|
15
|
+
"evidence": "ui/company-created.png"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": "browser-company-member-and-create-project",
|
|
19
|
+
"acceptance": ["AC-01", "AC-11"],
|
|
20
|
+
"status": "passed",
|
|
21
|
+
"evidence": "ui/project-created.png"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": "browser-profile-consecutive-saves",
|
|
25
|
+
"acceptance": ["AC-01", "AC-06"],
|
|
26
|
+
"status": "passed",
|
|
27
|
+
"evidence": "断言通过"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "browser-role-create-permission-and-member-assignment",
|
|
31
|
+
"acceptance": ["AC-01", "AC-03", "AC-06", "AC-11", "AC-12"],
|
|
32
|
+
"status": "passed",
|
|
33
|
+
"evidence": "ui/member-role-assigned.png"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"id": "browser-project-administrator-and-member-access",
|
|
37
|
+
"acceptance": ["AC-01", "AC-02", "AC-11"],
|
|
38
|
+
"status": "passed",
|
|
39
|
+
"evidence": "ui/project-member-home.png"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": "browser-role-revocation-refresh-and-forbidden",
|
|
43
|
+
"acceptance": ["AC-03", "AC-04"],
|
|
44
|
+
"status": "passed",
|
|
45
|
+
"evidence": "ui/permission-revoked.png"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"id": "browser-switch-race-and-logout-account-isolation",
|
|
49
|
+
"acceptance": ["AC-05"],
|
|
50
|
+
"status": "passed",
|
|
51
|
+
"evidence": "断言通过"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"id": "browser-menu-hide-disable-and-recovery-navigation",
|
|
55
|
+
"acceptance": ["AC-03", "AC-06"],
|
|
56
|
+
"status": "passed",
|
|
57
|
+
"evidence": "ui/platform-menu-recovery.png"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"id": "browser-unknown-page-compatibility",
|
|
61
|
+
"acceptance": ["AC-13"],
|
|
62
|
+
"status": "passed",
|
|
63
|
+
"evidence": "只在浏览器响应中注入未知 routeKey;旧前端过滤页面与空目录、直达404,服务端菜单未修改。新版页面注册由前端单测覆盖。"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"id": "browser-cleanup-preview-and-disabled-submit",
|
|
67
|
+
"acceptance": ["AC-14"],
|
|
68
|
+
"status": "passed",
|
|
69
|
+
"evidence": "ui/cleanup-empty-preview.png"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"id": "browser-disabled-company-administrator-replacement",
|
|
73
|
+
"acceptance": ["AC-09", "AC-10"],
|
|
74
|
+
"status": "passed",
|
|
75
|
+
"evidence": "ui/replacement-administrator.png"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"id": "browser-no-runtime-errors",
|
|
79
|
+
"acceptance": ["AC-01", "AC-05"],
|
|
80
|
+
"status": "passed",
|
|
81
|
+
"evidence": "断言通过"
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
{
|
|
2
|
+
"suite": "http",
|
|
3
|
+
"executedAt": "2026-09-09T14:56:00.090Z",
|
|
4
|
+
"results": [
|
|
5
|
+
{
|
|
6
|
+
"id": "http-empty-workspaces-and-platform-entry",
|
|
7
|
+
"acceptance": ["AC-01"],
|
|
8
|
+
"status": "passed",
|
|
9
|
+
"evidence": "断言通过"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"id": "http-create-company-project-transaction",
|
|
13
|
+
"acceptance": ["AC-01"],
|
|
14
|
+
"status": "passed",
|
|
15
|
+
"evidence": "断言通过"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": "http-scope-isolation-and-implicit-administrator",
|
|
19
|
+
"acceptance": ["AC-02"],
|
|
20
|
+
"status": "passed",
|
|
21
|
+
"evidence": "断言通过"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": "http-member-and-project-input-boundaries",
|
|
25
|
+
"acceptance": ["AC-06", "AC-11"],
|
|
26
|
+
"status": "passed",
|
|
27
|
+
"evidence": "断言通过"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "http-role-revoke-version-and-cross-scope",
|
|
31
|
+
"acceptance": ["AC-04", "AC-06"],
|
|
32
|
+
"status": "passed",
|
|
33
|
+
"evidence": "断言通过"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"id": "http-builtin-roles-and-last-administrator",
|
|
37
|
+
"acceptance": ["AC-06", "AC-12"],
|
|
38
|
+
"status": "passed",
|
|
39
|
+
"evidence": "断言通过"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": "http-menu-hidden-disabled-and-protected",
|
|
43
|
+
"acceptance": ["AC-03", "AC-06"],
|
|
44
|
+
"status": "passed",
|
|
45
|
+
"evidence": "断言通过"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"id": "http-menu-ancestor-and-cycle-constraints",
|
|
49
|
+
"acceptance": ["AC-03", "AC-06"],
|
|
50
|
+
"status": "passed",
|
|
51
|
+
"evidence": "断言通过"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"id": "http-status-preservation-and-member-reenable",
|
|
55
|
+
"acceptance": ["AC-04", "AC-09"],
|
|
56
|
+
"status": "passed",
|
|
57
|
+
"evidence": "断言通过"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"id": "http-account-disable-replacement-and-session-revocation",
|
|
61
|
+
"acceptance": ["AC-04", "AC-09", "AC-10"],
|
|
62
|
+
"status": "passed",
|
|
63
|
+
"evidence": "断言通过"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"id": "http-audit-request-and-failure-atomicity",
|
|
67
|
+
"acceptance": ["AC-07"],
|
|
68
|
+
"status": "passed",
|
|
69
|
+
"evidence": "断言通过"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"id": "http-inflight-revocation-first",
|
|
73
|
+
"acceptance": ["AC-15"],
|
|
74
|
+
"status": "passed",
|
|
75
|
+
"evidence": "断言通过"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"id": "http-inflight-write-first",
|
|
79
|
+
"acceptance": ["AC-15"],
|
|
80
|
+
"status": "passed",
|
|
81
|
+
"evidence": "断言通过"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"id": "http-cleanup-preview-and-rejected-candidates",
|
|
85
|
+
"acceptance": ["AC-14"],
|
|
86
|
+
"status": "passed",
|
|
87
|
+
"evidence": "HTTP 空预览与非法清理拒绝;成功清理、回滚及 tombstone 另由后端受控真实 DB 测试证明"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"id": "http-seed-repeat-preserves-configuration",
|
|
91
|
+
"acceptance": ["AC-08", "AC-12"],
|
|
92
|
+
"status": "passed",
|
|
93
|
+
"evidence": "断言通过"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"id": "http-upload-owner-regression",
|
|
97
|
+
"acceptance": ["AC-08"],
|
|
98
|
+
"status": "passed",
|
|
99
|
+
"evidence": "断言通过"
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"id": "http-enterprise-member-removal-cleans-children",
|
|
103
|
+
"acceptance": ["AC-04", "AC-06", "AC-09"],
|
|
104
|
+
"status": "passed",
|
|
105
|
+
"evidence": "断言通过"
|
|
106
|
+
}
|
|
107
|
+
]
|
|
108
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"suite": "legacy-http",
|
|
3
|
+
"executedAt": "2026-09-09T14:59:30.227Z",
|
|
4
|
+
"results": [
|
|
5
|
+
{
|
|
6
|
+
"id": "legacy-user-real-http-login",
|
|
7
|
+
"acceptance": ["AC-08"],
|
|
8
|
+
"status": "passed",
|
|
9
|
+
"evidence": "旧0000/0001库账号在新服务真实登录成功,身份保留且未自动分配企业"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"id": "legacy-upload-owner-real-http",
|
|
13
|
+
"acceptance": ["AC-08"],
|
|
14
|
+
"status": "passed",
|
|
15
|
+
"evidence": "旧上传记录owner可读取、不同真实登录用户404;此夹具验证历史归属,真实对象写入另见http-upload-owner-regression"
|
|
16
|
+
}
|
|
17
|
+
]
|
|
18
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"suite": "legacy",
|
|
3
|
+
"executedAt": "2026-09-09T14:42:44.740Z",
|
|
4
|
+
"results": [
|
|
5
|
+
{
|
|
6
|
+
"id": "legacy-fixture-isolated",
|
|
7
|
+
"acceptance": ["AC-08"],
|
|
8
|
+
"status": "passed",
|
|
9
|
+
"evidence": "独立 enterprise_legacy_* 数据库;真实重放 0000/0001 迁移及旧用户、上传记录"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"id": "legacy-upgrade-retains-user-upload",
|
|
13
|
+
"acceptance": ["AC-08"],
|
|
14
|
+
"status": "passed",
|
|
15
|
+
"evidence": "完整新迁移保留既有用户、密码散列、上传 ownerId;不自动分配企业"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": "legacy-migration-repeat-safe",
|
|
19
|
+
"acceptance": ["AC-08"],
|
|
20
|
+
"status": "passed",
|
|
21
|
+
"evidence": "再次执行真实 migrator 未重复变更,迁移记录与 journal 一致"
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# 企业/项目权限管理联调记录
|
|
2
|
+
|
|
3
|
+
## 范围与协调
|
|
4
|
+
|
|
5
|
+
- 需求来源:[需求文档](./需求文档.md)。
|
|
6
|
+
- 验收映射:[PRD](./PRD.md) 中的 AC-01~AC-15。
|
|
7
|
+
- 前后端基于 [技术契约](./技术契约.md) 和 `shared/types` 实现;契约变化由主控同步。
|
|
8
|
+
- 当前记录保留实施过程;2026-09-09 的 15 项验收只作为历史基线,详细证据见 [测试报告](./测试报告.md)。2026-09-17 之后形成的成员接入自动化结果按下述证据边界记录,旧结果和未获产品确认的邀请实现都不能证明当前完整流程通过。
|
|
9
|
+
|
|
10
|
+
## 2026-09-18 成员接入口径与证据边界
|
|
11
|
+
|
|
12
|
+
- 平台开通企业和设置企业管理员使用 `GlobalAccountSelect`,稳定值为 `userId`,请求字段为 `administratorUserId`;服务端仍需按提交时状态复核账号有效性。
|
|
13
|
+
- 企业直接注册新账号并加入企业已经确认。现有自动化和真实 PostgreSQL/Redis 专项覆盖账号、企业成员关系、默认 member 角色和审计同事务提交,以及账号冲突失败回滚;当前仍缺该入口的真实浏览器和正式环境复验。
|
|
14
|
+
- 企业邀请目前只确认是企业新增成员的另一条产品入口。邀请对象、载体、有效期、状态、接受/拒绝、撤销/重发、安全、审计、DTO、端点和数据模型仍待确认。
|
|
15
|
+
- 当前代码中的 7 天一次性 token、列表/创建/撤销/重发/接受 5 个端点、接受页、`drizzle/0004_company-member-invitations.sql` 及相关自动化结果,只是未获产品确认的实现证据,不属于现行契约,不记为联调通过或产品验收;不得据此继续约定前后端行为。
|
|
16
|
+
- 项目添加成员使用所属企业成员候选,只返回有效且尚未加入当前项目的成员;选择和提交稳定 `userId`,服务端在事务内再次校验账号、企业成员资格、状态和重复关系。
|
|
17
|
+
- 项目成员企业候选与 `{ userId }` 保存边界已有 Shared/Server/Web 自动化及真实依赖专项证据,但尚无当前入口的真实浏览器全过程和正式环境复验,不能记为完整联调通过。
|
|
18
|
+
|
|
19
|
+
## 2026-09-09 历史基线与环境
|
|
20
|
+
|
|
21
|
+
- `vp env doctor` 通过;Vite+ 管理的 Node 24.21.0 可用。PATH 中的 mise shim 未做系统级调整。
|
|
22
|
+
- `vp install --frozen-lockfile --offline` 因非交互环境要求确认重建依赖目录而退出;未删除现有依赖。现有依赖可以运行测试。
|
|
23
|
+
- 沙箱内 Vite/Chrome 启动子进程遇到 `spawn EPERM`;经执行工具批准,在沙箱外执行正常。
|
|
24
|
+
- `vp run --filter web test`:原有 3 个测试文件、29 项测试全部通过。
|
|
25
|
+
- `apps/server` 目录直接执行 `vp test`,运行期开启 `RUN_QUEUE_INTEGRATION=true` 并指定独立 Redis:4 个测试文件、14 项测试全部通过。`vp run` 会过滤该环境变量,其跳过结果不计入真实集成验证。
|
|
26
|
+
- 全仓 `vp check` 基线失败:176 个原有文件存在格式问题;`vp check --no-fmt` 基线存在 `packages/i18n/core/src/i18n.ts` 的两处 `console` 类型错误及 3 项警告。实施不会批量改写无关文件,交付区分原有问题与新增问题。
|
|
27
|
+
- Playwright 使用已有运行时包及已安装 Chrome,启动、渲染和读取页面的烟测通过;没有安装新浏览器或替换项目依赖。
|
|
28
|
+
|
|
29
|
+
## 数据隔离
|
|
30
|
+
|
|
31
|
+
- 本次验收独立创建临时 PostgreSQL 18 和 Redis 8 容器,仅监听 `127.0.0.1`,端口分别为 15432 和 16379。
|
|
32
|
+
- 容器名称为 `codex-enterprise-01a085-pg` 与 `codex-enterprise-01a085-redis`,数据库为 `enterprise_test`。
|
|
33
|
+
- 测试 API 实际监听 `http://127.0.0.1:3301`,Web 监听 `http://127.0.0.1:5301`,通过 `/api` 代理到测试 API;原有开发数据库、Redis 及其数据不修改。
|
|
34
|
+
- 独立 MinIO 容器 `codex-enterprise-01a085-minio` 监听本机 19000,使用单独测试 bucket 验证原有上传,不改现有对象存储。
|
|
35
|
+
- 测试数据库密码与会话密钥运行期随机生成,仅在系统临时配置中传递,不写入仓库或报告。测试账号亦按运行期生成。
|
|
36
|
+
- 正式交付需提供迁移和初始化说明;测试环境初始化成功不代替现有库兼容验证。
|
|
37
|
+
|
|
38
|
+
测试启动器为 `scripts/with-enterprise-test-env.mjs`,参数依次为临时 JSON 配置绝对路径、工程内工作目录、可执行文件及其参数。它检查测试数据库名称与本机地址,将配置仅注入子进程,不打印密钥。真实集成测试需直接调用包目录的测试命令,避免任务编排器过滤环境变量。
|
|
39
|
+
|
|
40
|
+
## 联调及缺陷
|
|
41
|
+
|
|
42
|
+
截至 2026-09-09,前后端已实现当时范围内的管理页面及契约接口。该轮联调发现的问题按所属模块回派修复;其结果仅作为历史基线,当前验收状态以 [测试报告](./测试报告.md) 的待复验说明为准。
|
|
43
|
+
|
|
44
|
+
| 轮次 | 发现与修复 | 验证证据 |
|
|
45
|
+
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
|
|
46
|
+
| 1 契约与代码评审 | 补齐项目管理员列表接口,管理员更换同步成员版本;完善按作用域的管理员保护、锁内重新鉴权和登录用户行锁;修正初始化脚本与构建产物启动路径 | Shared 7/7、前后端构建;后端真实数据库集成测试 |
|
|
47
|
+
| 2 首次真实启动 | Redis 会话校验 Lua 缺少局部 `isValidDigest`,撤销 Lua 大写 `DO` 导致执行失败;均修复并覆盖真实 Redis | 后端数据库及 Redis 集成首轮 12/12,无跳过;重新构建启动后 HTTP 受保护接口恢复 |
|
|
48
|
+
| 3 页面恢复与连续编辑 | 叶子页面 403 导致父布局丢失导航,首页停用后无法从工作空间入口恢复;改为独立父级作用域 loader 和已授权页面落点。资料保存同步响应中的最新版本,避免第二次编辑误报 409 | Web 43/43;31 个文件定向检查及完整 TypeScript/Vite 构建通过;浏览器继续复测 |
|
|
49
|
+
| 4 接口回归 | 停用最后有效平台管理员虽被拒绝,却提前撤销会话;改为先完成事务内业务约束、审计与结果读取,再在用户行锁内撤会话。原上传 session DTO 误用分片参数 schema,已改正 | 新增拒绝停用及审计失败保留会话断言;HTTP、浏览器与上传流程继续复测 |
|
|
50
|
+
|
|
51
|
+
测试脚本中客户端传入的 request ID 与服务端生成的 `x-request-id` 不同,审计检查已改用实际响应头。浏览器与接口并行测试分别使用已有的 Web/Mobile 会话类别,避免同终端单会话策略导致互相替换。
|
|
52
|
+
|
|
53
|
+
2026-09-09 最终复测完成:Shared 7/7、Web 43/43、Server 33/33;独立 QA 的 HTTP 17/17、浏览器 13/13、旧库迁移 3/3、旧库 HTTP 2/2,合计 35 组通过。AC-12 另补初始化后引入新功能目录的真实数据库升级测试,确认只扩展对应内置管理员权限,其他角色、用户分配和菜单定制保持。AC-13 和 AC-14 的版本兼容及清理验证使用受控夹具,其边界在最终报告中单独注明。该历史结果不覆盖 2026-09-17 新成员入口。
|
|
54
|
+
|
|
55
|
+
## 实际启动与迁移
|
|
56
|
+
|
|
57
|
+
2026-09-09 历史验收已在空的隔离数据库执行 `drizzle-kit migrate`,并完成服务启动、公开注册及首位平台管理员 CLI 初始化。旧库迁移另外使用 `enterprise_legacy_*` 数据库重放历史迁移,保留旧账号及上传 fixture 后升级,未访问开发库。
|
|
58
|
+
|
|
59
|
+
根目录的隔离后端启动命令为:
|
|
60
|
+
|
|
61
|
+
```powershell
|
|
62
|
+
node scripts/with-enterprise-test-env.mjs "$env:TEMP/codex-enterprise-01a085-runtime.json" apps/server node dist/src/main.js
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
迁移同样通过该启动器注入运行期环境,子命令为 `vp exec drizzle-kit migrate`;Windows 实际执行时指定了 `vp.exe` 的绝对路径以避免 shell 包装。通用构建、配置与首次使用命令见 [运行说明](./运行说明.md)。临时配置不属于交付配置,不应直接用于开发或正式部署。
|
|
66
|
+
|
|
67
|
+
## 验收环境清理
|
|
68
|
+
|
|
69
|
+
2026-09-10 已确认 3301、5301、3302 无测试进程监听,随后移除本次专属 PostgreSQL、Redis、MinIO 容器及匿名测试数据卷,并删除系统临时目录中的 4 份测试运行配置与身份凭据。保留测试脚本、脱敏 JSON 证据和截图;未改写开发环境配置、未迁移开发库、未提交 Git 或部署。文中的隔离端口与临时路径用于记录本次执行,当前不再提供运行中的测试预览;复现时需重新准备隔离运行配置。
|
|
70
|
+
|
|
71
|
+
## 变更记录
|
|
72
|
+
|
|
73
|
+
| 日期 | 变更摘要 | 影响范围 |
|
|
74
|
+
| ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------- |
|
|
75
|
+
| 2026-09-17 | 增加平台全局账号选择、企业直接注册、邀请入口和项目企业成员候选的增量联调范围;当时记录的 7 天/Token/5 端点细节后续确认并未获得产品授权 | Shared、Server、Web、数据库与浏览器复验 |
|
|
76
|
+
| 2026-09-18 | 纠偏企业邀请口径:仅保留邀请入口,固定协议恢复为待确认;现有邀请代码、`0004` 与自动化结果降级为实现证据,并明确直接注册、项目成员候选已有自动化但缺浏览器/正式环境复验 | 成员接入契约、联调状态与证据边界 |
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# 企业/项目权限管理运行说明
|
|
2
|
+
|
|
3
|
+
> 文档状态:当前需求口径。企业邀请只确认产品入口,具体协议待确认;当前代码中的 7 天/Token/接受页行为不得作为运行指南。旧页面中按完整账号直接添加企业/项目成员的交互也不得再作为现行规则。当前完整迁移链受企业层级残留 `0003` 和未确认邀请实现 `0004` 阻断,不得直接执行。
|
|
4
|
+
|
|
5
|
+
## 首次使用
|
|
6
|
+
|
|
7
|
+
系统不创建默认密码,也不把第一个注册用户自动升级为管理员。
|
|
8
|
+
|
|
9
|
+
1. 使用已经单独审阅且不包含未获批准变更的数据库基线启动服务,在注册页创建自己的账号;当前完整迁移链的阻断与处置要求见“迁移与回退”。
|
|
10
|
+
2. 由持有服务端运行权限的部署人员执行 `access:init --account <已注册完整账号>`,指定首位平台管理员。命令使用服务端环境配置;账号必须有效。
|
|
11
|
+
3. 使用该账号登录,在工作空间入口进入平台管理。即使平台还没有企业,也保留平台入口。
|
|
12
|
+
4. 在企业管理中创建企业,通过全局账号选择器选择首位企业管理员。提交值为稳定 `userId`,平台自动建立该账号的企业成员关系并授予内置企业管理员角色。
|
|
13
|
+
5. 企业管理员进入企业空间,可直接注册新账号并加入企业。企业邀请是另一条已确认的产品入口,但对象、载体、有效期、接受、撤销和重发等规则尚未确认,当前不按本说明操作。创建项目时从本企业有效成员中选择首位项目管理员,并提交 `administratorUserId`。
|
|
14
|
+
6. 项目管理员从所属企业的有效成员候选中添加项目成员;候选排除已经加入当前项目的成员,表单提交 `userId`,服务端再次校验企业成员资格、状态和重复关系。
|
|
15
|
+
|
|
16
|
+
普通公开注册账号尚未加入企业时,工作空间可提示联系企业管理员。邀请如何生成、传递和接受仍待产品确认,不能把当前接受页当作正式操作入口。公开注册不会自动创建企业、项目或分配管理权限;企业“直接注册成员”只用于创建新账号,不能覆盖或重复创建既有平台账号,也不能要求用户提供完整账号让管理员直接挂接。
|
|
17
|
+
|
|
18
|
+
登录后或访问默认入口 `/`、`/home` 时,只有一个项目且没有平台或额外企业管理职责的成员直接进入项目。多项目、平台身份、企业管理员及拥有额外企业权限的成员进入工作空间选择页。项目内的“切换空间”始终打开选择页;主动访问具体企业或项目链接时保留目标。
|
|
19
|
+
|
|
20
|
+
初始化命令重复指定原账号只同步系统功能目录;指定其他账号会被拒绝。后续平台管理员通过已有平台管理员分配角色,不能用初始化命令重复提权。已被撤销的用户角色不会通过重复初始化恢复。
|
|
21
|
+
|
|
22
|
+
## 日常管理
|
|
23
|
+
|
|
24
|
+
- 平台管理员管理企业开通、启停和企业管理员设置。平台身份本身不提供企业内部业务访问权。
|
|
25
|
+
- 企业管理员管理本企业全部项目,无需额外加入项目。创建项目必须是有效内置企业管理员,不能通过自定义角色下放。
|
|
26
|
+
- 企业邀请只确认入口,具体协议尚未形成现行需求和契约。当前界面若出现邀请列表、7 天链接、撤销、重发或接受页,均属于未获产品确认的实现,不应作为生产操作流程或对外承诺。
|
|
27
|
+
- 项目管理员只管理当前项目;项目成员必须先是所属企业成员。
|
|
28
|
+
- 停用保留关系和授权;恢复只恢复当前对象自身状态。移除企业成员会同时清理企业角色以及下属项目成员关系、项目角色,再加入只获得默认成员角色。
|
|
29
|
+
- 平台禁用企业最后一个管理员账号后,由平台设置或更换企业管理员。停用中的企业也可补任,补任不会自动启用企业。
|
|
30
|
+
- 更换管理员时选择新账号及要替换的旧任。旧任保留成员关系和其他角色,撤销的管理员角色不会在账号重新启用后恢复。
|
|
31
|
+
- 系统始终保护最后一个有效平台管理员。账号重新启用后需要重新登录,旧会话不会恢复。
|
|
32
|
+
|
|
33
|
+
资料、成员、角色和菜单的编辑使用版本号检测并发修改。遇到版本冲突,重新加载当前数据后再提交,不直接覆盖他人的更改。
|
|
34
|
+
|
|
35
|
+
## 菜单与功能发布
|
|
36
|
+
|
|
37
|
+
平台统一配置平台、企业、项目三套菜单树。名称、图标、排序、隐藏、启停及合法父级可调整;页面编号和操作权限来自代码功能目录,菜单编辑不能创建尚未开发的页面代码。
|
|
38
|
+
|
|
39
|
+
隐藏只影响导航,已获授权的人仍可直接访问。停用会同时阻断页面、按钮、接口及下级功能,内置管理员也不能绕过。平台企业、账号、角色和菜单等恢复管理入口及其祖先受到保护。
|
|
40
|
+
|
|
41
|
+
新功能发布后,系统补齐对应内置管理员权限;普通成员、自定义角色和已有用户角色分配不会自动扩大。种子更新保留菜单配置。旧前端过滤未知页面和空目录,加载含新页面代码的新版前端后才显示新入口。
|
|
42
|
+
|
|
43
|
+
## 废弃权限清理
|
|
44
|
+
|
|
45
|
+
第一版功能目录没有废弃项时,预览为空属于正常状态,无需执行清理。功能停用、服务版本暂时找不到某个权限或旧前端不认识页面,都不是废弃依据。
|
|
46
|
+
|
|
47
|
+
清理前先将目标权限在代码功能目录中明确标记废弃,并完成目标功能下线。部署人员核对全部在用服务实例及权限依赖,生成受控的只读 JSON 证明文件,通过 `ACCESS_DEPLOYMENT_PROOF_FILE` 提供给服务端。文件格式见 [技术契约](./技术契约.md) 第 8 节。
|
|
48
|
+
|
|
49
|
+
证明包含部署标识、核验时间、过期时间、各服务版本、实例清单和所依赖权限。当前服务版本及依赖必须匹配,证明有效期不超过 24 小时。切换实例、重新发布或回滚之前先撤销旧证明,完成核验后重新生成。文件由运维流程保障真实与完整,系统不会自动发现实际部署实例。
|
|
50
|
+
|
|
51
|
+
平台管理员先预览影响范围,再执行清理。服务端在事务锁内重新核对证明、候选项、引用和受保护节点;存在阻断项则拒绝整次操作。通过后清理授权引用、菜单及权限,更新版本、写清理记录和审计。重复清理不会再次删除,后续初始化也不会重建已清理权限。
|
|
52
|
+
|
|
53
|
+
## 迁移与回退
|
|
54
|
+
|
|
55
|
+
目标发布顺序为:备份数据库 → 执行经审阅的 Drizzle migration → 发布服务端并同步功能目录 → 发布前端。保留历史 `0000/0001`,不使用 `db:push` 代替正式迁移。当前迁移链尚未达到可执行条件,以下阻断解除前不得进入该发布流程。
|
|
56
|
+
|
|
57
|
+
- `drizzle/0003_cute_killmonger.sql` 仍包含已经取消的企业父子层级结构,完成清理并在隔离环境重新验证前不得执行。
|
|
58
|
+
- `drizzle/0004_company-member-invitations.sql` 对应尚未确认的固定邀请协议,产品需求、技术契约和迁移处置确认前不得执行。
|
|
59
|
+
- 当前完整迁移链包含上述两份阻断迁移,因此本说明不提供可直接执行的 `vp run db:migrate` 命令;不得通过手工跳号、修改迁移历史或使用 `db:push` 绕过。清理完成后,应先更新正式契约和本说明,再给出经隔离验证的迁移步骤。
|
|
60
|
+
|
|
61
|
+
迁移失败时停止后续发布,先核实数据库事务回滚结果;需要恢复时使用经过核验的备份。已开始写入新模型数据后,不直接删除新增表或倒退迁移。应用回滚之前检查旧版本是否兼容当前数据库,并撤销当前废弃权限清理证明。
|
|
62
|
+
|
|
63
|
+
现有账号保持原登录方式,不自动归入任何企业。上传继续使用原 `ownerId` 授权,本期没有将旧上传猜测归属到默认企业。
|
|
64
|
+
|
|
65
|
+
## 本次隔离验收
|
|
66
|
+
|
|
67
|
+
验收使用独立的本机 PostgreSQL、Redis、MinIO 与运行期随机账号,不修改开发 `.env` 或现有开发数据库。测试环境注入入口是 `scripts/with-enterprise-test-env.mjs`;凭据仅存于系统临时目录,不应复制进本说明或仓库。
|
|
68
|
+
|
|
69
|
+
本次验收完成后,专属测试服务、容器、数据卷和临时凭据已清理;下面的 3301/5301 是验收时使用的端口。要运行自己的环境,请配置服务端,并使用已经单独审阅且不包含未获批准变更的数据库基线;当前不得直接执行仓库完整迁移链。
|
|
70
|
+
|
|
71
|
+
实际执行命令、验收结果和遗留问题分别记录在 [联调记录](./联调记录.md) 和 [测试报告](./测试报告.md) 中。
|
|
72
|
+
|
|
73
|
+
## 启动命令
|
|
74
|
+
|
|
75
|
+
以下命令从工程根目录执行。先配置目标环境的数据库、Redis、对象存储和会话密钥。所有服务端命令使用相同的 `NODE_ENV` 和环境配置。环境文件按 `.env.<NODE_ENV>.local`、`.env.local`、`.env.<NODE_ENV>`、`.env` 顺序加载;未指定 `NODE_ENV` 时为 `development`。
|
|
76
|
+
|
|
77
|
+
构建共享包及前后端:
|
|
78
|
+
|
|
79
|
+
```powershell
|
|
80
|
+
vp run --filter shared build
|
|
81
|
+
vp run --filter server build
|
|
82
|
+
vp run --filter web build
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
确认数据库已经使用合规基线准备完成后,在后端目录启动服务。当前迁移链处于阻断状态,不能在此步骤前执行 `vp run db:migrate`:
|
|
86
|
+
|
|
87
|
+
```powershell
|
|
88
|
+
Set-Location apps/server
|
|
89
|
+
node dist/src/main.js
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
另开一个终端,在前端目录运行开发页面;API 地址应指向实际后端,下面端口与本次隔离验收一致:
|
|
93
|
+
|
|
94
|
+
```powershell
|
|
95
|
+
Set-Location apps/web
|
|
96
|
+
$env:VITE_API_URL = 'http://127.0.0.1:3301'
|
|
97
|
+
$env:VITE_API_AFFIX = '/api'
|
|
98
|
+
$env:VITE_PORT = '5301'
|
|
99
|
+
vp dev --mode dev --host 127.0.0.1 --port 5301 --strictPort
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
在页面注册自己的账号后,由部署人员在另一个终端的 `apps/server` 目录执行初始化,将示例账号替换为已经注册的完整账号:
|
|
103
|
+
|
|
104
|
+
```powershell
|
|
105
|
+
node dist/src/access-init.js --account your_registered_account
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
也可在该目录运行源码脚本 `vp run access:init -- --account your_registered_account`。初始化后重新进入工作空间,即可看到平台管理入口。服务启动会同步功能目录,普通启动不会自动创建平台管理员。
|
|
109
|
+
|
|
110
|
+
以上基础构建产物启动、历史迁移和初始化曾在隔离环境实际执行;未替用户执行开发库或正式库迁移。历史结果不能证明当前迁移链可以发布:`0003` 仍包含已取消的企业层级,`0004` 仍是未经确认的邀请实现。隔离验收使用 `scripts/with-enterprise-test-env.mjs` 注入运行期配置,不依赖开发环境文件中的数据库地址。
|
|
111
|
+
|
|
112
|
+
## 变更记录
|
|
113
|
+
|
|
114
|
+
| 日期 | 变更摘要 | 影响范围 |
|
|
115
|
+
| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ |
|
|
116
|
+
| 2026-09-17 | 平台管理员使用全局账号选择器;企业成员支持直接注册或邀请入口;项目成员仅从所属企业有效成员中选择。曾写入的 7 天链接与主动接受细节未获产品确认 | 首次使用、日常成员管理与项目成员入口 |
|
|
117
|
+
| 2026-09-18 | 纠偏企业邀请运行口径,并明确 `0003`/`0004` 阻断当前完整迁移链;删除固定邀请协议和可直接执行的迁移指引 | 首次使用、日常管理、启动、迁移与回退 |
|