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.
- pz_cli-5.0.0.dist-info/METADATA +51 -0
- pz_cli-5.0.0.dist-info/RECORD +399 -0
- pz_cli-5.0.0.dist-info/WHEEL +4 -0
- pz_cli-5.0.0.dist-info/entry_points.txt +5 -0
- pz_core/__init__.py +64 -0
- pz_core/__main__.py +7 -0
- pz_core/app.py +45 -0
- pz_core/assembly/__init__.py +17 -0
- pz_core/assembly/app_discovery.py +1240 -0
- pz_core/assembly/apps/__init__.py +25 -0
- pz_core/assembly/apps/compiler.py +824 -0
- pz_core/assembly/apps/providers.py +188 -0
- pz_core/assembly/cli/__init__.py +9 -0
- pz_core/assembly/cli/compiler.py +166 -0
- pz_core/assembly/diagnostics/__init__.py +21 -0
- pz_core/assembly/diagnostics/checks.py +257 -0
- pz_core/assembly/diagnostics/dev_sources.py +569 -0
- pz_core/assembly/events/__init__.py +5 -0
- pz_core/assembly/events/compiler.py +219 -0
- pz_core/assembly/extensions/__init__.py +5 -0
- pz_core/assembly/extensions/compiler.py +696 -0
- pz_core/assembly/infra/__init__.py +6 -0
- pz_core/assembly/infra/compiler.py +272 -0
- pz_core/assembly/lifecycle/__init__.py +5 -0
- pz_core/assembly/lifecycle/compiler.py +95 -0
- pz_core/assembly/middlewares/__init__.py +19 -0
- pz_core/assembly/middlewares/compiler.py +508 -0
- pz_core/assembly/project/__init__.py +7 -0
- pz_core/assembly/project/compiler.py +9 -0
- pz_core/assembly/project/context.py +17 -0
- pz_core/assembly/project/discovery.py +227 -0
- pz_core/assembly/resources/__init__.py +19 -0
- pz_core/assembly/resources/compiler.py +310 -0
- pz_core/assembly/resources/settings.py +129 -0
- pz_core/assembly/routes/__init__.py +7 -0
- pz_core/assembly/routes/compiler.py +400 -0
- pz_core/assembly/runtime_manifests/__init__.py +13 -0
- pz_core/assembly/runtime_manifests/compiler.py +159 -0
- pz_core/assembly/settings/__init__.py +17 -0
- pz_core/assembly/settings/compiler.py +786 -0
- pz_core/assembly/settings/host_project_overrides.py +82 -0
- pz_core/assembly/settings/host_runtime_endpoint.py +207 -0
- pz_core/authoring/__init__.py +79 -0
- pz_core/authoring/app_init_service.py +946 -0
- pz_core/authoring/app_versions.py +814 -0
- pz_core/authoring/cli.py +192 -0
- pz_core/authoring/commands.py +1810 -0
- pz_core/authoring/conflicts.py +180 -0
- pz_core/authoring/dev_bindings.py +916 -0
- pz_core/authoring/dev_git.py +1087 -0
- pz_core/authoring/dev_import.py +1061 -0
- pz_core/authoring/dev_manifest.py +522 -0
- pz_core/authoring/dev_sources.py +1638 -0
- pz_core/authoring/env_cli.py +454 -0
- pz_core/authoring/files.py +109 -0
- pz_core/authoring/ide_projection.py +1129 -0
- pz_core/authoring/naming.py +58 -0
- pz_core/authoring/official_dev_sources.py +432 -0
- pz_core/authoring/official_sources.json +156 -0
- pz_core/authoring/orchestration_service.py +558 -0
- pz_core/authoring/project_default.jsonc +53 -0
- pz_core/authoring/project_defaults.py +88 -0
- pz_core/authoring/project_metadata_service.py +199 -0
- pz_core/authoring/project_settings_checks.py +51 -0
- pz_core/authoring/project_settings_cli.py +299 -0
- pz_core/authoring/project_settings_service.py +1700 -0
- pz_core/authoring/project_state.py +399 -0
- pz_core/authoring/publish_git.py +423 -0
- pz_core/authoring/publish_lock.py +188 -0
- pz_core/authoring/publish_source.py +195 -0
- pz_core/authoring/release.py +1382 -0
- pz_core/authoring/repo_keys.py +29 -0
- pz_core/authoring/root_cli.py +28 -0
- pz_core/authoring/scaffold_service.py +325 -0
- pz_core/authoring/sync_service.py +787 -0
- pz_core/authoring/templates/app/__init__.py +1 -0
- pz_core/authoring/templates/app/api.py +25 -0
- pz_core/authoring/templates/app/apps.py +31 -0
- pz_core/authoring/templates/app/auth_package_init.py +14 -0
- pz_core/authoring/templates/app/auth_readme.py +29 -0
- pz_core/authoring/templates/app/configs_package_init.py +14 -0
- pz_core/authoring/templates/app/default_env.py +18 -0
- pz_core/authoring/templates/app/default_jsonc.py +25 -0
- pz_core/authoring/templates/app/locales_readme.py +25 -0
- pz_core/authoring/templates/app/migrations_readme.py +19 -0
- pz_core/authoring/templates/app/models.py +14 -0
- pz_core/authoring/templates/app/package_init.py +8 -0
- pz_core/authoring/templates/app/pages_base.py +161 -0
- pz_core/authoring/templates/app/pages_readme.py +25 -0
- pz_core/authoring/templates/app/public.py +31 -0
- pz_core/authoring/templates/app/pyproject.py +77 -0
- pz_core/authoring/templates/app/readme.py +74 -0
- pz_core/authoring/templates/app/settings.py +46 -0
- pz_core/authoring/templates/app/static_app_js.py +24 -0
- pz_core/authoring/templates/app/static_readme.py +31 -0
- pz_core/authoring/templates/app/template_config_page.py +23 -0
- pz_core/authoring/templates/app/template_index_html.py +28 -0
- pz_core/authoring/templates/app/templates_readme.py +32 -0
- pz_core/authoring/templates/app/urls.py +36 -0
- pz_core/authoring/templates/app/views.py +36 -0
- pz_core/authoring/templates/project/__init__.py +1 -0
- pz_core/authoring/templates/project/agents.py +51 -0
- pz_core/authoring/templates/project/apps_container_readme.py +37 -0
- pz_core/authoring/templates/project/main_py.py +59 -0
- pz_core/authoring/templates/project/project_env.py +19 -0
- pz_core/authoring/templates/project/pyproject.py +26 -0
- pz_core/authoring/templates/project/pz_env_env.py +65 -0
- pz_core/authoring/templates/project/pz_env_jsonc.py +69 -0
- pz_core/authoring/templates/project/pz_jsonc.py +12 -0
- pz_core/authoring/templates/project/readme.py +94 -0
- pz_core/authoring/templates/project/root_gitkeep.py +8 -0
- pz_core/authoring/templates/shared/__init__.py +5 -0
- pz_core/authoring/templates/shared/text.py +10 -0
- pz_core/authoring/venv_service.py +87 -0
- pz_core/authoring/workspace.py +167 -0
- pz_core/cli.py +291 -0
- pz_core/cli_options.py +74 -0
- pz_core/core/__init__.py +3 -0
- pz_core/core/errors/__init__.py +5 -0
- pz_core/core/errors/models.py +117 -0
- pz_core/core/events/__init__.py +5 -0
- pz_core/core/events/registry.py +54 -0
- pz_core/core/extensions/__init__.py +51 -0
- pz_core/core/extensions/registry.py +790 -0
- pz_core/core/health/__init__.py +6 -0
- pz_core/core/health/contracts.py +10 -0
- pz_core/core/middlewares/__init__.py +6 -0
- pz_core/core/middlewares/models.py +24 -0
- pz_core/core/routing/__init__.py +5 -0
- pz_core/core/routing/models.py +21 -0
- pz_core/core/settings_contracts.py +25 -0
- pz_core/docs/README.md +20 -0
- pz_core/docs/distribution-README.md +438 -0
- pz_core/docs/pz/345/221/275/344/273/244/346/200/273/350/247/210.md +1011 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/README.md +98 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- pz_core/docs//345/217/221/347/211/210/345/211/215/346/270/205/345/215/225-4.0.11.md +84 -0
- pz_core/docs//346/226/260/346/211/213/346/214/207/345/215/227.md +422 -0
- pz_core/infra/__init__.py +17 -0
- pz_core/infra/db/__init__.py +23 -0
- pz_core/infra/db/contracts.py +73 -0
- pz_core/infra/health/__init__.py +5 -0
- pz_core/infra/health/contracts.py +8 -0
- pz_core/infra/kv/__init__.py +5 -0
- pz_core/infra/kv/contracts.py +17 -0
- pz_core/infra/observability/__init__.py +23 -0
- pz_core/infra/observability/contracts.py +142 -0
- pz_core/infra/resilience/__init__.py +5 -0
- pz_core/infra/resilience/contracts.py +17 -0
- pz_core/infra/resources/__init__.py +5 -0
- pz_core/infra/resources/contracts.py +16 -0
- pz_core/infra/settings/__init__.py +17 -0
- pz_core/infra/settings/models.py +81 -0
- pz_core/infra/storage/__init__.py +5 -0
- pz_core/infra/storage/ports.py +27 -0
- pz_core/project_root_commands.py +282 -0
- pz_core/project_runtime_cli.py +344 -0
- pz_core/project_sources.py +253 -0
- pz_core/pz_launcher.py +209 -0
- pz_core/root_cli.py +70 -0
- pz_core/runtime/__init__.py +229 -0
- pz_core/runtime/access.py +86 -0
- pz_core/runtime/adapters/__init__.py +5 -0
- pz_core/runtime/adapters/base.py +18 -0
- pz_core/runtime/asyncio_bridge.py +18 -0
- pz_core/runtime/bindings/__init__.py +5 -0
- pz_core/runtime/bindings/container.py +50 -0
- pz_core/runtime/cli/__init__.py +5 -0
- pz_core/runtime/cli/_args.py +67 -0
- pz_core/runtime/cli/app_commands.py +417 -0
- pz_core/runtime/cli/check.py +214 -0
- pz_core/runtime/cli/db.py +297 -0
- pz_core/runtime/cli/main.py +89 -0
- pz_core/runtime/cli/resources.py +280 -0
- pz_core/runtime/discovery.py +23 -0
- pz_core/runtime/environment_integrity.py +157 -0
- pz_core/runtime/errors.py +5 -0
- pz_core/runtime/events.py +87 -0
- pz_core/runtime/facades/__init__.py +38 -0
- pz_core/runtime/facades/_capabilities.py +46 -0
- pz_core/runtime/facades/cache.py +103 -0
- pz_core/runtime/facades/database.py +71 -0
- pz_core/runtime/facades/events.py +380 -0
- pz_core/runtime/facades/health.py +101 -0
- pz_core/runtime/facades/mail.py +121 -0
- pz_core/runtime/facades/observability.py +102 -0
- pz_core/runtime/facades/providers.py +75 -0
- pz_core/runtime/facades/resources.py +52 -0
- pz_core/runtime/facades/storage.py +296 -0
- pz_core/runtime/health/__init__.py +5 -0
- pz_core/runtime/health/service.py +102 -0
- pz_core/runtime/host.py +188 -0
- pz_core/runtime/host_runner.py +282 -0
- pz_core/runtime/http/__init__.py +20 -0
- pz_core/runtime/http/app.py +576 -0
- pz_core/runtime/http_timing.py +173 -0
- pz_core/runtime/invocation.py +29 -0
- pz_core/runtime/json_safe.py +47 -0
- pz_core/runtime/lifecycle/__init__.py +25 -0
- pz_core/runtime/lifecycle/manager.py +533 -0
- pz_core/runtime/plan.py +214 -0
- pz_core/runtime/plan_context.py +33 -0
- pz_core/runtime/plan_snapshot.py +177 -0
- pz_core/runtime/registries/__init__.py +27 -0
- pz_core/runtime/registries/capabilities.py +101 -0
- pz_core/runtime/registries/providers.py +396 -0
- pz_core/runtime/resource_assets.py +344 -0
- pz_core/runtime/run_cli.py +211 -0
- pz_core/runtime/settings.py +888 -0
- pz_core/runtime/worker/__init__.py +21 -0
- pz_core/runtime/worker/engine.py +921 -0
- pz_core/runtime/worker/runtime.py +25 -0
- pz_core/testing/__init__.py +15 -0
- pz_core/testing/doc_route_contracts.py +305 -0
- pz_core/utils/__init__.py +44 -0
- pz_core/utils/env.py +65 -0
- pz_core/utils/project_jsonc/__init__.py +29 -0
- pz_core/utils/project_jsonc/document.py +420 -0
- pz_core/utils/project_settings.py +99 -0
- pz_foundation/__init__.py +50 -0
- pz_foundation/_contracts.py +81 -0
- pz_foundation/_errors.py +34 -0
- pz_foundation/api.py +14 -0
- pz_foundation/apps.py +127 -0
- pz_foundation/auth/__init__.py +1 -0
- pz_foundation/cache_control.py +233 -0
- pz_foundation/cli/__init__.py +2 -0
- pz_foundation/cli/workers.py +565 -0
- pz_foundation/configs/__init__.py +0 -0
- pz_foundation/configs/default.env +15 -0
- pz_foundation/configs/default.jsonc +452 -0
- pz_foundation/db/__init__.py +94 -0
- pz_foundation/db/aerich_executor.py +664 -0
- pz_foundation/db/config.py +358 -0
- pz_foundation/db/connection_manager.py +689 -0
- pz_foundation/db/connection_probe.py +204 -0
- pz_foundation/db/database.py +1291 -0
- pz_foundation/db/deps.py +47 -0
- pz_foundation/db/lifecycle_status.py +85 -0
- pz_foundation/db/migrations.py +477 -0
- pz_foundation/db/mysql.py +57 -0
- pz_foundation/db/postgresql.py +409 -0
- pz_foundation/db/production_pool_fallback.py +143 -0
- pz_foundation/db/public.py +45 -0
- pz_foundation/db/session.py +369 -0
- pz_foundation/db/sqlite.py +15 -0
- pz_foundation/db/tortoise_manager.py +724 -0
- pz_foundation/db/tortoise_psycopg.py +148 -0
- pz_foundation/docs/README.md +18 -0
- pz_foundation/docs/distribution-README.md +319 -0
- 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
- 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
- pz_foundation/docs//350/256/276/350/256/241/346/226/207/346/241/243.md +288 -0
- 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
- pz_foundation/health.py +105 -0
- pz_foundation/host/__init__.py +11 -0
- pz_foundation/host/builder.py +34 -0
- pz_foundation/host/cache_runtime.py +44 -0
- pz_foundation/host/db/__init__.py +17 -0
- pz_foundation/host/db/aerich_config.py +36 -0
- pz_foundation/host/db/config.py +106 -0
- pz_foundation/host/db/connection_manager.py +48 -0
- pz_foundation/host/db/deps.py +5 -0
- pz_foundation/host/db/orm_retry_patch.py +566 -0
- pz_foundation/host/db/request_adapter.py +325 -0
- pz_foundation/host/db/router.py +28 -0
- pz_foundation/host/db/session.py +284 -0
- pz_foundation/host/db/tortoise_manager.py +10 -0
- pz_foundation/host/idempotency.py +132 -0
- pz_foundation/host/lifespan.py +247 -0
- pz_foundation/host/redis_runtime.py +100 -0
- pz_foundation/host/web.py +790 -0
- pz_foundation/infra_provider.py +236 -0
- pz_foundation/kv/__init__.py +25 -0
- pz_foundation/kv/cache.py +1166 -0
- pz_foundation/kv/deps.py +84 -0
- pz_foundation/kv/public.py +25 -0
- pz_foundation/kv/redis_manager.py +1531 -0
- pz_foundation/lazy_exports.py +43 -0
- pz_foundation/lazy_imports.py +124 -0
- pz_foundation/lifecycle.py +392 -0
- pz_foundation/managed_workers.py +1117 -0
- pz_foundation/middlewares/__init__.py +26 -0
- pz_foundation/middlewares/_settings.py +250 -0
- pz_foundation/middlewares/analytics.py +124 -0
- pz_foundation/middlewares/cache_control.py +156 -0
- pz_foundation/middlewares/compression.py +202 -0
- pz_foundation/middlewares/cors.py +62 -0
- pz_foundation/middlewares/geo_country.py +44 -0
- pz_foundation/middlewares/inner_router.py +50 -0
- pz_foundation/middlewares/rate_limited/__init__.py +3 -0
- pz_foundation/middlewares/rate_limited/key_limiter.py +115 -0
- pz_foundation/middlewares/request_logging.py +104 -0
- pz_foundation/middlewares/route_owner.py +309 -0
- pz_foundation/middlewares/security_csrf.py +44 -0
- pz_foundation/middlewares/security_headers/__init__.py +4 -0
- pz_foundation/middlewares/security_headers/conflicts.py +44 -0
- pz_foundation/middlewares/security_headers/csp_nonce.py +200 -0
- pz_foundation/middlewares/security_headers/security_headers.py +44 -0
- pz_foundation/migrations/__init__.py +1 -0
- pz_foundation/migrations/pz_foundation/__init__.py +1 -0
- pz_foundation/models.py +22 -0
- pz_foundation/notifications/__init__.py +23 -0
- pz_foundation/notifications/email.py +542 -0
- pz_foundation/notifications/public.py +31 -0
- pz_foundation/observability/__init__.py +71 -0
- pz_foundation/observability/http.py +34 -0
- pz_foundation/observability/logger/__init__.py +49 -0
- pz_foundation/observability/logger/_bot_settings.py +126 -0
- pz_foundation/observability/logger/bot_message.py +592 -0
- pz_foundation/observability/logger/core.py +385 -0
- pz_foundation/observability/logger/delivery_audit.py +84 -0
- pz_foundation/observability/logger/feishu_bot.py +199 -0
- pz_foundation/observability/logger/telegram_bot.py +194 -0
- pz_foundation/observability/metrics.py +365 -0
- pz_foundation/observability/runtime.py +68 -0
- pz_foundation/public.py +405 -0
- pz_foundation/resources/__init__.py +12 -0
- pz_foundation/resources/builder.py +900 -0
- pz_foundation/resources/images.py +363 -0
- pz_foundation/root_cli.py +20 -0
- pz_foundation/routing/__init__.py +203 -0
- pz_foundation/routing/canonical.py +486 -0
- pz_foundation/routing/convertors.py +82 -0
- pz_foundation/routing/declarations.py +843 -0
- pz_foundation/routing/exports.py +148 -0
- pz_foundation/routing/loaders.py +138 -0
- pz_foundation/routing/manifest.py +215 -0
- pz_foundation/routing/manifest_provider.py +47 -0
- pz_foundation/routing/mounts.py +101 -0
- pz_foundation/routing/ordering.py +172 -0
- pz_foundation/routing/registry.py +133 -0
- pz_foundation/routing/utils.py +28 -0
- pz_foundation/runtime.py +234 -0
- pz_foundation/settings.py +253 -0
- pz_foundation/settings_normalization.py +130 -0
- pz_foundation/storage/__init__.py +25 -0
- pz_foundation/storage/local.py +209 -0
- pz_foundation/storage/public.py +106 -0
- pz_foundation/storage/s3.py +116 -0
- pz_foundation/storage/service.py +234 -0
- pz_foundation/urls.py +19 -0
- pz_foundation/utils/__init__.py +6 -0
- pz_foundation/utils/merge.py +160 -0
- pz_foundation/worker_replicas.py +55 -0
- pz_settings_center/__init__.py +5 -0
- pz_settings_center/api/__init__.py +5 -0
- pz_settings_center/api/runtime_overrides.py +360 -0
- pz_settings_center/apps.py +28 -0
- pz_settings_center/configs/__init__.py +0 -0
- pz_settings_center/configs/default.env +2 -0
- pz_settings_center/configs/default.jsonc +1 -0
- pz_settings_center/docs/01-settings_center/350/203/275/345/212/233/350/276/271/347/225/214.md +124 -0
- pz_settings_center/docs/README.md +12 -0
- pz_settings_center/docs/distribution-README.md +150 -0
- pz_settings_center/docs//350/256/276/350/256/241/346/226/207/346/241/243.md +48 -0
- pz_settings_center/integration_payload.py +18 -0
- pz_settings_center/project_helpers.py +405 -0
- pz_settings_center/public.py +139 -0
- pz_settings_center/routing_helpers.py +73 -0
- pz_settings_center/runtime_override_provider.py +61 -0
- pz_settings_center/typed_settings.py +324 -0
- pz_settings_center/urls.py +9 -0
|
@@ -0,0 +1,550 @@
|
|
|
1
|
+
# 分层与扩展规范
|
|
2
|
+
|
|
3
|
+
> 本文涉及 settings 时统一采用单一路径:只允许 `import pz_settings_center.public as settings_center`,并通过 `settings_center.settings.<app_id>.<field>` 读取;`settings.py` / `settings/` 只负责声明。
|
|
4
|
+
> namespace 统一采用最小子包稳定身份:每个正式 app 必须有稳定唯一的 `app.id`,settings namespace 必须与 `app.id` 一致;新建子包默认让目录名、import 包名与 `app.id` 对齐,distribution 使用对应 Python 分发名;非叶子内部模块不得自定义 namespace。
|
|
5
|
+
|
|
6
|
+
本文档固定 `pz` 的正式高层分层模型。
|
|
7
|
+
|
|
8
|
+
- `pz` 是唯一正式基础包,也是唯一可以独立启动的包
|
|
9
|
+
- 其它最小子包统一按 `pz` 插件模型发现、编译、组装与加载
|
|
10
|
+
|
|
11
|
+
## 最高优先级公约
|
|
12
|
+
|
|
13
|
+
- 系统里唯一正式的基础启动包只有 `pz`。
|
|
14
|
+
- 必须区分源码 / 分层依赖与 distribution 安装依赖;安装层为了默认产品体验建立的 bundle 关系,不得解释为基础层可以反向依赖高层实现。
|
|
15
|
+
- 除 `pz` 外,其它正式运行单元统一是最小子包,并作为 `pz` 的插件按约定自动发现和加载。
|
|
16
|
+
- `pz` 与 `pz_apps` 是彼此并列的顶层源码组织根,只用于 Git 与源码组织,不再作为正式架构层,不再进入 import namespace。
|
|
17
|
+
- `pz_contrib` 是官方最小子包源码容器,不是运行时 namespace。
|
|
18
|
+
- 正式依赖面只允许依赖最小子包本身,不允许依赖集合层目录名。
|
|
19
|
+
- 每个最小子包的正式命名必须统一:
|
|
20
|
+
- `app_id = <app_id>`
|
|
21
|
+
- 目录名 = `<app_id>`
|
|
22
|
+
- import 包名 = `<app_id>`
|
|
23
|
+
- distribution = `<distribution-name>`
|
|
24
|
+
- 新建子包默认让目录名、import 包名与 `app_id` 对齐;不强制 `pz`、`pz` 或其它特定技术前缀。
|
|
25
|
+
- 历史子包已发布的 `app_id` 与 import 包名以稳定值为准,不因文档命名口径变化自动迁移。
|
|
26
|
+
|
|
27
|
+
## 目标
|
|
28
|
+
|
|
29
|
+
`pz` 不是“宿主项目里不断长大的框架集合”,而是一套单一基础包加插件层的体系:
|
|
30
|
+
|
|
31
|
+
- `pz` 提供稳定内核、正式合同与唯一启动壳
|
|
32
|
+
- 官方通用能力进入官方扩展层
|
|
33
|
+
- 业务能力进入业务扩展层
|
|
34
|
+
- 宿主项目只做装配,不承担框架实现职责
|
|
35
|
+
- concrete infra capability 的作者面与实现 owner 也必须留在最小子包层;`pz` 基础层只保留 typed contract、编译协议与扩展点
|
|
36
|
+
|
|
37
|
+
这套模型与 task dispatch / worker owner 的设计目标一致:
|
|
38
|
+
|
|
39
|
+
- 中心运行时稳定
|
|
40
|
+
- 高层能力通过标准扩展接入
|
|
41
|
+
- 业务变化优先在外层实现,不频繁回写内核
|
|
42
|
+
|
|
43
|
+
面向对象落位规则:
|
|
44
|
+
|
|
45
|
+
- 分层不是目录分组,而是对象职责边界。
|
|
46
|
+
- `pz` 基础层优先拥有 contract object、compiler object、`RuntimePlan`、runtime context、capability/facade contract。
|
|
47
|
+
- `pz_contrib` 与 owner 子包优先拥有 runtime owner、provider chain、assembler、adapter、对外 facade。
|
|
48
|
+
- 业务子包优先拥有领域模型、应用 service、provider 实现、外部 adapter、`public.py` facade。
|
|
49
|
+
- 宿主项目只保留项目配置与启动调用,不拥有通用 runtime owner 或第二套组合根。
|
|
50
|
+
|
|
51
|
+
具体开发约束见 [`25-面向对象开发规范`](./25-面向对象开发规范.md)。
|
|
52
|
+
|
|
53
|
+
## 四层模型
|
|
54
|
+
|
|
55
|
+
### 1. 稳定内核与启动层:`pz`
|
|
56
|
+
|
|
57
|
+
职责:
|
|
58
|
+
|
|
59
|
+
- 唯一正式启动入口
|
|
60
|
+
- `RuntimePlan` 编译
|
|
61
|
+
- app registry / event registry / extension registry
|
|
62
|
+
- bindings / lifecycle / capability registry
|
|
63
|
+
- middleware / route / resource / provider 的正式合同
|
|
64
|
+
- host builder 的发现约定、资源加载约定与调度协议
|
|
65
|
+
- 标准 CLI 命令分发协议
|
|
66
|
+
- 顶层 root CLI provider 协议
|
|
67
|
+
- `infra.provider` 等面向 typed infra snapshot 的正式扩展合同
|
|
68
|
+
|
|
69
|
+
约束:
|
|
70
|
+
|
|
71
|
+
- 不承载官方业务实现
|
|
72
|
+
- 不承载宿主页面壳
|
|
73
|
+
- 不承载项目定制逻辑
|
|
74
|
+
- 不为了单个业务问题新增一次性快捷路径
|
|
75
|
+
- 即使 `pz-cli` 单 wheel 同时交付 `pz_core` 与官方 app Python 包,`pz_core` 仍不得直接 import 官方或业务 app 的内部实现
|
|
76
|
+
|
|
77
|
+
允许进入 `pz` 基础层的改动只有两类:
|
|
78
|
+
|
|
79
|
+
- 正式合同缺位
|
|
80
|
+
- 现有正式合同无法表达多个扩展层共用的稳定抽象
|
|
81
|
+
|
|
82
|
+
`pz` 基础层最终只应保留以下协议模块:
|
|
83
|
+
|
|
84
|
+
- 项目与启动协议
|
|
85
|
+
- `project context`
|
|
86
|
+
- bootstrap config loader
|
|
87
|
+
- `installed_apps` 解析规则
|
|
88
|
+
- 环境覆盖顺序规则
|
|
89
|
+
- 唯一启动入口与 host 启动调度
|
|
90
|
+
- 最小子包发现协议
|
|
91
|
+
- 最小子包判定规则
|
|
92
|
+
- 容器目录递归展开规则
|
|
93
|
+
- app identity 规则
|
|
94
|
+
- 项目本地 `apps/` 最小子包与已安装 distribution 同名并存时,本地最小子包优先
|
|
95
|
+
- 重复 `app_id` / 重复扩展冲突检测
|
|
96
|
+
- 扩展点合同模块
|
|
97
|
+
- `host.builder`
|
|
98
|
+
- `settings.provider`
|
|
99
|
+
- `infra.provider`
|
|
100
|
+
- `cli.tool`
|
|
101
|
+
- 子包正式协议注册机制
|
|
102
|
+
- middleware / lifecycle / route / resource contribution
|
|
103
|
+
- 编译与组装协议
|
|
104
|
+
- `RuntimePlan`
|
|
105
|
+
- settings snapshot 编译协议
|
|
106
|
+
- route / middleware / resource / CLI manifest 编译协议
|
|
107
|
+
- 冲突裁决规则
|
|
108
|
+
- 运行时核心状态机
|
|
109
|
+
- lifecycle state machine
|
|
110
|
+
- runtime bindings contract
|
|
111
|
+
- capability / event registry contract
|
|
112
|
+
- runtime access facade
|
|
113
|
+
- 错误与诊断合同
|
|
114
|
+
- 统一错误模型
|
|
115
|
+
- 统一诊断模型
|
|
116
|
+
- 编译期 / 启动期错误分类
|
|
117
|
+
- CLI 主链协议
|
|
118
|
+
- `pz` 根命令分发
|
|
119
|
+
- app CLI 发现规则
|
|
120
|
+
- CLI tool 注册合同
|
|
121
|
+
- 命令冲突裁决
|
|
122
|
+
- 资源加载协议
|
|
123
|
+
- 标准资源目录规则
|
|
124
|
+
- 资源 manifest
|
|
125
|
+
- 合并顺序与 cache/output 规则
|
|
126
|
+
|
|
127
|
+
`RuntimePlan` 作为基础层唯一运行图组合根,最少必须稳定包含:
|
|
128
|
+
|
|
129
|
+
- `project`
|
|
130
|
+
- `settings`
|
|
131
|
+
- `app_registry`
|
|
132
|
+
- `route_manifest`
|
|
133
|
+
- `middleware_manifest`
|
|
134
|
+
- `resource_manifest`
|
|
135
|
+
- `cli_manifest`
|
|
136
|
+
- `lifecycle_manifest`
|
|
137
|
+
- `capability_registry`
|
|
138
|
+
- `extension_conflicts`
|
|
139
|
+
|
|
140
|
+
补充约束:
|
|
141
|
+
|
|
142
|
+
- `RuntimePlan.infra` 仍然是基础设施能力的唯一 typed snapshot
|
|
143
|
+
- 但 `pz` 不再直接拥有 database / cache / mail / storage / health / metrics / tracing 的 concrete 作者面
|
|
144
|
+
- `pz` 基础层只固定:
|
|
145
|
+
- `InfraContext` typed contract
|
|
146
|
+
- capability 状态语义
|
|
147
|
+
- `infra.provider` patch 编译协议
|
|
148
|
+
- 具体配置字段写在哪个 app namespace,由对应 capability owner app 自己负责
|
|
149
|
+
|
|
150
|
+
正式要求:
|
|
151
|
+
|
|
152
|
+
- 所有扩展点都只允许先编译进入 `RuntimePlan`
|
|
153
|
+
- 跨可选 runtime owner 的协议贡献必须显式声明 `ProtocolExtensionSpec(optional=True)`;owner 未安装时贡献保持惰性,owner 一旦安装仍执行完整协议校验。普通协议贡献默认严格,未知 kind 继续编译失败。
|
|
154
|
+
- Web / CLI / worker 执行阶段只消费 `RuntimePlan`
|
|
155
|
+
- `RuntimePlan` 编译完成后必须保持不可变快照语义
|
|
156
|
+
- 入口层只能激活 `RuntimePlan` 已经编译出的对象图,不得在入口层重新选择 provider、adapter 或 runtime owner
|
|
157
|
+
- 具体运行时资源必须归 owner object 管理;host、worker、infra、task、browser/session 等资源都不得以模块级全局状态存在
|
|
158
|
+
- `startup()` / `lifespan` / adapter 不得在 `RuntimePlan` 外重新拼装第二份运行图
|
|
159
|
+
- 若某个最小子包需要定义自己的正式 provider 协议,例如公开页面中心的页面装配或 SEO provider 协议,长期正式做法不是把该子包 runtime 搬进 `pz`,而是让 `pz` 提供“子包正式协议注册机制”,再由该子包把自己的协议注册进 `pz` 编译主链。
|
|
160
|
+
- `pz` 基础层负责协议注册、编译、校验、冲突裁决与诊断主链;子包自身继续负责协议的具体消费、运行时装配与 owner 语义。
|
|
161
|
+
- 因此,像公开页面中心这类公开页面 owner runtime,应保持 runtime 实现整体高内聚;不应因为协议要进入 core,就把 runtime owner 实现反向拆散到 `pz` 或 `contrib`。
|
|
162
|
+
|
|
163
|
+
不应进入 `pz` 基础层的内容包括:
|
|
164
|
+
|
|
165
|
+
- 官方 Web host 具体实现
|
|
166
|
+
- settings surface owner、module config owner、settings runtime owner 的具体实现
|
|
167
|
+
- admin owner / auth owner / infra owner / SEO owner / shared site UI owner 等官方功能包
|
|
168
|
+
- DB / storage / mail / redis / s3 / 模板引擎的官方实现
|
|
169
|
+
- database / cache / mail / storage / health / metrics / tracing 的 concrete settings owner
|
|
170
|
+
- 配置管理 UI、项目模板、app 模板等高层实现
|
|
171
|
+
|
|
172
|
+
### 2. 框架仓内官方维护子包容器:`pz_contrib`
|
|
173
|
+
|
|
174
|
+
职责:
|
|
175
|
+
|
|
176
|
+
- 收纳框架仓内官方维护的最小子包
|
|
177
|
+
- 收纳框架仓内官方脚手架与通用装配实现
|
|
178
|
+
- 不形成独立运行时 namespace
|
|
179
|
+
|
|
180
|
+
典型内容:
|
|
181
|
+
|
|
182
|
+
- settings surface owner
|
|
183
|
+
- official infra owner
|
|
184
|
+
- shared site UI owner
|
|
185
|
+
- SEO owner
|
|
186
|
+
- admin owner
|
|
187
|
+
- auth owner
|
|
188
|
+
- 通用 Web host
|
|
189
|
+
- 官方 concrete infra owner app
|
|
190
|
+
|
|
191
|
+
规则:
|
|
192
|
+
|
|
193
|
+
- 这里可以快速演进
|
|
194
|
+
- 但必须建立在 `pz` 已有合同之上
|
|
195
|
+
- 如果发现合同缺口,先证明这是跨业务、跨扩展层的稳定需求,再回到 `pz`
|
|
196
|
+
- `pz_contrib` 可以提供共享实现能力,但不承担“高优先级就应进入 contrib”的兜底角色;某个运行时若本质上是公开页面 owner,应优先保持在自己的 runtime 包内高内聚实现,而不是为抽象美观拆散到多个容器
|
|
197
|
+
- `pz_contrib` 可以在源码分层上依赖 `pz`
|
|
198
|
+
- 若 distribution 安装口径上需要官方扩展组合,正式命令应通过 `pz[contrib]` extras 表达,不改变源码分层方向
|
|
199
|
+
|
|
200
|
+
对于 host,官方扩展层负责:
|
|
201
|
+
|
|
202
|
+
- 声明 `host.builder`
|
|
203
|
+
- 提供 Web host 的具体实现
|
|
204
|
+
- 提供统一 route registry / route finalizer
|
|
205
|
+
- 处理 infra bootstrap、route/middleware/static/lifecycle 装配
|
|
206
|
+
- 在所有 app 的 URL 声明加载完成后,统一执行最终路由清理与排序
|
|
207
|
+
- 为外部可见且需要 SEO 的 HTML 页面提供统一的首屏内容渲染约束:
|
|
208
|
+
- 首屏可见正文、SEO 关键文案、结构化数据所需稳定文本必须以后端渲染为正式主链
|
|
209
|
+
- 前端只负责交互增强、异步数据刷新与非首屏区块补充,不得反向成为首屏内容真相源
|
|
210
|
+
- `admin`、内部运营页、自用后台、强登录态工作台不强制纳入这条 SEO 首屏约束
|
|
211
|
+
- 为上述公开 HTML 页面提供统一的请求期页面状态绑定 helper:
|
|
212
|
+
- 至少统一绑定 `lang`、`translation_module`、`page_profile`、`translation_bundles`、`client_translation_scopes`、`page_supported_language`、`page_language_alternates`
|
|
213
|
+
- 共享模板层与共享翻译 facade 应优先消费这份请求期合同,而不是要求各业务路由重复手写 state 注入
|
|
214
|
+
- 该 helper 属于 `pz_contrib` 或业务扩展层职责,不回写 `pz` 基础层
|
|
215
|
+
- 对受保护 surface,正式 auth owner 是未登录拦截、登录页跳转与登录后按 `next` 回跳合同的唯一 owner;其它官方子包只通过正式 provider/extension 或 `route_policy` 注册公开例外、强制保护或 delegate surface,不保留第二套未登录重定向真相源
|
|
216
|
+
- 对请求期认证语义,正式 auth owner 应采用 token-first 的稳定模型;普通子包不要假设 auth middleware 会为旧 token 或缺 claims token 在每个请求里回库补救,只有显式 model 依赖才应回库
|
|
217
|
+
- 提供子路由组织与 include 式装配的统一能力,让最小子包只做模块声明,不重复实现框架级装配机制:
|
|
218
|
+
- 每个 app 的正式入口固定为 `<pkg>.urls`
|
|
219
|
+
- 简单 app 使用 `urls.py`
|
|
220
|
+
- 复杂 app 使用 `urls/` 目录,但正式入口仍然是 `urls/__init__.py`
|
|
221
|
+
- prefix、最终排序、最终清理由共享装配层统一处理
|
|
222
|
+
- 若某个官方子包同时拥有 concrete infra capability,则它还负责:
|
|
223
|
+
- 定义自己的 settings namespace,例如 `settings_center.settings.<owner_app>.database`
|
|
224
|
+
- 通过 `infra.provider` 把 app settings 编译进 `RuntimePlan.infra`
|
|
225
|
+
- 让 DB CLI、readiness、worker、Web host 与 facade 继续只消费 `RuntimePlan.infra`
|
|
226
|
+
|
|
227
|
+
上述公开 HTML 页面所适用的首屏展示、首帧稳定、首屏翻译、首屏关键资源与缓存对齐规则,统一以 `23-首屏展示与首帧稳定规范.md` 为准;本文件只保留分层责任,不再复制第二套细则。
|
|
228
|
+
|
|
229
|
+
### 3. 业务扩展层:业务 app / 独立子包
|
|
230
|
+
|
|
231
|
+
职责:
|
|
232
|
+
|
|
233
|
+
- 业务 URL 声明
|
|
234
|
+
- 业务 provider
|
|
235
|
+
- 业务 middleware 声明
|
|
236
|
+
- 业务 startup / shutdown
|
|
237
|
+
- 业务 host 扩展声明
|
|
238
|
+
|
|
239
|
+
规则:
|
|
240
|
+
|
|
241
|
+
- 业务新增功能优先通过现有扩展点接入
|
|
242
|
+
- 不直接改 `pz` 来适配单个业务
|
|
243
|
+
- 对外部可见且需要 SEO 的业务 HTML 页面,默认必须先完成后端首屏渲染,再由前端做 hydrate 或增强
|
|
244
|
+
- 不允许把公开页面的首屏正文、SEO 主文案、首屏 CTA 依赖前端二次请求后再补齐
|
|
245
|
+
- 这类页面在进入模板前,必须先绑定统一请求期页面状态合同;业务路由不应长期各自手写同构 `request.state` 注入
|
|
246
|
+
- 页面级前端增量取词范围必须通过正式字段暴露;纯 SSR 页面应显式给出空范围,而不是依赖隐式缺省
|
|
247
|
+
- `admin`、内部工具页、纯登录后工作台不受这条 SEO 首屏规则强制约束
|
|
248
|
+
- 不在宿主里手写框架替代层
|
|
249
|
+
- 业务子包之间默认不直接 import 对方内部实现
|
|
250
|
+
- 业务子包跨包依赖优先走对方 `public.py`、HTTP / API 或其它正式声明的 provider / facade
|
|
251
|
+
- 不允许把 `apps.py`、`urls.py`、`urls/`、`settings` 内部实现当作跨包依赖入口
|
|
252
|
+
- 需要认证的业务或官方 surface,默认由正式 auth owner 接管;子包只通过 `route_policy` / control-plane provider 声明“整包公开、公开例外、强制保护、delegate”这类正式输入,不在子包内部长期保留第二套未登录拦截、中间件跳登录或登录后回跳协议
|
|
253
|
+
|
|
254
|
+
上述业务页面的首屏细则、SSR 稳定态、首屏资源优先级和 hydrate 约束,统一引用 `23-首屏展示与首帧稳定规范.md`,不在本文件内再维护一份并列规范。
|
|
255
|
+
|
|
256
|
+
业务包应优先暴露:
|
|
257
|
+
|
|
258
|
+
- `urls.py` 或 `urls/`
|
|
259
|
+
- `extensions()`
|
|
260
|
+
- `middlewares()`
|
|
261
|
+
- `startup()`
|
|
262
|
+
- `shutdown()`
|
|
263
|
+
|
|
264
|
+
其中:
|
|
265
|
+
|
|
266
|
+
- `<pkg>.urls` 是 app 自己的 URL 真相源,职责类似 Django app 内部的 `urls.py`
|
|
267
|
+
- `apps.py` 不承担 URL 组装职责
|
|
268
|
+
- 业务包只声明自己的路由树、子模块 include 关系与稳定 namespace
|
|
269
|
+
- prefix 挂载、跨 app 装配、最终清理与排序都属于共享装配层职责
|
|
270
|
+
|
|
271
|
+
### 4. 宿主装配层:项目仓
|
|
272
|
+
|
|
273
|
+
职责:
|
|
274
|
+
|
|
275
|
+
- `project_dir`
|
|
276
|
+
- `.env`
|
|
277
|
+
- `pz.jsonc`
|
|
278
|
+
- `pz.{env}.jsonc`
|
|
279
|
+
- 安装哪些 app
|
|
280
|
+
- 调用通用 host builder
|
|
281
|
+
|
|
282
|
+
规则:
|
|
283
|
+
|
|
284
|
+
- 宿主不自己发明框架机制
|
|
285
|
+
- 宿主不自己实现通用 host
|
|
286
|
+
- 宿主不直接依赖外层源码仓布局
|
|
287
|
+
- 宿主不补本地 shadow package
|
|
288
|
+
|
|
289
|
+
宿主只允许保留:
|
|
290
|
+
|
|
291
|
+
- bootstrap
|
|
292
|
+
- 项目配置
|
|
293
|
+
- 极少量宿主特有扩展声明
|
|
294
|
+
|
|
295
|
+
项目配置规则:
|
|
296
|
+
|
|
297
|
+
- app 配置读取真相源始终是 `settings_center.settings.<app_id>`
|
|
298
|
+
- app 的正式 namespace 始终是其显式声明的 `app.id`,且必须与最小子包目录名、import 包名完全一致
|
|
299
|
+
- `pz.jsonc` 只负责项目基础装配与非敏感覆盖
|
|
300
|
+
- `pz.{env}.jsonc` 负责开发、测试、生产等环境差异覆盖
|
|
301
|
+
- `.env` 负责通用敏感配置基线,`.env.{env}` 负责环境专属敏感覆盖
|
|
302
|
+
- 通过 `PZ_ENV=develop|test|product` 选择环境覆盖文件;未显式指定时默认 `develop`
|
|
303
|
+
- `product` 环境必须显式指定,不能靠 `.env.product` 的存在自动推导
|
|
304
|
+
- 项目正式配置文件名固定为 `pz.jsonc`
|
|
305
|
+
- 项目级 JSONC 的正式读写必须统一通过 `pz/utils/project_jsonc/`
|
|
306
|
+
- 工具注释独占前缀固定为 `// @pz:`
|
|
307
|
+
|
|
308
|
+
## 跨层依赖规则
|
|
309
|
+
|
|
310
|
+
跨层与跨子包依赖固定遵循下面的单向约束:
|
|
311
|
+
|
|
312
|
+
- `pz` 不依赖 `pz_contrib`、业务子包或宿主项目
|
|
313
|
+
- `pz_contrib` 可以依赖 `pz`
|
|
314
|
+
- 业务子包可以依赖 `pz` 与 `pz_contrib` 的正式公开面
|
|
315
|
+
- 业务子包之间默认不直接 import 对方内部模块
|
|
316
|
+
- 业务子包之间如需通信,优先走:
|
|
317
|
+
- 对方 `public.py`
|
|
318
|
+
- HTTP / API
|
|
319
|
+
- provider / facade / event 等正式暴露面
|
|
320
|
+
- 对象依赖必须通过构造参数、factory、context、`RuntimePlan` 或正式 registry 显式注入;业务对象不得在方法内部临时 import 对方内部模块来选择实现
|
|
321
|
+
|
|
322
|
+
不允许:
|
|
323
|
+
|
|
324
|
+
- 子包直接把别的子包内部模块当依赖
|
|
325
|
+
- 直接 import 对方的 `apps.py`、`urls.py`、`urls/`、`settings.py`、`settings/` 内部模块、service/manager/adapter
|
|
326
|
+
- 通过“先能跑起来”作为理由建立跨子包源码硬耦合
|
|
327
|
+
- 让调用方直接持有对方内部 repository、adapter、SDK client、session、pool 等实现对象
|
|
328
|
+
|
|
329
|
+
## 变更决策顺序
|
|
330
|
+
|
|
331
|
+
新增能力时,按下面顺序决策:
|
|
332
|
+
|
|
333
|
+
1. 先判断能否只通过现有 app 合同完成
|
|
334
|
+
2. 如果不能,判断能否在官方扩展层新增扩展处理器
|
|
335
|
+
3. 只有当正式合同本身缺位时,才修改 `pz`
|
|
336
|
+
|
|
337
|
+
反向约束:
|
|
338
|
+
|
|
339
|
+
- 不允许因为单个业务页面需求直接扩展 `pz`
|
|
340
|
+
- 不允许为了临时装配方便把通用实现塞回宿主
|
|
341
|
+
|
|
342
|
+
## Host 规则
|
|
343
|
+
|
|
344
|
+
Web host 相关能力应统一进入官方扩展层,而不是宿主手写:
|
|
345
|
+
|
|
346
|
+
- app route declarations
|
|
347
|
+
- middleware
|
|
348
|
+
- lifecycle
|
|
349
|
+
- static / resource mounts
|
|
350
|
+
- health / ready
|
|
351
|
+
|
|
352
|
+
宿主定制通过正式 host 扩展完成,例如:
|
|
353
|
+
|
|
354
|
+
- `host.route`
|
|
355
|
+
- `host.mount`
|
|
356
|
+
- `host.state`
|
|
357
|
+
|
|
358
|
+
`pz` 在这条链路里只负责一件事:
|
|
359
|
+
|
|
360
|
+
- 从已安装 app 的 `extensions()` 中发现 `host.builder`
|
|
361
|
+
- 按约定调用唯一生效的 builder
|
|
362
|
+
|
|
363
|
+
`pz` 不允许:
|
|
364
|
+
|
|
365
|
+
- 写死某个 official infra owner host builder 实现路径
|
|
366
|
+
- 直接承载官方 host 组装实现
|
|
367
|
+
- 夹带业务 bootstrap 或业务 router
|
|
368
|
+
|
|
369
|
+
后续如确有必要,可继续扩展:
|
|
370
|
+
|
|
371
|
+
- `host.static`
|
|
372
|
+
- `host.openapi`
|
|
373
|
+
- `host.response_header`
|
|
374
|
+
|
|
375
|
+
### `host.builder` 正式对象形状
|
|
376
|
+
|
|
377
|
+
`host.builder` 必须是单实例 builder 对象,而不是任意函数路径或隐式副作用入口。
|
|
378
|
+
|
|
379
|
+
正式要求:
|
|
380
|
+
|
|
381
|
+
- 每个 `host.builder` 必须至少具备:
|
|
382
|
+
- `kind = "host.builder"`
|
|
383
|
+
- `id`
|
|
384
|
+
- `owner_app`
|
|
385
|
+
- `api_version`
|
|
386
|
+
- `priority`
|
|
387
|
+
- `runtime_kind`
|
|
388
|
+
- `builder`
|
|
389
|
+
- `builder` 必须实现:
|
|
390
|
+
- `build(ctx: HostBuildContext) -> HostBuildResult`
|
|
391
|
+
- `HostBuildContext` 至少包含:
|
|
392
|
+
- `project`
|
|
393
|
+
- `plan`
|
|
394
|
+
- `settings`
|
|
395
|
+
- `bindings`
|
|
396
|
+
- `HostBuildResult` 至少包含:
|
|
397
|
+
- `app`
|
|
398
|
+
- `app_kind`
|
|
399
|
+
- `health_path`
|
|
400
|
+
|
|
401
|
+
约束:
|
|
402
|
+
|
|
403
|
+
- 一个项目最终只能有一个生效的 `host.builder`
|
|
404
|
+
- 多个 builder 按显式 `priority` 裁决;同优先级冲突直接报错
|
|
405
|
+
- `build()` 只负责基于已编译 plan 产出 host,不重新发明第二套装配逻辑
|
|
406
|
+
- `host.builder` 声明对象本身不得带副作用
|
|
407
|
+
|
|
408
|
+
## Settings Provider 规则
|
|
409
|
+
|
|
410
|
+
`settings.provider` 是正式补丁提供者,不是第二套运行时配置读取入口。
|
|
411
|
+
|
|
412
|
+
正式要求:
|
|
413
|
+
|
|
414
|
+
- 每个 `settings.provider` 必须至少具备:
|
|
415
|
+
- `kind = "settings.provider"`
|
|
416
|
+
- `id`
|
|
417
|
+
- `owner_app`
|
|
418
|
+
- `api_version`
|
|
419
|
+
- `priority`
|
|
420
|
+
- `provider`
|
|
421
|
+
- `provider` 必须实现:
|
|
422
|
+
- `provide(ctx: SettingsProviderContext) -> tuple[SettingsPatch, ...]`
|
|
423
|
+
- `SettingsProviderContext` 至少包含:
|
|
424
|
+
- `project`
|
|
425
|
+
- `snapshot`
|
|
426
|
+
- `settings`
|
|
427
|
+
- `SettingsPatch` 至少包含:
|
|
428
|
+
- `app_id`
|
|
429
|
+
- `payload`
|
|
430
|
+
- `source`
|
|
431
|
+
- `priority`
|
|
432
|
+
|
|
433
|
+
约束:
|
|
434
|
+
|
|
435
|
+
- provider 只能返回结构化 patch,不得直接改写全局 settings 状态
|
|
436
|
+
- patch 只允许写正式 schema 已声明字段
|
|
437
|
+
- provider 应幂等、可重复执行、尽量纯函数
|
|
438
|
+
- 同目标路径同优先级冲突直接报错
|
|
439
|
+
- 运行时代码仍然只能通过 `pz_settings_center` 读取配置
|
|
440
|
+
|
|
441
|
+
## URL 组装规则
|
|
442
|
+
|
|
443
|
+
URL 管理采用 Django 式集中装配模型:
|
|
444
|
+
|
|
445
|
+
- 每个 app 的正式路由入口固定为 `<pkg>.urls`
|
|
446
|
+
- 简单 app 使用 `urls.py`
|
|
447
|
+
- 复杂 app 使用 `urls/` 目录,但正式入口固定为 `urls/__init__.py`
|
|
448
|
+
- `<pkg>.urls` 使用 FastAPI 原生 `APIRouter()` / `include_router()` 声明本 app 的路由树
|
|
449
|
+
- 官方扩展层统一收集所有 app 的 URL 声明,形成单一 route registry
|
|
450
|
+
- Web host 只加载每个 app 的 `<pkg>.urls`
|
|
451
|
+
- prefix 由上层统一挂载
|
|
452
|
+
- 统一的 `clean_and_reorder_routes()` 只能存在于官方扩展层,并且必须在所有 app、host route、mount 都加载完成后最后执行
|
|
453
|
+
- route namespace 必须稳定、清晰、可审计
|
|
454
|
+
- 全站 trailing-slash 规范只能有一个正式解决方案
|
|
455
|
+
|
|
456
|
+
全站 trailing-slash 正式方案:
|
|
457
|
+
|
|
458
|
+
- slash 语义的正式真相源属于 route manifest,而不是业务包局部 helper
|
|
459
|
+
- 每条正式 URL 只允许声明一个 canonical 版本;目录型页面 canonical 必须带 `/`,文件型 URL canonical 不带 `/`
|
|
460
|
+
- host 必须基于已编译的 route manifest 与正式 redirect middleware 统一执行 slash normalization
|
|
461
|
+
- 业务包不得各自手写第二套 trailing-slash redirect、canonical 修正或 slash dedupe
|
|
462
|
+
- FastAPI/Starlette 默认的 `redirect_slashes` 不是正式契约真相源;host 应显式关闭这套默认行为,并只保留正式 redirect owner 的统一规范化结果
|
|
463
|
+
- canonical、hreflang、sitemap、内部链接、redirect target 都必须消费同一套 slash 规则
|
|
464
|
+
|
|
465
|
+
SEO 口径:
|
|
466
|
+
|
|
467
|
+
- Google 将带 `/` 与不带 `/` 视为两个不同 URL;正式系统必须为每个公开页面选定唯一 preferred canonical
|
|
468
|
+
- preferred canonical 必须通过稳定的永久重定向与一致的 canonical/hreflang/sitemap/internal links 表达
|
|
469
|
+
- 是否选择“目录带 `/`、文件不带 `/`”不是 SEO 成败关键;单一 canonical、一致输出与永久重定向才是正式要求
|
|
470
|
+
|
|
471
|
+
不允许:
|
|
472
|
+
|
|
473
|
+
- app 在 `apps.py`、`startup()`、`lifespan` 中局部拼装 URL 主链
|
|
474
|
+
- 宿主在 `main.py` 或 host 壳中手写 app 级路由排序规则
|
|
475
|
+
- 依赖 app-local 的 route repair / dedupe / reorder 作为正式冲突治理
|
|
476
|
+
- 业务包自己承担 prefix 挂载、跨 app 装配或最终清理职责
|
|
477
|
+
- 各 app 自己复制机制性 helper,形成第二套路由装配框架
|
|
478
|
+
- 各 app 自己实现第二套 trailing-slash middleware、slash redirect helper 或 canonical slash 修补逻辑
|
|
479
|
+
|
|
480
|
+
## CLI 与脚手架规则
|
|
481
|
+
|
|
482
|
+
CLI 命令入口属于 `pz`,因为用户安装 `pz` 后就应当拥有统一根命令。
|
|
483
|
+
|
|
484
|
+
因此:
|
|
485
|
+
|
|
486
|
+
- `pz` 根命令名与保留命令路径在 `pz` 中定义
|
|
487
|
+
- `pz` 同时保留顶层 root CLI provider 协议、分发规则与内建作者面实现
|
|
488
|
+
- `pz env` / `pz settings` / `pz startapp` / `pz app|dev|pub` 的具体实现统一放在 `pz`
|
|
489
|
+
- `pz` 不为具体业务宿主再开第二套 init 命令或 `--profile <business>` 参数
|
|
490
|
+
|
|
491
|
+
高层、官方模板化能力应优先放到官方扩展层,例如:
|
|
492
|
+
|
|
493
|
+
- richer host template
|
|
494
|
+
- 官方 app 模板集合
|
|
495
|
+
- 官方项目模板集合
|
|
496
|
+
|
|
497
|
+
也就是说:
|
|
498
|
+
|
|
499
|
+
- 命令协议、根分发与项目作者面实现都在 `pz`
|
|
500
|
+
- `pz_contrib` 不再承载第二套脚手架或项目 settings 作者面实现
|
|
501
|
+
- 当前版本不定义“初始化骨架扩展点”;`pz` 的项目作者面骨架只来自内建通用实现
|
|
502
|
+
- 业务化项目级默认值不应通过第二套命令或隐式注册器注入;app 作者面模板固定为各自配对的 `configs/default.jsonc` / `configs/default.env`,并且只由 `pz settings init/update` 同步到项目配置与项目 `.env*`
|
|
503
|
+
|
|
504
|
+
### `cli.tool` 正式对象形状
|
|
505
|
+
|
|
506
|
+
`cli.tool` 必须是带命令元数据的命令对象,而不是散落在任意模块里的自由函数。
|
|
507
|
+
|
|
508
|
+
正式要求:
|
|
509
|
+
|
|
510
|
+
- 每个 `cli.tool` 必须至少具备:
|
|
511
|
+
- `kind = "cli.tool"`
|
|
512
|
+
- `id`
|
|
513
|
+
- `owner_app`
|
|
514
|
+
- `api_version`
|
|
515
|
+
- `priority`
|
|
516
|
+
- `command`
|
|
517
|
+
- `summary`
|
|
518
|
+
- `tool`
|
|
519
|
+
- `tool` 必须实现:
|
|
520
|
+
- `configure(parser) -> None`
|
|
521
|
+
- `run(ctx: CliInvocationContext) -> int`
|
|
522
|
+
- `CliInvocationContext` 至少包含:
|
|
523
|
+
- `project`
|
|
524
|
+
- `args`
|
|
525
|
+
- `stdout`
|
|
526
|
+
- `stderr`
|
|
527
|
+
|
|
528
|
+
约束:
|
|
529
|
+
|
|
530
|
+
- `command` 必须是稳定命令路径,例如 `("settings", "sync")`
|
|
531
|
+
- `configure()` 只配置参数,不执行副作用
|
|
532
|
+
- `run()` 必须返回明确 exit code
|
|
533
|
+
- 命令冲突按 `priority` 裁决;同优先级冲突直接报错
|
|
534
|
+
- CLI 发现只基于正式 `cli/` 目录约定与 `CliToolSpec` 对象,不靠动态脚本猜测
|
|
535
|
+
- CLI 发现必须在 `RuntimePlan` 编译阶段产出 `cli_manifest`
|
|
536
|
+
- Web / CLI / worker 执行阶段只允许消费 `RuntimePlan.cli_manifest`,不得重新扫描目录生成第二份命令图
|
|
537
|
+
|
|
538
|
+
## 稳定性目标
|
|
539
|
+
|
|
540
|
+
`pz` 基础层达到冻结线后,应遵循:
|
|
541
|
+
|
|
542
|
+
- 默认不改
|
|
543
|
+
- 改动必须证明是合同级问题
|
|
544
|
+
- 新功能默认进入扩展层
|
|
545
|
+
|
|
546
|
+
验收标准:
|
|
547
|
+
|
|
548
|
+
- 新业务不需要修改 `pz` 就能接入
|
|
549
|
+
- 官方通用能力不需要宿主手写壳
|
|
550
|
+
- 宿主只做装配和配置
|