create-bubbles 0.1.27 → 0.1.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dist/index.js +4 -4
  2. package/package.json +10 -2
  3. package/template-pnpm-vp-monorepo/.changeset/README.md +8 -0
  4. package/template-pnpm-vp-monorepo/.changeset/config.json +11 -0
  5. package/template-pnpm-vp-monorepo/.gitattributes +5 -0
  6. package/template-pnpm-vp-monorepo/.github/workflows/ci.yml +33 -0
  7. package/template-pnpm-vp-monorepo/.github/workflows/docs.yml +55 -0
  8. package/template-pnpm-vp-monorepo/.github/workflows/release.yml +54 -0
  9. package/template-pnpm-vp-monorepo/.vite-hooks/commit-msg +1 -0
  10. package/template-pnpm-vp-monorepo/.vite-hooks/pre-commit +1 -0
  11. package/template-pnpm-vp-monorepo/.vite-hooks/run.mjs +17 -0
  12. package/template-pnpm-vp-monorepo/.vscode/settings.json +23 -0
  13. package/{LICENSE → template-pnpm-vp-monorepo/LICENSE} +2 -2
  14. package/template-pnpm-vp-monorepo/README.md +93 -0
  15. package/template-pnpm-vp-monorepo/_gitignore +43 -0
  16. package/template-pnpm-vp-monorepo/apps/docs/.vitepress/config.mts +69 -0
  17. package/template-pnpm-vp-monorepo/apps/docs/guide/getting-started.md +70 -0
  18. package/template-pnpm-vp-monorepo/apps/docs/guide/release.md +73 -0
  19. package/template-pnpm-vp-monorepo/apps/docs/guide/workspace.md +84 -0
  20. package/template-pnpm-vp-monorepo/apps/docs/index.md +22 -0
  21. package/template-pnpm-vp-monorepo/apps/docs/package.json +23 -0
  22. package/template-pnpm-vp-monorepo/apps/docs/tsconfig.json +7 -0
  23. package/template-pnpm-vp-monorepo/apps/docs/vite.config.ts +12 -0
  24. package/template-pnpm-vp-monorepo/apps/playground/index.html +14 -0
  25. package/template-pnpm-vp-monorepo/apps/playground/package.json +24 -0
  26. package/template-pnpm-vp-monorepo/apps/playground/src/App.vue +214 -0
  27. package/template-pnpm-vp-monorepo/apps/playground/src/env.d.ts +6 -0
  28. package/template-pnpm-vp-monorepo/apps/playground/src/main.ts +6 -0
  29. package/template-pnpm-vp-monorepo/apps/playground/src/style.css +728 -0
  30. package/template-pnpm-vp-monorepo/apps/playground/tsconfig.json +10 -0
  31. package/template-pnpm-vp-monorepo/apps/playground/vite.config.ts +29 -0
  32. package/template-pnpm-vp-monorepo/commitlint.config.mjs +3 -0
  33. package/template-pnpm-vp-monorepo/eslint.config.mjs +22 -0
  34. package/template-pnpm-vp-monorepo/mise.toml +3 -0
  35. package/template-pnpm-vp-monorepo/package.json +40 -0
  36. package/template-pnpm-vp-monorepo/packages/utils/LICENSE +21 -0
  37. package/template-pnpm-vp-monorepo/packages/utils/README.md +26 -0
  38. package/template-pnpm-vp-monorepo/packages/utils/_gitignore +4 -0
  39. package/template-pnpm-vp-monorepo/packages/utils/package.json +42 -0
  40. package/template-pnpm-vp-monorepo/packages/utils/scripts/verify-package.mjs +127 -0
  41. package/template-pnpm-vp-monorepo/packages/utils/src/index.ts +12 -0
  42. package/template-pnpm-vp-monorepo/packages/utils/tests/consumer/commonjs.cts +20 -0
  43. package/template-pnpm-vp-monorepo/packages/utils/tests/consumer/esm.mts +20 -0
  44. package/template-pnpm-vp-monorepo/packages/utils/tests/consumer/tsconfig.json +10 -0
  45. package/template-pnpm-vp-monorepo/packages/utils/tests/index.test.ts +30 -0
  46. package/template-pnpm-vp-monorepo/packages/utils/tsconfig.json +4 -0
  47. package/template-pnpm-vp-monorepo/packages/utils/vite.config.ts +20 -0
  48. package/template-pnpm-vp-monorepo/pnpm-workspace.yaml +27 -0
  49. package/template-pnpm-vp-monorepo/tsconfig/base.json +22 -0
  50. package/template-pnpm-vp-monorepo/tsconfig/node.json +8 -0
  51. package/template-pnpm-vp-monorepo/tsconfig/vue.json +7 -0
  52. package/template-pnpm-vp-monorepo/tsconfig.json +4 -0
  53. package/template-pnpm-vp-monorepo/vite.config.ts +38 -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//346/212/200/346/234/257/345/245/221/347/272/246.md +5 -3
  55. 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 +9 -0
  56. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//345/217/221/345/270/203/350/257/204/344/274/260.md +93 -0
  57. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//345/267/245/345/205/267//350/277/220/350/241/214/346/227/266/345/217/221/345/270/203/346/243/200/346/237/245.mjs +340 -0
  58. 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 +28 -6
  59. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256/cli-/346/211/253/346/217/217/350/276/271/347/225/214/comment-clean/catalog/en_US.json +4 -0
  60. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256/cli-/346/211/253/346/217/217/350/276/271/347/225/214/comment-clean/i18n.config.mjs +9 -0
  61. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256/cli-/346/211/253/346/217/217/350/276/271/347/225/214/comment-clean/report.json +16 -0
  62. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256/cli-/346/211/253/346/217/217/350/276/271/347/225/214/comment-clean/source/app.ts +2 -0
  63. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256/cli-/346/211/253/346/217/217/350/276/271/347/225/214/empty-scan/catalog/en_US.json +4 -0
  64. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256/cli-/346/211/253/346/217/217/350/276/271/347/225/214/empty-scan/i18n.config.mjs +9 -0
  65. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256/cli-/346/211/253/346/217/217/350/276/271/347/225/214/empty-scan/report.json +19 -0
  66. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256/cli-/346/211/253/346/217/217/350/276/271/347/225/214/output.json +84 -0
  67. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256/cli-/346/211/253/346/217/217/350/276/271/347/225/214//345/275/223/345/211/215/345/244/215/351/252/214.json +86 -0
  68. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256/cli-/346/211/253/346/217/217/350/276/271/347/225/214//346/243/200/346/237/245/347/273/223/346/236/234.json +30 -0
  69. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256/cli-/346/211/253/346/217/217/350/276/271/347/225/214//346/263/250/351/207/212/345/233/236/345/275/222.json +40 -0
  70. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256//345/214/205/345/217/221/345/270/203/bubblesjs-i18n-core-0.0.0.tgz +0 -0
  71. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256//345/214/205/345/217/221/345/270/203/bubblesjs-i18n-react-0.0.0.tgz +0 -0
  72. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256//345/214/205/345/217/221/345/270/203/bubblesjs-i18n-vue-0.0.1.tgz +0 -0
  73. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256//345/214/205/345/217/221/345/270/203//344/272/247/347/211/251/345/244/215/351/252/214.json +419 -0
  74. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256//345/214/205/345/217/221/345/270/203//346/243/200/346/237/245/347/273/223/346/236/234.json +339 -0
  75. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/350/257/201/346/215/256//350/277/220/350/241/214/346/227/266/345/217/221/345/270/203/346/243/200/346/237/245.json +131 -0
  76. 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 +19 -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//345/233/275/351/231/205/345/214/226//351/234/200/346/261/202/346/226/207/346/241/243.md +21 -3
  78. package/template-vp-monorepo-react-nestjs/.spaces/06./350/256/244/350/257/201/344/270/216/344/274/232/350/257/235//344/274/232/350/257/235/347/256/241/347/220/206//346/212/200/346/234/257/345/245/221/347/272/246.md +5 -2
  79. package/template-vp-monorepo-react-nestjs/.spaces/06./350/256/244/350/257/201/344/270/216/344/274/232/350/257/235//344/274/232/350/257/235/347/256/241/347/220/206//351/234/200/346/261/202/346/226/207/346/241/243.md +4 -3
  80. 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 +2 -1
  81. 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 +3 -2
  82. 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 +15 -12
  83. 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 +6 -5
  84. 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 +2 -1
  85. 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 +4 -3
  86. package/template-vp-monorepo-react-nestjs/.spaces/README.md +3 -2
  87. package/template-vp-monorepo-react-nestjs/apps/web/test/{password-actions.spec.ts → password/password-actions.spec.ts} +3 -3
  88. package/template-vp-monorepo-react-nestjs/apps/web/test/{password-reset-action.spec.ts → password/password-reset-action.spec.ts} +4 -2
  89. package/template-vp-monorepo-react-nestjs/apps/web/test/{workspaces-password-entry.spec.tsx → password/workspaces-password-entry.spec.tsx} +7 -7
  90. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/README.md +2 -0
  91. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/scanner.test.ts +88 -0
  92. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/scanner.ts +34 -11
  93. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/test/command.test.ts +36 -0
  94. package/template-vp-monorepo-react-nestjs/packages/i18n/react/src/use-store.ts +15 -5
  95. package/template-vp-monorepo-react-nestjs/tsconfig.lib.json +1 -1
  96. package/template-vp-react/package.json +5 -5
  97. package/template-vp-vue-eslint-vapor/.vscode/settings.json +53 -0
  98. package/template-vp-vue-eslint-vapor/package.json +1 -0
  99. package/template-vp-vue-eslint-vapor/pnpm-workspace.yaml +0 -24
  100. package/template-vp-vue-eslint-vapor/src/main.ts +2 -3
  101. package/template-vp-vue-eslint-vapor/vite.config.ts +26 -31
  102. package/template-vp-react/.vscode/settings.json +0 -18
  103. /package/{template-vp-vue-eslint-vapor → template-pnpm-vp-monorepo}/.vscode/extensions.json +0 -0
  104. /package/template-vp-monorepo-react-nestjs/apps/server/test/auth/{password-operations.spec.ts → password/password-operations.spec.ts} +0 -0
  105. /package/template-vp-monorepo-react-nestjs/apps/server/test/auth/{password.integration.spec.ts → password/password.integration.spec.ts} +0 -0
