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,131 @@
1
+ # 扩展点冲突裁决总表
2
+
3
+ 本文档固定 `pz` 扩展点的统一冲突裁决规则。
4
+
5
+ ## 1. 总原则
6
+
7
+ - 冲突必须在编译期裁决
8
+ - 不允许静默覆盖
9
+ - 不允许按 import 顺序或最后加载者获胜
10
+ - 同优先级冲突默认直接报错
11
+
12
+ ## 2. 单例型扩展点
13
+
14
+ 以下扩展点在一个项目内最终只能有一个生效对象:
15
+
16
+ - `host.builder`
17
+
18
+ 裁决规则:
19
+
20
+ 1. 先按 `priority` 排序
21
+ 2. 最高优先级唯一者生效
22
+ 3. 若最高优先级不唯一,直接报错
23
+
24
+ ## 3. 多实例可并存扩展点
25
+
26
+ 以下扩展点默认允许多个对象并存:
27
+
28
+ - `settings.provider`
29
+ - `cli.tool`
30
+ - `route.contribution`
31
+ - `middleware.contribution`
32
+ - `lifecycle.contribution`
33
+ - `resource.contribution`
34
+
35
+ 裁决规则:
36
+
37
+ - `id` 不冲突时可并存
38
+ - 同类同 `id` 时进入冲突裁决
39
+
40
+ ## 4. `replace` 的适用范围
41
+
42
+ `replace` 不是通用字段,只适用于显式支持替换语义的扩展点。
43
+
44
+ v1 正式允许:
45
+
46
+ - `middleware.contribution`
47
+
48
+ v1 不允许:
49
+
50
+ - `host.builder`
51
+ - `settings.provider`
52
+ - `cli.tool`
53
+ - `route.contribution`
54
+ - `lifecycle.contribution`
55
+ - `resource.contribution`
56
+
57
+ ## 5. 各扩展点裁决规则
58
+
59
+ ### 5.1 `host.builder`
60
+
61
+ - 单例
62
+ - 按 `priority` 裁决
63
+ - 同优先级冲突直接报错
64
+
65
+ ### 5.2 `settings.provider`
66
+
67
+ - 默认可并存
68
+ - provider patch 在目标路径层面再做冲突检测
69
+ - 同目标路径同优先级冲突直接报错
70
+
71
+ ### 5.3 `cli.tool`
72
+
73
+ - 默认可并存
74
+ - `command` 路径冲突时按 `priority` 裁决
75
+ - 同优先级冲突直接报错
76
+
77
+ ### 5.4 `route.contribution`
78
+
79
+ - 默认可并存
80
+ - 路由实际冲突由 route manifest 编译器裁决
81
+ - 不允许依赖运行期去重和后处理重排兜底
82
+
83
+ ### 5.5 `middleware.contribution`
84
+
85
+ - 默认可并存
86
+ - 若显式 `replace=<middleware_id>`,则替换目标必须存在
87
+ - 多个对象同时替换同一目标时,按 `priority` 裁决
88
+ - 同优先级冲突直接报错
89
+
90
+ ### 5.6 `lifecycle.contribution`
91
+
92
+ - 默认可并存
93
+ - 排序按:
94
+ - `phase`
95
+ - app dependency order
96
+ - `priority`
97
+ - 同 `phase` 同 `id` 冲突直接报错
98
+
99
+ ### 5.7 `resource.contribution`
100
+
101
+ - 默认可并存
102
+ - 覆盖顺序不由 `priority` 主导,而由 `installed_apps` 展开顺序主导:按 `installed_apps` 从前到后合并,同相对路径资源由后面的 app 覆盖前面的 app
103
+ - `templates/`、`static/`、`locales/`、`pages/`、`template_config/` 都属于这套正式资源覆盖语义,不能在子系统里单独定义第二套扫描或优先级规则
104
+ - `migrations/` 也属于这套正式资源覆盖语义
105
+ - 运行时若消费 merged 资源目录,只能把它视为编译产物;作者修改必须回原始子包资源目录
106
+ - `priority` 只用于极少数明确声明的冲突裁决点
107
+
108
+ ## 6. 冲突输出最小结构
109
+
110
+ 所有冲突诊断至少应包含:
111
+
112
+ - `kind`
113
+ - `id`
114
+ - `owner_app`
115
+ - `code`
116
+ - `message`
117
+ - `contenders`
118
+ - `resolution`
119
+
120
+ 其中:
121
+
122
+ - `contenders`
123
+ - 冲突对象摘要列表
124
+ - `resolution`
125
+ - `error` / `selected:<id>` / `replaced:<id>`
126
+
127
+ ## 7. 正式结论
128
+
129
+ - 编译期冲突裁决是唯一正式冲突治理链
130
+ - `priority` 只用于显式裁决,不用于掩盖协议不清
131
+ - `replace` 只能出现在正式声明允许的扩展点上
@@ -0,0 +1,176 @@
1
+ # 错误码与诊断协议
2
+
3
+ 本文档固定 `pz` 基础层的错误码与诊断协议。
4
+
5
+ ## 1. 总原则
6
+
7
+ - 正式失败语义必须依赖稳定 `code`,不能依赖自由文本
8
+ - CLI、HTTP、编译器、检查器对同类错误应共享同一编码体系
9
+ - 诊断对象必须可机器读取、可测试、可审计
10
+
11
+ ## 2. 最小诊断对象
12
+
13
+ 所有正式诊断对象至少应包含:
14
+
15
+ - `code`
16
+ - `message`
17
+ - `stage`
18
+ - `owner`
19
+ - `action`
20
+
21
+ 按需字段:
22
+
23
+ - `detail`
24
+ - `scope`
25
+ - `severity`
26
+ - `request_id`
27
+ - `path`
28
+ - `app_id`
29
+ - `kind`
30
+
31
+ ## 3. 错误阶段分类
32
+
33
+ 正式 `stage` 集合:
34
+
35
+ - `project`
36
+ - `settings`
37
+ - `app_registry`
38
+ - `extensions`
39
+ - `runtime_plan`
40
+ - `cli`
41
+ - `http`
42
+ - `worker`
43
+ - `infra`
44
+
45
+ ## 4. 错误码前缀
46
+
47
+ 建议固定前缀:
48
+
49
+ - `PZ_PROJECT_*`
50
+ - `PZ_SETTINGS_*`
51
+ - `PZ_APP_*`
52
+ - `PZ_EXTENSION_*`
53
+ - `PZ_RUNTIME_PLAN_*`
54
+ - `PZ_CLI_*`
55
+ - `PZ_HTTP_*`
56
+ - `PZ_WORKER_*`
57
+ - `PZ_INFRA_*`
58
+
59
+ ## 5. 必须稳定编码的错误类别
60
+
61
+ ### 5.1 项目与配置
62
+
63
+ - project dir 无效
64
+ - `pz.jsonc` 无效
65
+ - 环境文件无效
66
+ - settings schema 冲突
67
+ - app settings provider 冲突
68
+ - runtime override 非法
69
+
70
+ ### 5.2 app 与扩展点
71
+
72
+ - 重复 `app_id`
73
+ - `required_pz` 不满足
74
+ - app dependency cycle
75
+ - 扩展点 `id` 冲突
76
+ - `host.builder` 冲突
77
+ - middleware replace 目标不存在
78
+ - lifecycle phase 非法
79
+
80
+ ### 5.3 运行图编译
81
+
82
+ - route manifest 冲突
83
+ - middleware manifest 冲突
84
+ - resource manifest 冲突
85
+ - CLI command 冲突
86
+ - `RuntimePlan` 缺失必要 section
87
+
88
+ ### 5.4 执行阶段
89
+
90
+ - host build 失败
91
+ - worker 启动失败
92
+ - infra 缺失
93
+ - request 级运行时错误
94
+
95
+ ### 5.5 Git release 与发布
96
+
97
+ - `PZ_PUB_GIT_REQUIRED`:当前仓库根不匹配目标且 `apps/.sources` 中没有可用 Git 仓库;中文消息固定为 `当前仓库根与 apps/.sources 中都没有可用的发布 Git 仓库:<app_id>`
98
+ - `PZ_PUB_APP_NOT_FOUND`:存在 Git 仓库,但未在其中发现目标子包;中文消息固定为 `未在 apps/.sources 的 Git 仓库中找到子包:<app_id>`
99
+ - `PZ_PUB_APP_AMBIGUOUS`:多个 Git 仓库发现同一目标子包;中文消息固定为 `在 apps/.sources 的多个 Git 仓库中发现同一子包:<app_id>`
100
+ - `PZ_PUB_SHARED_CHECKOUT_READ_ONLY`:唯一命中的 Git 仓库是外部共享只读 checkout;中文消息固定为 `apps/.sources 中的共享 Git 仓库为只读,无法发布子包:<app_id>`
101
+ - `PZ_PUB_GIT_DETACHED_HEAD`:目标 Git worktree 当前处于 detached HEAD
102
+ - `PZ_PUB_GIT_IDENTITY_MISSING`:Git author 或 tagger identity 未完整配置
103
+ - `PZ_PUB_GIT_INDEX_DIRTY`:Git index 已存在调用方 staged 内容
104
+ - `PZ_PUB_GIT_SCOPE_AMBIGUOUS`:未提交 shared-root 内容无法安全归属单一子包
105
+ - `PZ_PUB_RELEASE_COMMIT_CONFLICT`:当前 HEAD 或既有 release commit 与目标 app/version 不一致
106
+ - `PZ_PUB_TAG_CONFLICT`:目标 package tag 已存在但 commit 或 annotation 不一致
107
+ - `PZ_PUB_RELEASE_STATE_INVALID`:release commit、tag annotation、tagged `project.version` 或 wheel metadata 不一致
108
+ - `PZ_PUB_REMOTE_ARTIFACT_CONFLICT`:远端同 distribution/version artifact identity 或 hash 不一致
109
+
110
+ 上述错误统一使用 `stage=cli`,并携带 `app_id`、package path、distribution、version 与已完成 stage 等非敏感上下文。Git remote、publish URL 与底层异常输出必须先移除内嵌凭据。
111
+
112
+ ### 5.6 Dev 编排与 IDE 影子投影
113
+
114
+ - `PZ_DEV_CACHE_INVALID`:当前用户隔离的系统临时 Git cache root、lock、checkout 或 owner marker 无法通过 owner、权限、非符号链接或结构校验
115
+ - `PZ_DEV_CACHE_REMOTE_MISMATCH`:已有 cache 的 canonical remote identity 与请求仓库不一致
116
+ - `PZ_DEV_CACHE_REFRESH_FAILED`:cache fetch、分支更新或目标 revision 固定失败;不得静默回退到陈旧 revision
117
+ - `PZ_DEV_CACHE_RESOLUTION_MISSING`:import 或失败续跑无法证明 cache 中仍存在请求的 immutable full revision
118
+ - `PZ_DEV_IDE_PROJECT_INVALID`:已有 `.idea` / `.vscode` 不是可安全维护的真实目录,或 PyCharm project XML 不是可解析结构
119
+ - `PZ_DEV_IDE_VSCODE_SETTINGS_INVALID`:`.vscode/settings.json` 不是可保留更新的 JSONC,或 `python.analysis.extraPaths` 不是字符串数组
120
+ - `PZ_DEV_IDE_VSCODE_STATE_INVALID`:PZ-owned VS Code entry 状态账本缺失、损坏或与 settings 不一致
121
+ - `PZ_DEV_IDE_TRANSACTION_INCOMPLETE`:发现上次中断的 IDE 投影事务,需要先恢复或完成旧 pair
122
+ - `PZ_DEV_IDE_PROJECTION_INVALID`:可见 app 投影包含缺失、重复、越界、整个 checkout 或未绑定叶子 source root
123
+ - `PZ_DEV_IDE_SYNC_FAILED`:PZ-owned PyCharm/VS Code 投影无法完成 staged replace 或恢复
124
+ - `PZ_DEV_ORCHESTRATION_INCOMPLETE`:源码原子阶段已成功,但后续项目 source、settings、environment 或 IDE 原子阶段失败;按 `next_stage` 调用公开原子命令继续,具备可证明 provenance 的 `dev add` 可在重跑时自动跳过已完成导入
125
+
126
+ IDE 错误 detail 只允许暴露 project-relative path;linked external absolute path 必须脱敏或转换为 app/repo identity。编排错误必须报告 `completed_stages`、`next_stage` 与原始稳定错误码,不得通过删除业务源码、reset checkout 或覆盖用户 `.idea` 内容伪装全局回滚。
127
+
128
+ ### 5.7 App 版本解析与安装
129
+
130
+ - `PZ_APP_INDEX_QUERY_FAILED`:无法从正式索引读取目标 distribution 的版本信息
131
+ - `PZ_APP_VERSION_NOT_FOUND`:显式版本不存在,或默认解析没有得到可安装的稳定版本
132
+ - `PZ_APP_VERSION_INCOMPATIBLE`:候选版本不满足 Python、发行包依赖图或当前项目约束;app 声明中的 `required_pz` / protocol 仍由运行时编译合同校验
133
+ - `PZ_APP_SOURCE_OWNERSHIP_CONFLICT`:`app declare/add` 发现 `apps/<app_id>` 已由业务仓真实源码拥有,拒绝把 package 声明反向接管该路径
134
+ - `PZ_APP_VERSION_STATE_MISMATCH`:项目精确声明、`uv.lock` 与当前已安装 metadata 无法收敛到同一版本
135
+ - `PZ_APP_ORCHESTRATION_INCOMPLETE`:版本已解析或前置原子阶段已成功,但后续声明、安装、lock 或 settings 阶段失败,需要前向续跑
136
+
137
+ 版本错误统一使用 `stage=cli`,并携带 `app_id`、distribution、请求版本与经过脱敏的 index identity。认证信息、带凭据 URL 和底层工具原始命令行不得进入诊断输出。
138
+
139
+ `app add/update` 编排错误必须同时报告已选择的精确版本、`completed_stages` 与 `next_stage`;`app rm` 没有版本选择,只报告阶段信息。已成功的 declaration、lock、安装或 undeclare 阶段不得通过跨命令隐式回滚伪装成全局原子事务;`app add/update` 可按声明、lock 与 installed 状态自动跳过已完成原子阶段,其他情况按 `next_stage` 显式继续。
140
+
141
+ ## 6. 各入口输出协议
142
+
143
+ ### 6.1 CLI
144
+
145
+ - `--json` 模式下必须输出稳定错误对象
146
+ - exit code 非 `0` 时必须带 `code`
147
+
148
+ ### 6.2 HTTP
149
+
150
+ - error envelope 必须带 `code`
151
+ - request 级错误应带 `request_id`
152
+ - 公共 `message` 与内部 `detail` 必须分层
153
+
154
+ ### 6.3 CheckReport
155
+
156
+ - 每条检查项必须带:
157
+ - `code`
158
+ - `severity`
159
+ - `owner`
160
+ - `scope`
161
+
162
+ ## 7. 安全约束
163
+
164
+ 正式错误与诊断输出不得直接回显:
165
+
166
+ - 密码
167
+ - token
168
+ - DSN
169
+ - 宿主机绝对私有路径
170
+ - 原始第三方异常敏感文本
171
+
172
+ ## 8. 正式结论
173
+
174
+ - 错误码是正式协议,不是实现细节
175
+ - 同类错误不得在不同入口发明不同 code
176
+ - 没有稳定 `code` 的失败,不算完成协议设计
@@ -0,0 +1,243 @@
1
+ # 私有包仓与统一认证部署规范
2
+
3
+ 本文用于固定 `pz` 当前正式的私有包仓方案、安装口径与统一认证约定。
4
+
5
+ ## 1. 目标
6
+
7
+ 需要同时解决三件事:
8
+
9
+ - 正式安装不走 Git,而走标准 Python distribution
10
+ - 上传与下载安装使用同一套简单授权
11
+ - 浏览器访问、`pip`、`uv` 的行为保持一致
12
+
13
+ ## 2. 正式结论
14
+
15
+ 当前正式方案固定为:
16
+
17
+ - 私有包仓:`devpi`
18
+ - 对外入口:`HTTPS` 域名
19
+ - 反向代理:`Nginx Proxy Manager`
20
+ - 统一认证:入口层 `Basic Auth`
21
+ - 包仓协议:标准 PyPI-compatible simple index
22
+
23
+ 当前不采用的方案:
24
+
25
+ - 正式安装走 Git URL
26
+ - 正式发布物直接依赖本地源码 checkout
27
+ - 上传一套口令、下载安装另一套口令
28
+ - 匿名公开整个 `devpi` 站点
29
+
30
+ 一句话口径:
31
+
32
+ - 正式发布、上传、安装都走 `devpi`
33
+ - 正式访问统一走 `HTTPS`
34
+ - 上传与下载安装统一使用一组 Basic Auth 凭据
35
+
36
+ ## 3. 安装与源码边界
37
+
38
+ 必须严格区分:
39
+
40
+ - 源码获取 / 开发联调
41
+ - 正式安装 / 正式发布
42
+
43
+ 正式要求:
44
+
45
+ - Git 只负责源码获取、开发联调与版本管理
46
+ - `devpi` 才是正式安装与正式发布入口
47
+ - 用户侧正式安装只允许:
48
+ - `pip install ...`
49
+ - `uv add ...`
50
+ - `uv publish ...`
51
+
52
+ 不允许:
53
+
54
+ - 把 `git clone` 或 `pip install git+...` 当作正式安装方案
55
+ - 把本地工作区目录直接当成正式交付边界
56
+
57
+ ## 4. 当前正式拓扑
58
+
59
+ 正式链路固定为:
60
+
61
+ 1. 浏览器 / `pip` / `uv`
62
+ 2. `https://<private-domain>`
63
+ 3. `Nginx Proxy Manager`
64
+ 4. `Basic Auth`
65
+ 5. `devpi`
66
+ 6. 对应 index,例如 `packages/prod`
67
+
68
+ 当前实现要求:
69
+
70
+ - `devpi` 本身只监听内部回源地址
71
+ - 对外域名必须通过反向代理暴露
72
+ - `DEVPI_OUTSIDE_URL` 必须写最终对外 `HTTPS` 域名
73
+
74
+ 如果把 `DEVPI_OUTSIDE_URL` 写成:
75
+
76
+ - `http://<ip>:3141`
77
+ - `http://127.0.0.1:3141`
78
+ - 其它内部回源地址
79
+
80
+ 则 `devpi` 会把页面链接和静态资源生成为错误的 HTTP 地址,浏览器会出现 `Mixed Content`。
81
+
82
+ ## 5. 统一认证模型
83
+
84
+ 当前正式认证模型固定为两层共用一组凭据:
85
+
86
+ - 外层:Nginx Proxy Manager `Basic Auth`
87
+ - 内层:`devpi` 用户认证
88
+
89
+ 正式约定:
90
+
91
+ - Basic Auth 用户名 = `DEVPI_OWNER`
92
+ - Basic Auth 密码 = `DEVPI_OWNER_PASSWORD`
93
+ - `DEVPI_ROOT_PASSWORD` 只用于初始化与管理员维护,不作为日常安装/上传账号
94
+
95
+ 当前共享账号模型的定位:
96
+
97
+ - 用于统一浏览器访问
98
+ - 用于 `pip` 下载安装
99
+ - 用于 `uv` 下载安装
100
+ - 用于 `uv publish` 上传
101
+
102
+ 这样做的目的只有一个:
103
+
104
+ - 上传与下载安装只保留一组简单授权
105
+
106
+ ## 6. 反向代理硬约束
107
+
108
+ 如果使用 `Nginx Proxy Manager`,`Advanced` 配置必须包含:
109
+
110
+ ```nginx
111
+ auth_basic "Restricted devpi";
112
+ auth_basic_user_file /data/access/devpi.htpasswd;
113
+ proxy_set_header Authorization $http_authorization;
114
+ ```
115
+
116
+ 这三行缺一不可:
117
+
118
+ - `auth_basic` 负责统一入口认证
119
+ - `auth_basic_user_file` 负责 Basic Auth 口令文件
120
+ - `proxy_set_header Authorization $http_authorization;` 负责把同一组凭据继续透传给 `devpi`
121
+
122
+ 如果不透传 `Authorization`:
123
+
124
+ - 浏览器访问可能正常
125
+ - 但 `devpi` 上游拿不到上传认证头
126
+ - 结果会变成“能进站、不能上传”
127
+
128
+ ## 7. 正式命令示例
129
+
130
+ 假设:
131
+
132
+ - 用户名:`packages`
133
+ - 密码:`<password>`
134
+ - 域名:`https://packages.example.test`
135
+
136
+ 安装:
137
+
138
+ ```bash
139
+ pip install --index-url "https://packages:<password>@packages.example.test/packages/prod/+simple/" pz
140
+ ```
141
+
142
+ ```bash
143
+ uv add --index "https://packages:<password>@packages.example.test/packages/prod/+simple/" pz
144
+ ```
145
+
146
+ 安装官方扩展组合:
147
+
148
+ ```bash
149
+ pip install --index-url "https://packages:<password>@packages.example.test/packages/prod/+simple/" "pz[contrib]"
150
+ ```
151
+
152
+ ```bash
153
+ uv add --index "https://packages:<password>@packages.example.test/packages/prod/+simple/" "pz[contrib]"
154
+ ```
155
+
156
+ 上传:
157
+
158
+ ```bash
159
+ uv publish --publish-url "https://packages:<password>@packages.example.test/packages/prod/"
160
+ ```
161
+
162
+ ## 8. 公共依赖继承
163
+
164
+ 如果私有包 `A` 依赖公开包 `B`,正式处理方式不是把 `B` 重新打进私有仓源码树,而是让私有 index 继承公开 PyPI。
165
+
166
+ 当前正式约定:
167
+
168
+ - `packages/dev` 必须继承 `root/pypi`
169
+ - `packages/prod` 必须继承 `root/pypi`
170
+
171
+ 这意味着:
172
+
173
+ - 私有包从 `packages/dev` 或 `packages/prod` 获取
174
+ - 公开依赖从继承链上的 `root/pypi` 获取
175
+ - 客户端仍然只需要配置一个私有入口域名
176
+
177
+ 因此,像下面这种情况是允许的:
178
+
179
+ - `pz` 或某个 `<app_id>` 在私有仓
180
+ - 它依赖的 `httpx`、`requests`、`pydantic` 等公开包不在私有上传列表
181
+ - 安装时仍然通过 `packages/prod -> root/pypi` 正常解算
182
+
183
+ 当前 `devpi` 部署的正式索引要求就是:
184
+
185
+ - `packages/dev bases=root/pypi`
186
+ - `packages/prod bases=root/pypi`
187
+
188
+ 如果未来某个环境不希望继承公开 PyPI,那必须作为一次性整体策略切换处理,而不是让不同环境长期并存两套 index 继承规则。
189
+
190
+ ## 9. 账号职责
191
+
192
+ 当前正式职责划分:
193
+
194
+ - `root`
195
+ - 只负责 `devpi` 初始化、重置、管理员维护
196
+ - `packages`
197
+ - 负责日常上传
198
+ - 负责下载安装
199
+ - 负责浏览器访问
200
+
201
+ 如果未来需要更细粒度审计,再拆成:
202
+
203
+ - 只读下载账号
204
+ - 上传账号
205
+ - 管理员账号
206
+
207
+ 不引入第二套正式方案。
208
+
209
+ ## 10. 部署真相源
210
+
211
+ 当前部署真相源位于:
212
+
213
+ - `deploy/docker-compose/devpi/`
214
+
215
+ 其中关键文件为:
216
+
217
+ - `docker-compose.yml`
218
+ - `Dockerfile`
219
+ - `.env`
220
+ - `bootstrap.sh`
221
+ - `devpi-entrypoint.sh`
222
+ - `nginx.devpi.conf.example`
223
+ - `nginx_proxy_manager.basic_auth.conf.example`
224
+
225
+ 部署说明与示例配置以该目录为准,不再另起第二套部署文档。
226
+
227
+ ## 11. 当前正式约束总结
228
+
229
+ - 正式安装不走 Git,只走私有包仓
230
+ - 私有包仓当前正式方案固定为 `devpi`
231
+ - 对外入口必须是 `HTTPS` 域名
232
+ - 上传与下载安装共用一组简单授权
233
+ - `Basic Auth` 与 `devpi` 认证必须使用同一组共享凭据
234
+ - 反向代理必须透传 `Authorization`
235
+ - `DEVPI_OUTSIDE_URL` 必须等于最终对外 `HTTPS` 域名
236
+ - `packages/dev` 与 `packages/prod` 必须继承 `root/pypi`
237
+ - 目标发布合同下,`pz pub upload` 原子命令负责把 `DEVPI_OWNER` / `DEVPI_OWNER_PASSWORD` 注入 `uv publish` 上传链;`pz pub` 编排命令复用该能力,不在 commit/tag 阶段暴露上传凭据
238
+ - `pz app add` / `pz app update` 在命中正式 devpi `check_url` 时,应自动把 `DEVPI_INSTALL_USER` / `DEVPI_INSTALL_PASSWORD` 注入安装链
239
+ - `pz app versions` 与 `pz app add` / `pz app update` 复用同一正式索引发现和安装认证链,不允许再引入第二套版本查询凭据
240
+ - `pz app add` / `pz app update` 未指定版本时只从已认证索引解析兼容的最新稳定版本,指定 `--version` 时验证并安装精确版本;解析结果必须以精确版本进入项目声明和 lock
241
+ - 版本查询、解析失败与 `--json` 诊断只允许输出脱敏后的 index identity,不得回显 Basic Auth、环境变量值或带凭据 URL
242
+
243
+ 如果后续需要迁移到其它制品平台,必须整体替换这套正式方案,而不是长期并存两套私有包仓口径。