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.
Files changed (496) hide show
  1. package/package.json +1 -1
  2. package/template-vp-monorepo-react-nestjs/.agents/rules//345/205/261/344/272/253/344/273/243/347/240/201.md +2 -2
  3. 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
  4. package/template-vp-monorepo-react-nestjs/.codegraph/.gitignore +5 -0
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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
  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//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
  21. 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
  22. 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
  23. 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
  24. 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
  25. 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
  26. 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
  27. 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
  28. 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
  29. 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
  30. 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
  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//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
  32. 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
  33. 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
  34. 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
  35. 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
  36. 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
  37. 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
  38. 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
  39. 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
  40. 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
  41. 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
  42. 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
  43. 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
  44. 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
  45. 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
  46. 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
  47. 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
  48. 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
  49. 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
  50. 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
  51. 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
  52. 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
  53. 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
  54. 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
  55. 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
  56. 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
  57. 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
  58. 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
  59. 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
  60. 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
  61. 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
  62. 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
  63. 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
  64. 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
  65. 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
  66. 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
  67. 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
  68. 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
  69. 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
  70. 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
  71. 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
  72. 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
  73. 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
  74. 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
  75. 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
  76. 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
  77. 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
  78. 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
  79. 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
  80. 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
  81. package/template-vp-monorepo-react-nestjs/.spaces/README.md +85 -0
  82. package/template-vp-monorepo-react-nestjs/.spaces//346/226/207/346/241/243/350/247/204/350/214/203.md +97 -0
  83. package/template-vp-monorepo-react-nestjs/AGENTS.md +12 -0
  84. package/template-vp-monorepo-react-nestjs/README.md +3 -27
  85. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/0002_enterprise_access.sql +182 -0
  86. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/0003_cute_killmonger.sql +357 -0
  87. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/0004_company-member-invitations.sql +25 -0
  88. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/0005_menu_svg_icons.sql +54 -0
  89. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/meta/0002_snapshot.json +1801 -0
  90. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/meta/0003_snapshot.json +3511 -0
  91. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/meta/0004_snapshot.json +3713 -0
  92. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/meta/_journal.json +29 -1
  93. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/rollback/0003_organization_backfill.sql +32 -0
  94. package/template-vp-monorepo-react-nestjs/apps/server/package.json +6 -4
  95. package/template-vp-monorepo-react-nestjs/apps/server/src/access-init.ts +45 -0
  96. package/template-vp-monorepo-react-nestjs/apps/server/src/app.controller.ts +3 -0
  97. package/template-vp-monorepo-react-nestjs/apps/server/src/app.module.ts +28 -5
  98. package/template-vp-monorepo-react-nestjs/apps/server/src/app.service.ts +3 -0
  99. package/template-vp-monorepo-react-nestjs/apps/server/src/common/adapters/fastify.adapter.ts +11 -0
  100. package/template-vp-monorepo-react-nestjs/apps/server/src/common/constants/session.constants.ts +9 -0
  101. package/template-vp-monorepo-react-nestjs/apps/server/src/common/decorators/access-policy.decorator.ts +18 -0
  102. package/template-vp-monorepo-react-nestjs/apps/server/src/common/decorators/current-auth.decorator.ts +4 -0
  103. package/template-vp-monorepo-react-nestjs/apps/server/src/common/decorators/public.decorator.ts +3 -0
  104. package/template-vp-monorepo-react-nestjs/apps/server/src/common/exceptions/app.exception.ts +9 -0
  105. package/template-vp-monorepo-react-nestjs/apps/server/src/common/filters/global-exception.filter.ts +38 -5
  106. package/template-vp-monorepo-react-nestjs/apps/server/src/common/security/password-security-event.ts +98 -0
  107. package/template-vp-monorepo-react-nestjs/apps/server/src/config/app.config.ts +3 -0
  108. package/template-vp-monorepo-react-nestjs/apps/server/src/config/database.config.ts +3 -0
  109. package/template-vp-monorepo-react-nestjs/apps/server/src/config/llm.config.ts +3 -0
  110. package/template-vp-monorepo-react-nestjs/apps/server/src/config/queue.config.ts +14 -0
  111. package/template-vp-monorepo-react-nestjs/apps/server/src/config/redis.config.ts +3 -0
  112. package/template-vp-monorepo-react-nestjs/apps/server/src/config/session.config.ts +7 -0
  113. package/template-vp-monorepo-react-nestjs/apps/server/src/config/storage.config.ts +9 -0
  114. package/template-vp-monorepo-react-nestjs/apps/server/src/database/access.schema.ts +394 -0
  115. package/template-vp-monorepo-react-nestjs/apps/server/src/database/db.module.ts +3 -0
  116. package/template-vp-monorepo-react-nestjs/apps/server/src/database/organization.schema.ts +453 -0
  117. package/template-vp-monorepo-react-nestjs/apps/server/src/database/schema.ts +6 -0
  118. package/template-vp-monorepo-react-nestjs/apps/server/src/main.ts +4 -0
  119. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access-http.ts +29 -0
  120. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access.errors.ts +130 -0
  121. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access.guard.ts +63 -0
  122. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access.module.ts +27 -0
  123. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access.service.ts +441 -0
  124. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access.store.ts +68 -0
  125. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access.validation.ts +44 -0
  126. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/maintenance/permissions-cleanup.controller.ts +27 -0
  127. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/maintenance/permissions-cleanup.service.ts +260 -0
  128. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/maintenance/permissions-cleanup.validation.ts +7 -0
  129. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/roles/roles.controller.ts +80 -0
  130. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/roles/roles.service.ts +249 -0
  131. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/roles/roles.validation.ts +24 -0
  132. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/seed/access-seed.service.ts +183 -0
  133. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/workspaces/workspaces.controller.ts +28 -0
  134. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/workspaces/workspaces.service.ts +94 -0
  135. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/workspaces/workspaces.validation.ts +5 -0
  136. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/audit/audit.controller.ts +26 -0
  137. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/audit/audit.module.ts +11 -0
  138. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/audit/audit.service.ts +74 -0
  139. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/audit/audit.validation.ts +11 -0
  140. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.controller.ts +25 -0
  141. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.errors.ts +10 -0
  142. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.module.ts +1 -1
  143. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.repository.ts +60 -0
  144. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.service.ts +69 -11
  145. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/dto/register.dto.ts +1 -1
  146. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/guards/session-auth.guard.ts +8 -0
  147. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/password/change-password.dto.ts +17 -0
  148. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/password.service.ts +6 -0
  149. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/session/session-store.service.ts +46 -0
  150. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/session/session-token.service.ts +12 -0
  151. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/session/session.script.ts +7 -1
  152. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/companies/companies.controller.ts +105 -0
  153. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/companies/companies.module.ts +12 -0
  154. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/companies/companies.service.ts +523 -0
  155. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/accounts/accounts.controller.ts +72 -0
  156. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/accounts/accounts.service.ts +154 -0
  157. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/accounts/accounts.validation.ts +8 -0
  158. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/accounts/password-reset/password-reset.service.ts +81 -0
  159. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/accounts/password-reset/reset-password.validation.ts +13 -0
  160. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/administrators/administrators.service.ts +116 -0
  161. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/administrators/administrators.validation.ts +1 -0
  162. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/invitations/company-member-invitations.controller.ts +69 -0
  163. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/invitations/member-invitation-acceptance.controller.ts +23 -0
  164. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/invitations/member-invitations.service.ts +344 -0
  165. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/invitations/member-invitations.validation.ts +23 -0
  166. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/members.controller.ts +88 -0
  167. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/members.module.ts +31 -0
  168. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/members.service.ts +573 -0
  169. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/members.validation.ts +19 -0
  170. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/menus/menus.controller.ts +56 -0
  171. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/menus/menus.module.ts +11 -0
  172. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/menus/menus.service.ts +230 -0
  173. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/menus/menus.validation.ts +30 -0
  174. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/candidates/global-account/global-account-candidates.controller.ts +35 -0
  175. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/candidates/global-account/global-account-candidates.service.ts +109 -0
  176. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/candidates/member-candidates.controller.ts +60 -0
  177. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/candidates/member-candidates.service.ts +939 -0
  178. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/initialization/project-organization-initialization.service.ts +189 -0
  179. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/organization.module.ts +34 -0
  180. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/organization.store.ts +150 -0
  181. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/organization.validation.ts +23 -0
  182. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/positions/positions.controller.ts +160 -0
  183. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/positions/positions.service.ts +636 -0
  184. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/templates/organization-templates.controller.ts +77 -0
  185. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/templates/organization-templates.service.ts +501 -0
  186. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/templates/organization-templates.store.ts +163 -0
  187. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/units/organization-units.controller.ts +187 -0
  188. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/units/organization-units.service.ts +947 -0
  189. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/projects/projects.controller.ts +94 -0
  190. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/projects/projects.module.ts +13 -0
  191. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/projects/projects.service.ts +369 -0
  192. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/queue-worker.bootstrap.ts +3 -0
  193. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.contracts.ts +4 -0
  194. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.module.ts +5 -0
  195. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.processor.ts +13 -0
  196. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.service.ts +9 -0
  197. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/db/db.controller.ts +9 -0
  198. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/db/db.service.ts +9 -0
  199. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/redis/redis.controller.ts +9 -0
  200. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/redis/redis.service.ts +18 -0
  201. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/dto/upload-params.dto.ts +1 -1
  202. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/storage/exact-size.transform.ts +14 -3
  203. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/storage/minio-storage.adapter.ts +37 -0
  204. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/storage/storage.port.ts +21 -0
  205. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.constants.ts +9 -0
  206. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.controller.ts +25 -0
  207. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.reponsitory.ts +27 -0
  208. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.service.ts +78 -0
  209. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/utils/object-key.ts +4 -0
  210. package/template-vp-monorepo-react-nestjs/apps/server/src/utils/server-address.ts +6 -0
  211. package/template-vp-monorepo-react-nestjs/apps/server/test/access/access-policy.spec.ts +95 -0
  212. package/template-vp-monorepo-react-nestjs/apps/server/test/access/access.integration.spec.ts +2250 -0
  213. package/template-vp-monorepo-react-nestjs/apps/server/test/access/member-onboarding.validation.spec.ts +78 -0
  214. package/template-vp-monorepo-react-nestjs/apps/server/test/auth/password-operations.spec.ts +433 -0
  215. package/template-vp-monorepo-react-nestjs/apps/server/test/auth/password.integration.spec.ts +300 -0
  216. package/template-vp-monorepo-react-nestjs/apps/server/test/error-catalog.spec.ts +6 -1
  217. package/template-vp-monorepo-react-nestjs/apps/server/test/menus.validation.spec.ts +28 -0
  218. package/template-vp-monorepo-react-nestjs/apps/server/test/organization/organization-domain.spec.ts +260 -0
  219. package/template-vp-monorepo-react-nestjs/apps/server/tsconfig.scripts.json +5 -0
  220. 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
  221. 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
  222. package/template-vp-monorepo-react-nestjs/apps/web/AGENTS.md +17 -8
  223. package/template-vp-monorepo-react-nestjs/apps/web/README.MD +36 -8
  224. package/template-vp-monorepo-react-nestjs/apps/web/index.html +2 -2
  225. package/template-vp-monorepo-react-nestjs/apps/web/package.json +1 -0
  226. package/template-vp-monorepo-react-nestjs/apps/web/src/App.tsx +19 -8
  227. package/template-vp-monorepo-react-nestjs/apps/web/src/api/auth.ts +14 -1
  228. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/accounts.svg +4 -0
  229. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/audit-log.svg +4 -0
  230. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/companies.svg +5 -0
  231. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/dashboard.svg +6 -0
  232. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/home.svg +4 -0
  233. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/members.svg +4 -0
  234. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/menu-item.svg +4 -0
  235. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/menus.svg +6 -0
  236. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/organization-template.svg +4 -0
  237. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/organization.svg +6 -0
  238. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/positions.svg +4 -0
  239. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/profile.svg +5 -0
  240. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/projects.svg +4 -0
  241. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/roles.svg +4 -0
  242. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Brand/Brand.module.css +125 -0
  243. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Brand/Brand.tsx +56 -0
  244. package/template-vp-monorepo-react-nestjs/apps/web/src/components/DraftProTable/DraftProTable.tsx +11 -5
  245. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/SvgAsset/IconSelector.tsx +38 -0
  246. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/SvgAsset/SvgAssetIcon.tsx +14 -0
  247. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/SvgAsset/SvgAssetRegistry.ts +32 -0
  248. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/SvgAsset/index.ts +10 -0
  249. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/svg-icon/SvgIcon.tsx +0 -2
  250. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Loading/PageLoading.tsx +5 -1
  251. package/template-vp-monorepo-react-nestjs/apps/web/src/components/LocaleSwitch/LocaleSwitch.tsx +52 -0
  252. package/template-vp-monorepo-react-nestjs/apps/web/src/components/PasswordActions/ChangePasswordDialog.tsx +90 -0
  253. package/template-vp-monorepo-react-nestjs/apps/web/src/components/PasswordActions/PasswordFields.module.css +12 -0
  254. package/template-vp-monorepo-react-nestjs/apps/web/src/components/PasswordActions/PasswordFields.tsx +54 -0
  255. package/template-vp-monorepo-react-nestjs/apps/web/src/components/PasswordActions/ResetAccountPasswordDialog.tsx +100 -0
  256. package/template-vp-monorepo-react-nestjs/apps/web/src/components/PasswordActions/change-password-session.ts +13 -0
  257. package/template-vp-monorepo-react-nestjs/apps/web/src/components/RouteTransition/RouteTransition.css +60 -0
  258. package/template-vp-monorepo-react-nestjs/apps/web/src/components/RouteTransition/RouteTransition.tsx +44 -0
  259. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/BasicTableSelector/BasicTableSelector.tsx +218 -0
  260. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/BasicTableSelector/BasicTableSelectorSelection.ts +91 -0
  261. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/BasicTableSelector/BasicTableSelectorTypes.ts +60 -0
  262. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/BasicTableSelector/README.md +110 -0
  263. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/BasicTableSelector/index.ts +7 -0
  264. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/GlobalAccountSelect/GlobalAccountSelect.tsx +211 -0
  265. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/GlobalAccountSelect/GlobalAccountSelectTypes.ts +75 -0
  266. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/GlobalAccountSelect/README.md +35 -0
  267. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/GlobalAccountSelect/index.ts +9 -0
  268. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/OrganizationMemberBrowser.tsx +146 -0
  269. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/OrganizationMemberCandidateColumns.tsx +137 -0
  270. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/OrganizationMemberFilterPanel.tsx +209 -0
  271. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/OrganizationMemberSelector.tsx +196 -0
  272. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/OrganizationMemberSelectorTypes.ts +103 -0
  273. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/README.md +8 -0
  274. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/index.ts +13 -0
  275. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/README.md +13 -0
  276. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/index.ts +30 -0
  277. package/template-vp-monorepo-react-nestjs/apps/web/src/config/theme.ts +41 -9
  278. package/template-vp-monorepo-react-nestjs/apps/web/src/hooks/useLatestDialogRequest.ts +71 -0
  279. package/template-vp-monorepo-react-nestjs/apps/web/src/i18n/config.ts +40 -0
  280. package/template-vp-monorepo-react-nestjs/apps/web/src/i18n/index.ts +10 -0
  281. package/template-vp-monorepo-react-nestjs/apps/web/src/i18n/instance.ts +36 -0
  282. package/template-vp-monorepo-react-nestjs/apps/web/src/i18n/ui-locale.ts +30 -0
  283. package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/{BasicLayout.tsx → BasicLayout/index.tsx} +42 -35
  284. package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/WorkspaceLayout/components/WorkspaceNavigationBoundary.tsx +50 -0
  285. package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/WorkspaceLayout/index.tsx +196 -0
  286. package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/WorkspaceLayout/workspace-landing.css +119 -0
  287. package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/WorkspaceLayout/workspace-surfaces.css +110 -0
  288. package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/WorkspaceLayout/workspace.css +223 -0
  289. package/template-vp-monorepo-react-nestjs/apps/web/src/locales/en_US.json +639 -1
  290. package/template-vp-monorepo-react-nestjs/apps/web/src/locales/zh_CN.json +621 -1
  291. package/template-vp-monorepo-react-nestjs/apps/web/src/main.tsx +8 -2
  292. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/api.ts +226 -0
  293. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/audit.tsx +169 -0
  294. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/AdministratorDialog.tsx +128 -0
  295. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/CleanupDialog.tsx +140 -0
  296. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/CompanyHierarchyDialog.tsx +244 -0
  297. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/EntityFormDialog.tsx +285 -0
  298. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/EntitySelectors/index.ts +6 -0
  299. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/EntitySelectors/selector-requests.ts +59 -0
  300. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberAffiliations/MemberOrganizationsDialog.tsx +188 -0
  301. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberAffiliations/MemberPositionsDialog.tsx +116 -0
  302. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberAffiliations/affiliation-loaders.ts +18 -0
  303. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberAffiliations/index.ts +5 -0
  304. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/AddProjectMemberDialog.tsx +75 -0
  305. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/CompanyMemberInvitation/CompanyMemberInvitationDialog.tsx +246 -0
  306. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/CompanyMemberInvitation/InvitationRecordsTable.tsx +152 -0
  307. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/CompanyMemberInvitation/invitation-link.ts +9 -0
  308. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/MemberOnboardingActions.tsx +79 -0
  309. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/RegisterCompanyMember/RegisterCompanyMemberDialog.module.css +12 -0
  310. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/RegisterCompanyMember/RegisterCompanyMemberDialog.tsx +122 -0
  311. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberRolesDialog.tsx +80 -0
  312. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberTable/MemberTableColumns.tsx +234 -0
  313. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberTable/index.ts +2 -0
  314. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberTable/member-candidate-cache.ts +12 -0
  315. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MenuFormDialog.tsx +251 -0
  316. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/RoleFormDialog.tsx +73 -0
  317. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/RolePermissionsDialog.tsx +185 -0
  318. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/entities.tsx +268 -0
  319. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/home.tsx +67 -0
  320. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/members.tsx +310 -0
  321. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/menus/api.ts +74 -0
  322. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/menus/index.tsx +325 -0
  323. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/profile.tsx +160 -0
  324. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/roles.tsx +173 -0
  325. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/use-access.ts +35 -0
  326. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/error/404.tsx +20 -0
  327. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/error/error.tsx +42 -0
  328. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/i18n/index.tsx +20 -38
  329. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/components/ProjectFormDialog.tsx +46 -41
  330. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/config/columns.tsx +20 -15
  331. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/config/index.ts +32 -22
  332. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/components/DraftProjectFormDialog.tsx +41 -34
  333. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/config/columns.tsx +27 -20
  334. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/config/projects.ts +21 -13
  335. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/index.tsx +47 -27
  336. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/index.tsx +51 -36
  337. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/home/index.tsx +9 -6
  338. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/login/api.ts +3 -0
  339. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/login/index.tsx +62 -82
  340. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/login/login-form.css +199 -0
  341. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/login/login.css +146 -124
  342. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/member-invitations/accept.css +47 -0
  343. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/member-invitations/accept.tsx +143 -0
  344. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/member-invitations/api.ts +20 -0
  345. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/api.ts +91 -0
  346. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/MoveOrganizationUnitDialog.tsx +82 -0
  347. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/OrganizationMemberColumns.tsx +87 -0
  348. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/OrganizationMemberHeader.tsx +102 -0
  349. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/OrganizationTreeModel.tsx +59 -0
  350. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/OrganizationTreePanel.tsx +88 -0
  351. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/index.ts +11 -0
  352. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/organization-loaders.ts +47 -0
  353. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/organization-member-filter-loaders.ts +187 -0
  354. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationMembersDialog.tsx +207 -0
  355. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationUnitDialog.tsx +110 -0
  356. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/index.tsx +258 -0
  357. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization-templates/api.ts +53 -0
  358. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization-templates/components/OrganizationTemplateDialog/TemplateDefinitionTabs.tsx +189 -0
  359. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization-templates/components/OrganizationTemplateDialog/index.tsx +135 -0
  360. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization-templates/components/OrganizationTemplateDialog/types.ts +25 -0
  361. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization-templates/index.tsx +201 -0
  362. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/positions/api.ts +81 -0
  363. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/positions/components/PositionFormDialog.tsx +86 -0
  364. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/positions/components/PositionMembersDialog.tsx +102 -0
  365. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/positions/index.tsx +198 -0
  366. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/positions/loaders.ts +35 -0
  367. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/register/api.ts +14 -0
  368. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/register/index.tsx +157 -0
  369. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/workspaces/api.ts +32 -0
  370. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/workspaces/index.tsx +146 -0
  371. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/workspaces/state.ts +24 -0
  372. package/template-vp-monorepo-react-nestjs/apps/web/src/router/AGENTS.MD +6 -0
  373. package/template-vp-monorepo-react-nestjs/apps/web/src/router/index.tsx +2 -46
  374. package/template-vp-monorepo-react-nestjs/apps/web/src/router/lazy-load/index.tsx +26 -0
  375. package/template-vp-monorepo-react-nestjs/apps/web/src/router/middleware/README.md +23 -0
  376. package/template-vp-monorepo-react-nestjs/apps/web/src/router/middleware/auth.ts +6 -0
  377. package/template-vp-monorepo-react-nestjs/apps/web/src/router/middleware/index.ts +4 -0
  378. package/template-vp-monorepo-react-nestjs/apps/web/src/router/middleware/workspace/access.ts +23 -0
  379. package/template-vp-monorepo-react-nestjs/apps/web/src/router/middleware/workspace/data.ts +55 -0
  380. package/template-vp-monorepo-react-nestjs/apps/web/src/router/middleware/workspace/entry.ts +52 -0
  381. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/access/page.tsx +20 -0
  382. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/auth.tsx +17 -0
  383. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/company.tsx +30 -0
  384. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/entry.tsx +20 -0
  385. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/examples.tsx +23 -0
  386. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/fallback.tsx +13 -0
  387. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/index.tsx +32 -0
  388. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/platform.tsx +27 -0
  389. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/project.tsx +28 -0
  390. package/template-vp-monorepo-react-nestjs/apps/web/src/router/page-registry.tsx +94 -0
  391. package/template-vp-monorepo-react-nestjs/apps/web/src/styles/dream.css +34 -0
  392. package/template-vp-monorepo-react-nestjs/apps/web/src/styles/index.css +6 -0
  393. package/template-vp-monorepo-react-nestjs/apps/web/src/types/auto-imports.d.ts +26 -0
  394. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/organization-assignment.ts +66 -0
  395. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/request/core/index.ts +48 -13
  396. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/request/core/utils.ts +5 -0
  397. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/request/index.ts +7 -2
  398. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/request/workspace.ts +82 -0
  399. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/safe-next.ts +36 -0
  400. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/storage/cookie.ts +1 -0
  401. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/storage/session.ts +1 -0
  402. package/template-vp-monorepo-react-nestjs/apps/web/test/i18n-locale.spec.ts +22 -0
  403. package/template-vp-monorepo-react-nestjs/apps/web/test/icon-selector.spec.tsx +23 -0
  404. package/template-vp-monorepo-react-nestjs/apps/web/test/latest-dialog-request.spec.ts +89 -0
  405. package/template-vp-monorepo-react-nestjs/apps/web/test/member-invitation-navigation.spec.ts +34 -0
  406. package/template-vp-monorepo-react-nestjs/apps/web/test/organization-assignment.spec.ts +137 -0
  407. package/template-vp-monorepo-react-nestjs/apps/web/test/password-actions.spec.ts +40 -0
  408. package/template-vp-monorepo-react-nestjs/apps/web/test/password-reset-action.spec.ts +64 -0
  409. package/template-vp-monorepo-react-nestjs/apps/web/test/request.spec.ts +1 -0
  410. package/template-vp-monorepo-react-nestjs/apps/web/test/router/access.spec.ts +136 -0
  411. package/template-vp-monorepo-react-nestjs/apps/web/test/router/config.ts +140 -0
  412. package/template-vp-monorepo-react-nestjs/apps/web/test/router/entry.spec.ts +179 -0
  413. package/template-vp-monorepo-react-nestjs/apps/web/test/router/workspace-data.spec.ts +112 -0
  414. package/template-vp-monorepo-react-nestjs/apps/web/test/selector/global-account-select.spec.ts +311 -0
  415. package/template-vp-monorepo-react-nestjs/apps/web/test/selector/organization-member-selector.spec.ts +454 -0
  416. package/template-vp-monorepo-react-nestjs/apps/web/test/selector/selector-selection.spec.ts +132 -0
  417. package/template-vp-monorepo-react-nestjs/apps/web/test/storage.spec.ts +1 -0
  418. package/template-vp-monorepo-react-nestjs/apps/web/test/tsconfig.json +2 -2
  419. package/template-vp-monorepo-react-nestjs/apps/web/test/workspace-navigation-boundary.spec.tsx +169 -0
  420. package/template-vp-monorepo-react-nestjs/apps/web/test/workspace-navigation.spec.ts +105 -0
  421. package/template-vp-monorepo-react-nestjs/apps/web/test/workspace-requests.spec.ts +174 -0
  422. package/template-vp-monorepo-react-nestjs/apps/web/test/workspaces-password-entry.spec.tsx +71 -0
  423. package/template-vp-monorepo-react-nestjs/apps/web/vite.config.ts +84 -35
  424. package/template-vp-monorepo-react-nestjs/apps/web-vue/package.json +2 -0
  425. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/api/index.ts +1 -0
  426. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/hooks/chart/useEcharts.ts +13 -1
  427. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/layout/default/header/index.vue +1 -0
  428. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/layout/default/index.vue +6 -2
  429. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/router/guard/index.ts +1 -0
  430. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/router/guard/permissionGuard.ts +1 -0
  431. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/router/index.ts +1 -0
  432. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/store/index.ts +1 -0
  433. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/store/modules/user.ts +1 -0
  434. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/types/auto-import.d.ts +2 -0
  435. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/utils/request/core/index.ts +30 -0
  436. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/utils/request/core/utils.ts +5 -0
  437. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/utils/request/index.ts +2 -0
  438. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/views/example/echart/config.ts +1 -0
  439. package/template-vp-monorepo-react-nestjs/apps/web-vue/tsconfig.tsbuildinfo +1 -1
  440. package/template-vp-monorepo-react-nestjs/package.json +1 -8
  441. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/command.ts +22 -2
  442. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/config.ts +1 -0
  443. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/files.ts +1 -0
  444. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/load-config.ts +8 -0
  445. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/report.ts +2 -0
  446. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/scanner.ts +11 -0
  447. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/sync.ts +12 -0
  448. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/test/command.test.ts +1 -0
  449. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/test/temporary-directory.ts +5 -0
  450. package/template-vp-monorepo-react-nestjs/packages/i18n/core/src/format.ts +1 -0
  451. package/template-vp-monorepo-react-nestjs/packages/i18n/core/src/i18n.ts +14 -0
  452. package/template-vp-monorepo-react-nestjs/packages/i18n/core/src/storage.ts +8 -0
  453. package/template-vp-monorepo-react-nestjs/packages/i18n/core/src/store.ts +9 -0
  454. package/template-vp-monorepo-react-nestjs/packages/i18n/react/src/index.tsx +5 -0
  455. package/template-vp-monorepo-react-nestjs/packages/i18n/react/src/use-store.ts +3 -0
  456. package/template-vp-monorepo-react-nestjs/packages/i18n/vue/src/index.ts +6 -0
  457. package/template-vp-monorepo-react-nestjs/packages/i18n/vue/src/use-store.ts +3 -0
  458. package/template-vp-monorepo-react-nestjs/packages/shared/package.json +5 -1
  459. package/template-vp-monorepo-react-nestjs/packages/shared/src/index.ts +2 -13
  460. package/template-vp-monorepo-react-nestjs/packages/shared/src/types/access-maintenance.ts +68 -0
  461. package/template-vp-monorepo-react-nestjs/packages/shared/src/types/access-menus.ts +94 -0
  462. package/template-vp-monorepo-react-nestjs/packages/shared/src/types/access-resources.ts +168 -0
  463. package/template-vp-monorepo-react-nestjs/packages/shared/src/types/access.ts +71 -0
  464. package/template-vp-monorepo-react-nestjs/packages/shared/src/types/auth.ts +23 -0
  465. package/template-vp-monorepo-react-nestjs/packages/shared/src/types/index.ts +9 -0
  466. package/template-vp-monorepo-react-nestjs/packages/shared/src/types/organization/models.ts +361 -0
  467. package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/access-catalog.ts +304 -0
  468. package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/access-scope.ts +97 -0
  469. package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/account.ts +1 -0
  470. package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/index.ts +65 -0
  471. package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/organization/contracts.ts +237 -0
  472. package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/record.ts +10 -0
  473. package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/session-terminal.ts +1 -0
  474. package/template-vp-monorepo-react-nestjs/packages/shared/test/access.spec.ts +194 -0
  475. package/template-vp-monorepo-react-nestjs/packages/shared/test/organization.spec.ts +168 -0
  476. package/template-vp-monorepo-react-nestjs/pnpm-workspace.yaml +103 -69
  477. package/template-vp-monorepo-react-nestjs/scripts/enterprise-qa/browser.mjs +696 -0
  478. package/template-vp-monorepo-react-nestjs/scripts/enterprise-qa/http-support.mjs +105 -0
  479. package/template-vp-monorepo-react-nestjs/scripts/enterprise-qa/http.mjs +1091 -0
  480. package/template-vp-monorepo-react-nestjs/scripts/enterprise-qa/legacy-http.mjs +140 -0
  481. package/template-vp-monorepo-react-nestjs/scripts/enterprise-qa/legacy.mjs +196 -0
  482. package/template-vp-monorepo-react-nestjs/scripts/enterprise-qa/runtime.mjs +110 -0
  483. package/template-vp-monorepo-react-nestjs/scripts/with-enterprise-test-env.mjs +80 -0
  484. package/template-vp-monorepo-react-nestjs/src/types/auto-imports.d.ts +60 -0
  485. package/template-vp-react/.vscode/settings.json +8 -1
  486. package/template-vp-react/package.json +10 -10
  487. package/template-vp-react/src/types/auto-imports.d.ts +2 -0
  488. package/template-vp-vue-eslint-vapor/package.json +20 -20
  489. 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
  490. package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/BasicLayout.module.css +0 -17
  491. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/.gitkeep +0 -0
  492. package/template-vp-react/.agents/rules/SVG/344/275/277/347/224/250.md +0 -8
  493. package/template-vp-react/AGENTS.md +0 -11
  494. /package/template-vp-monorepo-react-nestjs/apps/web/src/assets/{hero.png → image/hero.png} +0 -0
  495. /package/template-vp-monorepo-react-nestjs/apps/web/src/assets/{react.svg → svg/react.svg} +0 -0
  496. /package/template-vp-monorepo-react-nestjs/apps/web/src/assets/{vite.svg → svg/vite.svg} +0 -0
