fixos 2.2.45__tar.gz → 2.2.47__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 (180) hide show
  1. {fixos-2.2.45 → fixos-2.2.47}/CHANGELOG.md +67 -0
  2. {fixos-2.2.45 → fixos-2.2.47}/PKG-INFO +83 -18
  3. {fixos-2.2.45 → fixos-2.2.47}/README.md +80 -15
  4. {fixos-2.2.45 → fixos-2.2.47}/fixos/__init__.py +1 -1
  5. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/cleanup_cmd.py +270 -24
  6. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/main.py +11 -1
  7. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/projects_cmd.py +156 -12
  8. fixos-2.2.47/fixos/diagnostics/docker_network_cleanup.py +282 -0
  9. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/service_cleanup.py +324 -54
  10. {fixos-2.2.45 → fixos-2.2.47}/fixos.egg-info/PKG-INFO +83 -18
  11. {fixos-2.2.45 → fixos-2.2.47}/fixos.egg-info/SOURCES.txt +2 -0
  12. {fixos-2.2.45 → fixos-2.2.47}/fixos.egg-info/requires.txt +5 -1
  13. {fixos-2.2.45 → fixos-2.2.47}/pyproject.toml +3 -3
  14. {fixos-2.2.45 → fixos-2.2.47}/setup.py +2 -1
  15. {fixos-2.2.45 → fixos-2.2.47}/tests/unit/test_cleanup_cmd.py +195 -4
  16. fixos-2.2.47/tests/unit/test_docker_network_cleanup.py +274 -0
  17. {fixos-2.2.45 → fixos-2.2.47}/tests/unit/test_projects_cmd.py +125 -3
  18. {fixos-2.2.45 → fixos-2.2.47}/tests/unit/test_service_cleanup.py +138 -5
  19. {fixos-2.2.45 → fixos-2.2.47}/.env.example +0 -0
  20. {fixos-2.2.45 → fixos-2.2.47}/LICENSE +0 -0
  21. {fixos-2.2.45 → fixos-2.2.47}/MANIFEST.in +0 -0
  22. {fixos-2.2.45 → fixos-2.2.47}/docker/README.md +0 -0
  23. {fixos-2.2.45 → fixos-2.2.47}/docker/TEST_RESULTS.md +0 -0
  24. {fixos-2.2.45 → fixos-2.2.47}/docker/TEST_RESULTS_V2.md +0 -0
  25. {fixos-2.2.45 → fixos-2.2.47}/docker/alpine/Dockerfile +0 -0
  26. {fixos-2.2.45 → fixos-2.2.47}/docker/arch/Dockerfile +0 -0
  27. {fixos-2.2.45 → fixos-2.2.47}/docker/base/Dockerfile +0 -0
  28. {fixos-2.2.45 → fixos-2.2.47}/docker/broken-audio/Dockerfile +0 -0
  29. {fixos-2.2.45 → fixos-2.2.47}/docker/broken-full/Dockerfile +0 -0
  30. {fixos-2.2.45 → fixos-2.2.47}/docker/broken-network/Dockerfile +0 -0
  31. {fixos-2.2.45 → fixos-2.2.47}/docker/broken-thumbnails/Dockerfile +0 -0
  32. {fixos-2.2.45 → fixos-2.2.47}/docker/debian/Dockerfile +0 -0
  33. {fixos-2.2.45 → fixos-2.2.47}/docker/docker-compose.multi-system.yml +0 -0
  34. {fixos-2.2.45 → fixos-2.2.47}/docker/docker-compose.yml +0 -0
  35. {fixos-2.2.45 → fixos-2.2.47}/docker/fedora/Dockerfile +0 -0
  36. {fixos-2.2.45 → fixos-2.2.47}/docker/test-multi-system.sh +0 -0
  37. {fixos-2.2.45 → fixos-2.2.47}/docker/test-scenarios.sh +0 -0
  38. {fixos-2.2.45 → fixos-2.2.47}/docker/ubuntu/Dockerfile +0 -0
  39. {fixos-2.2.45 → fixos-2.2.47}/docker/validate-scenario.py +0 -0
  40. {fixos-2.2.45 → fixos-2.2.47}/docs/examples/advanced_usage.py +0 -0
  41. {fixos-2.2.45 → fixos-2.2.47}/docs/examples/quickstart.py +0 -0
  42. {fixos-2.2.45 → fixos-2.2.47}/fixos/__main__.py +0 -0
  43. {fixos-2.2.45 → fixos-2.2.47}/fixos/agent/__init__.py +0 -0
  44. {fixos-2.2.45 → fixos-2.2.47}/fixos/agent/autonomous.py +0 -0
  45. {fixos-2.2.45 → fixos-2.2.47}/fixos/agent/autonomous_session.py +0 -0
  46. {fixos-2.2.45 → fixos-2.2.47}/fixos/agent/hitl.py +0 -0
  47. {fixos-2.2.45 → fixos-2.2.47}/fixos/agent/hitl_session.py +0 -0
  48. {fixos-2.2.45 → fixos-2.2.47}/fixos/agent/session_core.py +0 -0
  49. {fixos-2.2.45 → fixos-2.2.47}/fixos/agent/session_handlers.py +0 -0
  50. {fixos-2.2.45 → fixos-2.2.47}/fixos/agent/session_io.py +0 -0
  51. {fixos-2.2.45 → fixos-2.2.47}/fixos/anonymizer.py +0 -0
  52. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/__init__.py +0 -0
  53. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/_cleanup_flatpak.py +0 -0
  54. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/_cleanup_home.py +0 -0
  55. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/_cleanup_snap.py +0 -0
  56. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/_cleanup_system.py +0 -0
  57. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/_cleanup_utils.py +0 -0
  58. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/ask_cmd.py +0 -0
  59. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/config_cmd.py +0 -0
  60. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/features_cmd.py +0 -0
  61. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/fix_cmd.py +0 -0
  62. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/history_cmd.py +0 -0
  63. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/orchestrate_cmd.py +0 -0
  64. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/output_formatter.py +0 -0
  65. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/profile_cmd.py +0 -0
  66. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/provider_cmd.py +0 -0
  67. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/quick_cmd.py +0 -0
  68. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/quickfix_cmd.py +0 -0
  69. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/report_cmd.py +0 -0
  70. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/rollback_cmd.py +0 -0
  71. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/scan_cmd.py +0 -0
  72. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/shared.py +0 -0
  73. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/token_cmd.py +0 -0
  74. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli/watch_cmd.py +0 -0
  75. {fixos-2.2.45 → fixos-2.2.47}/fixos/cli.py +0 -0
  76. {fixos-2.2.45 → fixos-2.2.47}/fixos/config.py +0 -0
  77. {fixos-2.2.45 → fixos-2.2.47}/fixos/config_interactive.py +0 -0
  78. {fixos-2.2.45 → fixos-2.2.47}/fixos/constants.py +0 -0
  79. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/__init__.py +0 -0
  80. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/_flatpak_analysis_mixin.py +0 -0
  81. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/_flatpak_execution_mixin.py +0 -0
  82. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/_flatpak_recommendations_mixin.py +0 -0
  83. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/_storage_container_mixin.py +0 -0
  84. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/_storage_system_mixin.py +0 -0
  85. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/_storage_user_mixin.py +0 -0
  86. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/cache_discovery.py +0 -0
  87. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/checks/__init__.py +0 -0
  88. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/checks/_shared.py +0 -0
  89. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/checks/audio.py +0 -0
  90. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/checks/file_analysis.py +0 -0
  91. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/checks/hardware.py +0 -0
  92. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/checks/packages.py +0 -0
  93. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/checks/resources.py +0 -0
  94. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/checks/security.py +0 -0
  95. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/checks/storage_optimization.py +0 -0
  96. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/checks/system_core.py +0 -0
  97. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/checks/thumbnails.py +0 -0
  98. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/dev_project_analyzer.py +0 -0
  99. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/disk_analyzer.py +0 -0
  100. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/flatpak_analyzer.py +0 -0
  101. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/project_scanner.py +0 -0
  102. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/quick_snapshot.py +0 -0
  103. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/service_details.py +0 -0
  104. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/service_scanner.py +0 -0
  105. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/storage_analyzer.py +0 -0
  106. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/system_checks.py +0 -0
  107. {fixos-2.2.45 → fixos-2.2.47}/fixos/diagnostics/utils.py +0 -0
  108. {fixos-2.2.45 → fixos-2.2.47}/fixos/features/__init__.py +0 -0
  109. {fixos-2.2.45 → fixos-2.2.47}/fixos/features/auditor.py +0 -0
  110. {fixos-2.2.45 → fixos-2.2.47}/fixos/features/catalog.py +0 -0
  111. {fixos-2.2.45 → fixos-2.2.47}/fixos/features/installer.py +0 -0
  112. {fixos-2.2.45 → fixos-2.2.47}/fixos/features/profiles.py +0 -0
  113. {fixos-2.2.45 → fixos-2.2.47}/fixos/features/renderer.py +0 -0
  114. {fixos-2.2.45 → fixos-2.2.47}/fixos/fixes/__init__.py +0 -0
  115. {fixos-2.2.45 → fixos-2.2.47}/fixos/interactive/__init__.py +0 -0
  116. {fixos-2.2.45 → fixos-2.2.47}/fixos/interactive/cleanup_planner.py +0 -0
  117. {fixos-2.2.45 → fixos-2.2.47}/fixos/llm_shell.py +0 -0
  118. {fixos-2.2.45 → fixos-2.2.47}/fixos/orchestrator/__init__.py +0 -0
  119. {fixos-2.2.45 → fixos-2.2.47}/fixos/orchestrator/executor.py +0 -0
  120. {fixos-2.2.45 → fixos-2.2.47}/fixos/orchestrator/graph.py +0 -0
  121. {fixos-2.2.45 → fixos-2.2.47}/fixos/orchestrator/orchestrator.py +0 -0
  122. {fixos-2.2.45 → fixos-2.2.47}/fixos/orchestrator/rollback.py +0 -0
  123. {fixos-2.2.45 → fixos-2.2.47}/fixos/platform_utils.py +0 -0
  124. {fixos-2.2.45 → fixos-2.2.47}/fixos/plugins/__init__.py +0 -0
  125. {fixos-2.2.45 → fixos-2.2.47}/fixos/plugins/base.py +0 -0
  126. {fixos-2.2.45 → fixos-2.2.47}/fixos/plugins/builtin/__init__.py +0 -0
  127. {fixos-2.2.45 → fixos-2.2.47}/fixos/plugins/builtin/audio.py +0 -0
  128. {fixos-2.2.45 → fixos-2.2.47}/fixos/plugins/builtin/disk.py +0 -0
  129. {fixos-2.2.45 → fixos-2.2.47}/fixos/plugins/builtin/hardware.py +0 -0
  130. {fixos-2.2.45 → fixos-2.2.47}/fixos/plugins/builtin/resources.py +0 -0
  131. {fixos-2.2.45 → fixos-2.2.47}/fixos/plugins/builtin/security.py +0 -0
  132. {fixos-2.2.45 → fixos-2.2.47}/fixos/plugins/builtin/thumbnails.py +0 -0
  133. {fixos-2.2.45 → fixos-2.2.47}/fixos/plugins/registry.py +0 -0
  134. {fixos-2.2.45 → fixos-2.2.47}/fixos/profiles/__init__.py +0 -0
  135. {fixos-2.2.45 → fixos-2.2.47}/fixos/providers/__init__.py +0 -0
  136. {fixos-2.2.45 → fixos-2.2.47}/fixos/providers/llm.py +0 -0
  137. {fixos-2.2.45 → fixos-2.2.47}/fixos/providers/llm_analyzer.py +0 -0
  138. {fixos-2.2.45 → fixos-2.2.47}/fixos/providers/schemas.py +0 -0
  139. {fixos-2.2.45 → fixos-2.2.47}/fixos/system_checks.py +0 -0
  140. {fixos-2.2.45 → fixos-2.2.47}/fixos/utils/__init__.py +0 -0
  141. {fixos-2.2.45 → fixos-2.2.47}/fixos/utils/anonymizer.py +0 -0
  142. {fixos-2.2.45 → fixos-2.2.47}/fixos/utils/terminal.py +0 -0
  143. {fixos-2.2.45 → fixos-2.2.47}/fixos/utils/timeout.py +0 -0
  144. {fixos-2.2.45 → fixos-2.2.47}/fixos/utils/web_search.py +0 -0
  145. {fixos-2.2.45 → fixos-2.2.47}/fixos/watch.py +0 -0
  146. {fixos-2.2.45 → fixos-2.2.47}/fixos.egg-info/dependency_links.txt +0 -0
  147. {fixos-2.2.45 → fixos-2.2.47}/fixos.egg-info/entry_points.txt +0 -0
  148. {fixos-2.2.45 → fixos-2.2.47}/fixos.egg-info/top_level.txt +0 -0
  149. {fixos-2.2.45 → fixos-2.2.47}/pytest.ini +0 -0
  150. {fixos-2.2.45 → fixos-2.2.47}/requirements-dev.txt +0 -0
  151. {fixos-2.2.45 → fixos-2.2.47}/requirements.txt +0 -0
  152. {fixos-2.2.45 → fixos-2.2.47}/scripts/pyqual-calibrate.py +0 -0
  153. {fixos-2.2.45 → fixos-2.2.47}/setup.cfg +0 -0
  154. {fixos-2.2.45 → fixos-2.2.47}/tests/__init__.py +0 -0
  155. {fixos-2.2.45 → fixos-2.2.47}/tests/conftest.py +0 -0
  156. {fixos-2.2.45 → fixos-2.2.47}/tests/e2e/__init__.py +0 -0
  157. {fixos-2.2.45 → fixos-2.2.47}/tests/e2e/test_anonymization_layers.py +0 -0
  158. {fixos-2.2.45 → fixos-2.2.47}/tests/e2e/test_audio_broken.py +0 -0
  159. {fixos-2.2.45 → fixos-2.2.47}/tests/e2e/test_cli.py +0 -0
  160. {fixos-2.2.45 → fixos-2.2.47}/tests/e2e/test_diagnostics_integration.py +0 -0
  161. {fixos-2.2.45 → fixos-2.2.47}/tests/e2e/test_executor.py +0 -0
  162. {fixos-2.2.45 → fixos-2.2.47}/tests/e2e/test_multi_system.py +0 -0
  163. {fixos-2.2.45 → fixos-2.2.47}/tests/e2e/test_network_broken.py +0 -0
  164. {fixos-2.2.45 → fixos-2.2.47}/tests/e2e/test_thumbnails_broken.py +0 -0
  165. {fixos-2.2.45 → fixos-2.2.47}/tests/test_fixos.py +0 -0
  166. {fixos-2.2.45 → fixos-2.2.47}/tests/unit/__init__.py +0 -0
  167. {fixos-2.2.45 → fixos-2.2.47}/tests/unit/test_anonymizer.py +0 -0
  168. {fixos-2.2.45 → fixos-2.2.47}/tests/unit/test_cache_discovery.py +0 -0
  169. {fixos-2.2.45 → fixos-2.2.47}/tests/unit/test_core.py +0 -0
  170. {fixos-2.2.45 → fixos-2.2.47}/tests/unit/test_dev_project_analyzer.py +0 -0
  171. {fixos-2.2.45 → fixos-2.2.47}/tests/unit/test_executor.py +0 -0
  172. {fixos-2.2.45 → fixos-2.2.47}/tests/unit/test_llm_provider.py +0 -0
  173. {fixos-2.2.45 → fixos-2.2.47}/tests/unit/test_orchestrator.py +0 -0
  174. {fixos-2.2.45 → fixos-2.2.47}/tests/unit/test_project_scanner.py +0 -0
  175. {fixos-2.2.45 → fixos-2.2.47}/tests/unit/test_quick_cmd.py +0 -0
  176. {fixos-2.2.45 → fixos-2.2.47}/tests/unit/test_quick_snapshot.py +0 -0
  177. {fixos-2.2.45 → fixos-2.2.47}/tests/unit/test_resources_quick.py +0 -0
  178. {fixos-2.2.45 → fixos-2.2.47}/tests/unit/test_security_quick.py +0 -0
  179. {fixos-2.2.45 → fixos-2.2.47}/tests/unit/test_service_scanner.py +0 -0
  180. {fixos-2.2.45 → fixos-2.2.47}/tests/unit/test_system_checks_parallel.py +0 -0