@@ -0,0 +1,339 @@
1
+ {
2
+ "status": "验证记录",
3
+ "date": "2026-10-09",
4
+ "environment": {
5
+ "node": "v24.21.0",
6
+ "platform": "win32",
7
+ "react": "19.3.0",
8
+ "reactDom": "19.3.0",
9
+ "vue": "3.5.42",
10
+ "dependencyResolution": {
11
+ "appRequireBase": "C:\\malei\\stu\\bubbles\\packages\\create-bubbles\\template-vp-monorepo-react-nestjs\\apps\\web\\package.json",
12
+ "vueRequireBase": "C:\\malei\\stu\\bubbles\\packages\\create-bubbles\\template-vp-monorepo-react-nestjs\\packages\\i18n\\vue\\package.json",
13
+ "happyDom": "C:\\malei\\stu\\bubbles\\packages\\create-bubbles\\template-vp-monorepo-react-nestjs\\node_modules\\.pnpm\\happy-dom@20.14.5\\node_modules\\happy-dom\\lib\\index.js",
14
+ "react": "C:\\malei\\stu\\bubbles\\packages\\create-bubbles\\template-vp-monorepo-react-nestjs\\node_modules\\.pnpm\\react@19.3.0\\node_modules\\react\\index.js",
15
+ "reactDomServer": "C:\\malei\\stu\\bubbles\\packages\\create-bubbles\\template-vp-monorepo-react-nestjs\\node_modules\\.pnpm\\react-dom@19.3.0_react@19.3.0\\node_modules\\react-dom\\server.node.js",
16
+ "reactDomClient": "C:\\malei\\stu\\bubbles\\packages\\create-bubbles\\template-vp-monorepo-react-nestjs\\node_modules\\.pnpm\\react-dom@19.3.0_react@19.3.0\\node_modules\\react-dom\\client.js",
17
+ "vue": "C:\\malei\\stu\\bubbles\\packages\\create-bubbles\\template-vp-monorepo-react-nestjs\\node_modules\\.pnpm\\vue@3.5.42_typescript@6.0.3\\node_modules\\vue\\index.js"
18
+ },
19
+ "pnpm": "12.10.1",
20
+ "vp": "1.1.0",
21
+ "vitePlus": "0.3.1"
22
+ },
23
+ "checks": [
24
+ {
25
+ "command": "vp run --filter '@bubblesjs/i18n-*' build",
26
+ "exitCode": 0,
27
+ "result": "四包构建成功;React 因源码变化重新构建,其余三个包命中任务缓存",
28
+ "rebuiltPackages": ["react"],
29
+ "cachedPackages": ["core", "vue", "cli"]
30
+ },
31
+ {
32
+ "command": "vp test run",
33
+ "workingDirectory": "packages/i18n/cli",
34
+ "exitCode": 0,
35
+ "testFiles": 6,
36
+ "tests": 71,
37
+ "note": "vp run 缓存通过后另执行包内测试确认",
38
+ "evidence": "../cli-扫描边界/当前复验.json"
39
+ },
40
+ {
41
+ "command": "vp check packages/i18n",
42
+ "exitCode": 1,
43
+ "output": "packages/i18n/cli/docs/excel-sync-plan.md (790ms)\npackages/i18n/cli/package.json (0ms)\npackages/i18n/cli/src/cli.ts (0ms)\npackages/i18n/cli/src/command.ts (1ms)\npackages/i18n/cli/src/config.ts (0ms)\npackages/i18n/cli/src/files.ts (0ms)\npackages/i18n/cli/src/index.ts (0ms)\npackages/i18n/cli/src/load-config.ts (0ms)\npackages/i18n/cli/src/report.ts (0ms)\npackages/i18n/cli/src/sync.ts (1ms)\npackages/i18n/cli/test/config.test.ts (0ms)\npackages/i18n/cli/test/load-config.test.ts (1ms)\npackages/i18n/cli/test/report.test.ts (0ms)\npackages/i18n/cli/test/sync.test.ts (0ms)\npackages/i18n/cli/test/temporary-directory.ts (0ms)\npackages/i18n/cli/tsconfig.json (1ms)\npackages/i18n/cli/vite.config.ts (1ms)\npackages/i18n/core/package.json (0ms)\npackages/i18n/core/src/format.ts (1ms)\npackages/i18n/core/src/i18n.ts (1ms)\npackages/i18n/core/src/index.ts (0ms)\npackages/i18n/core/src/storage.ts (1ms)\npackages/i18n/core/src/store.ts (1ms)\npackages/i18n/core/src/types.ts (0ms)\npackages/i18n/core/tsconfig.json (0ms)\npackages/i18n/core/vite.config.ts (1ms)\npackages/i18n/react/package.json (0ms)\npackages/i18n/react/src/index.tsx (0ms)\npackages/i18n/react/src/use-store.ts (0ms)\npackages/i18n/react/tsconfig.json (0ms)\npackages/i18n/react/vite.config.ts (0ms)\npackages/i18n/vue/package.json (0ms)\npackages/i18n/vue/src/index.ts (1ms)\npackages/i18n/vue/src/use-store.ts (0ms)\npackages/i18n/vue/tsconfig.json (0ms)\nerror: Formatting issues found\npackages/i18n/vue/vite.config.ts (0ms)\n\nFound formatting issues in 36 files (944ms, 24 threads). Run `vp check --fix` to fix them."
44
+ },
45
+ {
46
+ "command": "vp run --filter web test --run test/i18n-locale.spec.ts",
47
+ "exitCode": 0,
48
+ "output": "~/apps/web$ vp test --run test/i18n-locale.spec.ts\n\n mode: test\n VITE_PORT: 9999\n VITE_API_AFFIX: /api\n VITE_API_URL: undefined\n \n\n RUN v4.1.11 C:/malei/stu/bubbles/packages/create-bubbles/template-vp-monorepo-react-nestjs/apps/web\n\n ✓ test/i18n-locale.spec.ts (2 tests) 2ms\n\n Test Files 1 passed (1)\n Tests 2 passed (2)\n Start at 14:03:56\n Duration 5.28s (transform 33ms, setup 0ms, import 5.11s, tests 2ms, environment 0ms)\n\n\n---\nvp run: web#test not cached because it modified its input. (Run `vp run --last-details` for full details)"
49
+ },
50
+ {
51
+ "command": "vp check --no-fmt packages/i18n",
52
+ "exitCode": 1,
53
+ "output": "x typescript(TS2584): Cannot find name 'console'. Do you need to change your target library? Try changing the 'lib' compiler option to include 'dom'.\n ,-[packages/i18n/core/src/i18n.ts:41:11]\n 40 | } catch (error) {\n 41 | console.warn(`Failed to load locale file for ${nextLocale}:`, error)\n : ^^^^^^^\n 42 | }\n `----\n\n x typescript(TS2584): Cannot find name 'console'. Do you need to change your target library? Try changing the 'lib' compiler option to include 'dom'.\n ,-[packages/i18n/core/src/i18n.ts:74:5]\n 73 | } catch (error) {\n 74 | console.warn(`Failed to load locale file for ${locale}:`, error)\n : ^^^^^^^\n 75 | }\nerror: Lint or type issues found\n `----\n\nFound 2 errors and 0 warnings in 30 files (1.2s, 24 threads)"
54
+ },
55
+ {
56
+ "command": "vp check packages/i18n/react/src/use-store.ts",
57
+ "exitCode": 1,
58
+ "output": "packages/i18n/react/src/use-store.ts (0ms)\nerror: Formatting issues found\n\nFound formatting issues in 1 file (144ms, 24 threads). Run `vp check --fix` to fix them."
59
+ },
60
+ {
61
+ "command": "vp check --no-fmt packages/i18n/react/src/use-store.ts",
62
+ "exitCode": 0,
63
+ "output": "pass: Found no warnings, lint errors, or type errors in 1 file (329ms, 24 threads)"
64
+ },
65
+ {
66
+ "command": "node .spaces/04.界面与主题/国际化/工具/运行时发布检查.mjs",
67
+ "exitCode": 0,
68
+ "result": "具名和内联 React 对象 selector 各渲染两次、DOM 正确更新,无警告或异常;其他问题见运行时证据",
69
+ "evidence": "../运行时发布检查.json"
70
+ }
71
+ ],
72
+ "packageDryRuns": [
73
+ {
74
+ "packageName": "core",
75
+ "command": "pnpm pack --dry-run --json",
76
+ "exitCode": 0,
77
+ "result": {
78
+ "name": "@bubblesjs/i18n-core",
79
+ "version": "0.0.0",
80
+ "filename": "bubblesjs-i18n-core-0.0.0.tgz",
81
+ "files": [
82
+ {
83
+ "path": "package.json"
84
+ },
85
+ {
86
+ "path": "src/format.ts"
87
+ },
88
+ {
89
+ "path": "src/i18n.ts"
90
+ },
91
+ {
92
+ "path": "src/index.ts"
93
+ },
94
+ {
95
+ "path": "src/storage.ts"
96
+ },
97
+ {
98
+ "path": "src/store.ts"
99
+ },
100
+ {
101
+ "path": "src/types.ts"
102
+ },
103
+ {
104
+ "path": "tsconfig.json"
105
+ },
106
+ {
107
+ "path": "vite.config.ts"
108
+ }
109
+ ]
110
+ }
111
+ },
112
+ {
113
+ "packageName": "react",
114
+ "command": "pnpm pack --dry-run --json",
115
+ "exitCode": 0,
116
+ "result": {
117
+ "name": "@bubblesjs/i18n-react",
118
+ "version": "0.0.0",
119
+ "filename": "bubblesjs-i18n-react-0.0.0.tgz",
120
+ "files": [
121
+ {
122
+ "path": "package.json"
123
+ },
124
+ {
125
+ "path": "src/index.tsx"
126
+ },
127
+ {
128
+ "path": "src/use-store.ts"
129
+ },
130
+ {
131
+ "path": "tsconfig.json"
132
+ },
133
+ {
134
+ "path": "vite.config.ts"
135
+ }
136
+ ]
137
+ }
138
+ },
139
+ {
140
+ "packageName": "vue",
141
+ "command": "pnpm pack --dry-run --json",
142
+ "exitCode": 0,
143
+ "result": {
144
+ "name": "@bubblesjs/i18n-vue",
145
+ "version": "0.0.1",
146
+ "filename": "bubblesjs-i18n-vue-0.0.1.tgz",
147
+ "files": [
148
+ {
149
+ "path": "package.json"
150
+ },
151
+ {
152
+ "path": "src/index.ts"
153
+ },
154
+ {
155
+ "path": "src/use-store.ts"
156
+ },
157
+ {
158
+ "path": "tsconfig.json"
159
+ },
160
+ {
161
+ "path": "vite.config.ts"
162
+ }
163
+ ]
164
+ }
165
+ },
166
+ {
167
+ "packageName": "cli",
168
+ "command": "pnpm pack --dry-run --json",
169
+ "exitCode": 1,
170
+ "result": {
171
+ "error": {
172
+ "code": "ERR_PNPM_BIN_CRLF",
173
+ "message": "The bin file \"src/cli.ts\" has a shebang line ending with CRLF (\\r\\n)."
174
+ }
175
+ }
176
+ }
177
+ ],
178
+ "actualTarballs": [
179
+ {
180
+ "archive": "bubblesjs-i18n-core-0.0.0.tgz",
181
+ "sha256": "35AE07DFAA3C880AC36E01819E8DF58A58F9F913FB574744B1DF8DFB102E63FF",
182
+ "hasDist": false,
183
+ "private": true,
184
+ "entry": "./src/index.ts"
185
+ },
186
+ {
187
+ "archive": "bubblesjs-i18n-react-0.0.0.tgz",
188
+ "sha256": "E2040112B5E6B4693849DE438F029B64A7E6123EA15B47FA90EC1A29863AB27C",
189
+ "hasDist": false,
190
+ "private": true,
191
+ "entry": "./src/index.tsx"
192
+ },
193
+ {
194
+ "archive": "bubblesjs-i18n-vue-0.0.1.tgz",
195
+ "sha256": "E7D406D0254D645645E1B6FA823972394558FEBB59D3D9112A53D408C3CC5EAA",
196
+ "hasDist": false,
197
+ "private": true,
198
+ "entry": "./src/index.ts"
199
+ }
200
+ ],
201
+ "packageEvidence": "./产物复验.json",
202
+ "externalImports": [
203
+ {
204
+ "package": "@bubblesjs/i18n-core",
205
+ "command": "node --input-type=module --eval <dynamic import> @bubblesjs/i18n-core",
206
+ "exitCode": 1,
207
+ "result": {
208
+ "ok": false,
209
+ "code": "ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING",
210
+ "message": "Stripping types is currently unsupported for files under node_modules, for \"file:///C:/Users/Administrator/AppData/Local/Temp/i18n-pack-consumer-4d1a55e25578428986678bb5029b4011/node_modules/@bubblesjs/i18n-core/src/index.ts\""
211
+ }
212
+ },
213
+ {
214
+ "package": "@bubblesjs/i18n-react",
215
+ "command": "node --input-type=module --eval <dynamic import> @bubblesjs/i18n-react",
216
+ "exitCode": 1,
217
+ "result": {
218
+ "ok": false,
219
+ "code": "ERR_UNKNOWN_FILE_EXTENSION",
220
+ "message": "Unknown file extension \".tsx\" for C:\\Users\\Administrator\\AppData\\Local\\Temp\\i18n-pack-consumer-4d1a55e25578428986678bb5029b4011\\node_modules\\@bubblesjs\\i18n-react\\src\\index.tsx"
221
+ }
222
+ },
223
+ {
224
+ "package": "@bubblesjs/i18n-vue",
225
+ "command": "node --input-type=module --eval <dynamic import> @bubblesjs/i18n-vue",
226
+ "exitCode": 1,
227
+ "result": {
228
+ "ok": false,
229
+ "code": "ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING",
230
+ "message": "Stripping types is currently unsupported for files under node_modules, for \"file:///C:/Users/Administrator/AppData/Local/Temp/i18n-pack-consumer-4d1a55e25578428986678bb5029b4011/node_modules/@bubblesjs/i18n-vue/src/index.ts\""
231
+ }
232
+ }
233
+ ],
234
+ "runtimeChecks": {
235
+ "languageSwitchRace": {
236
+ "requestOrder": ["slow", "latest"],
237
+ "completionOrder": ["latest", "slow"],
238
+ "expectedLocale": "latest",
239
+ "actualLocale": "slow",
240
+ "actualTranslation": "Stale",
241
+ "problemReproduced": true
242
+ },
243
+ "instanceIsolation": {
244
+ "first": {
245
+ "locale": "en_US",
246
+ "translation": "Hello"
247
+ },
248
+ "second": {
249
+ "locale": "zh_CN",
250
+ "translation": "独立实例"
251
+ },
252
+ "passed": true
253
+ },
254
+ "prototypeMessageKeys": {
255
+ "values": [
256
+ {
257
+ "key": "constructor",
258
+ "expected": "constructor",
259
+ "actualType": "function",
260
+ "returnedString": false
261
+ },
262
+ {
263
+ "key": "toString",
264
+ "expected": "toString",
265
+ "actualType": "function",
266
+ "returnedString": false
267
+ }
268
+ ],
269
+ "interpolationError": {
270
+ "name": "TypeError",
271
+ "message": "message.replace is not a function"
272
+ },
273
+ "problemReproduced": true
274
+ },
275
+ "prototypeInterpolationKey": {
276
+ "expected": "Value: {toString}",
277
+ "actual": "Value: function toString() { [native code] }",
278
+ "problemReproduced": true
279
+ },
280
+ "shallowObjectKeys": {
281
+ "inputDescription": "{ first: undefined } 与 { second: undefined }",
282
+ "expected": false,
283
+ "actual": true,
284
+ "problemReproduced": true
285
+ },
286
+ "reactSSR": {
287
+ "expected": "完成服务端渲染",
288
+ "error": {
289
+ "name": "Error",
290
+ "message": "Missing getServerSnapshot, which is required for server-rendered content. Will revert to client rendering."
291
+ },
292
+ "problemReproduced": true
293
+ },
294
+ "reactObjectSelector": {
295
+ "expected": "稳定渲染,状态更新后 DOM 从 en_US 变为 zh_CN",
296
+ "selectorKind": "named",
297
+ "stateUpdates": 1,
298
+ "before": "en_US",
299
+ "after": "zh_CN",
300
+ "renderCount": 2,
301
+ "warnings": [],
302
+ "error": null,
303
+ "problemReproduced": false
304
+ },
305
+ "reactInlineObjectSelector": {
306
+ "expected": "稳定渲染,状态更新后 DOM 从 en_US 变为 zh_CN",
307
+ "selectorKind": "inline",
308
+ "stateUpdates": 1,
309
+ "before": "en_US",
310
+ "after": "zh_CN",
311
+ "renderCount": 2,
312
+ "warnings": [],
313
+ "error": null,
314
+ "problemReproduced": false
315
+ },
316
+ "vueProviderStoreReplacement": {
317
+ "before": "first",
318
+ "expectedAfter": "second",
319
+ "actualAfter": "first",
320
+ "problemReproduced": true
321
+ }
322
+ },
323
+ "supplementalReactStrictMode": {
324
+ "method": "补充只读脚本,使用当前 dist 及真实 React DOM;脚本未归档",
325
+ "inlineObjectSelector": true,
326
+ "renderCounts": [2, 4, 6, 8],
327
+ "domResults": ["first:1", "first:2", "updated:2", "second:3"],
328
+ "warnings": [],
329
+ "error": null
330
+ },
331
+ "historicalInstall": {
332
+ "date": "2026-10-08",
333
+ "command": "vp install --frozen-lockfile",
334
+ "exitCode": 0,
335
+ "note": "首次评估安装成功、锁文件未变化;本轮未重新安装"
336
+ },
337
+ "conclusion": "当前版本仍不宜直接发布;React 快照缓存及 CLI 边界注释已通过复验,打包、入口、core 类型错误及其他运行时缺陷仍需处理。",
338
+ "note": "未修改业务源码或 manifest,未执行远端发布。"
339
+ }
@@ -0,0 +1,131 @@
1
+ {
2
+ "assessmentDate": "2026-10-09",
3
+ "executedAtUtc": "2026-10-09T06:03:55.731Z",
4
+ "command": "node .spaces/04.界面与主题/国际化/工具/运行时发布检查.mjs",
5
+ "method": "直接导入当前 dist;使用真实 React SSR、React DOM、Vue 渲染器与 happy-dom;未安装依赖、未构建、未修改业务代码。",
6
+ "environment": {
7
+ "node": "v24.21.0",
8
+ "platform": "win32",
9
+ "react": "19.3.0",
10
+ "reactDom": "19.3.0",
11
+ "vue": "3.5.42",
12
+ "dependencyResolution": {
13
+ "appRequireBase": "C:\\malei\\stu\\bubbles\\packages\\create-bubbles\\template-vp-monorepo-react-nestjs\\apps\\web\\package.json",
14
+ "vueRequireBase": "C:\\malei\\stu\\bubbles\\packages\\create-bubbles\\template-vp-monorepo-react-nestjs\\packages\\i18n\\vue\\package.json",
15
+ "happyDom": "C:\\malei\\stu\\bubbles\\packages\\create-bubbles\\template-vp-monorepo-react-nestjs\\node_modules\\.pnpm\\happy-dom@20.14.5\\node_modules\\happy-dom\\lib\\index.js",
16
+ "react": "C:\\malei\\stu\\bubbles\\packages\\create-bubbles\\template-vp-monorepo-react-nestjs\\node_modules\\.pnpm\\react@19.3.0\\node_modules\\react\\index.js",
17
+ "reactDomServer": "C:\\malei\\stu\\bubbles\\packages\\create-bubbles\\template-vp-monorepo-react-nestjs\\node_modules\\.pnpm\\react-dom@19.3.0_react@19.3.0\\node_modules\\react-dom\\server.node.js",
18
+ "reactDomClient": "C:\\malei\\stu\\bubbles\\packages\\create-bubbles\\template-vp-monorepo-react-nestjs\\node_modules\\.pnpm\\react-dom@19.3.0_react@19.3.0\\node_modules\\react-dom\\client.js",
19
+ "vue": "C:\\malei\\stu\\bubbles\\packages\\create-bubbles\\template-vp-monorepo-react-nestjs\\node_modules\\.pnpm\\vue@3.5.42_typescript@6.0.3\\node_modules\\vue\\index.js"
20
+ }
21
+ },
22
+ "artifacts": {
23
+ "core": {
24
+ "path": "C:\\malei\\stu\\bubbles\\packages\\create-bubbles\\template-vp-monorepo-react-nestjs\\packages\\i18n\\core\\dist\\index.js",
25
+ "sha256": "35ab1d08457977da247fa8a364eaa4725bb09698b8165dee82073f935621b537"
26
+ },
27
+ "react": {
28
+ "path": "C:\\malei\\stu\\bubbles\\packages\\create-bubbles\\template-vp-monorepo-react-nestjs\\packages\\i18n\\react\\dist\\index.js",
29
+ "sha256": "2264549c0f9e3200f6b495be3f8ddec0d7718433b8f211c4b7180610212796cf"
30
+ },
31
+ "vue": {
32
+ "path": "C:\\malei\\stu\\bubbles\\packages\\create-bubbles\\template-vp-monorepo-react-nestjs\\packages\\i18n\\vue\\dist\\index.js",
33
+ "sha256": "00ce1e688be4bd99c52fb0da93cce178cb172cb929f25c3796648e021db256f1"
34
+ }
35
+ },
36
+ "checks": {
37
+ "languageSwitchRace": {
38
+ "requestOrder": [
39
+ "slow",
40
+ "latest"
41
+ ],
42
+ "completionOrder": [
43
+ "latest",
44
+ "slow"
45
+ ],
46
+ "expectedLocale": "latest",
47
+ "actualLocale": "slow",
48
+ "actualTranslation": "Stale",
49
+ "problemReproduced": true
50
+ },
51
+ "instanceIsolation": {
52
+ "first": {
53
+ "locale": "en_US",
54
+ "translation": "Hello"
55
+ },
56
+ "second": {
57
+ "locale": "zh_CN",
58
+ "translation": "独立实例"
59
+ },
60
+ "passed": true
61
+ },
62
+ "prototypeMessageKeys": {
63
+ "values": [
64
+ {
65
+ "key": "constructor",
66
+ "expected": "constructor",
67
+ "actualType": "function",
68
+ "returnedString": false
69
+ },
70
+ {
71
+ "key": "toString",
72
+ "expected": "toString",
73
+ "actualType": "function",
74
+ "returnedString": false
75
+ }
76
+ ],
77
+ "interpolationError": {
78
+ "name": "TypeError",
79
+ "message": "message.replace is not a function"
80
+ },
81
+ "problemReproduced": true
82
+ },
83
+ "prototypeInterpolationKey": {
84
+ "expected": "Value: {toString}",
85
+ "actual": "Value: function toString() { [native code] }",
86
+ "problemReproduced": true
87
+ },
88
+ "shallowObjectKeys": {
89
+ "inputDescription": "{ first: undefined } 与 { second: undefined }",
90
+ "expected": false,
91
+ "actual": true,
92
+ "problemReproduced": true
93
+ },
94
+ "reactSSR": {
95
+ "expected": "完成服务端渲染",
96
+ "error": {
97
+ "name": "Error",
98
+ "message": "Missing getServerSnapshot, which is required for server-rendered content. Will revert to client rendering."
99
+ },
100
+ "problemReproduced": true
101
+ },
102
+ "reactObjectSelector": {
103
+ "expected": "稳定渲染,状态更新后 DOM 从 en_US 变为 zh_CN",
104
+ "selectorKind": "named",
105
+ "stateUpdates": 1,
106
+ "before": "en_US",
107
+ "after": "zh_CN",
108
+ "renderCount": 2,
109
+ "warnings": [],
110
+ "error": null,
111
+ "problemReproduced": false
112
+ },
113
+ "reactInlineObjectSelector": {
114
+ "expected": "稳定渲染,状态更新后 DOM 从 en_US 变为 zh_CN",
115
+ "selectorKind": "inline",
116
+ "stateUpdates": 1,
117
+ "before": "en_US",
118
+ "after": "zh_CN",
119
+ "renderCount": 2,
120
+ "warnings": [],
121
+ "error": null,
122
+ "problemReproduced": false
123
+ },
124
+ "vueProviderStoreReplacement": {
125
+ "before": "first",
126
+ "expectedAfter": "second",
127
+ "actualAfter": "first",
128
+ "problemReproduced": true
129
+ }
130
+ }
131
+ }
@@ -16,3 +16,22 @@
16
16
  ## 扩展约束
