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,269 @@
|
|
|
1
|
+
# 首屏展示与首帧稳定规范
|
|
2
|
+
|
|
3
|
+
> 本文只约束“对外部可见且需要 SEO 的 HTML 页面”的正式首屏主链;`admin`、内部运营页、自用后台、强登录态工作台默认不强制纳入。
|
|
4
|
+
> 本文中的 settings 仍统一采用正式读取面:`import pz_settings_center.public as settings_center`,并通过 `settings_center.settings.<app_id>.<field>` 或 `settings_center.settings.project.<field>` 读取。
|
|
5
|
+
> `pz_site_ui` 的公开站点前端组件作者面约定见 `../../../pz_contrib/pz_site_ui/docs/前端组件约定.md`;公开页面图片、hero、媒体组件和业务模板边界应先遵守该约定。
|
|
6
|
+
|
|
7
|
+
## 1. 目标
|
|
8
|
+
|
|
9
|
+
首屏展示不是单页优化技巧,而是 `pz` 站点型页面的正式运行时约束。
|
|
10
|
+
|
|
11
|
+
这套规范固定三件事:
|
|
12
|
+
|
|
13
|
+
- 公开 HTML 页面的首屏可见内容必须以后端渲染为正式主链
|
|
14
|
+
- 共享首帧稳定治理由 shared site UI owner 落地,页面 SEO 主链由 SEO owner 消费
|
|
15
|
+
- 业务 app 只负责在自己的页面边界内声明内容、状态和资源,不再各页复制第二套首屏修法
|
|
16
|
+
|
|
17
|
+
## 2. 适用范围
|
|
18
|
+
|
|
19
|
+
适用页面:
|
|
20
|
+
|
|
21
|
+
- 公开首页、落地页、博客、CMS 页面、公开关键词页、帮助页
|
|
22
|
+
- 其它可直接被搜索引擎、分享卡片、外部链接访问的 HTML 页面
|
|
23
|
+
|
|
24
|
+
默认不强制:
|
|
25
|
+
|
|
26
|
+
- `admin`
|
|
27
|
+
- 内部工具页
|
|
28
|
+
- 纯登录后工作台
|
|
29
|
+
- 仅面向运营人员的强用户态控制面
|
|
30
|
+
|
|
31
|
+
## 3. 正式主线
|
|
32
|
+
|
|
33
|
+
对外部可见且需要 SEO 的 HTML 页面,固定遵循这一条正式主线:
|
|
34
|
+
|
|
35
|
+
1. 请求进入统一 host 与共享 runtime
|
|
36
|
+
2. 页面路由在进入模板前绑定正式请求期页面状态
|
|
37
|
+
3. 后端直接输出首屏可见正文、稳定翻译、SEO 关键文案与结构化数据
|
|
38
|
+
4. 模板输出首屏关键资源 hints 与正式 bundle 声明
|
|
39
|
+
5. 前端只做 hydrate、交互增强、异步刷新与非首屏区块补充
|
|
40
|
+
|
|
41
|
+
不允许:
|
|
42
|
+
|
|
43
|
+
- 把首屏正文、首屏 CTA、SEO 主文案依赖前端二次请求后再补齐
|
|
44
|
+
- 把结构化数据真相源放到客户端拼接
|
|
45
|
+
- 把“先渲染临时状态,再靠客户端纠偏”当成长期正式方案
|
|
46
|
+
|
|
47
|
+
## 4. 页面状态合同
|
|
48
|
+
|
|
49
|
+
公开 HTML 页面在进入模板前,必须先绑定统一请求期页面状态。
|
|
50
|
+
|
|
51
|
+
至少包含:
|
|
52
|
+
|
|
53
|
+
- `lang`
|
|
54
|
+
- `translation_module`
|
|
55
|
+
- `page_profile`
|
|
56
|
+
- `translation_bundles`
|
|
57
|
+
- `client_translation_scopes`
|
|
58
|
+
- `page_supported_language`
|
|
59
|
+
- `page_language_alternates`
|
|
60
|
+
|
|
61
|
+
规则:
|
|
62
|
+
|
|
63
|
+
- 共享模板层、共享翻译 facade、共享语言切换逻辑优先消费这份请求期合同
|
|
64
|
+
- 业务路由不应长期各自手写同构 `request.state` 注入
|
|
65
|
+
- 若某类页面状态会在多个页面重复出现,应优先沉淀到 shared site UI owner 或对应正式共享 helper
|
|
66
|
+
- 若公开页面需要服务内 SSR 片段缓存,正式声明位固定为 `page_profile.page_config.render_cache`;共享层只消费这份页面事实,不再在实现里猜测页面依赖或长期硬编码业务字段。
|
|
67
|
+
|
|
68
|
+
`page_config.render_cache` 约束:
|
|
69
|
+
|
|
70
|
+
- 缓存对象必须是页面内的 SSR 片段,不是整页匿名壳体。
|
|
71
|
+
- 必须显式声明 `slot`、目标受众和 `vary` 页面事实。
|
|
72
|
+
- 受众与 `Vary` 必须对齐最终 HTML 受众;登录态、cookie 态和语言态不可偷跑到匿名缓存。
|
|
73
|
+
|
|
74
|
+
## 5. SSR 首帧规则
|
|
75
|
+
|
|
76
|
+
固定规则:
|
|
77
|
+
|
|
78
|
+
- SSR 首帧必须直接输出稳定可见状态
|
|
79
|
+
- 能从当前请求直接判定的状态,必须优先 SSR 输出最终态
|
|
80
|
+
- 只有依赖纯客户端判定的临时 UI,SSR 才默认隐藏,初始化后 reveal
|
|
81
|
+
- 初始化测量阶段不得暴露中间态动画
|
|
82
|
+
- 任何需要尺寸测量、运行时裁剪或客户端恢复后才能稳定的 UI,必须先隐藏或保持稳定占位态
|
|
83
|
+
|
|
84
|
+
可直接 SSR 判定的常见来源:
|
|
85
|
+
|
|
86
|
+
- `cookie`
|
|
87
|
+
- `Accept-Language`
|
|
88
|
+
- 请求头
|
|
89
|
+
- 已编译 settings
|
|
90
|
+
- `module_config`
|
|
91
|
+
- 当前请求 URL / path params / query params
|
|
92
|
+
|
|
93
|
+
不采用:
|
|
94
|
+
|
|
95
|
+
- refresh snapshot shell 一类旧页面状态复用方案
|
|
96
|
+
- 旧 DOM overlay 一类覆盖旧 DOM 的方案
|
|
97
|
+
- 第二套页面壳
|
|
98
|
+
- 匿名缓存首帧后再由客户端纠正登录态或语言态
|
|
99
|
+
|
|
100
|
+
## 6. 首屏内容与翻译
|
|
101
|
+
|
|
102
|
+
公开 HTML 页面必须满足:
|
|
103
|
+
|
|
104
|
+
- 首屏可见正文以后端渲染为正式真相源
|
|
105
|
+
- SEO 关键文案以后端渲染为正式真相源
|
|
106
|
+
- 结构化数据所需稳定文本以后端渲染为正式真相源
|
|
107
|
+
- 首屏稳定翻译必须按当前页面和当前语言直接输出
|
|
108
|
+
|
|
109
|
+
前端翻译请求只允许用于:
|
|
110
|
+
|
|
111
|
+
- 非首屏交互区块
|
|
112
|
+
- 异步组件
|
|
113
|
+
- 缺词补拉
|
|
114
|
+
|
|
115
|
+
不允许:
|
|
116
|
+
|
|
117
|
+
- 把首屏正文翻译依赖前端拉取
|
|
118
|
+
- 为图省事把整模块或整站翻译全集注入 HTML
|
|
119
|
+
|
|
120
|
+
补充要求:
|
|
121
|
+
|
|
122
|
+
- SEO/landing/公开关键词页/博客/帮助页这类可缓存公开页面,首屏翻译网络请求目标应为 `0`
|
|
123
|
+
- 纯 SSR 页面应显式给出空的前端增量取词范围,而不是依赖隐式缺省
|
|
124
|
+
|
|
125
|
+
## 7. 首屏关键资源
|
|
126
|
+
|
|
127
|
+
首屏关键资源固定规则:
|
|
128
|
+
|
|
129
|
+
- 首屏关键图必须显式声明为 eager / high priority
|
|
130
|
+
- 不允许把首屏关键图长期保留为 `loading=\"lazy\"`
|
|
131
|
+
- 页面级正式聚合产物必须声明在 `page_config.asset_bundle`
|
|
132
|
+
- 非首屏增强脚本若需延后加载,正式声明位固定为 `page_config.deferred_js`
|
|
133
|
+
|
|
134
|
+
共享层责任:
|
|
135
|
+
|
|
136
|
+
- shared site UI owner 统一消费正式 bundle 声明与 deferred 声明
|
|
137
|
+
- 对共享默认首屏 hero,shared site UI owner 应在 head 输出正式图片 preload
|
|
138
|
+
- 响应式图片、hero 图片、卡片媒体图等公开站点前端优化应优先沉淀为 `pz_site_ui` 组件,业务模板只声明源图、alt、尺寸和关键资源语义
|
|
139
|
+
|
|
140
|
+
业务责任:
|
|
141
|
+
|
|
142
|
+
- 若业务覆盖了首屏 hero 图片源,必须通过 `pz_site_ui` 组件或正式资源 hint 合同声明关键资源语义,不在业务模板中手写第二套 preload / `srcset` / `sizes`
|
|
143
|
+
- 首屏关键交互必须留在 critical bundle 中,不得误塞到 deferred loader
|
|
144
|
+
- 业务 JS 不得用 `new Image()` 主动预加载公开首屏或非首屏原始大图,避免绕过浏览器 `srcset` 选择与资源优先级调度
|
|
145
|
+
|
|
146
|
+
## 8. 共享运行时与用户态启动
|
|
147
|
+
|
|
148
|
+
共享首帧治理默认由 shared site UI owner 落地。
|
|
149
|
+
|
|
150
|
+
固定规则:
|
|
151
|
+
|
|
152
|
+
- 共享用户态启动链只有一条,由 shared site UI owner 的正式 user runtime 持有
|
|
153
|
+
- 用户态变更事件只允许由 shared site UI owner 的正式 user runtime 派发
|
|
154
|
+
- 会话检查、登出委托、CSRF/请求头等公开页通用会话能力,应收敛在共享 base/runtime 主链
|
|
155
|
+
- 依赖 session probe 的公开 shell 组件必须走 shared site UI owner 的 session stable island 合同;SSR 匿名占位、probe pending、resolved out/in 与 re-probe 保持已解析状态必须由同一套 helper 管理
|
|
156
|
+
- 同一 tab 硬刷新恢复只允许保存最小 UI hint,且必须同时校验 session cookie hint;不得把用户资料或账户事实放进客户端首帧恢复缓存
|
|
157
|
+
- 语言切换路径解析、语言偏好持久化与统一 `changeLanguage` 入口,也应收敛在共享 base/runtime 主链
|
|
158
|
+
|
|
159
|
+
业务脚本不要做:
|
|
160
|
+
|
|
161
|
+
- 页面启动时再次主动调用共享会话检查
|
|
162
|
+
- 在业务脚本里自行派发用户态变更事件
|
|
163
|
+
- 为 Login、Dashboard 或其它 session 相关 shell CTA 复制第二套防闪状态机
|
|
164
|
+
- 为 header、footer、语言推荐、cookie banner 各自维护第二套用户态或语言态启动链
|
|
165
|
+
|
|
166
|
+
## 9. Hydration 与增强
|
|
167
|
+
|
|
168
|
+
若共享或业务 widget 已经在 SSR 输出 root、launcher 或 config,客户端只能 hydrate 现有结构。
|
|
169
|
+
|
|
170
|
+
不允许:
|
|
171
|
+
|
|
172
|
+
- 先渲染一个版本,再用 `innerHTML` 整块替换
|
|
173
|
+
- 把共享 SSR root 当成临时占位,然后客户端再重建第二份 DOM
|
|
174
|
+
|
|
175
|
+
前端正式职责只有:
|
|
176
|
+
|
|
177
|
+
- hydrate 现有节点
|
|
178
|
+
- 补齐缺失交互
|
|
179
|
+
- 刷新异步数据
|
|
180
|
+
- 加载非首屏增强区块
|
|
181
|
+
|
|
182
|
+
## 10. 页面级行为声明
|
|
183
|
+
|
|
184
|
+
页面级行为必须显式声明开启,不得由全局模板默认注入。
|
|
185
|
+
|
|
186
|
+
包括但不限于:
|
|
187
|
+
|
|
188
|
+
- required-post
|
|
189
|
+
- heartbeat
|
|
190
|
+
- 轮询端点
|
|
191
|
+
- 页面保活路径
|
|
192
|
+
|
|
193
|
+
规则:
|
|
194
|
+
|
|
195
|
+
- 由页面或模块显式 opt-in
|
|
196
|
+
- 共享层按声明注入到首帧配置或共享 runtime
|
|
197
|
+
- 不允许在全局页面壳里给所有页面默认注入同一条 heartbeat 或 required-post path
|
|
198
|
+
|
|
199
|
+
## 11. 缓存与受众对齐
|
|
200
|
+
|
|
201
|
+
SSR 输出与缓存头必须对齐最终受众。
|
|
202
|
+
|
|
203
|
+
公开匿名 HTML 正式口径:
|
|
204
|
+
|
|
205
|
+
- 浏览器侧:`Cache-Control: public, max-age=0, must-revalidate`
|
|
206
|
+
- CDN 侧:`Cloudflare-CDN-Cache-Control: public, max-age=<ttl_seconds>`,TTL 唯一来自 `apps.pz_foundation.cache_control.policies["http.public_html_cdn"].ttl_seconds`
|
|
207
|
+
|
|
208
|
+
用户态 HTML 正式口径:
|
|
209
|
+
|
|
210
|
+
- `Cache-Control: private, no-store, no-cache, must-revalidate, max-age=0, s-maxage=0`
|
|
211
|
+
- `Cloudflare-CDN-Cache-Control: no-store`
|
|
212
|
+
- `Vary: Cookie, Authorization`
|
|
213
|
+
|
|
214
|
+
补充规则:
|
|
215
|
+
|
|
216
|
+
- 若页面用户态依赖认证 cookie 集合,这个集合必须进入正式 settings/defaults/normalize 链
|
|
217
|
+
- 不允许拆成“框架内建识别一部分、宿主配置再补一部分、CDN 规则再猜一部分”的三套真相源
|
|
218
|
+
|
|
219
|
+
## 12. 合规与首屏解耦
|
|
220
|
+
|
|
221
|
+
cookie consent 的正式职责仅限于:
|
|
222
|
+
|
|
223
|
+
- 合规展示
|
|
224
|
+
- 偏好持久化
|
|
225
|
+
- telemetry / ads / analytics consent 信号同步
|
|
226
|
+
|
|
227
|
+
不得反向控制:
|
|
228
|
+
|
|
229
|
+
- 支付
|
|
230
|
+
- 登录
|
|
231
|
+
- 上传
|
|
232
|
+
- 翻译
|
|
233
|
+
- 搜索
|
|
234
|
+
- 导航
|
|
235
|
+
- 会话恢复
|
|
236
|
+
|
|
237
|
+
无论用户接受、拒绝,或浏览器拒绝 `localStorage` / cookie 持久化:
|
|
238
|
+
|
|
239
|
+
- 页面核心功能都必须继续可用
|
|
240
|
+
- 失败只能退化为“偏好无法持久化”
|
|
241
|
+
|
|
242
|
+
## 13. 分层落位
|
|
243
|
+
|
|
244
|
+
责任划分固定如下:
|
|
245
|
+
|
|
246
|
+
- `pz`
|
|
247
|
+
- 不承载首屏展示具体实现
|
|
248
|
+
- 只承载稳定协议、运行图编译与统一装配合同
|
|
249
|
+
- `pz_contrib`
|
|
250
|
+
- 承载共享 host、shared site UI owner、SEO owner 等正式消费主链
|
|
251
|
+
- shared site UI owner
|
|
252
|
+
- 落地共享首帧稳定治理与请求期页面状态 helper
|
|
253
|
+
- SEO owner
|
|
254
|
+
- 消费页面 SEO provider / sitemap provider,不拥有页面内容真相
|
|
255
|
+
- 业务 app
|
|
256
|
+
- 提供页面内容、页面状态声明、页面资源声明与 provider
|
|
257
|
+
- 不复制第二套首屏 runtime
|
|
258
|
+
|
|
259
|
+
## 14. 文档关系
|
|
260
|
+
|
|
261
|
+
本文是首屏展示规范的统一真相源。
|
|
262
|
+
|
|
263
|
+
其它文档与本文的关系固定为:
|
|
264
|
+
|
|
265
|
+
- `14-分层与扩展规范`:定义它属于哪一层、由谁负责
|
|
266
|
+
- `15-子包开发使用手册`:给开发者提供可执行落地规则
|
|
267
|
+
- `21-contrib约定与Provider接入规范`:说明 shared site UI owner / SEO owner 如何正式落地
|
|
268
|
+
|
|
269
|
+
若这些文档与本文冲突,以本文为准。
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
# `pz` 启动与运行时编译流程
|
|
2
|
+
|
|
3
|
+
## 1. 目标
|
|
4
|
+
|
|
5
|
+
本文件只回答一件事:
|
|
6
|
+
|
|
7
|
+
- `pz` 启动项目时,正式做了哪些事情
|
|
8
|
+
|
|
9
|
+
它描述的是 `pz` 总体启动与编译主链,不替代具体子包的 owner 文档。
|
|
10
|
+
|
|
11
|
+
## 2. 总原则
|
|
12
|
+
|
|
13
|
+
- `pz` 是唯一正式基础包,也是唯一可独立启动的包
|
|
14
|
+
- `pz` / `pz` 的正式入口,最终都要进入同一条 `RuntimePlan` 编译链
|
|
15
|
+
- 启动过程必须先编译,再执行
|
|
16
|
+
- Web / CLI / worker 运行期只消费编译结果,不再二次扫描或二次 merge
|
|
17
|
+
|
|
18
|
+
补充:
|
|
19
|
+
|
|
20
|
+
- `pz` 是直接 CLI 真相源
|
|
21
|
+
- `pz` 是正式 launcher facade
|
|
22
|
+
- `pz` launcher 只负责在进入 `pz_core.cli:main` 前选择 provider,不得定义第二套运行时或第二套编译链;`pz.root_cli` 只是顶层命令 provider group
|
|
23
|
+
|
|
24
|
+
## 3. `pz` 启动时做什么
|
|
25
|
+
|
|
26
|
+
`pz` 启动项目时,正式主链固定为:
|
|
27
|
+
|
|
28
|
+
0. 先为这次 `pz` 命令选择 provider:项目 `.venv` -> 项目 dev manifest 里记录的 `apps/.sources/pz` bootstrap runtime -> 当前解释器 `site-packages` -> `uv tool run --from pz-cli pz`
|
|
29
|
+
1. 解析 `project_dir`
|
|
30
|
+
2. 解析 `PZ_ENV`
|
|
31
|
+
3. 读取项目 `pz*.jsonc`、项目 `.env*` 与显式环境变量,编译 `SettingsSnapshot`
|
|
32
|
+
4. 解析 `installed_apps`,展开正式最小子包顺序
|
|
33
|
+
5. 编译 `AppRegistry`
|
|
34
|
+
6. 按 app 顺序发现并合并资源目录
|
|
35
|
+
7. 编译 `ResourceManifest`
|
|
36
|
+
8. 编译 `InfraContext`
|
|
37
|
+
9. 编译 `RouteManifest` 与 `MiddlewareManifest`
|
|
38
|
+
10. 组装 `CapabilityRegistry`
|
|
39
|
+
11. 产出统一 `RuntimePlan`
|
|
40
|
+
12. Web / CLI / worker 只消费该 `RuntimePlan` 进入执行阶段
|
|
41
|
+
|
|
42
|
+
`pz run` / Web startup 不直接读取各子包 `configs/default.jsonc` / `configs/default.env`,也不在启动链中临时补写默认值。需要判断项目 settings 是否落后于当前 app 默认模板时,统一通过 `pz check` 暴露 settings update drift 诊断;该诊断复用 `pz settings update` 的 dry-run 计划,并输出同一份 `CheckReport`。
|
|
43
|
+
|
|
44
|
+
第 0 步的边界固定为:
|
|
45
|
+
|
|
46
|
+
- `pz` 是高频基础入口,定型后只允许 bugfix、contract 补齐与明确纳入 contract 的新能力
|
|
47
|
+
- 不得随业务能力变化而改变既有命令语义、provider 顺序、入口函数、安装依赖边界或 `project_dir` 解析规则
|
|
48
|
+
- 只负责选择这次命令使用哪个 `pz_core.cli:main`
|
|
49
|
+
- 不负责重新定义 settings、resource、route、capability 规则
|
|
50
|
+
- 一旦 provider 选定,后续仍然进入同一条正式 `RuntimePlan` 编译链
|
|
51
|
+
|
|
52
|
+
第 4 步的 `installed_apps` 展开规则固定为:
|
|
53
|
+
|
|
54
|
+
- `installed_apps` 只表达装载顺序和扫描入口,不表达第二套源码映射。
|
|
55
|
+
- 运行时不硬编码 `apps`,只展开当前项目配置中实际声明的 `installed_apps` 条目;默认项目配置会声明 `apps` 作为扫描目录。
|
|
56
|
+
- 若配置条目是 `apps`,框架只扫描项目 `apps/` 下的真实本地 app 和可见受管快捷方式。
|
|
57
|
+
- 物理 `apps/.sources/` 永远不贡献 app,也不会因额外 import root 或 symlink 隐式进入运行时 namespace。
|
|
58
|
+
- 目录 binding 只展开快捷方式下顶层正式叶子;叶子 binding 只暴露一个正式叶子。快捷方式的 realpath 必须与 typed v5 manifest 完全一致。
|
|
59
|
+
- 同一 `app_id` 若同时存在于项目源码扫描范围和当前解释器 `site-packages`,项目源码优先;同一 `app_id` 若在多个项目本地源码位置同时出现,则编译前作者面检查必须要求人工收敛。
|
|
60
|
+
- `SettingsSnapshot.import_roots` 由已声明 app 的 import root 加上这些 app 在本地 source-root 中声明的 path 依赖递归组成;它不是 source-root 全量包扫描结果。
|
|
61
|
+
- 运行时允许 `mission_carrier` 这类已装载 app 通过正式依赖获得 `agent_tool_contracts` 这样的本地源码依赖,但普通 site runtime / contrib 包不能因此被迫直接依赖 Agent / Tool 运行时内部实现。
|
|
62
|
+
|
|
63
|
+
## 4. 启动期资源合并
|
|
64
|
+
|
|
65
|
+
每个最小子包都可以提供正式作者资源目录:
|
|
66
|
+
|
|
67
|
+
- `pages/`
|
|
68
|
+
- `template_config/`
|
|
69
|
+
- `locales/`
|
|
70
|
+
- `templates/`
|
|
71
|
+
- `static/`
|
|
72
|
+
- `migrations/`
|
|
73
|
+
|
|
74
|
+
这些目录都属于最小子包自己的源码真相源。
|
|
75
|
+
|
|
76
|
+
`pz` 启动项目时,`pz` 会按正式 app 启动顺序,把这些目录合并到当前项目的运行时聚合目录中;后出现的 app 覆盖先出现的同名资源。
|
|
77
|
+
|
|
78
|
+
作者面的正式配置入口固定为 `resources.items`。
|
|
79
|
+
|
|
80
|
+
- 每个资源项至少声明 `name`
|
|
81
|
+
- 资源聚合输出根目录由 `resources.output_root` 决定
|
|
82
|
+
- 资源 manifest 文件名由 `resources.manifest_name` 决定
|
|
83
|
+
- 资源 staging 目录名由 `resources.staging_dir` 决定
|
|
84
|
+
- 资源编译锁文件名由 `resources.lock_name` 决定
|
|
85
|
+
- 实际输出路径按当前 `PZ_ENV` 分区:`resources.output_root` 落在 `<cache_dir>/<pz_env>/` 下,资源锁落在 `<runtime_dir>/<pz_env>/locks/` 下;同一项目同时运行 develop 与 product 时不得共享同一套派生资源目录
|
|
86
|
+
|
|
87
|
+
正式要求:
|
|
88
|
+
|
|
89
|
+
- `pages/`、`template_config/`、`locales/`、`templates/`、`static/`、`migrations/` 必须服从同一套资源覆盖语义
|
|
90
|
+
- `pz` 资源层的正式语义是文件级别的覆盖
|
|
91
|
+
- 不允许某个子系统再为其中某一类目录定义第二套扫描规则、优先级规则或私有覆盖规则
|
|
92
|
+
- 运行期各子系统消费的是合并后的正式结果,而不是逐个子包现扫现拼
|
|
93
|
+
- 单个 app 的资源发现结果统一落在 `ResourceSource.items`
|
|
94
|
+
- 当前项目的统一资源编译结果统一落在 `ResourceManifest.items`
|
|
95
|
+
|
|
96
|
+
这里的“文件级别覆盖”指:
|
|
97
|
+
|
|
98
|
+
- 资源层首先裁决的是“同一个相对路径最终保留哪一个文件”
|
|
99
|
+
- 它不是页面声明 payload 的 `dict merge`
|
|
100
|
+
- 它也不是业务子域私有 JSON 合并协议
|
|
101
|
+
|
|
102
|
+
补充说明:
|
|
103
|
+
|
|
104
|
+
- 当前若某个官方子包在资源 build 阶段对特定文件类型做了额外结构化 merge,应视为局部实现或待收口特例,不应反向改写 `pz` 资源层的总语义
|
|
105
|
+
- 页面声明的 `dict` 级递归 merge,仍然归属于 `pz_page_center` 编译阶段,而不属于 `pz` 通用资源层;页面声明任意层都可通过 `$merge` 编译指令声明 path-level replace/deep-merge 策略,但这仍是 page center 子域编译语义
|
|
106
|
+
|
|
107
|
+
## 5. 合并目录与原始资源的边界
|
|
108
|
+
|
|
109
|
+
合并目录只是运行时派生产物,不是作者面真相源。
|
|
110
|
+
|
|
111
|
+
正式要求:
|
|
112
|
+
|
|
113
|
+
- 页面、模板、文案、静态资源、迁移脚本的修改,都必须回到原始最小子包目录进行
|
|
114
|
+
- 不允许把合并目录里的文件直接当成长期维护入口
|
|
115
|
+
- 运行期读取方只能把 merged 结果视为只读输入
|
|
116
|
+
- 修改原始资源后,应通过重新启动或重新编译,生成新的正式合并结果
|
|
117
|
+
|
|
118
|
+
## 5.1 merge 函数分层
|
|
119
|
+
|
|
120
|
+
全项目正式 merge 函数只允许两类:
|
|
121
|
+
|
|
122
|
+
1. 文件夹覆盖合并函数
|
|
123
|
+
2. `dict` 深度合并函数
|
|
124
|
+
|
|
125
|
+
对应分层固定为:
|
|
126
|
+
|
|
127
|
+
1. `pz` 资源层的文件夹覆盖合并函数
|
|
128
|
+
2. 子域编译阶段的 `dict` 深度合并函数,例如 `page_center` 的页面声明 merge;该函数可以接收显式 path-level 策略,但策略来源和生效范围必须由子域 owner 声明
|
|
129
|
+
|
|
130
|
+
正式要求:
|
|
131
|
+
|
|
132
|
+
- 不允许新增第三类长期正式 merge 语义
|
|
133
|
+
- 这两类函数必须在语义上严格分层
|
|
134
|
+
- 不允许把子域编译期 merge 伪装成 `pz` 通用资源覆盖
|
|
135
|
+
- 也不允许让 `pz` 资源层承担业务子域 payload merge 职责
|
|
136
|
+
|
|
137
|
+
正式建议:
|
|
138
|
+
|
|
139
|
+
- 这两类 merge 函数后续应收敛到 `pz_contrib` 的共享 utils
|
|
140
|
+
- 当前若 `pz_contrib` 没有独立共享 utils 包,则应优先落在最接近平台资源 owner 的正式共享位置,而不是继续散落在各子包私有模块中
|
|
141
|
+
|
|
142
|
+
## 6. 页面域在启动期的消费方式
|
|
143
|
+
|
|
144
|
+
页面域只是这条总启动链上的一个正式消费者。
|
|
145
|
+
|
|
146
|
+
本节描述的是已经选择 Page Center 治理的页面。普通功能页、用户态页面和轻量站点页不因为是 HTML 页面就自动进入 Page Center;它们仍以 `<pkg>.urls` 为 URL 真相源,可以通过 `PageProfile` / `page.profile_provider` / `pz_site_ui` request page state 提供共享 shell、多语言和页面资产事实。
|
|
147
|
+
|
|
148
|
+
对页面系统来说,固定心智模型是:
|
|
149
|
+
|
|
150
|
+
1. 作者在各子包内维护原始 `pages/`、`template_config/`、`locales/`、`templates/`
|
|
151
|
+
2. `pz` 按 app 顺序统一合并资源
|
|
152
|
+
3. `pz_page_center` 消费 `ResourceManifest` 指向的合并后页面相关资源
|
|
153
|
+
4. 编译 `page_config`、`page_config_key`、页面合同、canonical path 与 slash policy,并贡献路由投影
|
|
154
|
+
5. 页面 runtime registry 作为 `RuntimePlan.runtime_manifests` 的正式 manifest 固化
|
|
155
|
+
6. URL manifest、worker 内 route materialize、startup 预热和页面 handler 都消费同一份已编译结果
|
|
156
|
+
|
|
157
|
+
页面系统的正式页面配置叫 `page_config`。`page_config` 通过 `pages/*.jsonc` 维护,`pages/base.jsonc`、`pages/<app_id>/base.jsonc` 和具体页面文件是同一个 `page_config` model 的不同叠加层。任意层都可以携带 `$merge.replace_paths` 和 `$merge.deep_merge_paths`,用于声明该层在叠加时哪些路径走替换、哪些路径重新打开深合并;各层 `$merge` 作为编译期策略累积,路径更深的 `deep_merge_paths` 可以排除上层 replace。该指令只参与编译,不进入 runtime snapshot。运行时按 URL 查 `page_config` 时使用 `page_config_key`;`page_config_key` 由 `path_segments + slug` 归一化得到,例如 `manga-translator` 或 `manga-translator/panel-ocr`。只注册 URL、没有具体 `page_config` 文件的默认页面,读取 `page_config` 时必须回落到对应层级的 base 合成配置。
|
|
158
|
+
|
|
159
|
+
`page.profile_provider` 不是路由声明,也不是第二套 `page_config`。它只为普通页面或其它内容 owner 提供页面框架事实;如果某页面需要由 Page Center 统一输出 canonical、alias、hreflang、sitemap、page renderer 或长尾治理投影,必须升级为 `pages/*.jsonc` 并进入本节的编译链。
|
|
160
|
+
|
|
161
|
+
页面系统不允许:
|
|
162
|
+
|
|
163
|
+
- 在运行期再次扫描原始 app 资源目录
|
|
164
|
+
- 在运行期自己重做一遍资源 merge
|
|
165
|
+
- 在 `RuntimePlan` 外再拼第二份页面图
|
|
166
|
+
- 让 URL manifest 和实际 FastAPI route materialize 使用不同的页面 registry
|
|
167
|
+
|
|
168
|
+
## 7. Foundation Route 与 URL 真相源
|
|
169
|
+
|
|
170
|
+
Foundation route 层是系统级 URL 装配、canonical、alias、尾斜杠、redirect 与路由冲突裁决的正式真相源。`RouteManifest` 是 `RuntimePlan` 的编译期产物;Web / worker materialize、redirect middleware、SEO / sitemap / hreflang 投影和页面 handler 都只能消费这份 manifest 或它的正式投影。
|
|
171
|
+
|
|
172
|
+
系统级 owner 固定为:
|
|
173
|
+
|
|
174
|
+
- `pz_foundation.routing`:提供 `path(...)`、`include(...)`、`mount(...)`、path convertor 与 canonical helper。
|
|
175
|
+
- `pz_foundation.route_owner` / redirect owner middleware:消费 `RouteManifest`,统一执行 slash normalization、canonical redirect 和冲突裁决。
|
|
176
|
+
- 页面类 owner、admin owner、auth owner 等子域只能向 `RouteManifest` 提交声明或消费它的投影,不得各自实现第二套路由核心。
|
|
177
|
+
|
|
178
|
+
系统级 URL 规则:
|
|
179
|
+
|
|
180
|
+
- `routing.default_language` 决定默认语言是否使用 prefixless canonical;如果默认语言是 `en`,则 `/en/xxx/` 的 canonical 是 `/xxx/`。
|
|
181
|
+
- `routing.all_supported_languages` 是语言前缀归一化、alias 解析和 route manifest 编译使用的系统 URL 语言全集;例如 `/zh-cn/` 301 到 `/zh-CN/`。它不是页面级 nav、hreflang 或 sitemap 暴露集合,页面类 owner 必须用自己的页面级语言事实约束对外投影。
|
|
182
|
+
- `routing.language_aliases` 是公开 URL 语言段的唯一别名表;语言别名不得分散写到 redirect 规则、业务 handler、SEO 或前端脚本里。
|
|
183
|
+
- 目录型 URL 统一保留结尾 `/`;文件型 URL 不强行加 `/`;exact URL 按声明保持精确匹配。
|
|
184
|
+
- page center 首页由 `page_config.home=true` 声明;默认语言首页 canonical 是 `/`,非默认语言首页 canonical 是 `/{lang}/`。如果首页 `page_config` 同时声明 `slug`,则 `/{slug}/`、`/{default_language}/{slug}/`、`/{lang}/{slug}/` 只是首页 alias。
|
|
185
|
+
- canonical、alias、301 redirect、hreflang、sitemap URL 必须由同一套 route manifest / canonical helper 生成,不得由 handler、SEO provider、sitemap provider 或前端脚本各自重算。
|
|
186
|
+
- 公开站内 href 生成必须走 Foundation canonical helper。Foundation helper 先执行默认语言 prefixless、语言 alias、尾斜杠等通用规则,再消费页面 owner 注册的 public route canonical resolver,把已编译 route facts 中的 alias path 映射回 canonical path。页面 owner 只贡献 canonical / alias facts,不在模板或 SEO provider 中重新实现站内链接归一规则。
|
|
187
|
+
- host 必须关闭 FastAPI / Starlette 默认 `redirect_slashes`,避免框架默认 `307/308` 与正式 canonical redirect 并存。
|
|
188
|
+
|
|
189
|
+
路由贡献与 materialize 规则:
|
|
190
|
+
|
|
191
|
+
- app 的 URL 真相源固定为 `<pkg>.urls`,或由正式 owner 在编译期产生 runtime manifest / route projection。
|
|
192
|
+
- 普通功能页、登录后页面和轻量支持页优先由 `<pkg>.urls` 提交显式路由;`PageProfile` 只提供共享 shell、多语言和页面状态事实,不替代 route contribution。
|
|
193
|
+
- route contribution 只提交路由来源、owner、path、path type / slash policy、route hints、override policy 等编译输入;最终跨 app 排序、冲突裁决和 materialize 只由 foundation route 编译链完成。
|
|
194
|
+
- 固定合同路由可以使用编译期枚举 path convertor,例如已知语言、已知 `page_config_key`。无限量动态 `slug` 不得膨胀为同等数量的 FastAPI route。
|
|
195
|
+
- 动态 `slug` 必须挂在已知父级合同路由之下,由 handler 做格式校验和 repository 查询;它不能反过来定义 route manifest。对 page center 来说,DB 长尾词实例必须挂在已编译 `page_config_key` 下。
|
|
196
|
+
- Foundation URL manifest 编译、worker 内 FastAPI route materialize、startup 预热和运行时 handler 必须消费同一份已编译 route manifest / runtime projection。
|
|
197
|
+
|
|
198
|
+
冲突优先级必须固定:
|
|
199
|
+
|
|
200
|
+
1. 显式具体路径优先于固定合同路由。
|
|
201
|
+
2. 固定合同路由优先于泛路由兜底。
|
|
202
|
+
3. 同一路径发生冲突时,如果已有路由不允许覆盖,则编译失败。
|
|
203
|
+
4. 如果已有路由允许覆盖,则后注册者按 `installed_apps` / 编译顺序覆盖,并写入冲突日志。
|
|
204
|
+
5. 泛路由兜底永远不能覆盖显式具体路径或固定合同路由。
|
|
205
|
+
|
|
206
|
+
执行阶段不得:
|
|
207
|
+
|
|
208
|
+
- 重新扫描 URL 声明或 owner runtime manifest。
|
|
209
|
+
- 在 `startup()` / `lifespan` 里补挂正式路由。
|
|
210
|
+
- 让 URL manifest 和实际 FastAPI route materialize 使用不同的 route graph。
|
|
211
|
+
- 在业务 handler、SEO、sitemap、redirect 或前端脚本里临时实现另一套语言前缀、尾斜杠、canonical 或 alias 规则。
|
|
212
|
+
|
|
213
|
+
## 8. 执行阶段不再做什么
|
|
214
|
+
|
|
215
|
+
进入执行阶段后,Web / CLI / worker 不再负责:
|
|
216
|
+
|
|
217
|
+
- 重新扫描 `installed_apps`
|
|
218
|
+
- 重新 merge `pages/`、`template_config/`、`locales/`、`templates/`、`static/`、`migrations/`
|
|
219
|
+
- 重新编译局部 settings
|
|
220
|
+
- 重新裁决 route / middleware / capability
|
|
221
|
+
- 重新发明一套局部 trailing-slash / canonical URL 规范
|
|
222
|
+
|
|
223
|
+
正式要求:
|
|
224
|
+
|
|
225
|
+
- 执行阶段只消费 `RuntimePlan`
|
|
226
|
+
- `startup()` / `lifespan` 只激活已经编译好的能力
|
|
227
|
+
- 不允许在执行阶段偷偷补第二套装配链
|
|
228
|
+
- URL slash normalization 必须消费编译后的 route manifest,不得在业务路由 handler 内临时重做一份全站规则
|
|
229
|
+
|
|
230
|
+
补充:
|
|
231
|
+
|
|
232
|
+
- route manifest 应显式携带正式 slash policy,例如目录型页面、文件型 URL 或 exact URL
|
|
233
|
+
- host 在挂载 route manifest 后统一提供 slash normalization
|
|
234
|
+
- 正式执行点应是 redirect owner middleware;不要依赖 FastAPI/Starlette 默认 `redirect_slashes`
|
|
235
|
+
- host 应关闭框架默认 `redirect_slashes`,避免默认 `307/308` 与正式 canonical redirect 并存
|
|
236
|
+
- canonical、hreflang、sitemap、redirect target 必须与这份 slash policy 一致
|
|
237
|
+
|
|
238
|
+
## 9. 对子包作者的直接结论
|
|
239
|
+
|
|
240
|
+
如果你在开发最小子包,只需要记住:
|
|
241
|
+
|
|
242
|
+
1. 原始文件改在子包自己的资源目录
|
|
243
|
+
2. 运行时读的是 `pz` 启动后生成的合并结果
|
|
244
|
+
3. 资源覆盖顺序只看 `installed_apps`
|
|
245
|
+
4. 编译先于运行;运行期不要再发明第二套发现、merge 或编译逻辑
|