@@ -2,6 +2,29 @@
2
2
 
3
3
  ### Added
4
4
 
5
+ - `fixos cleanup --docker-networks [--days N]` oraz `-c docker-networks`:
6
+ bezpieczny podgląd i usuwanie niestandardowych sieci Docker bez endpointów,
7
+ z ochroną sieci aktywnych/wbudowanych i końcowym testem puli adresowej.
8
+ - `fixos cleanup --docker-all` / `-c docker-all`: jedna operacja dla wszystkich
9
+ nieużywanych obrazów, build cache i osieroconych sieci, bez kontenerów i
10
+ wolumenów. `--docker-old` oraz interaktywne czyszczenie Dockera również
11
+ dołączają osierocone sieci.
12
+ - `fixos projects --docker-networks`: opcjonalne usuwanie sieci `dangling`
13
+ należących do wybranych projektów Compose, z dopasowaniem po etykiecie,
14
+ osobnym potwierdzeniem i usuwaniem wyłącznie wcześniej pokazanych ID.
15
+ - `fixos cleanup --docker-old [--days N]` oraz `-c docker-old`: usuwa
16
+ nieużywane obrazy Docker i build cache starsze niż N dni (domyślnie 30)
17
+ oraz osierocone sieci; bez wolumenów i obrazów używanych przez kontenery.
18
+ - `fixos cleanup --ollama-old [--days N]` oraz `-c ollama-old`: usuwa modele
19
+ Ollama niezmieniane od N dni (domyślnie 90), z pominięciem modeli
20
+ aktualnie załadowanych (`/api/ps`).
21
+ - Opcja interaktywna **[1] Wszystkie bezpieczne** obejmuje teraz także:
22
+ - **Docker (nieużywane zasoby)** — pełną pulę unused Images+Build Cache
23
+ oraz osierocone sieci, bez filtra wieku,
24
+ - **Ollama (modele >90 dni)** — gdy takie modele istnieją.
25
+ - Pomiar zwolnionego miejsca Dockera przez `docker system df` przed/po oraz
26
+ parsowanie `Total reclaimed space`; ostrzeżenie przy 0.00 GB mimo sukcesu
27
+ komendy; przypomnienie, że listy po `[1]` pochodzą ze skanu sprzed cleanup.
5
28
  - `fixos quick`: ograniczona czasowo analiza heurystyczna bez LLM, która od razu
