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,24 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def app_static_app_js_template(app_id: str) -> str:
7
+ return dedent(
8
+ f"""\
9
+ async function load{app_id.title().replace("_", "")}Demo() {{
10
+ const response = await fetch("/api/example");
11
+ if (!response.ok) {{
12
+ throw new Error("demo_api_request_failed");
13
+ }}
14
+ return response.json();
15
+ }}
16
+
17
+ load{app_id.title().replace("_", "")}Demo().catch(() => {{
18
+ // Demo only. Replace with real UI handling when the page is wired in.
19
+ }});
20
+ """
21
+ )
22
+
23
+
24
+ __all__ = ["app_static_app_js_template"]
@@ -0,0 +1,31 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def app_static_readme_template(app_id: str) -> str:
7
+ return dedent(
8
+ f"""\
9
+ # {app_id} static asset examples
10
+
11
+ Static files here belong to the view layer. They are packaged resources only.
12
+
13
+ Rules:
14
+
15
+ - Frontend assets should focus on presentation and progressive enhancement.
16
+ - Data interaction should prefer AJAX + backend APIs instead of embedding a second business pipeline in frontend code.
17
+ - Static assets are not referenced by default and should be attached through the app's template, page profile, or a documented resource owner protocol.
18
+
19
+ Demo snippet:
20
+
21
+ ```css
22
+ /* Demo only. Not linked by any generated template. */
23
+ [data-owner="{app_id}"] {{
24
+ display: block;
25
+ }}
26
+ ```
27
+ """
28
+ )
29
+
30
+
31
+ __all__ = ["app_static_readme_template"]
@@ -0,0 +1,23 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def app_template_config_page_template(app_id: str) -> str:
7
+ return dedent(
8
+ f"""\
9
+ {{
10
+ "name": "{app_id}_index",
11
+ "version": "page_center.page.v1",
12
+ "description": "{app_id} scaffold page template",
13
+ "index": "{app_id}/index.html",
14
+ "template_id": "{app_id}_index",
15
+ "client_translation_scopes": [],
16
+ "shared_bundle_ids": [],
17
+ "page_type_bundle_ids": []
18
+ }}
19
+ """
20
+ )
21
+
22
+
23
+ __all__ = ["app_template_config_page_template"]
@@ -0,0 +1,28 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def app_template_index_html_template(app_id: str) -> str:
7
+ return dedent(
8
+ f"""\
9
+ <!doctype html>
10
+ <html lang="en">
11
+ <head>
12
+ <meta charset="utf-8" />
13
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
14
+ <title>{app_id} page template</title>
15
+ </head>
16
+ <body>
17
+ <main data-owner="{app_id}">
18
+ <h1>{app_id} page template</h1>
19
+ <p>This template is part of the view layer. Keep business rules in backend APIs.</p>
20
+ </main>
21
+ <script src="/static/{app_id}/app.js"></script>
22
+ </body>
23
+ </html>
24
+ """
25
+ )
26
+
27
+
28
+ __all__ = ["app_template_index_html_template"]
@@ -0,0 +1,32 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def app_templates_readme_template(app_id: str) -> str:
7
+ return dedent(
8
+ f"""\
9
+ # {app_id} template examples
10
+
11
+ Templates in this directory are the view layer under the MVC authoring convention.
12
+
13
+ Rules:
14
+
15
+ - Keep templates focused on presentation.
16
+ - Do not bury core business rules or long-lived data orchestration in template scripts.
17
+ - Use AJAX + backend APIs for data reads, writes, and state changes whenever possible.
18
+ - A route or page declaration must explicitly reference a template before it participates in runtime behavior.
19
+
20
+ Demo snippet:
21
+
22
+ ```html
23
+ {{# Demo only. No generated route points to this template. #}}
24
+ <section data-owner="{app_id}">
25
+ <h1>{{{{ title }}}}</h1>
26
+ </section>
27
+ ```
28
+ """
29
+ )
30
+
31
+
32
+ __all__ = ["app_templates_readme_template"]
@@ -0,0 +1,36 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def app_urls_template(app_id: str) -> str:
7
+ return dedent(
8
+ f"""\
9
+ from __future__ import annotations
10
+
11
+ from pz_foundation.routing import mount, path
12
+
13
+ from .public import create_demo_mount_app
14
+ from .views import demo_page
15
+
16
+
17
+ app_name = "{app_id}"
18
+
19
+ urlpatterns = (
20
+ # `path(...)` 用于声明当前 app 自己提供的普通 HTTP 路由。
21
+ # 这里只需要写路径、处理函数和名称,具体路由构建由 pz_foundation.routing 统一完成。
22
+ path("/{app_id.replace('_', '-')}/demo/", demo_page, name="{app_id}:demo-page"),
23
+ # `mount(...)` 用于把一个独立子应用挂到某个前缀下。
24
+ # 当你有管理后台、代理应用或需要单独生命周期的子应用时,用这种方式声明。
25
+ mount(
26
+ "/{app_id.replace('_', '-')}/mounted-demo",
27
+ app=create_demo_mount_app,
28
+ namespace="{app_id}.mounted_demo",
29
+ name="{app_id}:mounted-demo",
30
+ ),
31
+ )
32
+ """
33
+ )
34
+
35
+
36
+ __all__ = ["app_urls_template"]
@@ -0,0 +1,36 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def app_views_template(app_id: str) -> str:
7
+ return dedent(
8
+ f"""\
9
+ from __future__ import annotations
10
+
11
+ from fastapi.responses import HTMLResponse
12
+
13
+
14
+ # 页面入口函数示例。
15
+ # 这里负责返回展示内容;需要数据时,前端应优先通过 AJAX 调后端 API。
16
+ async def demo_page() -> HTMLResponse:
17
+ return HTMLResponse(
18
+ \"\"\"<!doctype html>
19
+ <html lang="en">
20
+ <head>
21
+ <meta charset="utf-8" />
22
+ <title>{app_id} demo</title>
23
+ </head>
24
+ <body>
25
+ <main data-owner="{app_id}">
26
+ <h1>{app_id} demo page</h1>
27
+ <p>Presentation stays in the frontend. Data interaction should prefer AJAX + backend APIs.</p>
28
+ </main>
29
+ </body>
30
+ </html>\"\"\"
31
+ )
32
+ """
33
+ )
34
+
35
+
36
+ __all__ = ["app_views_template"]
@@ -0,0 +1 @@
1
+ from __future__ import annotations
@@ -0,0 +1,51 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def project_agents_template(
7
+ *,
8
+ pz_docs_readme: str | None = None,
9
+ pz_design_docs_dir: str | None = None,
10
+ pz_pz_commands_doc: str | None = None,
11
+ ) -> str:
12
+ docs_readme = pz_docs_readme or "docs/README.md"
13
+ design_docs_dir = pz_design_docs_dir or "docs/pz规范与使用"
14
+ pz_commands_doc = pz_pz_commands_doc or "docs/pz命令总览.md"
15
+ return dedent(
16
+ f"""\
17
+ ## 子包设计文档约束
18
+
19
+ - 任何方案开始前,应先按当前宿主 source-root 解析规则阅读正式文档:`pz` 基础包看相对文档 `{docs_readme}` 与 `{design_docs_dir}/`;本地业务包看项目根 `apps/<app_id>/docs/README.md` 与 `apps/<app_id>/docs/设计文档.md`;共享子包看对应 `[tool.uv.sources].<distribution>` 解析出的 `docs/README.md` 与 `docs/设计文档.md`。只有在确实找不到正式答案时,才允许基于现有上下文做谨慎推断。
20
+
21
+ ## PZ 资源覆盖正式结论
22
+
23
+ - 资源覆盖是文件级覆盖,顺序只看 `installed_apps`,后出现 app 覆盖前者同相对路径。
24
+ - 同名 CSS 资源覆盖必须继承上游组件 CSS 的稳定合同:新增业务 app 或新增覆盖文件时,应先以被覆盖的上游 CSS 作为基线,再收敛品牌变量、视觉样式和必要布局;不得只重写一小部分通用选择器而漏掉上游模板/JS 暴露的专用 class、data 状态、hover/focus/active、响应式分支或可访问性状态。
25
+ - 修改已有覆盖 CSS 前,必须对照上游同名 CSS 检查组件专用规则是否已同步;若业务确实要改变表现,也必须保留选择器和状态语义,避免让元素退回到不完整的通用样式。
26
+
27
+ ## pz 设计哲学
28
+
29
+ - 单一基础包:`pz` 是唯一正式基础包,也是唯一可独立启动的包;不要再发明第二套 core、第二套主 CLI、第二套宿主基础壳。
30
+ - 最小子包平权:除 `pz` 外,正式运行单位只有最小子包;官方能力、业务能力、本地 app 必须走同一套最小子包装配模型。
31
+ - 约定优先:目录名、import 包名、distribution、`app_id`、`installed_apps` 写法、环境命令都必须按统一规则收敛。
32
+ - 单一真相源:路由、settings、公开 surface、安装单位、环境选择、扩展声明、启动入口都必须有唯一正式真相源。
33
+ - 编译先于运行:运行时装配必须先形成统一 `RuntimePlan` / `SettingsSnapshot` / manifest,再进入 Web、CLI、worker 副作用阶段。
34
+ - 分层清晰:`pz` 只放稳定合同、发现协议、编译与通用启动协议;官方实现优先放 `pz_contrib`,业务实现优先放 app 层。
35
+ - 正式入口唯一:宿主启动统一走 `pz run = pz run develop = pz run dev`、`pz run test`、`pz run product`;环境选择变量唯一正式入口仍是 `PZ_ENV`。
36
+
37
+ ## pz 开发约定
38
+
39
+ - 硬约束:项目启动、配置更新都走 `pz`;具体命令统一查相对文档 `{pz_commands_doc}`。
40
+ - 保持约定优先:能通过既有目录结构、文件命名、公开面和正式命令解决的问题,不要再引入第二套配置、第二套路径或特判分支。
41
+ - 一个问题只保留一个正式且完整的解决方案;不要长期并存两套入口、两套协议、两套实现,也不要重复造轮子。
42
+ - 面向对象开发优先组合而不是继承;只有在稳定的 is-a 合同明确成立时才引入继承层级。
43
+ - 保持单一职责:模块、类、service、provider 各自只承担一个清晰职责,不要把 settings、路由、运行时副作用和业务编排揉在一起。
44
+ - 保持依赖倒置:上层编排依赖稳定协议、抽象和正式公开面,不直接依赖别的 app 的内部实现。
45
+ - 保持开闭原则:新增能力优先通过正式扩展点、provider、strategy 或 app/public surface 扩展,而不是改核心链路打补丁。
46
+ - 保持接口隔离与可替换性:不要暴露胖接口;子类、实现类、provider 必须遵守父协议,能被稳定替换而不改变调用方语义。
47
+ """
48
+ )
49
+
50
+
51
+ __all__ = ["project_agents_template"]
@@ -0,0 +1,37 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def apps_container_readme_template() -> str:
7
+ return dedent(
8
+ """\
9
+ # Local Apps Container
10
+
11
+ `apps/` is a source container, not a second runtime namespace.
12
+ Each child directory under `apps/<app_id>/` is still a formal minimal package.
13
+
14
+ ## Daily workflow
15
+
16
+ - Create a new local app with `pz startapp <slug>`.
17
+ - Pull an existing source checkout with `pz dev add <repo-or-app-or-dir>`.
18
+ - Put a managed checkout on the project business branch with `pz dev branch <repo-or-app>`; use `--base-branch main` only when explicitly required.
19
+ - Refresh a clean business branch with `pz dev update <repo-or-app>`.
20
+ - Remove a binding with `pz dev unlink <binding>`; add `--delete-checkout` only when the final clean checkout is safe to delete.
21
+ - Most day-to-day edits stay inside `apps/<app_id>/<app_id>/`.
22
+ - The files you will touch most often are `apps.py`, `urls.py`, `settings.py`, `configs/default.jsonc` templates, and `public.py`.
23
+ - Put page declarations under `pages/`, for example `pages/base.jsonc` or `pages/<namespace>/<page>.jsonc`.
24
+ - For page-oriented apps, follow the MVC authoring convention: `models.py` for data models, `templates/` and `static/` for view resources, route entry functions as controllers.
25
+ - Frontend code should stay presentation-focused; prefer AJAX + backend APIs for data interaction.
26
+ - Only touch package-root `pyproject.toml` when package metadata or dependencies change.
27
+
28
+ ## Formal boundary
29
+
30
+ - `main.py` remains the only host entrypoint.
31
+ - `pz.jsonc` keeps `"installed_apps": ["apps"]`; do not replace it with per-app path hacks.
32
+ - Do not flatten the package layout or create local shadow host shells inside app packages.
33
+ """
34
+ )
35
+
36
+
37
+ __all__ = ["apps_container_readme_template"]
@@ -0,0 +1,59 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def main_py_template() -> str:
7
+ return dedent(
8
+ """\
9
+ from __future__ import annotations
10
+
11
+ import uvicorn
12
+
13
+ from pz_core.app import create_host_app
14
+ from pz_core.utils import (
15
+ read_env_bool,
16
+ read_env_int,
17
+ read_env_string,
18
+ resolve_host_project_shortcuts,
19
+ resolve_host_reload_dirs,
20
+ resolve_project_dir,
21
+ )
22
+
23
+ def create_app():
24
+ return create_host_app(project_dir=resolve_project_dir())
25
+
26
+
27
+ def main() -> int:
28
+ project_dir = resolve_project_dir()
29
+ shortcuts = resolve_host_project_shortcuts(project_dir=project_dir)
30
+ reload_enabled = read_env_bool(shortcuts.app_reload, "APP_RELOAD")
31
+ configured_workers = max(1, read_env_int(shortcuts.app_workers, "APP_WORKERS"))
32
+ workers = 1 if reload_enabled else configured_workers
33
+ use_import_string = reload_enabled or workers > 1
34
+ app_target = "main:create_app" if use_import_string else create_app
35
+ uvicorn.run(
36
+ app_target,
37
+ host=read_env_string(shortcuts.app_host, "APP_HOST"),
38
+ port=read_env_int(shortcuts.app_port, "APP_PORT"),
39
+ reload=reload_enabled,
40
+ reload_dirs=resolve_host_reload_dirs(project_dir=project_dir) if reload_enabled else None,
41
+ workers=workers,
42
+ loop=read_env_string("asyncio", "UVICORN_LOOP"),
43
+ http=read_env_string("auto", "UVICORN_HTTP_IMPL"),
44
+ log_level=read_env_string("info", "UVICORN_LOG_LEVEL"),
45
+ proxy_headers=read_env_bool(True, "UVICORN_PROXY_HEADERS"),
46
+ forwarded_allow_ips=read_env_string("*", "UVICORN_FORWARDED_ALLOW_IPS"),
47
+ access_log=read_env_bool(True, "UVICORN_ACCESS_LOG"),
48
+ factory=True,
49
+ )
50
+ return 0
51
+
52
+
53
+ if __name__ == "__main__":
54
+ raise SystemExit(main())
55
+ """
56
+ )
57
+
58
+
59
+ __all__ = ["main_py_template"]
@@ -0,0 +1,19 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def project_env_template() -> str:
7
+ return dedent(
8
+ """\
9
+ # Shared secrets only.
10
+ # Non-sensitive project and app settings belong in `pz.jsonc`
11
+ # or `pz_core.{PZ_ENV}.jsonc`.
12
+
13
+ # App-specific secrets belong to the owning app documentation and
14
+ # settings schema. Add only the variables required by installed apps.
15
+ """
16
+ )
17
+
18
+
19
+ __all__ = ["project_env_template"]
@@ -0,0 +1,26 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def project_pyproject_template(project_name: str) -> str:
7
+ distribution = project_name.replace("_", "-")
8
+ return dedent(
9
+ f"""\
10
+ [project]
11
+ name = "{distribution}"
12
+ version = "0.1.0"
13
+ requires-python = ">=3.11"
14
+ dependencies = [
15
+ "pz-cli==5.0.0",
16
+ ]
17
+
18
+ [tool.uv]
19
+ package = false
20
+
21
+ [tool.uv.sources]
22
+ """
23
+ )
24
+
25
+
26
+ __all__ = ["project_pyproject_template"]
@@ -0,0 +1,65 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def _pz_env_secret_override_block() -> str:
7
+ return dedent(
8
+ """\
9
+
10
+ # Secret overrides for this pz_env
11
+ # Add app-specific secret overrides only when this pz_env differs from `.env`.
12
+ """
13
+ )
14
+
15
+
16
+ def pz_env_env_template(env_name: str) -> str:
17
+ normalized = env_name.strip().lower()
18
+ if normalized == "develop":
19
+ return dedent(
20
+ """\
21
+ # develop pz_env overrides
22
+ #
23
+ # This file is loaded only after runtime pz_env has already been fixed.
24
+ # develop is the default pz_env.
25
+ # Non-sensitive develop overrides belong in `pz.develop.jsonc`.
26
+ # Keep this file for develop-only secrets when they differ from `.env`.
27
+ """
28
+ ) + _pz_env_secret_override_block()
29
+ if normalized == "test":
30
+ return dedent(
31
+ """\
32
+ # test pz_env overrides
33
+ #
34
+ # This file is loaded only after runtime pz_env has already been fixed.
35
+ # Use this file for automated tests, CI, or isolated verification runs.
36
+ # Non-sensitive test overrides belong in `pz.test.jsonc`.
37
+ # Keep this file for test-only secrets when they differ from `.env`.
38
+ """
39
+ ) + _pz_env_secret_override_block()
40
+ if normalized == "product":
41
+ return dedent(
42
+ """\
43
+ # product pz_env overrides
44
+ #
45
+ # This file is loaded only after runtime pz_env has already been fixed.
46
+ # product must be selected explicitly in the startup command.
47
+ # Example: pz run product
48
+ # Non-sensitive product overrides belong in `pz.product.jsonc`.
49
+ # Keep this file for product-only secrets when they differ from `.env`.
50
+ """
51
+ ) + _pz_env_secret_override_block()
52
+
53
+ return dedent(
54
+ f"""\
55
+ # {normalized} pz_env overrides
56
+ #
57
+ # This file is loaded only after runtime pz_env has already been fixed.
58
+ # Put only values that should differ from `.env`.
59
+ # Examples:
60
+ # project__base_url=
61
+ """
62
+ ) + _pz_env_secret_override_block()
63
+
64
+
65
+ __all__ = ["pz_env_env_template"]
@@ -0,0 +1,69 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any
4
+
5
+ from pz_core.utils import dump_jsonc_document
6
+
7
+
8
+ def _pz_env_override_payload(
9
+ *,
10
+ base_url: str,
11
+ app_reload: bool,
12
+ app_workers: int,
13
+ extra_project: dict[str, Any] | None = None,
14
+ ) -> dict[str, Any]:
15
+ project_payload: dict[str, Any] = {
16
+ "base_url": base_url,
17
+ "app_reload": app_reload,
18
+ "app_workers": app_workers,
19
+ }
20
+ if extra_project:
21
+ project_payload.update(extra_project)
22
+ return {"project": project_payload}
23
+
24
+
25
+ def _annotate_project_base_url_comment(document: str) -> str:
26
+ marker = ' "base_url": '
27
+ comment = (
28
+ " // Single service base URL. Local/IP URLs may be adjusted by explicit\n"
29
+ " // APP_HOST or APP_PORT runtime overrides; domain URLs stay canonical.\n"
30
+ )
31
+ if marker not in document:
32
+ return document
33
+ return document.replace(marker, comment + marker, 1)
34
+
35
+
36
+ def pz_env_jsonc_template(env_name: str) -> str:
37
+ normalized = env_name.strip().lower()
38
+ if normalized == "develop":
39
+ payload = _pz_env_override_payload(
40
+ base_url="http://127.0.0.1:8000",
41
+ app_reload=False,
42
+ app_workers=1,
43
+ )
44
+ return _annotate_project_base_url_comment(dump_jsonc_document(payload))
45
+
46
+ if normalized == "test":
47
+ payload = _pz_env_override_payload(
48
+ base_url="http://127.0.0.1:8000",
49
+ app_reload=False,
50
+ app_workers=1,
51
+ )
52
+ return _annotate_project_base_url_comment(dump_jsonc_document(payload))
53
+
54
+ if normalized == "product":
55
+ payload = _pz_env_override_payload(
56
+ base_url="https://your-domain.example",
57
+ app_reload=False,
58
+ app_workers=1,
59
+ extra_project={
60
+ "static_target_path": "",
61
+ "static_target_owner": "",
62
+ },
63
+ )
64
+ return _annotate_project_base_url_comment(dump_jsonc_document(payload))
65
+
66
+ return dump_jsonc_document({})
67
+
68
+
69
+ __all__ = ["pz_env_jsonc_template"]
@@ -0,0 +1,12 @@
1
+ from __future__ import annotations
2
+
3
+ from ...project_defaults import build_project_scaffold_payload
4
+ from pz_core.utils import dump_jsonc_document
5
+
6
+
7
+ def pz_jsonc_template() -> str:
8
+ payload = build_project_scaffold_payload(installed_apps=["apps"])
9
+ return dump_jsonc_document(payload, managed_paths=("installed_apps",))
10
+
11
+
12
+ __all__ = ["pz_jsonc_template"]
@@ -0,0 +1,94 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def project_readme_template() -> str:
7
+ return dedent(
8
+ """\
9
+ # Minimal PZ Project
10
+
11
+ This project was prepared by a grouped pz init command.
12
+ CLI 初始化入口固定为分组命令;新开发项目正式入口是 `pz dev init --clone-sources --project-dir .`,已有受管 `apps/.sources/pz` checkout 时可省略 `--clone-sources`;已有目录补齐骨架才使用 `pz env init --project-dir .`。
13
+
14
+ ## Layout
15
+
16
+ - `pyproject.toml`: project environment dependencies and exact managed source bindings
17
+ - `main.py`: the single host entrypoint
18
+ - `AGENTS.md`: local development rules for this project
19
+ - `pz.jsonc`: installed app declarations
20
+ - `pz.develop.jsonc` / `pz.test.jsonc` / `pz.product.jsonc`: pz_env-specific project overrides
21
+ - `.env`: default secrets template
22
+ - `.env.develop` / `.env.test` / `.env.product`: pz_env-specific env overrides
23
+ - `apps/`: local minimal-app container directory discovered by `"installed_apps": ["apps"]`
24
+ - `apps/README.md`: daily development guide for local minimal apps
25
+
26
+ ## Command Boundary
27
+
28
+ - `pz dev init` is the formal new-project orchestration command. It creates or reuses the scaffold, ensures one default local app, binds only the official `pz` bootstrap repository, reconciles the single editable `pz-cli` UV source, refreshes managed settings, and finishes the final `pz env install` pass so `pz run` can start directly.
29
+ - `pz env install` is the atomic initial-environment command. It creates or reuses the project `.venv`, then runs the first dependency sync for the project root and discovered authoring roots.
30
+ - `pz env init` is only for an existing directory that needs the formal scaffold files, managed settings blocks, AGENTS refresh, or a resync pass. It does not replace `pz dev init` for a fresh development project.
31
+
32
+ ## Next steps
33
+
34
+ 1. If this directory is meant to become a fresh development project, finish the formal setup first:
35
+
36
+ ```bash
37
+ pz dev init --clone-sources --project-dir .
38
+ ```
39
+
40
+ 首次执行会从 `develop` 创建当前业务分支并绑定官方 `pz` 最小仓库;只有明确需要从 `main` 起分支时才加 `--base-branch main`。命令随后完成最终 `env install`。
41
+
42
+ 2. Create a local minimal app:
43
+
44
+ ```bash
45
+ pz startapp demo
46
+ ```
47
+
48
+ 3. Add released app dependencies with `pz app add <app_id>` when the project should consume published packages.
49
+
50
+ 4. Pull local development source with `pz dev add <repo-or-app-or-dir>` when a package needs direct source edits.
51
+
52
+ 5. Ensure an existing managed checkout uses the project business branch with `pz dev branch <repo-or-app>`; then use `pz dev update <repo-or-app>` for upstream fast-forward updates.
53
+
54
+ 6. Confirm `pz.jsonc` still contains `"installed_apps": ["apps"]`.
55
+
56
+ 7. Put shared secrets in `.env`, and only put pz_env-specific overrides in `.env.develop` / `.env.test` / `.env.product`.
57
+
58
+ 8. Use `apps/README.md` and each app package `README.md` as the daily edit index.
59
+
60
+ 9. Extend project root commands in `pz.jsonc` through the root `commands` object when the project itself needs npm-like shortcuts.
61
+
62
+ ```jsonc
63
+ {
64
+ "commands": {
65
+ "hello": "echo hello",
66
+ "lint": ["python", "-m", "pytest", "-q"]
67
+ }
68
+ }
69
+ ```
70
+
71
+ 10. Start the host:
72
+
73
+ ```bash
74
+ pz run
75
+ pz run develop
76
+ pz run dev
77
+ pz run test
78
+ pz run product
79
+ ```
80
+
81
+ ## Rules
82
+
83
+ - Keep `main.py` as the only host entrypoint.
84
+ - Keep local apps under `apps/<app_id>/`.
85
+ - Treat `apps/` as a source container, not as a second runtime namespace.
86
+ - Use `pz app add` for published dependencies, `pz dev add` for local source checkouts or directories, `pz dev branch` for business-branch preparation, and `pz dev update` for safe fast-forward refreshes.
87
+ - App default templates belong in each app's `<app_id>/configs/default.jsonc`; only `pz settings init/update` reads them.
88
+ - Runtime code reads generated project config through `settings_center.settings.<app_id>.<field>`.
89
+ - Shared functionality should live in installed packages, not shadow directories inside this project.
90
+ """
91
+ )
92
+
93
+
94
+ __all__ = ["project_readme_template"]
@@ -0,0 +1,8 @@
1
+ from __future__ import annotations
2
+
3
+
4
+ def root_gitkeep_template() -> str:
5
+ return ""
6
+
7
+
8
+ __all__ = ["root_gitkeep_template"]