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.
Files changed (343) hide show
  1. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/PKG-INFO +2 -3
  2. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/README.md +1 -2
  3. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/pyproject.toml +9 -1
  4. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/rust/Cargo.lock +1 -1
  5. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/rust/Cargo.toml +1 -1
  6. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/rust/deny.toml +8 -0
  7. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/__main__.py +16 -3
  8. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/cli_click.py +7 -9
  9. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/buildcommands/build_utils.py +0 -24
  10. py_wlcli-0.7.0/src/wl_cli/commands/buildcommands/builders/coordinator.py +122 -0
  11. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/buildcommands/builders/environment.py +2 -2
  12. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/buildcommands/builders/rust_builder.py +5 -3
  13. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/buildcommands/dist.py +2 -2
  14. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/build.py +21 -18
  15. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/clean.py +25 -15
  16. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/core.py +56 -50
  17. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/dead_code/dead_code_command.py +14 -20
  18. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/dead_code/detector.py +37 -13
  19. py_wlcli-0.7.0/src/wl_cli/commands/clean/dead_code/fixer.py +176 -0
  20. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/dead_code/reporter.py +41 -51
  21. py_wlcli-0.7.0/src/wl_cli/commands/clean/lfs.py +215 -0
  22. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/python.py +28 -21
  23. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/rust.py +27 -37
  24. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/venv.py +31 -27
  25. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/cleanup.py +2 -1
  26. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/config/config.py +66 -16
  27. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/debug/debug.py +26 -5
  28. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/debug/debug_cache.py +21 -6
  29. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/debug/source_hasher.py +2 -0
  30. py_wlcli-0.7.0/src/wl_cli/commands/format/__init__.py +13 -0
  31. py_wlcli-0.7.0/src/wl_cli/commands/format/format_cache_adapter.py +125 -0
  32. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/format/format_command.py +60 -11
  33. py_wlcli-0.7.0/src/wl_cli/commands/format/format_coordinator.py +191 -0
  34. py_wlcli-0.7.0/src/wl_cli/commands/format/format_executor.py +470 -0
  35. py_wlcli-0.7.0/src/wl_cli/commands/format/format_outcome.py +44 -0
  36. py_wlcli-0.7.0/src/wl_cli/commands/format/format_path_handler.py +1016 -0
  37. py_wlcli-0.7.0/src/wl_cli/commands/format/python_formatter.py +496 -0
  38. py_wlcli-0.7.0/src/wl_cli/commands/format/rust_formatter.py +106 -0
  39. py_wlcli-0.7.0/src/wl_cli/commands/gate/__init__.py +1 -0
  40. py_wlcli-0.7.0/src/wl_cli/commands/gate/gate_command.py +862 -0
  41. py_wlcli-0.7.0/src/wl_cli/commands/gate/preflight.py +445 -0
  42. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/git/config.py +15 -3
  43. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/git/hook.py +22 -9
  44. py_wlcli-0.7.0/src/wl_cli/commands/git/push_update.py +82 -0
  45. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/common/check_git_bash.py +2 -1
  46. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/common/error_handler.py +3 -5
  47. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/cargo_sync.py +5 -3
  48. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/config_manager.py +3 -2
  49. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/git/__init__.py +0 -2
  50. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/git/branch_creator.py +49 -42
  51. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/git/git_flow_manager.py +29 -23
  52. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/git/git_lfs_manager.py +79 -56
  53. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/git/gitignore_manager.py +13 -7
  54. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/git_initializer.py +51 -32
  55. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/project_structure/__init__.py +2 -0
  56. py_wlcli-0.7.0/src/wl_cli/commands/initenv/components/project_structure/config_generator.py +360 -0
  57. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/project_structure/directory_creator.py +26 -10
  58. py_wlcli-0.7.0/src/wl_cli/commands/initenv/components/project_structure/hook_source.py +110 -0
  59. py_wlcli-0.7.0/src/wl_cli/commands/initenv/components/project_structure/hooks_manager.py +995 -0
  60. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/project_structure/readme_handler.py +11 -11
  61. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/project_structure/rust_files_handler.py +11 -2
  62. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/project_structure/setup_handler.py +31 -12
  63. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/project_structure/sop_generator.py +28 -10
  64. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/project_structure/template_copier.py +20 -12
  65. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/project_structure/template_manager.py +44 -19
  66. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/pyproject_generator.py +2 -21
  67. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/rust_initializer.py +28 -19
  68. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/symlink_manager.py +3 -2
  69. py_wlcli-0.7.0/src/wl_cli/commands/initenv/components/venv_manager.py +118 -0
  70. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/initenv.py +22 -4
  71. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/services/environment_initializer.py +116 -90
  72. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/services/git_lfs_initializer.py +5 -5
  73. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/services/project_structure_initializer.py +10 -7
  74. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/lfs/README.md +2 -2
  75. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/lfs/cli.py +14 -2
  76. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/lfs/config.py +14 -3
  77. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/lfs/initializer.py +52 -7
  78. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/lfs/watcher.py +35 -10
  79. py_wlcli-0.7.0/src/wl_cli/commands/lint/lint_command.py +297 -0
  80. py_wlcli-0.7.0/src/wl_cli/commands/lint/lint_executor.py +409 -0
  81. py_wlcli-0.7.0/src/wl_cli/commands/lint/lint_reporter.py +579 -0
  82. py_wlcli-0.7.0/src/wl_cli/commands/lint/lint_run.py +258 -0
  83. py_wlcli-0.7.0/src/wl_cli/commands/lint/mypy_config.py +90 -0
  84. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/registry.py +1 -0
  85. py_wlcli-0.7.0/src/wl_cli/commands/self/common/capabilities.py +30 -0
  86. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/handlers/base_handler.py +2 -3
  87. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/handlers/install_handler.py +23 -18
  88. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/handlers/status_handler.py +21 -19
  89. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/handlers/uninstall_handler.py +16 -15
  90. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/handlers/update_handler.py +25 -20
  91. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/handlers/version_handler.py +2 -3
  92. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/self_command.py +41 -24
  93. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/services/installation_manager.py +36 -31
  94. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/services/local_installer.py +38 -40
  95. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/services/pypi_updater.py +48 -45
  96. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/services/windows_update.py +49 -47
  97. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/base_dependency_analyzer.py +3 -2
  98. py_wlcli-0.7.0/src/wl_cli/commands/testcommands/cache_manager.py +1156 -0
  99. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/coverage_analyzer.py +363 -27
  100. py_wlcli-0.7.0/src/wl_cli/commands/testcommands/coverage_cache_manager.py +183 -0
  101. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/progress_manager.py +25 -12
  102. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/python_env_detector.py +39 -11
  103. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/report_generator.py +25 -13
  104. py_wlcli-0.7.0/src/wl_cli/commands/testcommands/single_test_executor.py +250 -0
  105. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/test_command_builder.py +47 -22
  106. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/test_commands.py +212 -36
  107. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/test_reporter.py +21 -11
  108. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/test_result_handler.py +10 -2
  109. py_wlcli-0.7.0/src/wl_cli/commands/testcommands/test_runner.py +1343 -0
  110. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/test_utils.py +32 -0
  111. py_wlcli-0.7.0/src/wl_cli/commands/testcommands/utils/project_root.py +61 -0
  112. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/update/services/backup_manager.py +33 -19
  113. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/update/services/conflict_resolver.py +20 -11
  114. py_wlcli-0.7.0/src/wl_cli/commands/update/services/vendors_updater.py +85 -0
  115. py_wlcli-0.7.0/src/wl_cli/commands/update/update_command.py +270 -0
  116. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/cache.py +13 -1
  117. py_wlcli-0.7.0/src/wl_cli/utils/cache_ledger.py +355 -0
  118. py_wlcli-0.7.0/src/wl_cli/utils/cache_store.py +546 -0
  119. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/config/config_loader.py +11 -3
  120. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/config/core.py +221 -36
  121. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/config/defaults.py +49 -1
  122. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/file_operations.py +3 -1
  123. py_wlcli-0.7.0/src/wl_cli/utils/logging.py +458 -0
  124. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/platform_adapter.py +37 -0
  125. py_wlcli-0.7.0/src/wl_cli/utils/pre_commit.py +266 -0
  126. py_wlcli-0.7.0/src/wl_cli/utils/pre_commit_config.py +72 -0
  127. py_wlcli-0.7.0/src/wl_cli/utils/root.py +521 -0
  128. py_wlcli-0.7.0/src/wl_cli/utils/root_fallback.py +256 -0
  129. py_wlcli-0.7.0/src/wl_cli/utils/run_evidence.py +236 -0
  130. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/structured_logging/config.py +9 -24
  131. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/structured_logging/core.py +4 -41
  132. py_wlcli-0.7.0/src/wl_cli/utils/structured_logging/env.py +56 -0
  133. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/structured_logging/handlers.py +6 -14
  134. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/structured_logging/logger.py +31 -72
  135. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/subprocess.py +2 -2
  136. py_wlcli-0.7.0/src/wl_cli/utils/subprocess_utils.py +260 -0
  137. py_wlcli-0.7.0/src/wl_cli/utils/uv_run.py +79 -0
  138. py_wlcli-0.7.0/src/wl_cli/utils/uv_tree.py +71 -0
  139. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/uv_workspace.py +16 -40
  140. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/version/pypi_version_checker.py +21 -11
  141. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/version/version_service.py +29 -15
  142. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/version/version_updater.py +25 -13
  143. py_wlcli-0.7.0/src/wl_cli/utils/wl_dir_updater.py +1440 -0
  144. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/workspace_detector/core.py +8 -0
  145. py_wlcli-0.7.0/src/wl_cli/utils/workspace_detector/detection_strategies.py +107 -0
  146. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/config/mypy.ini +4 -2
  147. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/pre-commit +12 -8
  148. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/pre-push +121 -32
  149. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/sop_doc/git-dev-sop.md +3 -3
  150. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/sop_doc/python-sop.md +3 -6
  151. py_wlcli-0.6.14/src/wl_cli/commands/buildcommands/builders/coordinator.py +0 -135
  152. py_wlcli-0.6.14/src/wl_cli/commands/clean/dead_code/fixer.py +0 -124
  153. py_wlcli-0.6.14/src/wl_cli/commands/clean/lfs.py +0 -278
  154. py_wlcli-0.6.14/src/wl_cli/commands/dependency_resolver.py +0 -25
  155. py_wlcli-0.6.14/src/wl_cli/commands/format/__init__.py +0 -28
  156. py_wlcli-0.6.14/src/wl_cli/commands/format/format_cache.py +0 -75
  157. py_wlcli-0.6.14/src/wl_cli/commands/format/format_coordinator.py +0 -104
  158. py_wlcli-0.6.14/src/wl_cli/commands/format/format_executor.py +0 -365
  159. py_wlcli-0.6.14/src/wl_cli/commands/format/format_path_handler.py +0 -355
  160. py_wlcli-0.6.14/src/wl_cli/commands/format/python_formatter.py +0 -236
  161. py_wlcli-0.6.14/src/wl_cli/commands/format/rust_formatter.py +0 -80
  162. py_wlcli-0.6.14/src/wl_cli/commands/initenv/components/git/pre_commit_manager.py +0 -127
  163. py_wlcli-0.6.14/src/wl_cli/commands/initenv/components/project_structure/config_generator.py +0 -187
  164. py_wlcli-0.6.14/src/wl_cli/commands/initenv/components/project_structure/hooks_manager.py +0 -152
  165. py_wlcli-0.6.14/src/wl_cli/commands/initenv/components/venv_manager.py +0 -103
  166. py_wlcli-0.6.14/src/wl_cli/commands/lint/lint.py +0 -11
  167. py_wlcli-0.6.14/src/wl_cli/commands/lint/lint_command.py +0 -195
  168. py_wlcli-0.6.14/src/wl_cli/commands/lint/lint_executor.py +0 -93
  169. py_wlcli-0.6.14/src/wl_cli/commands/lint/lint_reporter.py +0 -352
  170. py_wlcli-0.6.14/src/wl_cli/commands/lint/mypy_config.py +0 -51
  171. py_wlcli-0.6.14/src/wl_cli/commands/testcommands/cache_manager.py +0 -933
  172. py_wlcli-0.6.14/src/wl_cli/commands/testcommands/coverage_cache_manager.py +0 -210
  173. py_wlcli-0.6.14/src/wl_cli/commands/testcommands/single_test_executor.py +0 -158
  174. py_wlcli-0.6.14/src/wl_cli/commands/testcommands/test_runner.py +0 -225
  175. py_wlcli-0.6.14/src/wl_cli/commands/testcommands/utils/project_root.py +0 -37
  176. py_wlcli-0.6.14/src/wl_cli/commands/update/services/vendors_updater.py +0 -72
  177. py_wlcli-0.6.14/src/wl_cli/commands/update/update_command.py +0 -245
  178. py_wlcli-0.6.14/src/wl_cli/infrastructure/dependency_injection.py +0 -417
  179. py_wlcli-0.6.14/src/wl_cli/utils/logging.py +0 -340
  180. py_wlcli-0.6.14/src/wl_cli/utils/project_root.py +0 -86
  181. py_wlcli-0.6.14/src/wl_cli/utils/subprocess_utils.py +0 -164
  182. py_wlcli-0.6.14/src/wl_cli/utils/wl_dir_updater.py +0 -636
  183. py_wlcli-0.6.14/src/wl_cli/utils/workspace_detector/detection_strategies.py +0 -89
  184. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/LICENSE +0 -0
  185. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/rust/LICENSE +0 -0
  186. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/rust/build.rs +0 -0
  187. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/rust/rust-analyzer.json +0 -0
  188. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/rust/src/lib.rs +0 -0
  189. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/rust/src/main.rs +0 -0
  190. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/__init__.py +0 -0
  191. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/__init__.py +0 -0
  192. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/base.py +0 -0
  193. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/buildcommands/__init__.py +0 -0
  194. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/buildcommands/build.py +0 -0
  195. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/buildcommands/builders/__init__.py +0 -0
  196. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/buildcommands/builders/cleanup.py +0 -0
  197. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/buildcommands/builders/stubs.py +0 -0
  198. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/buildcommands/test.py +0 -0
  199. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/__init__.py +0 -0
  200. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/clean_utils.py +0 -0
  201. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/dead_code/__init__.py +0 -0
  202. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/dead_code/utils.py +0 -0
  203. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/clean/utils/__init__.py +0 -0
  204. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/click_base.py +0 -0
  205. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/config/__init__.py +0 -0
  206. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/debug/__init__.py +0 -0
  207. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/debug/debug_subagent.py +0 -0
  208. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/debug/output_formatter.py +0 -0
  209. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/format/format_progress.py +0 -0
  210. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/format/format_reporter.py +0 -0
  211. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/git/__init__.py +0 -0
  212. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/git/git_facts.py +0 -0
  213. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/git/git_flow.py +0 -0
  214. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/git/policy.py +0 -0
  215. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/__init__.py +0 -0
  216. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/common/__init__.py +0 -0
  217. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/common/exceptions.py +0 -0
  218. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/__init__.py +0 -0
  219. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/directory_utils.py +0 -0
  220. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/git/git_flow_interface.py +0 -0
  221. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/git/git_utility.py +0 -0
  222. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/i18n_manager.py +0 -0
  223. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/log_manager.py +0 -0
  224. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/components/symlink_cleaner.py +0 -0
  225. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/initenv/services/__init__.py +0 -0
  226. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/lfs/__init__.py +0 -0
  227. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/lfs/hook.py +0 -0
  228. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/lfs/manager.py +0 -0
  229. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/lfs/policy.py +0 -0
  230. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/lint/__init__.py +0 -0
  231. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/__init__.py +0 -0
  232. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/common/__init__.py +0 -0
  233. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/common/config.py +0 -0
  234. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/common/version_cache.py +0 -0
  235. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/handlers/__init__.py +0 -0
  236. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/self/services/__init__.py +0 -0
  237. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/__init__.py +0 -0
  238. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/batch_processor.py +0 -0
  239. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/speed_checker.py +0 -0
  240. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/utils/__init__.py +0 -0
  241. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/utils/coverage_parser.py +0 -0
  242. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/utils/env_info.py +0 -0
  243. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/utils/junit_parser.py +0 -0
  244. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/testcommands/utils/markdown_utils.py +0 -0
  245. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/update/__init__.py +0 -0
  246. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/update/services/__init__.py +0 -0
  247. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/update/services/component_manager.py +0 -0
  248. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/update/services/version_tracker.py +0 -0
  249. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/update/utils/__init__.py +0 -0
  250. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/version/__init__.py +0 -0
  251. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/version/version_command.py +0 -0
  252. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/commands/workflow.py +0 -0
  253. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/exceptions.py +0 -0
  254. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/lib/__init__.py +0 -0
  255. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/lib/rust_utils.py +0 -0
  256. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/__init__.py +0 -0
  257. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/config/__init__.py +0 -0
  258. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/config/env_exporter.py +0 -0
  259. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/config/env_parser.py +0 -0
  260. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/config/validation.py +0 -0
  261. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/error_handler.py +0 -0
  262. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/file_copier.py +0 -0
  263. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/language_utils.py +0 -0
  264. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/lazy_import.py +0 -0
  265. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/log_levels.py +0 -0
  266. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/log_rotators.py +0 -0
  267. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/output_context.py +0 -0
  268. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/performance/__init__.py +0 -0
  269. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/performance/decorators.py +0 -0
  270. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/performance/exporter.py +0 -0
  271. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/performance/models.py +0 -0
  272. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/performance/monitor.py +0 -0
  273. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/performance_monitor.py +0 -0
  274. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/structured_logger.py +0 -0
  275. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/structured_logging/__init__.py +0 -0
  276. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/structured_logging/filtering.py +0 -0
  277. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/structured_logging/filters.py +0 -0
  278. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/structured_logging/formatters.py +0 -0
  279. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/test_utils/__init__.py +0 -0
  280. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/test_utils/test_filter.py +0 -0
  281. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/uv_tool.py +0 -0
  282. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/version/__init__.py +0 -0
  283. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/version/version_comparator.py +0 -0
  284. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/version/version_detectors.py +0 -0
  285. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/workspace_detector/__init__.py +0 -0
  286. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/workspace_detector/exceptions.py +0 -0
  287. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/workspace_detector/types.py +0 -0
  288. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/utils/workspace_detector/venv_resolver.py +0 -0
  289. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/config/.codespellrc +0 -0
  290. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/config/dependencies.toml +0 -0
  291. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/config/pyproject_defaults.toml +0 -0
  292. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/config/template_config.toml +0 -0
  293. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/config/tool_configs.toml +0 -0
  294. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/git/.gitignore +0 -0
  295. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/git/.pre-commit-config.yaml +0 -0
  296. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/applypatch-msg.sample +0 -0
  297. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/commit-msg.sample +0 -0
  298. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/fsmonitor-watchman.sample +0 -0
  299. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/post-update.sample +0 -0
  300. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/pre-applypatch.sample +0 -0
  301. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/pre-commit +0 -0
  302. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/pre-commit.legacy +0 -0
  303. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/pre-commit.sample +0 -0
  304. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/pre-merge-commit.sample +0 -0
  305. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/pre-push.sample +0 -0
  306. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/pre-rebase.sample +0 -0
  307. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/pre-receive.sample +0 -0
  308. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/prepare-commit-msg.sample +0 -0
  309. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/push-to-checkout.sample +0 -0
  310. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/sendemail-validate.sample +0 -0
  311. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/applypatch-msg.sample +0 -0
  312. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/check_lockfile.py +0 -0
  313. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/check_lockfile.sh +0 -0
  314. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/commit-msg.sample +0 -0
  315. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/fsmonitor-watchman.sample +0 -0
  316. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/post-update.sample +0 -0
  317. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/pre-applypatch.sample +0 -0
  318. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/pre-commit.legacy +0 -0
  319. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/pre-commit.py +0 -0
  320. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/pre-commit.sample +0 -0
  321. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/pre-merge-commit.sample +0 -0
  322. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/pre-push.sample +0 -0
  323. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/pre-rebase.sample +0 -0
  324. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/pre-receive.sample +0 -0
  325. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/unix/prepare-commit-msg.sample +0 -0
  326. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/update.sample +0 -0
  327. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/hooks/win/work.bat +0 -0
  328. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/project/.gitignore +0 -0
  329. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/project/.python-version +0 -0
  330. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/project/LICENSE +0 -0
  331. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/project/README.md +0 -0
  332. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/project/pyproject.toml +0 -0
  333. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/project/pyproject_no_workspace.toml +0 -0
  334. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/project/pyproject_workspace.toml +0 -0
  335. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/readme/README.md +0 -0
  336. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/rust/Cargo.toml +0 -0
  337. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/rust/lib/__init__.py +0 -0
  338. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/rust/lib/rust_utils.py +0 -0
  339. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/rust/src/lib.rs +0 -0
  340. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/rust/src/main.rs +0 -0
  341. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/rust/tests/test_rust_fallback.py +0 -0
  342. {py_wlcli-0.6.14 → py_wlcli-0.7.0}/src/wl_cli/vendors/sop_doc/industrial-standard-sop.md +0 -0
  343. {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.6.14
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.
@@ -126,7 +126,7 @@ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
126
126
 
127
127
  [[package]]
128
128
  name = "wl_cli_native"
129
- version = "0.6.14"
129
+ version = "0.7.0"
130
130
  dependencies = [
131
131
  "pyo3",
132
132
  ]
@@ -1,7 +1,7 @@
1
1
 
2
2
  [package]
3
3
  name = "wl_cli_native"
4
- version = "0.6.14"
4
+ version = "0.7.0"
5
5
  edition = "2024"
6
6
  description = "wl_cli - Python项目"
7
7
  authors = ["WL Admin <wl.admin@example.com>"]
@@ -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
- if not sys.platform.startswith("win"):
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
- cli_main()
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
- if aliases:
46
- for alias in aliases:
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()
@@ -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 sys.platform.startswith("win"):
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
@@ -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
- log_info("Using maturin develop to build and install editable package...")
25
- log_info("使用 maturin develop 构建和安装可编辑包...", lang="zh")
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 sys.platform.startswith("win"):
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 log_info
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
- log_info("Cleaning build artifacts and temporary files...", lang="en")
28
- log_info("正在清理构建产物和临时文件...", lang="zh")
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
- log_info("Build artifacts and temporary files cleaning completed.", lang="en")
88
- log_info("构建产物和临时文件清理完成。", lang="zh")
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
- log_info("Cleaning virtual environment...", lang="en")
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
- log_info("Virtual environment cleaning completed.", lang="en")
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
- log_info("Cleaning cache directories...", lang="en")
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
- log_info("Cache directories cleaning completed.", lang="en")
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
- log_info("Cleaning log files and directories...", lang="en")
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
- log_info("Log files and directories cleaning completed.", lang="en")
148
- log_info("日志文件和目录清理完成。", lang="zh")
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 log_info
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
- log_info(start_msg_en)
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
- log_info("Dry run mode: No files will be deleted.")
120
- log_info("Dry run模式:不会删除任何文件。", lang="zh")
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
- log_info(success_msg_en)
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
- ) -> None:
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
- log_info(f"Error cleaning project: {e}", lang="en")
207
- log_info(f"错误:清理项目失败: {e}", lang="zh")
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)