fixos 2.2.36__tar.gz → 2.2.37__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 (163) hide show
  1. {fixos-2.2.36 → fixos-2.2.37}/CHANGELOG.md +9 -0
  2. {fixos-2.2.36 → fixos-2.2.37}/PKG-INFO +9 -6
  3. {fixos-2.2.36 → fixos-2.2.37}/README.md +8 -5
  4. {fixos-2.2.36 → fixos-2.2.37}/fixos/__init__.py +1 -1
  5. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli/cleanup_cmd.py +34 -12
  6. {fixos-2.2.36 → fixos-2.2.37}/fixos.egg-info/PKG-INFO +9 -6
  7. {fixos-2.2.36 → fixos-2.2.37}/pyproject.toml +1 -1
  8. {fixos-2.2.36 → fixos-2.2.37}/setup.py +1 -1
  9. {fixos-2.2.36 → fixos-2.2.37}/.env.example +0 -0
  10. {fixos-2.2.36 → fixos-2.2.37}/LICENSE +0 -0
  11. {fixos-2.2.36 → fixos-2.2.37}/MANIFEST.in +0 -0
  12. {fixos-2.2.36 → fixos-2.2.37}/docker/README.md +0 -0
  13. {fixos-2.2.36 → fixos-2.2.37}/docker/TEST_RESULTS.md +0 -0
  14. {fixos-2.2.36 → fixos-2.2.37}/docker/TEST_RESULTS_V2.md +0 -0
  15. {fixos-2.2.36 → fixos-2.2.37}/docker/alpine/Dockerfile +0 -0
  16. {fixos-2.2.36 → fixos-2.2.37}/docker/arch/Dockerfile +0 -0
  17. {fixos-2.2.36 → fixos-2.2.37}/docker/base/Dockerfile +0 -0
  18. {fixos-2.2.36 → fixos-2.2.37}/docker/broken-audio/Dockerfile +0 -0
  19. {fixos-2.2.36 → fixos-2.2.37}/docker/broken-full/Dockerfile +0 -0
  20. {fixos-2.2.36 → fixos-2.2.37}/docker/broken-network/Dockerfile +0 -0
  21. {fixos-2.2.36 → fixos-2.2.37}/docker/broken-thumbnails/Dockerfile +0 -0
  22. {fixos-2.2.36 → fixos-2.2.37}/docker/debian/Dockerfile +0 -0
  23. {fixos-2.2.36 → fixos-2.2.37}/docker/docker-compose.multi-system.yml +0 -0
  24. {fixos-2.2.36 → fixos-2.2.37}/docker/docker-compose.yml +0 -0
  25. {fixos-2.2.36 → fixos-2.2.37}/docker/fedora/Dockerfile +0 -0
  26. {fixos-2.2.36 → fixos-2.2.37}/docker/test-multi-system.sh +0 -0
  27. {fixos-2.2.36 → fixos-2.2.37}/docker/test-scenarios.sh +0 -0
  28. {fixos-2.2.36 → fixos-2.2.37}/docker/ubuntu/Dockerfile +0 -0
  29. {fixos-2.2.36 → fixos-2.2.37}/docker/validate-scenario.py +0 -0
  30. {fixos-2.2.36 → fixos-2.2.37}/docs/examples/advanced_usage.py +0 -0
  31. {fixos-2.2.36 → fixos-2.2.37}/docs/examples/quickstart.py +0 -0
  32. {fixos-2.2.36 → fixos-2.2.37}/fixos/agent/__init__.py +0 -0
  33. {fixos-2.2.36 → fixos-2.2.37}/fixos/agent/autonomous.py +0 -0
  34. {fixos-2.2.36 → fixos-2.2.37}/fixos/agent/autonomous_session.py +0 -0
  35. {fixos-2.2.36 → fixos-2.2.37}/fixos/agent/hitl.py +0 -0
  36. {fixos-2.2.36 → fixos-2.2.37}/fixos/agent/hitl_session.py +0 -0
  37. {fixos-2.2.36 → fixos-2.2.37}/fixos/agent/session_core.py +0 -0
  38. {fixos-2.2.36 → fixos-2.2.37}/fixos/agent/session_handlers.py +0 -0
  39. {fixos-2.2.36 → fixos-2.2.37}/fixos/agent/session_io.py +0 -0
  40. {fixos-2.2.36 → fixos-2.2.37}/fixos/anonymizer.py +0 -0
  41. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli/__init__.py +0 -0
  42. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli/_cleanup_flatpak.py +0 -0
  43. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli/_cleanup_home.py +0 -0
  44. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli/_cleanup_snap.py +0 -0
  45. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli/_cleanup_system.py +0 -0
  46. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli/_cleanup_utils.py +0 -0
  47. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli/ask_cmd.py +0 -0
  48. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli/config_cmd.py +0 -0
  49. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli/features_cmd.py +0 -0
  50. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli/fix_cmd.py +0 -0
  51. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli/history_cmd.py +0 -0
  52. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli/main.py +0 -0
  53. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli/orchestrate_cmd.py +0 -0
  54. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli/output_formatter.py +0 -0
  55. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli/profile_cmd.py +0 -0
  56. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli/provider_cmd.py +0 -0
  57. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli/quickfix_cmd.py +0 -0
  58. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli/report_cmd.py +0 -0
  59. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli/rollback_cmd.py +0 -0
  60. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli/scan_cmd.py +0 -0
  61. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli/shared.py +0 -0
  62. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli/token_cmd.py +0 -0
  63. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli/watch_cmd.py +0 -0
  64. {fixos-2.2.36 → fixos-2.2.37}/fixos/cli.py +0 -0
  65. {fixos-2.2.36 → fixos-2.2.37}/fixos/config.py +0 -0
  66. {fixos-2.2.36 → fixos-2.2.37}/fixos/config_interactive.py +0 -0
  67. {fixos-2.2.36 → fixos-2.2.37}/fixos/constants.py +0 -0
  68. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/__init__.py +0 -0
  69. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/_flatpak_analysis_mixin.py +0 -0
  70. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/_flatpak_execution_mixin.py +0 -0
  71. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/_flatpak_recommendations_mixin.py +0 -0
  72. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/_storage_container_mixin.py +0 -0
  73. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/_storage_system_mixin.py +0 -0
  74. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/_storage_user_mixin.py +0 -0
  75. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/cache_discovery.py +0 -0
  76. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/checks/__init__.py +0 -0
  77. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/checks/_shared.py +0 -0
  78. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/checks/audio.py +0 -0
  79. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/checks/file_analysis.py +0 -0
  80. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/checks/hardware.py +0 -0
  81. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/checks/packages.py +0 -0
  82. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/checks/resources.py +0 -0
  83. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/checks/security.py +0 -0
  84. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/checks/storage_optimization.py +0 -0
  85. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/checks/system_core.py +0 -0
  86. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/checks/thumbnails.py +0 -0
  87. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/dev_project_analyzer.py +0 -0
  88. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/disk_analyzer.py +0 -0
  89. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/flatpak_analyzer.py +0 -0
  90. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/service_cleanup.py +0 -0
  91. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/service_details.py +0 -0
  92. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/service_scanner.py +0 -0
  93. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/storage_analyzer.py +0 -0
  94. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/system_checks.py +0 -0
  95. {fixos-2.2.36 → fixos-2.2.37}/fixos/diagnostics/utils.py +0 -0
  96. {fixos-2.2.36 → fixos-2.2.37}/fixos/features/__init__.py +0 -0
  97. {fixos-2.2.36 → fixos-2.2.37}/fixos/features/auditor.py +0 -0
  98. {fixos-2.2.36 → fixos-2.2.37}/fixos/features/catalog.py +0 -0
  99. {fixos-2.2.36 → fixos-2.2.37}/fixos/features/installer.py +0 -0
  100. {fixos-2.2.36 → fixos-2.2.37}/fixos/features/profiles.py +0 -0
  101. {fixos-2.2.36 → fixos-2.2.37}/fixos/features/renderer.py +0 -0
  102. {fixos-2.2.36 → fixos-2.2.37}/fixos/fixes/__init__.py +0 -0
  103. {fixos-2.2.36 → fixos-2.2.37}/fixos/interactive/__init__.py +0 -0
  104. {fixos-2.2.36 → fixos-2.2.37}/fixos/interactive/cleanup_planner.py +0 -0
  105. {fixos-2.2.36 → fixos-2.2.37}/fixos/llm_shell.py +0 -0
  106. {fixos-2.2.36 → fixos-2.2.37}/fixos/orchestrator/__init__.py +0 -0
  107. {fixos-2.2.36 → fixos-2.2.37}/fixos/orchestrator/executor.py +0 -0
  108. {fixos-2.2.36 → fixos-2.2.37}/fixos/orchestrator/graph.py +0 -0
  109. {fixos-2.2.36 → fixos-2.2.37}/fixos/orchestrator/orchestrator.py +0 -0
  110. {fixos-2.2.36 → fixos-2.2.37}/fixos/orchestrator/rollback.py +0 -0
  111. {fixos-2.2.36 → fixos-2.2.37}/fixos/platform_utils.py +0 -0
  112. {fixos-2.2.36 → fixos-2.2.37}/fixos/plugins/__init__.py +0 -0
  113. {fixos-2.2.36 → fixos-2.2.37}/fixos/plugins/base.py +0 -0
  114. {fixos-2.2.36 → fixos-2.2.37}/fixos/plugins/builtin/__init__.py +0 -0
  115. {fixos-2.2.36 → fixos-2.2.37}/fixos/plugins/builtin/audio.py +0 -0
  116. {fixos-2.2.36 → fixos-2.2.37}/fixos/plugins/builtin/disk.py +0 -0
  117. {fixos-2.2.36 → fixos-2.2.37}/fixos/plugins/builtin/hardware.py +0 -0
  118. {fixos-2.2.36 → fixos-2.2.37}/fixos/plugins/builtin/resources.py +0 -0
  119. {fixos-2.2.36 → fixos-2.2.37}/fixos/plugins/builtin/security.py +0 -0
  120. {fixos-2.2.36 → fixos-2.2.37}/fixos/plugins/builtin/thumbnails.py +0 -0
  121. {fixos-2.2.36 → fixos-2.2.37}/fixos/plugins/registry.py +0 -0
  122. {fixos-2.2.36 → fixos-2.2.37}/fixos/profiles/__init__.py +0 -0
  123. {fixos-2.2.36 → fixos-2.2.37}/fixos/providers/__init__.py +0 -0
  124. {fixos-2.2.36 → fixos-2.2.37}/fixos/providers/llm.py +0 -0
  125. {fixos-2.2.36 → fixos-2.2.37}/fixos/providers/llm_analyzer.py +0 -0
  126. {fixos-2.2.36 → fixos-2.2.37}/fixos/providers/schemas.py +0 -0
  127. {fixos-2.2.36 → fixos-2.2.37}/fixos/system_checks.py +0 -0
  128. {fixos-2.2.36 → fixos-2.2.37}/fixos/utils/__init__.py +0 -0
  129. {fixos-2.2.36 → fixos-2.2.37}/fixos/utils/anonymizer.py +0 -0
  130. {fixos-2.2.36 → fixos-2.2.37}/fixos/utils/terminal.py +0 -0
  131. {fixos-2.2.36 → fixos-2.2.37}/fixos/utils/timeout.py +0 -0
  132. {fixos-2.2.36 → fixos-2.2.37}/fixos/utils/web_search.py +0 -0
  133. {fixos-2.2.36 → fixos-2.2.37}/fixos/watch.py +0 -0
  134. {fixos-2.2.36 → fixos-2.2.37}/fixos.egg-info/SOURCES.txt +0 -0
  135. {fixos-2.2.36 → fixos-2.2.37}/fixos.egg-info/dependency_links.txt +0 -0
  136. {fixos-2.2.36 → fixos-2.2.37}/fixos.egg-info/entry_points.txt +0 -0
  137. {fixos-2.2.36 → fixos-2.2.37}/fixos.egg-info/requires.txt +0 -0
  138. {fixos-2.2.36 → fixos-2.2.37}/fixos.egg-info/top_level.txt +0 -0
  139. {fixos-2.2.36 → fixos-2.2.37}/pytest.ini +0 -0
  140. {fixos-2.2.36 → fixos-2.2.37}/requirements-dev.txt +0 -0
  141. {fixos-2.2.36 → fixos-2.2.37}/requirements.txt +0 -0
  142. {fixos-2.2.36 → fixos-2.2.37}/scripts/pyqual-calibrate.py +0 -0
  143. {fixos-2.2.36 → fixos-2.2.37}/setup.cfg +0 -0
  144. {fixos-2.2.36 → fixos-2.2.37}/tests/__init__.py +0 -0
  145. {fixos-2.2.36 → fixos-2.2.37}/tests/conftest.py +0 -0
  146. {fixos-2.2.36 → fixos-2.2.37}/tests/e2e/__init__.py +0 -0
  147. {fixos-2.2.36 → fixos-2.2.37}/tests/e2e/test_anonymization_layers.py +0 -0
  148. {fixos-2.2.36 → fixos-2.2.37}/tests/e2e/test_audio_broken.py +0 -0
  149. {fixos-2.2.36 → fixos-2.2.37}/tests/e2e/test_cli.py +0 -0
  150. {fixos-2.2.36 → fixos-2.2.37}/tests/e2e/test_diagnostics_integration.py +0 -0
  151. {fixos-2.2.36 → fixos-2.2.37}/tests/e2e/test_executor.py +0 -0
  152. {fixos-2.2.36 → fixos-2.2.37}/tests/e2e/test_multi_system.py +0 -0
  153. {fixos-2.2.36 → fixos-2.2.37}/tests/e2e/test_network_broken.py +0 -0
  154. {fixos-2.2.36 → fixos-2.2.37}/tests/e2e/test_thumbnails_broken.py +0 -0
  155. {fixos-2.2.36 → fixos-2.2.37}/tests/test_fixos.py +0 -0
  156. {fixos-2.2.36 → fixos-2.2.37}/tests/unit/__init__.py +0 -0
  157. {fixos-2.2.36 → fixos-2.2.37}/tests/unit/test_anonymizer.py +0 -0
  158. {fixos-2.2.36 → fixos-2.2.37}/tests/unit/test_cache_discovery.py +0 -0
  159. {fixos-2.2.36 → fixos-2.2.37}/tests/unit/test_core.py +0 -0
  160. {fixos-2.2.36 → fixos-2.2.37}/tests/unit/test_executor.py +0 -0
  161. {fixos-2.2.36 → fixos-2.2.37}/tests/unit/test_orchestrator.py +0 -0
  162. {fixos-2.2.36 → fixos-2.2.37}/tests/unit/test_service_cleanup.py +0 -0
  163. {fixos-2.2.36 → fixos-2.2.37}/tests/unit/test_service_scanner.py +0 -0