6
29
  pokazuje presję CPU/RAM/dysku i maksymalny rozmiar jawnie odtwarzalnych cache.
7
30
  - Lokalna historia szybkich próbek z porównaniem ostatnich godzin i bieżącego
@@ -14,6 +37,9 @@
14
37
 
15
38
  ### Changed
16
39
 
40
+ - Dokumentacja README / getting-started / architecture opisuje model trzech
41
+ poziomów ryzyka z nowymi flagami `--docker-old` / `--ollama-old` i różnicą
42
+ między reclaimable a filtrem wieku.
17
43
  - Zakończone elementy historycznych roadmap zostały przeniesione z TODO do
18
44
  changelogu: modułowy pakiet CLI, klasowe sesje HITL, wspólny
19
45
  `SessionTimeout`, plugin registry, structured output LLM, rollback, profile
@@ -24,6 +50,9 @@
24
50
 
25
51
  ### Fixed
26
52
 
53
+ - Szacunek Dockera w opcji `[1]` nie obiecuje już całej puli RECLAIMABLE przy
54
+ filtrze `until=30d` (świeże unused images nie były kasowane, a UI pokazywało
55
+ 0.00 GB).
27
56
  - Zablokowano zbiorcze kasowanie chronionych danych LM Studio, Hugging Face,
