fixos 2.2.40__tar.gz → 2.2.41__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 (179) hide show
  1. {fixos-2.2.40 → fixos-2.2.41}/CHANGELOG.md +35 -0
  2. {fixos-2.2.40 → fixos-2.2.41}/PKG-INFO +24 -11
  3. {fixos-2.2.40 → fixos-2.2.41}/README.md +23 -10
  4. {fixos-2.2.40 → fixos-2.2.41}/fixos/__init__.py +1 -1
  5. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/cleanup_cmd.py +95 -19
  6. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/service_cleanup.py +53 -16
  7. {fixos-2.2.40 → fixos-2.2.41}/fixos.egg-info/PKG-INFO +24 -11
  8. {fixos-2.2.40 → fixos-2.2.41}/pyproject.toml +1 -1
  9. {fixos-2.2.40 → fixos-2.2.41}/setup.py +1 -1
  10. fixos-2.2.41/tests/unit/test_cleanup_cmd.py +194 -0
  11. {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_service_cleanup.py +73 -0
  12. {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_service_scanner.py +5 -0
  13. fixos-2.2.40/tests/unit/test_cleanup_cmd.py +0 -87
  14. {fixos-2.2.40 → fixos-2.2.41}/.env.example +0 -0
  15. {fixos-2.2.40 → fixos-2.2.41}/LICENSE +0 -0
  16. {fixos-2.2.40 → fixos-2.2.41}/MANIFEST.in +0 -0
  17. {fixos-2.2.40 → fixos-2.2.41}/docker/README.md +0 -0
  18. {fixos-2.2.40 → fixos-2.2.41}/docker/TEST_RESULTS.md +0 -0
  19. {fixos-2.2.40 → fixos-2.2.41}/docker/TEST_RESULTS_V2.md +0 -0
  20. {fixos-2.2.40 → fixos-2.2.41}/docker/alpine/Dockerfile +0 -0
  21. {fixos-2.2.40 → fixos-2.2.41}/docker/arch/Dockerfile +0 -0
  22. {fixos-2.2.40 → fixos-2.2.41}/docker/base/Dockerfile +0 -0
  23. {fixos-2.2.40 → fixos-2.2.41}/docker/broken-audio/Dockerfile +0 -0
  24. {fixos-2.2.40 → fixos-2.2.41}/docker/broken-full/Dockerfile +0 -0
  25. {fixos-2.2.40 → fixos-2.2.41}/docker/broken-network/Dockerfile +0 -0
  26. {fixos-2.2.40 → fixos-2.2.41}/docker/broken-thumbnails/Dockerfile +0 -0
  27. {fixos-2.2.40 → fixos-2.2.41}/docker/debian/Dockerfile +0 -0
  28. {fixos-2.2.40 → fixos-2.2.41}/docker/docker-compose.multi-system.yml +0 -0
  29. {fixos-2.2.40 → fixos-2.2.41}/docker/docker-compose.yml +0 -0
  30. {fixos-2.2.40 → fixos-2.2.41}/docker/fedora/Dockerfile +0 -0
  31. {fixos-2.2.40 → fixos-2.2.41}/docker/test-multi-system.sh +0 -0
  32. {fixos-2.2.40 → fixos-2.2.41}/docker/test-scenarios.sh +0 -0
  33. {fixos-2.2.40 → fixos-2.2.41}/docker/ubuntu/Dockerfile +0 -0
  34. {fixos-2.2.40 → fixos-2.2.41}/docker/validate-scenario.py +0 -0
  35. {fixos-2.2.40 → fixos-2.2.41}/docs/examples/advanced_usage.py +0 -0
  36. {fixos-2.2.40 → fixos-2.2.41}/docs/examples/quickstart.py +0 -0
  37. {fixos-2.2.40 → fixos-2.2.41}/fixos/__main__.py +0 -0
  38. {fixos-2.2.40 → fixos-2.2.41}/fixos/agent/__init__.py +0 -0
  39. {fixos-2.2.40 → fixos-2.2.41}/fixos/agent/autonomous.py +0 -0
  40. {fixos-2.2.40 → fixos-2.2.41}/fixos/agent/autonomous_session.py +0 -0
  41. {fixos-2.2.40 → fixos-2.2.41}/fixos/agent/hitl.py +0 -0
  42. {fixos-2.2.40 → fixos-2.2.41}/fixos/agent/hitl_session.py +0 -0
  43. {fixos-2.2.40 → fixos-2.2.41}/fixos/agent/session_core.py +0 -0
  44. {fixos-2.2.40 → fixos-2.2.41}/fixos/agent/session_handlers.py +0 -0
  45. {fixos-2.2.40 → fixos-2.2.41}/fixos/agent/session_io.py +0 -0
  46. {fixos-2.2.40 → fixos-2.2.41}/fixos/anonymizer.py +0 -0
  47. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/__init__.py +0 -0
  48. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/_cleanup_flatpak.py +0 -0
  49. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/_cleanup_home.py +0 -0
  50. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/_cleanup_snap.py +0 -0
  51. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/_cleanup_system.py +0 -0
  52. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/_cleanup_utils.py +0 -0
  53. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/ask_cmd.py +0 -0
  54. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/config_cmd.py +0 -0
  55. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/features_cmd.py +0 -0
  56. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/fix_cmd.py +0 -0
  57. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/history_cmd.py +0 -0
  58. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/main.py +0 -0
  59. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/orchestrate_cmd.py +0 -0
  60. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/output_formatter.py +0 -0
  61. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/profile_cmd.py +0 -0
  62. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/projects_cmd.py +0 -0
  63. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/provider_cmd.py +0 -0
  64. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/quick_cmd.py +0 -0
  65. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/quickfix_cmd.py +0 -0
  66. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/report_cmd.py +0 -0
  67. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/rollback_cmd.py +0 -0
  68. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/scan_cmd.py +0 -0
  69. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/shared.py +0 -0
  70. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/token_cmd.py +0 -0
  71. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/watch_cmd.py +0 -0
  72. {fixos-2.2.40 → fixos-2.2.41}/fixos/cli.py +0 -0
  73. {fixos-2.2.40 → fixos-2.2.41}/fixos/config.py +0 -0
  74. {fixos-2.2.40 → fixos-2.2.41}/fixos/config_interactive.py +0 -0
  75. {fixos-2.2.40 → fixos-2.2.41}/fixos/constants.py +0 -0
  76. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/__init__.py +0 -0
  77. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/_flatpak_analysis_mixin.py +0 -0
  78. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/_flatpak_execution_mixin.py +0 -0
  79. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/_flatpak_recommendations_mixin.py +0 -0
  80. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/_storage_container_mixin.py +0 -0
  81. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/_storage_system_mixin.py +0 -0
  82. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/_storage_user_mixin.py +0 -0
  83. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/cache_discovery.py +0 -0
  84. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/checks/__init__.py +0 -0
  85. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/checks/_shared.py +0 -0
  86. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/checks/audio.py +0 -0
  87. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/checks/file_analysis.py +0 -0
  88. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/checks/hardware.py +0 -0
  89. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/checks/packages.py +0 -0
  90. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/checks/resources.py +0 -0
  91. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/checks/security.py +0 -0
  92. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/checks/storage_optimization.py +0 -0
  93. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/checks/system_core.py +0 -0
  94. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/checks/thumbnails.py +0 -0
  95. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/dev_project_analyzer.py +0 -0
  96. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/disk_analyzer.py +0 -0
  97. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/flatpak_analyzer.py +0 -0
  98. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/project_scanner.py +0 -0
  99. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/quick_snapshot.py +0 -0
  100. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/service_details.py +0 -0
  101. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/service_scanner.py +0 -0
  102. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/storage_analyzer.py +0 -0
  103. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/system_checks.py +0 -0
  104. {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/utils.py +0 -0
  105. {fixos-2.2.40 → fixos-2.2.41}/fixos/features/__init__.py +0 -0
  106. {fixos-2.2.40 → fixos-2.2.41}/fixos/features/auditor.py +0 -0
  107. {fixos-2.2.40 → fixos-2.2.41}/fixos/features/catalog.py +0 -0
  108. {fixos-2.2.40 → fixos-2.2.41}/fixos/features/installer.py +0 -0
  109. {fixos-2.2.40 → fixos-2.2.41}/fixos/features/profiles.py +0 -0
  110. {fixos-2.2.40 → fixos-2.2.41}/fixos/features/renderer.py +0 -0
  111. {fixos-2.2.40 → fixos-2.2.41}/fixos/fixes/__init__.py +0 -0
  112. {fixos-2.2.40 → fixos-2.2.41}/fixos/interactive/__init__.py +0 -0
  113. {fixos-2.2.40 → fixos-2.2.41}/fixos/interactive/cleanup_planner.py +0 -0
  114. {fixos-2.2.40 → fixos-2.2.41}/fixos/llm_shell.py +0 -0
  115. {fixos-2.2.40 → fixos-2.2.41}/fixos/orchestrator/__init__.py +0 -0
  116. {fixos-2.2.40 → fixos-2.2.41}/fixos/orchestrator/executor.py +0 -0
  117. {fixos-2.2.40 → fixos-2.2.41}/fixos/orchestrator/graph.py +0 -0
  118. {fixos-2.2.40 → fixos-2.2.41}/fixos/orchestrator/orchestrator.py +0 -0
  119. {fixos-2.2.40 → fixos-2.2.41}/fixos/orchestrator/rollback.py +0 -0
  120. {fixos-2.2.40 → fixos-2.2.41}/fixos/platform_utils.py +0 -0
  121. {fixos-2.2.40 → fixos-2.2.41}/fixos/plugins/__init__.py +0 -0
  122. {fixos-2.2.40 → fixos-2.2.41}/fixos/plugins/base.py +0 -0
  123. {fixos-2.2.40 → fixos-2.2.41}/fixos/plugins/builtin/__init__.py +0 -0
  124. {fixos-2.2.40 → fixos-2.2.41}/fixos/plugins/builtin/audio.py +0 -0
  125. {fixos-2.2.40 → fixos-2.2.41}/fixos/plugins/builtin/disk.py +0 -0
  126. {fixos-2.2.40 → fixos-2.2.41}/fixos/plugins/builtin/hardware.py +0 -0
  127. {fixos-2.2.40 → fixos-2.2.41}/fixos/plugins/builtin/resources.py +0 -0
  128. {fixos-2.2.40 → fixos-2.2.41}/fixos/plugins/builtin/security.py +0 -0
  129. {fixos-2.2.40 → fixos-2.2.41}/fixos/plugins/builtin/thumbnails.py +0 -0
  130. {fixos-2.2.40 → fixos-2.2.41}/fixos/plugins/registry.py +0 -0
  131. {fixos-2.2.40 → fixos-2.2.41}/fixos/profiles/__init__.py +0 -0
  132. {fixos-2.2.40 → fixos-2.2.41}/fixos/providers/__init__.py +0 -0
  133. {fixos-2.2.40 → fixos-2.2.41}/fixos/providers/llm.py +0 -0
  134. {fixos-2.2.40 → fixos-2.2.41}/fixos/providers/llm_analyzer.py +0 -0
  135. {fixos-2.2.40 → fixos-2.2.41}/fixos/providers/schemas.py +0 -0
  136. {fixos-2.2.40 → fixos-2.2.41}/fixos/system_checks.py +0 -0
  137. {fixos-2.2.40 → fixos-2.2.41}/fixos/utils/__init__.py +0 -0
  138. {fixos-2.2.40 → fixos-2.2.41}/fixos/utils/anonymizer.py +0 -0
  139. {fixos-2.2.40 → fixos-2.2.41}/fixos/utils/terminal.py +0 -0
  140. {fixos-2.2.40 → fixos-2.2.41}/fixos/utils/timeout.py +0 -0
  141. {fixos-2.2.40 → fixos-2.2.41}/fixos/utils/web_search.py +0 -0
  142. {fixos-2.2.40 → fixos-2.2.41}/fixos/watch.py +0 -0
  143. {fixos-2.2.40 → fixos-2.2.41}/fixos.egg-info/SOURCES.txt +0 -0
  144. {fixos-2.2.40 → fixos-2.2.41}/fixos.egg-info/dependency_links.txt +0 -0
  145. {fixos-2.2.40 → fixos-2.2.41}/fixos.egg-info/entry_points.txt +0 -0
  146. {fixos-2.2.40 → fixos-2.2.41}/fixos.egg-info/requires.txt +0 -0
  147. {fixos-2.2.40 → fixos-2.2.41}/fixos.egg-info/top_level.txt +0 -0
  148. {fixos-2.2.40 → fixos-2.2.41}/pytest.ini +0 -0
  149. {fixos-2.2.40 → fixos-2.2.41}/requirements-dev.txt +0 -0
  150. {fixos-2.2.40 → fixos-2.2.41}/requirements.txt +0 -0
  151. {fixos-2.2.40 → fixos-2.2.41}/scripts/pyqual-calibrate.py +0 -0
  152. {fixos-2.2.40 → fixos-2.2.41}/setup.cfg +0 -0
  153. {fixos-2.2.40 → fixos-2.2.41}/tests/__init__.py +0 -0
  154. {fixos-2.2.40 → fixos-2.2.41}/tests/conftest.py +0 -0
  155. {fixos-2.2.40 → fixos-2.2.41}/tests/e2e/__init__.py +0 -0
  156. {fixos-2.2.40 → fixos-2.2.41}/tests/e2e/test_anonymization_layers.py +0 -0
  157. {fixos-2.2.40 → fixos-2.2.41}/tests/e2e/test_audio_broken.py +0 -0
  158. {fixos-2.2.40 → fixos-2.2.41}/tests/e2e/test_cli.py +0 -0
  159. {fixos-2.2.40 → fixos-2.2.41}/tests/e2e/test_diagnostics_integration.py +0 -0
  160. {fixos-2.2.40 → fixos-2.2.41}/tests/e2e/test_executor.py +0 -0
  161. {fixos-2.2.40 → fixos-2.2.41}/tests/e2e/test_multi_system.py +0 -0
  162. {fixos-2.2.40 → fixos-2.2.41}/tests/e2e/test_network_broken.py +0 -0
  163. {fixos-2.2.40 → fixos-2.2.41}/tests/e2e/test_thumbnails_broken.py +0 -0
  164. {fixos-2.2.40 → fixos-2.2.41}/tests/test_fixos.py +0 -0
  165. {fixos-2.2.40 → fixos-2.2.41}/tests/unit/__init__.py +0 -0
  166. {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_anonymizer.py +0 -0
  167. {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_cache_discovery.py +0 -0
  168. {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_core.py +0 -0
  169. {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_dev_project_analyzer.py +0 -0
  170. {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_executor.py +0 -0
  171. {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_llm_provider.py +0 -0
  172. {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_orchestrator.py +0 -0
  173. {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_project_scanner.py +0 -0
  174. {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_projects_cmd.py +0 -0
  175. {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_quick_cmd.py +0 -0
  176. {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_quick_snapshot.py +0 -0
  177. {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_resources_quick.py +0 -0
  178. {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_security_quick.py +0 -0
  179. {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_system_checks_parallel.py +0 -0
@@ -8,9 +8,29 @@
8
8
  dnia oraz alarmami o szybkim wzroście dysku, RAM, swapu lub obciążenia CPU.
9
9
  - Rozpoznawanie systemu, profilu użytkownika i stosu technologicznego oraz
10
10
  opcjonalne przejście do wolniejszej analizy przez `fixos quick --deep`.
11
+ - Uporządkowana dokumentacja użytkownika: szybki start, model bezpieczeństwa
12
+ cleanup, aktualna architektura i rozdzielenie aktywnego TODO od archiwalnych
13
+ artykułów.
14
+
15
+ ### Changed
16
+
17
+ - Zakończone elementy historycznych roadmap zostały przeniesione z TODO do
18
+ changelogu: modułowy pakiet CLI, klasowe sesje HITL, wspólny
19
+ `SessionTimeout`, plugin registry, structured output LLM, rollback, profile
20
+ diagnostyczne i watch mode.
21
+ - `TODO.md` zawiera teraz wyłącznie ręcznie zweryfikowane, aktualne zadania;
22
+ usunięto nieaktualny raport statyczny z 311 wpisami opartymi na dawnych
23
+ numerach linii i fałszywych alarmach.
11
24
 
12
25
  ### Fixed
13
26
 
27
+ - Zablokowano zbiorcze kasowanie chronionych danych LM Studio, Hugging Face,
28
+ Podman/containerd, Jupyter, Minikube, AppImage, VirtualBox, VMware oraz
29
+ rozszerzeń VS Code/Cursor. Takie wpisy pokazują teraz wyłącznie bezpieczny
30
+ podgląd i wymagają ręcznego wskazania konkretnego elementu poza fixOS.
31
+ - Doprecyzowano estymatę Dockera: wartość `RECLAIMABLE` jest informacyjna,
32
+ natomiast ograniczony filtr cache buildów starszych niż 7 dni może zwolnić
33
+ znacznie mniej miejsca.
14
34
  - Tryb `fixos cleanup` → „Wybierz pojedyncze” przechodzi teraz kolejno przez
15
35
  wszystkie usługi: bezpieczne, wymagające przeglądu i chronione. Pozycje bez
16
36
  bezpiecznej operacji zbiorczej pokazują komendę podglądu, dane chronione
@@ -31,6 +51,21 @@
31
51
  rekurencyjnych skanów `/` oraz `/home` z szybkich kontroli.
32
52
  - Czyszczenie cache JetBrains trafia w aktualną ścieżkę i wymaga zamknięcia IDE.
33
53
 
54
+ ## [2.2.41] - 2026-07-23
55
+
56
+ ### Docs
57
+ - Update CHANGELOG.md
58
+ - Update README.md
59
+
60
+ ### Test
61
+ - Update tests/unit/test_cleanup_cmd.py
62
+ - Update tests/unit/test_service_cleanup.py
63
+ - Update tests/unit/test_service_scanner.py
64
+
65
+ ### Other
66
+ - Update fixos/cli/cleanup_cmd.py
67
+ - Update fixos/diagnostics/service_cleanup.py
68
+
34
69
  ## [2.2.40] - 2026-07-23
35
70
 
36
71
  ### Docs
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fixos
3
- Version: 2.2.40
3
+ Version: 2.2.41
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,11 +63,11 @@ 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.40-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.85-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-38.2h-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.41-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.87-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-39.1h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
68
68
 
69
- - 🤖 **LLM usage:** $4.8451 (147 commits)
70
- - 👤 **Human dev:** ~$3817 (38.2h @ $100/h, 30min dedup)
69
+ - 🤖 **LLM usage:** $4.8653 (149 commits)
70
+ - 👤 **Human dev:** ~$3913 (39.1h @ $100/h, 30min dedup)
71
71
 
72
72
  Generated on 2026-07-23 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
73
73
 
@@ -205,6 +205,8 @@ Pierwsze uruchomienie zapisuje mały punkt odniesienia w
205
205
  swapu i znanych cache w wybranym oknie oraz od początku bieżącego dnia. Kwota
206
206
  „bezpieczne cache” obejmuje wyłącznie jawnie odtwarzalne dane. Docker, modele
207
207
  AI, rozszerzenia i cache IDE są raportowane osobno jako wymagające decyzji.
208
+ Nie są do niej zaliczane m.in. narzędzia i interpretery z
209
+ `~/.local/share/uv`, `.tools` pnpm, modele AI ani rozszerzenia edytorów.
208
210
 
209
211
  ### Przykładowy widok w terminalu (Czyszczenie dysku)
210
212
 
@@ -258,15 +260,24 @@ Tryb DRY-RUN - żadne akcje nie zostaną wykonane
258
260
  Każda znaleziona usługa jest klasyfikowana do jednej z trzech grup:
259
261
 
260
262
  - **bezpieczne** – cache do odtworzenia jednym poleceniem (pip/npm/cargo/conda/nix/brew...).
261
- Jedyna grupa oferowana do automatycznego usunięcia, z menu wyboru: wszystkie / pojedynczo / pomiń.
263
+ Tylko tę grupę można usunąć automatycznie opcją „wszystkie”.
262
264
  - **do rozważenia** – reinstalowalne aplikacje, dane długo nieużywane, nierozpoznane
263
- foldery (JetBrains, Snap, Flatpak) – pokazywane z podpowiedziami, nigdy nie usuwane automatycznie.
265
+ foldery (JetBrains, Snap, Flatpak) – pokazywane z komendą i wymagają
266
+ osobnego, świadomego potwierdzenia.
264
267
  - **chronione lub mieszane** – realne dane aplikacji albo magazyny łączące dane aktywne
265
268
  z cache (Ollama, LM Studio, HuggingFace hub, Docker/Podman/containerd, cała biblioteka
266
269
  Steam, `.cursor/extensions`/`.vscode/extensions`
267
270
  – zainstalowane rozszerzenia edytora, nie ich cache). Osobna sekcja z ostrzeżeniem;
268
- zbiorcze kasowanie modeli i wolumenów jest wyłączone. Docker pokazuje osobno
269
- `SIZE` i `RECLAIMABLE`; domyślne czyszczenie ogranicza się do starego cache buildów.
271
+ zbiorcze kasowanie modeli, klastrów, maszyn wirtualnych, rozszerzeń i
272
+ wolumenów jest wyłączone. Docker pokazuje osobno `SIZE` i `RECLAIMABLE`;
273
+ domyślne czyszczenie ogranicza się do starego cache buildów. Raportowane
274
+ `RECLAIMABLE` jest górną informacją z Dockera — filtr starszy niż 7 dni może
275
+ faktycznie zwolnić znacznie mniej.
276
+
277
+ Opcja „Wybierz pojedyncze” przechodzi kolejno przez wszystkie znalezione
278
+ usługi w tych trzech grupach. Dla pozycji bez bezpiecznej operacji zbiorczej
279
+ wyświetla wyłącznie komendę podglądu. Pozycje chronione wymagają dodatkowego
280
+ potwierdzenia.
270
281
 
271
282
  ### `fixos projects` – skaner artefaktów w projektach deweloperskich
272
283
 
@@ -565,7 +576,8 @@ fixos/
565
576
 
566
577
  ## 📋 Roadmap
567
578
 
568
- Zobacz pełną listę zadań i roadmap w pliku [TODO.md](./TODO.md)
579
+ Aktualne, ręcznie zweryfikowane zadania znajdują się w [TODO.md](./TODO.md).
580
+ Historyczne artykuły i plany są przechowywane w katalogu [TODO/](./TODO/).
569
581
 
570
582
  ---
571
583
 
@@ -620,7 +632,8 @@ fixos orchestrate --dry-run
620
632
 
621
633
  ### 🔗 Linki
622
634
  - **GitHub**: https://github.com/wronai/fixos
623
- - **Pełna dokumentacja**: [TODO.md](./TODO.md)
635
+ - **Dokumentacja**: [docs/README.md](./docs/README.md)
636
+ - **Aktualne zadania**: [TODO.md](./TODO.md)
624
637
  ---
625
638
 
626
639
  ## Licencja
@@ -19,11 +19,11 @@ 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.40-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.85-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-38.2h-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.41-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.87-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-39.1h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
24
24
 
25
- - 🤖 **LLM usage:** $4.8451 (147 commits)
26
- - 👤 **Human dev:** ~$3817 (38.2h @ $100/h, 30min dedup)
25
+ - 🤖 **LLM usage:** $4.8653 (149 commits)
26
+ - 👤 **Human dev:** ~$3913 (39.1h @ $100/h, 30min dedup)
27
27
 
28
28
  Generated on 2026-07-23 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
29
29
 
@@ -161,6 +161,8 @@ Pierwsze uruchomienie zapisuje mały punkt odniesienia w
161
161
  swapu i znanych cache w wybranym oknie oraz od początku bieżącego dnia. Kwota
162
162
  „bezpieczne cache” obejmuje wyłącznie jawnie odtwarzalne dane. Docker, modele
163
163
  AI, rozszerzenia i cache IDE są raportowane osobno jako wymagające decyzji.
164
+ Nie są do niej zaliczane m.in. narzędzia i interpretery z
165
+ `~/.local/share/uv`, `.tools` pnpm, modele AI ani rozszerzenia edytorów.
164
166
 
165
167
  ### Przykładowy widok w terminalu (Czyszczenie dysku)
166
168
 
@@ -214,15 +216,24 @@ Tryb DRY-RUN - żadne akcje nie zostaną wykonane
214
216
  Każda znaleziona usługa jest klasyfikowana do jednej z trzech grup:
215
217
 
216
218
  - **bezpieczne** – cache do odtworzenia jednym poleceniem (pip/npm/cargo/conda/nix/brew...).
217
- Jedyna grupa oferowana do automatycznego usunięcia, z menu wyboru: wszystkie / pojedynczo / pomiń.
219
+ Tylko tę grupę można usunąć automatycznie opcją „wszystkie”.
218
220
  - **do rozważenia** – reinstalowalne aplikacje, dane długo nieużywane, nierozpoznane
219
- foldery (JetBrains, Snap, Flatpak) – pokazywane z podpowiedziami, nigdy nie usuwane automatycznie.
221
+ foldery (JetBrains, Snap, Flatpak) – pokazywane z komendą i wymagają
222
+ osobnego, świadomego potwierdzenia.
220
223
  - **chronione lub mieszane** – realne dane aplikacji albo magazyny łączące dane aktywne
221
224
  z cache (Ollama, LM Studio, HuggingFace hub, Docker/Podman/containerd, cała biblioteka
222
225
  Steam, `.cursor/extensions`/`.vscode/extensions`
223
226
  – zainstalowane rozszerzenia edytora, nie ich cache). Osobna sekcja z ostrzeżeniem;
224
- zbiorcze kasowanie modeli i wolumenów jest wyłączone. Docker pokazuje osobno
225
- `SIZE` i `RECLAIMABLE`; domyślne czyszczenie ogranicza się do starego cache buildów.
227
+ zbiorcze kasowanie modeli, klastrów, maszyn wirtualnych, rozszerzeń i
228
+ wolumenów jest wyłączone. Docker pokazuje osobno `SIZE` i `RECLAIMABLE`;
229
+ domyślne czyszczenie ogranicza się do starego cache buildów. Raportowane
230
+ `RECLAIMABLE` jest górną informacją z Dockera — filtr starszy niż 7 dni może
231
+ faktycznie zwolnić znacznie mniej.
232
+
233
+ Opcja „Wybierz pojedyncze” przechodzi kolejno przez wszystkie znalezione
234
+ usługi w tych trzech grupach. Dla pozycji bez bezpiecznej operacji zbiorczej
235
+ wyświetla wyłącznie komendę podglądu. Pozycje chronione wymagają dodatkowego
236
+ potwierdzenia.
226
237
 
227
238
  ### `fixos projects` – skaner artefaktów w projektach deweloperskich
228
239
 
@@ -521,7 +532,8 @@ fixos/
521
532
 
522
533
  ## 📋 Roadmap
523
534
 
524
- Zobacz pełną listę zadań i roadmap w pliku [TODO.md](./TODO.md)
535
+ Aktualne, ręcznie zweryfikowane zadania znajdują się w [TODO.md](./TODO.md).
536
+ Historyczne artykuły i plany są przechowywane w katalogu [TODO/](./TODO/).
525
537
 
526
538
  ---
527
539
 
@@ -576,7 +588,8 @@ fixos orchestrate --dry-run
576
588
 
577
589
  ### 🔗 Linki
578
590
  - **GitHub**: https://github.com/wronai/fixos
579
- - **Pełna dokumentacja**: [TODO.md](./TODO.md)
591
+ - **Dokumentacja**: [docs/README.md](./docs/README.md)
592
+ - **Aktualne zadania**: [TODO.md](./TODO.md)
580
593
  ---
581
594
 
582
595
  ## Licencja
@@ -1,3 +1,3 @@
1
1
  """fixos – AI-powered Linux/Windows diagnostics and repair."""
2
2
 
3
- __version__ = "2.2.40"
3
+ __version__ = "2.2.41"
@@ -55,7 +55,8 @@ def _display_cleanup_summary(plan: dict, threshold: int) -> None:
55
55
  if reclaimable:
56
56
  click.echo(
57
57
  click.style(
58
- f" Odzyskiwalne wg menedżerów usług: {reclaimable:.2f} GB",
58
+ f" Odzyskiwalne wg menedżerów usług (informacyjnie, nie plan "
59
+ f"automatyczny): {reclaimable:.2f} GB",
59
60
  fg="cyan",
60
61
  )
61
62
  )
@@ -298,51 +299,117 @@ def _display_dangerous_services(services: list) -> None:
298
299
  )
299
300
 
300
301
 
301
- def _service_has_dangerous_data(service_name: str, scanner) -> bool:
302
- """True if any currently-scanned path for this service is 'dangerous'."""
303
- from fixos.diagnostics.service_scanner import RiskLevel, ServiceType
302
+ def _single_service_target(service_name: str, scanner) -> dict | None:
303
+ """Resolve ``cleanup -c NAME`` to the safest executable scanned entry.
304
+
305
+ Some service types expose both rebuildable cache and protected data. The
306
+ direct command must pin execution to the cache entry instead of warning
307
+ about extensions/models and then letting a rescan pick whichever entry is
308
+ largest.
309
+ """
310
+ from fixos.diagnostics.service_scanner import ServiceType
304
311
 
305
312
  try:
306
313
  service_enum = ServiceType(service_name)
307
314
  except ValueError:
308
- return False
309
- scanned = scanner.scan_service(service_enum)
310
- return any(s.risk_level == RiskLevel.DANGEROUS.value for s in scanned)
315
+ return None
316
+
317
+ entries = scanner.scan_service(service_enum)
318
+ if not entries:
319
+ return None
320
+
321
+ risk_order = {"safe": 0, "review": 1, "dangerous": 2}
322
+ executable = [
323
+ item
324
+ for item in entries
325
+ if item.can_cleanup and item.cleanup_command.strip()
326
+ ]
327
+ candidates = executable or entries
328
+ selected = min(
329
+ candidates,
330
+ key=lambda item: (risk_order.get(item.risk_level, 1), -item.size_mb),
331
+ )
332
+ return {
333
+ "service_type": selected.service_type.value,
334
+ "name": selected.name,
335
+ "path": selected.path,
336
+ "size_mb": selected.size_mb,
337
+ "size_gb": selected.size_gb,
338
+ "description": selected.description,
339
+ "can_cleanup": selected.can_cleanup,
340
+ "cleanup_command": selected.cleanup_command,
341
+ "preview_command": selected.preview_command,
342
+ "safe_to_cleanup": selected.safe_to_cleanup,
343
+ "risk_level": selected.risk_level,
344
+ "impact": selected.impact,
345
+ "items_count": selected.items_count,
346
+ "details": selected.details,
347
+ }
311
348
 
312
349
 
313
350
  def _cleanup_single_service(
314
351
  service_name: str, scanner, json_output: bool, dry_run: bool
315
352
  ) -> None:
316
353
  """Handle cleanup of a single specific service."""
354
+ target = _single_service_target(service_name, scanner)
355
+
317
356
  if json_output:
318
- result = scanner.cleanup_service(service_name, dry_run=dry_run)
357
+ result = scanner.cleanup_service(
358
+ service_name,
359
+ dry_run=dry_run,
360
+ planned_service=target,
361
+ )
319
362
  import json
320
363
 
321
364
  click.echo(json.dumps(result, indent=2, default=str))
322
365
  return
323
366
 
324
- if not dry_run and _service_has_dangerous_data(service_name, scanner):
367
+ if target is None:
325
368
  click.echo(
326
369
  click.style(
327
- f"⚠️ {service_name} zawiera realne dane (nie tylko cache) — np. "
328
- "zainstalowane modele/rozszerzenia/kontenery. Tej operacji nie "
329
- "da się cofnąć.",
330
- fg="red",
370
+ f"Nie znaleziono danych {service_name} powyżej progu.",
371
+ fg="yellow",
372
+ )
373
+ )
374
+ return
375
+
376
+ if not target["can_cleanup"] or not target["cleanup_command"].strip():
377
+ click.echo(
378
+ click.style(
379
+ f"{target['name']}: zbiorcze czyszczenie jest wyłączone, "
380
+ "ponieważ wpis zawiera chronione dane.",
381
+ fg="yellow",
331
382
  bold=True,
332
383
  )
333
384
  )
385
+ if target.get("preview_command"):
386
+ click.echo(f" Bezpieczny podgląd: {target['preview_command']}")
387
+ click.echo(" Usuń ręcznie tylko konkretny, wcześniej sprawdzony element.")
388
+ return
389
+
390
+ if not dry_run and target.get("risk_level") == "dangerous":
334
391
  click.echo(
335
- f" Podgląd bez usuwania: fixos cleanup -c {service_name} --dry-run"
392
+ click.style(
393
+ f"⚠️ {target['name']} zawiera dane mieszane. fixOS wykona "
394
+ "wyłącznie ograniczoną operację pokazaną poniżej:",
395
+ fg="red",
396
+ bold=True,
397
+ )
336
398
  )
337
- if not click.confirm(f"Na pewno usunąć dane usługi {service_name}?"):
399
+ click.echo(f" {target['cleanup_command']}")
400
+ if not click.confirm(f"Wykonać ograniczone czyszczenie {target['name']}?"):
338
401
  click.echo("Anulowano.")
339
402
  return
340
403
 
341
- click.echo(click.style(f"Czyszczenie usługi: {service_name}", fg="yellow"))
404
+ click.echo(click.style(f"Czyszczenie usługi: {target['name']}", fg="yellow"))
342
405
  if dry_run:
343
406
  click.echo(click.style("[TRYB DRY-RUN] - brak faktycznych zmian", fg="cyan"))
344
407
 
345
- result = scanner.cleanup_service(service_name, dry_run=dry_run)
408
+ result = scanner.cleanup_service(
409
+ service_name,
410
+ dry_run=dry_run,
411
+ planned_service=target,
412
+ )
346
413
 
347
414
  if result["success"]:
348
415
  if dry_run:
@@ -352,10 +419,16 @@ def _cleanup_single_service(
352
419
  if result.get("output"):
353
420
  click.echo(f" {result['output']}")
354
421
  if result["space_freed_gb"] > 0:
355
- click.echo(
422
+ estimate = (
356
423
  f" Szacowane maksimum do odzyskania: "
357
424
  f"{result['space_freed_gb']:.2f} GB"
358
425
  )
426
+ if service_name == "docker":
427
+ estimate += (
428
+ " (cały odzyskiwalny cache buildów wg Docker; "
429
+ "filtr >7 dni zwykle usunie mniej)"
430
+ )
431
+ click.echo(estimate)
359
432
  else:
360
433
  click.echo(
361
434
  click.style(f"Zakończono czyszczenie {service_name}", fg="green")
@@ -414,7 +487,10 @@ def _selection_description(svc: dict) -> str:
414
487
  reclaimable = svc.get("details", {}).get("usage", {}).get("Build Cache", {})
415
488
  reclaimable_gb = float(reclaimable.get("reclaimable_gb", 0))
416
489
  if reclaimable_gb:
417
- description += f"; komenda dotyczy do {reclaimable_gb:.2f} GB cache buildów"
490
+ description += (
491
+ f"; Docker raportuje {reclaimable_gb:.2f} GB odzyskiwalnego "
492
+ "cache buildów, filtr >7 dni zwykle usunie mniej"
493
+ )
418
494
  return description
419
495
 
420
496
 
@@ -99,6 +99,7 @@ class ServiceCleaner:
99
99
  cleanup_command=planned_service.get("cleanup_command", ""),
100
100
  preview_command=planned_service.get("preview_command", ""),
101
101
  details=planned_service.get("details") or {},
102
+ risk_level=planned_service.get("risk_level", "review"),
102
103
  )
103
104
  else:
104
105
  services = self.scanner.scan_service(service_enum)
@@ -108,7 +109,15 @@ class ServiceCleaner:
108
109
  service = services[0] # Backward-compatible single-service mode.
109
110
  initial_size = service.size_gb
110
111
 
111
- if not service.can_cleanup or not service.cleanup_command.strip():
112
+ protected_bulk_blocked = (
113
+ getattr(service, "risk_level", "review") == "dangerous"
114
+ and not self._is_allowed_protected_cleanup(service)
115
+ )
116
+ if (
117
+ protected_bulk_blocked
118
+ or not service.can_cleanup
119
+ or not service.cleanup_command.strip()
120
+ ):
112
121
  if dry_run:
113
122
  preview = getattr(service, "preview_command", "")
114
123
  result["success"] = True
@@ -168,6 +177,17 @@ class ServiceCleaner:
168
177
 
169
178
  return result
170
179
 
180
+ @staticmethod
181
+ def _is_allowed_protected_cleanup(service) -> bool:
182
+ """Allow only the exact bounded Docker build-cache operation."""
183
+ from .service_scanner import ServiceType
184
+
185
+ return (
186
+ service.service_type == ServiceType.DOCKER
187
+ and service.cleanup_command
188
+ == "docker builder prune --force --filter until=168h"
189
+ )
190
+
171
191
  @staticmethod
172
192
  def _estimated_cleanup_gb(service) -> float:
173
193
  """Best available upper bound for a dry-run cleanup.
@@ -599,17 +619,41 @@ class ServiceCleaner:
599
619
 
600
620
  @staticmethod
601
621
  def get_cleanup_command(service_type, path: str) -> str:
602
- """Get cleanup command for service."""
622
+ """Get a bounded cleanup command for a scanned service path.
623
+
624
+ Protected data never gets a bulk-delete command. Docker is the only
625
+ exception because its command is deliberately limited to rebuildable
626
+ build cache older than seven days; it does not touch images, running
627
+ containers or volumes.
628
+ """
603
629
  from .service_scanner import ServiceType
604
630
 
631
+ protected_without_bulk_cleanup = {
632
+ ServiceType.CONTAINERD,
633
+ ServiceType.PODMAN,
634
+ ServiceType.OLLAMA,
635
+ ServiceType.LMSTUDIO,
636
+ ServiceType.HUGGINGFACE,
637
+ ServiceType.JUPYTER,
638
+ ServiceType.MINIKUBE,
639
+ ServiceType.APPIMAGE,
640
+ ServiceType.VBOX,
641
+ ServiceType.VMWARE,
642
+ }
643
+ if service_type in protected_without_bulk_cleanup:
644
+ return ""
645
+
646
+ if service_type in (ServiceType.VSCODE, ServiceType.CURSOR):
647
+ if ServiceCleaner.get_risk_level(service_type, path) == "dangerous":
648
+ return ""
649
+
650
+ if service_type == ServiceType.STEAM:
651
+ if ServiceCleaner.get_risk_level(service_type, path) == "dangerous":
652
+ return ""
653
+
605
654
  commands = {
606
655
  # Containers
607
656
  ServiceType.DOCKER: "docker builder prune --force --filter until=168h",
608
- # Models are user-selected data. A generic cleanup must never
609
- # turn into "remove every model".
610
- ServiceType.OLLAMA: "",
611
- ServiceType.CONTAINERD: "sudo rm -rf /var/lib/containerd",
612
- ServiceType.PODMAN: "podman system prune -af --volumes",
613
657
  # JS/Node
614
658
  ServiceType.NPM: (
615
659
  "npm cache clean --force 2>/dev/null || true; "
@@ -634,7 +678,6 @@ class ServiceCleaner:
634
678
  # System packages
635
679
  ServiceType.SNAP: 'snap list --all | awk \'/disabled/{print $1, $3}\' | while read snapname revision; do sudo snap remove "$snapname" --revision="$revision"; done',
636
680
  ServiceType.FLATPAK: "flatpak uninstall --unused -y && flatpak repair",
637
- ServiceType.APPIMAGE: "rm -rf ~/.local/share/AppImage ~/.cache/AppImage",
638
681
  ServiceType.APT: "sudo apt-get clean && sudo apt-get autoclean",
639
682
  ServiceType.DNF: "sudo dnf clean all",
640
683
  ServiceType.PACMAN: "sudo pacman -Scc --noconfirm",
@@ -642,8 +685,6 @@ class ServiceCleaner:
642
685
  ServiceType.ZYPPER: "sudo zypper clean --all",
643
686
  # Virtualization
644
687
  ServiceType.VAGRANT: "vagrant box prune --force",
645
- ServiceType.VBOX: "rm -rf ~/VirtualBox\\ VMs/*/Snapshots",
646
- ServiceType.VMWARE: "rm -rf ~/vmware/*.log ~/vmware/*.vmss",
647
688
  # Package managers
648
689
  ServiceType.NIX: "nix-collect-garbage -d || nix store gc",
649
690
  ServiceType.BREW: "brew cleanup --prune=all && brew autoremove",
@@ -652,8 +693,8 @@ class ServiceCleaner:
652
693
  ServiceType.FIREFOX: "rm -rf ~/.cache/mozilla ~/.mozilla/firefox/*/cache2",
653
694
  ServiceType.EDGE: "rm -rf ~/.cache/microsoft-edge",
654
695
  # IDEs
655
- ServiceType.VSCODE: "rm -rf ~/.config/Code/Cache ~/.config/Code/CachedData ~/.vscode/extensions/*/out",
656
- ServiceType.CURSOR: "rm -rf ~/.config/Cursor/Cache ~/.config/Cursor/CachedData ~/.cursor/extensions/*/out",
696
+ ServiceType.VSCODE: "rm -rf ~/.config/Code/Cache ~/.config/Code/CachedData",
697
+ ServiceType.CURSOR: "rm -rf ~/.config/Cursor/Cache ~/.config/Cursor/CachedData",
657
698
  ServiceType.JETBRAINS: (
658
699
  "if pgrep -f 'idea|pycharm|webstorm|jetbrains' >/dev/null; "
659
700
  "then echo 'Zamknij wszystkie IDE JetBrains przed czyszczeniem' >&2; "
@@ -661,7 +702,6 @@ class ServiceCleaner:
661
702
  "-exec rm -rf -- {} +; fi"
662
703
  ),
663
704
  # Cloud/ML
664
- ServiceType.HUGGINGFACE: "rm -rf ~/.cache/huggingface/hub/*",
665
705
  ServiceType.AWS: "rm -rf ~/.aws/sso/cache ~/.aws/cli/cache",
666
706
  ServiceType.GCLOUD: "gcloud auth application-default revoke 2>/dev/null; rm -rf ~/.config/gcloud/logs ~/.cache/gcloud",
667
707
  ServiceType.AZURE: "rm -rf ~/.azure/telemetry ~/.azure/logs",
@@ -672,7 +712,6 @@ class ServiceCleaner:
672
712
  ServiceType.UNITY: "rm -rf ~/.config/unity3d/Editor/Cache",
673
713
  ServiceType.UNREAL: "rm -rf ~/.config/Epic/UnrealEngine/5.*/DerivedDataCache",
674
714
  # Other
675
- ServiceType.JUPYTER: "jupyter kernelspec uninstall -y $(jupyter kernelspec list | tail -n +2 | awk '{print $1}') 2>/dev/null; rm -rf ~/.local/share/jupyter/runtime",
676
715
  ServiceType.THUMBNAILS: "rm -rf ~/.cache/thumbnails/* ~/.thumbnails/*",
677
716
  ServiceType.TRASH: "rm -rf ~/.local/share/Trash/* ~/.Trash/*",
678
717
  ServiceType.LOGS: "find ~/.cache/log ~/.local/state -name '*.log' -mtime +7 -delete 2>/dev/null; journalctl --vacuum-time=7d 2>/dev/null || true",
@@ -683,9 +722,7 @@ class ServiceCleaner:
683
722
  ServiceType.PLAYWRIGHT: "rm -rf ~/.cache/ms-playwright ~/.cache/puppeteer",
684
723
  ServiceType.CCACHE: "ccache -C 2>/dev/null || rm -rf ~/.ccache; rm -rf ~/.cache/sccache",
685
724
  ServiceType.HELM: "helm cache cleanup 2>/dev/null || rm -rf ~/.cache/helm",
686
- ServiceType.MINIKUBE: "minikube delete --all 2>/dev/null || rm -rf ~/.minikube",
687
725
  ServiceType.STEAM: ServiceCleaner._steam_cleanup_command(path),
688
- ServiceType.LMSTUDIO: "rm -rf ~/.lmstudio/models/* ~/.cache/lm-studio",
689
726
  ServiceType.BRAVE: ServiceCleaner._brave_cleanup_command(path),
690
727
  ServiceType.DISCORD: "rm -rf ~/.config/discord/Cache ~/.config/discord/Code Cache ~/.config/discord/GPUCache",
691
728
  ServiceType.SLACK: "rm -rf ~/.config/Slack/Cache ~/.config/Slack/Code Cache ~/.config/Slack/Service Worker",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fixos
3
- Version: 2.2.40
3
+ Version: 2.2.41
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,11 +63,11 @@ 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.40-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.85-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-38.2h-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.41-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.87-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-39.1h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
68
68
 
69
- - 🤖 **LLM usage:** $4.8451 (147 commits)
70
- - 👤 **Human dev:** ~$3817 (38.2h @ $100/h, 30min dedup)
69
+ - 🤖 **LLM usage:** $4.8653 (149 commits)
70
+ - 👤 **Human dev:** ~$3913 (39.1h @ $100/h, 30min dedup)
71
71
 
72
72
  Generated on 2026-07-23 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
73
73
 
@@ -205,6 +205,8 @@ Pierwsze uruchomienie zapisuje mały punkt odniesienia w
205
205
  swapu i znanych cache w wybranym oknie oraz od początku bieżącego dnia. Kwota
206
206
  „bezpieczne cache” obejmuje wyłącznie jawnie odtwarzalne dane. Docker, modele
207
207
  AI, rozszerzenia i cache IDE są raportowane osobno jako wymagające decyzji.
208
+ Nie są do niej zaliczane m.in. narzędzia i interpretery z
209
+ `~/.local/share/uv`, `.tools` pnpm, modele AI ani rozszerzenia edytorów.
208
210
 
209
211
  ### Przykładowy widok w terminalu (Czyszczenie dysku)
210
212
 
@@ -258,15 +260,24 @@ Tryb DRY-RUN - żadne akcje nie zostaną wykonane
258
260
  Każda znaleziona usługa jest klasyfikowana do jednej z trzech grup:
259
261
 
260
262
  - **bezpieczne** – cache do odtworzenia jednym poleceniem (pip/npm/cargo/conda/nix/brew...).
261
- Jedyna grupa oferowana do automatycznego usunięcia, z menu wyboru: wszystkie / pojedynczo / pomiń.
263
+ Tylko tę grupę można usunąć automatycznie opcją „wszystkie”.
262
264
  - **do rozważenia** – reinstalowalne aplikacje, dane długo nieużywane, nierozpoznane
263
- foldery (JetBrains, Snap, Flatpak) – pokazywane z podpowiedziami, nigdy nie usuwane automatycznie.
265
+ foldery (JetBrains, Snap, Flatpak) – pokazywane z komendą i wymagają
266
+ osobnego, świadomego potwierdzenia.
264
267
  - **chronione lub mieszane** – realne dane aplikacji albo magazyny łączące dane aktywne
265
268
  z cache (Ollama, LM Studio, HuggingFace hub, Docker/Podman/containerd, cała biblioteka
266
269
  Steam, `.cursor/extensions`/`.vscode/extensions`
267
270
  – zainstalowane rozszerzenia edytora, nie ich cache). Osobna sekcja z ostrzeżeniem;
268
- zbiorcze kasowanie modeli i wolumenów jest wyłączone. Docker pokazuje osobno
269
- `SIZE` i `RECLAIMABLE`; domyślne czyszczenie ogranicza się do starego cache buildów.
271
+ zbiorcze kasowanie modeli, klastrów, maszyn wirtualnych, rozszerzeń i
272
+ wolumenów jest wyłączone. Docker pokazuje osobno `SIZE` i `RECLAIMABLE`;
273
+ domyślne czyszczenie ogranicza się do starego cache buildów. Raportowane
274
+ `RECLAIMABLE` jest górną informacją z Dockera — filtr starszy niż 7 dni może
275
+ faktycznie zwolnić znacznie mniej.
276
+
277
+ Opcja „Wybierz pojedyncze” przechodzi kolejno przez wszystkie znalezione
278
+ usługi w tych trzech grupach. Dla pozycji bez bezpiecznej operacji zbiorczej
279
+ wyświetla wyłącznie komendę podglądu. Pozycje chronione wymagają dodatkowego
280
+ potwierdzenia.
270
281
 
271
282
  ### `fixos projects` – skaner artefaktów w projektach deweloperskich
272
283
 
@@ -565,7 +576,8 @@ fixos/
565
576
 
566
577
  ## 📋 Roadmap
567
578
 
568
- Zobacz pełną listę zadań i roadmap w pliku [TODO.md](./TODO.md)
579
+ Aktualne, ręcznie zweryfikowane zadania znajdują się w [TODO.md](./TODO.md).
580
+ Historyczne artykuły i plany są przechowywane w katalogu [TODO/](./TODO/).
569
581
 
570
582
  ---
571
583
 
@@ -620,7 +632,8 @@ fixos orchestrate --dry-run
620
632
 
621
633
  ### 🔗 Linki
622
634
  - **GitHub**: https://github.com/wronai/fixos
623
- - **Pełna dokumentacja**: [TODO.md](./TODO.md)
635
+ - **Dokumentacja**: [docs/README.md](./docs/README.md)
636
+ - **Aktualne zadania**: [TODO.md](./TODO.md)
624
637
  ---
625
638
 
626
639
  ## Licencja
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "fixos"
7
- version = "2.2.40"
7
+ version = "2.2.41"
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.40",
8
+ version="2.2.41",
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",