17
17
 
18
18
  新增语言时必须同时补充词条加载器、`APP_LOCALE_ADAPTERS`、antd locale 包、Pro Components intl 以及 Day.js locale 导入,并执行 `pnpm i18n:check` 与前端构建。
19
+
20
+ ## CLI 调用边界注释
21
+
22
+ 状态:已实现,依据 [需求文档](./需求文档.md) 的 CLI 调用边界注释支持要求;执行证据见 [测试报告](./测试报告.md)。
23
+
24
+ 扫描器在调用名后、左括号后和解析出的静态字符串后使用同一个内部方法跳过空白、`//` 行注释及 `/* ... */` 块注释。行注释以 LF、CR、U+2028 或 U+2029 结束,未闭合块注释视为未找到有效后续 token。原始源码不做预处理或删除,因此词条正文、转义和源码行列位置保持精确。
25
+
26
+ 字符串解析仍由原有逻辑处理;边界注释之后只接受既有引号、逗号或右括号,不放宽动态表达式限制。扫描器仍按文本扫描全文,保持注释或普通字符串内完整调用也会被提取的既有约定。
27
+
28
+ ## React selector 快照缓存
29
+
30
+ 状态:2026-10-09 验证通过。React hook 使用 `useMemo([store, selector])` 创建独立快照闭包,对同一 state 引用复用 selector 结果。具名和内联对象 selector 均稳定渲染,state 更新后 DOM 正确变化;这是快照稳定性修复,尚未提供跨 state 的选择结果相等比较,也未增加 SSR 快照。完整发布结论仍以 [发布评估](./发布评估.md) 为准。
31
+
32
+ ## 变更记录
33
+
34
+ | 日期 | 摘要 | 影响范围 | 原因 |
35
+ | ---------- | --------------------------------------------------------- | -------------------- | --------------------------------------- |
36
+ | 2026-10-08 | 实现调用边界跳过空白与注释,并支持 Unicode 行终止符的定位 | CLI 扫描器及源码位置 | 防止合法静态调用漏提取及 clean 误删译文 |
37
+ | 2026-10-09 | 记录 React selector 快照缓存与当前版本发布复验范围 | React hook、发布检查 | 用户修改后重新检查发布准备情况 |
@@ -17,8 +17,26 @@
17
17
  2. 切换到英文后,antd、Pro Components、Day.js 和 `<html lang>` 均使用英文配置;切回中文后恢复中文配置。