@@ -150,6 +150,15 @@ fix(goal): code analysis engine
150
150
  - **refactor(cli):** Usunięto zduplikowany kod ujednolicając funkcje analizy dysku do wspólnego helpera `_run_disk_analysis`.
151
151
  - **refactor(ui):** Usunięto ikony Unicode z CLI i sformatowano wyjście `stderr` oraz standardowego logowania na czysty kod Markdown dla poprawy czytelności w oknach terminalowych.
152
152
 
153
+ ## [2.2.37] - 2026-07-15
154
+
155
+ ### Docs
156
+ - Update README.md
157
+
158
+ ### Other
159
+ - Update fixos/cli/cleanup_cmd.py
160
+ - Update img.png
161
+
153
162
  ## [2.2.36] - 2026-07-15
154
163
 
155
164
  ### Docs
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fixos
3
- Version: 2.2.36
3
+ Version: 2.2.37
4
4
  Summary: AI-powered Linux/Windows diagnostics and repair – audio, hardware, system issues
5
5
  Home-page: https://github.com/wronai/fixos
6
6
  Author: fixos contributors
@@ -63,13 +63,13 @@ AI-powered OS Diagnostics
63
63
 
64
64
  ## AI Cost Tracking
65
65
 
66
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-2.2.36-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
67
- ![AI Cost](https://img.shields.io/badge/AI%20Cost-$4.00-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-32.7h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
66
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-2.2.37-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
67
+ ![AI Cost](https://img.shields.io/badge/AI%20Cost-$4.56-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-36.2h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
68
68
 
69
- - 🤖 **LLM usage:** $3.9985 (137 commits)
70
- - 👤 **Human dev:** ~$3270 (32.7h @ $100/h, 30min dedup)
69
+ - 🤖 **LLM usage:** $4.5585 (143 commits)
70
+ - 👤 **Human dev:** ~$3616 (36.2h @ $100/h, 30min dedup)
71
71
 
72
- Generated on 2026-07-06 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
72
+ Generated on 2026-07-15 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
73
73
 
74
74
  ---
75
75
 
@@ -524,3 +524,6 @@ Licensed under Apache-2.0.
524
524
  ## Author
525
525
 
526
526
  Tom Sapletta
527
+ ## life is life
528
+
529
+ ![img.png](img.png)
@@ -19,13 +19,13 @@ AI-powered OS Diagnostics
19
19
 
20
20
  ## AI Cost Tracking
21
21
 
22
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-2.2.36-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
23
- ![AI Cost](https://img.shields.io/badge/AI%20Cost-$4.00-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-32.7h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
22
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-2.2.37-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
23
+ ![AI Cost](https://img.shields.io/badge/AI%20Cost-$4.56-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-36.2h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
24
24
 
25
- - 🤖 **LLM usage:** $3.9985 (137 commits)
26
- - 👤 **Human dev:** ~$3270 (32.7h @ $100/h, 30min dedup)
25
+ - 🤖 **LLM usage:** $4.5585 (143 commits)
26
+ - 👤 **Human dev:** ~$3616 (36.2h @ $100/h, 30min dedup)
27
27
 
28
- Generated on 2026-07-06 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
28
+ Generated on 2026-07-15 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
29
29
 
30
30
  ---
31
31
 
@@ -480,3 +480,6 @@ Licensed under Apache-2.0.
480
480
  ## Author
481
481
 
482
482
  Tom Sapletta
483
+ ## life is life
484
+
485
+ ![img.png](img.png)
@@ -1,3 +1,3 @@
1
1
  """fixos – AI-powered Linux/Windows diagnostics and repair."""
2
2
 
3
- __version__ = "2.2.36"
3
+ __version__ = "2.2.37"
@@ -307,21 +307,43 @@ def _cleanup_single_service(
307
307
  # ── Interactive cleanup orchestration ─────────────────────────────────────
308
308
 
309
309
 
310
+ def _size_str(svc: dict) -> str:
311
+ return f"{svc['size_gb']:.2f} GB" if svc["size_gb"] >= 1 else f"{svc['size_mb']:.0f} MB"
312
+
313
+
314
+ def _select_safe_services(safe_services: list) -> list:
315
+ """Ask what to clean from the safe tier: all of it, hand-picked items, or none."""
316
+ click.echo(click.style("Bezpieczne do wyczyszczenia:", fg="green"))
317
+ for svc in safe_services:
318
+ click.echo(f" • {svc['name']}: {_size_str(svc)}")
319
+ safe_total = sum(s["size_gb"] for s in safe_services)
320
+
321
+ click.echo()
322
+ click.echo("Co wyczyścić?")
323
+ click.echo(f" [1] Wszystkie bezpieczne (zwolni {safe_total:.2f} GB)")
324
+ click.echo(" [2] Wybierz pojedyncze usługi")
325
+ click.echo(" [0] Nic — pomiń")
326
+ choice = click.prompt(
327
+ "Wybór", type=click.Choice(["0", "1", "2"]), default="1", show_choices=False
328
+ )
329
+
330
+ if choice == "0":
331
+ return []
332
+ if choice == "1":
333
+ return safe_services
334
+
335
+ click.echo(click.style("Wybierz usługi do wyczyszczenia:", fg="cyan"))
336
+ return [svc for svc in safe_services if click.confirm(f" {svc['name']} ({_size_str(svc)})")]
337
+
338
+
310
339
  def _run_interactive_cleanup(plan: dict, list_only: bool, scanner) -> None:
311
340
  """Offer interactive safe cleanup and display unsafe services."""
312
341
  if not list_only and plan["safe_to_cleanup"]:
313
- safe_total = sum(s["size_gb"] for s in plan["safe_to_cleanup"])
314
- click.echo(click.style("Bezpieczne do wyczyszczenia:", fg="green"))
315
- for svc in plan["safe_to_cleanup"]:
316
- size_str = (
317
- f"{svc['size_gb']:.2f} GB"
318
- if svc["size_gb"] >= 1
319
- else f"{svc['size_mb']:.0f} MB"
320
- )
321
- click.echo(f" • {svc['name']}: {size_str}")
322
- click.echo()
323
- if click.confirm(f"Wyczyścić bezpieczne usługi? (zwolni {safe_total:.2f} GB)"):
324
- _execute_safe_cleanup(plan["safe_to_cleanup"], scanner)
342
+ selected = _select_safe_services(plan["safe_to_cleanup"])
343
+ if selected:
344
+ _execute_safe_cleanup(selected, scanner)
345
+ else:
346
+ click.echo(click.style("Pominięto czyszczenie.", fg="yellow"))
325
347
  if plan["requires_review"] and not list_only:
326
348
  _display_unsafe_services(plan["requires_review"])
327
349
  if plan.get("dangerous") and not list_only:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fixos
3
- Version: 2.2.36
3
+ Version: 2.2.37
4
4
  Summary: AI-powered Linux/Windows diagnostics and repair – audio, hardware, system issues
5
5
  Home-page: https://github.com/wronai/fixos
6
6
  Author: fixos contributors
@@ -63,13 +63,13 @@ AI-powered OS Diagnostics
63
63
 
64
64
  ## AI Cost Tracking
65
65
 
66
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-2.2.36-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
67
- ![AI Cost](https://img.shields.io/badge/AI%20Cost-$4.00-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-32.7h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
66
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-2.2.37-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
67
+ ![AI Cost](https://img.shields.io/badge/AI%20Cost-$4.56-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-36.2h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
68
68
 
69
- - 🤖 **LLM usage:** $3.9985 (137 commits)
70
- - 👤 **Human dev:** ~$3270 (32.7h @ $100/h, 30min dedup)
69
+ - 🤖 **LLM usage:** $4.5585 (143 commits)
70
+ - 👤 **Human dev:** ~$3616 (36.2h @ $100/h, 30min dedup)
71
71
 
72
- Generated on 2026-07-06 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
72
+ Generated on 2026-07-15 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
73
73
 
74
74
  ---
75
75
 
@@ -524,3 +524,6 @@ Licensed under Apache-2.0.
524
524
  ## Author
525
525
 
526
526
  Tom Sapletta
527
+ ## life is life
528
+
529
+ ![img.png](img.png)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "fixos"
7
- version = "2.2.36"
7
+ version = "2.2.37"
8
8
  description = "AI-powered Linux/Windows diagnostics and repair – audio, hardware, system issues"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -5,7 +5,7 @@ long_description = (Path(__file__).parent / "README.md").read_text(encoding="utf
5
5
 
6
6
  setup(
7
7
  name="fixos",
8
- version="2.2.36",
8
+ version="2.2.37",
9
9
  description="AI-powered Linux/Windows diagnostics and repair with anonymization",
10
10
  long_description=long_description,
11
11
  long_description_content_type="text/markdown",
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes