fixos 2.2.50__tar.gz → 2.2.52__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 (232) hide show
  1. {fixos-2.2.50 → fixos-2.2.52}/MANIFEST.in +1 -0
  2. {fixos-2.2.50 → fixos-2.2.52}/PKG-INFO +2 -2
  3. {fixos-2.2.50 → fixos-2.2.52}/README.md +1 -1
  4. fixos-2.2.52/VERSION +1 -0
  5. fixos-2.2.52/fixos/__init__.py +18 -0
  6. fixos-2.2.52/fixos/cli/__main__.py +6 -0
  7. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/ask_cmd.py +31 -2
  8. fixos-2.2.52/fixos/cli/dashboard.py +583 -0
  9. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/main.py +41 -41
  10. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/shared.py +47 -1
  11. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/shell_cmd.py +107 -37
  12. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/cache_discovery.py +46 -11
  13. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/disk_analyzer.py +32 -7
  14. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/native_scan.py +100 -7
  15. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/project_scanner.py +14 -1
  16. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/quick_snapshot.py +27 -4
  17. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/service_scanner.py +18 -2
  18. {fixos-2.2.50 → fixos-2.2.52}/fixos.egg-info/PKG-INFO +2 -2
  19. {fixos-2.2.50 → fixos-2.2.52}/fixos.egg-info/SOURCES.txt +8 -1
  20. {fixos-2.2.50 → fixos-2.2.52}/pyproject.toml +1 -1
  21. {fixos-2.2.50 → fixos-2.2.52}/setup.py +10 -2
  22. {fixos-2.2.50 → fixos-2.2.52}/tests/conftest.py +11 -2
  23. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_ask_and_nl_group.py +63 -2
  24. fixos-2.2.52/tests/unit/test_cli_main.py +42 -0
  25. fixos-2.2.52/tests/unit/test_dashboard.py +350 -0
  26. fixos-2.2.52/tests/unit/test_disk_analyzer.py +126 -0
  27. fixos-2.2.52/tests/unit/test_native_scan.py +186 -0
  28. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_project_scanner.py +33 -0
  29. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_quick_snapshot.py +31 -0
  30. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_shell_ux.py +37 -0
  31. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_venv_cleanup.py +2 -2
  32. fixos-2.2.52/tests/unit/test_version_parity.py +38 -0
  33. fixos-2.2.50/fixos/__init__.py +0 -3
  34. fixos-2.2.50/tests/unit/test_disk_analyzer.py +0 -60
  35. {fixos-2.2.50 → fixos-2.2.52}/.env.example +0 -0
  36. {fixos-2.2.50 → fixos-2.2.52}/CHANGELOG.md +0 -0
  37. {fixos-2.2.50 → fixos-2.2.52}/LICENSE +0 -0
  38. {fixos-2.2.50 → fixos-2.2.52}/docker/README.md +0 -0
  39. {fixos-2.2.50 → fixos-2.2.52}/docker/TEST_RESULTS.md +0 -0
  40. {fixos-2.2.50 → fixos-2.2.52}/docker/TEST_RESULTS_V2.md +0 -0
  41. {fixos-2.2.50 → fixos-2.2.52}/docker/alpine/Dockerfile +0 -0
  42. {fixos-2.2.50 → fixos-2.2.52}/docker/arch/Dockerfile +0 -0
  43. {fixos-2.2.50 → fixos-2.2.52}/docker/base/Dockerfile +0 -0
  44. {fixos-2.2.50 → fixos-2.2.52}/docker/broken-audio/Dockerfile +0 -0
  45. {fixos-2.2.50 → fixos-2.2.52}/docker/broken-full/Dockerfile +0 -0
  46. {fixos-2.2.50 → fixos-2.2.52}/docker/broken-network/Dockerfile +0 -0
  47. {fixos-2.2.50 → fixos-2.2.52}/docker/broken-thumbnails/Dockerfile +0 -0
  48. {fixos-2.2.50 → fixos-2.2.52}/docker/debian/Dockerfile +0 -0
  49. {fixos-2.2.50 → fixos-2.2.52}/docker/docker-compose.multi-system.yml +0 -0
  50. {fixos-2.2.50 → fixos-2.2.52}/docker/docker-compose.yml +0 -0
  51. {fixos-2.2.50 → fixos-2.2.52}/docker/fedora/Dockerfile +0 -0
  52. {fixos-2.2.50 → fixos-2.2.52}/docker/test-multi-system.sh +0 -0
  53. {fixos-2.2.50 → fixos-2.2.52}/docker/test-scenarios.sh +0 -0
  54. {fixos-2.2.50 → fixos-2.2.52}/docker/ubuntu/Dockerfile +0 -0
  55. {fixos-2.2.50 → fixos-2.2.52}/docker/validate-scenario.py +0 -0
  56. {fixos-2.2.50 → fixos-2.2.52}/docs/examples/advanced_usage.py +0 -0
  57. {fixos-2.2.50 → fixos-2.2.52}/docs/examples/quickstart.py +0 -0
  58. {fixos-2.2.50 → fixos-2.2.52}/fixos/__main__.py +0 -0
  59. {fixos-2.2.50 → fixos-2.2.52}/fixos/agent/__init__.py +0 -0
  60. {fixos-2.2.50 → fixos-2.2.52}/fixos/agent/autonomous.py +0 -0
  61. {fixos-2.2.50 → fixos-2.2.52}/fixos/agent/autonomous_session.py +0 -0
  62. {fixos-2.2.50 → fixos-2.2.52}/fixos/agent/hitl.py +0 -0
  63. {fixos-2.2.50 → fixos-2.2.52}/fixos/agent/hitl_session.py +0 -0
  64. {fixos-2.2.50 → fixos-2.2.52}/fixos/agent/session_core.py +0 -0
  65. {fixos-2.2.50 → fixos-2.2.52}/fixos/agent/session_handlers.py +0 -0
  66. {fixos-2.2.50 → fixos-2.2.52}/fixos/agent/session_io.py +0 -0
  67. {fixos-2.2.50 → fixos-2.2.52}/fixos/anonymizer.py +0 -0
  68. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/__init__.py +0 -0
  69. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/_cleanup_flatpak.py +0 -0
  70. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/_cleanup_home.py +0 -0
  71. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/_cleanup_snap.py +0 -0
  72. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/_cleanup_space.py +0 -0
  73. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/_cleanup_system.py +0 -0
  74. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/_cleanup_utils.py +0 -0
  75. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/_cleanup_venvs.py +0 -0
  76. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/cleanup_cmd.py +0 -0
  77. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/config_cmd.py +0 -0
  78. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/features_cmd.py +0 -0
  79. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/fix_cmd.py +0 -0
  80. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/history_cmd.py +0 -0
  81. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/jetbrains_cmd.py +0 -0
  82. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/orchestrate_cmd.py +0 -0
  83. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/output_formatter.py +0 -0
  84. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/profile_cmd.py +0 -0
  85. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/projects_cmd.py +0 -0
  86. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/provider_cmd.py +0 -0
  87. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/quick_cmd.py +0 -0
  88. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/quickfix_cmd.py +0 -0
  89. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/report_cmd.py +0 -0
  90. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/rollback_cmd.py +0 -0
  91. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/scan_cmd.py +0 -0
  92. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/token_cmd.py +0 -0
  93. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli/watch_cmd.py +0 -0
  94. {fixos-2.2.50 → fixos-2.2.52}/fixos/cli.py +0 -0
  95. {fixos-2.2.50 → fixos-2.2.52}/fixos/config.py +0 -0
  96. {fixos-2.2.50 → fixos-2.2.52}/fixos/config_interactive.py +0 -0
  97. {fixos-2.2.50 → fixos-2.2.52}/fixos/constants.py +0 -0
  98. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/__init__.py +0 -0
  99. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/_flatpak_analysis_mixin.py +0 -0
  100. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/_flatpak_execution_mixin.py +0 -0
  101. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/_flatpak_recommendations_mixin.py +0 -0
  102. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/_storage_container_mixin.py +0 -0
  103. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/_storage_system_mixin.py +0 -0
  104. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/_storage_user_mixin.py +0 -0
  105. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/checks/__init__.py +0 -0
  106. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/checks/_shared.py +0 -0
  107. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/checks/audio.py +0 -0
  108. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/checks/file_analysis.py +0 -0
  109. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/checks/hardware.py +0 -0
  110. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/checks/packages.py +0 -0
  111. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/checks/resources.py +0 -0
  112. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/checks/security.py +0 -0
  113. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/checks/storage_optimization.py +0 -0
  114. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/checks/system_core.py +0 -0
  115. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/checks/thumbnails.py +0 -0
  116. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/dev_project_analyzer.py +0 -0
  117. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/docker_network_cleanup.py +0 -0
  118. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/docker_startup_optimizer.py +0 -0
  119. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/flatpak_analyzer.py +0 -0
  120. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/jetbrains_ai.py +0 -0
  121. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/jetbrains_recovery.py +0 -0
  122. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/orphaned_workloads.py +0 -0
  123. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/process_chains.py +0 -0
  124. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/service_cleanup.py +0 -0
  125. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/service_details.py +0 -0
  126. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/storage_analyzer.py +0 -0
  127. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/system_checks.py +0 -0
  128. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/utils.py +0 -0
  129. {fixos-2.2.50 → fixos-2.2.52}/fixos/diagnostics/venv_cleanup.py +0 -0
  130. {fixos-2.2.50 → fixos-2.2.52}/fixos/endpoint_refresh.py +0 -0
  131. {fixos-2.2.50 → fixos-2.2.52}/fixos/features/__init__.py +0 -0
  132. {fixos-2.2.50 → fixos-2.2.52}/fixos/features/auditor.py +0 -0
  133. {fixos-2.2.50 → fixos-2.2.52}/fixos/features/catalog.py +0 -0
  134. {fixos-2.2.50 → fixos-2.2.52}/fixos/features/data/packages.yaml +0 -0
  135. {fixos-2.2.50 → fixos-2.2.52}/fixos/features/data/profiles/developer.yaml +0 -0
  136. {fixos-2.2.50 → fixos-2.2.52}/fixos/features/data/profiles/office.yaml +0 -0
  137. {fixos-2.2.50 → fixos-2.2.52}/fixos/features/data/profiles/sysadmin.yaml +0 -0
  138. {fixos-2.2.50 → fixos-2.2.52}/fixos/features/installer.py +0 -0
  139. {fixos-2.2.50 → fixos-2.2.52}/fixos/features/profiles.py +0 -0
  140. {fixos-2.2.50 → fixos-2.2.52}/fixos/features/renderer.py +0 -0
  141. {fixos-2.2.50 → fixos-2.2.52}/fixos/fixes/__init__.py +0 -0
  142. {fixos-2.2.50 → fixos-2.2.52}/fixos/interactive/__init__.py +0 -0
  143. {fixos-2.2.50 → fixos-2.2.52}/fixos/interactive/cleanup_planner.py +0 -0
  144. {fixos-2.2.50 → fixos-2.2.52}/fixos/llm_shell.py +0 -0
  145. {fixos-2.2.50 → fixos-2.2.52}/fixos/orchestrator/__init__.py +0 -0
  146. {fixos-2.2.50 → fixos-2.2.52}/fixos/orchestrator/executor.py +0 -0
  147. {fixos-2.2.50 → fixos-2.2.52}/fixos/orchestrator/graph.py +0 -0
  148. {fixos-2.2.50 → fixos-2.2.52}/fixos/orchestrator/orchestrator.py +0 -0
  149. {fixos-2.2.50 → fixos-2.2.52}/fixos/orchestrator/rollback.py +0 -0
  150. {fixos-2.2.50 → fixos-2.2.52}/fixos/orphan_pins.py +0 -0
  151. {fixos-2.2.50 → fixos-2.2.52}/fixos/platform_utils.py +0 -0
  152. {fixos-2.2.50 → fixos-2.2.52}/fixos/plugins/__init__.py +0 -0
  153. {fixos-2.2.50 → fixos-2.2.52}/fixos/plugins/base.py +0 -0
  154. {fixos-2.2.50 → fixos-2.2.52}/fixos/plugins/builtin/__init__.py +0 -0
  155. {fixos-2.2.50 → fixos-2.2.52}/fixos/plugins/builtin/audio.py +0 -0
  156. {fixos-2.2.50 → fixos-2.2.52}/fixos/plugins/builtin/disk.py +0 -0
  157. {fixos-2.2.50 → fixos-2.2.52}/fixos/plugins/builtin/hardware.py +0 -0
  158. {fixos-2.2.50 → fixos-2.2.52}/fixos/plugins/builtin/resources.py +0 -0
  159. {fixos-2.2.50 → fixos-2.2.52}/fixos/plugins/builtin/security.py +0 -0
  160. {fixos-2.2.50 → fixos-2.2.52}/fixos/plugins/builtin/thumbnails.py +0 -0
  161. {fixos-2.2.50 → fixos-2.2.52}/fixos/plugins/registry.py +0 -0
  162. {fixos-2.2.50 → fixos-2.2.52}/fixos/profiles/__init__.py +0 -0
  163. {fixos-2.2.50 → fixos-2.2.52}/fixos/profiles/desktop.yaml +0 -0
  164. {fixos-2.2.50 → fixos-2.2.52}/fixos/profiles/developer.yaml +0 -0
  165. {fixos-2.2.50 → fixos-2.2.52}/fixos/profiles/minimal.yaml +0 -0
  166. {fixos-2.2.50 → fixos-2.2.52}/fixos/profiles/server.yaml +0 -0
  167. {fixos-2.2.50 → fixos-2.2.52}/fixos/providers/__init__.py +0 -0
  168. {fixos-2.2.50 → fixos-2.2.52}/fixos/providers/gemini_native.py +0 -0
  169. {fixos-2.2.50 → fixos-2.2.52}/fixos/providers/llm.py +0 -0
  170. {fixos-2.2.50 → fixos-2.2.52}/fixos/providers/llm_analyzer.py +0 -0
  171. {fixos-2.2.50 → fixos-2.2.52}/fixos/providers/schemas.py +0 -0
  172. {fixos-2.2.50 → fixos-2.2.52}/fixos/system_checks.py +0 -0
  173. {fixos-2.2.50 → fixos-2.2.52}/fixos/utils/__init__.py +0 -0
  174. {fixos-2.2.50 → fixos-2.2.52}/fixos/utils/anonymizer.py +0 -0
  175. {fixos-2.2.50 → fixos-2.2.52}/fixos/utils/terminal.py +0 -0
  176. {fixos-2.2.50 → fixos-2.2.52}/fixos/utils/timeout.py +0 -0
  177. {fixos-2.2.50 → fixos-2.2.52}/fixos/utils/web_search.py +0 -0
  178. {fixos-2.2.50 → fixos-2.2.52}/fixos/watch.py +0 -0
  179. {fixos-2.2.50 → fixos-2.2.52}/fixos.egg-info/dependency_links.txt +0 -0
  180. {fixos-2.2.50 → fixos-2.2.52}/fixos.egg-info/entry_points.txt +0 -0
  181. {fixos-2.2.50 → fixos-2.2.52}/fixos.egg-info/requires.txt +0 -0
  182. {fixos-2.2.50 → fixos-2.2.52}/fixos.egg-info/top_level.txt +0 -0
  183. {fixos-2.2.50 → fixos-2.2.52}/pytest.ini +0 -0
  184. {fixos-2.2.50 → fixos-2.2.52}/requirements-dev.txt +0 -0
  185. {fixos-2.2.50 → fixos-2.2.52}/requirements.txt +0 -0
  186. {fixos-2.2.50 → fixos-2.2.52}/scripts/pyqual-calibrate.py +0 -0
  187. {fixos-2.2.50 → fixos-2.2.52}/setup.cfg +0 -0
  188. {fixos-2.2.50 → fixos-2.2.52}/tests/__init__.py +0 -0
  189. {fixos-2.2.50 → fixos-2.2.52}/tests/e2e/__init__.py +0 -0
  190. {fixos-2.2.50 → fixos-2.2.52}/tests/e2e/test_anonymization_layers.py +0 -0
  191. {fixos-2.2.50 → fixos-2.2.52}/tests/e2e/test_audio_broken.py +0 -0
  192. {fixos-2.2.50 → fixos-2.2.52}/tests/e2e/test_cli.py +0 -0
  193. {fixos-2.2.50 → fixos-2.2.52}/tests/e2e/test_diagnostics_integration.py +0 -0
  194. {fixos-2.2.50 → fixos-2.2.52}/tests/e2e/test_executor.py +0 -0
  195. {fixos-2.2.50 → fixos-2.2.52}/tests/e2e/test_multi_system.py +0 -0
  196. {fixos-2.2.50 → fixos-2.2.52}/tests/e2e/test_network_broken.py +0 -0
  197. {fixos-2.2.50 → fixos-2.2.52}/tests/e2e/test_thumbnails_broken.py +0 -0
  198. {fixos-2.2.50 → fixos-2.2.52}/tests/test_fixos.py +0 -0
  199. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/__init__.py +0 -0
  200. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_anonymizer.py +0 -0
  201. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_cache_discovery.py +0 -0
  202. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_cleanup_cmd.py +0 -0
  203. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_cleanup_effectiveness.py +0 -0
  204. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_cleanup_retention.py +0 -0
  205. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_cleanup_safety.py +0 -0
  206. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_cleanup_space.py +0 -0
  207. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_cleanup_tmp.py +0 -0
  208. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_cleanup_utils.py +0 -0
  209. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_core.py +0 -0
  210. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_dev_project_analyzer.py +0 -0
  211. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_docker_network_cleanup.py +0 -0
  212. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_docker_startup_optimizer.py +0 -0
  213. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_endpoint_refresh.py +0 -0
  214. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_executor.py +0 -0
  215. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_gemini_native_client.py +0 -0
  216. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_jetbrains_cmd.py +0 -0
  217. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_jetbrains_recovery.py +0 -0
  218. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_llm_auth_stop.py +0 -0
  219. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_llm_provider.py +0 -0
  220. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_orchestrator.py +0 -0
  221. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_orphan_pins.py +0 -0
  222. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_orphaned_workloads.py +0 -0
  223. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_packaging_data.py +0 -0
  224. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_process_chains.py +0 -0
  225. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_projects_cmd.py +0 -0
  226. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_quick_cmd.py +0 -0
  227. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_resources_quick.py +0 -0
  228. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_security_quick.py +0 -0
  229. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_service_cleanup.py +0 -0
  230. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_service_scanner.py +0 -0
  231. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_storage_analyzer.py +0 -0
  232. {fixos-2.2.50 → fixos-2.2.52}/tests/unit/test_system_checks_parallel.py +0 -0
