py-wlcli 0.6.14__tar.gz → 0.7.0__tar.gz
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.
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/PKG-INFO +2 -3
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/README.md +1 -2
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/pyproject.toml +9 -1
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/rust/Cargo.lock +1 -1
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/rust/Cargo.toml +1 -1
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/rust/deny.toml +8 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/__main__.py +16 -3
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/cli_click.py +7 -9
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/buildcommands/build_utils.py +0 -24
- py_wlcli-0.7.0/src/wl_cli/commands/buildcommands/builders/coordinator.py +122 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/buildcommands/builders/environment.py +2 -2
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/buildcommands/builders/rust_builder.py +5 -3
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/buildcommands/dist.py +2 -2
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/build.py +21 -18
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/clean.py +25 -15
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/core.py +56 -50
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/dead_code/dead_code_command.py +14 -20
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/dead_code/detector.py +37 -13
- py_wlcli-0.7.0/src/wl_cli/commands/clean/dead_code/fixer.py +176 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/dead_code/reporter.py +41 -51
- py_wlcli-0.7.0/src/wl_cli/commands/clean/lfs.py +215 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/python.py +28 -21
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/rust.py +27 -37
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/venv.py +31 -27
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/cleanup.py +2 -1
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/config/config.py +66 -16
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/debug/debug.py +26 -5
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/debug/debug_cache.py +21 -6
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/debug/source_hasher.py +2 -0
- py_wlcli-0.7.0/src/wl_cli/commands/format/__init__.py +13 -0
- py_wlcli-0.7.0/src/wl_cli/commands/format/format_cache_adapter.py +125 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/format/format_command.py +60 -11
- py_wlcli-0.7.0/src/wl_cli/commands/format/format_coordinator.py +191 -0
- py_wlcli-0.7.0/src/wl_cli/commands/format/format_executor.py +470 -0
- py_wlcli-0.7.0/src/wl_cli/commands/format/format_outcome.py +44 -0
- py_wlcli-0.7.0/src/wl_cli/commands/format/format_path_handler.py +1016 -0
- py_wlcli-0.7.0/src/wl_cli/commands/format/python_formatter.py +496 -0
- py_wlcli-0.7.0/src/wl_cli/commands/format/rust_formatter.py +106 -0
- py_wlcli-0.7.0/src/wl_cli/commands/gate/__init__.py +1 -0
- py_wlcli-0.7.0/src/wl_cli/commands/gate/gate_command.py +862 -0
- py_wlcli-0.7.0/src/wl_cli/commands/gate/preflight.py +445 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/git/config.py +15 -3
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/git/hook.py +22 -9
- py_wlcli-0.7.0/src/wl_cli/commands/git/push_update.py +82 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/common/check_git_bash.py +2 -1
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/common/error_handler.py +3 -5
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/cargo_sync.py +5 -3
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/config_manager.py +3 -2
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/git/__init__.py +0 -2
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/git/branch_creator.py +49 -42
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/git/git_flow_manager.py +29 -23
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/git/git_lfs_manager.py +79 -56
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/git/gitignore_manager.py +13 -7
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/git_initializer.py +51 -32
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/project_structure/__init__.py +2 -0
- py_wlcli-0.7.0/src/wl_cli/commands/initenv/components/project_structure/config_generator.py +360 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/project_structure/directory_creator.py +26 -10
- py_wlcli-0.7.0/src/wl_cli/commands/initenv/components/project_structure/hook_source.py +110 -0
- py_wlcli-0.7.0/src/wl_cli/commands/initenv/components/project_structure/hooks_manager.py +995 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/project_structure/readme_handler.py +11 -11
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/project_structure/rust_files_handler.py +11 -2
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/project_structure/setup_handler.py +31 -12
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/project_structure/sop_generator.py +28 -10
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/project_structure/template_copier.py +20 -12
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/project_structure/template_manager.py +44 -19
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/pyproject_generator.py +2 -21
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/rust_initializer.py +28 -19
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/symlink_manager.py +3 -2
- py_wlcli-0.7.0/src/wl_cli/commands/initenv/components/venv_manager.py +118 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/initenv.py +22 -4
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/services/environment_initializer.py +116 -90
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/services/git_lfs_initializer.py +5 -5
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/services/project_structure_initializer.py +10 -7
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/lfs/README.md +2 -2
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/lfs/cli.py +14 -2
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/lfs/config.py +14 -3
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/lfs/initializer.py +52 -7
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/lfs/watcher.py +35 -10
- py_wlcli-0.7.0/src/wl_cli/commands/lint/lint_command.py +297 -0
- py_wlcli-0.7.0/src/wl_cli/commands/lint/lint_executor.py +409 -0
- py_wlcli-0.7.0/src/wl_cli/commands/lint/lint_reporter.py +579 -0
- py_wlcli-0.7.0/src/wl_cli/commands/lint/lint_run.py +258 -0
- py_wlcli-0.7.0/src/wl_cli/commands/lint/mypy_config.py +90 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/registry.py +1 -0
- py_wlcli-0.7.0/src/wl_cli/commands/self/common/capabilities.py +30 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/handlers/base_handler.py +2 -3
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/handlers/install_handler.py +23 -18
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/handlers/status_handler.py +21 -19
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/handlers/uninstall_handler.py +16 -15
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/handlers/update_handler.py +25 -20
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/handlers/version_handler.py +2 -3
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/self_command.py +41 -24
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/services/installation_manager.py +36 -31
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/services/local_installer.py +38 -40
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/services/pypi_updater.py +48 -45
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/services/windows_update.py +49 -47
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/base_dependency_analyzer.py +3 -2
- py_wlcli-0.7.0/src/wl_cli/commands/testcommands/cache_manager.py +1156 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/coverage_analyzer.py +363 -27
- py_wlcli-0.7.0/src/wl_cli/commands/testcommands/coverage_cache_manager.py +183 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/progress_manager.py +25 -12
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/python_env_detector.py +39 -11
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/report_generator.py +25 -13
- py_wlcli-0.7.0/src/wl_cli/commands/testcommands/single_test_executor.py +250 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/test_command_builder.py +47 -22
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/test_commands.py +212 -36
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/test_reporter.py +21 -11
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/test_result_handler.py +10 -2
- py_wlcli-0.7.0/src/wl_cli/commands/testcommands/test_runner.py +1343 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/test_utils.py +32 -0
- py_wlcli-0.7.0/src/wl_cli/commands/testcommands/utils/project_root.py +61 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/update/services/backup_manager.py +33 -19
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/update/services/conflict_resolver.py +20 -11
- py_wlcli-0.7.0/src/wl_cli/commands/update/services/vendors_updater.py +85 -0
- py_wlcli-0.7.0/src/wl_cli/commands/update/update_command.py +270 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/cache.py +13 -1
- py_wlcli-0.7.0/src/wl_cli/utils/cache_ledger.py +355 -0
- py_wlcli-0.7.0/src/wl_cli/utils/cache_store.py +546 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/config/config_loader.py +11 -3
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/config/core.py +221 -36
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/config/defaults.py +49 -1
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/file_operations.py +3 -1
- py_wlcli-0.7.0/src/wl_cli/utils/logging.py +458 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/platform_adapter.py +37 -0
- py_wlcli-0.7.0/src/wl_cli/utils/pre_commit.py +266 -0
- py_wlcli-0.7.0/src/wl_cli/utils/pre_commit_config.py +72 -0
- py_wlcli-0.7.0/src/wl_cli/utils/root.py +521 -0
- py_wlcli-0.7.0/src/wl_cli/utils/root_fallback.py +256 -0
- py_wlcli-0.7.0/src/wl_cli/utils/run_evidence.py +236 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/structured_logging/config.py +9 -24
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/structured_logging/core.py +4 -41
- py_wlcli-0.7.0/src/wl_cli/utils/structured_logging/env.py +56 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/structured_logging/handlers.py +6 -14
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/structured_logging/logger.py +31 -72
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/subprocess.py +2 -2
- py_wlcli-0.7.0/src/wl_cli/utils/subprocess_utils.py +260 -0
- py_wlcli-0.7.0/src/wl_cli/utils/uv_run.py +79 -0
- py_wlcli-0.7.0/src/wl_cli/utils/uv_tree.py +71 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/uv_workspace.py +16 -40
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/version/pypi_version_checker.py +21 -11
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/version/version_service.py +29 -15
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/version/version_updater.py +25 -13
- py_wlcli-0.7.0/src/wl_cli/utils/wl_dir_updater.py +1440 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/workspace_detector/core.py +8 -0
- py_wlcli-0.7.0/src/wl_cli/utils/workspace_detector/detection_strategies.py +107 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/config/mypy.ini +4 -2
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/pre-commit +12 -8
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/pre-push +121 -32
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/sop_doc/git-dev-sop.md +3 -3
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/sop_doc/python-sop.md +3 -6
- py_wlcli-0.6.14/src/wl_cli/commands/buildcommands/builders/coordinator.py +0 -135
- py_wlcli-0.6.14/src/wl_cli/commands/clean/dead_code/fixer.py +0 -124
- py_wlcli-0.6.14/src/wl_cli/commands/clean/lfs.py +0 -278
- py_wlcli-0.6.14/src/wl_cli/commands/dependency_resolver.py +0 -25
- py_wlcli-0.6.14/src/wl_cli/commands/format/__init__.py +0 -28
- py_wlcli-0.6.14/src/wl_cli/commands/format/format_cache.py +0 -75
- py_wlcli-0.6.14/src/wl_cli/commands/format/format_coordinator.py +0 -104
- py_wlcli-0.6.14/src/wl_cli/commands/format/format_executor.py +0 -365
- py_wlcli-0.6.14/src/wl_cli/commands/format/format_path_handler.py +0 -355
- py_wlcli-0.6.14/src/wl_cli/commands/format/python_formatter.py +0 -236
- py_wlcli-0.6.14/src/wl_cli/commands/format/rust_formatter.py +0 -80
- py_wlcli-0.6.14/src/wl_cli/commands/initenv/components/git/pre_commit_manager.py +0 -127
- py_wlcli-0.6.14/src/wl_cli/commands/initenv/components/project_structure/config_generator.py +0 -187
- py_wlcli-0.6.14/src/wl_cli/commands/initenv/components/project_structure/hooks_manager.py +0 -152
- py_wlcli-0.6.14/src/wl_cli/commands/initenv/components/venv_manager.py +0 -103
- py_wlcli-0.6.14/src/wl_cli/commands/lint/lint.py +0 -11
- py_wlcli-0.6.14/src/wl_cli/commands/lint/lint_command.py +0 -195
- py_wlcli-0.6.14/src/wl_cli/commands/lint/lint_executor.py +0 -93
- py_wlcli-0.6.14/src/wl_cli/commands/lint/lint_reporter.py +0 -352
- py_wlcli-0.6.14/src/wl_cli/commands/lint/mypy_config.py +0 -51
- py_wlcli-0.6.14/src/wl_cli/commands/testcommands/cache_manager.py +0 -933
- py_wlcli-0.6.14/src/wl_cli/commands/testcommands/coverage_cache_manager.py +0 -210
- py_wlcli-0.6.14/src/wl_cli/commands/testcommands/single_test_executor.py +0 -158
- py_wlcli-0.6.14/src/wl_cli/commands/testcommands/test_runner.py +0 -225
- py_wlcli-0.6.14/src/wl_cli/commands/testcommands/utils/project_root.py +0 -37
- py_wlcli-0.6.14/src/wl_cli/commands/update/services/vendors_updater.py +0 -72
- py_wlcli-0.6.14/src/wl_cli/commands/update/update_command.py +0 -245
- py_wlcli-0.6.14/src/wl_cli/infrastructure/dependency_injection.py +0 -417
- py_wlcli-0.6.14/src/wl_cli/utils/logging.py +0 -340
- py_wlcli-0.6.14/src/wl_cli/utils/project_root.py +0 -86
- py_wlcli-0.6.14/src/wl_cli/utils/subprocess_utils.py +0 -164
- py_wlcli-0.6.14/src/wl_cli/utils/wl_dir_updater.py +0 -636
- py_wlcli-0.6.14/src/wl_cli/utils/workspace_detector/detection_strategies.py +0 -89
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/LICENSE +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/rust/LICENSE +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/rust/build.rs +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/rust/rust-analyzer.json +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/rust/src/lib.rs +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/rust/src/main.rs +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/base.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/buildcommands/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/buildcommands/build.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/buildcommands/builders/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/buildcommands/builders/cleanup.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/buildcommands/builders/stubs.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/buildcommands/test.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/clean_utils.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/dead_code/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/dead_code/utils.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/utils/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/click_base.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/config/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/debug/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/debug/debug_subagent.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/debug/output_formatter.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/format/format_progress.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/format/format_reporter.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/git/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/git/git_facts.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/git/git_flow.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/git/policy.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/common/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/common/exceptions.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/directory_utils.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/git/git_flow_interface.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/git/git_utility.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/i18n_manager.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/log_manager.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/symlink_cleaner.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/services/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/lfs/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/lfs/hook.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/lfs/manager.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/lfs/policy.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/lint/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/common/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/common/config.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/common/version_cache.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/handlers/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/services/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/batch_processor.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/speed_checker.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/utils/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/utils/coverage_parser.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/utils/env_info.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/utils/junit_parser.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/utils/markdown_utils.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/update/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/update/services/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/update/services/component_manager.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/update/services/version_tracker.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/update/utils/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/version/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/version/version_command.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/workflow.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/exceptions.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/lib/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/lib/rust_utils.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/config/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/config/env_exporter.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/config/env_parser.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/config/validation.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/error_handler.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/file_copier.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/language_utils.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/lazy_import.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/log_levels.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/log_rotators.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/output_context.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/performance/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/performance/decorators.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/performance/exporter.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/performance/models.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/performance/monitor.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/performance_monitor.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/structured_logger.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/structured_logging/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/structured_logging/filtering.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/structured_logging/filters.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/structured_logging/formatters.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/test_utils/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/test_utils/test_filter.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/uv_tool.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/version/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/version/version_comparator.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/version/version_detectors.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/workspace_detector/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/workspace_detector/exceptions.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/workspace_detector/types.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/workspace_detector/venv_resolver.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/config/.codespellrc +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/config/dependencies.toml +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/config/pyproject_defaults.toml +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/config/template_config.toml +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/config/tool_configs.toml +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/git/.gitignore +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/git/.pre-commit-config.yaml +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/applypatch-msg.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/commit-msg.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/fsmonitor-watchman.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/post-update.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/pre-applypatch.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/pre-commit +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/pre-commit.legacy +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/pre-commit.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/pre-merge-commit.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/pre-push.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/pre-rebase.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/pre-receive.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/prepare-commit-msg.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/push-to-checkout.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/sendemail-validate.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/applypatch-msg.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/check_lockfile.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/check_lockfile.sh +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/commit-msg.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/fsmonitor-watchman.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/post-update.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/pre-applypatch.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/pre-commit.legacy +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/pre-commit.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/pre-commit.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/pre-merge-commit.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/pre-push.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/pre-rebase.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/pre-receive.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/prepare-commit-msg.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/update.sample +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/win/work.bat +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/project/.gitignore +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/project/.python-version +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/project/LICENSE +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/project/README.md +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/project/pyproject.toml +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/project/pyproject_no_workspace.toml +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/project/pyproject_workspace.toml +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/readme/README.md +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/rust/Cargo.toml +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/rust/lib/__init__.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/rust/lib/rust_utils.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/rust/src/lib.rs +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/rust/src/main.rs +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/rust/tests/test_rust_fallback.py +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/sop_doc/industrial-standard-sop.md +0 -0
- {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/sop_doc/rust-readme.md +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: py_wlcli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.0
|
|
4
4
|
Requires-Dist: toml>=0.10.2
|
|
5
5
|
Requires-Dist: click>=8.1.0
|
|
6
6
|
Requires-Dist: tqdm>=4.66.0
|
|
@@ -116,8 +116,7 @@ pytest tests/ -v # 指定文件(pytest 直跑)
|
|
|
116
116
|
|
|
117
117
|
Click CLI([src/wl_cli/cli_click.py](https://github.com/CharlieZi/wl-cli/blob/main/src/wl_cli/cli_click.py)
|
|
118
118
|
经 `setup_commands()` 直接注册)→ 各命令实现(`commands/<group>/`)→ 业务逻辑;
|
|
119
|
-
Rust 原生扩展(`rust/`、`src/wl_cli/lib/`)经 maturin 编译为 `wl_cli_native
|
|
120
|
-
依赖注入容器集中管理共享服务(`infrastructure/dependency_injection.py`)。
|
|
119
|
+
Rust 原生扩展(`rust/`、`src/wl_cli/lib/`)经 maturin 编译为 `wl_cli_native`。
|
|
121
120
|
架构演进背景见 [Click 迁移设计](https://github.com/CharlieZi/wl-cli/blob/main/docs/superpowers/specs/2026-06-02-full-click-migration-design.md)。
|
|
122
121
|
|
|
123
122
|
## 许可证
|
|
@@ -84,8 +84,7 @@ pytest tests/ -v # 指定文件(pytest 直跑)
|
|
|
84
84
|
|
|
85
85
|
Click CLI([src/wl_cli/cli_click.py](https://github.com/CharlieZi/wl-cli/blob/main/src/wl_cli/cli_click.py)
|
|
86
86
|
经 `setup_commands()` 直接注册)→ 各命令实现(`commands/<group>/`)→ 业务逻辑;
|
|
87
|
-
Rust 原生扩展(`rust/`、`src/wl_cli/lib/`)经 maturin 编译为 `wl_cli_native
|
|
88
|
-
依赖注入容器集中管理共享服务(`infrastructure/dependency_injection.py`)。
|
|
87
|
+
Rust 原生扩展(`rust/`、`src/wl_cli/lib/`)经 maturin 编译为 `wl_cli_native`。
|
|
89
88
|
架构演进背景见 [Click 迁移设计](https://github.com/CharlieZi/wl-cli/blob/main/docs/superpowers/specs/2026-06-02-full-click-migration-design.md)。
|
|
90
89
|
|
|
91
90
|
## 许可证
|
|
@@ -89,11 +89,19 @@ target-version = "py310"
|
|
|
89
89
|
|
|
90
90
|
[tool.ruff.format]
|
|
91
91
|
preview = false
|
|
92
|
+
# Vendored upstream assets are not this repo's code, so they must never redden
|
|
93
|
+
# the format leg -- same 口径 as the existing codespell exclusion
|
|
94
|
+
# (^src/wl_cli/vendors/ in .wl/.pre-commit-config.yaml). `lint` and `format`
|
|
95
|
+
# keep separate exclude lists, so the pattern is written in both; the dual
|
|
96
|
+
# assertion in tests/test_gate_lint_scope.py pins both legs so neither can be
|
|
97
|
+
# silently widened. The glob needs `/**` (ruff matches file paths, so a bare
|
|
98
|
+
# directory path matches nothing).
|
|
99
|
+
exclude = [ "src/wl_cli/vendors/**",]
|
|
92
100
|
|
|
93
101
|
[tool.ruff.lint]
|
|
94
102
|
select = ["E", "W", "F", "I", "C4", "UP", "N", "B", "C90", "TCH"]
|
|
95
103
|
ignore = ["E501", "B904", "E402", "F811", "S607", "N802", "N817"]
|
|
96
|
-
exclude = [ ".git", ".ruff_cache", "__pycache__", "build", "dist", "*.egg-info", "uv.lock", "tmp",]
|
|
104
|
+
exclude = [ ".git", ".ruff_cache", "__pycache__", "build", "dist", "*.egg-info", "uv.lock", "tmp", "src/wl_cli/vendors/**",]
|
|
97
105
|
|
|
98
106
|
# F841 (unused local variable) is enabled for package code as a dead-code
|
|
99
107
|
# backstop, but exempted in tests where unused locals are often scaffolding.
|
|
@@ -12,3 +12,11 @@ allow = [
|
|
|
12
12
|
"Apache-2.0 WITH LLVM-exception",
|
|
13
13
|
"Unicode-3.0",
|
|
14
14
|
]
|
|
15
|
+
|
|
16
|
+
# Source allow-list (issue #85): every crate in rust/Cargo.lock resolves from
|
|
17
|
+
# the crates.io registry (there are no git dependencies), so allow exactly that
|
|
18
|
+
# and nothing else. `cargo deny check sources` fails if a dependency is ever
|
|
19
|
+
# pulled from an unexpected registry or git host.
|
|
20
|
+
[sources]
|
|
21
|
+
allow-registry = ["https://github.com/rust-lang/crates.io-index"]
|
|
22
|
+
allow-git = []
|
|
@@ -16,7 +16,14 @@ def _setup_stdio_encoding() -> None:
|
|
|
16
16
|
characters crash print(). This wraps stdout/stderr with explicit
|
|
17
17
|
UTF-8 encoding so all output works regardless of terminal locale.
|
|
18
18
|
"""
|
|
19
|
-
|
|
19
|
+
# Imported here (with a script-execution fallback, matching the cli_click
|
|
20
|
+
# import below) so this module stays runnable as a plain script.
|
|
21
|
+
try:
|
|
22
|
+
from .utils import platform_adapter
|
|
23
|
+
except ImportError: # pragma: no cover - direct script execution
|
|
24
|
+
from wl_cli.utils import platform_adapter # type: ignore[no-redef]
|
|
25
|
+
|
|
26
|
+
if not platform_adapter.PlatformAdapter.is_windows():
|
|
20
27
|
return
|
|
21
28
|
# PYTHONIOENCODING also helps subprocess pipe encoding
|
|
22
29
|
os.environ.setdefault("PYTHONIOENCODING", "utf-8")
|
|
@@ -105,8 +112,14 @@ except ImportError:
|
|
|
105
112
|
|
|
106
113
|
|
|
107
114
|
def main() -> None:
|
|
108
|
-
"""Main entry point for WL Commands.
|
|
109
|
-
|
|
115
|
+
"""Main entry point for WL Commands.
|
|
116
|
+
|
|
117
|
+
``cli_click.main`` returns the process exit code (0 on success, 1 when a
|
|
118
|
+
command raises), so the entry point must hand that value to the
|
|
119
|
+
interpreter instead of discarding it. Without the ``SystemExit`` every
|
|
120
|
+
``return 1`` path inside ``cli_click.main`` exited 0 (#186).
|
|
121
|
+
"""
|
|
122
|
+
raise SystemExit(cli_main())
|
|
110
123
|
|
|
111
124
|
|
|
112
125
|
# Alias for compatibility with tests
|
|
@@ -36,21 +36,19 @@ def _register_click_command(
|
|
|
36
36
|
) -> None:
|
|
37
37
|
"""Register a Click command function with the wl group.
|
|
38
38
|
|
|
39
|
+
Aliases register the *same* Click object under a second name (Click keeps
|
|
40
|
+
the object's own ``name`` untouched), so an alias accepts exactly the
|
|
41
|
+
canonical command's options, arguments and subcommands. A zero-option
|
|
42
|
+
wrapper shell would reject every parameter an alias was given (#194).
|
|
43
|
+
|
|
39
44
|
Args:
|
|
40
45
|
name: Command name
|
|
41
46
|
click_func: Click command function
|
|
42
47
|
aliases: List of command aliases
|
|
43
48
|
"""
|
|
44
49
|
wl.add_command(click_func, name=name)
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
@click.command(name=alias, help=click_func.help or "")
|
|
49
|
-
@click.pass_context
|
|
50
|
-
def alias_func(ctx, *args, **kwargs):
|
|
51
|
-
return click_func(click.get_current_context().args, **kwargs)
|
|
52
|
-
|
|
53
|
-
wl.add_command(alias_func, name=alias)
|
|
50
|
+
for alias in aliases or ():
|
|
51
|
+
wl.add_command(click_func, name=alias)
|
|
54
52
|
|
|
55
53
|
|
|
56
54
|
def setup_commands():
|
|
@@ -23,28 +23,6 @@ def build_project_full() -> None:
|
|
|
23
23
|
coordinator.build_project_full()
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
def build_windows() -> None:
|
|
27
|
-
"""Build the project on Windows."""
|
|
28
|
-
try:
|
|
29
|
-
coordinator = BuildCoordinator()
|
|
30
|
-
coordinator.build_windows()
|
|
31
|
-
except Exception as e:
|
|
32
|
-
from wl_cli.exceptions import CommandError
|
|
33
|
-
|
|
34
|
-
raise CommandError(f"Build failed: {e}")
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
def build_unix() -> None:
|
|
38
|
-
"""Build the project on Unix-like systems."""
|
|
39
|
-
try:
|
|
40
|
-
coordinator = BuildCoordinator()
|
|
41
|
-
coordinator.build_unix()
|
|
42
|
-
except Exception as e:
|
|
43
|
-
from wl_cli.exceptions import CommandError
|
|
44
|
-
|
|
45
|
-
raise CommandError(f"Build failed: {e}")
|
|
46
|
-
|
|
47
|
-
|
|
48
26
|
def build_project() -> None:
|
|
49
27
|
"""Build the project based on the current platform."""
|
|
50
28
|
try:
|
|
@@ -60,8 +38,6 @@ def build_project() -> None:
|
|
|
60
38
|
__all__ = [
|
|
61
39
|
"is_rust_enabled",
|
|
62
40
|
"build_project_full",
|
|
63
|
-
"build_windows",
|
|
64
|
-
"build_unix",
|
|
65
41
|
"build_project",
|
|
66
42
|
"EnvironmentDetector",
|
|
67
43
|
"StubsManager",
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"""Build coordination logic for different platforms and scenarios."""
|
|
2
|
+
|
|
3
|
+
from ....exceptions import CommandError
|
|
4
|
+
from ....utils.logging import (
|
|
5
|
+
log_error_pair,
|
|
6
|
+
log_info,
|
|
7
|
+
log_info_pair,
|
|
8
|
+
)
|
|
9
|
+
from ....utils.subprocess import run_command
|
|
10
|
+
from .cleanup import CleanupManager
|
|
11
|
+
from .environment import EnvironmentDetector
|
|
12
|
+
from .rust_builder import RustBuilder
|
|
13
|
+
from .stubs import StubsManager
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class BuildCoordinator:
|
|
17
|
+
"""Coordinate build operations across different platforms and scenarios."""
|
|
18
|
+
|
|
19
|
+
def __init__(self):
|
|
20
|
+
self.environment_detector = EnvironmentDetector()
|
|
21
|
+
self.stubs_manager = StubsManager()
|
|
22
|
+
self.rust_builder = RustBuilder()
|
|
23
|
+
self.cleanup_manager = CleanupManager()
|
|
24
|
+
|
|
25
|
+
def build_project_full(self) -> None:
|
|
26
|
+
"""Perform a full project build."""
|
|
27
|
+
rust_enabled = self.environment_detector.is_rust_enabled()
|
|
28
|
+
|
|
29
|
+
try:
|
|
30
|
+
if rust_enabled:
|
|
31
|
+
log_info_pair(
|
|
32
|
+
"Using maturin build for full compilation...",
|
|
33
|
+
"使用 maturin build 进行完整编译...",
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
python_executable, is_workspace = (
|
|
37
|
+
self.environment_detector.resolve_python_executable()
|
|
38
|
+
)
|
|
39
|
+
self.stubs_manager.generate_and_copy_stubs()
|
|
40
|
+
self.rust_builder.build_full(python_executable)
|
|
41
|
+
self.cleanup_manager.cleanup_after_build(is_workspace)
|
|
42
|
+
else:
|
|
43
|
+
log_info_pair(
|
|
44
|
+
"Pure Python project, using uv build to generate distribution packages...",
|
|
45
|
+
"纯 Python 项目,使用 uv build 生成分发包...",
|
|
46
|
+
)
|
|
47
|
+
run_command(
|
|
48
|
+
["uv", "build"],
|
|
49
|
+
capture_output=False,
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
log_info_pair(
|
|
53
|
+
"✓ Full build completed successfully",
|
|
54
|
+
"✓ 完整构建成功完成",
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
# List files in dist directory for verification
|
|
58
|
+
from pathlib import Path
|
|
59
|
+
|
|
60
|
+
dist_dir = Path("dist")
|
|
61
|
+
if dist_dir.exists():
|
|
62
|
+
dist_files = list(dist_dir.iterdir())
|
|
63
|
+
if dist_files:
|
|
64
|
+
log_info_pair(
|
|
65
|
+
"Generated distribution packages in dist directory:",
|
|
66
|
+
"在 dist 目录中生成的分发包:",
|
|
67
|
+
)
|
|
68
|
+
for f in dist_files:
|
|
69
|
+
log_info(f" - {f.name}")
|
|
70
|
+
else:
|
|
71
|
+
log_info_pair(
|
|
72
|
+
"No distribution packages generated in dist directory",
|
|
73
|
+
"在 dist 目录中没有生成分发包",
|
|
74
|
+
)
|
|
75
|
+
except Exception as e:
|
|
76
|
+
log_error_pair(
|
|
77
|
+
f"Full build failed: {e}",
|
|
78
|
+
f"完整构建失败: {e}",
|
|
79
|
+
)
|
|
80
|
+
raise CommandError(f"Full build failed: {e}")
|
|
81
|
+
|
|
82
|
+
def build(self) -> None:
|
|
83
|
+
"""Build the project in place, on any platform.
|
|
84
|
+
|
|
85
|
+
The former ``build_windows`` and ``build_unix`` bodies were
|
|
86
|
+
byte-identical, so the platform branch collapsed away.
|
|
87
|
+
"""
|
|
88
|
+
rust_enabled = self.environment_detector.is_rust_enabled()
|
|
89
|
+
|
|
90
|
+
try:
|
|
91
|
+
if rust_enabled:
|
|
92
|
+
self.rust_builder.build_incremental()
|
|
93
|
+
else:
|
|
94
|
+
log_info_pair(
|
|
95
|
+
"Pure Python project, using uv pip install -e . for installation...",
|
|
96
|
+
"纯 Python 项目,使用 uv pip install -e . 进行安装...",
|
|
97
|
+
)
|
|
98
|
+
run_command(
|
|
99
|
+
["uv", "pip", "install", "--link-mode=copy", "-e", "."],
|
|
100
|
+
capture_output=False,
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
log_info_pair(
|
|
104
|
+
"✓ Build completed successfully",
|
|
105
|
+
"✓ 构建成功完成",
|
|
106
|
+
)
|
|
107
|
+
except CommandError as e:
|
|
108
|
+
log_error_pair(
|
|
109
|
+
f"Build failed: {e}",
|
|
110
|
+
f"构建失败: {e}",
|
|
111
|
+
)
|
|
112
|
+
raise
|
|
113
|
+
except Exception as e:
|
|
114
|
+
log_error_pair(
|
|
115
|
+
f"Unexpected error during build: {e}",
|
|
116
|
+
f"构建过程中出现意外错误: {e}",
|
|
117
|
+
)
|
|
118
|
+
raise CommandError(f"Build failed: {e}")
|
|
119
|
+
|
|
120
|
+
def build_project(self) -> None:
|
|
121
|
+
"""Build the project."""
|
|
122
|
+
self.build()
|
{py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/buildcommands/builders/environment.py
RENAMED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
import os
|
|
4
4
|
import subprocess
|
|
5
|
-
import sys
|
|
6
5
|
from pathlib import Path
|
|
7
6
|
|
|
8
7
|
from ....exceptions import CommandError
|
|
9
8
|
from ....utils.logging import log_error, log_info
|
|
9
|
+
from ....utils.platform_adapter import PlatformAdapter
|
|
10
10
|
from ....utils.workspace_detector import WorkspaceDetector
|
|
11
11
|
|
|
12
12
|
|
|
@@ -76,6 +76,6 @@ class EnvironmentDetector:
|
|
|
76
76
|
self._create_venv()
|
|
77
77
|
venv_root = Path(".venv")
|
|
78
78
|
|
|
79
|
-
if
|
|
79
|
+
if PlatformAdapter.is_windows():
|
|
80
80
|
return str((venv_root / "Scripts" / "python.exe").resolve()), True
|
|
81
81
|
return str((venv_root / "bin" / "python").resolve()), True
|
{py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/buildcommands/builders/rust_builder.py
RENAMED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import subprocess
|
|
4
4
|
|
|
5
|
-
from ....utils.logging import log_info
|
|
5
|
+
from ....utils.logging import log_info, log_info_pair
|
|
6
6
|
from ....utils.subprocess import run_command
|
|
7
7
|
|
|
8
8
|
|
|
@@ -21,8 +21,10 @@ class RustBuilder:
|
|
|
21
21
|
@staticmethod
|
|
22
22
|
def run_maturin_develop() -> None:
|
|
23
23
|
"""Run maturin develop for incremental builds."""
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
log_info_pair(
|
|
25
|
+
"Using maturin develop to build and install editable package...",
|
|
26
|
+
"使用 maturin develop 构建和安装可编辑包...",
|
|
27
|
+
)
|
|
26
28
|
# 使用maturin的原生增量编译功能
|
|
27
29
|
run_command(["maturin", "develop", "--skip-install"], capture_output=False)
|
|
28
30
|
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
import os
|
|
4
4
|
import shutil
|
|
5
5
|
import subprocess
|
|
6
|
-
import sys
|
|
7
6
|
from pathlib import Path
|
|
8
7
|
from typing import TYPE_CHECKING, Any, cast
|
|
9
8
|
|
|
@@ -14,6 +13,7 @@ import click
|
|
|
14
13
|
|
|
15
14
|
from ...exceptions import CommandError
|
|
16
15
|
from ...utils.logging import log_error, log_info
|
|
16
|
+
from ...utils.platform_adapter import PlatformAdapter
|
|
17
17
|
from ...utils.uv_workspace import is_uv_workspace
|
|
18
18
|
from ...utils.workspace_detector import WorkspaceDetectionError, WorkspaceDetector
|
|
19
19
|
from .. import Command
|
|
@@ -139,7 +139,7 @@ class BuildDistCommand(Command):
|
|
|
139
139
|
self._create_venv()
|
|
140
140
|
venv_root = Path(".venv")
|
|
141
141
|
created_venv = True
|
|
142
|
-
if
|
|
142
|
+
if PlatformAdapter.is_windows():
|
|
143
143
|
return str((venv_root / "Scripts" / "python.exe").resolve()), created_venv
|
|
144
144
|
return str((venv_root / "bin" / "python").resolve()), created_venv
|
|
145
145
|
|
|
@@ -17,15 +17,17 @@ from wl_cli.commands.clean.venv import (
|
|
|
17
17
|
remove_auto_activation_scripts,
|
|
18
18
|
remove_virtual_environments,
|
|
19
19
|
)
|
|
20
|
-
from wl_cli.utils.logging import
|
|
20
|
+
from wl_cli.utils.logging import log_info_pair
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
def clean_build_artifacts(dry_run: bool = False, config: str | None = None) -> None:
|
|
24
24
|
"""Clean build artifacts and temporary files
|
|
25
25
|
清理构建产物和临时文件
|
|
26
26
|
"""
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
log_info_pair(
|
|
28
|
+
"Cleaning build artifacts and temporary files...",
|
|
29
|
+
"正在清理构建产物和临时文件...",
|
|
30
|
+
)
|
|
29
31
|
|
|
30
32
|
# Remove build directories
|
|
31
33
|
build_dirs = [
|
|
@@ -52,8 +54,11 @@ def clean_build_artifacts(dry_run: bool = False, config: str | None = None) -> N
|
|
|
52
54
|
|
|
53
55
|
# Remove specific files
|
|
54
56
|
files_to_remove = [
|
|
55
|
-
# Coverage files
|
|
57
|
+
# Coverage files — pytest-cov 的 `Central` 控制器总以 data_suffix 写
|
|
58
|
+
# `.coverage.<host>.<pid>.<rand>`,精确匹配 ".coverage" 删不掉这些残片,
|
|
59
|
+
# 需要一并按通配清掉。
|
|
56
60
|
".coverage",
|
|
61
|
+
".coverage.*",
|
|
57
62
|
"coverage.xml",
|
|
58
63
|
# IDE and editor files
|
|
59
64
|
".DS_Store",
|
|
@@ -84,8 +89,10 @@ def clean_build_artifacts(dry_run: bool = False, config: str | None = None) -> N
|
|
|
84
89
|
# Remove rust-analyzer directories
|
|
85
90
|
remove_rust_analyzer_dirs(dry_run=dry_run)
|
|
86
91
|
|
|
87
|
-
|
|
88
|
-
|
|
92
|
+
log_info_pair(
|
|
93
|
+
"Build artifacts and temporary files cleaning completed.",
|
|
94
|
+
"构建产物和临时文件清理完成。",
|
|
95
|
+
)
|
|
89
96
|
|
|
90
97
|
|
|
91
98
|
def clean_venv_artifacts(dry_run: bool = False, config: str | None = None) -> None:
|
|
@@ -93,8 +100,7 @@ def clean_venv_artifacts(dry_run: bool = False, config: str | None = None) -> No
|
|
|
93
100
|
Clean virtual environment artifacts
|
|
94
101
|
清理虚拟环境产物
|
|
95
102
|
"""
|
|
96
|
-
|
|
97
|
-
log_info("正在清理虚拟环境...", lang="zh")
|
|
103
|
+
log_info_pair("Cleaning virtual environment...", "正在清理虚拟环境...")
|
|
98
104
|
|
|
99
105
|
# Remove virtual environments
|
|
100
106
|
remove_virtual_environments(dry_run=dry_run)
|
|
@@ -102,8 +108,7 @@ def clean_venv_artifacts(dry_run: bool = False, config: str | None = None) -> No
|
|
|
102
108
|
# Remove auto-activation scripts
|
|
103
109
|
remove_auto_activation_scripts(dry_run=dry_run)
|
|
104
110
|
|
|
105
|
-
|
|
106
|
-
log_info("虚拟环境清理完成。", lang="zh")
|
|
111
|
+
log_info_pair("Virtual environment cleaning completed.", "虚拟环境清理完成。")
|
|
107
112
|
|
|
108
113
|
|
|
109
114
|
def clean_cache_artifacts(dry_run: bool = False, config: str | None = None) -> None:
|
|
@@ -111,8 +116,7 @@ def clean_cache_artifacts(dry_run: bool = False, config: str | None = None) -> N
|
|
|
111
116
|
Clean cache directories
|
|
112
117
|
清理缓存目录
|
|
113
118
|
"""
|
|
114
|
-
|
|
115
|
-
log_info("正在清理缓存目录...", lang="zh")
|
|
119
|
+
log_info_pair("Cleaning cache directories...", "正在清理缓存目录...")
|
|
116
120
|
|
|
117
121
|
# Remove cache directories
|
|
118
122
|
cache_dirs = [
|
|
@@ -125,8 +129,7 @@ def clean_cache_artifacts(dry_run: bool = False, config: str | None = None) -> N
|
|
|
125
129
|
# Remove pycache directories
|
|
126
130
|
remove_pycache_dirs(dry_run=dry_run)
|
|
127
131
|
|
|
128
|
-
|
|
129
|
-
log_info("缓存目录清理完成。", lang="zh")
|
|
132
|
+
log_info_pair("Cache directories cleaning completed.", "缓存目录清理完成。")
|
|
130
133
|
|
|
131
134
|
|
|
132
135
|
def clean_logs_artifacts(dry_run: bool = False, config: str | None = None) -> None:
|
|
@@ -134,8 +137,7 @@ def clean_logs_artifacts(dry_run: bool = False, config: str | None = None) -> No
|
|
|
134
137
|
Clean log files and directories
|
|
135
138
|
清理日志文件和目录
|
|
136
139
|
"""
|
|
137
|
-
|
|
138
|
-
log_info("正在清理日志文件和目录...", lang="zh")
|
|
140
|
+
log_info_pair("Cleaning log files and directories...", "正在清理日志文件和目录...")
|
|
139
141
|
|
|
140
142
|
# Remove log directories
|
|
141
143
|
log_dirs = ["logs"]
|
|
@@ -144,5 +146,6 @@ def clean_logs_artifacts(dry_run: bool = False, config: str | None = None) -> No
|
|
|
144
146
|
# Remove log files
|
|
145
147
|
remove_log_files(dry_run=dry_run)
|
|
146
148
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
+
log_info_pair(
|
|
150
|
+
"Log files and directories cleaning completed.", "日志文件和目录清理完成。"
|
|
151
|
+
)
|
|
@@ -7,7 +7,7 @@ import sys
|
|
|
7
7
|
import click
|
|
8
8
|
|
|
9
9
|
from wl_cli.commands import Command, validate_command_args
|
|
10
|
-
from wl_cli.utils.logging import
|
|
10
|
+
from wl_cli.utils.logging import log_info_pair
|
|
11
11
|
|
|
12
12
|
from .clean_utils import (
|
|
13
13
|
clean_all_artifacts,
|
|
@@ -111,13 +111,14 @@ class CleanCommand(Command):
|
|
|
111
111
|
"""Execute cleaning for a specific target."""
|
|
112
112
|
# Use simple logging instead of structured logging for user-facing messages
|
|
113
113
|
start_msg_en, start_msg_zh = self._get_messages(target, "start")
|
|
114
|
-
|
|
115
|
-
log_info(start_msg_zh, lang="zh")
|
|
114
|
+
log_info_pair(start_msg_en, start_msg_zh)
|
|
116
115
|
|
|
117
116
|
# Log dry run mode
|
|
118
117
|
if dry_run:
|
|
119
|
-
|
|
120
|
-
|
|
118
|
+
log_info_pair(
|
|
119
|
+
"Dry run mode: No files will be deleted.",
|
|
120
|
+
"Dry run模式:不会删除任何文件。",
|
|
121
|
+
)
|
|
121
122
|
|
|
122
123
|
# Get and execute the appropriate cleaning function
|
|
123
124
|
cleaning_function = self._get_cleaning_function(target)
|
|
@@ -128,15 +129,14 @@ class CleanCommand(Command):
|
|
|
128
129
|
|
|
129
130
|
# Log success message
|
|
130
131
|
success_msg_en, success_msg_zh = self._get_messages(target, "success")
|
|
131
|
-
|
|
132
|
-
log_info(success_msg_zh, lang="zh")
|
|
132
|
+
log_info_pair(success_msg_en, success_msg_zh)
|
|
133
133
|
|
|
134
134
|
def _execute_dead_code(
|
|
135
135
|
self,
|
|
136
136
|
dry_run: bool = False,
|
|
137
137
|
scan_only: bool = False,
|
|
138
138
|
json_output: bool = False,
|
|
139
|
-
):
|
|
139
|
+
) -> int:
|
|
140
140
|
"""Execute dead code detection and cleaning."""
|
|
141
141
|
from .dead_code.dead_code_command import DeadCodeCommand
|
|
142
142
|
|
|
@@ -157,15 +157,19 @@ class CleanCommand(Command):
|
|
|
157
157
|
scan_only: bool = False,
|
|
158
158
|
json: bool = False,
|
|
159
159
|
**kwargs,
|
|
160
|
-
) ->
|
|
160
|
+
) -> int:
|
|
161
161
|
"""
|
|
162
162
|
Clean project artifacts and dead code.
|
|
163
163
|
清理项目产物和死代码。
|
|
164
|
+
|
|
165
|
+
Returns the exit code; only the Click wrapper turns it into a
|
|
166
|
+
``SystemExit`` (#166). ``dead-code`` passes the dead-code command's own
|
|
167
|
+
0/1 through; every other target reports 0 on success.
|
|
164
168
|
"""
|
|
165
169
|
try:
|
|
166
170
|
if clean_action == "dead-code":
|
|
167
171
|
# Execute dead code command
|
|
168
|
-
self._execute_dead_code(
|
|
172
|
+
return self._execute_dead_code(
|
|
169
173
|
dry_run=dry_run,
|
|
170
174
|
scan_only=scan_only,
|
|
171
175
|
json_output=json,
|
|
@@ -202,10 +206,12 @@ class CleanCommand(Command):
|
|
|
202
206
|
config=config,
|
|
203
207
|
parallel=parallel,
|
|
204
208
|
)
|
|
209
|
+
# Artifact targets (and the legacy target branch) report success;
|
|
210
|
+
# they do not forward a deeper command's status (#166 patch 4).
|
|
211
|
+
return 0
|
|
205
212
|
except Exception as e:
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
sys.exit(1)
|
|
213
|
+
log_info_pair(f"Error cleaning project: {e}", f"错误:清理项目失败: {e}")
|
|
214
|
+
return 1
|
|
209
215
|
|
|
210
216
|
|
|
211
217
|
@click.command(name="clean")
|
|
@@ -266,7 +272,7 @@ def clean_command(
|
|
|
266
272
|
"dead-code",
|
|
267
273
|
]:
|
|
268
274
|
# Use as clean_action
|
|
269
|
-
cmd.execute(
|
|
275
|
+
exit_code = cmd.execute(
|
|
270
276
|
clean_action=target_or_subcommand,
|
|
271
277
|
dry_run=dry_run,
|
|
272
278
|
scan_only=scan_only,
|
|
@@ -276,9 +282,13 @@ def clean_command(
|
|
|
276
282
|
)
|
|
277
283
|
else:
|
|
278
284
|
# Use as target (legacy behavior)
|
|
279
|
-
cmd.execute(
|
|
285
|
+
exit_code = cmd.execute(
|
|
280
286
|
target=target_or_subcommand,
|
|
281
287
|
dry_run=dry_run,
|
|
282
288
|
config=config,
|
|
283
289
|
parallel=parallel,
|
|
284
290
|
)
|
|
291
|
+
|
|
292
|
+
# The implementation returns a code; only this wrapper exits (#166).
|
|
293
|
+
if exit_code:
|
|
294
|
+
sys.exit(exit_code)
|