18
18
  3. 新增语言时只需扩展集中式映射,并能明确补充对应组件库和 Day.js locale。
19
19
 
20
+ ## 独立包发布评估
21
+
22
+ - 状态:2026-10-09 复验完成;CLI 注释提取及 React 对象 selector 缓存均已验证通过,四包构建成功,但发布入口、实际 tarball、CLI 打包、core 类型检查及剩余运行时缺陷仍阻止直接发布。此次仅检查发布准备情况,未修改业务实现或执行发布。
23
+ - 范围:`packages/i18n/` 下的 core、React、Vue、CLI 四个包。
24
+ - 验收:检查包边界、公开入口、构建与类型产物、依赖转换、包外消费及已有测试,区分发布阻塞与后续增强建议。
25
+ - 评估结果与执行证据归档于 [发布评估](./发布评估.md)。
26
+
27
+ ## CLI 调用边界注释支持
28
+
29
+ - 状态:已实现;CLI 71 个测试、构建及修改文件的格式、lint、类型检查通过。
30
+ - 范围:保留文本扫描方式,在调用名与左括号之间、左括号与静态字符串之间、静态字符串与逗号或右括号之间,将空白、行注释和块注释作为可跳过的分隔内容。
31
+ - 字符串内部的注释符号属于词条正文,必须原样保留;注释后仍是动态表达式时继续忽略。
32
+ - 保留既有行为:注释或普通字符串内出现完整静态 `tr()` 调用时仍会提取。
33
+ - 验收:带边界注释的静态调用能被提取;未闭合块注释不匹配;行列位置正确;`sync --clean` 保留对应已有翻译,只删除真正未使用的词条。
34
+
20
35
  ## 变更记录
