create-bubbles 0.1.25 → 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 (622) hide show
  1. package/dist/index.js +3 -9
  2. package/package.json +1 -1
  3. package/template-nextjs-vinext-eslint/Dockerfile +4 -4
  4. package/template-nextjs-vinext-eslint/README.md +6 -2
  5. package/template-nextjs-vinext-eslint/docker-compose.yaml +4 -4
  6. package/template-nextjs-vinext-eslint/eslint.config.js +2 -0
  7. package/template-nextjs-vinext-eslint/package.json +28 -26
  8. package/template-nextjs-vinext-eslint/pnpm-workspace.yaml +13 -1
  9. package/template-nextjs-vinext-eslint/src/utils/request/core/index.ts +63 -45
  10. package/template-nextjs-vinext-eslint/src/utils/request/core/utils.ts +12 -6
  11. package/template-nextjs-vinext-eslint/vite.config.ts +1 -1
  12. package/template-react-rsbuild-biome/.agents/rules/SVG/344/275/277/347/224/250.md +8 -0
  13. package/template-react-rsbuild-biome/AGENTS.md +11 -0
  14. package/template-react-rsbuild-biome/index.html +2 -2
  15. package/template-react-rsbuild-biome/package.json +25 -24
  16. package/template-react-rsbuild-biome/pnpm-workspace.yaml +5 -0
  17. package/template-react-rsbuild-biome/rsbuild.config.ts +1 -1
  18. package/template-react-rsbuild-biome/src/assets/icon/logo.svg +1 -1
  19. package/template-react-rsbuild-biome/src/assets/svg/draft.svg +4 -0
  20. package/template-react-rsbuild-biome/src/components/Icon/svg-icon/README.md +37 -0
  21. package/template-react-rsbuild-biome/src/components/Icon/svg-icon/SvgIcon.tsx +27 -0
  22. package/template-react-rsbuild-biome/src/env.d.ts +7 -0
  23. package/template-react-rsbuild-biome/src/utils/request/index.ts +3 -4
  24. package/template-react-rsbuild-biome/tsconfig.json +1 -2
  25. package/template-taro-react-oxc/.oxlintrc.json +0 -1
  26. package/template-taro-react-oxc/package.json +53 -52
  27. package/template-taro-react-oxc/pnpm-workspace.yaml +46 -0
  28. package/template-taro-vue-eslint/package.json +56 -56
  29. package/template-vp-monorepo-react-hono/apps/web/.agents/rules/SVG/344/275/277/347/224/250.md +8 -0
  30. package/template-vp-monorepo-react-hono/apps/web/AGENTS.md +11 -0
  31. package/template-vp-monorepo-react-hono/apps/web/package.json +1 -0
  32. package/template-vp-monorepo-react-hono/apps/web/src/assets/svg/draft.svg +4 -0
  33. package/template-vp-monorepo-react-hono/apps/web/src/components/Icon/svg-icon/README.md +37 -0
  34. package/template-vp-monorepo-react-hono/apps/web/src/components/Icon/svg-icon/SvgIcon.tsx +27 -0
  35. package/template-vp-monorepo-react-hono/apps/web/tsconfig.json +1 -1
  36. package/template-vp-monorepo-react-hono/apps/web/vite.config.ts +2 -0
  37. package/template-vp-monorepo-react-hono/pnpm-workspace.yaml +1 -0
  38. package/template-vp-monorepo-react-nestjs/.agents/rules//344/273/243/347/240/201/350/256/276/350/256/241.md +4 -0
  39. package/template-vp-monorepo-react-nestjs/.agents/rules//345/205/261/344/272/253/344/273/243/347/240/201.md +4 -0
  40. 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
  41. package/template-vp-monorepo-react-nestjs/.codegraph/.gitignore +5 -0
  42. 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
  43. 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
  44. 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
  45. 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
  46. 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
  47. 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
  48. 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
  49. 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
  50. 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
  51. 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
  52. 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
  53. 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
  54. 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
  55. 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
  56. 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
  57. 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
  58. 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
  59. 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
  60. 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
  61. 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
  62. 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
  63. 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
  64. 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
  65. 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
  66. 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
  67. 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
  68. 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
  69. 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
  70. 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
  71. package/template-vp-monorepo-react-nestjs/.spaces/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 +851 -0
  72. package/template-vp-monorepo-react-nestjs/.spaces/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 +1470 -0
  73. package/template-vp-monorepo-react-nestjs/.spaces/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 +4507 -0
  74. package/template-vp-monorepo-react-nestjs/.spaces/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 +1897 -0
  75. 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
  76. 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
  77. 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
  78. 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
  79. 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
  80. 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
  81. 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
  82. 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
  83. 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
  84. 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
  85. 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
  86. 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
  87. 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
  88. 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
  89. 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
  90. 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
  91. 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
  92. 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
  93. 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
  94. 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
  95. 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
  96. 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
  97. 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
  98. 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
  99. 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
  100. 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
  101. 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
  102. 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
  103. 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
  104. 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
  105. 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
  106. 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
  107. 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
  108. 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
  109. 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
  110. 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
  111. 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
  112. 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
  113. 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
  114. 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
  115. 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
  116. 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
  117. 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
  118. package/template-vp-monorepo-react-nestjs/.spaces/README.md +85 -0
  119. package/template-vp-monorepo-react-nestjs/.spaces//346/226/207/346/241/243/350/247/204/350/214/203.md +97 -0
  120. package/template-vp-monorepo-react-nestjs/AGENTS.md +18 -10
  121. package/template-vp-monorepo-react-nestjs/README.md +3 -27
  122. package/template-vp-monorepo-react-nestjs/apps/server/.agents/rules/error-handling.md +84 -0
  123. package/template-vp-monorepo-react-nestjs/apps/server/.env.development +60 -0
  124. package/template-vp-monorepo-react-nestjs/apps/server/.env.production +16 -0
  125. package/template-vp-monorepo-react-nestjs/apps/server/AGENTS.md +9 -0
  126. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/0000_military_colonel_america.sql +11 -0
  127. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/0001_loud_siren.sql +27 -0
  128. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/0002_enterprise_access.sql +182 -0
  129. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/0003_cute_killmonger.sql +357 -0
  130. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/0004_company-member-invitations.sql +25 -0
  131. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/0005_menu_svg_icons.sql +54 -0
  132. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/meta/0000_snapshot.json +97 -0
  133. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/meta/0001_snapshot.json +354 -0
  134. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/meta/0002_snapshot.json +1801 -0
  135. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/meta/0003_snapshot.json +3511 -0
  136. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/meta/0004_snapshot.json +3713 -0
  137. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/meta/_journal.json +48 -0
  138. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/rollback/0003_organization_backfill.sql +32 -0
  139. package/template-vp-monorepo-react-nestjs/apps/server/package.json +9 -3
  140. package/template-vp-monorepo-react-nestjs/apps/server/src/access-init.ts +45 -0
  141. package/template-vp-monorepo-react-nestjs/apps/server/src/app.controller.ts +3 -0
  142. package/template-vp-monorepo-react-nestjs/apps/server/src/app.module.ts +41 -6
  143. package/template-vp-monorepo-react-nestjs/apps/server/src/app.service.ts +3 -0
  144. package/template-vp-monorepo-react-nestjs/apps/server/src/common/adapters/fastify.adapter.ts +17 -0
  145. package/template-vp-monorepo-react-nestjs/apps/server/src/common/constants/session.constants.ts +9 -0
  146. package/template-vp-monorepo-react-nestjs/apps/server/src/common/decorators/access-policy.decorator.ts +18 -0
  147. package/template-vp-monorepo-react-nestjs/apps/server/src/common/decorators/current-auth.decorator.ts +4 -0
  148. package/template-vp-monorepo-react-nestjs/apps/server/src/common/decorators/public.decorator.ts +3 -0
  149. package/template-vp-monorepo-react-nestjs/apps/server/src/common/exceptions/app.exception.ts +9 -0
  150. package/template-vp-monorepo-react-nestjs/apps/server/src/common/filters/global-exception.filter.ts +38 -5
  151. package/template-vp-monorepo-react-nestjs/apps/server/src/common/security/password-security-event.ts +98 -0
  152. package/template-vp-monorepo-react-nestjs/apps/server/src/config/app.config.ts +3 -0
  153. package/template-vp-monorepo-react-nestjs/apps/server/src/config/database.config.ts +3 -0
  154. package/template-vp-monorepo-react-nestjs/apps/server/src/config/index.ts +2 -0
  155. package/template-vp-monorepo-react-nestjs/apps/server/src/config/llm.config.ts +3 -0
  156. package/template-vp-monorepo-react-nestjs/apps/server/src/config/queue.config.ts +119 -0
  157. package/template-vp-monorepo-react-nestjs/apps/server/src/config/redis.config.ts +3 -0
  158. package/template-vp-monorepo-react-nestjs/apps/server/src/config/session.config.ts +7 -0
  159. package/template-vp-monorepo-react-nestjs/apps/server/src/config/storage.config.ts +42 -0
  160. package/template-vp-monorepo-react-nestjs/apps/server/src/database/access.schema.ts +394 -0
  161. package/template-vp-monorepo-react-nestjs/apps/server/src/database/db.module.ts +3 -0
  162. package/template-vp-monorepo-react-nestjs/apps/server/src/database/organization.schema.ts +453 -0
  163. package/template-vp-monorepo-react-nestjs/apps/server/src/database/schema.ts +63 -1
  164. package/template-vp-monorepo-react-nestjs/apps/server/src/main.ts +5 -0
  165. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access-http.ts +29 -0
  166. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access.errors.ts +130 -0
  167. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access.guard.ts +63 -0
  168. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access.module.ts +27 -0
  169. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access.service.ts +441 -0
  170. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access.store.ts +68 -0
  171. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access.validation.ts +44 -0
  172. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/maintenance/permissions-cleanup.controller.ts +27 -0
  173. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/maintenance/permissions-cleanup.service.ts +260 -0
  174. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/maintenance/permissions-cleanup.validation.ts +7 -0
  175. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/roles/roles.controller.ts +80 -0
  176. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/roles/roles.service.ts +249 -0
  177. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/roles/roles.validation.ts +24 -0
  178. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/seed/access-seed.service.ts +183 -0
  179. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/workspaces/workspaces.controller.ts +28 -0
  180. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/workspaces/workspaces.service.ts +94 -0
  181. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/workspaces/workspaces.validation.ts +5 -0
  182. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/audit/audit.controller.ts +26 -0
  183. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/audit/audit.module.ts +11 -0
  184. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/audit/audit.service.ts +74 -0
  185. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/audit/audit.validation.ts +11 -0
  186. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.controller.ts +25 -0
  187. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.errors.ts +10 -0
  188. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.module.ts +1 -1
  189. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.repository.ts +60 -0
  190. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.service.ts +69 -13
  191. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/dto/auth-repsponse.dto.ts +2 -2
  192. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/dto/register.dto.ts +1 -1
  193. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/guards/session-auth.guard.ts +8 -0
  194. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/password/change-password.dto.ts +17 -0
  195. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/password.service.ts +6 -0
  196. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/session/session-store.service.ts +46 -0
  197. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/session/session-token.service.ts +12 -0
  198. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/session/session.script.ts +7 -1
  199. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/companies/companies.controller.ts +105 -0
  200. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/companies/companies.module.ts +12 -0
  201. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/companies/companies.service.ts +523 -0
  202. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/accounts/accounts.controller.ts +72 -0
  203. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/accounts/accounts.service.ts +154 -0
  204. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/accounts/accounts.validation.ts +8 -0
  205. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/accounts/password-reset/password-reset.service.ts +81 -0
  206. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/accounts/password-reset/reset-password.validation.ts +13 -0
  207. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/administrators/administrators.service.ts +116 -0
  208. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/administrators/administrators.validation.ts +1 -0
  209. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/invitations/company-member-invitations.controller.ts +69 -0
  210. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/invitations/member-invitation-acceptance.controller.ts +23 -0
  211. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/invitations/member-invitations.service.ts +344 -0
  212. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/invitations/member-invitations.validation.ts +23 -0
  213. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/members.controller.ts +88 -0
  214. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/members.module.ts +31 -0
  215. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/members.service.ts +573 -0
  216. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/members.validation.ts +19 -0
  217. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/menus/menus.controller.ts +56 -0
  218. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/menus/menus.module.ts +11 -0
  219. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/menus/menus.service.ts +230 -0
  220. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/menus/menus.validation.ts +30 -0
  221. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/candidates/global-account/global-account-candidates.controller.ts +35 -0
  222. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/candidates/global-account/global-account-candidates.service.ts +109 -0
  223. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/candidates/member-candidates.controller.ts +60 -0
  224. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/candidates/member-candidates.service.ts +939 -0
  225. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/initialization/project-organization-initialization.service.ts +189 -0
  226. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/organization.module.ts +34 -0
  227. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/organization.store.ts +150 -0
  228. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/organization.validation.ts +23 -0
  229. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/positions/positions.controller.ts +160 -0
  230. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/positions/positions.service.ts +636 -0
  231. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/templates/organization-templates.controller.ts +77 -0
  232. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/templates/organization-templates.service.ts +501 -0
  233. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/templates/organization-templates.store.ts +163 -0
  234. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/units/organization-units.controller.ts +187 -0
  235. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/units/organization-units.service.ts +947 -0
  236. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/projects/projects.controller.ts +94 -0
  237. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/projects/projects.module.ts +13 -0
  238. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/projects/projects.service.ts +369 -0
  239. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/queue-worker.bootstrap.ts +27 -0
  240. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.constants.ts +24 -0
  241. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.contracts.ts +39 -0
  242. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.module.ts +61 -0
  243. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.processor.ts +75 -0
  244. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.service.ts +67 -0
  245. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/db/db.controller.ts +9 -0
  246. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/db/db.service.ts +9 -0
  247. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/error-catelog.spec.ts +34 -0
  248. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/redis/redis.controller.ts +9 -0
  249. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/redis/redis.service.ts +18 -0
  250. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/dto/initiate-mutipart-upload.dto.ts +26 -0
  251. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/dto/upload-params.dto.ts +15 -0
  252. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/storage/exact-size.transform.ts +77 -0
  253. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/storage/minio-storage.adapter.ts +276 -0
  254. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/storage/storage.port.ts +82 -0
  255. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.constants.ts +32 -0
  256. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.controller.ts +134 -0
  257. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.errors.ts +80 -0
  258. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.module.ts +20 -0
  259. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.reponsitory.ts +193 -0
  260. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.service.ts +774 -0
  261. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/utils/object-key.ts +14 -0
  262. package/template-vp-monorepo-react-nestjs/apps/server/src/utils/server-address.ts +6 -0
  263. package/template-vp-monorepo-react-nestjs/apps/server/test/access/access-policy.spec.ts +95 -0
  264. package/template-vp-monorepo-react-nestjs/apps/server/test/access/access.integration.spec.ts +2250 -0
  265. package/template-vp-monorepo-react-nestjs/apps/server/test/access/member-onboarding.validation.spec.ts +78 -0
  266. package/template-vp-monorepo-react-nestjs/apps/server/test/auth/password-operations.spec.ts +433 -0
  267. package/template-vp-monorepo-react-nestjs/apps/server/test/auth/password.integration.spec.ts +300 -0
  268. package/template-vp-monorepo-react-nestjs/apps/server/test/error-catalog.spec.ts +6 -1
  269. package/template-vp-monorepo-react-nestjs/apps/server/test/menus.validation.spec.ts +28 -0
  270. package/template-vp-monorepo-react-nestjs/apps/server/test/organization/organization-domain.spec.ts +260 -0
  271. package/template-vp-monorepo-react-nestjs/apps/server/test/task-queue.integration.spec.ts +120 -0
  272. package/template-vp-monorepo-react-nestjs/apps/server/test/task-queue.processor.spec.ts +63 -0
  273. package/template-vp-monorepo-react-nestjs/apps/server/test/task-queue.service.spec.ts +106 -0
  274. package/template-vp-monorepo-react-nestjs/apps/server/tsconfig.scripts.json +5 -0
  275. package/template-vp-monorepo-react-nestjs/apps/web/.agents/rules/SVG/344/275/277/347/224/250.md +8 -0
  276. package/template-vp-monorepo-react-nestjs/apps/web/.agents/rules//345/274/271/347/252/227/347/273/204/344/273/266.md +4 -0
  277. package/template-vp-monorepo-react-nestjs/apps/web/.agents/rules//346/226/207/344/273/266/346/213/206/345/210/206.md +4 -0
  278. package/template-vp-monorepo-react-nestjs/apps/web/.agents/rules//347/273/204/344/273/266/345/221/275/345/220/215.md +3 -0
  279. 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
  280. 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
  281. package/template-vp-monorepo-react-nestjs/apps/web/.agents/rules//350/241/250/346/240/274/351/241/265/351/235/242.md +11 -0
  282. package/template-vp-monorepo-react-nestjs/apps/web/.agents/rules//351/241/265/351/235/242/346/216/245/345/217/243.md +3 -0
  283. package/template-vp-monorepo-react-nestjs/apps/web/.env.dev +1 -1
  284. package/template-vp-monorepo-react-nestjs/apps/web/AGENTS.md +25 -0
  285. package/template-vp-monorepo-react-nestjs/apps/web/README.MD +181 -0
  286. package/template-vp-monorepo-react-nestjs/apps/web/index.html +3 -2
  287. package/template-vp-monorepo-react-nestjs/apps/web/package.json +7 -1
  288. package/template-vp-monorepo-react-nestjs/apps/web/public/favicon.svg +9 -1
  289. package/template-vp-monorepo-react-nestjs/apps/web/src/App.module.css +5 -0
  290. package/template-vp-monorepo-react-nestjs/apps/web/src/App.tsx +30 -12
  291. package/template-vp-monorepo-react-nestjs/apps/web/src/api/auth.ts +22 -0
  292. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/accounts.svg +4 -0
  293. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/audit-log.svg +4 -0
  294. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/companies.svg +5 -0
  295. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/dashboard.svg +6 -0
  296. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/draft.svg +4 -0
  297. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/home.svg +4 -0
  298. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/members.svg +4 -0
  299. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/menu-item.svg +4 -0
  300. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/menus.svg +6 -0
  301. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/organization-template.svg +4 -0
  302. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/organization.svg +6 -0
  303. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/positions.svg +4 -0
  304. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/profile.svg +5 -0
  305. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/projects.svg +4 -0
  306. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/roles.svg +4 -0
  307. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Brand/Brand.module.css +125 -0
  308. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Brand/Brand.tsx +56 -0
  309. package/template-vp-monorepo-react-nestjs/apps/web/src/components/DraftProTable/DraftProTable.module.css +78 -0
  310. package/template-vp-monorepo-react-nestjs/apps/web/src/components/DraftProTable/DraftProTable.tsx +105 -0
  311. package/template-vp-monorepo-react-nestjs/apps/web/src/components/DraftProTable/README.md +34 -0
  312. package/template-vp-monorepo-react-nestjs/apps/web/src/components/FullHeightProTable/FullHeightProTable.module.css +54 -0
  313. package/template-vp-monorepo-react-nestjs/apps/web/src/components/FullHeightProTable/FullHeightProTable.tsx +41 -0
  314. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/SvgAsset/IconSelector.tsx +38 -0
  315. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/SvgAsset/SvgAssetIcon.tsx +14 -0
  316. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/SvgAsset/SvgAssetRegistry.ts +32 -0
  317. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/SvgAsset/index.ts +10 -0
  318. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/svg-icon/README.md +37 -0
  319. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/svg-icon/SvgIcon.tsx +25 -0
  320. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Loading/PageLoading.module.css +7 -0
  321. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Loading/PageLoading.tsx +6 -1
  322. package/template-vp-monorepo-react-nestjs/apps/web/src/components/LocaleSwitch/LocaleSwitch.tsx +52 -0
  323. package/template-vp-monorepo-react-nestjs/apps/web/src/components/PasswordActions/ChangePasswordDialog.tsx +90 -0
  324. package/template-vp-monorepo-react-nestjs/apps/web/src/components/PasswordActions/PasswordFields.module.css +12 -0
  325. package/template-vp-monorepo-react-nestjs/apps/web/src/components/PasswordActions/PasswordFields.tsx +54 -0
  326. package/template-vp-monorepo-react-nestjs/apps/web/src/components/PasswordActions/ResetAccountPasswordDialog.tsx +100 -0
  327. package/template-vp-monorepo-react-nestjs/apps/web/src/components/PasswordActions/change-password-session.ts +13 -0
  328. package/template-vp-monorepo-react-nestjs/apps/web/src/components/RouteTransition/RouteTransition.css +60 -0
  329. package/template-vp-monorepo-react-nestjs/apps/web/src/components/RouteTransition/RouteTransition.tsx +44 -0
  330. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/BasicTableSelector/BasicTableSelector.tsx +218 -0
  331. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/BasicTableSelector/BasicTableSelectorSelection.ts +91 -0
  332. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/BasicTableSelector/BasicTableSelectorTypes.ts +60 -0
  333. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/BasicTableSelector/README.md +110 -0
  334. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/BasicTableSelector/index.ts +7 -0
  335. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/GlobalAccountSelect/GlobalAccountSelect.tsx +211 -0
  336. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/GlobalAccountSelect/GlobalAccountSelectTypes.ts +75 -0
  337. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/GlobalAccountSelect/README.md +35 -0
  338. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/GlobalAccountSelect/index.ts +9 -0
  339. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/OrganizationMemberBrowser.tsx +146 -0
  340. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/OrganizationMemberCandidateColumns.tsx +137 -0
  341. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/OrganizationMemberFilterPanel.tsx +209 -0
  342. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/OrganizationMemberSelector.tsx +196 -0
  343. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/OrganizationMemberSelectorTypes.ts +103 -0
  344. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/README.md +8 -0
  345. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/index.ts +13 -0
  346. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/README.md +13 -0
  347. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/index.ts +30 -0
  348. package/template-vp-monorepo-react-nestjs/apps/web/src/config/theme.ts +52 -0
  349. package/template-vp-monorepo-react-nestjs/apps/web/src/hooks/useLatestDialogRequest.ts +71 -0
  350. package/template-vp-monorepo-react-nestjs/apps/web/src/i18n/config.ts +40 -0
  351. package/template-vp-monorepo-react-nestjs/apps/web/src/i18n/index.ts +10 -0
  352. package/template-vp-monorepo-react-nestjs/apps/web/src/i18n/instance.ts +36 -0
  353. package/template-vp-monorepo-react-nestjs/apps/web/src/i18n/ui-locale.ts +30 -0
  354. package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/BasicLayout/index.tsx +113 -0
  355. package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/WorkspaceLayout/components/WorkspaceNavigationBoundary.tsx +50 -0
  356. package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/WorkspaceLayout/index.tsx +196 -0
  357. package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/WorkspaceLayout/workspace-landing.css +119 -0
  358. package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/WorkspaceLayout/workspace-surfaces.css +110 -0
  359. package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/WorkspaceLayout/workspace.css +223 -0
  360. package/template-vp-monorepo-react-nestjs/apps/web/src/locales/en_US.json +639 -1
  361. package/template-vp-monorepo-react-nestjs/apps/web/src/locales/zh_CN.json +621 -1
  362. package/template-vp-monorepo-react-nestjs/apps/web/src/main.tsx +8 -2
  363. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/api.ts +226 -0
  364. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/audit.tsx +169 -0
  365. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/AdministratorDialog.tsx +128 -0
  366. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/CleanupDialog.tsx +140 -0
  367. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/CompanyHierarchyDialog.tsx +244 -0
  368. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/EntityFormDialog.tsx +285 -0
  369. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/EntitySelectors/index.ts +6 -0
  370. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/EntitySelectors/selector-requests.ts +59 -0
  371. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberAffiliations/MemberOrganizationsDialog.tsx +188 -0
  372. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberAffiliations/MemberPositionsDialog.tsx +116 -0
  373. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberAffiliations/affiliation-loaders.ts +18 -0
  374. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberAffiliations/index.ts +5 -0
  375. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/AddProjectMemberDialog.tsx +75 -0
  376. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/CompanyMemberInvitation/CompanyMemberInvitationDialog.tsx +246 -0
  377. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/CompanyMemberInvitation/InvitationRecordsTable.tsx +152 -0
  378. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/CompanyMemberInvitation/invitation-link.ts +9 -0
  379. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/MemberOnboardingActions.tsx +79 -0
  380. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/RegisterCompanyMember/RegisterCompanyMemberDialog.module.css +12 -0
  381. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/RegisterCompanyMember/RegisterCompanyMemberDialog.tsx +122 -0
  382. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberRolesDialog.tsx +80 -0
  383. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberTable/MemberTableColumns.tsx +234 -0
  384. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberTable/index.ts +2 -0
  385. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberTable/member-candidate-cache.ts +12 -0
  386. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MenuFormDialog.tsx +251 -0
  387. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/RoleFormDialog.tsx +73 -0
  388. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/RolePermissionsDialog.tsx +185 -0
  389. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/entities.tsx +268 -0
  390. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/home.tsx +67 -0
  391. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/members.tsx +310 -0
  392. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/menus/api.ts +74 -0
  393. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/menus/index.tsx +325 -0
  394. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/profile.tsx +160 -0
  395. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/roles.tsx +173 -0
  396. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/use-access.ts +35 -0
  397. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/error/404.tsx +20 -0
  398. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/error/error.tsx +42 -0
  399. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/i18n/index.module.css +23 -0
  400. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/i18n/index.tsx +35 -0
  401. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/components/ProjectFormDialog.tsx +137 -0
  402. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/config/columns.tsx +126 -0
  403. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/config/index.ts +87 -0
  404. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/components/DraftProjectFormDialog.tsx +147 -0
  405. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/config/columns.tsx +134 -0
  406. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/config/index.ts +39 -0
  407. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/config/projects.ts +56 -0
  408. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/index.module.css +49 -0
  409. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/index.tsx +183 -0
  410. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/index.module.css +53 -0
  411. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/index.tsx +150 -0
  412. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/home/index.module.css +23 -0
  413. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/home/index.tsx +28 -42
  414. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/login/api.ts +14 -0
  415. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/login/index.tsx +163 -0
  416. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/login/login-form.css +199 -0
  417. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/login/login.css +186 -0
  418. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/member-invitations/accept.css +47 -0
  419. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/member-invitations/accept.tsx +143 -0
  420. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/member-invitations/api.ts +20 -0
  421. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/api.ts +91 -0
  422. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/MoveOrganizationUnitDialog.tsx +82 -0
  423. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/OrganizationMemberColumns.tsx +87 -0
  424. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/OrganizationMemberHeader.tsx +102 -0
  425. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/OrganizationTreeModel.tsx +59 -0
  426. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/OrganizationTreePanel.tsx +88 -0
  427. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/index.ts +11 -0
  428. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/organization-loaders.ts +47 -0
  429. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/organization-member-filter-loaders.ts +187 -0
  430. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationMembersDialog.tsx +207 -0
  431. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationUnitDialog.tsx +110 -0
  432. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/index.tsx +258 -0
  433. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization-templates/api.ts +53 -0
  434. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization-templates/components/OrganizationTemplateDialog/TemplateDefinitionTabs.tsx +189 -0
  435. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization-templates/components/OrganizationTemplateDialog/index.tsx +135 -0
  436. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization-templates/components/OrganizationTemplateDialog/types.ts +25 -0
  437. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization-templates/index.tsx +201 -0
  438. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/positions/api.ts +81 -0
  439. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/positions/components/PositionFormDialog.tsx +86 -0
  440. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/positions/components/PositionMembersDialog.tsx +102 -0
  441. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/positions/index.tsx +198 -0
  442. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/positions/loaders.ts +35 -0
  443. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/register/api.ts +14 -0
  444. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/register/index.tsx +157 -0
  445. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/workspaces/api.ts +32 -0
  446. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/workspaces/index.tsx +146 -0
  447. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/workspaces/state.ts +24 -0
  448. package/template-vp-monorepo-react-nestjs/apps/web/src/router/AGENTS.MD +6 -0
  449. package/template-vp-monorepo-react-nestjs/apps/web/src/router/index.tsx +3 -23
  450. package/template-vp-monorepo-react-nestjs/apps/web/src/router/lazy-load/index.tsx +26 -0
  451. package/template-vp-monorepo-react-nestjs/apps/web/src/router/middleware/README.md +23 -0
  452. package/template-vp-monorepo-react-nestjs/apps/web/src/router/middleware/auth.ts +6 -0
  453. package/template-vp-monorepo-react-nestjs/apps/web/src/router/middleware/index.ts +4 -0
  454. package/template-vp-monorepo-react-nestjs/apps/web/src/router/middleware/workspace/access.ts +23 -0
  455. package/template-vp-monorepo-react-nestjs/apps/web/src/router/middleware/workspace/data.ts +55 -0
  456. package/template-vp-monorepo-react-nestjs/apps/web/src/router/middleware/workspace/entry.ts +52 -0
  457. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/access/page.tsx +20 -0
  458. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/auth.tsx +17 -0
  459. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/company.tsx +30 -0
  460. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/entry.tsx +20 -0
  461. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/examples.tsx +23 -0
  462. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/fallback.tsx +13 -0
  463. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/index.tsx +32 -0
  464. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/platform.tsx +27 -0
  465. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/project.tsx +28 -0
  466. package/template-vp-monorepo-react-nestjs/apps/web/src/router/page-registry.tsx +94 -0
  467. package/template-vp-monorepo-react-nestjs/apps/web/src/styles/dream.css +34 -0
  468. package/template-vp-monorepo-react-nestjs/apps/web/src/styles/index.css +17 -4
  469. package/template-vp-monorepo-react-nestjs/apps/web/src/types/auto-imports.d.ts +26 -0
  470. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/organization-assignment.ts +66 -0
  471. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/request/core/index.ts +101 -58
  472. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/request/core/utils.ts +5 -0
  473. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/request/index.ts +16 -6
  474. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/request/workspace.ts +82 -0
  475. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/safe-next.ts +36 -0
  476. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/storage/cookie.ts +51 -0
  477. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/storage/session.ts +34 -0
  478. package/template-vp-monorepo-react-nestjs/apps/web/test/draft-projects.spec.ts +89 -0
  479. package/template-vp-monorepo-react-nestjs/apps/web/test/i18n-locale.spec.ts +22 -0
  480. package/template-vp-monorepo-react-nestjs/apps/web/test/icon-selector.spec.tsx +23 -0
  481. package/template-vp-monorepo-react-nestjs/apps/web/test/latest-dialog-request.spec.ts +89 -0
  482. package/template-vp-monorepo-react-nestjs/apps/web/test/member-invitation-navigation.spec.ts +34 -0
  483. package/template-vp-monorepo-react-nestjs/apps/web/test/organization-assignment.spec.ts +137 -0
  484. package/template-vp-monorepo-react-nestjs/apps/web/test/password-actions.spec.ts +40 -0
  485. package/template-vp-monorepo-react-nestjs/apps/web/test/password-reset-action.spec.ts +64 -0
  486. package/template-vp-monorepo-react-nestjs/apps/web/test/request.spec.ts +146 -0
  487. package/template-vp-monorepo-react-nestjs/apps/web/test/router/access.spec.ts +136 -0
  488. package/template-vp-monorepo-react-nestjs/apps/web/test/router/config.ts +140 -0
  489. package/template-vp-monorepo-react-nestjs/apps/web/test/router/entry.spec.ts +179 -0
  490. package/template-vp-monorepo-react-nestjs/apps/web/test/router/workspace-data.spec.ts +112 -0
  491. package/template-vp-monorepo-react-nestjs/apps/web/test/selector/global-account-select.spec.ts +311 -0
  492. package/template-vp-monorepo-react-nestjs/apps/web/test/selector/organization-member-selector.spec.ts +454 -0
  493. package/template-vp-monorepo-react-nestjs/apps/web/test/selector/selector-selection.spec.ts +132 -0
  494. package/template-vp-monorepo-react-nestjs/apps/web/test/storage.spec.ts +109 -0
  495. package/template-vp-monorepo-react-nestjs/apps/web/test/tsconfig.json +7 -0
  496. package/template-vp-monorepo-react-nestjs/apps/web/test/workspace-navigation-boundary.spec.tsx +169 -0
  497. package/template-vp-monorepo-react-nestjs/apps/web/test/workspace-navigation.spec.ts +105 -0
  498. package/template-vp-monorepo-react-nestjs/apps/web/test/workspace-requests.spec.ts +174 -0
  499. package/template-vp-monorepo-react-nestjs/apps/web/test/workspaces-password-entry.spec.tsx +71 -0
  500. package/template-vp-monorepo-react-nestjs/apps/web/tsconfig.json +1 -1
  501. package/template-vp-monorepo-react-nestjs/apps/web/vite.config.ts +85 -29
  502. package/template-vp-monorepo-react-nestjs/apps/web-vue/package.json +2 -0
  503. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/api/index.ts +1 -0
  504. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/hooks/chart/useEcharts.ts +13 -1
  505. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/layout/default/header/index.vue +1 -0
  506. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/layout/default/index.vue +6 -2
  507. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/router/guard/index.ts +1 -0
  508. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/router/guard/permissionGuard.ts +1 -0
  509. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/router/index.ts +1 -0
  510. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/store/index.ts +1 -0
  511. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/store/modules/user.ts +1 -0
  512. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/types/auto-import.d.ts +2 -0
  513. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/utils/request/core/index.ts +30 -0
  514. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/utils/request/core/utils.ts +5 -0
  515. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/utils/request/index.ts +2 -0
  516. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/views/example/echart/config.ts +1 -0
  517. package/template-vp-monorepo-react-nestjs/apps/web-vue/tsconfig.tsbuildinfo +1 -0
  518. package/template-vp-monorepo-react-nestjs/docker-compose.yml +19 -0
  519. package/template-vp-monorepo-react-nestjs/mise.toml +1 -1
  520. package/template-vp-monorepo-react-nestjs/package.json +1 -13
  521. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/command.ts +22 -2
  522. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/config.ts +1 -0
  523. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/files.ts +1 -0
  524. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/load-config.ts +8 -0
  525. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/report.ts +2 -0
  526. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/scanner.ts +11 -0
  527. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/sync.ts +12 -0
  528. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/test/command.test.ts +1 -0
  529. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/test/temporary-directory.ts +5 -0
  530. package/template-vp-monorepo-react-nestjs/packages/i18n/core/src/format.ts +1 -0
  531. package/template-vp-monorepo-react-nestjs/packages/i18n/core/src/i18n.ts +14 -0
  532. package/template-vp-monorepo-react-nestjs/packages/i18n/core/src/storage.ts +8 -0
  533. package/template-vp-monorepo-react-nestjs/packages/i18n/core/src/store.ts +9 -0
  534. package/template-vp-monorepo-react-nestjs/packages/i18n/react/src/index.tsx +5 -0
  535. package/template-vp-monorepo-react-nestjs/packages/i18n/react/src/use-store.ts +3 -0
  536. package/template-vp-monorepo-react-nestjs/packages/i18n/vue/src/index.ts +6 -0
  537. package/template-vp-monorepo-react-nestjs/packages/i18n/vue/src/use-store.ts +3 -0
  538. package/template-vp-monorepo-react-nestjs/packages/shared/package.json +5 -1
  539. package/template-vp-monorepo-react-nestjs/packages/shared/src/index.ts +2 -13
  540. package/template-vp-monorepo-react-nestjs/packages/shared/src/types/access-maintenance.ts +68 -0
  541. package/template-vp-monorepo-react-nestjs/packages/shared/src/types/access-menus.ts +94 -0
  542. package/template-vp-monorepo-react-nestjs/packages/shared/src/types/access-resources.ts +168 -0
  543. package/template-vp-monorepo-react-nestjs/packages/shared/src/types/access.ts +71 -0
  544. package/template-vp-monorepo-react-nestjs/packages/shared/src/types/auth.ts +23 -0
  545. package/template-vp-monorepo-react-nestjs/packages/shared/src/types/index.ts +9 -0
  546. package/template-vp-monorepo-react-nestjs/packages/shared/src/types/organization/models.ts +361 -0
  547. package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/access-catalog.ts +304 -0
  548. package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/access-scope.ts +97 -0
  549. package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/account.ts +1 -0
  550. package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/index.ts +65 -0
  551. package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/organization/contracts.ts +237 -0
  552. package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/record.ts +10 -0
  553. package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/session-terminal.ts +1 -0
  554. package/template-vp-monorepo-react-nestjs/packages/shared/test/access.spec.ts +194 -0
  555. package/template-vp-monorepo-react-nestjs/packages/shared/test/organization.spec.ts +168 -0
  556. package/template-vp-monorepo-react-nestjs/pnpm-workspace.yaml +110 -68
  557. package/template-vp-monorepo-react-nestjs/scripts/enterprise-qa/browser.mjs +696 -0
  558. package/template-vp-monorepo-react-nestjs/scripts/enterprise-qa/http-support.mjs +105 -0
  559. package/template-vp-monorepo-react-nestjs/scripts/enterprise-qa/http.mjs +1091 -0
  560. package/template-vp-monorepo-react-nestjs/scripts/enterprise-qa/legacy-http.mjs +140 -0
  561. package/template-vp-monorepo-react-nestjs/scripts/enterprise-qa/legacy.mjs +196 -0
  562. package/template-vp-monorepo-react-nestjs/scripts/enterprise-qa/runtime.mjs +110 -0
  563. package/template-vp-monorepo-react-nestjs/scripts/with-enterprise-test-env.mjs +80 -0
  564. package/template-vp-monorepo-react-nestjs/src/types/auto-imports.d.ts +60 -0
  565. package/template-vp-react/.vscode/settings.json +8 -1
  566. package/template-vp-react/commitlint.config.js +0 -0
  567. package/template-vp-react/package.json +21 -26
  568. package/template-vp-react/pnpm-workspace.yaml +6 -0
  569. package/template-vp-react/src/assets/svg/draft.svg +4 -0
  570. package/template-vp-react/src/components/Icon/svg-icon/README.md +37 -0
  571. package/template-vp-react/src/components/Icon/svg-icon/SvgIcon.tsx +27 -0
  572. package/template-vp-react/src/types/auto-imports.d.ts +2 -0
  573. package/template-vp-react/src/utils/request/index.ts +18 -5
  574. package/template-vp-react/tsconfig.json +2 -3
  575. package/template-vp-react/vite.config.ts +2 -0
  576. package/template-vp-react-shadcn/.agents/rules/SVG/344/275/277/347/224/250.md +8 -0
  577. package/template-vp-react-shadcn/.vscode/settings.json +2 -2
  578. package/template-vp-react-shadcn/{agents.md → AGENTS.md} +12 -2
  579. package/template-vp-react-shadcn/README.md +41 -0
  580. package/template-vp-react-shadcn/commitlint.config.js +1 -1
  581. package/template-vp-react-shadcn/components.json +1 -1
  582. package/template-vp-react-shadcn/package.json +25 -32
  583. package/template-vp-react-shadcn/pnpm-workspace.yaml +10 -0
  584. package/template-vp-react-shadcn/src/App.tsx +10 -10
  585. package/template-vp-react-shadcn/src/assets/svg/draft.svg +4 -0
  586. package/template-vp-react-shadcn/src/components/Icon/svg-icon/README.md +37 -0
  587. package/template-vp-react-shadcn/src/components/Icon/svg-icon/SvgIcon.tsx +27 -0
  588. package/template-vp-react-shadcn/src/components/Loading/PageLoading.tsx +4 -4
  589. package/template-vp-react-shadcn/src/components/Player/VideoJS/index.tsx +94 -78
  590. package/template-vp-react-shadcn/src/components/Player/index.ts +1 -1
  591. package/template-vp-react-shadcn/src/components/ui/button.tsx +25 -32
  592. package/template-vp-react-shadcn/src/components/ui/spinner.tsx +8 -7
  593. package/template-vp-react-shadcn/src/components/ui/toast.tsx +229 -0
  594. package/template-vp-react-shadcn/src/lib/utils.ts +3 -3
  595. package/template-vp-react-shadcn/src/main.tsx +5 -4
  596. package/template-vp-react-shadcn/src/pages/home/index.tsx +43 -35
  597. package/template-vp-react-shadcn/src/router/index.tsx +15 -15
  598. package/template-vp-react-shadcn/src/styles/index.css +4 -4
  599. package/template-vp-react-shadcn/src/styles/shadcn.css +2 -2
  600. package/template-vp-react-shadcn/src/utils/env/index.tsx +2 -2
  601. package/template-vp-react-shadcn/src/utils/request/alova-core/index.ts +102 -30
  602. package/template-vp-react-shadcn/src/utils/request/alova-core/utils.ts +5 -2
  603. package/template-vp-react-shadcn/src/utils/request/index.ts +32 -19
  604. package/template-vp-react-shadcn/src/utils/request/readme.md +41 -38
  605. package/template-vp-react-shadcn/tsconfig.json +2 -3
  606. package/template-vp-react-shadcn/vite.config.ts +29 -15
  607. package/template-vp-vue-eslint-vapor/package.json +29 -36
  608. package/template-vp-vue-eslint-vapor/pnpm-workspace.yaml +29 -1
  609. package/template-vue-vp-eslint/README.md +3 -10
  610. package/template-vue-vp-eslint/package.json +27 -34
  611. package/template-vue-vp-eslint/pnpm-workspace.yaml +27 -2
  612. package/template-vue-vp-eslint/src/layout/default/index.vue +4 -3
  613. package/template-vp-monorepo-react-nestjs/.agents/auth.config.ts +0 -0
  614. package/template-vp-monorepo-react-nestjs/.spaces/server/todo.md +0 -991
  615. package/template-vp-monorepo-react-nestjs/apps/server/README.md +0 -3
  616. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/.gitkeep +0 -0
  617. package/template-vp-react-shadcn/.oxfmtrc.jsonc +0 -8
  618. package/template-vp-react-shadcn/.oxlintrc.jsonc +0 -3
  619. package/template-vp-react-shadcn/src/components/ui/sonner.tsx +0 -43
  620. /package/template-vp-monorepo-react-nestjs/apps/web/src/assets/{hero.png → image/hero.png} +0 -0
  621. /package/template-vp-monorepo-react-nestjs/apps/web/src/assets/{react.svg → svg/react.svg} +0 -0
  622. /package/template-vp-monorepo-react-nestjs/apps/web/src/assets/{vite.svg → svg/vite.svg} +0 -0
