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,671 @@
|
|
|
1
|
+
# 包与分发规范
|
|
2
|
+
|
|
3
|
+
> 历史说明:本文保留的 `legacy_core` 字样只用于描述迁移前分发方案、旧命令与禁用路径;当前正式基础包统一为 `pz`。
|
|
4
|
+
|
|
5
|
+
> 本文统一服从最高优先级公约:系统里真正存在的正式单位,只有最小子包;`pz` 是负责组装的基础包;`pz_framework`、`pz_apps`、`pz_apps` 等顶层源码组织根只用于 Git 管理,不进入运行时 namespace。
|
|
6
|
+
|
|
7
|
+
## 1. 目标
|
|
8
|
+
|
|
9
|
+
`pz` 必须优先被设计为标准 Python 安装包,而不是“需要内嵌到业务仓库才能正常运行”的子目录。
|
|
10
|
+
|
|
11
|
+
统一口径:
|
|
12
|
+
- `pz` 作为一个标准 Python 包进行分发、安装与开发管理
|
|
13
|
+
- settings surface owner 作为独立最小子包提供应用层 settings surface,物理源码落位由 owning 子包文档和仓库真相源地图维护
|
|
14
|
+
- 除 `pz` 基础包外,其它正式能力统一分发为独立最小子包 distribution
|
|
15
|
+
- 每个最小子包必须有稳定唯一的 `app_id`;新建子包默认让目录名、import 包名与 `app_id` 对齐,distribution 使用对应的 Python 分发名
|
|
16
|
+
- 正式命名不强制 `pz`、`pz` 或其它特定技术前缀;历史稳定 `app_id` 以已声明值为准,不因文档命名口径变化迁移
|
|
17
|
+
- 当前 `pz` 的开发、依赖锁定、命令执行、构建与测试统一使用 `uv` 管理
|
|
18
|
+
- 对外分发与安装边界仍保持标准 `pip install` 模型
|
|
19
|
+
|
|
20
|
+
## 2. 包层级
|
|
21
|
+
|
|
22
|
+
范围:
|
|
23
|
+
|
|
24
|
+
- 目录结构以 `01-目录与分层规范.md` 为准
|
|
25
|
+
- 本文只定义分发语义、安装模型、稳定 import 面和 wheel 要求
|
|
26
|
+
|
|
27
|
+
### 2.1 `legacy_core`
|
|
28
|
+
|
|
29
|
+
主包负责:
|
|
30
|
+
- core 装配
|
|
31
|
+
- settings 载入与 app 命名空间挂载
|
|
32
|
+
- CLI
|
|
33
|
+
- 资源与迁移聚合
|
|
34
|
+
- 可选 infra 集成
|
|
35
|
+
|
|
36
|
+
主包不负责:
|
|
37
|
+
- 内置具体业务站点
|
|
38
|
+
- 强绑定任何默认业务 `app`
|
|
39
|
+
- 将官方 app 当作内核特权对象
|
|
40
|
+
|
|
41
|
+
### 2.2 官方最小子包
|
|
42
|
+
|
|
43
|
+
官方维护的能力不再通过任何集合层 namespace 暴露,而是和业务能力一样,统一落成独立最小子包:
|
|
44
|
+
|
|
45
|
+
- distribution:`<app_id with _ replaced by ->`
|
|
46
|
+
- 目录名:`<app_id>`
|
|
47
|
+
- import 包名:`<app_id>`
|
|
48
|
+
- `app_id`:`<app_id>`
|
|
49
|
+
|
|
50
|
+
例如:
|
|
51
|
+
|
|
52
|
+
- `<settings_surface_owner_app_id>`
|
|
53
|
+
- `<infra_owner_app_id>`
|
|
54
|
+
- `<shared_site_ui_owner_app_id>`
|
|
55
|
+
- `<auth_owner_app_id>`
|
|
56
|
+
- `<seo_owner_app_id>`
|
|
57
|
+
|
|
58
|
+
正式要求:
|
|
59
|
+
|
|
60
|
+
- 官方能力与业务能力在运行时装配模型上完全平权
|
|
61
|
+
- 任何官方能力都不得再以集合层 namespace 作为长期正式 import 面
|
|
62
|
+
- `pz_contrib` 只视为 `pz_framework` 仓内的源码聚合容器,不是长期正式运行时单位
|
|
63
|
+
- `pz_apps`、`pz_apps` 与 `pz_framework` 在目录层面并列,也都只是源码组织根
|
|
64
|
+
|
|
65
|
+
### 2.3 外部 app / 独立子包
|
|
66
|
+
|
|
67
|
+
外部 business app、第三方 app、独立 app 子包:
|
|
68
|
+
- 均通过 `installed_apps` 进入系统
|
|
69
|
+
- 与官方最小子包使用同一套 `apps.py` / `settings.py` / `migrations` 声明约定,以及同一套 `settings_center.settings` 读取约定
|
|
70
|
+
- 可显式替换官方最小子包
|
|
71
|
+
|
|
72
|
+
补充约束:
|
|
73
|
+
|
|
74
|
+
- 独立子包在代码依赖规则上定义为 `integration app`
|
|
75
|
+
- 其它 app 不允许直接 import 独立子包内部 Python 模块
|
|
76
|
+
- 与独立子包的交互只允许通过稳定集成边界:
|
|
77
|
+
- capability
|
|
78
|
+
- facade
|
|
79
|
+
- events
|
|
80
|
+
- CLI/task 协议
|
|
81
|
+
- 必要时的 HTTP API
|
|
82
|
+
|
|
83
|
+
- 官方最小子包和独立子包不是“两套装配模型”
|
|
84
|
+
- 它们是“同一装配模型下的两种公开交互类型”
|
|
85
|
+
- 但无论官方还是独立,长期正式的分发与 import 单位都只能是自己的 `<app_id>`
|
|
86
|
+
|
|
87
|
+
## 3. 安装模式
|
|
88
|
+
|
|
89
|
+
本章明确区分两类“依赖”:
|
|
90
|
+
|
|
91
|
+
- 源码 / 分层依赖:谁的 Python 实现可以直接 import 谁、谁建立在谁的稳定合同之上。
|
|
92
|
+
- distribution 安装依赖:为了给终端用户提供默认安装组合,某个 distribution 在 `pip install` 时顺带拉起哪些其它 distribution。
|
|
93
|
+
|
|
94
|
+
正式要求:
|
|
95
|
+
|
|
96
|
+
- 这两类依赖必须分开理解,不得混为“基础层可以直接依赖高层实现”的许可。
|
|
97
|
+
- `pz-cli` 若作为公开安装 facade distribution 存在,只承担安装层职责:依赖基础包 `pz` 并暴露 `pz` 命令;它不是第二基础包,也不是新的运行时单位。
|
|
98
|
+
- `pz-cli` 不得依赖 `pz[contrib]`、`pz-contrib` 或任何官方 / 业务最小子包;`pz` 命令本身只负责 launcher facade 与 provider 选择。
|
|
99
|
+
- `pz` 在源码 / 分层意义上始终是基础层,不因为 extras 安装会带上官方扩展组合,就获得对 `pz_contrib` 或其子包内部实现的反向源码依赖权。
|
|
100
|
+
- `pz-contrib` 作为官方扩展组合应通过 `pip install "pz[contrib]"` 这类 extras 安装口径显式拉起,而不是反向成为 `pz` 基础依赖。
|
|
101
|
+
- 官方最小子包与业务最小子包对 `pz` 的源码依赖仍按正式分层管理;`pz` 代码不得直接 import `pz_contrib` 集合层或 contrib 子包内部实现。
|
|
102
|
+
|
|
103
|
+
补充一条针对项目开发与发布的正式区分:
|
|
104
|
+
|
|
105
|
+
- 开发形态允许把最小子包源码 checkout 到项目本地目录中联调
|
|
106
|
+
- 发布形态不允许把“当前源码目录”直接视为正式发布物
|
|
107
|
+
- 一旦进入发布链,正式交付单位仍然必须是带明确版本号的 distribution / artifact
|
|
108
|
+
|
|
109
|
+
依赖正式分层为:
|
|
110
|
+
|
|
111
|
+
- `legacy_core`
|
|
112
|
+
- 最小可运行基础,不要求 DB、Redis
|
|
113
|
+
- `pz-cli`
|
|
114
|
+
- 公开安装 facade distribution
|
|
115
|
+
- 只依赖 `pz`
|
|
116
|
+
- 只暴露 `pz -> pz.pz_launcher:main`
|
|
117
|
+
- `pz`
|
|
118
|
+
- 顶层正式 CLI 真相源与基础包
|
|
119
|
+
- `pz-contrib`
|
|
120
|
+
- 官方扩展组合 distribution,用于通过 `pz[contrib]` 拉起 contrib 最小子包集合
|
|
121
|
+
- `<app_id with _ replaced by ->`
|
|
122
|
+
- 单个最小子包的正式 distribution
|
|
123
|
+
- `legacy_core[db]`
|
|
124
|
+
- ORM 与迁移基础
|
|
125
|
+
- `legacy_core[db-postgres]`
|
|
126
|
+
- PostgreSQL 驱动
|
|
127
|
+
- `legacy_core[db-mysql]`
|
|
128
|
+
- MySQL 驱动
|
|
129
|
+
- `legacy_core[redis]`
|
|
130
|
+
- Redis 客户端
|
|
131
|
+
- `legacy_core[observability]`
|
|
132
|
+
- 指标、追踪、日志增强
|
|
133
|
+
- `legacy_core[full]`
|
|
134
|
+
- 拉起开发或测试所需的官方最小子包组合,但不改变“最小子包才是正式分发单位”的原则
|
|
135
|
+
|
|
136
|
+
### 3.0 开发态源码拉取与发布态分发的边界
|
|
137
|
+
|
|
138
|
+
为了支持项目内联调,`pz` 可以提供开发态源码拉取能力,例如把某个 `<app_id>` 的源码 checkout 到项目本地 `apps/` 容器中。
|
|
139
|
+
|
|
140
|
+
但这只属于开发态:
|
|
141
|
+
|
|
142
|
+
- 用于阅读源码
|
|
143
|
+
- 用于本地修改
|
|
144
|
+
- 用于项目内联调
|
|
145
|
+
|
|
146
|
+
不属于发布态:
|
|
147
|
+
|
|
148
|
+
- 不代表已完成版本化
|
|
149
|
+
- 不代表可直接部署
|
|
150
|
+
- 不代表可直接发布给其它环境消费
|
|
151
|
+
|
|
152
|
+
正式要求:
|
|
153
|
+
|
|
154
|
+
- 开发态源码拉取与发布态分发必须拆成两条命令链
|
|
155
|
+
- “同步源码到本地”与“发布包”不得由同一命令隐式串联
|
|
156
|
+
- 如果某个 app 只是被拉到本地开发目录,它仍然只是 source checkout,不是 release artifact
|
|
157
|
+
|
|
158
|
+
### 3.0.1 开发态
|
|
159
|
+
|
|
160
|
+
开发态的目标是把正式 app 源码带到项目边界内,便于修改和联调。
|
|
161
|
+
|
|
162
|
+
规划中的上层命令语义应固定为:
|
|
163
|
+
|
|
164
|
+
- `pz app add <app_id>`
|
|
165
|
+
- 把 app 加入当前项目声明
|
|
166
|
+
- 并把已发布 distribution 安装到当前项目的 Python / uv 环境
|
|
167
|
+
- 不把源码写入项目 `apps/`
|
|
168
|
+
- `pz app init`
|
|
169
|
+
- 作为生产装配模型下的项目默认包初始化命令
|
|
170
|
+
- 只从已有 `apps/.sources` checkout 读取默认包名与内部 PyPI 安装位置
|
|
171
|
+
- 默认扫描 `.sources` 中所有正式最小 app 子包,写入 `installed_apps`
|
|
172
|
+
- 创建或复用项目根 `.venv`
|
|
173
|
+
- 默认把 `pz`、`pz-contrib` 与已发现正式最小 app 的已发布 distribution 安装到项目 `.venv`
|
|
174
|
+
- 安装必须走正式内部 PyPI / devpi `check_url`,不得回退到源码 `editable` 安装
|
|
175
|
+
- 默认安装位置来自 `.sources` 中各包最近 source-root 的 `tool.pz.publish.default_target` 与对应 `targets.<target>.check_url`;若默认包清单跨多个内部 PyPI / devpi index,`app init` 会把这些 index 去重后交给同一次安装解析
|
|
176
|
+
- 安装项使用 `.sources` 中各包 `pyproject.toml` 的 distribution 名,具体版本由内部 PyPI / devpi 与项目锁仓策略解析;`app init` 不把源码 checkout 的当前 version 当作生产安装 pin
|
|
177
|
+
- 按 source app 的 `requires_apps` 依赖关系写入 `installed_apps`
|
|
178
|
+
- 不 clone 源码,不发布 package,也不改变 `pz app add` 的发布包安装语义
|
|
179
|
+
- `pz app rm <app_id>`
|
|
180
|
+
- 把 app 从当前项目声明中移除
|
|
181
|
+
- `pz app update <app_id>`
|
|
182
|
+
- 对某个已声明 app 在当前项目解释器环境中重新安装或升级其已发布 distribution
|
|
183
|
+
- `pz dev add <repo-or-app>`
|
|
184
|
+
- 默认拉取 `dev` 分支
|
|
185
|
+
- 可通过 `--branch <name>` 指定分支
|
|
186
|
+
- 只负责“远端到本地”的源码获取
|
|
187
|
+
- 若目标本身已是叶子最小子包 repo,则直接平铺暴露为 `apps/<app_id>/`
|
|
188
|
+
- 若输入定位到容器仓 / 容器目录,则项目层一次暴露该容器范围内全部已发现的最小子包,并保留原本组织目录
|
|
189
|
+
- 若目标 app 属于 monorepo 且输入只定位到某个叶子最小子包,则项目层仍按叶子最小子包处理,直接平铺暴露为 `apps/<app_id>/`
|
|
190
|
+
- `pz dev update <app_id>`
|
|
191
|
+
- 只负责更新已有 checkout
|
|
192
|
+
- 不负责发布
|
|
193
|
+
- `pz dev rm <app_id>`
|
|
194
|
+
- 只负责移除本地开发态 checkout
|
|
195
|
+
- 不负责发布
|
|
196
|
+
- 不负责远端删除
|
|
197
|
+
|
|
198
|
+
开发态约束:
|
|
199
|
+
|
|
200
|
+
- `app` 组命令只管理项目声明,不管理源码 checkout
|
|
201
|
+
- `app init` 只消费已经存在的 `apps/.sources` checkout,用它确定默认包清单与内部 PyPI 位置;真正安装的是 distribution,不负责拉取源码
|
|
202
|
+
- `app add` / `app update` 操作的是当前项目解释器环境中的 distribution 安装状态,不向 `apps/` 写源码
|
|
203
|
+
- `app add` / `app update` 永远按 distribution 名称执行安装,不读取 `workspace_packages.toml`,也不回退到源码仓 `editable` 安装
|
|
204
|
+
- `app rm` 只移除已声明 app;若目标 app 未声明,命令必须报错,不得返回误导性的成功提示
|
|
205
|
+
- `app add` / `dev add` 完成后必须检查结果状态;若同名最小子包同时存在于 `apps/` 与当前解释器 `site-packages`,或在 `apps/` 内出现多个同名来源,命令直接报错,同时给出标准人工处理指引
|
|
206
|
+
- 运行时发现阶段若项目本地 `apps/` 与当前解释器环境中已安装 distribution 同时都可导入同名最小子包,正式优先级固定为项目本地 `apps/` 最小子包优先
|
|
207
|
+
- 叶子最小子包 repo 优先按“直接暴露目录”处理
|
|
208
|
+
- `dev add` 进入 `apps/` 时,只有输入是容器目录 / source-root / monorepo 根时,才保留来源仓的组织目录;若输入本身就是叶子最小子包,则直接映射为 `apps/<app_id>/`
|
|
209
|
+
- 同一 git 仓库若已因某个最小子包存在本地 checkout,后续同仓其它最小子包必须复用该 checkout
|
|
210
|
+
- 不默认推送远端
|
|
211
|
+
- 不自动 build
|
|
212
|
+
- 不自动 publish
|
|
213
|
+
- 不自动修改发布版本号
|
|
214
|
+
|
|
215
|
+
### 3.0.2 发布态
|
|
216
|
+
|
|
217
|
+
发布态的目标是输出可被其它环境稳定消费的正式分发物。
|
|
218
|
+
|
|
219
|
+
因此正式要求:
|
|
220
|
+
|
|
221
|
+
- 发布前必须存在明确版本号
|
|
222
|
+
- 发布链消费的是版本化 package / wheel / artifact
|
|
223
|
+
- 不允许把“本地 checkout 的当前目录状态”直接当作正式发布输入
|
|
224
|
+
|
|
225
|
+
规划中的上层命令语义应固定为:
|
|
226
|
+
|
|
227
|
+
- `pz pub <app_id>`
|
|
228
|
+
- 只进入构建与发布链
|
|
229
|
+
- 不承担源码拉取职责
|
|
230
|
+
|
|
231
|
+
结论:
|
|
232
|
+
|
|
233
|
+
- 项目声明层解决“项目要装哪些 app”
|
|
234
|
+
- 开发态解决“源码到位 / 更新 / 移除”
|
|
235
|
+
- 发布态解决“版本化交付”
|
|
236
|
+
- 两者必须在设计上硬分离
|
|
237
|
+
|
|
238
|
+
约束:
|
|
239
|
+
- base 安装不应强依赖 `asyncpg`、`asyncmy`、`redis`
|
|
240
|
+
- SQLite 不应要求额外第三方驱动
|
|
241
|
+
- `legacy_core[full]` 通过 extras 显式拉起官方最小子包与必要独立子包,而不是把这些能力重新打包进 core wheel
|
|
242
|
+
- 若需要安装官方 contrib 组合,正式命令应使用 `pip install "pz[contrib]"`;不得通过让 `pz` 基础包或 `pz-cli` 默认依赖 `pz-contrib` 来表达
|
|
243
|
+
|
|
244
|
+
补充要求:
|
|
245
|
+
- `aerich` 不应继续留在 base 依赖中
|
|
246
|
+
- `boto3`、`fastapi-mail`、`prefect`、`stripe` 这类明显模块化依赖必须按能力拆到 extras,而不是全部放进 base
|
|
247
|
+
- 包描述与元数据不应继续使用 “monorepo with uv workspace” 这一类仓库开发者心智作为对外说明
|
|
248
|
+
|
|
249
|
+
后续实现必须按这组 extras 名称和轻量 base 目标收口。
|
|
250
|
+
|
|
251
|
+
## 3.0 工具链约束
|
|
252
|
+
|
|
253
|
+
重构后的 `legacy_core` 包在开发、锁定依赖、构建、测试执行层面统一采用 `uv` 管理。
|
|
254
|
+
|
|
255
|
+
正式要求:
|
|
256
|
+
|
|
257
|
+
- 新版 `legacy_core` 包必须提供标准 `pyproject.toml`
|
|
258
|
+
- 开发环境统一通过 `pz env sync` 建立
|
|
259
|
+
- 命令执行统一优先使用正式 `pz` CLI 或 `python -m ...`
|
|
260
|
+
- 构建产物统一优先通过 `uv build` 产出
|
|
261
|
+
- 依赖锁文件统一采用 `uv.lock`
|
|
262
|
+
|
|
263
|
+
同时必须满足:
|
|
264
|
+
|
|
265
|
+
- 对外分发仍是标准 wheel / sdist
|
|
266
|
+
- 用户侧仍可通过标准 `pip install legacy_core` 安装
|
|
267
|
+
- 运行时行为不能依赖 `uv workspace` 或 `uv` 私有运行时语义
|
|
268
|
+
|
|
269
|
+
结论:
|
|
270
|
+
|
|
271
|
+
- `uv` 是新版 `legacy_core` 的正式开发与构建工具链
|
|
272
|
+
- 标准 `pip` 分发仍是正式对外交付边界
|
|
273
|
+
|
|
274
|
+
## 3.1 官方最小子包与业务最小子包的正式分工
|
|
275
|
+
|
|
276
|
+
正式要求:
|
|
277
|
+
|
|
278
|
+
- 所有官方能力都必须落成独立最小子包 `<app_id>`
|
|
279
|
+
- 所有业务能力也必须落成独立最小子包 `<app_id>`
|
|
280
|
+
- 无论官方还是业务,进入系统的方式都只能是把对应最小子包写入 `installed_apps`
|
|
281
|
+
- 不再保留“官方组合包有独立运行时 namespace、业务包走另一套 namespace”的双轨模型
|
|
282
|
+
|
|
283
|
+
典型官方最小子包类别例如:
|
|
284
|
+
|
|
285
|
+
- settings surface owner
|
|
286
|
+
- infra owner
|
|
287
|
+
- shared site UI owner
|
|
288
|
+
- settings runtime owner
|
|
289
|
+
- auth owner
|
|
290
|
+
- account / profile owner
|
|
291
|
+
- SEO owner
|
|
292
|
+
|
|
293
|
+
## 3.2 非 app 型能力的拆分原则
|
|
294
|
+
|
|
295
|
+
以下能力不应继续留在 core base 依赖或 core wheel 中:
|
|
296
|
+
|
|
297
|
+
- observability handlers / exporters
|
|
298
|
+
- mail sender integration
|
|
299
|
+
- object storage / cloud backends
|
|
300
|
+
- billing / stripe / external platform clients
|
|
301
|
+
- 其它与外部服务强绑定的 provider 实现
|
|
302
|
+
|
|
303
|
+
正式要求:
|
|
304
|
+
|
|
305
|
+
- 若它们需要作为官方默认实现存在,统一进入某个官方最小子包,例如 official infra owner
|
|
306
|
+
- 若它们需要独立治理,则进入自己的最小子包 `<app_id>/`
|
|
307
|
+
- 不再引入第三套 `bundles/`、`providers/`、官方重型分发目录概念
|
|
308
|
+
|
|
309
|
+
- core wheel 只保留框架内核、最小装配能力、middleware manifest/compiler/adapter glue、标准 CLI
|
|
310
|
+
- 官方能力与业务能力都统一进入各自的 `<app_id>/`
|
|
311
|
+
- 用户安装体验通过 extras、顶层 CLI 包和独立最小子包解决,而不是把实现重新打进 core wheel
|
|
312
|
+
|
|
313
|
+
### 3.2.4 源码目录落位
|
|
314
|
+
|
|
315
|
+
目录边界必须和分发边界一致,不能只在 wheel 构建时排除文件:
|
|
316
|
+
|
|
317
|
+
- 仓库根 `legacy_core/` 只保留 core 代码与标准安装包入口
|
|
318
|
+
- 每个最小子包都必须拥有自己的源码根:
|
|
319
|
+
- `<app_id>/`
|
|
320
|
+
- 每个最小子包内部的正式 Python 包目录也必须叫:
|
|
321
|
+
- `<app_id>/`
|
|
322
|
+
- 正式 import path 固定为最小子包自己的包名 `<app_id>`
|
|
323
|
+
- `legacy_core/infra/*` 只保留薄绑定层,不再作为具体实现的长期源码真相源
|
|
324
|
+
- `infra` 的具体实现统一进入对应最小子包,例如 official infra owner
|
|
325
|
+
|
|
326
|
+
若采用当前工作区的 Git 聚合布局,上述目录实际落位固定为:
|
|
327
|
+
|
|
328
|
+
- `<some_group_dir>/<app_id>/`
|
|
329
|
+
- 或 `<repo_root>/<app_id>/`
|
|
330
|
+
|
|
331
|
+
补充禁止:
|
|
332
|
+
|
|
333
|
+
- 不得在 `legacy_core` 核心仓内新增新的业务或官方能力源码
|
|
334
|
+
- 不得把任何最小子包重新塞回 `legacy_core` core wheel
|
|
335
|
+
|
|
336
|
+
official infra owner 的完整目录结构以 `01-目录与分层规范.md` 为准。
|
|
337
|
+
|
|
338
|
+
约束:
|
|
339
|
+
|
|
340
|
+
- `db/`、`kv/`、`storage/`、`observability/`、`notifications/`、`middlewares/` 只承接默认实现
|
|
341
|
+
- `public.py` 的正式导出面以 `16-正式Facade总表.md` 为准
|
|
342
|
+
- `i18n/`、`jinja/` 不进入 infra owner,而进入对应展示层最小子包,例如 shared site UI owner
|
|
343
|
+
|
|
344
|
+
### 3.2.5 最小子包 import path 契约
|
|
345
|
+
|
|
346
|
+
由于正式运行时单位已经统一收敛为最小子包,因此 import path 契约也必须收敛为最小子包自己的包名。
|
|
347
|
+
|
|
348
|
+
正式要求:
|
|
349
|
+
|
|
350
|
+
- 每个最小子包的正式 import path 固定为 `<app_id>`
|
|
351
|
+
- 官方能力与业务能力都不得复用集合层 import path
|
|
352
|
+
- 模板、资源、app 发现若需要定位某个能力源码,必须从对应最小子包或正式包资源读取,而不是反推旧集合目录
|
|
353
|
+
- 文档、测试、构建脚本都不得再把集合层目录名当成正式源码真相源
|
|
354
|
+
|
|
355
|
+
禁止:
|
|
356
|
+
|
|
357
|
+
- 独立子包复用集合层路径伪装成正式运行单元
|
|
358
|
+
- 通过 build `force-include` 把同一套根目录源码同时喂给 `legacy_core/` 与多个集合层壳
|
|
359
|
+
- 通过固定相对路径反推旧集合层 app 根目录
|
|
360
|
+
|
|
361
|
+
边界:
|
|
362
|
+
|
|
363
|
+
- 最小子包自己的 import path 才是稳定契约
|
|
364
|
+
- 集合层目录不是正式边界,也不是正式公开面
|
|
365
|
+
|
|
366
|
+
### 3.2.6 最小子包的 wheel / package 契约
|
|
367
|
+
|
|
368
|
+
既然正式运行时单位已经统一为最小子包,则 wheel 与 package 契约也必须直接对应最小子包本身,而不是再经过集合层 namespace。
|
|
369
|
+
|
|
370
|
+
正式方案:
|
|
371
|
+
|
|
372
|
+
- 不采用 namespace package
|
|
373
|
+
- `legacy_core` 主包继续保持普通 package
|
|
374
|
+
- 每个最小子包 wheel 只负责产出自己的 `<app_id>/**` 包树
|
|
375
|
+
|
|
376
|
+
正式要求:
|
|
377
|
+
|
|
378
|
+
- `<app_id>` 必须通过正式 wheel 布局直接成立,而不是依赖集合层目录偶然同构
|
|
379
|
+
- `legacy_core` core wheel 不产出任何业务或官方能力型包树
|
|
380
|
+
- 每个最小子包 wheel 必须只产出:
|
|
381
|
+
- `<app_id>/__init__.py`
|
|
382
|
+
- `<app_id>/**`
|
|
383
|
+
- 构建脚本不得依赖 `PYTHONPATH` 注入、repo-root 相对路径或手工复制目录来让集合层 namespace 成立
|
|
384
|
+
- 每个最小子包安装后,必须稳定提供自己的 `<app_id>`
|
|
385
|
+
- 同一 `app_id` 只允许由一个 wheel 提供
|
|
386
|
+
|
|
387
|
+
实现约束:
|
|
388
|
+
|
|
389
|
+
- `legacy_core/__init__.py` 保持普通包语义,不改造成 namespace package
|
|
390
|
+
- 每个最小子包都必须在自己的 wheel 内显式写出 `<app_id>/**`
|
|
391
|
+
- 文档、脚本、测试都不得假定“源码在集合层目录里,安装后自然就能 import 某个集合层 namespace”
|
|
392
|
+
- core wheel 与最小子包 wheel 不得同时提供同一路径文件
|
|
393
|
+
- 若未来继续拆包,各 wheel 的写入子树必须按 `<app_id>/` 严格互斥
|
|
394
|
+
|
|
395
|
+
禁止:
|
|
396
|
+
|
|
397
|
+
- 依赖源码 checkout 目录运行来证明集合层 import path 可用
|
|
398
|
+
- 依赖 `sys.path` 注入、editable 模式特例或 vendored 目录结构来补齐集合层 namespace
|
|
399
|
+
- 让独立子包通过复制旧集合层目录结构伪装成官方组合包成员
|
|
400
|
+
- 在 core wheel 中放置空壳集合层包,再要求其它 wheel 覆写同一文件
|
|
401
|
+
|
|
402
|
+
交付要求:
|
|
403
|
+
|
|
404
|
+
- 明确记录 `legacy_core` 主包只产出 `legacy_core/**`
|
|
405
|
+
- 明确记录每个最小子包 wheel 只产出自己的 `<app_id>/**`
|
|
406
|
+
- 安装后 import contract 必须由契约测试证明,而不是由 README 示例间接证明
|
|
407
|
+
|
|
408
|
+
## 3.3 `infra` 分发与目录收口
|
|
409
|
+
|
|
410
|
+
`infra` 在新方案里保留,但必须显著瘦身。
|
|
411
|
+
|
|
412
|
+
正式要求:
|
|
413
|
+
|
|
414
|
+
- `infra` 只保留最小基础设施 contract、typed snapshot、adapter interface、capability binder
|
|
415
|
+
- 不再把共享 middleware、平台 app provider、站点运行时、第三方集成实现统统留在 `infra`
|
|
416
|
+
|
|
417
|
+
迁出原则固定为:
|
|
418
|
+
|
|
419
|
+
- 共享但非核心 middleware
|
|
420
|
+
- 进入官方基础能力最小子包,例如 official infra owner
|
|
421
|
+
- shared site UI owner / 展示层 / i18n / template runtime
|
|
422
|
+
- 若属于基础能力实现,进入 official infra owner;若已明确属于展示层,再进入 shared site UI owner
|
|
423
|
+
- settings runtime owner / task dispatch owner 专属 provider 与 registry
|
|
424
|
+
- 进入对应 settings runtime owner 或 task dispatch / worker owner
|
|
425
|
+
- SMTP、S3/GCS、bot handlers、支付/外部云客户端
|
|
426
|
+
- 进入官方基础能力最小子包或 extras;成熟后再拆成独立最小子包
|
|
427
|
+
|
|
428
|
+
这条规则的目标是保证 core wheel 足够轻,并阻止 `legacy_core.infra.*` 继续膨胀成事实上的第二公共 API 面。
|
|
429
|
+
|
|
430
|
+
## 4. 入口规范
|
|
431
|
+
|
|
432
|
+
### 4.1 标准入口
|
|
433
|
+
|
|
434
|
+
唯一标准入口:
|
|
435
|
+
- `pz`
|
|
436
|
+
|
|
437
|
+
通过 `console_scripts` 提供:
|
|
438
|
+
|
|
439
|
+
```toml
|
|
440
|
+
[project.scripts]
|
|
441
|
+
pz = "pz.cli:main"
|
|
442
|
+
pz = "pz.pz_launcher:main"
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
补充要求:
|
|
446
|
+
- `pyproject.toml` 必须显式声明该入口,不再只依赖目录执行
|
|
447
|
+
- 所有正式脚本必须直接落到同一个 CLI 真相源;不允许再引入额外 wrapper / shim 同步链
|
|
448
|
+
- 所有用户文档、README、示例命令、帮助文案只使用 `pz ...`
|
|
449
|
+
- `pyproject.toml` 中实际声明的 extras 名称应与文档约定一致,避免出现 `infra-db`/`infra-kv` 这类实现名与用户心智名并存
|
|
450
|
+
- `python -m pz` 若保留,也只作为技术入口复用同一正式 CLI 真相源,不作为需要单独维护的第二套文档主路径
|
|
451
|
+
|
|
452
|
+
入口、元数据、extras 命名都必须按本规范收口。
|
|
453
|
+
|
|
454
|
+
### 4.2 非标准入口
|
|
455
|
+
|
|
456
|
+
以下路径不再视为正式入口:
|
|
457
|
+
|
|
458
|
+
- `python legacy_core`
|
|
459
|
+
- wrapper
|
|
460
|
+
- `legacy_core init`
|
|
461
|
+
|
|
462
|
+
约束:
|
|
463
|
+
- `legacy_core init` 不再作为框架安装/初始化主路径
|
|
464
|
+
- 历史 `git_plugins` 不再作为正式入口,且不能默认扫描安装包内目录
|
|
465
|
+
- 历史 `run` 不再作为正式命令,不再出现在主帮助文案与正式教程中
|
|
466
|
+
- 历史 `python legacy_core` 目录执行、vendored/symlink 目录执行,不再作为正式安装包心智
|
|
467
|
+
|
|
468
|
+
旧命令处理规则:
|
|
469
|
+
|
|
470
|
+
- `git_plugins` 在本次重构中直接移除,且不得默认扫描安装包内 `legacy_core/plugins`
|
|
471
|
+
- `init` 在本次重构中直接移除,不承担 shell rc / wrapper / `PYTHONPATH` 写入职责
|
|
472
|
+
- `run` 在本次重构中直接移除,不保留独立命令模型
|
|
473
|
+
|
|
474
|
+
`init` / `git_plugins` 不再作为 vendored 仓库运行模型的正式入口。
|
|
475
|
+
|
|
476
|
+
### 4.3 项目上下文发现
|
|
477
|
+
|
|
478
|
+
CLI 查找项目上下文固定遵循以下优先级:
|
|
479
|
+
|
|
480
|
+
1. `--project-dir`
|
|
481
|
+
2. `PZ_PROJECT_DIR`
|
|
482
|
+
3. 当前目录向上搜索项目标记文件
|
|
483
|
+
|
|
484
|
+
项目标记文件唯一采用:
|
|
485
|
+
- `pz.jsonc`
|
|
486
|
+
|
|
487
|
+
不得再默认假设:
|
|
488
|
+
- 当前目录必定是项目根
|
|
489
|
+
- 项目根下一定存在 `legacy_core/`
|
|
490
|
+
- 项目根下一定存在 `app/`
|
|
491
|
+
|
|
492
|
+
## 5. 项目配置文件
|
|
493
|
+
|
|
494
|
+
正式项目配置文件唯一采用:
|
|
495
|
+
|
|
496
|
+
- `pz.jsonc`
|
|
497
|
+
|
|
498
|
+
正式规则:
|
|
499
|
+
- 结构化配置放 TOML
|
|
500
|
+
- 敏感值与环境差异通过环境变量覆盖
|
|
501
|
+
- `.env` 仅作为开发便捷手段,不再承载全部系统配置
|
|
502
|
+
|
|
503
|
+
## 6. 默认 app 策略
|
|
504
|
+
|
|
505
|
+
主包不应默认内置业务 `app`。
|
|
506
|
+
|
|
507
|
+
正式规则:
|
|
508
|
+
- `installed_apps` 默认为空列表
|
|
509
|
+
- 项目通过 `pz.jsonc` 显式声明需要的 app
|
|
510
|
+
|
|
511
|
+
不采用:
|
|
512
|
+
- 在框架默认设置中直接硬编码业务 `app`
|
|
513
|
+
- 把大量官方 app 与业务 app 混在框架默认装载清单中
|
|
514
|
+
|
|
515
|
+
## 7. wheel / 安装要求
|
|
516
|
+
|
|
517
|
+
必须保证:
|
|
518
|
+
- 安装后可在 `site-packages` 中正常运行
|
|
519
|
+
- 包目录可视为只读
|
|
520
|
+
- 运行时不会尝试写回 `site-packages` 或源包目录
|
|
521
|
+
|
|
522
|
+
还必须保证:
|
|
523
|
+
- 构建产物不依赖 uv workspace 语义才能被普通 `pip install` 使用
|
|
524
|
+
- wheel 安装后不需要额外执行 `legacy_core init` 才能得到标准命令入口
|
|
525
|
+
- CLI 与迁移工具不会假设存在可写的 repo-root `legacy_core/merged`
|
|
526
|
+
- CLI 不通过修改 `PYTHONPATH` 或扫描包内 git 仓目录来弥补项目边界不清晰
|
|
527
|
+
|
|
528
|
+
### 7.1 wheel 内容要求
|
|
529
|
+
|
|
530
|
+
wheel 中必须包含运行所需非 Python 资源:
|
|
531
|
+
|
|
532
|
+
- `templates/`
|
|
533
|
+
- `static/`
|
|
534
|
+
- `locales/`
|
|
535
|
+
- `migrations/`
|
|
536
|
+
- `configs/`
|
|
537
|
+
|
|
538
|
+
否则标准安装包场景无法成立。
|
|
539
|
+
|
|
540
|
+
补充要求:
|
|
541
|
+
- 除了“资源在 wheel 内存在”,还必须保证:
|
|
542
|
+
- 这些资源不会要求运行时写回同目录
|
|
543
|
+
- asset builder / migrations merge / templates merge 的输出目录都在外部
|
|
544
|
+
- 包内历史辅助目录若仅作为源码仓组织手段,不应被 CLI 当项目工作目录默认扫描
|
|
545
|
+
|
|
546
|
+
### 7.2 extras 分层要求
|
|
547
|
+
|
|
548
|
+
最终目标不是“一个超大全依赖包”,而是:
|
|
549
|
+
|
|
550
|
+
- base 仅包含最小运行所需
|
|
551
|
+
- DB 驱动独立 extra
|
|
552
|
+
- Redis 独立 extra
|
|
553
|
+
- 观测独立 extra
|
|
554
|
+
- 官方完整组合通过 `full` 提供
|
|
555
|
+
|
|
556
|
+
不在本阶段目标内:
|
|
557
|
+
- zipimport/zip-safe 运行
|
|
558
|
+
|
|
559
|
+
## 8. 公共 API 与导入边界
|
|
560
|
+
|
|
561
|
+
从分发与长期维护角度,包化之后必须明确哪些 import path 可以被外部项目依赖。
|
|
562
|
+
|
|
563
|
+
稳定公共 import 面唯一采用:
|
|
564
|
+
|
|
565
|
+
- `pz`
|
|
566
|
+
- `pz.app`
|
|
567
|
+
- 文档中声明的 `public.py`
|
|
568
|
+
|
|
569
|
+
默认不承诺稳定的 import 面:
|
|
570
|
+
|
|
571
|
+
- `legacy_core.settings`
|
|
572
|
+
- `legacy_core.core.*`
|
|
573
|
+
- `legacy_core.infra.*`
|
|
574
|
+
- 官方 app / 独立子包的内部实现模块
|
|
575
|
+
- 任意旧入口
|
|
576
|
+
|
|
577
|
+
要求:
|
|
578
|
+
|
|
579
|
+
- 文档和代码层都必须把公共 API 收口到少量稳定入口
|
|
580
|
+
- 如果外部项目确需依赖某能力,应先把它提升到 `public.py`,而不是继续扩散多种公共入口样式
|
|
581
|
+
- `legacy_core.settings` 只作为包根入口文件存在,不视为正式稳定公共读取入口
|
|
582
|
+
|
|
583
|
+
### 8.1 公共导出面的唯一方案
|
|
584
|
+
|
|
585
|
+
为了落实“一个问题只有一种解决方案”,公共导出面必须显式唯一化。
|
|
586
|
+
|
|
587
|
+
正式要求:
|
|
588
|
+
|
|
589
|
+
- core 的稳定公共入口只允许:
|
|
590
|
+
- `pz`
|
|
591
|
+
- `pz.app`
|
|
592
|
+
- app 的稳定公共入口只允许:
|
|
593
|
+
- `<app>.public`
|
|
594
|
+
|
|
595
|
+
不再把以下路径当作外部稳定导出候选:
|
|
596
|
+
|
|
597
|
+
- `api.py`
|
|
598
|
+
- `ports.py`
|
|
599
|
+
- `sdk/`
|
|
600
|
+
- `service.py`
|
|
601
|
+
- `manager.py`
|
|
602
|
+
|
|
603
|
+
这些模块若存在,只能服务于内部实现拆分,不构成跨包稳定契约。
|
|
604
|
+
|
|
605
|
+
结论:
|
|
606
|
+
|
|
607
|
+
- 外部项目依赖能力时,只能依赖 `public.py`
|
|
608
|
+
- 文档、示例、README、测试都不得再宣传第二套公共入口样式
|
|
609
|
+
|
|
610
|
+
## 9. 构建与发布要求
|
|
611
|
+
|
|
612
|
+
从最佳工程实践看,标准 pip 包除了“能装”,还要“可重复、可诊断、可升级”。
|
|
613
|
+
|
|
614
|
+
要求:
|
|
615
|
+
|
|
616
|
+
- 同时支持构建 wheel 与 sdist
|
|
617
|
+
- wheel 内容应可由 CI 自动校验,而不是只靠本地人工验证
|
|
618
|
+
- 非 Python 资源应通过正式包数据机制打包,并通过 `importlib.resources` 读取,而不是依赖源码相对路径
|
|
619
|
+
- 发布元数据要围绕最终安装者,而不是围绕 monorepo 开发者
|
|
620
|
+
- extras 的命名、说明、依赖集合必须在文档和 `pyproject.toml` 中保持一致
|
|
621
|
+
|
|
622
|
+
发布前必须自动验证:
|
|
623
|
+
|
|
624
|
+
- 发布前自动验证:
|
|
625
|
+
- wheel 内容
|
|
626
|
+
- `console_scripts`
|
|
627
|
+
- extras 依赖解析
|
|
628
|
+
- 非源码目录 smoke run
|
|
629
|
+
|
|
630
|
+
## 10. 版本治理
|
|
631
|
+
|
|
632
|
+
重构后的 `legacy_core` 需要有明确的版本治理策略。
|
|
633
|
+
|
|
634
|
+
要求:
|
|
635
|
+
|
|
636
|
+
- 稳定公共契约的破坏性变更只能通过主版本引入
|
|
637
|
+
- 本次重构移除的旧入口需要在发布说明中明确列出
|
|
638
|
+
- 迁移期聚合容器拆分后,其版本关系应能回溯到 core 版本范围
|
|
639
|
+
|
|
640
|
+
正式规则:
|
|
641
|
+
|
|
642
|
+
- `required_pz` 继续作为 app 级版本约束
|
|
643
|
+
- `legacy_core` 发布后进入 core freeze / extension-first 治理
|
|
644
|
+
- 新增业务能力、平台能力、provider 实现、共享 middleware,默认通过官方扩展包发布,而不是继续并入 `legacy_core`
|
|
645
|
+
- 官方扩展包必须直接表现为最小子包 `<app_id>`;它们都属于扩展层,不属于 `legacy_core` 内核
|
|
646
|
+
- 发布说明中维护:
|
|
647
|
+
- 本版本新增的正式契约
|
|
648
|
+
- 本次重构直接移除的旧入口
|
|
649
|
+
|
|
650
|
+
## 11. 外部 app / 独立子包信任模型
|
|
651
|
+
|
|
652
|
+
从实用角度必须说清楚一点:
|
|
653
|
+
|
|
654
|
+
- 外部 app / 独立子包本质上是可执行 Python 代码
|
|
655
|
+
- `installed_apps` 不是“安全沙箱”
|
|
656
|
+
- 框架不应暗示“安装第三方 app 就是安全的”
|
|
657
|
+
|
|
658
|
+
要求:
|
|
659
|
+
|
|
660
|
+
- 文档中明确:外部 app 的引入属于受信代码接入
|
|
661
|
+
- `legacy_core` core 不承担第三方 app 的安全审计职责
|
|
662
|
+
- 若未来引入 app 元数据校验,也只解决版本约束与诊断,不等于安全隔离
|
|
663
|
+
|
|
664
|
+
正式要求:
|
|
665
|
+
|
|
666
|
+
- 项目侧维护允许装载的 app 白名单/供应源策略
|
|
667
|
+
- 第三方 app 至少声明:
|
|
668
|
+
- 版本
|
|
669
|
+
- `required_pz`
|
|
670
|
+
- 公开 API 面
|
|
671
|
+
- 迁移/数据影响面
|