pz-cli 5.0.0__py3-none-any.whl

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 (399) hide show
  1. pz_cli-5.0.0.dist-info/METADATA +51 -0
  2. pz_cli-5.0.0.dist-info/RECORD +399 -0
  3. pz_cli-5.0.0.dist-info/WHEEL +4 -0
  4. pz_cli-5.0.0.dist-info/entry_points.txt +5 -0
  5. pz_core/__init__.py +64 -0
  6. pz_core/__main__.py +7 -0
  7. pz_core/app.py +45 -0
  8. pz_core/assembly/__init__.py +17 -0
  9. pz_core/assembly/app_discovery.py +1240 -0
  10. pz_core/assembly/apps/__init__.py +25 -0
  11. pz_core/assembly/apps/compiler.py +824 -0
  12. pz_core/assembly/apps/providers.py +188 -0
  13. pz_core/assembly/cli/__init__.py +9 -0
  14. pz_core/assembly/cli/compiler.py +166 -0
  15. pz_core/assembly/diagnostics/__init__.py +21 -0
  16. pz_core/assembly/diagnostics/checks.py +257 -0
  17. pz_core/assembly/diagnostics/dev_sources.py +569 -0
  18. pz_core/assembly/events/__init__.py +5 -0
  19. pz_core/assembly/events/compiler.py +219 -0
  20. pz_core/assembly/extensions/__init__.py +5 -0
  21. pz_core/assembly/extensions/compiler.py +696 -0
  22. pz_core/assembly/infra/__init__.py +6 -0
  23. pz_core/assembly/infra/compiler.py +272 -0
  24. pz_core/assembly/lifecycle/__init__.py +5 -0
  25. pz_core/assembly/lifecycle/compiler.py +95 -0
  26. pz_core/assembly/middlewares/__init__.py +19 -0
  27. pz_core/assembly/middlewares/compiler.py +508 -0
  28. pz_core/assembly/project/__init__.py +7 -0
  29. pz_core/assembly/project/compiler.py +9 -0
  30. pz_core/assembly/project/context.py +17 -0
  31. pz_core/assembly/project/discovery.py +227 -0
  32. pz_core/assembly/resources/__init__.py +19 -0
  33. pz_core/assembly/resources/compiler.py +310 -0
  34. pz_core/assembly/resources/settings.py +129 -0
  35. pz_core/assembly/routes/__init__.py +7 -0
  36. pz_core/assembly/routes/compiler.py +400 -0
  37. pz_core/assembly/runtime_manifests/__init__.py +13 -0
  38. pz_core/assembly/runtime_manifests/compiler.py +159 -0
  39. pz_core/assembly/settings/__init__.py +17 -0
  40. pz_core/assembly/settings/compiler.py +786 -0
  41. pz_core/assembly/settings/host_project_overrides.py +82 -0
  42. pz_core/assembly/settings/host_runtime_endpoint.py +207 -0
  43. pz_core/authoring/__init__.py +79 -0
  44. pz_core/authoring/app_init_service.py +946 -0
  45. pz_core/authoring/app_versions.py +814 -0
  46. pz_core/authoring/cli.py +192 -0
  47. pz_core/authoring/commands.py +1810 -0
  48. pz_core/authoring/conflicts.py +180 -0
  49. pz_core/authoring/dev_bindings.py +916 -0
  50. pz_core/authoring/dev_git.py +1087 -0
  51. pz_core/authoring/dev_import.py +1061 -0
  52. pz_core/authoring/dev_manifest.py +522 -0
  53. pz_core/authoring/dev_sources.py +1638 -0
  54. pz_core/authoring/env_cli.py +454 -0
  55. pz_core/authoring/files.py +109 -0
  56. pz_core/authoring/ide_projection.py +1129 -0
  57. pz_core/authoring/naming.py +58 -0
  58. pz_core/authoring/official_dev_sources.py +432 -0
  59. pz_core/authoring/official_sources.json +156 -0
  60. pz_core/authoring/orchestration_service.py +558 -0
  61. pz_core/authoring/project_default.jsonc +53 -0
  62. pz_core/authoring/project_defaults.py +88 -0
  63. pz_core/authoring/project_metadata_service.py +199 -0
  64. pz_core/authoring/project_settings_checks.py +51 -0
  65. pz_core/authoring/project_settings_cli.py +299 -0
  66. pz_core/authoring/project_settings_service.py +1700 -0
  67. pz_core/authoring/project_state.py +399 -0
  68. pz_core/authoring/publish_git.py +423 -0
  69. pz_core/authoring/publish_lock.py +188 -0
  70. pz_core/authoring/publish_source.py +195 -0
  71. pz_core/authoring/release.py +1382 -0
  72. pz_core/authoring/repo_keys.py +29 -0
  73. pz_core/authoring/root_cli.py +28 -0
  74. pz_core/authoring/scaffold_service.py +325 -0
  75. pz_core/authoring/sync_service.py +787 -0
  76. pz_core/authoring/templates/app/__init__.py +1 -0
  77. pz_core/authoring/templates/app/api.py +25 -0
  78. pz_core/authoring/templates/app/apps.py +31 -0
  79. pz_core/authoring/templates/app/auth_package_init.py +14 -0
  80. pz_core/authoring/templates/app/auth_readme.py +29 -0
  81. pz_core/authoring/templates/app/configs_package_init.py +14 -0
  82. pz_core/authoring/templates/app/default_env.py +18 -0
  83. pz_core/authoring/templates/app/default_jsonc.py +25 -0
  84. pz_core/authoring/templates/app/locales_readme.py +25 -0
  85. pz_core/authoring/templates/app/migrations_readme.py +19 -0
  86. pz_core/authoring/templates/app/models.py +14 -0
  87. pz_core/authoring/templates/app/package_init.py +8 -0
  88. pz_core/authoring/templates/app/pages_base.py +161 -0
  89. pz_core/authoring/templates/app/pages_readme.py +25 -0
  90. pz_core/authoring/templates/app/public.py +31 -0
  91. pz_core/authoring/templates/app/pyproject.py +77 -0
  92. pz_core/authoring/templates/app/readme.py +74 -0
  93. pz_core/authoring/templates/app/settings.py +46 -0
  94. pz_core/authoring/templates/app/static_app_js.py +24 -0
  95. pz_core/authoring/templates/app/static_readme.py +31 -0
  96. pz_core/authoring/templates/app/template_config_page.py +23 -0
  97. pz_core/authoring/templates/app/template_index_html.py +28 -0
  98. pz_core/authoring/templates/app/templates_readme.py +32 -0
  99. pz_core/authoring/templates/app/urls.py +36 -0
  100. pz_core/authoring/templates/app/views.py +36 -0
  101. pz_core/authoring/templates/project/__init__.py +1 -0
  102. pz_core/authoring/templates/project/agents.py +51 -0
  103. pz_core/authoring/templates/project/apps_container_readme.py +37 -0
  104. pz_core/authoring/templates/project/main_py.py +59 -0
  105. pz_core/authoring/templates/project/project_env.py +19 -0
  106. pz_core/authoring/templates/project/pyproject.py +26 -0
  107. pz_core/authoring/templates/project/pz_env_env.py +65 -0
  108. pz_core/authoring/templates/project/pz_env_jsonc.py +69 -0
  109. pz_core/authoring/templates/project/pz_jsonc.py +12 -0
  110. pz_core/authoring/templates/project/readme.py +94 -0
  111. pz_core/authoring/templates/project/root_gitkeep.py +8 -0
  112. pz_core/authoring/templates/shared/__init__.py +5 -0
  113. pz_core/authoring/templates/shared/text.py +10 -0
  114. pz_core/authoring/venv_service.py +87 -0
  115. pz_core/authoring/workspace.py +167 -0
  116. pz_core/cli.py +291 -0
  117. pz_core/cli_options.py +74 -0
  118. pz_core/core/__init__.py +3 -0
  119. pz_core/core/errors/__init__.py +5 -0
  120. pz_core/core/errors/models.py +117 -0
  121. pz_core/core/events/__init__.py +5 -0
  122. pz_core/core/events/registry.py +54 -0
  123. pz_core/core/extensions/__init__.py +51 -0
  124. pz_core/core/extensions/registry.py +790 -0
  125. pz_core/core/health/__init__.py +6 -0
  126. pz_core/core/health/contracts.py +10 -0
  127. pz_core/core/middlewares/__init__.py +6 -0
  128. pz_core/core/middlewares/models.py +24 -0
  129. pz_core/core/routing/__init__.py +5 -0
  130. pz_core/core/routing/models.py +21 -0
  131. pz_core/core/settings_contracts.py +25 -0
  132. pz_core/docs/README.md +20 -0
  133. pz_core/docs/distribution-README.md +438 -0
  134. pz_core/docs/pz/345/221/275/344/273/244/346/200/273/350/247/210.md +1011 -0
  135. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/00-pz/346/236/266/346/236/204/346/200/273/347/272/262.md +240 -0
  136. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/01-/347/233/256/345/275/225/344/270/216/345/210/206/345/261/202/350/247/204/350/214/203.md +216 -0
  137. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/02-/345/214/205/344/270/216/345/210/206/345/217/221/350/247/204/350/214/203.md +403 -0
  138. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/03-App/346/234/200/345/260/217/345/255/220/345/214/205/350/247/204/350/214/203.md +571 -0
  139. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/04-Settings/344/270/216/351/205/215/347/275/256/350/247/204/350/214/203.md +1177 -0
  140. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/05-/350/265/204/346/272/220/344/270/216/350/277/220/350/241/214/347/233/256/345/275/225/350/247/204/350/214/203.md +575 -0
  141. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/06-/346/225/260/346/215/256/345/272/223/344/270/216/345/217/257/351/200/211/345/237/272/347/241/200/350/256/276/346/226/275/350/247/204/350/214/203.md +499 -0
  142. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/07-App/346/233/277/346/215/242/350/247/204/350/214/203.md +206 -0
  143. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/08-/345/271/263/345/217/260/347/272/247App/344/270/216/350/277/220/350/241/214/346/227/266/345/215/225/344/276/213/350/247/204/350/214/203.md +445 -0
  144. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/09-CLI/344/270/216Worker/345/205/245/345/217/243/350/247/204/350/214/203.md +950 -0
  145. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/10-/346/265/213/350/257/225/344/270/216/345/245/221/347/272/246/350/247/204/350/214/203.md +1001 -0
  146. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/11-/344/273/223/345/272/223/347/234/237/347/233/270/346/272/220/345/234/260/345/233/276.md +102 -0
  147. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/12-/346/236/204/345/273/272/344/270/216/345/217/221/345/270/203/346/243/200/346/237/245/346/270/205/345/215/225.md +171 -0
  148. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/13-/346/255/243/345/274/217Facade/346/200/273/350/241/250.md +402 -0
  149. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/14-/345/210/206/345/261/202/344/270/216/346/211/251/345/261/225/350/247/204/350/214/203.md +550 -0
  150. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/15-/345/255/220/345/214/205/345/274/200/345/217/221/344/275/277/347/224/250/346/211/213/345/206/214.md +1004 -0
  151. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/16-/346/211/251/345/261/225/347/202/271/346/255/243/345/274/217/345/215/217/350/256/256/346/270/205/345/215/225.md +352 -0
  152. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/17-pz.protocols.v1/346/255/243/345/274/217/345/215/217/350/256/256.md +266 -0
  153. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/18-/346/211/251/345/261/225/347/202/271/345/206/262/347/252/201/350/243/201/345/206/263/346/200/273/350/241/250.md +131 -0
  154. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/19-/351/224/231/350/257/257/347/240/201/344/270/216/350/257/212/346/226/255/345/215/217/350/256/256.md +176 -0
  155. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/20-/347/247/201/346/234/211/345/214/205/344/273/223/344/270/216/347/273/237/344/270/200/350/256/244/350/257/201/351/203/250/347/275/262/350/247/204/350/214/203.md +243 -0
  156. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/21-contrib/347/272/246/345/256/232/344/270/216Provider/346/216/245/345/205/245/350/247/204/350/214/203.md +365 -0
  157. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/22-/345/244/232/345/233/275/350/257/255/350/250/200/350/265/204/346/272/220/346/262/273/347/220/206/344/270/216/346/214/211/351/234/200/345/212/240/350/275/275/350/247/204/350/214/203.md +912 -0
  158. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/23-/351/246/226/345/261/217/345/261/225/347/244/272/344/270/216/351/246/226/345/270/247/347/250/263/345/256/232/350/247/204/350/214/203.md +269 -0
  159. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/24-pz/345/220/257/345/212/250/344/270/216/350/277/220/350/241/214/346/227/266/347/274/226/350/257/221/346/265/201/347/250/213.md +245 -0
  160. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/25-/351/235/242/345/220/221/345/257/271/350/261/241/345/274/200/345/217/221/350/247/204/350/214/203.md +300 -0
  161. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/README.md +98 -0
  162. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/archive//344/270/255/351/227/264/346/200/201/00-legacy_core/346/240/207/345/207/206pip/345/214/205/345/214/226/351/207/215/346/236/204/346/200/273/347/272/262.md +1073 -0
  163. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/archive//344/270/255/351/227/264/346/200/201/01-/347/233/256/345/275/225/344/270/216/345/210/206/345/261/202/351/207/215/346/236/204/346/211/247/350/241/214/346/226/271/346/241/210.md +224 -0
  164. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/archive//344/270/255/351/227/264/346/200/201/02-/345/214/205/344/270/216/345/210/206/345/217/221/350/247/204/350/214/203-/345/220/253/345/216/206/345/217/262/345/217/243/345/276/204.md +671 -0
  165. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/archive//344/270/255/351/227/264/346/200/201/13-/344/270/200/346/254/241/346/200/247/345/256/236/346/226/275/346/270/205/345/215/225.md +387 -0
  166. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/archive//344/270/255/351/227/264/346/200/201/14-/345/255/220/345/214/205/351/200/202/351/205/215/346/224/271/351/200/240/346/270/205/345/215/225.md +592 -0
  167. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/archive//344/270/255/351/227/264/346/200/201/15-infra/350/243/201/345/211/252/344/270/216/350/220/275/344/275/215/346/270/205/345/215/225.md +81 -0
  168. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/archive//344/270/255/351/227/264/346/200/201/19-core/345/215/225/344/270/200/346/255/243/345/274/217/346/226/271/346/241/210/346/224/266/346/225/233/346/211/247/350/241/214/346/270/205/345/215/225.md +161 -0
  169. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/archive//344/270/255/351/227/264/346/200/201/25-/345/215/217/350/256/256/345/210/260/346/272/220/347/240/201/345/267/256/350/267/235/346/270/205/345/215/225.md +377 -0
  170. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/archive//344/270/255/351/227/264/346/200/201/26-cutover/345/256/214/345/267/245/346/243/200/346/237/245/346/270/205/345/215/225.md +117 -0
  171. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/archive//344/270/255/351/227/264/346/200/201/29-/345/244/232/345/233/275/350/257/255/350/250/200/350/265/204/346/272/220/346/262/273/347/220/206/344/270/216/346/214/211/351/234/200/345/212/240/350/275/275/350/247/204/350/214/203-/345/220/253/350/277/201/347/247/273/347/255/226/347/225/245.md +956 -0
  172. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/archive//344/270/255/351/227/264/346/200/201/99-/350/265/204/346/272/220/346/224/266/345/217/243/345/220/216/347/273/255TODO.md +84 -0
  173. pz_core/docs//345/217/221/347/211/210/345/211/215/346/270/205/345/215/225-4.0.11.md +84 -0
  174. pz_core/docs//346/226/260/346/211/213/346/214/207/345/215/227.md +422 -0
  175. pz_core/infra/__init__.py +17 -0
  176. pz_core/infra/db/__init__.py +23 -0
  177. pz_core/infra/db/contracts.py +73 -0
  178. pz_core/infra/health/__init__.py +5 -0
  179. pz_core/infra/health/contracts.py +8 -0
  180. pz_core/infra/kv/__init__.py +5 -0
  181. pz_core/infra/kv/contracts.py +17 -0
  182. pz_core/infra/observability/__init__.py +23 -0
  183. pz_core/infra/observability/contracts.py +142 -0
  184. pz_core/infra/resilience/__init__.py +5 -0
  185. pz_core/infra/resilience/contracts.py +17 -0
  186. pz_core/infra/resources/__init__.py +5 -0
  187. pz_core/infra/resources/contracts.py +16 -0
  188. pz_core/infra/settings/__init__.py +17 -0
  189. pz_core/infra/settings/models.py +81 -0
  190. pz_core/infra/storage/__init__.py +5 -0
  191. pz_core/infra/storage/ports.py +27 -0
  192. pz_core/project_root_commands.py +282 -0
  193. pz_core/project_runtime_cli.py +344 -0
  194. pz_core/project_sources.py +253 -0
  195. pz_core/pz_launcher.py +209 -0
  196. pz_core/root_cli.py +70 -0
  197. pz_core/runtime/__init__.py +229 -0
  198. pz_core/runtime/access.py +86 -0
  199. pz_core/runtime/adapters/__init__.py +5 -0
  200. pz_core/runtime/adapters/base.py +18 -0
  201. pz_core/runtime/asyncio_bridge.py +18 -0
  202. pz_core/runtime/bindings/__init__.py +5 -0
  203. pz_core/runtime/bindings/container.py +50 -0
  204. pz_core/runtime/cli/__init__.py +5 -0
  205. pz_core/runtime/cli/_args.py +67 -0
  206. pz_core/runtime/cli/app_commands.py +417 -0
  207. pz_core/runtime/cli/check.py +214 -0
  208. pz_core/runtime/cli/db.py +297 -0
  209. pz_core/runtime/cli/main.py +89 -0
  210. pz_core/runtime/cli/resources.py +280 -0
  211. pz_core/runtime/discovery.py +23 -0
  212. pz_core/runtime/environment_integrity.py +157 -0
  213. pz_core/runtime/errors.py +5 -0
  214. pz_core/runtime/events.py +87 -0
  215. pz_core/runtime/facades/__init__.py +38 -0
  216. pz_core/runtime/facades/_capabilities.py +46 -0
  217. pz_core/runtime/facades/cache.py +103 -0
  218. pz_core/runtime/facades/database.py +71 -0
  219. pz_core/runtime/facades/events.py +380 -0
  220. pz_core/runtime/facades/health.py +101 -0
  221. pz_core/runtime/facades/mail.py +121 -0
  222. pz_core/runtime/facades/observability.py +102 -0
  223. pz_core/runtime/facades/providers.py +75 -0
  224. pz_core/runtime/facades/resources.py +52 -0
  225. pz_core/runtime/facades/storage.py +296 -0
  226. pz_core/runtime/health/__init__.py +5 -0
  227. pz_core/runtime/health/service.py +102 -0
  228. pz_core/runtime/host.py +188 -0
  229. pz_core/runtime/host_runner.py +282 -0
  230. pz_core/runtime/http/__init__.py +20 -0
  231. pz_core/runtime/http/app.py +576 -0
  232. pz_core/runtime/http_timing.py +173 -0
  233. pz_core/runtime/invocation.py +29 -0
  234. pz_core/runtime/json_safe.py +47 -0
  235. pz_core/runtime/lifecycle/__init__.py +25 -0
  236. pz_core/runtime/lifecycle/manager.py +533 -0
  237. pz_core/runtime/plan.py +214 -0
  238. pz_core/runtime/plan_context.py +33 -0
  239. pz_core/runtime/plan_snapshot.py +177 -0
  240. pz_core/runtime/registries/__init__.py +27 -0
  241. pz_core/runtime/registries/capabilities.py +101 -0
  242. pz_core/runtime/registries/providers.py +396 -0
  243. pz_core/runtime/resource_assets.py +344 -0
  244. pz_core/runtime/run_cli.py +211 -0
  245. pz_core/runtime/settings.py +888 -0
  246. pz_core/runtime/worker/__init__.py +21 -0
  247. pz_core/runtime/worker/engine.py +921 -0
  248. pz_core/runtime/worker/runtime.py +25 -0
  249. pz_core/testing/__init__.py +15 -0
  250. pz_core/testing/doc_route_contracts.py +305 -0
  251. pz_core/utils/__init__.py +44 -0
  252. pz_core/utils/env.py +65 -0
  253. pz_core/utils/project_jsonc/__init__.py +29 -0
  254. pz_core/utils/project_jsonc/document.py +420 -0
  255. pz_core/utils/project_settings.py +99 -0
  256. pz_foundation/__init__.py +50 -0
  257. pz_foundation/_contracts.py +81 -0
  258. pz_foundation/_errors.py +34 -0
  259. pz_foundation/api.py +14 -0
  260. pz_foundation/apps.py +127 -0
  261. pz_foundation/auth/__init__.py +1 -0
  262. pz_foundation/cache_control.py +233 -0
  263. pz_foundation/cli/__init__.py +2 -0
  264. pz_foundation/cli/workers.py +565 -0
  265. pz_foundation/configs/__init__.py +0 -0
  266. pz_foundation/configs/default.env +15 -0
  267. pz_foundation/configs/default.jsonc +452 -0
  268. pz_foundation/db/__init__.py +94 -0
  269. pz_foundation/db/aerich_executor.py +664 -0
  270. pz_foundation/db/config.py +358 -0
  271. pz_foundation/db/connection_manager.py +689 -0
  272. pz_foundation/db/connection_probe.py +204 -0
  273. pz_foundation/db/database.py +1291 -0
  274. pz_foundation/db/deps.py +47 -0
  275. pz_foundation/db/lifecycle_status.py +85 -0
  276. pz_foundation/db/migrations.py +477 -0
  277. pz_foundation/db/mysql.py +57 -0
  278. pz_foundation/db/postgresql.py +409 -0
  279. pz_foundation/db/production_pool_fallback.py +143 -0
  280. pz_foundation/db/public.py +45 -0
  281. pz_foundation/db/session.py +369 -0
  282. pz_foundation/db/sqlite.py +15 -0
  283. pz_foundation/db/tortoise_manager.py +724 -0
  284. pz_foundation/db/tortoise_psycopg.py +148 -0
  285. pz_foundation/docs/README.md +18 -0
  286. pz_foundation/docs/distribution-README.md +319 -0
  287. pz_foundation/docs/infra/350/243/201/345/211/252/344/270/216/350/220/275/344/275/215/350/257/264/346/230/216.md +39 -0
  288. pz_foundation/docs//345/205/254/345/274/200/345/205/215/350/264/271/346/216/245/345/217/243/351/230/262/346/273/245/347/224/250/344/270/216/344/272/272/346/234/272/346/240/241/351/252/214.md +680 -0
  289. pz_foundation/docs//350/256/276/350/256/241/346/226/207/346/241/243.md +288 -0
  290. pz_foundation/docs//350/267/257/347/224/261/344/270/216URL/345/244/204/347/220/206/350/247/204/350/214/203.md +119 -0
  291. pz_foundation/health.py +105 -0
  292. pz_foundation/host/__init__.py +11 -0
  293. pz_foundation/host/builder.py +34 -0
  294. pz_foundation/host/cache_runtime.py +44 -0
  295. pz_foundation/host/db/__init__.py +17 -0
  296. pz_foundation/host/db/aerich_config.py +36 -0
  297. pz_foundation/host/db/config.py +106 -0
  298. pz_foundation/host/db/connection_manager.py +48 -0
  299. pz_foundation/host/db/deps.py +5 -0
  300. pz_foundation/host/db/orm_retry_patch.py +566 -0
  301. pz_foundation/host/db/request_adapter.py +325 -0
  302. pz_foundation/host/db/router.py +28 -0
  303. pz_foundation/host/db/session.py +284 -0
  304. pz_foundation/host/db/tortoise_manager.py +10 -0
  305. pz_foundation/host/idempotency.py +132 -0
  306. pz_foundation/host/lifespan.py +247 -0
  307. pz_foundation/host/redis_runtime.py +100 -0
  308. pz_foundation/host/web.py +790 -0
  309. pz_foundation/infra_provider.py +236 -0
  310. pz_foundation/kv/__init__.py +25 -0
  311. pz_foundation/kv/cache.py +1166 -0
  312. pz_foundation/kv/deps.py +84 -0
  313. pz_foundation/kv/public.py +25 -0
  314. pz_foundation/kv/redis_manager.py +1531 -0
  315. pz_foundation/lazy_exports.py +43 -0
  316. pz_foundation/lazy_imports.py +124 -0
  317. pz_foundation/lifecycle.py +392 -0
  318. pz_foundation/managed_workers.py +1117 -0
  319. pz_foundation/middlewares/__init__.py +26 -0
  320. pz_foundation/middlewares/_settings.py +250 -0
  321. pz_foundation/middlewares/analytics.py +124 -0
  322. pz_foundation/middlewares/cache_control.py +156 -0
  323. pz_foundation/middlewares/compression.py +202 -0
  324. pz_foundation/middlewares/cors.py +62 -0
  325. pz_foundation/middlewares/geo_country.py +44 -0
  326. pz_foundation/middlewares/inner_router.py +50 -0
  327. pz_foundation/middlewares/rate_limited/__init__.py +3 -0
  328. pz_foundation/middlewares/rate_limited/key_limiter.py +115 -0
  329. pz_foundation/middlewares/request_logging.py +104 -0
  330. pz_foundation/middlewares/route_owner.py +309 -0
  331. pz_foundation/middlewares/security_csrf.py +44 -0
  332. pz_foundation/middlewares/security_headers/__init__.py +4 -0
  333. pz_foundation/middlewares/security_headers/conflicts.py +44 -0
  334. pz_foundation/middlewares/security_headers/csp_nonce.py +200 -0
  335. pz_foundation/middlewares/security_headers/security_headers.py +44 -0
  336. pz_foundation/migrations/__init__.py +1 -0
  337. pz_foundation/migrations/pz_foundation/__init__.py +1 -0
  338. pz_foundation/models.py +22 -0
  339. pz_foundation/notifications/__init__.py +23 -0
  340. pz_foundation/notifications/email.py +542 -0
  341. pz_foundation/notifications/public.py +31 -0
  342. pz_foundation/observability/__init__.py +71 -0
  343. pz_foundation/observability/http.py +34 -0
  344. pz_foundation/observability/logger/__init__.py +49 -0
  345. pz_foundation/observability/logger/_bot_settings.py +126 -0
  346. pz_foundation/observability/logger/bot_message.py +592 -0
  347. pz_foundation/observability/logger/core.py +385 -0
  348. pz_foundation/observability/logger/delivery_audit.py +84 -0
  349. pz_foundation/observability/logger/feishu_bot.py +199 -0
  350. pz_foundation/observability/logger/telegram_bot.py +194 -0
  351. pz_foundation/observability/metrics.py +365 -0
  352. pz_foundation/observability/runtime.py +68 -0
  353. pz_foundation/public.py +405 -0
  354. pz_foundation/resources/__init__.py +12 -0
  355. pz_foundation/resources/builder.py +900 -0
  356. pz_foundation/resources/images.py +363 -0
  357. pz_foundation/root_cli.py +20 -0
  358. pz_foundation/routing/__init__.py +203 -0
  359. pz_foundation/routing/canonical.py +486 -0
  360. pz_foundation/routing/convertors.py +82 -0
  361. pz_foundation/routing/declarations.py +843 -0
  362. pz_foundation/routing/exports.py +148 -0
  363. pz_foundation/routing/loaders.py +138 -0
  364. pz_foundation/routing/manifest.py +215 -0
  365. pz_foundation/routing/manifest_provider.py +47 -0
  366. pz_foundation/routing/mounts.py +101 -0
  367. pz_foundation/routing/ordering.py +172 -0
  368. pz_foundation/routing/registry.py +133 -0
  369. pz_foundation/routing/utils.py +28 -0
  370. pz_foundation/runtime.py +234 -0
  371. pz_foundation/settings.py +253 -0
  372. pz_foundation/settings_normalization.py +130 -0
  373. pz_foundation/storage/__init__.py +25 -0
  374. pz_foundation/storage/local.py +209 -0
  375. pz_foundation/storage/public.py +106 -0
  376. pz_foundation/storage/s3.py +116 -0
  377. pz_foundation/storage/service.py +234 -0
  378. pz_foundation/urls.py +19 -0
  379. pz_foundation/utils/__init__.py +6 -0
  380. pz_foundation/utils/merge.py +160 -0
  381. pz_foundation/worker_replicas.py +55 -0
  382. pz_settings_center/__init__.py +5 -0
  383. pz_settings_center/api/__init__.py +5 -0
  384. pz_settings_center/api/runtime_overrides.py +360 -0
  385. pz_settings_center/apps.py +28 -0
  386. pz_settings_center/configs/__init__.py +0 -0
  387. pz_settings_center/configs/default.env +2 -0
  388. pz_settings_center/configs/default.jsonc +1 -0
  389. pz_settings_center/docs/01-settings_center/350/203/275/345/212/233/350/276/271/347/225/214.md +124 -0
  390. pz_settings_center/docs/README.md +12 -0
  391. pz_settings_center/docs/distribution-README.md +150 -0
  392. pz_settings_center/docs//350/256/276/350/256/241/346/226/207/346/241/243.md +48 -0
  393. pz_settings_center/integration_payload.py +18 -0
  394. pz_settings_center/project_helpers.py +405 -0
  395. pz_settings_center/public.py +139 -0
  396. pz_settings_center/routing_helpers.py +73 -0
  397. pz_settings_center/runtime_override_provider.py +61 -0
  398. pz_settings_center/typed_settings.py +324 -0
  399. pz_settings_center/urls.py +9 -0