28
57
  Podman/containerd, Jupyter, Minikube, AppImage, VirtualBox, VMware oraz
29
58
  rozszerzeń VS Code/Cursor. Takie wpisy pokazują teraz wyłącznie bezpieczny
@@ -51,6 +80,44 @@
51
80
  rekurencyjnych skanów `/` oraz `/home` z szybkich kontroli.
52
81
  - Czyszczenie cache JetBrains trafia w aktualną ścieżkę i wymaga zamknięcia IDE.
53
82
 
83
+ ## [2.2.47] - 2026-08-13
84
+
85
+ ### Docs
86
+ - Update CHANGELOG.md
87
+ - Update README.md
88
+ - Update docs/architecture.md
89
+ - Update docs/getting-started.md
90
+
91
+ ### Test
92
+ - Update tests/unit/test_cleanup_cmd.py
93
+ - Update tests/unit/test_docker_network_cleanup.py
94
+ - Update tests/unit/test_projects_cmd.py
95
+ - Update tests/unit/test_service_cleanup.py
96
+
97
+ ### Other
98
+ - Update fixos/cli/cleanup_cmd.py
99
+ - Update fixos/cli/main.py
100
+ - Update fixos/cli/projects_cmd.py
101
+ - Update fixos/diagnostics/docker_network_cleanup.py
102
+ - Update fixos/diagnostics/service_cleanup.py
103
+ - Update uv.lock
104
+
105
+ ## [2.2.46] - 2026-08-07
106
+
107
+ ### Docs
108
+ - Update CHANGELOG.md
109
+ - Update README.md
110
+ - Update docs/architecture.md
111
+ - Update docs/getting-started.md
112
+
113
+ ### Test
114
+ - Update tests/unit/test_service_cleanup.py
115
+
116
+ ### Other
117
+ - Update fixos/cli/cleanup_cmd.py
118
+ - Update fixos/diagnostics/service_cleanup.py
119
+ - Update project/planfile-tickets.yaml
120
+
54
121
  ## [2.2.45] - 2026-08-07