21
36
 
22
- | 日期 | 变更摘要 | 影响范围 | 原因 |
23
- | --- | --- | --- | --- |
24
- | 2026-09-19 | 明确应用 locale 必须同时驱动 antd、Pro Components、Day.js 与 `<html lang>` | React Web 全局入口与 locale 配置 | 补充国际化联动要求 |
37
+ | 日期 | 变更摘要 | 影响范围 | 原因 |
38
+ | ---------- | -------------------------------------------------------------------------- | ---------------------------------- | ------------------------------------------ |
39
+ | 2026-09-19 | 明确应用 locale 必须同时驱动 antd、Pro Components、Day.js 与 `<html lang>` | React Web 全局入口与 locale 配置 | 补充国际化联动要求 |
40
+ | 2026-10-08 | 增加 i18n 独立包发布可行性评估范围 | i18n 四个包的发布准备情况 | 检查当前方案是否可以作为包发布;本次仅评估 |
41
+ | 2026-10-08 | 补充 CLI 调用边界注释支持与清理回归验收 | CLI 扫描器、同步清理、扫描规则说明 | 修复合法静态调用带注释时漏提取的问题 |
42
+ | 2026-10-09 | 重新验证当前版本的独立发布准备情况,重点复验 React selector 快照缓存 | i18n 四包、发布评估与执行证据 | 用户修改后要求再次确认能否发布 |
@@ -40,10 +40,12 @@ interface LoginResult {
40
40
  | `POST /auth/login` | `LoginRequest` | `LoginResult` | 识别终端并创建或替换对应槽位会话 |
41
41
  | `POST /auth/logout` | Bearer Token 可选 | `{ loggedOut: true }` | 幂等退出;无有效格式令牌也返回成功 |
42
42
  | `GET /auth/me` | Bearer Token | `{ id, name, account, terminal }` | 返回当前启用用户及终端 |
43
+ | `POST /auth/change-password` | Bearer Token、`ChangePasswordRequest` | `ChangePasswordResult` | 本人改密并撤销该用户全部终端会话;详见[修改密码技术契约](../修改密码/技术契约.md) |
44
+ | `POST /platform/accounts/:userId/reset-password` | Bearer Token、`ResetAccountPasswordRequest` | `ResetAccountPasswordResult` | 平台内置管理员重置他人密码并撤销目标全部终端会话;详见[修改密码技术契约](../修改密码/技术契约.md) |
43
45
 
44
46
  当前没有 `/auth/refresh`,也没有 `refreshToken` 字段。
45
47
 
46
- 当前基线仍没有本人改密或平台管理员重置他人密码的接口。[修改密码需求](../修改密码/需求文档.md)处于实施中,其新增路径、共享类型、权限和错误码已在[修改密码技术契约](../修改密码/技术契约.md)明确;实现与验收完成前不属于上表的现行接口。
48
+ 本人改密与平台管理员重置已进入当前工作树实现。两接口的共享类型、权限、错误码和安全事件统一以[修改密码技术契约](../修改密码/技术契约.md)为准;已执行及未覆盖的验证见[修改密码测试报告](../修改密码/测试报告.md)。
47
49
 
48
50
  ## 4. Redis 会话约束
49
51
 
@@ -59,7 +61,7 @@ interface LoginResult {
59
61
  - 同终端并发登录以最后成功写入的槽位为准,旧 Token 因槽位不再匹配而失效。
60
62
  - 停用账号时撤销全部终端会话;撤销失败则停用事务不得声称成功。
61
63
  - 每次受保护请求都必须确认会话存在且用户仍处于 active 状态。
62
- - 待实施的本人改密和管理员重置成功后均撤销目标账号全部终端会话;撤销失败则密码事务回滚。登录须在用户行共享锁内复核最新密码摘要,防止旧密码并发登录在撤销后重新建立会话。详见[修改密码技术契约](../修改密码/技术契约.md)。
64
+ - 本人改密和管理员重置成功后均撤销目标账号全部终端会话;撤销失败则密码事务回滚。登录在用户行共享锁内复核最新密码摘要,防止旧密码并发登录在撤销后重新建立会话。详见[修改密码技术契约](../修改密码/技术契约.md)。
63
65
 
64
66
  ## 6. Cookie 契约
65
67
 
@@ -88,6 +90,7 @@ Path=/; SameSite=Lax; Secure=<当前页面是否为 HTTPS>
88
90
 
89
91
  | 日期 | 摘要 | 影响范围 | 原因 |
90
92
  | --- | --- | --- | --- |
93
+ | 2026-10-08 | 将双密码接口及全端撤销规则纳入当前工作树契约,关联实际验证边界 | 认证、会话与登录 | 同步已实现的接口并避免宣称未完成的浏览器验收 |
91
94
  | 2026-10-08 | 关联修改密码实施契约和全端撤销、并发登录约束,保持现行接口与待实施接口分界 | 认证、会话与登录 | 支持本期密码维护开发且不提前宣称接口可用 |
92
95
  | 2026-09-30 | 明确本人改密与管理员重置尚无现行接口,并链接待实施需求 | 认证接口、共享类型与会话 | 区分已确认业务需求和当前可用契约 |
93
96
  | 2026-09-17 | 固化当前 Redis Session 契约,并隔离尚未确认的 Refresh Token 迁移目标 | Server、Web、shared | 防止历史设计讨论被误认为现有接口 |
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## 1. 文档状态
4
4
 
5
- - 状态:当前 Redis Session 基线有效;修改密码后的会话撤销规则实施中;令牌演进部分待单独确认实施契约。
5
+ - 状态:当前 Redis Session 基线有效;修改密码后的全端撤销规则已在当前工作树实现,浏览器与部署验证边界见[修改密码测试报告](../修改密码/测试报告.md);令牌演进部分待单独确认实施契约。
6
6
  - 整理日期:2026-09-17。
7
7
  - 当前实现依据:`apps/server/src/modules/auth/`、`packages/shared/src/types/auth.ts`。
8
8
  - 技术边界见 [技术契约](./技术契约.md)。
@@ -74,14 +74,15 @@
74
74
  - Refresh Token 使用 HttpOnly Cookie 还是其他受控载体,以及 CSRF 防护方案。
75
75
  - 哪些接口属于必须实时读取共享 Auth State 的高风险接口。
76
76
 
77
- ## 7. 实施中:修改密码后的会话规则
77
+ ## 7. 当前实现:修改密码后的会话规则
78
78
 
79
- [修改密码需求文档](../修改密码/需求文档.md)已确认本人改密及平台管理员重置他人密码的业务规则,实施契约见[修改密码技术契约](../修改密码/技术契约.md)。本人改密成功后撤销该用户全部终端会话,当前端返回登录页;管理员重置成功后撤销目标账号全部终端会话,操作者会话不受影响。会话撤销失败不得把密码操作报告为成功,密码保持原值。实施时还须防止旧密码并发登录在撤销后创建新会话。代码和验收完成前,上述能力不是当前有效基线。
79
+ [修改密码需求文档](../修改密码/需求文档.md)已确认本人改密及平台管理员重置他人密码的业务规则,接口与并发约束见[修改密码技术契约](../修改密码/技术契约.md)。当前工作树中,本人改密成功后撤销该用户全部终端会话,前端返回登录页;管理员重置成功后撤销目标账号全部终端会话,操作者会话不受影响。会话撤销失败时密码写入回滚,不报告成功;登录在用户行锁内复核摘要,防止旧密码并发登录在撤销后创建新会话。自动化与隔离 PostgreSQL/Redis 专项证据见[修改密码测试报告](../修改密码/测试报告.md),浏览器端到端与部署验证仍待补充。
80
80
 
81
81
  ## 8. 变更记录
82
82
 
83
83
  | 日期 | 摘要 | 影响范围 | 原因 |
84
84
  | --- | --- | --- | --- |
85
+ | 2026-10-08 | 将修改密码全端撤销和登录并发规则同步为当前工作树实现,关联实际测试边界 | 认证、会话与密码维护 | 消除实施中描述与当前代码的状态偏差 |
85
86
  | 2026-10-08 | 关联修改密码实施契约,补充撤销失败回滚与并发登录约束 | 认证、会话与密码维护 | 使待实施会话规则与设计和接口契约一致 |
86
87
  | 2026-09-30 | 标明本人改密与管理员重置后的全端会话撤销为待实施需求 | 认证、会话与账号密码维护 | 与新增修改密码需求同步,避免将未实现的规则误写成当前基线 |
87
88
  | 2026-09-17 | 从本机 Codex 历史和当前实现整理认证、终端会话及令牌演进边界 | 认证与会话 | 避免把当前 Redis Session 与历史讨论的 Refresh Token 目标混为一套现行契约 |
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## 1. 状态与依据
4
4
 
5
- - 状态:待实施;页面与交互依据已确认需求编排,实际验收以实现和测试记录为准。
5
+ - 状态:当前有效交互依据;页面与交互已在当前工作树实现,自动化验证范围及浏览器端到端待补项见[测试报告](./测试报告.md)。
6
6
  - 需求来源:[修改密码需求文档](./需求文档.md)。现行会话规则见[会话管理需求文档](../会话管理/需求文档.md)。
7
7
  - 本文只描述用户可见流程;服务端权限、接口、错误和一致性以[技术契约](./技术契约.md)为准。
8
8
 
@@ -52,4 +52,5 @@
52
52
 
53
53
  | 日期 | 摘要 | 影响范围 | 原因 |
54
54
  | --- | --- | --- | --- |
55
+ | 2026-10-08 | 关联当前前端实现及自动化验证记录,保留浏览器联调待补边界 | Web 账号操作、工作空间选择页、平台账号列表 | 使交互文档状态与工作树代码和证据一致 |
55
56
  | 2026-10-08 | 增补本人改密和平台重置的入口、页面流程与验收映射 | Web 账号操作、工作空间选择页、平台账号列表 | 为已确认需求提供实施和验收所需的交互依据 |
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## 1. 状态与依赖
4
4
 
5
- - 状态:待实施;以下是本期前后端实施与联调契约,接口在实现和验收完成前不得标为现行可用。
5
+ - 状态:当前有效实现契约;两个接口已在当前工作树实现,自动化与隔离存储专项结果及待补验证见[测试报告](./测试报告.md)。该状态不表示已部署上线或完整产品验收。
6
6
  - 业务规则以[需求文档](./需求文档.md)为准;交互流程见[PRD](./PRD.md),事务与并发取舍见[设计方案](./设计方案.md)。
7
7
  - 认证沿用[会话管理技术契约](../会话管理/技术契约.md)的 Redis Session;HTTP 成功正文、统一失败结构与 `x-request-id` 遵循[API 与错误技术契约](../../07.API与错误/技术契约.md)。
8
8
 
@@ -49,7 +49,7 @@ interface ResetAccountPasswordResult {
49
49
 
50
50
  ## 4. 公开错误与失败行为
51
51
 
52
- 失败按统一 `ApiFailure` 返回,不回显请求字段值、密码摘要或原始异常。下表中的错误码为本期拟新增或复用的稳定码;`COMMON.VALIDATION_FAILED` 可包含安全清洗后的字段详情。
52
+ 失败按统一 `ApiFailure` 返回,不回显请求字段值、密码摘要或原始异常。下表中的错误码为本期新增或复用的稳定码;`COMMON.VALIDATION_FAILED` 可包含安全清洗后的字段详情。
53
53
 
54
54
  | 场景 | HTTP | 公开码 | 密码与会话 |
55
55
  | --- | --- | --- | --- |
@@ -89,4 +89,5 @@ interface ResetAccountPasswordResult {
89
89
 
90
90
  | 日期 | 摘要 | 影响范围 | 原因 |
91
91
  | --- | --- | --- | --- |
92
+ | 2026-10-08 | 同步双接口在当前工作树的实现状态及验证边界 | Server、Web、shared、Redis Session、平台审计 | 使契约状态与代码及实际测试证据一致 |
92
93
  | 2026-10-08 | 确定双接口、共享类型、权限、错误、全端撤销一致性与安全事件契约 | Server、Web、shared、Redis Session、平台审计 | 将待实施业务需求转为可联调且可验收的技术边界 |