@@ -0,0 +1,73 @@
1
+ # 从本目录的 backup.dump 恢复数据到 vp-postgres 容器中的 postgres 库
2
+ # 用法: pwsh ./restore-dump.ps1 (有确认提示)
3
+ # pwsh ./restore-dump.ps1 -Force (跳过确认,用于自动化)
4
+ param(
5
+ [switch]$Force
6
+ )
7
+
8
+ $ErrorActionPreference = 'Stop'
9
+
10
+ $ContainerName = 'vp-postgres'
11
+ $DbUser = 'postgres'
12
+ $DbName = 'postgres'
13
+ $DumpName = 'backup.dump'
14
+ $ContainerPath = "/tmp/$DumpName"
15
+ $HostPath = Join-Path $PSScriptRoot $DumpName
16
+
17
+ # 1. 前置检查
18
+ if (-not (Test-Path $HostPath)) {
19
+ throw "备份文件不存在: $HostPath"
20
+ }
21
+
22
+ $status = docker inspect -f '{{.State.Running}}' $ContainerName 2>$null
23
+ if ($status -ne 'true') {
24
+ throw "容器 $ContainerName 未运行,请先执行: docker compose up -d postgres"
25
+ }
26
+
27
+ # 2. 恢复会删除并重建整个 postgres 库,要求显式确认
28
+ if (-not $Force) {
29
+ $answer = Read-Host "将清空 $ContainerName/$DbName 的 public、drizzle schema(含备份之外的对象),并用 $DumpName 恢复,输入 YES 确认"
30
+ if ($answer -ne 'YES') {
31
+ Write-Host '已取消'
32
+ exit 1
33
+ }
34
+ }
35
+
36
+ # 3. 拷进容器(不用 stdin 重定向,避免跨环境文件损坏)
37
+ docker cp "$HostPath" "${ContainerName}:$ContainerPath"
38
+ if ($LASTEXITCODE -ne 0) {
39
+ throw 'docker cp 导入失败'
40
+ }
41
+
42
+ try {
43
+ # 4. 删除旧库之前先验证备份格式,避免无效文件造成数据丢失
44
+ docker exec $ContainerName pg_restore --list $ContainerPath | Out-Null
45
+ if ($LASTEXITCODE -ne 0) {
46
+ throw '备份文件无效,未删除目标数据库'
47
+ }
48
+
49
+ # 5. 从维护库 template1 连接,断开占用 postgres 的会话后完整重建数据库
50
+ docker exec $ContainerName dropdb -U $DbUser --maintenance-db=template1 --force --if-exists $DbName
51
+ if ($LASTEXITCODE -ne 0) {
52
+ throw '删除旧数据库失败,未执行恢复'
53
+ }
54
+
55
+ docker exec $ContainerName createdb -U $DbUser --maintenance-db=template1 $DbName
56
+ if ($LASTEXITCODE -ne 0) {
57
+ throw '创建空数据库失败,请修复后重新执行恢复'
58
+ }
59
+
60
+ # 6. --single-transaction 保证导入失败时不会留下部分备份对象;旧库已被删除
61
+ # --no-owner 使恢复对象归属当前连接用户
62
+ docker exec $ContainerName pg_restore -U $DbUser -d $DbName `
63
+ --no-owner --single-transaction --exit-on-error $ContainerPath
64
+ if ($LASTEXITCODE -ne 0) {
65
+ throw 'pg_restore 执行失败,目标数据库为空,请修复后重新执行恢复'
66
+ }
67
+ }
68
+ finally {
69
+ # 7. 无论成功失败都清理容器内临时文件
70
+ docker exec $ContainerName rm -f $ContainerPath | Out-Null
71
+ }
72
+
73
+ Write-Host "恢复完成: $DumpName -> $ContainerName/$DbName"
@@ -0,0 +1,227 @@
1
+ # 数据库迁移指南(Drizzle + PostgreSQL)
2
+
3
+ > 状态:当前有效
4
+ >
5
+ > 适用目录:`packages/create-bubbles/template-vp-monorepo-react-nestjs`
6
+ >
7
+ > 适用技术栈:NestJS 11、Drizzle ORM、drizzle-kit、PostgreSQL 18、pnpm monorepo。
8
+ >
9
+ > 本文面向以前端开发为主、刚开始写 NestJS 的开发者。请按顺序操作,修改表结构后不要忘记生成并提交迁移文件。
10
+
11
+ > **当前迁移阻断(2026-09-18):** 仓库迁移链中的 `0003_cute_killmonger.sql` 仍包含已取消的企业父子层级,`0004_company-member-invitations.sql` 对应未获产品确认的邀请协议。清理两项偏差、同步正式契约并完成隔离环境复验前,不得对空库、开发库、共享库或生产库执行完整 `db:migrate`,也不得手工跳号、修改迁移历史或使用 `db:push` 绕过。本文中的迁移命令仅描述阻断解除后的标准流程,不是当前可执行指令。
12
+
13
+ ## 一、迁移体系一览
14
+
15
+ 本平台不使用 TypeORM,数据库表结构由 **Drizzle ORM** 的 schema 文件定义,再由 **drizzle-kit** 编译成有序的 SQL 迁移文件。
16
+
17
+ | 项 | 位置 | 说明 |
18
+ | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------- |
19
+ | 表结构定义(唯一事实来源) | `apps/server/src/database/schema.ts`、`apps/server/src/database/access.schema.ts`、`apps/server/src/database/organization.schema.ts` | 所有表、字段、枚举、索引都在这里声明 |
20
+ | 迁移工具配置 | `apps/server/drizzle.config.ts` | 指定 schema 路径、迁移输出目录、数据库方言(postgresql)和连接串 |
21
+ | 已生成的迁移 SQL | `apps/server/drizzle/` | 形如 `0000_xxx.sql`、`0001_xxx.sql` 的版本文件 |
22
+ | 迁移快照与链路 | `apps/server/drizzle/meta/` | `_journal.json` 和各版本 snapshot,记录迁移先后顺序,**必须随迁移文件一起提交** |
23
+ | 应用侧连接配置 | `apps/server/src/config/database.config.ts` | NestJS 启动时读取 `DB_*` 环境变量创建连接池 |
24
+ | 环境变量 | `apps/server/.env.development`(及 `.env.production`) | `DATABASE_URL` 供 drizzle-kit 使用,`DB_*` 供运行时使用 |
25
+ | PostgreSQL 服务 | 根目录 `docker-compose.yml` | `postgres:18-alpine`,容器名 `vp-postgres`,端口 5432,账号/密码/库名均为 `postgres` / `ml` / `postgres` |
26
+
27
+ 环境变量加载顺序见 `apps/server/src/utils/env-arr.ts`:`.env.${NODE_ENV}.local` → `.env.local` → `.env.${NODE_ENV}` → `.env`,本地覆盖文件不要提交。
28
+
29
+ ## 二、相关 npm 脚本
30
+
31
+ 脚本定义在 `apps/server/package.json`,均需在 `apps/server` 目录下执行:
32
+
33
+ | 命令 | 作用 | 使用场景 |
34
+ | ----------------------------------- | --------------------------------------------- | ---------------------------------------- |
35
+ | `pnpm db:generate` | 对比 schema 与最新快照,生成新的迁移 SQL 文件 | 修改 schema 之后 |
36
+ | `pnpm db:migrate` | 把 `drizzle/` 中尚未执行的迁移应用到数据库 | 仅在迁移链已审阅、无阻断并完成隔离验证后 |
37
+ | `pnpm db:push` | 跳过迁移文件,直接把 schema 硬同步到数据库 | **仅限本地快速调试**,不留版本记录 |
38
+ | `pnpm db:studio` | 启动 Drizzle Studio 网页端查看/编辑数据 | 本地排查数据 |
39
+ | `pnpm access:init --account <账号>` | 写入访问控制(角色、权限等)种子数据 | 迁移完成后的初始化 |
40
+
41
+ ## 三、标准迁移流程
42
+
43
+ ### 1. 启动 PostgreSQL(在项目根目录)
44
+
45
+ ```powershell
46
+ docker compose up -d postgres
47
+ ```
48
+
49
+ 如同时需要 Redis、MinIO,执行 `docker compose up -d` 启动全部服务。可用 `docker compose ps` 确认 `vp-postgres` 处于 running 状态。
50
+
51
+ ### 2. 应用已有迁移(仅限当前阻断解除后)
52
+
53
+ 以下命令在当前仓库状态下不得执行;完成 `0003`/`0004` 处置并更新本指南后,它才恢复为首次拉取代码或切换分支后的标准步骤。
54
+
55
+ ```powershell
56
+ cd apps/server
57
+ pnpm db:migrate
58
+ ```
59
+
60
+ 该命令会读取 `apps/server/.env.development` 中的 `DATABASE_URL`(当前为 `postgresql://postgres:ml@localhost:5432/postgres`),自动跳过已执行的迁移,只执行新增部分。
61
+
62
+ ### 3. 修改 schema
63
+
64
+ 在 `src/database/schema.ts`、`src/database/access.schema.ts` 或 `src/database/organization.schema.ts` 中新增表、字段、索引或枚举,并按现有领域边界选择对应文件。
65
+
66
+ ### 4. 生成迁移文件
67
+
68
+ ```powershell
69
+ pnpm db:generate
70
+ ```
71
+
72
+ 执行后会在 `apps/server/drizzle/` 下生成新文件,例如 `0003_xxx.sql`,同时更新 `drizzle/meta/` 快照。
73
+
74
+ **生成后必须打开 SQL 文件人工检查一遍**,重点确认:
75
+
76
+ - 删列、改类型等操作是否会丢数据;
77
+ - 新增非空列是否提供了默认值;
78
+ - 索引、约束名称是否符合预期。
79
+
80
+ ### 5. 应用迁移(仅限迁移链无阻断时)
81
+
82
+ 执行前必须重新核对迁移清单;当前 `0003`/`0004` 阻断仍在,不能执行下面的标准命令。
83
+
84
+ ```powershell
85
+ pnpm db:migrate
86
+ ```
87
+
88
+ ### 6. 提交到 Git
89
+
90
+ 迁移 SQL 与 `drizzle/meta/` 目录要**一起提交**。迁移链通过审阅和隔离验证后,其他同学或部署环境才能执行 `pnpm db:migrate` 得到一致表结构;当前阻断状态下不能据此操作。
91
+
92
+ ### 7.(可选)初始化权限种子数据
93
+
94
+ ```powershell
95
+ pnpm access:init --account <已注册的完整账号>
96
+ ```
97
+
98
+ 该命令由 `src/access-init.ts` 驱动,为指定账号写入企业访问控制所需的角色、权限等基础数据。
99
+
100
+ 一句话总结工作流:
101
+
102
+ ```text
103
+ 改 schema.ts → pnpm db:generate → 检查 SQL → 连同 meta 一起提交 → 隔离验证且确认无阻断 → 各环境 pnpm db:migrate
104
+ ```
105
+
106
+ ## 四、generate 与 push 的区别
107
+
108
+ - **`db:generate` + `db:migrate`**:迁移链无阻断时的正式流程。迁移有历史、可审查、可在各环境按顺序重放;当前 `0003`/`0004` 未处置,尚不能进入执行阶段。
109
+ - **`db:push`**:直接比对 schema 后硬改数据库,速度快但不生成迁移文件,遇到删列等操作可能直接丢数据。仅允许在本地草稿/演示阶段使用,**不要对共享数据库或生产库使用**。
110
+
111
+ ## 五、注意事项
112
+
113
+ 1. **不要改名或删除已有迁移文件**。drizzle-kit 在数据库中维护迁移记录表,靠文件名和 `meta/_journal.json` 判定执行状态;改动历史文件会导致迁移链断裂,后续 `migrate` 报错。
114
+ 2. **迁移文件和 `meta/` 快照必须一起提交**,只提交 SQL 不提交快照会让其他人生成的下一个迁移与当前状态对不上。
115
+ 3. **一个迁移只做一件事**,避免在一个 SQL 文件里混合大量无关变更,方便审查和定位问题。
116
+ 4. **数据库连不上时先查基础设施**:Docker 是否启动(`docker compose ps`)、5432 端口是否被占用、`.env` 中账号密码是否与 `docker-compose.yml` 一致。
117
+ 5. 生产环境的连接串通过 `.env.production` 或部署平台的环境变量注入,不要把真实密码写进仓库。
118
+
119
+ ## 六、更换数据库 / 数据备份与搬迁
120
+
121
+ 迁移 SQL 只负责**表结构**,不负责搬运业务数据。
122
+
123
+ ### 1. 先看懂连接串
124
+
125
+ `DATABASE_URL` 的格式固定如下,`@` 用于分隔"账号信息"和"服务器地址":
126
+
127
+ ```text
128
+ postgresql://用户名:密码@主机地址:端口/库名
129
+ ```
130
+
131
+ 本项目开发环境的实际值(见 `apps/server/.env.development`):
132
+
133
+ ```text
134
+ postgresql://postgres:ml@localhost:5432/postgres
135
+ └── 协议 └用户 └密码 └主机 └端口 └库名
136
+ ```
137
+
138
+ 主机地址按部署位置填写:
139
+
140
+ | 数据库位置 | 主机地址填什么 | 示例 |
141
+ | -------------------------------- | -------------------------- | ------------------------------------------------------- |
142
+ | 本机(含本机 Docker 映射的端口) | `localhost` 或 `127.0.0.1` | `postgresql://postgres:ml@localhost:5432/postgres` |
143
+ | 局域网内另一台服务器 | 那台机器的内网 IP | `postgresql://postgres:ml@192.168.1.50:5432/postgres` |
144
+ | 云数据库 / 有域名 | 服务商提供的域名 | `postgresql://postgres:ml@db.example.com:5432/postgres` |
145
+
146
+ ### 2. 仅更换连接地址(目标库是空库)
147
+
148
+ 适用于"换一台数据库服务器,但不需要搬旧数据"的场景:
149
+
150
+ 1. 修改目标环境的 `DATABASE_URL` 与 `DB_HOST`、`DB_PORT`、`DB_DATABASE`、`DB_USERNAME`、`DB_PASSWORD`(本地调试可放到不提交的 `.env.development.local`);
151
+ 2. 确保目标数据库**已被创建**(容器版默认只有 `postgres` 库;换库名需先建库);
152
+ 3. 仅在迁移链通过审阅、隔离验证且没有阻断时,才在目标环境执行 `pnpm db:migrate` 建好全部表结构;当前仓库状态不满足该条件;
153
+ 4. 需要时执行 `pnpm access:init --account <账号>` 初始化种子数据。
154
+
155
+ ### 3. 备份与整体搬迁(表结构 + 业务数据)
156
+
157
+ 使用 PostgreSQL 原生的 `pg_dump` / `pg_restore` 最稳妥。
158
+
159
+ > **敏感备份警告:** `.spaces/05.运行维护/数据库迁移/备份/backup.dump` 是数据库二进制快照,可能包含账号、成员关系和其他业务数据。仓库内只允许保留确认过的本地虚构或已脱敏开发数据;严禁把生产、客户或未经脱敏的备份提交到版本库。导出新备份后,应先核对数据来源和敏感性,再决定是否留存;本指南不授权删除当前快照。
160
+
161
+ > ⚠️ 本项目的 PostgreSQL 跑在 Docker 容器 `vp-postgres` 中,**Windows 宿主机上通常没有安装 `pg_dump`**,直接在 PowerShell 执行会提示"不是内部或外部命令"。
162
+ > 因此统一通过 `docker exec` 在容器内执行,并用 `docker cp` 把备份文件拷进/拷出容器。
163
+ > 以下命令均在**项目根目录**(`docker-compose.yml` 所在目录)执行。
164
+
165
+ **备份(导出)**:
166
+
167
+ ```powershell
168
+ # 1. 在容器内把整个 postgres 库导出为压缩备份(容器内本地连接无需输密码)
169
+ docker exec vp-postgres pg_dump -Fc -U postgres -d postgres -f /var/lib/postgresql/backup.dump
170
+
171
+ # 2. 把备份文件从容器拷到当前目录
172
+ docker cp vp-postgres:/var/lib/postgresql/backup.dump ./backup.dump
173
+ ```
174
+
175
+ 参数说明:`-Fc` 表示 custom 自定义压缩二进制格式,体积小、可选择性恢复,必须配合 `pg_restore` 使用;`-f` 指定输出文件路径。
176
+
177
+ **恢复(导入)**:
178
+
179
+ ```powershell
180
+ cd .spaces/05.运行维护/数据库迁移/备份
181
+ ./restore-dump.ps1
182
+ # 自动化场景使用 ./restore-dump.ps1 -Force 跳过 YES 确认
183
+ ```
184
+
185
+ 脚本先验证本目录的 `backup.dump`,然后从 `template1` 连接并强制断开 `postgres` 库上的会话,删除、重建该库,再导入备份。旧库中备份未包含的表和外键也会被删除。导入失败会返回错误;由于删库和导入无法组成同一事务,此时目标库可能为空,需要修复错误并重新执行脚本。恢复要求 PostgreSQL 管理员权限;运行期间应停止使用目标库的应用。具体目标和验收要求见[数据库备份覆盖恢复需求](需求文档.md)。
186
+
187
+ 建议备份文件名带上日期,避免多次备份互相覆盖,例如 `backup-20260912.dump`。
188
+
189
+ **搬迁到另一台服务器**时:在旧服务器按上面"备份"两步拿到 dump 文件,传送到新服务器后:
190
+
191
+ - 若新服务器也是同样的 Docker 部署,按上面的恢复脚本操作即可;
192
+ - 若新服务器是本机安装的 PostgreSQL 且已安装客户端工具,应先从维护库连接并重建目标库,再导入备份。例如:
193
+
194
+ ```powershell
195
+ dropdb -h 192.168.1.50 -U postgres --maintenance-db=template1 --force --if-exists postgres
196
+ createdb -h 192.168.1.50 -U postgres --maintenance-db=template1 postgres
197
+ pg_restore -h 192.168.1.50 -U postgres -d postgres --no-owner --single-transaction --exit-on-error backup.dump
198
+ ```
199
+
200
+ 搬迁完成后,把应用的环境变量指向新库并启动验证即可,**无需再跑 `db:migrate`**——表结构、数据以及 drizzle 的迁移记录表都已随 dump 一起恢复。
201
+
202
+ > 版本提示:`pg_dump` 的大版本不应低于(最好等于)被导出的 PostgreSQL 版本。用容器内自带的工具天然与服务端版本一致,可避免版本不匹配的警告和兼容问题。
203
+
204
+ ## 七、常见问题排查
205
+
206
+ | 现象 | 可能原因 | 处理 |
207
+ | ------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------- |
208
+ | `DATABASE_URL 未配置` | drizzle-kit 没读到 env 文件 | 确认在 `apps/server` 下执行,且 `.env.development` 存在;检查 `NODE_ENV` |
209
+ | `ECONNREFUSED 127.0.0.1:5432` | PostgreSQL 容器未启动 | 根目录执行 `docker compose up -d postgres` |
210
+ | `database "xxx" does not exist` | 连接串中的库名与实际不符 | 以 `docker-compose.yml` 中的 `POSTGRES_DB` 为准,或手动 `CREATE DATABASE` |
211
+ | `pg_dump 不是内部或外部命令` | 宿主机未安装 PostgreSQL 客户端工具 | 用 `docker exec vp-postgres pg_dump ...` 在容器内执行(见第六节) |
212
+ | `pg_restore` 删除主键时报外键依赖 | 旧库含备份外的表或约束,按对象清理不完整 | 使用本节的覆盖恢复脚本重建目标库,而非直接用 `--clean` 导入旧库 |
213
+ | migrate 报迁移历史不一致 | 历史迁移文件或 meta 被改动 | 恢复被删改的文件;必要时在开发库清理 drizzle 迁移记录表后重新迁移(仅限开发库) |
214
+ | generate 生成了意料之外的 DROP | 快照与 schema 差异过大(如重命名列会被识别成删旧列+加新列) | 放弃生成,改用手写迁移或先保留旧列做数据过渡 |
215
+
216
+ ## 八、涉及的后端知识点
217
+
218
+ - **Schema 迁移(migration)的本质**:把"表结构长什么样"从代码编译成有序、可追溯、可在各环境重放的 SQL 版本文件,解决多人协作与多环境下表结构不一致的问题,作用类似前端的 lock 文件——人人按同一份脚本得到相同结果。
219
+ - **迁移记录表**:`db:migrate` 会在库中维护一张迁移日志表,记录哪些迁移文件已执行,保证每个迁移只执行一次。这就是迁移文件不能随意改名或删除的原因。
220
+ - **代码即结构(schema-as-code)**:Drizzle 的 schema 既是建表依据,也是 TypeScript 类型和查询 API 的来源,改结构 = 改代码,天然可走 Code Review 和版本管理流程。
221
+
222
+ ## 九、变更记录
223
+
224
+ | 日期 | 变更摘要 | 影响范围 | 原因 |
225
+ | ---------- | ---------------------------------------------------------------------------------------------------------- | ---------------------------------- | --- |
226
+ | 2026-09-18 | 明确 `0003` 企业层级残留和 `0004` 未确认邀请实现共同阻断当前完整迁移链,现有命令降级为解除阻断后的标准流程 | 新环境、现有环境、部署与数据库搬迁 | 完整迁移链仍有设计偏差 |
227
+ | 2026-09-30 | 恢复方式改为验证备份后重建整个目标库,删除旧库额外对象 | 备份恢复与搬迁 | `--clean` 无法删除被旧库额外外键依赖的主键 |
@@ -0,0 +1,31 @@
1
+ # 数据库备份覆盖恢复需求
2
+
3
+ > 状态:当前有效
4
+
5
+ ## 目标与范围
6
+
7
+ 在本地 Docker 容器 `vp-postgres` 中,用备份目录的 `backup.dump` 完整替换 `postgres` 数据库。目标库原有表、约束和业务数据均可丢弃;备份中没有的对象也必须消失。仅作用于该容器和该数据库,不修改其他数据库或备份文件。
8
+
9
+ ## 规则与流程
10
+
11
+ - 恢复前检查备份存在、容器运行,并验证转储文件可由 `pg_restore` 读取;未通过时不得删除目标库。
12
+ - 默认要求操作人输入 `YES`;显式传入 `-Force` 时跳过交互确认。两种方式执行相同的完整覆盖流程。
13
+ - 从维护数据库连接,强制断开目标库连接后删除目标库,再创建空的同名库并导入备份。恢复失败时必须返回错误,不能输出成功提示。
14
+ - 数据约束:旧库全部丢弃;备份内容是恢复后的唯一来源。删库之后若创建或导入失败,目标库可能暂时不存在或为空,操作人应修复错误并重新执行恢复。
15
+ - 权限边界:只有具备目标 Docker 容器和数据库管理员权限的操作者可以运行此脚本。
16
+
17
+ ## 验收标准
18
+
19
+ 1. 旧库含备份以外的外键或表时,恢复仍能成功,旧对象不再存在。
20
+ 2. 无效备份或容器不可用时,在删库之前失败。
21
+ 3. 默认确认与 `-Force` 两种入口均恢复为备份中的结构和数据,并在失败时返回非零退出码。
22
+
23
+ ## 待确认事项
24
+
25
+ 无。
26
+
27
+ ## 变更记录
28
+
29
+ | 日期 | 变更摘要 | 影响范围 | 决策原因 |
30
+ | --- | --- | --- | --- |
31
+ | 2026-09-30 | 明确旧库可丢弃,恢复改为重建整个目标库 | 备份恢复脚本与操作指南 | 旧库额外外键阻止 `pg_restore --clean` 删除主键 |
@@ -0,0 +1,93 @@
1
+ # 认证与会话技术契约
2
+
3
+ ## 1. 状态和范围
4
+
5
+ - 状态:当前有效契约。
6
+ - 本契约描述当前 Redis Session 实现,不定义尚未实施的 Refresh Token 接口。
7
+ - 成功响应和失败响应的通用包装见 [API 与错误技术契约](../../07.API与错误/技术契约.md)。
8
+
9
+ ## 2. 共享类型
10
+
11
+ ```ts
12
+ type SessionTerminalType = 'web' | 'desktop' | 'mobile'
13
+
14
+ interface RegisterRequest {
15
+ name: string
16
+ account: string
17
+ password: string
18
+ }
19
+
20
+ interface LoginRequest {
21
+ account: string
22
+ password: string
23
+ }
24
+
25
+ interface LoginResult {
26
+ accessToken: string
27
+ tokenType: 'Bearer'
28
+ idleExpiresIn: number
29
+ absoluteExpiresAt: string
30
+ }
31
+ ```
32
+
33
+ `accessToken` 是随机不透明令牌,不是 JWT。客户端通过 `Authorization: Bearer <token>` 访问受保护接口;服务端将令牌摘要映射到 Redis 会话。
34
+
35
+ ## 3. 接口
36
+
37
+ | 方法与路径 | 请求 | 成功响应 | 说明 |
38
+ | --- | --- | --- | --- |
39
+ | `POST /auth/register` | `RegisterRequest` | `{ id, name, account }` | 创建全局账号,不创建成员关系 |
40
+ | `POST /auth/login` | `LoginRequest` | `LoginResult` | 识别终端并创建或替换对应槽位会话 |
41
+ | `POST /auth/logout` | Bearer Token 可选 | `{ loggedOut: true }` | 幂等退出;无有效格式令牌也返回成功 |
42
+ | `GET /auth/me` | Bearer Token | `{ id, name, account, terminal }` | 返回当前启用用户及终端 |
43
+
44
+ 当前没有 `/auth/refresh`,也没有 `refreshToken` 字段。
45
+
46
+ 当前基线仍没有本人改密或平台管理员重置他人密码的接口。[修改密码需求](../修改密码/需求文档.md)处于实施中,其新增路径、共享类型、权限和错误码已在[修改密码技术契约](../修改密码/技术契约.md)明确;实现与验收完成前不属于上表的现行接口。
47
+
48
+ ## 4. Redis 会话约束
49
+
50
+ - 会话键前缀:`auth:v1:session:`;槽位键前缀:`auth:v1:slot:`。
51
+ - 槽位唯一键由 `userId + terminal` 组成。
52
+ - Redis 保存 Token 摘要、用户 ID、终端、有效期和受限长度的登录来源,不保存明文 Token。
53
+ - 创建/替换、校验/续期、退出和全端撤销使用 Lua 原子执行。
54
+ - Redis 不可用或脚本协议异常统一转换为认证服务不可用错误,不能退化为绕过认证。
55
+
56
+ ## 5. 并发和撤销
57
+
58
+ - 登录在密码验证后锁定目标用户并再次确认账号有效,再创建会话。
59
+ - 同终端并发登录以最后成功写入的槽位为准,旧 Token 因槽位不再匹配而失效。
60
+ - 停用账号时撤销全部终端会话;撤销失败则停用事务不得声称成功。
61
+ - 每次受保护请求都必须确认会话存在且用户仍处于 active 状态。
62
+ - 待实施的本人改密和管理员重置成功后均撤销目标账号全部终端会话;撤销失败则密码事务回滚。登录须在用户行共享锁内复核最新密码摘要,防止旧密码并发登录在撤销后重新建立会话。详见[修改密码技术契约](../修改密码/技术契约.md)。
63
+
64
+ ## 6. Cookie 契约
65
+
66
+ Web 端当前写入 `token` Cookie:
67
+
68
+ ```text
69
+ Path=/; SameSite=Lax; Secure=<当前页面是否为 HTTPS>
70
+ ```
71
+
72
+ 删除时必须复用写入时的 Path、Domain、SameSite 和 Secure 语义。后续修改 Cookie 名称或前缀时,所有写入、读取、删除和请求拦截逻辑必须同批变更。
73
+
74
+ ## 7. Refresh Token 迁移门槛
75
+
76
+ 实施 Access Token + Refresh Token 前,必须先补齐并确认:
77
+
78
+ - Token 格式、签名/摘要策略和存储位置;
79
+ - Access/Refresh 有效期和轮换、复用检测、会话族撤销;
80
+ - 刷新接口的并发幂等和错误码;
81
+ - Cookie、CSRF、CORS 和多端策略;
82
+ - 当前 Bearer Session 到新机制的兼容期和回滚路径;
83
+ - 普通接口撤权延迟上限及高风险接口的实时 Auth State 清单。
84
+
85
+ 上述契约未确认前,不新增半成品 Refresh Token 字段或端点。
86
+
87
+ ## 8. 变更记录
88
+
89
+ | 日期 | 摘要 | 影响范围 | 原因 |
90
+ | --- | --- | --- | --- |
91
+ | 2026-10-08 | 关联修改密码实施契约和全端撤销、并发登录约束,保持现行接口与待实施接口分界 | 认证、会话与登录 | 支持本期密码维护开发且不提前宣称接口可用 |
92
+ | 2026-09-30 | 明确本人改密与管理员重置尚无现行接口,并链接待实施需求 | 认证接口、共享类型与会话 | 区分已确认业务需求和当前可用契约 |
93
+ | 2026-09-17 | 固化当前 Redis Session 契约,并隔离尚未确认的 Refresh Token 迁移目标 | Server、Web、shared | 防止历史设计讨论被误认为现有接口 |
@@ -0,0 +1,87 @@
1
+ # 认证与会话需求文档
2
+
3
+ ## 1. 文档状态
4
+
5
+ - 状态:当前 Redis Session 基线有效;修改密码后的会话撤销规则实施中;令牌演进部分待单独确认实施契约。
6
+ - 整理日期:2026-09-17。
7
+ - 当前实现依据:`apps/server/src/modules/auth/`、`packages/shared/src/types/auth.ts`。
8
+ - 技术边界见 [技术契约](./技术契约.md)。
9
+
10
+ ## 2. 目标
11
+
12
+ 1. 用户通过全局唯一账号和密码完成注册、登录、获取当前身份及退出。
13
+ 2. 同一用户在同一种终端只保留一个有效会话;新登录替换该终端的旧会话。
14
+ 3. Web、桌面端和移动端可以分别保持会话;iOS 与 Android 统一归类为 `mobile`,不引入厂商专用 User-Agent 标记。
15
+ 4. 账号停用、会话替换和主动退出能够撤销对应登录状态。
16
+ 5. 会话数据和日志不保存明文密码或明文令牌,公开错误不泄露账号是否存在等敏感事实。
17
+ 6. 为后续 Access Token + Refresh Token 轮换保留明确迁移边界,但在契约确认前不把目标方案写成当前实现。
18
+
19
+ ## 3. 当前有效业务规则
20
+
21
+ ### 3.1 账号与注册
22
+
23
+ - `account` 全局唯一;姓名不唯一,用户关系使用稳定 `userId`。
24
+ - 公开注册只创建全局账号,不自动加入企业、项目或授予角色。
25
+ - 企业“直接注册成员”是企业成员接入流程:创建新全局账号并建立企业成员关系;它不等同于公开注册,也不能覆盖已有账号。
26
+
27
+ ### 3.2 终端分类
28
+
29
+ | 终端 | 识别规则 | 会话槽位 |
30
+ | --- | --- | --- |
31
+ | `desktop` | User-Agent 含 Electron | 用户 + desktop |
32
+ | `mobile` | Android、iPhone、iPad 或 iPod | 用户 + mobile |
33
+ | `web` | 其他浏览器请求 | 用户 + web |
34
+
35
+ 同一槽位的新登录替换旧会话;不同槽位互不替换。
36
+
37
+ ### 3.3 会话有效性
38
+
39
+ - 当前使用 Redis 保存服务端会话,客户端持有随机 Bearer Token;Redis 只使用令牌摘要定位会话。
40
+ - 会话同时受闲置有效期和不可延长的绝对有效期约束。
41
+ - 有效请求可以刷新闲置有效期,但不能突破绝对有效期。
42
+ - 账号停用时撤销该用户全部终端会话;重新启用后必须重新登录。
43
+ - 普通受保护请求至少校验会话和当前用户状态。权限敏感接口还必须读取当前作用域、成员和权限状态,不能只相信登录时快照。
44
+
45
+ ### 3.4 Cookie 使用边界
46
+
47
+ - 当前 Web 端使用名为 `token` 的 Cookie 保存 Bearer Token,默认 `Path=/`、`SameSite=Lax`,HTTPS 下启用 `Secure`。
48
+ - 删除 Cookie 时必须使用与写入相同的名称、Path 和 Domain,否则浏览器中的旧值不会被真正删除。
49
+ - Cookie 名称若后续增加环境或应用前缀,写入、读取和删除必须共同使用同一前缀规则。
50
+ - 当前 Cookie 可由前端 JavaScript 读取;若迁移到 HttpOnly Refresh Token,必须单独设计 CSRF、跨域和兼容策略。
51
+
52
+ ## 4. 后续令牌演进需求
53
+
54
+ 历史讨论提出将会话演进为短期 Access Token + 可轮换 Refresh Token。该目标需要保留,但当前代码没有 Refresh Token,也没有刷新端点,不能把下面内容当作已实施事实:
55
+
56
+ 1. Refresh Token 每次使用后轮换,旧 Token 失效;检测到复用时撤销对应会话族。
57
+ 2. 普通接口可以在明确的短时间窗口内接受撤权传播延迟;高风险接口必须读取共享 Auth State 做实时状态和撤销检查。
58
+ 3. 同一用户、同一终端类型仍只保留一个活动会话族。
59
+ 4. Access Token、Refresh Token 的载体、有效期、Cookie 属性、刷新接口、并发刷新、跨端退出和迁移兼容期必须先形成完整技术契约。
60
+
61
+ ## 5. 验收标准
62
+
63
+ 1. 同一用户在同一终端再次登录后,旧 Token 无法继续使用。
64
+ 2. Web、desktop、mobile 会话可以分别存在,iOS 与 Android 归入同一 mobile 槽位。
65
+ 3. 闲置超时、绝对超时、退出和账号停用均使相关会话失效。
66
+ 4. 登录、退出、会话校验和服务异常不会在响应或日志中暴露明文密码、Token、Cookie 或连接串。
67
+ 5. Cookie 删除使用与写入一致的 Path/Domain;退出后前端不再携带旧 Token。
68
+ 6. 在 Refresh Token 方案正式实施前,接口和文档均不得声称支持刷新或轮换。
69
+
70
+ ## 6. 待确认事项
71
+
72
+ - 是否以及何时从 Redis opaque Session 迁移到 Access Token + Refresh Token。
73
+ - Access Token 是否使用 JWT;若使用,签发者、受众、密钥轮换和撤销窗口如何定义。
74
+ - Refresh Token 使用 HttpOnly Cookie 还是其他受控载体,以及 CSRF 防护方案。
75
+ - 哪些接口属于必须实时读取共享 Auth State 的高风险接口。
76
+
77
+ ## 7. 实施中:修改密码后的会话规则
78
+
79
+ [修改密码需求文档](../修改密码/需求文档.md)已确认本人改密及平台管理员重置他人密码的业务规则,实施契约见[修改密码技术契约](../修改密码/技术契约.md)。本人改密成功后撤销该用户全部终端会话,当前端返回登录页;管理员重置成功后撤销目标账号全部终端会话,操作者会话不受影响。会话撤销失败不得把密码操作报告为成功,密码保持原值。实施时还须防止旧密码并发登录在撤销后创建新会话。代码和验收完成前,上述能力不是当前有效基线。
80
+
81
+ ## 8. 变更记录
82
+
83
+ | 日期 | 摘要 | 影响范围 | 原因 |
84
+ | --- | --- | --- | --- |
85
+ | 2026-10-08 | 关联修改密码实施契约,补充撤销失败回滚与并发登录约束 | 认证、会话与密码维护 | 使待实施会话规则与设计和接口契约一致 |
86
+ | 2026-09-30 | 标明本人改密与管理员重置后的全端会话撤销为待实施需求 | 认证、会话与账号密码维护 | 与新增修改密码需求同步,避免将未实现的规则误写成当前基线 |
87
+ | 2026-09-17 | 从本机 Codex 历史和当前实现整理认证、终端会话及令牌演进边界 | 认证与会话 | 避免把当前 Redis Session 与历史讨论的 Refresh Token 目标混为一套现行契约 |
@@ -0,0 +1,55 @@
1
+ # 修改密码 PRD
2
+
3
+ ## 1. 状态与依据
4
+
5
+ - 状态:待实施;页面与交互依据已确认需求编排,实际验收以实现和测试记录为准。
6
+ - 需求来源:[修改密码需求文档](./需求文档.md)。现行会话规则见[会话管理需求文档](../会话管理/需求文档.md)。
7
+ - 本文只描述用户可见流程;服务端权限、接口、错误和一致性以[技术契约](./技术契约.md)为准。
8
+
9
+ ## 2. 用户故事与入口
10
+
11
+ | 用户 | 诉求 | 入口 |
12
+ | --- | --- | --- |
13
+ | 已登录的全局账号用户 | 验证旧密码后自行修改密码 | 工作空间选择页的账号操作;进入任一工作空间后的全局账号操作 |
14
+ | 没有工作空间的已登录用户 | 仍能自行改密 | `/workspaces` 工作空间选择页的账号操作,不依赖工作空间权限 |
15
+ | 平台管理员 | 为其他全局账号直接设定新密码 | `/platform/accounts` 目标账号的行操作;本人行不提供重置入口 |
16
+
17
+ 企业或项目管理员不会因其作用域身份获得平台重置入口。页面条件只是辅助;服务端仍须按[技术契约](./技术契约.md)鉴权。
18
+
19
+ ## 3. 页面与交互流程
20
+
21
+ ### 3.1 本人修改密码
22
+
23
+ 1. 用户从账号操作打开修改密码表单。表单提供旧密码、新密码、确认密码;三个输入框均不预填,也不在返回页面时保留输入。
24
+ 2. 前端检查三项必填、两次新密码一致、新密码为 8–16 位以及新旧密码不同。提交期间阻止重复提交;服务端再次执行完整校验。
25
+ 3. 成功时清理本地登录凭据和进行中的工作空间请求,跳转 `/login`;提示用户使用新密码重新登录。发起改密的当前会话和其他终端旧会话均应失效。
26
+ 4. 失败时停留在表单,显示可公开的字段或业务错误并允许修正重试;不得显示成功提示,不清理仍有效的本地会话。密码字段不写入 URL、持久存储或客户端日志。
27
+
28
+ ### 3.2 平台管理员重置
29
+
30
+ 1. 平台管理员在全局账号列表选择非本人账号,打开重置密码表单。显示目标账号的公开标识供核对,输入新密码与确认密码,不要求旧密码。
31
+ 2. 前端检查两次输入一致、新密码为 8–16 位;提交期间阻止重复提交。服务端独立校验平台管理员身份、目标存在且不是操作者本人。
32
+ 3. 成功时关闭表单并提示通过现有线下渠道告知用户;不展示、不复制、不发送或回显新密码。管理员当前登录保持有效,目标账号原有各终端会话失效。
33
+ 4. 失败时保留可修正的界面并显示公开错误,不提示成功。目标账号状态、角色与成员关系均不因重置变化。
34
+
35
+ ## 4. 验收映射
36
+
37
+ | 场景 | 预期结果 | 需求对应 |
38
+ | --- | --- | --- |
39
+ | 无工作空间的已登录用户改密 | 可进入表单;成功后回登录页,旧密码与旧会话失效,新密码可登录 | 6.1 |
40
+ | 旧密码错误、两次输入不一致、长度非法或新旧相同 | 无密码变更和成功提示;可修正重试 | 6.2 |
41
+ | 平台管理员重置其他账号 | 目标全部旧会话失效;操作者会话有效;目标状态及关系不变;下次登录不强制再改密 | 6.3 |
42
+ | 平台管理员重置自己、非平台管理员操作、目标不存在或撤销失败 | 服务端拒绝或报告失败,密码保持原值,不显示成功 | 6.4 |
43
+ | 凭据和操作记录 | 响应、日志、审计、截图无密码明文或摘要;操作结果可追溯 | 6.5 |
44
+
45
+ 表中“需求对应”指[修改密码需求文档](./需求文档.md)第 6 节;实际执行证据应归档到本功能的测试报告,不以本文代替测试结果。
46
+
47
+ ## 5. 范围外事项
48
+
49
+ 未登录忘记密码找回、自动发送密码、自动生成临时密码和首次登录强制改密均不在本期范围;详见[需求文档](./需求文档.md)。
50
+
51
+ ## 6. 变更记录
52
+
53
+ | 日期 | 摘要 | 影响范围 | 原因 |
54
+ | --- | --- | --- | --- |
55
+ | 2026-10-08 | 增补本人改密和平台重置的入口、页面流程与验收映射 | Web 账号操作、工作空间选择页、平台账号列表 | 为已确认需求提供实施和验收所需的交互依据 |