55
122
 
56
123
  ### Docs
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fixos
3
- Version: 2.2.45
3
+ Version: 2.2.47
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
@@ -35,9 +35,9 @@ Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
35
35
  Requires-Dist: pytest-xdist>=3.5.0; extra == "dev"
36
36
  Requires-Dist: pytest-timeout>=2.2.0; extra == "dev"
37
37
  Requires-Dist: pytest-sugar>=0.9.7; extra == "dev"
38
- Requires-Dist: goal>=2.1.0; extra == "dev"
38
+ Requires-Dist: goal>=2.1.0; python_version >= "3.12" and extra == "dev"
39
39
  Requires-Dist: costs>=0.1.20; extra == "dev"
40
- Requires-Dist: pfix>=0.1.60; extra == "dev"
40
+ Requires-Dist: pfix>=0.1.60; python_version >= "3.10" and extra == "dev"
41
41
  Dynamic: home-page
42
42
  Dynamic: license-file
43
43
  Dynamic: requires-python
@@ -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.45-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.81-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-39.6h-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.47-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-40.8h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
68
68
 
69
- - 🤖 **LLM usage:** $4.8099 (150 commits)
70
- - 👤 **Human dev:** ~$3959 (39.6h @ $100/h, 30min dedup)
69
+ - 🤖 **LLM usage:** $4.8536 (152 commits)
70
+ - 👤 **Human dev:** ~$4079 (40.8h @ $100/h, 30min dedup)
71
71
 
72
- Generated on 2026-08-07 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
72
+ Generated on 2026-08-13 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
73
73
 
74
74
  ---
75
75
 
@@ -118,8 +118,13 @@ fixos quick --deep – szybki wynik, potem pełny skan danych usług
118
118
  fixos fix – diagnoza + sesja naprawcza z AI (HITL)
119
119
  fixos scan – diagnostyka systemu bez AI
120
120
  fixos cleanup – skanuj i czyść dane usług (Docker, npm, pip, ...)
121
+ fixos cleanup --docker-all – wszystkie unused images/cache + osierocone sieci
122
+ fixos cleanup --docker-old – stare unused images/cache + osierocone sieci
123
+ fixos cleanup --docker-networks – tylko osierocone sieci + test puli
124
+ fixos cleanup --ollama-old – modele Ollama niezmieniane od N dni (domyślnie 90)
121
125
  fixos cleanup --full – pełny audit systemu + dev projects