@@ -1,5 +1,6 @@
1
1
  include LICENSE
2
2
  include README.md
3
+ include VERSION
3
4
  include CHANGELOG.md
4
5
  include requirements.txt
5
6
  include requirements-dev.txt
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fixos
3
- Version: 2.2.50
3
+ Version: 2.2.52
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,7 +63,7 @@ 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.48-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
66
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-2.2.51-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
67
67
  ![AI Cost](https://img.shields.io/badge/AI%20Cost-$4.90-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-42.2h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
68
68
 
69
69
  - 🤖 **LLM usage:** $4.9010 (154 commits)
@@ -20,7 +20,7 @@ AI-powered OS Diagnostics
20
20
 
21
21
  ## AI Cost Tracking
22
22
 
23
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-2.2.48-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
23
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-2.2.51-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
24
24
  ![AI Cost](https://img.shields.io/badge/AI%20Cost-$4.90-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-42.2h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
25
25
 
26
26
  - 🤖 **LLM usage:** $4.9010 (154 commits)
fixos-2.2.52/VERSION ADDED
@@ -0,0 +1 @@
1
+ 2.2.52
@@ -0,0 +1,18 @@
1
+ """fixos – AI-powered Linux/Windows diagnostics and repair."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from importlib.metadata import PackageNotFoundError
6
+ from importlib.metadata import version as _get_version
7
+ from pathlib import Path
8
+
9
+ # Single Source of Truth: check VERSION file in repo root first,
10
+ # then fall back to installed package metadata.
11
+ _version_file = Path(__file__).resolve().parent.parent / "VERSION"
12
+ if _version_file.is_file():
13
+ __version__ = _version_file.read_text(encoding="utf-8").strip()
14
+ else:
15
+ try:
16
+ __version__ = _get_version("fixos")
17
+ except (PackageNotFoundError, OSError):
18
+ __version__ = "unknown"
@@ -0,0 +1,6 @@
1
+ """Allow running fixOS CLI directly as ``python -m fixos.cli``."""
2
+
3
+ from fixos.cli import main
4
+
5
+ if __name__ == "__main__":
6
+ main()
@@ -2,6 +2,7 @@
2
2
  Natural language command (ask) for fixOS CLI
3
3
  """
4
4
 
5
+ import re
5
6
  import subprocess
6
7
  from contextlib import suppress
7
8
 
@@ -39,6 +40,7 @@ _PACKAGE_ACTION_TERMS = (
39
40
  "triage",
40
41
  )
41
42
  _PACKAGE_TRIAGE_COMMAND = ("fixos", ["cleanup", "--full", "--dry-run", "--json"])
43
+ _TMP_CLEANUP_COMMAND = ("fixos", ["cleanup", "--tmp", "--retention", "24h"])
42
44
 
43
45
 
44
46
  def _is_package_triage_request(prompt_lower: str) -> bool:
@@ -64,6 +66,13 @@ def _match_heuristic_command(prompt_lower: str) -> object | None:
64
66
  - tuple: (program, args) for subprocess
65
67
  - None: No match found
66
68
  """
69
+ if re.fullmatch(
70
+ r"(?:wyczysc|wyczyść|posprzataj|posprzątaj|clean|cleanup|clear)"
71
+ r"(?:\s+(?:katalog|directory))?\s+/tmp/?",
72
+ prompt_lower.strip(),
73
+ ):
74
+ return _TMP_CLEANUP_COMMAND
75
+
67
76
  is_docker = any(
68
77
  kw in prompt_lower
69
78
  for kw in ["docker", "kontener", "kontenery", "container", "containers"]
@@ -418,8 +427,9 @@ Przykłady:
418
427
  output = {
419
428
  "status": "error",
420
429
  "reason": "llm_error",
430
+ "prompt": prompt,
421
431
  "message": str(e),
422
- "hint": 'fixos ask "wylacz wszystkie kontenery docker"',
432
+ "hint": "fixos --help",
423
433
  }
424
434
  click.echo(yaml.dump(output, default_flow_style=False, allow_unicode=True))
425
435
 
@@ -435,6 +445,24 @@ def _handle_natural_command(prompt: str, dry_run: bool = False) -> None:
435
445
  # Stage 1: Try heuristic matching
436
446
  matched_cmd = _match_heuristic_command(prompt_lower)
437
447
 
448
+ if matched_cmd == _TMP_CLEANUP_COMMAND:
449
+ command = _format_command(matched_cmd)
450
+ if dry_run:
451
+ click.echo(yaml.dump(_build_output_dict(
452
+ status="dry_run", prompt=prompt, source="heuristics",
453
+ command=command,
454
+ ), default_flow_style=False, allow_unicode=True))
455
+ else:
456
+ from fixos.cli.cleanup_cmd import cleanup_services
457
+
458
+ click.echo(f"→ {command}")
459
+ # Invoke in this terminal: the existing cleaner owns selection,
460
+ # retention and confirmation, without shell capture or LLM calls.
461
+ click.get_current_context().invoke(
462
+ cleanup_services, tmp_cleanup=True, retention="24h", yes=False,
463
+ )
464
+ return
465
+
438
466
  if matched_cmd:
439
467
  # Heuristic match found - execute directly
440
468
  cmd_str = _format_command(matched_cmd)
@@ -448,8 +476,9 @@ def _handle_natural_command(prompt: str, dry_run: bool = False) -> None:
448
476
  output = {
449
477
  "status": "error",
450
478
  "reason": "no_api_key",
479
+ "prompt": prompt,
451
480
  "message": "Brak klucza API. Użyj: fixos token set <KLUCZ>",
452
- "hint": 'fixos ask "wylacz wszystkie kontenery docker"',
481
+ "hint": "fixos --help",
453
482
  }
454
483
  click.echo(yaml.dump(output, default_flow_style=False, allow_unicode=True))
455
484
  return