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.
- {fixos-2.2.40 → fixos-2.2.41}/CHANGELOG.md +35 -0
- {fixos-2.2.40 → fixos-2.2.41}/PKG-INFO +24 -11
- {fixos-2.2.40 → fixos-2.2.41}/README.md +23 -10
- {fixos-2.2.40 → fixos-2.2.41}/fixos/__init__.py +1 -1
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/cleanup_cmd.py +95 -19
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/service_cleanup.py +53 -16
- {fixos-2.2.40 → fixos-2.2.41}/fixos.egg-info/PKG-INFO +24 -11
- {fixos-2.2.40 → fixos-2.2.41}/pyproject.toml +1 -1
- {fixos-2.2.40 → fixos-2.2.41}/setup.py +1 -1
- fixos-2.2.41/tests/unit/test_cleanup_cmd.py +194 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_service_cleanup.py +73 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_service_scanner.py +5 -0
- fixos-2.2.40/tests/unit/test_cleanup_cmd.py +0 -87
- {fixos-2.2.40 → fixos-2.2.41}/.env.example +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/LICENSE +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/MANIFEST.in +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/docker/README.md +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/docker/TEST_RESULTS.md +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/docker/TEST_RESULTS_V2.md +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/docker/alpine/Dockerfile +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/docker/arch/Dockerfile +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/docker/base/Dockerfile +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/docker/broken-audio/Dockerfile +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/docker/broken-full/Dockerfile +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/docker/broken-network/Dockerfile +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/docker/broken-thumbnails/Dockerfile +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/docker/debian/Dockerfile +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/docker/docker-compose.multi-system.yml +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/docker/docker-compose.yml +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/docker/fedora/Dockerfile +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/docker/test-multi-system.sh +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/docker/test-scenarios.sh +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/docker/ubuntu/Dockerfile +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/docker/validate-scenario.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/docs/examples/advanced_usage.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/docs/examples/quickstart.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/__main__.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/agent/__init__.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/agent/autonomous.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/agent/autonomous_session.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/agent/hitl.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/agent/hitl_session.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/agent/session_core.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/agent/session_handlers.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/agent/session_io.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/anonymizer.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/__init__.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/_cleanup_flatpak.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/_cleanup_home.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/_cleanup_snap.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/_cleanup_system.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/_cleanup_utils.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/ask_cmd.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/config_cmd.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/features_cmd.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/fix_cmd.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/history_cmd.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/main.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/orchestrate_cmd.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/output_formatter.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/profile_cmd.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/projects_cmd.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/provider_cmd.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/quick_cmd.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/quickfix_cmd.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/report_cmd.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/rollback_cmd.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/scan_cmd.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/shared.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/token_cmd.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli/watch_cmd.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/cli.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/config.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/config_interactive.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/constants.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/__init__.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/_flatpak_analysis_mixin.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/_flatpak_execution_mixin.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/_flatpak_recommendations_mixin.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/_storage_container_mixin.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/_storage_system_mixin.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/_storage_user_mixin.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/cache_discovery.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/checks/__init__.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/checks/_shared.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/checks/audio.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/checks/file_analysis.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/checks/hardware.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/checks/packages.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/checks/resources.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/checks/security.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/checks/storage_optimization.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/checks/system_core.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/checks/thumbnails.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/dev_project_analyzer.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/disk_analyzer.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/flatpak_analyzer.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/project_scanner.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/quick_snapshot.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/service_details.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/service_scanner.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/storage_analyzer.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/system_checks.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/diagnostics/utils.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/features/__init__.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/features/auditor.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/features/catalog.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/features/installer.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/features/profiles.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/features/renderer.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/fixes/__init__.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/interactive/__init__.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/interactive/cleanup_planner.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/llm_shell.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/orchestrator/__init__.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/orchestrator/executor.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/orchestrator/graph.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/orchestrator/orchestrator.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/orchestrator/rollback.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/platform_utils.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/plugins/__init__.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/plugins/base.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/plugins/builtin/__init__.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/plugins/builtin/audio.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/plugins/builtin/disk.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/plugins/builtin/hardware.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/plugins/builtin/resources.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/plugins/builtin/security.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/plugins/builtin/thumbnails.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/plugins/registry.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/profiles/__init__.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/providers/__init__.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/providers/llm.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/providers/llm_analyzer.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/providers/schemas.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/system_checks.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/utils/__init__.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/utils/anonymizer.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/utils/terminal.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/utils/timeout.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/utils/web_search.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos/watch.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos.egg-info/SOURCES.txt +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos.egg-info/dependency_links.txt +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos.egg-info/entry_points.txt +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos.egg-info/requires.txt +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/fixos.egg-info/top_level.txt +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/pytest.ini +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/requirements-dev.txt +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/requirements.txt +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/scripts/pyqual-calibrate.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/setup.cfg +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/__init__.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/conftest.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/e2e/__init__.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/e2e/test_anonymization_layers.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/e2e/test_audio_broken.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/e2e/test_cli.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/e2e/test_diagnostics_integration.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/e2e/test_executor.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/e2e/test_multi_system.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/e2e/test_network_broken.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/e2e/test_thumbnails_broken.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/test_fixos.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/unit/__init__.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_anonymizer.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_cache_discovery.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_core.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_dev_project_analyzer.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_executor.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_llm_provider.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_orchestrator.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_project_scanner.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_projects_cmd.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_quick_cmd.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_quick_snapshot.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_resources_quick.py +0 -0
- {fixos-2.2.40 → fixos-2.2.41}/tests/unit/test_security_quick.py +0 -0
- {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.
|
|
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
|
-
    
|
|
67
|
+
  
|
|
68
68
|
|
|
69
|
-
- 🤖 **LLM usage:** $4.
|
|
70
|
-
- 👤 **Human dev:** ~$
|
|
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
|
-
|
|
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
|
|
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
|
|
269
|
-
`SIZE` i `RECLAIMABLE`;
|
|
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
|
-
|
|
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
|
-
- **
|
|
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
|
-
    
|
|
23
|
+
  
|
|
24
24
|
|
|
25
|
-
- 🤖 **LLM usage:** $4.
|
|
26
|
-
- 👤 **Human dev:** ~$
|
|
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
|
-
|
|
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
|
|
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
|
|
225
|
-
`SIZE` i `RECLAIMABLE`;
|
|
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
|
-
|
|
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
|
-
- **
|
|
591
|
+
- **Dokumentacja**: [docs/README.md](./docs/README.md)
|
|
592
|
+
- **Aktualne zadania**: [TODO.md](./TODO.md)
|
|
580
593
|
---
|
|
581
594
|
|
|
582
595
|
## Licencja
|
|
@@ -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
|
|
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
|
|
302
|
-
"""
|
|
303
|
-
|
|
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
|
|
309
|
-
|
|
310
|
-
|
|
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(
|
|
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
|
|
367
|
+
if target is None:
|
|
325
368
|
click.echo(
|
|
326
369
|
click.style(
|
|
327
|
-
f"
|
|
328
|
-
"
|
|
329
|
-
|
|
330
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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: {
|
|
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(
|
|
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
|
-
|
|
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 +=
|
|
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
|
-
|
|
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
|
|
656
|
-
ServiceType.CURSOR: "rm -rf ~/.config/Cursor/Cache ~/.config/Cursor/CachedData
|
|
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.
|
|
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
|
-
    
|
|
67
|
+
  
|
|
68
68
|
|
|
69
|
-
- 🤖 **LLM usage:** $4.
|
|
70
|
-
- 👤 **Human dev:** ~$
|
|
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
|
-
|
|
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
|
|
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
|
|
269
|
-
`SIZE` i `RECLAIMABLE`;
|
|
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
|
-
|
|
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
|
-
- **
|
|
635
|
+
- **Dokumentacja**: [docs/README.md](./docs/README.md)
|
|
636
|
+
- **Aktualne zadania**: [TODO.md](./TODO.md)
|
|
624
637
|
---
|
|
625
638
|
|
|
626
639
|
## Licencja
|
|
@@ -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.
|
|
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",
|