122
126
  fixos projects – skanuj projekty dev (venv, node_modules, ~/github/*/*)
127
+ fixos projects --docker-networks – nieużywane sieci Compose wybranych projektów
123
128
  fixos orchestrate – zaawansowana orkiestracja (graf problemów DAG)
124
129
  fixos llm – lista 12 providerów LLM + linki do kluczy API
125
130
  fixos token set KEY – zapisz klucz API do .env (auto-detekcja providera)
@@ -153,6 +158,24 @@ fixos fix --disc
153
158
  # Pełny audit systemu (DNF, Docker, Flatpak, dev projects)
154
159
  fixos cleanup --full --dry-run
155
160
 
161
+ # Podgląd usług + interaktywne czyszczenie (opcja [1] = wszystkie bezpieczne)
162
+ fixos cleanup --list
163
+ fixos cleanup --dry-run # tylko gdy -c / --docker-all / --docker-old / ...
164
+ fixos cleanup
165
+
166
+ # Wszystkie unused images/cache oraz osierocone sieci (bez wolumenów)
167
+ fixos cleanup --docker-all --dry-run
168
+
169
+ # Obrazy/cache starsze niż 30 dni oraz wszystkie osierocone sieci
170
+ fixos cleanup --docker-old --days 30 --dry-run
171
+
172
+ # Sieci Docker bez endpointów; aktywne i wbudowane pozostają chronione
173
+ fixos cleanup --docker-networks --dry-run
174
+ fixos cleanup --docker-networks
175
+
176
+ # Modele Ollama niezmieniane od 90+ dni (pomija uruchomione)
177
+ fixos cleanup --ollama-old --days 90 --dry-run
178
+
156
179
  # Usuń tylko foldery venv z projektów
157
180
  fixos cleanup --full
158
181
  > type:venv
@@ -172,6 +195,9 @@ fixos projects
172
195
  # Tylko artefakty nieużywane od >60 dni (bez świeżych venv)
173
196
  fixos projects --only-stale
174
197
 
198
+ # Stare artefakty + podgląd powiązanych, nieużywanych sieci Compose
199
+ fixos projects --only-stale --docker-networks --dry-run
200
+
175
201
  # Podgląd bez usuwania
176
202
  fixos projects --dry-run
177
203
 
@@ -259,20 +285,51 @@ Tryb DRY-RUN - żadne akcje nie zostaną wykonane
259
285
 
260
286
  Każda znaleziona usługa jest klasyfikowana do jednej z trzech grup:
261
287
 
262
- - **bezpieczne** – cache do odtworzenia jednym poleceniem (pip/npm/cargo/conda/nix/brew...).
263
- Tylko tę grupę można usunąć automatycznie opcją „wszystkie”.
288
+ - **bezpieczne** – cache do odtworzenia jednym poleceniem (pip/npm/cargo/conda/nix/brew...)
289
+ oraz ograniczone, jawnie bezpieczne akcje wiekowe / reclaimable:
290
+ - **Docker (nieużywane zasoby)** — wszystkie unused images + build cache
291
+ oraz osierocone sieci bez endpointów (bez wolumenów, bez obrazów
292
+ podpiętych do kontenerów); część dyskowa odpowiada puli `RECLAIMABLE`,
293
+ - **Ollama (modele >90 dni)** — modele niezmieniane od 90+ dni; pomija
294
+ modele aktualnie załadowane w pamięci.
295
+ Tylko tę grupę usuwa opcja **[1] Wszystkie bezpieczne**.
264
296
  - **do rozważenia** – reinstalowalne aplikacje, dane długo nieużywane, nierozpoznane
265
297
  foldery (JetBrains, Snap, Flatpak) – pokazywane z komendą i wymagają
266
298
  osobnego, świadomego potwierdzenia.
267
299
  - **chronione lub mieszane** – realne dane aplikacji albo magazyny łączące dane aktywne
268
- z cache (Ollama, LM Studio, HuggingFace hub, Docker/Podman/containerd, cała biblioteka
269
- Steam, `.cursor/extensions`/`.vscode/extensions`
270
- – zainstalowane rozszerzenia edytora, nie ich cache). Osobna sekcja z ostrzeżeniem;
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.
300
+ z cache (cały sklep Ollama/LM Studio/HuggingFace, cały Docker z wolumenami,
301
+ Steam, `.cursor/extensions`/`.vscode/extensions`). Osobna sekcja z ostrzeżeniem;
302
+ zbiorcze kasowanie modeli „na ślepo”, klastrów, maszyn wirtualnych, rozszerzeń i
303
+ wolumenów jest wyłączone.
304
+
305
+ Dedykowane flagi (też dostępne jako `-c docker-all`, `-c docker-old`,
306
+ `-c docker-networks` oraz `-c ollama-old`):
307
+
308
+ ```bash
309
+ fixos cleanup --docker-all --dry-run # all unused + sieci
310
+ fixos cleanup --docker-old --days 30 --dry-run # stare unused + sieci
311
+ fixos cleanup --docker-networks --dry-run # sieci bez endpointów
312
+ fixos cleanup --ollama-old --days 90 --dry-run # modele niezmieniane od N dni
313
+ ```
314
+
315
+ Osierocone sieci są czyszczone automatycznie razem z `--docker-all`,
316
+ `--docker-old` oraz dockerową pozycją w „Wszystkie bezpieczne”. Samodzielne
317
+ `--docker-networks` pozostaje dostępne, gdy obrazy i cache mają pozostać.
318
+ Mechanizm pobiera kandydatów z `dangling=true`, ponownie sprawdza brak
319
+ endpointów, chroni sieci `bridge`, `host` i `none`, a usuwa dokładne ID zamiast
320
+ wykonywać szeroki prune. Po wykonaniu tworzy i natychmiast usuwa sieć testową
321
+ oznaczoną `dev.fixos.cleanup-probe=true`; sukces potwierdza, że daemon może
322
+ ponownie przydzielić podsieć. Opcjonalne `--days N` dla samodzielnej akcji
323
+ ogranicza ją do sieci mających co najmniej N dni; domyślne `0` obejmuje wszystkie.
324
+
325
+ `RECLAIMABLE` Dockera obejmuje też świeże unused images. Filtr `--docker-old`
326
+ (domyślnie 30 dni) może więc zwolnić **znacznie mniej** niż szacunek całej puli —
327
+ dlatego opcja `[1]` używa prune **wszystkich** nieużywanych obrazów, a
328
+ `--docker-old` zostaje dla świadomego cięcia po wieku. Domyślne
329
+ `fixos cleanup -c docker` nadal ogranicza się do cache buildów >7 dni.
330
+
331
+ Po wykonaniu opcji `[1]` listy „do rozważenia / chronione” pochodzą ze skanu
332
+ sprzed czyszczenia — uruchom ponownie `fixos cleanup --list`, by zobaczyć stan.
276
333
 
277
334
  Opcja „Wybierz pojedyncze” przechodzi kolejno przez wszystkie znalezione
278
335
  usługi w tych trzech grupach. Dla pozycji bez bezpiecznej operacji zbiorczej
@@ -292,6 +349,14 @@ nazwie), `node_modules`/`.next`/`.turbo` (tylko gdy jest `package.json`),
292
349
  nieużywane od >60 dni (`--stale-days`) oraz projekty ze zduplikowanymi
293
350
  virtualenvami (np. i `venv`, i `.venv` naraz).
294
351
 
352
+ Opcjonalne `--docker-networks` dołącza do czyszczenia wybranych projektów
353
+ ich nieużywane sieci Docker Compose. Dopasowanie wymaga dokładnej etykiety
354
+ `com.docker.compose.project`; sieci bez tej etykiety nie są zgadywane po
355
+ nazwie. fixOS ponownie wymaga stanu `dangling`, chroni sieci z endpointami,
356
+ pokazuje nazwę, ID i podsieć, a przed usunięciem pyta o osobne potwierdzenie.
357
+ Usuwane są tylko ID pokazane w podglądzie, po czym wykonywany jest test puli
358
+ adresowej. Repozytorium projektu, kontenery i wolumeny pozostają nietknięte.
359
+
295
360
  ```bash
296
361
  $ fixos projects --only-stale
297
362
 
@@ -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.45-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.81-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-39.6h-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.47-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-40.8h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
24
24
 
25
- - 🤖 **LLM usage:** $4.8099 (150 commits)
26
- - 👤 **Human dev:** ~$3959 (39.6h @ $100/h, 30min dedup)
25
+ - 🤖 **LLM usage:** $4.8536 (152 commits)
26
+ - 👤 **Human dev:** ~$4079 (40.8h @ $100/h, 30min dedup)
27
27
 
28
- Generated on 2026-08-07 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
28
+ Generated on 2026-08-13 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
29
29
 
30
30
  ---
31
31
 
@@ -74,8 +74,13 @@ fixos quick --deep – szybki wynik, potem pełny skan danych usług
74
74
  fixos fix – diagnoza + sesja naprawcza z AI (HITL)
75
75
  fixos scan – diagnostyka systemu bez AI
76
76
  fixos cleanup – skanuj i czyść dane usług (Docker, npm, pip, ...)
77
+ fixos cleanup --docker-all – wszystkie unused images/cache + osierocone sieci
78
+ fixos cleanup --docker-old – stare unused images/cache + osierocone sieci
79
+ fixos cleanup --docker-networks – tylko osierocone sieci + test puli
80
+ fixos cleanup --ollama-old – modele Ollama niezmieniane od N dni (domyślnie 90)
77
81
  fixos cleanup --full – pełny audit systemu + dev projects
78
82
  fixos projects – skanuj projekty dev (venv, node_modules, ~/github/*/*)
