fixos 2.2.49__tar.gz → 2.2.51__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.49 → fixos-2.2.51}/PKG-INFO +1 -1
- fixos-2.2.51/fixos/__init__.py +18 -0
- fixos-2.2.51/fixos/cli/_cleanup_space.py +1563 -0
- fixos-2.2.51/fixos/cli/_cleanup_venvs.py +113 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/ask_cmd.py +31 -2
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/cleanup_cmd.py +501 -27
- fixos-2.2.51/fixos/cli/dashboard.py +583 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/main.py +83 -43
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/shared.py +47 -1
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/shell_cmd.py +110 -34
- {fixos-2.2.49 → fixos-2.2.51}/fixos/config.py +62 -29
- {fixos-2.2.49 → fixos-2.2.51}/fixos/constants.py +3 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/cache_discovery.py +46 -11
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/disk_analyzer.py +216 -103
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/docker_startup_optimizer.py +287 -8
- fixos-2.2.51/fixos/diagnostics/native_scan.py +239 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/project_scanner.py +57 -23
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/quick_snapshot.py +27 -4
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/service_cleanup.py +497 -33
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/service_scanner.py +18 -2
- fixos-2.2.51/fixos/diagnostics/venv_cleanup.py +351 -0
- fixos-2.2.51/fixos/providers/gemini_native.py +369 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/providers/llm.py +35 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos.egg-info/PKG-INFO +1 -1
- {fixos-2.2.49 → fixos-2.2.51}/fixos.egg-info/SOURCES.txt +16 -1
- {fixos-2.2.49 → fixos-2.2.51}/fixos.egg-info/top_level.txt +0 -1
- {fixos-2.2.49 → fixos-2.2.51}/pyproject.toml +3 -3
- {fixos-2.2.49 → fixos-2.2.51}/tests/conftest.py +11 -2
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_ask_and_nl_group.py +63 -2
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_cleanup_cmd.py +20 -3
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_cleanup_effectiveness.py +6 -37
- fixos-2.2.51/tests/unit/test_cleanup_retention.py +381 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_cleanup_safety.py +80 -0
- fixos-2.2.51/tests/unit/test_cleanup_space.py +304 -0
- fixos-2.2.51/tests/unit/test_cleanup_tmp.py +248 -0
- fixos-2.2.51/tests/unit/test_dashboard.py +350 -0
- fixos-2.2.51/tests/unit/test_disk_analyzer.py +126 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_docker_startup_optimizer.py +259 -9
- fixos-2.2.51/tests/unit/test_gemini_native_client.py +204 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_llm_provider.py +42 -2
- fixos-2.2.51/tests/unit/test_native_scan.py +186 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_project_scanner.py +33 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_quick_snapshot.py +31 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_shell_ux.py +37 -0
- fixos-2.2.51/tests/unit/test_venv_cleanup.py +578 -0
- fixos-2.2.51/tests/unit/test_version_parity.py +38 -0
- fixos-2.2.49/fixos/__init__.py +0 -3
- {fixos-2.2.49 → fixos-2.2.51}/.env.example +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/CHANGELOG.md +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/LICENSE +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/MANIFEST.in +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/README.md +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/docker/README.md +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/docker/TEST_RESULTS.md +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/docker/TEST_RESULTS_V2.md +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/docker/alpine/Dockerfile +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/docker/arch/Dockerfile +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/docker/base/Dockerfile +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/docker/broken-audio/Dockerfile +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/docker/broken-full/Dockerfile +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/docker/broken-network/Dockerfile +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/docker/broken-thumbnails/Dockerfile +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/docker/debian/Dockerfile +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/docker/docker-compose.multi-system.yml +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/docker/docker-compose.yml +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/docker/fedora/Dockerfile +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/docker/test-multi-system.sh +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/docker/test-scenarios.sh +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/docker/ubuntu/Dockerfile +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/docker/validate-scenario.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/docs/examples/advanced_usage.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/docs/examples/quickstart.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/__main__.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/agent/__init__.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/agent/autonomous.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/agent/autonomous_session.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/agent/hitl.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/agent/hitl_session.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/agent/session_core.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/agent/session_handlers.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/agent/session_io.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/anonymizer.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/__init__.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/_cleanup_flatpak.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/_cleanup_home.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/_cleanup_snap.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/_cleanup_system.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/_cleanup_utils.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/config_cmd.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/features_cmd.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/fix_cmd.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/history_cmd.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/jetbrains_cmd.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/orchestrate_cmd.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/output_formatter.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/profile_cmd.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/projects_cmd.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/provider_cmd.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/quick_cmd.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/quickfix_cmd.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/report_cmd.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/rollback_cmd.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/scan_cmd.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/token_cmd.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli/watch_cmd.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/cli.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/config_interactive.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/__init__.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/_flatpak_analysis_mixin.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/_flatpak_execution_mixin.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/_flatpak_recommendations_mixin.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/_storage_container_mixin.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/_storage_system_mixin.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/_storage_user_mixin.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/checks/__init__.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/checks/_shared.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/checks/audio.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/checks/file_analysis.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/checks/hardware.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/checks/packages.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/checks/resources.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/checks/security.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/checks/storage_optimization.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/checks/system_core.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/checks/thumbnails.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/dev_project_analyzer.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/docker_network_cleanup.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/flatpak_analyzer.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/jetbrains_ai.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/jetbrains_recovery.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/orphaned_workloads.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/process_chains.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/service_details.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/storage_analyzer.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/system_checks.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/diagnostics/utils.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/endpoint_refresh.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/features/__init__.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/features/auditor.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/features/catalog.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/features/data/packages.yaml +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/features/data/profiles/developer.yaml +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/features/data/profiles/office.yaml +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/features/data/profiles/sysadmin.yaml +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/features/installer.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/features/profiles.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/features/renderer.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/fixes/__init__.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/interactive/__init__.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/interactive/cleanup_planner.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/llm_shell.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/orchestrator/__init__.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/orchestrator/executor.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/orchestrator/graph.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/orchestrator/orchestrator.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/orchestrator/rollback.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/orphan_pins.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/platform_utils.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/plugins/__init__.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/plugins/base.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/plugins/builtin/__init__.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/plugins/builtin/audio.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/plugins/builtin/disk.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/plugins/builtin/hardware.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/plugins/builtin/resources.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/plugins/builtin/security.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/plugins/builtin/thumbnails.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/plugins/registry.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/profiles/__init__.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/profiles/desktop.yaml +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/profiles/developer.yaml +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/profiles/minimal.yaml +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/profiles/server.yaml +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/providers/__init__.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/providers/llm_analyzer.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/providers/schemas.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/system_checks.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/utils/__init__.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/utils/anonymizer.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/utils/terminal.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/utils/timeout.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/utils/web_search.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos/watch.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos.egg-info/dependency_links.txt +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos.egg-info/entry_points.txt +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/fixos.egg-info/requires.txt +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/pytest.ini +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/requirements-dev.txt +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/requirements.txt +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/scripts/pyqual-calibrate.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/setup.cfg +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/setup.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/__init__.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/e2e/__init__.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/e2e/test_anonymization_layers.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/e2e/test_audio_broken.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/e2e/test_cli.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/e2e/test_diagnostics_integration.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/e2e/test_executor.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/e2e/test_multi_system.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/e2e/test_network_broken.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/e2e/test_thumbnails_broken.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/test_fixos.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/__init__.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_anonymizer.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_cache_discovery.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_cleanup_utils.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_core.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_dev_project_analyzer.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_docker_network_cleanup.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_endpoint_refresh.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_executor.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_jetbrains_cmd.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_jetbrains_recovery.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_llm_auth_stop.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_orchestrator.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_orphan_pins.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_orphaned_workloads.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_packaging_data.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_process_chains.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_projects_cmd.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_quick_cmd.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_resources_quick.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_security_quick.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_service_cleanup.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_service_scanner.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_storage_analyzer.py +0 -0
- {fixos-2.2.49 → fixos-2.2.51}/tests/unit/test_system_checks_parallel.py +0 -0
|
@@ -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"
|