@@ -0,0 +1,575 @@
1
+ # 项目目录、资源与运行目录规范
2
+
3
+ > 本文涉及 settings 时统一采用单一路径:Python 运行时代码只允许 `import pz_settings_center.public as settings_center`,并通过 `settings_center.settings.<app_id>.<field>` 读取。
4
+
5
+ ## 1. 目标
6
+
7
+ 项目目录、资源目录与运行态文件系统策略必须适用于标准安装包场景。
8
+
9
+ 核心原则:
10
+ - 目录边界统一由 `ProjectContext` 提供
11
+ - 包目录视为只读
12
+ - 一切运行态输出写入外部目录
13
+ - 长期身份、账号、记忆、浏览器环境等资产写入项目资产目录,不写入 `.runtime`
14
+ - 资源覆盖顺序只取决于 `installed_apps`
15
+
16
+ ## 2. 目录角色定义
17
+
18
+ `pz` 运行时只允许依赖以下一等目录概念:
19
+
20
+ - `project_dir`
21
+ - 项目配置与项目级扩展的根目录
22
+ - `cache_dir`
23
+ - 可删除后重建的派生产物目录
24
+ - `runtime_dir`
25
+ - 当前部署实例的运行态目录
26
+ - `asset_dir`
27
+ - 不可删除的持久资产与业务文件目录
28
+
29
+ ### 2.0 `project_dir`
30
+
31
+ `project_dir` 是项目级配置与项目级 app 扩展的锚点,不等于:
32
+
33
+ - `pz` 包安装目录
34
+ - 当前 shell 的任意 `cwd`
35
+ - 某个固定仓库根目录
36
+
37
+ 统一发现顺序:
38
+
39
+ 1. 显式 CLI 参数 `--project-dir`
40
+ 2. 环境变量 `PZ_PROJECT_DIR`
41
+ 3. 当前目录向上搜索 `pz.jsonc`
42
+
43
+ 正式要求:
44
+
45
+ - `project_dir`、`cache_dir`、`runtime_dir`、`asset_dir` 统一由 `ProjectContext` 或项目级 typed accessor 提供
46
+ - Web / CLI / worker / app / adapter 只能消费当前 `RuntimePlan.project` 或等价 `ProjectContext`
47
+ - 不允许任何调用方绕过 `ProjectContext` 自行拼目录
48
+
49
+ 禁止:
50
+
51
+ - 从 `cwd`、repo root、模块文件路径反推目录
52
+ - 从历史 `upload_path`、`worker_storage_path` 再次推导项目持久根
53
+ - 从 helper 内部临时重建 project context
54
+
55
+ ### 2.1 `cache_dir`
56
+
57
+ 用于存放可重建产物,例如:
58
+ - 合并后的 `templates`
59
+ - 合并后的 `static`
60
+ - 合并后的 `locales`
61
+ - 合并后的 `pages`
62
+ - 合并后的 `template_config`
63
+ - 合并后的 `migrations`
64
+ - 迁移聚合产物
65
+
66
+ 特点:
67
+ - 可删除后重建
68
+ - 不应承载业务真相数据
69
+
70
+ ### 2.2 `runtime_dir`
71
+
72
+ 用于存放运行期状态,例如:
73
+ - lock files
74
+ - pid files
75
+ - sockets
76
+ - 临时目录
77
+ - 本地运行标记
78
+
79
+ 特点:
80
+ - 面向当前进程或当前部署环境
81
+ - 可在重启后重新生成
82
+
83
+ ### 2.3 `asset_dir`
84
+
85
+ `asset_dir` 是不可删除持久文件的正式根目录。
86
+
87
+ 用于存放:
88
+ - 上传内容、本地 storage backend 数据、worker 共享文件输入输出等需要跨重启保留的业务文件
89
+ - actor / identity / persona / memory / relationship 等影响力资产
90
+ - 平台账号上下文、账号绑定、浏览器环境 inventory
91
+ - 资产索引、证据引用索引、发布历史索引
92
+
93
+ 约束:
94
+ - 项目内开发默认固定为 `<project_dir>/.assets`
95
+ - `.assets` 是不可删除目录,不是运行 cache;不得被 `pz clean runtime` 或普通运行时清理当作可删除目录
96
+ - `.runtime` 只承载可删除、可重建的 materialized profile、workdir、pid、lock、cache 和短窗账本
97
+ - `storage` 默认本地 backend 的 `base_dir` 应明确落在 `asset_dir` 下
98
+ - 不应继续默认使用相对 `"uploads"`、`"var/media"` 一类历史路径
99
+ - 资产目录通常应进入 `.gitignore`,真实 secret / cookie / token 不应进入仓库
100
+
101
+ ### 2.4 目录访问接口的单一路径原则
102
+
103
+ 目录访问接口必须统一,避免每层各自发明 path helper。
104
+
105
+ 正式要求:
106
+
107
+ - 目录访问统一通过 `ProjectContext` 或其 typed accessors 完成
108
+ - `cache_dir/resources`、`cache_dir/migrations`、`runtime_dir/locks`、`asset_dir/uploads`、`asset_dir/<owner>` 这类子路径,应由统一 accessor 生成
109
+ - app/独立子包 不得定义自己的 project root/path root/helper 作为正式公共依赖
110
+
111
+ 不允许:
112
+
113
+ - `resource_root()`
114
+ - `repo_root()`
115
+ - `pkg_root()`
116
+ - `uploads_root()`
117
+ - `worker_storage_root()`
118
+
119
+ ### 2.5 作者面 IDE 影子投影
120
+
121
+ PyCharm 与 VS Code 都是作者面工具,不属于运行时目录模型。为了让 IDE 精确识别业务仓真实 app 与 linked app,PZ 编译一次可见 app 投影,再交给已有 IDE 目录对应的 provider:
122
+
123
+ - `.idea/pz.generated.sources.iml`:PZ 唯一拥有的生成 module
124
+ - `.idea/modules.xml`:PZ 只拥有指向上述 module 的精确 entry,其余 XML 内容全部属于用户/IDE
125
+ - `.vscode/settings.json`:PZ 只拥有自己插入的 `python.analysis.extraPaths` 数组项
126
+ - `.vscode/pz.generated.sources.json`:记录上一轮成功同步中由 PZ 插入的 VS Code paths,不参与 VS Code 读取
127
+
128
+ 正式约束:
129
+
130
+ - 影子投影只包含 content/source root metadata,不复制任何源码、模板、静态资源、配置或文档
131
+ - PyCharm 中业务仓 app 使用项目相对 `apps/<app_id>`,linked app 使用 canonical 叶子源码根
132
+ - VS Code 统一使用 `${workspaceFolder}/apps/<visible-leaf-path>`,通过项目可见 binding 访问 linked 叶子,不写入外部绝对路径
133
+ - 不得把整个 `.sources`、整个 monorepo checkout、未绑定叶子或生成目录登记为 source root
134
+ - 更新必须使用结构化 XML / JSONC API;VS Code 通过状态账本只移除 PZ 旧条目,并保留用户路径、注释与其他 settings
135
+ - `.idea/` 或 `.vscode/` 不存在时,对应 provider 返回 `not_applicable`,不得由 PZ 主动创建 IDE project 目录
136
+ - VS Code 双文件更新使用 staging 与事务 journal;受控失败恢复旧文件,中断后由下一次 sync 恢复或完成
137
+ - 生成 module 与 machine-local entry 必须被 Git 忽略,不得进入 wheel、sdist、发布 tag 的 package scope 或共享配置
138
+ - VS Code 状态账本在 Git 项目中通过 `.git/info/exclude` 精确忽略,不修改共享 `.gitignore`
139
+ - 影子投影不进入 `ProjectContext`、`RuntimePlan`、`SettingsSnapshot.import_roots`、资源发现或 import precedence
140
+ - 唯一原子写入口是 `pz dev ide sync`;`pz dev add/link/unlink/branch/update` 只通过编排调用它
141
+
142
+ ## 3. 默认路径
143
+
144
+ 项目内开发默认值:
145
+ - `project_dir = "."`
146
+ - `cache_dir = ".runtime/cache"`
147
+ - `runtime_dir = ".runtime/run"`
148
+ - `asset_dir = ".assets"`
149
+
150
+ 系统级部署默认值:
151
+ - `project_dir = "/srv/<project>"`
152
+ - `cache_dir = "/var/cache/pz/<project>"`
153
+ - `runtime_dir = "/var/run/pz/<project>"`
154
+ - `asset_dir = "/var/lib/pz/<project>"`
155
+
156
+ ## 3.1 多实例与权限约束
157
+
158
+ 从实际部署角度,目录规范还必须覆盖多实例和权限边界。
159
+
160
+ 要求:
161
+
162
+ - `runtime_dir` 必须允许按实例区分,避免同机多实例共享锁与 socket
163
+ - `asset_dir` 必须具备清晰且严格的读写权限边界;不得默认暴露给 Web 静态目录扫描
164
+ - `cache_dir` 可共享与否必须显式决定,不能依赖“恰好同一路径”
165
+ - 若正式目录不存在且无法创建,或已存在但不可写,必须 fail-fast 并给出明确诊断
166
+
167
+ ## 4. 资源发现
168
+
169
+ 每个 app 可提供:
170
+ - `templates/`
171
+ - `static/`
172
+ - `locales/`
173
+ - `pages/`
174
+ - `template_config/`
175
+ - `migrations/`
176
+
177
+ 系统根据 `installed_apps` 顺序扫描这些目录。
178
+
179
+ 补充说明:
180
+ - `installed_apps` 若声明的是组织包,应先自动递归展开到最小叶子子包
181
+ - 真正参与资源发现与覆盖顺序计算的是展开后的叶子 app
182
+ - 宿主不应为了资源扫描再手工把组织包内所有叶子子包逐个列出
183
+ - 作者面对资源类型的正式配置入口是 `resources.items`
184
+ - 每个资源项至少声明 `name`
185
+ - 当前默认资源项为:
186
+ - `templates`
187
+ - `static`
188
+ - `locales`
189
+ - `pages`
190
+ - `template_config`
191
+ - `migrations`
192
+
193
+ 规则:
194
+ - 后出现的 app 覆盖先出现的同名资源
195
+ - 不再区分“官方容器优先”或“业务 app 优先”
196
+ - 唯一顺序真相源是 `installed_apps`
197
+
198
+ 补充要求:
199
+
200
+ - `templates/`、`static/`、`locales/`、`pages/`、`template_config/`、`migrations/` 都属于同一套正式资源覆盖语义
201
+ - `pz` 资源层的正式覆盖语义是文件级别覆盖,不承担页面声明或业务 payload 的 `dict` 级 merge
202
+ - 正式资源编译结果只保留统一资源项结果;每个资源项直接持有自己的 `name / source_dirs / output_dir`,不再维持目录名映射表或每类资源一个固定字段的第二套 facade
203
+ - `ResourceSource.items` 是单个 app 的资源发现结果
204
+ - `ResourceManifest.items` 是当前项目的统一资源编译结果
205
+ - 合并目录里的文件只是当前启动编译得到的运行时派生产物,不是作者面源码真相源
206
+ - 如果需要修改页面声明、模板声明、多语言文案、模板文件、静态文件或迁移文件,必须回到原始最小子包资源目录修改
207
+ - 不允许把 merged/cache 目录中的合并结果当成长期维护入口
208
+
209
+ 约束:
210
+ - 资源发现不应继续通过 `ResourcesMixin` 内部反推 repo root 或包路径特例来补默认源目录
211
+ - 资源发现应基于已解析的 installed_apps/app registry 和正式 project_dir/cache_dir 边界
212
+ - 不应继续保留依赖仓库布局的资源 token
213
+ - 不应再对某个官方 app 做内建特殊排序,例如模板层把 shared site UI owner 固定放到最后
214
+ - 不应继续由 core 内部 `merge_order` token 去扫描历史容器目录或旧业务根目录
215
+ - app 包根目录的定位应来自正式 app registry 元数据,而不是运行时再次 import package 反推
216
+
217
+ ## 5. 资源输出
218
+
219
+ 运行期聚合产物必须输出到外部目录,不再写回:
220
+ - 包目录
221
+ - 源码目录
222
+ - `site-packages`
223
+
224
+ 不得保留包内 merged 目录、源码目录或 `site-packages` 目录作为资源输出目标。
225
+
226
+ 补充约束:
227
+ - 合并服务的临时目录、old backup 目录、互斥锁目录也必须相对 `cache_dir/runtime_dir`
228
+ - 不应继续通过 `Path.cwd()` 解释相对 merged 路径
229
+ - `templates/static/locales/pages/template_config/migrations` 六类资源服务都应显式表达自己的源目录、目标目录、锁目录和临时目录
230
+
231
+ 正式要求:
232
+
233
+ - merged 目录是运行时消费面,不是编辑面
234
+ - `resources.output_root` 决定 merged 资源根目录
235
+ - `resources.manifest_name` 决定资源 manifest 文件名
236
+ - `resources.staging_dir` 决定原子切换前的 staging 目录名
237
+ - `resources.lock_name` 决定资源编译锁文件名
238
+ - 各类资源读取方只能把 merged 目录视为只读输入
239
+ - 作者修改必须发生在原始 app 资源目录;重新启动或重新编译后,再由正式资源合并链生成新的 merged 结果
240
+
241
+ ## 5.1 资源合并的原子性与一致性
242
+
243
+ 资源 merge 不只是“写到外部目录”,还必须保证失败时不会留下半成品状态。
244
+
245
+ 要求:
246
+
247
+ - merge 输出必须采用原子切换策略
248
+ - 不允许直接就地覆盖当前正在服务的目标目录
249
+ - merge 失败时应保留上一个可用版本,或明确暴露“当前无有效产物”状态
250
+ - 锁粒度、临时目录命名、清理策略必须可诊断
251
+
252
+ 正式要求:
253
+
254
+ - 使用:
255
+ - staging dir
256
+ - 校验完成后 rename/swap
257
+ - 旧版本延迟清理
258
+ - 将当前激活版本、构建时间、输入清单写入 manifest,便于诊断和回滚
259
+
260
+ ## 5.2 资源服务实例化边界
261
+
262
+ 资源服务的生命周期也必须符合正式运行模型,不能继续靠 import-time 单例维持。
263
+
264
+ 正式要求:
265
+
266
+ - `templates/static/locales/pages/template_config/migrations` 相关服务不得在模块导入期就基于全局 `settings` 创建单例
267
+ - 资源服务的源目录、目标目录、锁目录、manifest 路径必须来自当前 `ProjectContext` / `ResourceManifest`
268
+ - `ResourceManifest` 的输出目录必须按 `PZ_ENV` 分区,默认形态为 `<cache_dir>/<pz_env>/<resources.output_root>`;资源构建锁默认位于 `<runtime_dir>/<pz_env>/locks/<resources.lock_name>`,避免同一项目内 develop / product 并行运行时互相覆盖派生产物
269
+ - 同一进程内切换不同 `project_dir` 或重复创建 app 时,资源服务必须可重建,不得复用旧快照
270
+ - runtime 只消费已编译好的 `ResourceManifest` 与构建结果,不再通过 import-time service 反推目录
271
+
272
+ 禁止:
273
+
274
+ - 在 `core/resources/*` 导入时立即创建 `static_files_service`、`template_files_service`、`locales_files_service`、`pages_files_service`、`template_config_files_service`、`migration_files_service`
275
+ - 让资源服务依赖全局 settings 单例,而不是显式消费当前 `ProjectContext` / `ResourceManifest` 与 `settings_center.settings`
276
+ - 让模块级资源服务成为正式公共 API
277
+
278
+ ## 5.3 asset build 与资源优化执行边界
279
+
280
+ 资源 merge、asset build、图片优化、bundle/minify 都属于派生产物流程,但这些流程的执行边界必须继续细分。
281
+
282
+ 正式要求:
283
+
284
+ - Web `startup()`、`create_host_app()`、`create_app()` 不得默认触发 asset build / deploy / image generation
285
+ - `preflight` 中的 fail-fast 检查与优化型任务必须分离
286
+ - 图片生成、bundle/minify、静态优化若需要存在,只能作为显式命令、显式 preflight 子任务或显式编译步骤运行
287
+ - 图片响应式派生属于通用资源能力,正式 owner 是 `pz_foundation.resources`;强制覆盖同名派生产物的正式入口是 `pz resources images --force`
288
+ - 这些任务的输出、锁、临时目录、构建 manifest 统一落在当前 `cache_dir/runtime_dir`
289
+ - source 资产是作者真相源;develop / test 默认加载 source 资产,不得因为聚合产物文件存在而自动切到旧 bundle
290
+ - product 或显式资源合并开关才允许加载正式构建产物;若声明要加载的聚合产物缺失,运行时应保守回退到 source 资产或在显式检查阶段失败
291
+ - 非聚合 source 入口是 develop / test 的默认消费面,也是正式构建产物缺失时的保守 fallback;不得用 inline 补丁掩盖旧聚合产物
292
+
293
+ 禁止:
294
+
295
+ - 在 Web 启动链里 best-effort 执行 `ensure_built_and_deployed()` 后吞异常继续启动
296
+ - 在 `preflight.startup()` 里同时承担“阻断型检查”和“非阻断优化任务”
297
+ - 让生产首个请求路径隐式承担 asset 构建成本
298
+ - 在 develop / test 中因 `site.min.*` 文件存在而隐式加载旧聚合产物
299
+ - 通过 inline CSS / JS 为旧聚合产物打补丁,替代正式 asset build 或 source 回退
300
+
301
+ ## 6. 迁移输出
302
+
303
+ 多 app 迁移聚合的临时/合并产物也必须写入 `cache_dir`。
304
+
305
+ 正式路径:
306
+ - `<cache_dir>/migrations`
307
+
308
+ 要求:
309
+ - 迁移聚合过程使用并发锁保护
310
+ - 不得写回包目录
311
+ - 不得假设框架安装路径可写
312
+
313
+ 补充要求:
314
+
315
+ - 迁移聚合结果应有 manifest,记录:
316
+ - 参与 app
317
+ - owner
318
+ - 输入版本
319
+ - 生成时间
320
+ - 若聚合失败,不得留下“看起来成功但内容不完整”的目录快照
321
+
322
+ 补充约束:
323
+
324
+ - 迁移聚合工作空间不得写入 repo-root 或包内 merged 目录
325
+ - `db` CLI 若需要临时工作目录,必须显式落在当前 `cache_dir`
326
+ - 迁移工具不得通过临时 `PYTHONPATH` 注入、repo-root 推断、包内 `aerich.ini` 写入来弥补目录模型缺口
327
+ - 迁移文件格式修复、owner 推断、models 发现必须作为显式子命令或显式检查结果出现,不得在正式迁移主路径里偷偷补丁式修复
328
+
329
+ ## 7. 锁文件与临时文件
330
+
331
+ 所有锁文件、swap 目录、tmp 目录、合并中间目录应写入 `runtime_dir` 或 `cache_dir`。
332
+
333
+ 正式规则:
334
+ - 锁和进程相关文件放 `runtime_dir`
335
+ - 大型合并中间产物放 `cache_dir`
336
+ - asset build / merge / preflight 使用的锁统一放 `<runtime_dir>/locks`
337
+ - 文件锁只作为单机实例互斥手段,不作为跨主机/跨共享文件系统的正式协调机制
338
+
339
+ 约束:
340
+ - worker supervisor 锁不得默认落到系统临时目录
341
+ - 资源构建锁不得默认落到包目录旁
342
+ - 资源合并产生的 `.__*_tmp_*`、`.__*_old_*` 目录不应散落到项目当前工作目录
343
+ - 合并服务的路径 helper 不应在相对路径场景下回落到 `Path.cwd()`
344
+ - 若部署场景需要跨主机协调,应使用显式 capability 或外部基础设施,不继续复用本地 file lock 语义
345
+
346
+ ## 8. import 资源策略
347
+
348
+ 运行时统一通过包路径定位资源目录,但必须满足:
349
+ - 只读取包内资源
350
+ - 只向外部目录写入合并产物
351
+
352
+ 正式默认不支持 zipimport。
353
+
354
+ ## 8.1 i18n 与模块配置约束
355
+
356
+ 语言资源与模块配置要求:
357
+
358
+ - 继续从包内 `locales/` 发现源资源
359
+ - 将合并产物写入 `cache_dir`
360
+ - 但不得把“包内 merged 目录”当成唯一真相
361
+
362
+ 对于模块配置文件默认值:
363
+
364
+ - 页面相关 `module config` 的正式输入应来自 app `pages/base.jsonc`,并由 `pz_page_center` 统一编译
365
+ - app 若需要私有 JSON 文件,只能作为 app 内部实现细节存在,不得再作为正式页面配置入口
366
+ - `locales/config.json` 已退出 `module_config` 正式主链,不应再要求某个 import-time 全局服务先加载 merged locales
367
+ - settings runtime owner 不应通过模块级单例长期持有 merged locales 目录快照来间接驱动 `module_config`
368
+
369
+ ### 8.2 i18n / 模块配置 runtime 隔离
370
+
371
+ 从生产多实例、多项目复用角度,语言与模块配置 runtime 还必须满足隔离要求。
372
+
373
+ 正式要求:
374
+
375
+ - translation manager、module config manager、默认 locale/module 这类 runtime 状态不得通过模块级全局变量长期持有
376
+ - 相关 runtime 必须与当前 `ProjectContext` / `RuntimePlan` 绑定
377
+ - 同一进程内切换不同 `project_dir`、重复创建 app、或测试并行执行时,不得复用上一份 merged locales / module config 快照
378
+ - 若需要 lazy load,也必须是 context-bound lazy load,而不是 process-wide singleton lazy load
379
+
380
+ 禁止:
381
+
382
+ - 通过 `set_i18n_runtime_config()` 这一类全局 setter 维持正式运行态
383
+ - 通过包级 `translation_manager` / `module_config_manager` 代理对象充当长期稳定公共依赖面
384
+ - 在资源 merge 前基于旧 merged locales 快照提前完成全局同步
385
+
386
+ ## 9. 覆盖规则
387
+
388
+ 模板、静态、语言、页面声明、模板声明、迁移资源覆盖统一采用:
389
+ - `installed_apps` 后者覆盖前者
390
+
391
+ 不再额外引入:
392
+ - 容器目录特权顺序
393
+ - `business app` 保底强插队
394
+ - 隐式 priority
395
+
396
+ ## 10. 资产构建约束
397
+
398
+ 资源合并后的 bundle/minify 等资产构建:
399
+
400
+ - 只能读取包内资源和 `cache_dir` 中的合并结果
401
+ - 只能向 `cache_dir` 写入产物
402
+ - 不应由 core 直接依赖某个具体最小子包的 builder 实现
403
+
404
+ 约束:
405
+ - asset builder 的 project root 不应继续通过 `Path(__file__).parents[...]` 推断
406
+ - build 锁目录统一进入 `<runtime_dir>/locks`
407
+ - 若某个正式静态产物允许以“源码目录 + 统一构建”方式维护,例如 `default/js/base/` -> `default/js/base.js`,则源码目录只作为声明侧;runtime 与模板仍只能消费正式产物路径,不得把源码目录暴露成第二套运行时入口
408
+ - 这类源码目录的收口必须发生在正式 asset build 链内部,并且先于后续 bundle/minify;例如共享公开页最终仍只对外暴露 `base.js`、`site.min.js` 这类正式产物,而不是把源码分片列表变成页面脚本真相源
409
+ - 正式 bundle 的输入集合也必须符合职责边界,而不是只看“能不能拼进去”:共享公开页 bundle 应优先只包含共享且偏首屏/偏公共启动的资产;共享但非首屏的增强脚本,应继续通过已有 runtime loader 或页面声明位加载,不应为了省事全部卷回 `site.min.js`
410
+ - 同理,认证页专用脚本不应因为“刚好也在共享仓”就继续卷入共享公开页 bundle;若公开页只需要通用会话检查、登出或请求头能力,应把这部分收敛进 base/runtime 正式主链,而不是让 `auth.js` 反向成为公开页的基础依赖。
411
+ - 同理,若导航、语言推荐 banner、页脚语言入口都会触发同一套语言跳转与偏好持久化逻辑,这套逻辑也应统一收敛进共享 base/runtime 正式主链;不要把 `changeLanguage` 一会儿放在 `nav.js`,一会儿又让其它共享脚本各自 fallback 一套。
412
+ - 对浏览器会主动探测的根资源入口,例如 `/favicon.ico`、`/favicon-32x32.png`、`/favicon-16x16.png`、`/apple-touch-icon.png` 与 `/apple-touch-icon-precomposed.png`,若共享公开页已经有正式静态资产,则应由共享公开页子包提供稳定直出路由或等价正式入口;模板也应优先引用这些正式根入口,而不是再把公开 head 真相源写成 `/static/...`。
413
+ - 浏览器 head 中声明的图标资源必须与共享公开页实际提供的正式资产保持一致;若某个历史声明位对应的正式资产并不存在,例如 `mask-icon` 对应文件缺失,则应先移除悬空声明或补齐正式资产,不要长期保留会稳定产出 404 的 head 链接。
414
+ - 若某个历史脚本已经没有独立正式职责,只剩空壳、兼容标记或可被现有 bundle/runtme 直接吸收的极薄逻辑,应直接退出 asset build 的正式输入清单;不要让 bundle/minify 持续为无效资产背书
415
+ - 若页面需要区分 critical 与 deferred 脚本,critical 资产继续走正式 page bundle;deferred 资产必须通过页面声明位统一交给共享 runtime 加载,不能在模板或宿主中追加手写 `<script>` 清单。
416
+
417
+ ## 11. 资源服务与存储门面约束
418
+
419
+ 资源服务与存储门面应满足:
420
+
421
+ - 必须延迟创建
422
+ - 必须按 app context 重建
423
+ - 不在 import 阶段绑定首次加载时的 `settings`
424
+ - 失败语义明确,不以 best-effort 吞异常作为正式装配策略
425
+
426
+ 不允许:
427
+
428
+ - 在模块级直接创建 `static_files_service`、`template_files_service`、`locales_files_service` 并把目录永久绑定到首次导入时的 settings
429
+ - 本地存储 adapter 将 `file://` URL 作为长期对外公共访问契约
430
+ - 在 bootstrap 中直接改写这些全局服务的目录列表,然后立刻触发 merge / reload 外部模块级单例
431
+ - 在 resources bootstrap 中顺手调用:
432
+ - `module_config_manager.load_configs()`
433
+ - `translation_manager.reload_translations()`
434
+ 这类跨层全局刷新动作
435
+ - `attach_storage_to_context()` 失败时直接吞异常,导致 Web 运行起来但 storage backend 实际未完成装配
436
+ - 通过固定 `/uploads` 挂载把 `global_settings.upload_path` 暗中变成公开资源边界
437
+
438
+ 正式要求:
439
+
440
+ - merge 产物目录旁必须生成固定路径的资源 manifest:`<cache_dir>/resources/manifest.json`
441
+ - `manifest.json` 作为当前资源合并结果的唯一真相源
442
+ - 模板 renderer、static facade、translation facade、module config facade 只允许消费当前 manifest,不再各自重新扫描目录树推导结果
443
+ - 本地存储的公开访问 URL 由显式 mount/base_url 决定
444
+ - 若没有公开访问入口,只返回逻辑路径或受控下载路由,而不是宿主机文件路径
445
+ - static/uploads/media 公开挂载边界由当前 project context 的 mount 配置决定,而不是历史固定路由
446
+
447
+ ## 10.2 资源诊断与审计的单一路径原则
448
+
449
+ 资源体系的诊断面也必须唯一。
450
+
451
+ 正式要求:
452
+
453
+ - 资源相关诊断统一读取 `<cache_dir>/resources/manifest.json`
454
+ - debug 页面、CLI 诊断、preflight 检查、错误报告都只允许基于当前 manifest 输出
455
+ - 不允许某个诊断入口再次扫描文件系统,得出与 manifest 不一致的“另一份事实”
456
+
457
+ manifest 至少必须承载:
458
+
459
+ - 当前激活版本
460
+ - 输入 app 顺序
461
+ - 每类资源的来源 app 与源目录
462
+ - 输出目录与构建时间
463
+ - 冲突裁决结果
464
+
465
+ 结论:
466
+
467
+ - manifest 不只是 merge 副产物
468
+ - 它还是资源边界唯一审计视图
469
+
470
+ ## 11.1 资源与公开暴露的安全边界
471
+
472
+ 从工程实践看,目录外置之后还必须补齐资源暴露边界。
473
+
474
+ 要求:
475
+
476
+ - 不允许把整个 `runtime_dir` / `asset_dir` 直接公开挂载
477
+ - 只允许显式声明的子目录进入公开静态暴露面
478
+ - 模板、静态、上传、导出文件的公开路径应各自独立,不应混成一个“万能目录”
479
+ - 资源服务必须防止路径穿越和越界读取
480
+
481
+ 正式要求:
482
+
483
+ - 公开挂载基于显式白名单目录
484
+ - 公开下载统一走受控下载路径,不走宿主目录直出
485
+ - 任意由 app 提供的静态/模板路径都先归一化再参与 merge
486
+
487
+ ## 12. 模板与 i18n 运行时约束
488
+
489
+ 模板与 i18n 运行时应满足:
490
+
491
+ - 模板目录与语言目录可按当前 app/project context 重建
492
+ - 默认 locale/default module 不依赖模块级全局变量长期保存
493
+ - Jinja globals/filters 的注册必须可重入且可清理
494
+
495
+ 不允许:
496
+
497
+ - 将 merged templates/locales 路径在 import 阶段固化到全局模板环境
498
+ - 将默认 locale/module 仅保存在进程级 `_RUNTIME` 并跨项目上下文共享
499
+
500
+ 正式要求:
501
+
502
+ - 模板 renderer、translation facade、request 级 helper 分层
503
+ - 默认 locale/default module 从 settings snapshot 或 app context 解析,而不是从全局变量读取
504
+ - 模板环境与翻译运行时都必须从当前资源 manifest 和 settings snapshot 构造,不再自行猜测 merged 目录位置
505
+
506
+ 约束:
507
+ - i18n 同步逻辑不应在 bootstrap 阶段直接通过 merged locales `base/config.json` 改写全局 modules provider 和 middleware 配置
508
+ - 这类同步应进入当前 app context 的 i18n facade / registry
509
+ - 资源合并失败、翻译重载失败、模块配置重载失败也不应仅通过 warning 吞掉后继续依赖一组半初始化全局对象
510
+
511
+ ## 13. 日志与静态版本目录补充约束
512
+
513
+ 运行目录外置后,日志与静态资源版本辅助逻辑也应一起收口。
514
+
515
+ 要求:
516
+
517
+ - 默认日志目录应落到 `runtime_dir/logs`,或完全交给 stdout/stderr 与外部 collector
518
+ - 不应在 import `logger.core` 时就在当前工作目录创建 `logs/*`
519
+ - 静态资源版本追加逻辑若依赖文件 mtime,也必须绑定当前 app context 的 static facade
520
+
521
+ 日志输出目录与静态版本目录来源都必须绑定到当前 project context,并按 `runtime_dir/cache_dir` 边界收口。
522
+
523
+ ## 14. Asset Build 与 Preflight 约束
524
+
525
+ 资源 merge 之外,asset build/bundle/minify 也必须纳入同一目录边界。
526
+
527
+ 要求:
528
+
529
+ - asset build 只读取当前 app registry 导出的静态源与 `cache_dir` 中的 merge 结果
530
+ - bundle/minify 输出只能写到 `cache_dir`
531
+ - `create_app()` / `startup()` 不应默认 best-effort 触发 asset build
532
+ - preflight app 统一通过显式 task/CLI/worker 运行,不应在 Web 启动链里偷偷构建
533
+
534
+ ### 14.1 资源构建链的单一路径原则
535
+
536
+ 资源构建也必须收口为一条正式流水线。
537
+
538
+ 正式要求:
539
+
540
+ 1. 先基于 app registry 编译资源 manifest
541
+ 2. 再基于 manifest 执行 build/bundle/minify
542
+ 3. 构建结果写入 `cache_dir`
543
+ 4. 后续 runtime 只消费 manifest 与 build 输出
544
+
545
+ 页面或其它上层子域贡献 asset bundle 时,必须在运行时编译阶段写入
546
+ `RuntimePlan.runtime_manifests["resource.asset_bundles"]`。`pz` 资源 CLI 只消费该通用
547
+ manifest 键,不得直接 import `pz_page_center` 或其它业务子包公开面。
548
+
549
+ 禁止:
550
+
551
+ - preflight 自己再扫描 repo 目录
552
+ - asset builder 自己再推导项目根和 merge order
553
+ - runtime 再次临时 build 一遍静态资源
554
+ - 模板或 runtime 同时维护“源码分片直出”和“正式 bundle 产物”两套长期主链
555
+
556
+ 结论:
557
+
558
+ - resource merge 与 asset build 是一条编译链上的前后两步
559
+ - 不能拆成多套各自推导目录与顺序的实现
560
+ - 如果为了治理单文件过大而引入源码分片,也必须在这条编译链内先收口回正式产物,再参与后续 bundle/minify;源码分片不是新的公开资源合同
561
+
562
+ asset build 必须出清 repo-root、包内 merged 目录、`app/static` 这类布局假设,并按 manifest + `cache_dir` 的单一路径收口。
563
+
564
+ ## 15. Resource Merge Order 与 Preflight Image Overlay 约束
565
+
566
+ 资源 merge order 与 preflight 输出路径也必须完全切到 app registry / project dir 语义。
567
+
568
+ 要求:
569
+
570
+ - merge order 的唯一正式输入应是显式 app registry / installed_apps 顺序
571
+ - 不应继续支持任何 repo-layout token
572
+ - 不应继续对具体站点 UI / 站点能力 owner 做资源层硬编码特殊顺序
573
+ - preflight 派生资源若要写回项目目录,也必须写到显式 `cache_dir` 或单独声明的生成目录,而不是默认 `app/static`
574
+
575
+ 资源发现与 preflight 输出都必须出清仓库布局假设,并按 `project_dir + installed_apps` 决定资源边界的模型收口。