83
+ fixos projects --docker-networks – nieużywane sieci Compose wybranych projektów
79
84
  fixos orchestrate – zaawansowana orkiestracja (graf problemów DAG)
80
85
  fixos llm – lista 12 providerów LLM + linki do kluczy API
81
86
  fixos token set KEY – zapisz klucz API do .env (auto-detekcja providera)
@@ -109,6 +114,24 @@ fixos fix --disc
109
114
  # Pełny audit systemu (DNF, Docker, Flatpak, dev projects)
110
115
  fixos cleanup --full --dry-run
111
116
 
117
+ # Podgląd usług + interaktywne czyszczenie (opcja [1] = wszystkie bezpieczne)
118
+ fixos cleanup --list
119
+ fixos cleanup --dry-run # tylko gdy -c / --docker-all / --docker-old / ...
120
+ fixos cleanup
121
+
122
+ # Wszystkie unused images/cache oraz osierocone sieci (bez wolumenów)
123
+ fixos cleanup --docker-all --dry-run
124
+
125
+ # Obrazy/cache starsze niż 30 dni oraz wszystkie osierocone sieci
126
+ fixos cleanup --docker-old --days 30 --dry-run
127
+
128
+ # Sieci Docker bez endpointów; aktywne i wbudowane pozostają chronione
129
+ fixos cleanup --docker-networks --dry-run
130
+ fixos cleanup --docker-networks
131
+
132
+ # Modele Ollama niezmieniane od 90+ dni (pomija uruchomione)
133
+ fixos cleanup --ollama-old --days 90 --dry-run
134
+
112
135
  # Usuń tylko foldery venv z projektów
113
136
  fixos cleanup --full
114
137
  > type:venv
@@ -128,6 +151,9 @@ fixos projects
128
151
  # Tylko artefakty nieużywane od >60 dni (bez świeżych venv)
129
152
  fixos projects --only-stale
130
153
 
154
+ # Stare artefakty + podgląd powiązanych, nieużywanych sieci Compose
155
+ fixos projects --only-stale --docker-networks --dry-run
156
+
131
157
  # Podgląd bez usuwania
132
158
  fixos projects --dry-run
133
159
 
@@ -215,20 +241,51 @@ Tryb DRY-RUN - żadne akcje nie zostaną wykonane
215
241
 
216
242
  Każda znaleziona usługa jest klasyfikowana do jednej z trzech grup:
217
243
 
218
- - **bezpieczne** – cache do odtworzenia jednym poleceniem (pip/npm/cargo/conda/nix/brew...).
219
- Tylko tę grupę można usunąć automatycznie opcją „wszystkie”.
244
+ - **bezpieczne** – cache do odtworzenia jednym poleceniem (pip/npm/cargo/conda/nix/brew...)
245
+ oraz ograniczone, jawnie bezpieczne akcje wiekowe / reclaimable:
246
+ - **Docker (nieużywane zasoby)** — wszystkie unused images + build cache
247
+ oraz osierocone sieci bez endpointów (bez wolumenów, bez obrazów
248
+ podpiętych do kontenerów); część dyskowa odpowiada puli `RECLAIMABLE`,
249
+ - **Ollama (modele >90 dni)** — modele niezmieniane od 90+ dni; pomija
250
+ modele aktualnie załadowane w pamięci.
251
+ Tylko tę grupę usuwa opcja **[1] Wszystkie bezpieczne**.
220
252
  - **do rozważenia** – reinstalowalne aplikacje, dane długo nieużywane, nierozpoznane