@@ -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 账号操作、工作空间选择页、平台账号列表 | 为已确认需求提供实施和验收所需的交互依据 |
@@ -0,0 +1,92 @@
1
+ # 修改密码技术契约
2
+
3
+ ## 1. 状态与依赖
4
+
5
+ - 状态:待实施;以下是本期前后端实施与联调契约,接口在实现和验收完成前不得标为现行可用。
6
+ - 业务规则以[需求文档](./需求文档.md)为准;交互流程见[PRD](./PRD.md),事务与并发取舍见[设计方案](./设计方案.md)。
7
+ - 认证沿用[会话管理技术契约](../会话管理/技术契约.md)的 Redis Session;HTTP 成功正文、统一失败结构与 `x-request-id` 遵循[API 与错误技术契约](../../07.API与错误/技术契约.md)。
8
+
9
+ ## 2. 共享请求与响应类型
10
+
11
+ 前后端在 `packages/shared/src/types` 共享下列类型;Server DTO 与 Web 请求方法引用该处定义,不在两端复制平行接口。
12
+
13
+ ```ts
14
+ interface ChangePasswordRequest {
15
+ oldPassword: string
16
+ newPassword: string
17
+ confirmPassword: string
18
+ }
19
+
20
+ interface ChangePasswordResult {
21
+ passwordChanged: true
22
+ }
23
+
24
+ interface ResetAccountPasswordRequest {
25
+ newPassword: string
26
+ confirmPassword: string
27
+ }
28
+
29
+ interface ResetAccountPasswordResult {
30
+ passwordReset: true
31
+ }
32
+ ```
33
+
34
+ - 三个密码字段仅用于本次请求;均不做 `trim` 或其他隐式改写。旧密码必填;新密码按当前注册规则为 8–16 位;确认密码必须与新密码完全相同。本人改密时,新旧密码必须不同。
35
+ - 管理员重置不要求旧密码,也不以目标账号当前密码为输入;`userId` 为路径中的 UUID,不进入请求体。成功结果不包含目标资料、明文密码或摘要。
36
+ - 服务端必须重新校验所有约束;输入校验失败时密码与会话不变。前端校验只用于及时反馈。
37
+
38
+ ## 3. 接口与权限
39
+
40
+ | 方法与路径 | 请求 | 200 正文 | 权限与作用对象 |
41
+ | --- | --- | --- | --- |
42
+ | `POST /auth/change-password` | `ChangePasswordRequest`,Bearer Session | `ChangePasswordResult` | `@Authenticated()`;目标固定为当前会话 `userId`,不依赖工作空间 |
43
+ | `POST /platform/accounts/:userId/reset-password` | `ResetAccountPasswordRequest`,Bearer Session | `ResetAccountPasswordResult` | 平台作用域 `platform.accounts.reset-password` 且 `adminOnly: true`;目标必须存在且不能等于操作者 `userId` |
44
+
45
+ - `platform.accounts.reset-password` 是绑定 `platform.accounts` 页面的新操作权限,加入共享权限目录;仅平台内置管理员可实际使用,不可授予自定义角色。守卫和服务层写事务均须复核平台管理员身份,避免授权状态变化与直接调用服务绕过。
46
+ - 平台账号列表按钮只在平台内置管理员且目标非本人时展示;任何已存在账号均可被重置,原状态保持不变。当前账号模型包含 `active`、`locked`、`disabled`;未来扩展状态亦遵循保留规则。角色或成员关系不变。本人改密对无工作空间但会话有效的用户开放。
47
+ - 成功后撤销**目标**在 `web`、`desktop`、`mobile` 全部终端的旧会话;本人改密包含当前会话,Web 删除本地令牌并转 `/login`。管理员自己的会话不受目标撤销影响。重置后用户下次登录不强制改密。
48
+ - 重置接口不发送密码;管理员按现有线下渠道告知用户。两个接口不接收幂等键,本期同一目标并发操作由用户行锁串行化。
49
+
50
+ ## 4. 公开错误与失败行为
51
+
52
+ 失败按统一 `ApiFailure` 返回,不回显请求字段值、密码摘要或原始异常。下表中的错误码为本期拟新增或复用的稳定码;`COMMON.VALIDATION_FAILED` 可包含安全清洗后的字段详情。
53
+
54
+ | 场景 | HTTP | 公开码 | 密码与会话 |
55
+ | --- | --- | --- | --- |
56
+ | 缺少或无效会话 | 401 | `AUTH.SESSION_TOKEN_MISSING` / `AUTH.SESSION_INVALID` | 不变 |
57
+ | 旧密码错误 | 422 | `AUTH.OLD_PASSWORD_INCORRECT` | 不变 |
58
+ | 新旧密码相同 | 422 | `AUTH.PASSWORD_REUSE_NOT_ALLOWED` | 不变 |
59
+ | 必填、长度、确认密码或目标 UUID 格式不合法 | 400 | `COMMON.VALIDATION_FAILED` | 不变 |
60
+ | 非平台管理员、无操作权限或重置自己 | 403 | `ACCESS.FORBIDDEN` | 不变 |
61
+ | 目标账号不存在 | 404 | `ACCESS.NOT_FOUND` | 不变 |
62
+ | Redis 撤销失败、脚本协议异常或必要认证依赖不可用 | 503 | `AUTH.SERVICE_UNAVAILABLE` | 密码更新回滚;撤销失败时不能报告成功 |
63
+
64
+ - 目标不存在与越权场景不泄露目标密码、角色或内部查询结果;错误码仍须保留可诊断的授权与资源语义。
65
+ - 任一失败不得向客户端显示“修改/重置成功”。会话撤销已成功但随后 PostgreSQL 提交失败时,密码事务回滚,旧会话可能已失效;接口返回失败,用户按原密码重新登录。此情况不可伪装为成功或恢复已撤销的会话。
66
+
67
+ ## 5. 写入顺序与并发一致性
68
+
69
+ 1. 本人改密在 PostgreSQL 事务中以目标用户 `FOR UPDATE` 行锁读取最新摘要并验证旧密码;管理员重置在平台权限写事务中复核管理员身份、锁定目标行并排除本人。
70
+ 2. 用现有 Argon2id 规则生成新摘要,只更新 `users.password_hash` 和必要的更新时间;管理员成功的现有 `audit_logs` 记录随业务事务写入,摘要只含动作结果等白名单字段。
71
+ 3. 在事务提交前执行 `SessionStoreService.revokeAllForUser(targetUserId)`;Redis Lua 脚本原子撤销三个终端槽位。撤销异常抛出并回滚 PostgreSQL 密码更新和事务内成功审计,然后返回 503。
72
+ 4. Redis 成功后提交 PostgreSQL。数据库提交失败时不能返回成功;Redis 撤销不逆转。事务成功提交后才向客户端返回 200。
73
+ 5. 登录流程必须与密码写入按同一用户行锁串行化:在获得共享行锁后重新验证最新密码摘要,或确认摘要没有从加锁前验证的值变化。禁止沿用加锁前对旧摘要的验证结果直接创建新会话,否则可能在改密撤销后生成有效的旧密码会话。
74
+
75
+ ## 6. 安全事件与审计
76
+
77
+ - 两种操作的成功与失败均输出固定字段结构化安全事件:`event`(`account.password.change` 或 `account.password.reset`)、`actorUserId`(认证前未知时为 `null`)、`targetUserId`(目标未解析或路径不合法时为 `null`)、`requestId`、`result`(`success` / `failure`)、`reasonCode`(成功为 `null`,失败为稳定错误码)、`occurredAt`(UTC 时间)。只允许这些字段,禁止记录请求体、密码、摘要、Token、Cookie、账号资料快照或原始异常对象。
78
+ - 接口入口、认证守卫与平台权限守卫中的拒绝同样属于失败事件,不能仅在业务方法 `catch` 中记录;每个请求只记录一次最终结果。失败事件在业务事务外输出,避免回滚吞掉记录。未能解析的目标不伪造目标身份。
79
+ - 管理员重置成功另外按现有平台管理审计口径写入 `audit_logs`:`action='account.password.reset'`、`objectType='account'`、`objectId=targetUserId`,`summary` 只含 `{ result: 'success' }`;该行与密码更新同事务提交。失败不写入既有成功变更审计。本人改密的成功/失败由上述安全事件覆盖,不强行写入要求平台作用域的管理审计。
80
+ - 安全事件使用现有应用结构化日志采集链路,应用侧不新增单独的清理任务;访问范围沿用该链路的运维/安全权限。当前仓库没有可核验的统一保留期限配置,实际保留周期和检索能力须在交付时依据部署环境确认并记录,不能写成已落实。功能验收先检查事件固定字段、成功与失败覆盖,以及凭据不进入日志。
81
+
82
+ ## 7. 兼容与验收
83
+
84
+ - 现有注册、登录、退出、`/auth/me` 的路径和返回类型保持不变;无需数据迁移或新增用户字段。新权限加入共享目录后同步种子数据与平台账号页操作授权。
85
+ - 已登录但无工作空间、跨终端撤销、管理员自身会话保留、锁定/停用目标状态不变、权限与自重置拒绝、Redis 故障回滚,以及“旧密码登录与改密并发”均须验证。
86
+ - 响应、结构化安全事件、平台审计、应用日志与测试证据均不得出现明文密码或密码摘要。验证结果须写入本功能测试报告;仅代码阅读不能标为通过。
87
+
88
+ ## 8. 变更记录
89
+
90
+ | 日期 | 摘要 | 影响范围 | 原因 |
91
+ | --- | --- | --- | --- |
92
+ | 2026-10-08 | 确定双接口、共享类型、权限、错误、全端撤销一致性与安全事件契约 | Server、Web、shared、Redis Session、平台审计 | 将待实施业务需求转为可联调且可验收的技术边界 |
@@ -0,0 +1,38 @@
1
+ # 修改密码测试报告
2
+
3
+ ## 1. 状态与范围
4
+
5
+ - 状态:验证记录(2026-10-08,验证进行中);本报告尚未形成完整验收结论。
6
+ - 依据:[需求文档](./需求文档.md)、[PRD](./PRD.md)、[技术契约](./技术契约.md)。
7
+ - 验证对象为当前工作树中的 Shared、Server 与 React Web 增量;基线提交为 `c7f2bc6`。工作树未提交,后续代码变化须复测受影响项。
8
+
9
+ ## 2. 已执行的自动化
10
+
11
+ | 范围与命令 | 实际结果 | 证据边界 |
12
+ | --- | --- | --- |
13
+ | Server:`vp test test/auth/password-operations.spec.ts` | 12 项通过 | 使用服务替身验证事务失败路径、权限、安全事件和登录并发判定;包含 Fastify inject 的路由响应钩子测试,不等同于真实数据库/Redis 联调 |
14
+ | Server:`vp test` | 8 套件、45 项通过;2 套件、23 项因环境门控跳过 | 跳过项不得计为通过;真实依赖专项另记 |
15
+ | Server:`pnpm exec tsc --noEmit -p tsconfig.json`、`vp run build` | 均执行成功 | 类型检查与构建不能替代运行态验证 |
16
+ | Web:定向运行 `password-actions.spec.ts`、`password-reset-action.spec.ts`、`workspaces-password-entry.spec.tsx` | 共 5 项通过 | 覆盖成功后清理本地会话、失败时保留会话、入口显示与空工作空间实际页面渲染;未覆盖真实浏览器全过程 |
17
+ | Web:`pnpm --filter web build` | 执行成功 | 类型检查与构建不能替代运行态验证 |
18
+
19
+ Web 全量 `pnpm --filter web test` 的 20 个套件中,14 个套件运行通过,62 项测试通过;另 6 个套件在导入既有 `apps/web/src/i18n/instance.ts` 时因 Node 测试环境缺少 `localStorage` 而未进入用例。加临时 `NODE_OPTIONS=--localstorage-file` 后仍复现。改用 `pnpm --filter web exec vp test --environment happy-dom`,19 个套件运行,106 项通过;既有 `test/request.spec.ts` 的 11 项因 happy-dom 的 CORS 限制拒绝本地测试 HTTP 服务而失败。这些运行不能记为 Web 全量通过。
20
+
21
+ ## 3. 验收场景与未覆盖项
22
+
23
+ | 场景 | 当前证据 | 待补验证 |
24
+ | --- | --- | --- |
25
+ | 无工作空间用户进入本人改密、成功后回登录页 | Web 页面与会话清理定向自动化 | 真实浏览器和后端联动 |
26
+ | 旧密码错误、密码复用、输入不合法时无密码变更 | Server 定向自动化 | 真实 PostgreSQL 写入前后比对 |
27
+ | 平台管理员重置他人、自重置拒绝、越权拒绝、目标不存在 | Server 定向自动化及 Web 入口定向自动化 | 真实权限数据和 HTTP 联动 |
28
+ | 撤销目标 Web、桌面端、移动端会话,管理员自身会话保持 | 服务替身验证撤销调用边界 | 真实 Redis 三终端会话验证 |
29
+ | Redis 撤销失败时密码和成功审计回滚,旧密码并发登录不能重新建会话 | Server 定向自动化 | 真实 PostgreSQL/Redis 故障与并发验证 |
30
+ | 响应、安全事件、管理审计和普通日志无密码明文或摘要 | Server 定向自动化覆盖固定安全事件与错误日志,代码审查已发现并修复两处问题 | 运行态日志、响应与审计数据抽检;部署日志保留期限与检索能力确认 |
31
+
32
+ 真实 PostgreSQL/Redis 专项、浏览器端到端场景及运行态日志/审计抽检尚待记录,不能据当前自动化结果认定需求第 6 节全部通过。相关前后端核对见[联调记录](./联调记录.md)。
33
+
34
+ ## 4. 变更记录
35
+
36
+ | 日期 | 摘要 | 影响范围 | 原因 |
37
+ | --- | --- | --- | --- |
38
+ | 2026-10-08 | 建立自动化与未覆盖场景记录,区分测试环境加载失败和真实依赖验证 | Shared、Server、Web、认证与会话 | 避免将代码级测试或构建结果误记为完整业务验收 |