221
253
  foldery (JetBrains, Snap, Flatpak) – pokazywane z komendą i wymagają
222
254
  osobnego, świadomego potwierdzenia.
223
255
  - **chronione lub mieszane** – realne dane aplikacji albo magazyny łączące dane aktywne
224
- z cache (Ollama, LM Studio, HuggingFace hub, Docker/Podman/containerd, cała biblioteka
225
- Steam, `.cursor/extensions`/`.vscode/extensions`
226
- – zainstalowane rozszerzenia edytora, nie ich cache). Osobna sekcja z ostrzeżeniem;
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.
256
+ z cache (cały sklep Ollama/LM Studio/HuggingFace, cały Docker z wolumenami,
257
+ Steam, `.cursor/extensions`/`.vscode/extensions`). Osobna sekcja z ostrzeżeniem;
258
+ zbiorcze kasowanie modeli „na ślepo”, klastrów, maszyn wirtualnych, rozszerzeń i
259
+ wolumenów jest wyłączone.
260
+
261
+ Dedykowane flagi (też dostępne jako `-c docker-all`, `-c docker-old`,
262
+ `-c docker-networks` oraz `-c ollama-old`):
263
+
264
+ ```bash
265
+ fixos cleanup --docker-all --dry-run # all unused + sieci
266
+ fixos cleanup --docker-old --days 30 --dry-run # stare unused + sieci
267
+ fixos cleanup --docker-networks --dry-run # sieci bez endpointów
268
+ fixos cleanup --ollama-old --days 90 --dry-run # modele niezmieniane od N dni
269
+ ```
270
+
271
+ Osierocone sieci są czyszczone automatycznie razem z `--docker-all`,
272
+ `--docker-old` oraz dockerową pozycją w „Wszystkie bezpieczne”. Samodzielne
273
+ `--docker-networks` pozostaje dostępne, gdy obrazy i cache mają pozostać.
274
+ Mechanizm pobiera kandydatów z `dangling=true`, ponownie sprawdza brak
275
+ endpointów, chroni sieci `bridge`, `host` i `none`, a usuwa dokładne ID zamiast
276
+ wykonywać szeroki prune. Po wykonaniu tworzy i natychmiast usuwa sieć testową
277
+ oznaczoną `dev.fixos.cleanup-probe=true`; sukces potwierdza, że daemon może
278
+ ponownie przydzielić podsieć. Opcjonalne `--days N` dla samodzielnej akcji
279
+ ogranicza ją do sieci mających co najmniej N dni; domyślne `0` obejmuje wszystkie.
280
+
281
+ `RECLAIMABLE` Dockera obejmuje też świeże unused images. Filtr `--docker-old`
282
+ (domyślnie 30 dni) może więc zwolnić **znacznie mniej** niż szacunek całej puli —
283
+ dlatego opcja `[1]` używa prune **wszystkich** nieużywanych obrazów, a
284
+ `--docker-old` zostaje dla świadomego cięcia po wieku. Domyślne
285
+ `fixos cleanup -c docker` nadal ogranicza się do cache buildów >7 dni.
286
+
287
+ Po wykonaniu opcji `[1]` listy „do rozważenia / chronione” pochodzą ze skanu
288
+ sprzed czyszczenia — uruchom ponownie `fixos cleanup --list`, by zobaczyć stan.
232
289
 
233
290
  Opcja „Wybierz pojedyncze” przechodzi kolejno przez wszystkie znalezione
234
291
  usługi w tych trzech grupach. Dla pozycji bez bezpiecznej operacji zbiorczej
@@ -248,6 +305,14 @@ nazwie), `node_modules`/`.next`/`.turbo` (tylko gdy jest `package.json`),
248
305
  nieużywane od >60 dni (`--stale-days`) oraz projekty ze zduplikowanymi
249
306
  virtualenvami (np. i `venv`, i `.venv` naraz).
250
307
 
308
+ Opcjonalne `--docker-networks` dołącza do czyszczenia wybranych projektów
309
+ ich nieużywane sieci Docker Compose. Dopasowanie wymaga dokładnej etykiety
310
+ `com.docker.compose.project`; sieci bez tej etykiety nie są zgadywane po
311
+ nazwie. fixOS ponownie wymaga stanu `dangling`, chroni sieci z endpointami,
312
+ pokazuje nazwę, ID i podsieć, a przed usunięciem pyta o osobne potwierdzenie.
313
+ Usuwane są tylko ID pokazane w podglądzie, po czym wykonywany jest test puli
314
+ adresowej. Repozytorium projektu, kontenery i wolumeny pozostają nietknięte.
315
+
251
316
  ```bash
252
317
  $ fixos projects --only-stale
253
318
 
@@ -1,3 +1,3 @@
1
1
  """fixos – AI-powered Linux/Windows diagnostics and repair."""
2
2
 
3
- __version__ = "2.2.45"
3
+ __version__ = "2.2.47"