mcli-framework 7.0.0__tar.gz → 7.0.4__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.
Potentially problematic release.
This version of mcli-framework might be problematic. Click here for more details.
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/PKG-INFO +1 -1
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/pyproject.toml +1 -1
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/app/completion_helpers.py +6 -2
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/app/logs_cmd.py +26 -27
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/app/model_cmd.py +102 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/logger/logger.py +5 -7
- mcli_framework-7.0.4/src/mcli/lib/paths.py +82 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/self/self_cmd.py +58 -1
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/model_service/lightweight_model_server.py +37 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli_framework.egg-info/PKG-INFO +1 -1
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli_framework.egg-info/SOURCES.txt +2 -0
- mcli_framework-7.0.4/tests/test_model_cmd.py +362 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/.github/dependabot.yml +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/.github/workflows/build.yml +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/.github/workflows/ci.yml +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/.github/workflows/ml-pipeline.yml +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/.github/workflows/publish-self-hosted.yml +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/.github/workflows/publish.yml +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/.github/workflows/release.yml +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/.github/workflows/security.yml +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/.github/workflows/test.yml +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/LICENSE +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/MANIFEST.in +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/PERFORMANCE_OPTIMIZATIONS.md +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/README.md +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/mcli_rust/Cargo.toml +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/mcli_rust/src/command_parser.rs +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/mcli_rust/src/file_watcher.rs +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/mcli_rust/src/lib.rs +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/mcli_rust/src/process_manager.rs +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/mcli_rust/src/tfidf.rs +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/setup.cfg +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/app/chat_cmd.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/app/commands_cmd.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/app/completion_cmd.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/app/cron_test_cmd.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/app/main.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/app/model/model.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/app/redis_cmd.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/app/video/video.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/app/visual_cmd.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/chat/chat.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/chat/command_rag.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/chat/enhanced_chat.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/chat/system_controller.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/chat/system_integration.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/cli.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/config.toml +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/api/api.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/api/daemon_client.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/api/daemon_client_local.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/api/daemon_decorator.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/api/mcli_decorators.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/auth/auth.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/auth/aws_manager.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/auth/azure_manager.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/auth/credential_manager.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/auth/gcp_manager.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/auth/key_manager.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/auth/mcli_manager.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/auth/token_manager.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/auth/token_util.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/config/config.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/discovery/__init__.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/discovery/command_discovery.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/erd/erd.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/erd/generate_graph.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/files/files.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/fs/fs.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/lib.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/performance/optimizer.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/performance/rust_bridge.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/performance/uvloop_config.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/pickles/pickles.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/search/cached_vectorizer.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/services/data_pipeline.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/services/lsh_client.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/services/redis_service.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/shell/shell.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/toml/toml.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/ui/styling.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/ui/visual_effects.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/watcher/watcher.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/app.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/middleware.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/routers/admin_router.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/routers/auth_router.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/routers/backtest_router.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/routers/data_router.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/routers/model_router.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/routers/monitoring_router.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/routers/portfolio_router.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/routers/prediction_router.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/routers/trade_router.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/routers/websocket_router.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/schemas.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/auth/auth_manager.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/auth/models.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/auth/permissions.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/backtesting/backtest_engine.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/backtesting/performance_metrics.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/cache.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/cli/main.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/config/settings.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/configs/dvc_config.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/configs/mlflow_config.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/configs/mlops_manager.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/dashboard/app.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/dashboard/app_integrated.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/dashboard/app_supabase.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/dashboard/app_training.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/dashboard/cli.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/data_ingestion/api_connectors.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/data_ingestion/data_pipeline.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/data_ingestion/stream_processor.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/database/migrations/env.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/database/models.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/database/session.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/experimentation/ab_testing.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/features/ensemble_features.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/features/political_features.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/features/recommendation_engine.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/features/stock_features.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/features/test_feature_engineering.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/logging.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/mlops/data_versioning.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/mlops/experiment_tracker.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/mlops/model_serving.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/mlops/pipeline_orchestrator.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/models/base_models.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/models/ensemble_models.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/models/recommendation_models.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/models/test_models.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/monitoring/drift_detection.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/monitoring/metrics.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/optimization/portfolio_optimizer.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/preprocessing/data_cleaners.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/preprocessing/feature_extractors.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/preprocessing/ml_pipeline.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/preprocessing/politician_trading_preprocessor.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/preprocessing/test_preprocessing.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/scripts/populate_sample_data.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/tasks.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/tests/test_integration.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/tests/test_training_dashboard.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/public/oi/oi.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/public/public.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/daemon/api_daemon.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/daemon/async_command_database.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/daemon/async_process_manager.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/daemon/client.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/daemon/commands.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/daemon/daemon.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/daemon/daemon_api.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/daemon/enhanced_daemon.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/daemon/process_cli.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/daemon/process_manager.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/daemon/test_daemon.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/dashboard/dashboard_cmd.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/docker/docker.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/file/file.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/gcloud/config.toml +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/gcloud/gcloud.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/git_commit/ai_service.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/git_commit/commands.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/lsh_integration.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/model_service/client.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/model_service/download_and_run_efficient_models.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/model_service/lightweight_embedder.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/model_service/lightweight_test.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/model_service/model_service.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/model_service/ollama_efficient_runner.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/model_service/pdf_processor.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/model_service/test_efficient_runner.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/model_service/test_example.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/model_service/test_integration.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/model_service/test_new_features.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/openai/openai.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/commands.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/config.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/connectivity.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/data_sources.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/database.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/demo.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/models.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/monitoring.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/scrapers.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/scrapers_california.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/scrapers_eu.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/scrapers_uk.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/scrapers_us_states.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/supabase_functions.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/workflow.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/registry/registry.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/repo/repo.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/scheduler/commands.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/scheduler/cron_parser.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/scheduler/job.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/scheduler/monitor.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/scheduler/persistence.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/scheduler/scheduler.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/sync/sync_cmd.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/sync/test_cmd.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/videos/videos.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/wakatime/wakatime.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/workflow.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli_framework.egg-info/dependency_links.txt +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli_framework.egg-info/entry_points.txt +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli_framework.egg-info/requires.txt +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli_framework.egg-info/top_level.txt +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/conftest.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/demo_generate_graph.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/demo_hierarchical_transform.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/end_to_end_integration_test.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/pytest.ini +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/run_tests.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/simple_integration_test.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_agent_functionality.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_all_cli.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_auth.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_california_scraper.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_chat_client.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_chat_cmd.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_chat_system_control.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_command_discovery.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_congress_scraper.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_daemon.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_daemon_client.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_data_pipeline.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_enhanced_chat.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_erd.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_erd_import.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_file.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_fix.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_fixed_issues.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_gcloud.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_generate_graph.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_generic_erd.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_harness.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_lib.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_lsh_client.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_lsh_integration.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_main_app.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_main_app_functions.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_ml_auth.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_ml_models.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_ml_pipeline.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_oi.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_optional_dependencies.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_politician_trading_integration.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_preprocessing_simple.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_registry.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_repo.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_rich.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_self.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_uk_scraper.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_us_states_scraper.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_utility_functions.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_utility_functions_simple.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_uv_compatibility.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_videos.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_wakatime.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_webapp.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_webapp_comprehensive.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_workflow.py +0 -0
- {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_workflow_integration.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcli-framework
|
|
3
|
-
Version: 7.0.
|
|
3
|
+
Version: 7.0.4
|
|
4
4
|
Summary: 🚀 High-performance CLI framework with Rust extensions, AI chat, and stunning visuals
|
|
5
5
|
Author-email: Luis Fernandez de la Vara <luis@lefv.io>
|
|
6
6
|
Maintainer-email: Luis Fernandez de la Vara <luis@lefv.io>
|
|
@@ -16,6 +16,8 @@ from rich.live import Live
|
|
|
16
16
|
from rich.panel import Panel
|
|
17
17
|
from rich.text import Text
|
|
18
18
|
|
|
19
|
+
from mcli.lib.paths import get_logs_dir
|
|
20
|
+
|
|
19
21
|
console = Console()
|
|
20
22
|
|
|
21
23
|
|
|
@@ -25,6 +27,24 @@ def logs_group():
|
|
|
25
27
|
pass
|
|
26
28
|
|
|
27
29
|
|
|
30
|
+
@logs_group.command(name="location")
|
|
31
|
+
def show_location():
|
|
32
|
+
"""Show the location of the logs directory"""
|
|
33
|
+
logs_dir = get_logs_dir()
|
|
34
|
+
console.print(f"📁 [cyan]Logs directory:[/cyan] {logs_dir}")
|
|
35
|
+
console.print(f" [dim]Set MCLI_HOME environment variable to change location[/dim]")
|
|
36
|
+
|
|
37
|
+
# Show if directory exists and has files
|
|
38
|
+
if logs_dir.exists():
|
|
39
|
+
log_files = list(logs_dir.glob("mcli*.log"))
|
|
40
|
+
if log_files:
|
|
41
|
+
console.print(f" [green]✓ {len(log_files)} log file(s) found[/green]")
|
|
42
|
+
else:
|
|
43
|
+
console.print(f" [yellow]⚠ Directory exists but no log files yet[/yellow]")
|
|
44
|
+
else:
|
|
45
|
+
console.print(f" [yellow]⚠ Directory will be created on first use[/yellow]")
|
|
46
|
+
|
|
47
|
+
|
|
28
48
|
@logs_group.command(name="stream")
|
|
29
49
|
@click.option(
|
|
30
50
|
"--type",
|
|
@@ -49,13 +69,7 @@ def stream_logs(type: str, lines: int, follow: bool):
|
|
|
49
69
|
Shows log output with syntax highlighting and real-time updates.
|
|
50
70
|
Similar to 'tail -f' but with enhanced formatting for MCLI logs.
|
|
51
71
|
"""
|
|
52
|
-
logs_dir =
|
|
53
|
-
|
|
54
|
-
if not logs_dir.exists():
|
|
55
|
-
console.print(
|
|
56
|
-
"❌ No logs directory found. Run some MCLI commands to generate logs.", style="red"
|
|
57
|
-
)
|
|
58
|
-
return
|
|
72
|
+
logs_dir = get_logs_dir()
|
|
59
73
|
|
|
60
74
|
# Get today's log files
|
|
61
75
|
today = datetime.now().strftime("%Y%m%d")
|
|
@@ -98,12 +112,7 @@ def stream_logs(type: str, lines: int, follow: bool):
|
|
|
98
112
|
@click.option("--date", "-d", help="Show logs for specific date (YYYYMMDD format)")
|
|
99
113
|
def list_logs(date: Optional[str]):
|
|
100
114
|
"""List available log files"""
|
|
101
|
-
logs_dir =
|
|
102
|
-
|
|
103
|
-
if not logs_dir.exists():
|
|
104
|
-
console.print("❌ No logs directory found", style="red")
|
|
105
|
-
return
|
|
106
|
-
|
|
115
|
+
logs_dir = get_logs_dir()
|
|
107
116
|
_list_available_logs(logs_dir, date)
|
|
108
117
|
|
|
109
118
|
|
|
@@ -113,11 +122,9 @@ def list_logs(date: Optional[str]):
|
|
|
113
122
|
@click.option("--date", "-d", help="Date for log file (YYYYMMDD format, default: today)")
|
|
114
123
|
def tail_logs(log_type: str, lines: int, date: Optional[str]):
|
|
115
124
|
"""Show the last N lines of a specific log file"""
|
|
116
|
-
logs_dir =
|
|
125
|
+
logs_dir = get_logs_dir()
|
|
117
126
|
|
|
118
|
-
|
|
119
|
-
console.print("❌ No logs directory found", style="red")
|
|
120
|
-
return
|
|
127
|
+
# Note: get_logs_dir() creates the directory automatically
|
|
121
128
|
|
|
122
129
|
# Use provided date or default to today
|
|
123
130
|
log_date = date or datetime.now().strftime("%Y%m%d")
|
|
@@ -168,11 +175,7 @@ def tail_logs(log_type: str, lines: int, date: Optional[str]):
|
|
|
168
175
|
)
|
|
169
176
|
def grep_logs(pattern: str, type: str, date: Optional[str], context: int):
|
|
170
177
|
"""Search for patterns in log files"""
|
|
171
|
-
logs_dir =
|
|
172
|
-
|
|
173
|
-
if not logs_dir.exists():
|
|
174
|
-
console.print("❌ No logs directory found", style="red")
|
|
175
|
-
return
|
|
178
|
+
logs_dir = get_logs_dir()
|
|
176
179
|
|
|
177
180
|
# Use provided date or default to today
|
|
178
181
|
log_date = date or datetime.now().strftime("%Y%m%d")
|
|
@@ -216,11 +219,7 @@ def grep_logs(pattern: str, type: str, date: Optional[str], context: int):
|
|
|
216
219
|
@click.option("--confirm", "-y", is_flag=True, help="Skip confirmation prompt")
|
|
217
220
|
def clear_logs(older_than: Optional[int], confirm: bool):
|
|
218
221
|
"""Clear old log files"""
|
|
219
|
-
logs_dir =
|
|
220
|
-
|
|
221
|
-
if not logs_dir.exists():
|
|
222
|
-
console.print("❌ No logs directory found", style="red")
|
|
223
|
-
return
|
|
222
|
+
logs_dir = get_logs_dir()
|
|
224
223
|
|
|
225
224
|
# Find log files
|
|
226
225
|
log_files = list(logs_dir.glob("mcli*.log"))
|
|
@@ -7,6 +7,7 @@ from pathlib import Path
|
|
|
7
7
|
from typing import Optional
|
|
8
8
|
|
|
9
9
|
import click
|
|
10
|
+
import psutil
|
|
10
11
|
|
|
11
12
|
from mcli.lib.logger.logger import get_logger
|
|
12
13
|
from mcli.workflow.model_service.lightweight_model_server import (
|
|
@@ -223,5 +224,106 @@ def status(port: int):
|
|
|
223
224
|
click.echo(f"❌ Error checking server: {e}")
|
|
224
225
|
|
|
225
226
|
|
|
227
|
+
@model.command()
|
|
228
|
+
@click.option("--port", "-p", default=8080, help="Port where server is running")
|
|
229
|
+
def stop(port: int):
|
|
230
|
+
"""Stop the lightweight model server."""
|
|
231
|
+
import requests
|
|
232
|
+
import psutil
|
|
233
|
+
|
|
234
|
+
try:
|
|
235
|
+
# First check if server is running
|
|
236
|
+
try:
|
|
237
|
+
response = requests.get(f"http://localhost:{port}/health", timeout=2)
|
|
238
|
+
if response.status_code != 200:
|
|
239
|
+
click.echo(f"❌ No server running on port {port}")
|
|
240
|
+
return
|
|
241
|
+
except requests.exceptions.ConnectionError:
|
|
242
|
+
click.echo(f"❌ No server running on port {port}")
|
|
243
|
+
return
|
|
244
|
+
|
|
245
|
+
# Find and kill the process using the port
|
|
246
|
+
for proc in psutil.process_iter(["pid", "name", "connections"]):
|
|
247
|
+
try:
|
|
248
|
+
connections = proc.info.get("connections")
|
|
249
|
+
if connections:
|
|
250
|
+
for conn in connections:
|
|
251
|
+
if hasattr(conn, "laddr") and conn.laddr.port == port:
|
|
252
|
+
click.echo(f"🛑 Stopping server (PID: {proc.pid})...")
|
|
253
|
+
proc.terminate()
|
|
254
|
+
proc.wait(timeout=5)
|
|
255
|
+
click.echo("✅ Server stopped successfully")
|
|
256
|
+
return
|
|
257
|
+
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.TimeoutExpired):
|
|
258
|
+
continue
|
|
259
|
+
|
|
260
|
+
click.echo("⚠️ Could not find server process")
|
|
261
|
+
|
|
262
|
+
except Exception as e:
|
|
263
|
+
click.echo(f"❌ Error stopping server: {e}")
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
@model.command()
|
|
267
|
+
@click.argument("model_name")
|
|
268
|
+
def pull(model_name: str):
|
|
269
|
+
"""Pull (download) a specific lightweight model."""
|
|
270
|
+
if model_name not in LIGHTWEIGHT_MODELS:
|
|
271
|
+
click.echo(f"❌ Model '{model_name}' not found.")
|
|
272
|
+
click.echo("Available models:")
|
|
273
|
+
for key in LIGHTWEIGHT_MODELS.keys():
|
|
274
|
+
click.echo(f" • {key}")
|
|
275
|
+
sys.exit(1)
|
|
276
|
+
|
|
277
|
+
server = LightweightModelServer()
|
|
278
|
+
|
|
279
|
+
click.echo(f"Pulling model: {model_name}")
|
|
280
|
+
success = server.download_and_load_model(model_name)
|
|
281
|
+
|
|
282
|
+
if success:
|
|
283
|
+
click.echo(f"✅ Successfully pulled {model_name}")
|
|
284
|
+
else:
|
|
285
|
+
click.echo(f"❌ Failed to pull {model_name}")
|
|
286
|
+
sys.exit(1)
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
@model.command()
|
|
290
|
+
@click.argument("model_name")
|
|
291
|
+
@click.option("--force", "-f", is_flag=True, help="Force deletion without confirmation")
|
|
292
|
+
def delete(model_name: str, force: bool):
|
|
293
|
+
"""Delete a downloaded lightweight model."""
|
|
294
|
+
server = LightweightModelServer()
|
|
295
|
+
downloaded_models = server.downloader.get_downloaded_models()
|
|
296
|
+
|
|
297
|
+
if model_name not in downloaded_models:
|
|
298
|
+
click.echo(f"❌ Model '{model_name}' not found.")
|
|
299
|
+
click.echo("Downloaded models:")
|
|
300
|
+
if downloaded_models:
|
|
301
|
+
for model in downloaded_models:
|
|
302
|
+
click.echo(f" • {model}")
|
|
303
|
+
else:
|
|
304
|
+
click.echo(" (none)")
|
|
305
|
+
sys.exit(1)
|
|
306
|
+
|
|
307
|
+
# Confirm deletion unless --force is used
|
|
308
|
+
if not force:
|
|
309
|
+
model_info = LIGHTWEIGHT_MODELS.get(model_name, {})
|
|
310
|
+
name = model_info.get("name", model_name)
|
|
311
|
+
size = model_info.get("size_mb", "unknown")
|
|
312
|
+
click.echo(f"⚠️ About to delete:")
|
|
313
|
+
click.echo(f" Model: {name}")
|
|
314
|
+
click.echo(f" Size: {size} MB")
|
|
315
|
+
if not click.confirm("Are you sure you want to delete this model?"):
|
|
316
|
+
click.echo("❌ Deletion cancelled")
|
|
317
|
+
return
|
|
318
|
+
|
|
319
|
+
success = server.delete_model(model_name)
|
|
320
|
+
|
|
321
|
+
if success:
|
|
322
|
+
click.echo(f"✅ Successfully deleted {model_name}")
|
|
323
|
+
else:
|
|
324
|
+
click.echo(f"❌ Failed to delete {model_name}")
|
|
325
|
+
sys.exit(1)
|
|
326
|
+
|
|
327
|
+
|
|
226
328
|
if __name__ == "__main__":
|
|
227
329
|
model()
|
|
@@ -208,13 +208,11 @@ class McliLogger:
|
|
|
208
208
|
|
|
209
209
|
# Set up file handler with path resolution
|
|
210
210
|
try:
|
|
211
|
-
#
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
#
|
|
215
|
-
|
|
216
|
-
log_dir = project_root / "logs"
|
|
217
|
-
log_dir.mkdir(exist_ok=True)
|
|
211
|
+
# Import paths utility for consistent path resolution
|
|
212
|
+
from mcli.lib.paths import get_logs_dir
|
|
213
|
+
|
|
214
|
+
# Get logs directory (e.g., ~/.mcli/logs)
|
|
215
|
+
log_dir = get_logs_dir()
|
|
218
216
|
|
|
219
217
|
# Create daily log file
|
|
220
218
|
timestamp = datetime.now().strftime("%Y%m%d")
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Path resolution utilities for mcli
|
|
3
|
+
|
|
4
|
+
Provides consistent path resolution for logs, config, and data directories
|
|
5
|
+
that work both when running from source and when installed as a package.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import os
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Optional
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def get_mcli_home() -> Path:
|
|
14
|
+
"""
|
|
15
|
+
Get the mcli home directory for storing logs, config, and data.
|
|
16
|
+
|
|
17
|
+
Returns:
|
|
18
|
+
Path to ~/.mcli directory, created if it doesn't exist
|
|
19
|
+
"""
|
|
20
|
+
# Check for MCLI_HOME environment variable first
|
|
21
|
+
mcli_home = os.getenv("MCLI_HOME")
|
|
22
|
+
if mcli_home:
|
|
23
|
+
path = Path(mcli_home)
|
|
24
|
+
else:
|
|
25
|
+
# Use XDG_DATA_HOME if set, otherwise default to ~/.mcli
|
|
26
|
+
xdg_data_home = os.getenv("XDG_DATA_HOME")
|
|
27
|
+
if xdg_data_home:
|
|
28
|
+
path = Path(xdg_data_home) / "mcli"
|
|
29
|
+
else:
|
|
30
|
+
path = Path.home() / ".mcli"
|
|
31
|
+
|
|
32
|
+
# Create directory if it doesn't exist
|
|
33
|
+
path.mkdir(parents=True, exist_ok=True)
|
|
34
|
+
return path
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def get_logs_dir() -> Path:
|
|
38
|
+
"""
|
|
39
|
+
Get the logs directory for mcli.
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
Path to logs directory (e.g., ~/.mcli/logs), created if it doesn't exist
|
|
43
|
+
"""
|
|
44
|
+
logs_dir = get_mcli_home() / "logs"
|
|
45
|
+
logs_dir.mkdir(parents=True, exist_ok=True)
|
|
46
|
+
return logs_dir
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def get_config_dir() -> Path:
|
|
50
|
+
"""
|
|
51
|
+
Get the config directory for mcli.
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
Path to config directory (e.g., ~/.mcli/config), created if it doesn't exist
|
|
55
|
+
"""
|
|
56
|
+
config_dir = get_mcli_home() / "config"
|
|
57
|
+
config_dir.mkdir(parents=True, exist_ok=True)
|
|
58
|
+
return config_dir
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def get_data_dir() -> Path:
|
|
62
|
+
"""
|
|
63
|
+
Get the data directory for mcli.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
Path to data directory (e.g., ~/.mcli/data), created if it doesn't exist
|
|
67
|
+
"""
|
|
68
|
+
data_dir = get_mcli_home() / "data"
|
|
69
|
+
data_dir.mkdir(parents=True, exist_ok=True)
|
|
70
|
+
return data_dir
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def get_cache_dir() -> Path:
|
|
74
|
+
"""
|
|
75
|
+
Get the cache directory for mcli.
|
|
76
|
+
|
|
77
|
+
Returns:
|
|
78
|
+
Path to cache directory (e.g., ~/.mcli/cache), created if it doesn't exist
|
|
79
|
+
"""
|
|
80
|
+
cache_dir = get_mcli_home() / "cache"
|
|
81
|
+
cache_dir.mkdir(parents=True, exist_ok=True)
|
|
82
|
+
return cache_dir
|
|
@@ -1129,11 +1129,53 @@ def dashboard(refresh: float, once: bool):
|
|
|
1129
1129
|
console.print(f"[red]Error launching dashboard: {e}[/red]")
|
|
1130
1130
|
|
|
1131
1131
|
|
|
1132
|
+
def check_ci_status(version: str) -> tuple[bool, Optional[str]]:
|
|
1133
|
+
"""
|
|
1134
|
+
Check GitHub Actions CI status for the main branch.
|
|
1135
|
+
Returns (passing, url) tuple.
|
|
1136
|
+
"""
|
|
1137
|
+
try:
|
|
1138
|
+
import requests
|
|
1139
|
+
|
|
1140
|
+
response = requests.get(
|
|
1141
|
+
"https://api.github.com/repos/gwicho38/mcli/actions/runs",
|
|
1142
|
+
params={"per_page": 5},
|
|
1143
|
+
headers={
|
|
1144
|
+
"Accept": "application/vnd.github.v3+json",
|
|
1145
|
+
"User-Agent": "mcli-cli"
|
|
1146
|
+
},
|
|
1147
|
+
timeout=10
|
|
1148
|
+
)
|
|
1149
|
+
|
|
1150
|
+
if response.status_code == 200:
|
|
1151
|
+
data = response.json()
|
|
1152
|
+
runs = data.get("workflow_runs", [])
|
|
1153
|
+
|
|
1154
|
+
# Find the most recent completed run for main branch
|
|
1155
|
+
main_runs = [
|
|
1156
|
+
run for run in runs
|
|
1157
|
+
if run.get("head_branch") == "main" and run.get("status") == "completed"
|
|
1158
|
+
]
|
|
1159
|
+
|
|
1160
|
+
if main_runs:
|
|
1161
|
+
latest_run = main_runs[0]
|
|
1162
|
+
passing = latest_run.get("conclusion") == "success"
|
|
1163
|
+
url = latest_run.get("html_url")
|
|
1164
|
+
return (passing, url)
|
|
1165
|
+
|
|
1166
|
+
# If we can't check CI, don't block the update
|
|
1167
|
+
return (True, None)
|
|
1168
|
+
except Exception:
|
|
1169
|
+
# On error, don't block the update
|
|
1170
|
+
return (True, None)
|
|
1171
|
+
|
|
1172
|
+
|
|
1132
1173
|
@self_app.command()
|
|
1133
1174
|
@click.option("--check", is_flag=True, help="Only check for updates, don't install")
|
|
1134
1175
|
@click.option("--pre", is_flag=True, help="Include pre-release versions")
|
|
1135
1176
|
@click.option("--yes", "-y", is_flag=True, help="Skip confirmation prompt")
|
|
1136
|
-
|
|
1177
|
+
@click.option("--skip-ci-check", is_flag=True, help="Skip CI status check and install anyway")
|
|
1178
|
+
def update(check: bool, pre: bool, yes: bool, skip_ci_check: bool):
|
|
1137
1179
|
"""🔄 Check for and install mcli updates from PyPI"""
|
|
1138
1180
|
import subprocess
|
|
1139
1181
|
import sys
|
|
@@ -1215,6 +1257,21 @@ def update(check: bool, pre: bool, yes: bool):
|
|
|
1215
1257
|
console.print("[yellow]Update cancelled[/yellow]")
|
|
1216
1258
|
return
|
|
1217
1259
|
|
|
1260
|
+
# Check CI status before installing (unless skipped)
|
|
1261
|
+
if not skip_ci_check:
|
|
1262
|
+
console.print("[cyan]🔍 Checking CI status...[/cyan]")
|
|
1263
|
+
ci_passing, ci_url = check_ci_status(latest_version)
|
|
1264
|
+
|
|
1265
|
+
if not ci_passing:
|
|
1266
|
+
console.print("[red]✗ CI build is failing for the latest version[/red]")
|
|
1267
|
+
if ci_url:
|
|
1268
|
+
console.print(f"[yellow] View CI status: {ci_url}[/yellow]")
|
|
1269
|
+
console.print("[yellow]⚠️ Update blocked to prevent installing a broken version[/yellow]")
|
|
1270
|
+
console.print("[dim] Use --skip-ci-check to install anyway (not recommended)[/dim]")
|
|
1271
|
+
return
|
|
1272
|
+
else:
|
|
1273
|
+
console.print("[green]✓ CI build is passing[/green]")
|
|
1274
|
+
|
|
1218
1275
|
# Install update
|
|
1219
1276
|
console.print(f"[cyan]📦 Installing mcli {latest_version}...[/cyan]")
|
|
1220
1277
|
|
|
@@ -566,6 +566,43 @@ class LightweightModelServer:
|
|
|
566
566
|
else:
|
|
567
567
|
return "distilbert-base-uncased" # Standard small model
|
|
568
568
|
|
|
569
|
+
def stop_server(self) -> bool:
|
|
570
|
+
"""Stop the lightweight server"""
|
|
571
|
+
if not self.running:
|
|
572
|
+
print("⚠️ Server is not running")
|
|
573
|
+
return False
|
|
574
|
+
|
|
575
|
+
try:
|
|
576
|
+
self.running = False
|
|
577
|
+
print("🛑 Server stopped")
|
|
578
|
+
return True
|
|
579
|
+
except Exception as e:
|
|
580
|
+
print(f"❌ Error stopping server: {e}")
|
|
581
|
+
return False
|
|
582
|
+
|
|
583
|
+
def delete_model(self, model_key: str) -> bool:
|
|
584
|
+
"""Delete a downloaded model"""
|
|
585
|
+
try:
|
|
586
|
+
model_dir = self.models_dir / model_key
|
|
587
|
+
|
|
588
|
+
if not model_dir.exists():
|
|
589
|
+
print(f"⚠️ Model '{model_key}' not found")
|
|
590
|
+
return False
|
|
591
|
+
|
|
592
|
+
# Remove from loaded models if present
|
|
593
|
+
if model_key in self.loaded_models:
|
|
594
|
+
del self.loaded_models[model_key]
|
|
595
|
+
print(f"✅ Unloaded model: {model_key}")
|
|
596
|
+
|
|
597
|
+
# Delete the model directory
|
|
598
|
+
shutil.rmtree(model_dir)
|
|
599
|
+
print(f"✅ Deleted model: {model_key}")
|
|
600
|
+
return True
|
|
601
|
+
|
|
602
|
+
except Exception as e:
|
|
603
|
+
print(f"❌ Error deleting model {model_key}: {e}")
|
|
604
|
+
return False
|
|
605
|
+
|
|
569
606
|
|
|
570
607
|
def create_simple_client():
|
|
571
608
|
"""Create a simple client script for testing"""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcli-framework
|
|
3
|
-
Version: 7.0.
|
|
3
|
+
Version: 7.0.4
|
|
4
4
|
Summary: 🚀 High-performance CLI framework with Rust extensions, AI chat, and stunning visuals
|
|
5
5
|
Author-email: Luis Fernandez de la Vara <luis@lefv.io>
|
|
6
6
|
Maintainer-email: Luis Fernandez de la Vara <luis@lefv.io>
|
|
@@ -39,6 +39,7 @@ src/mcli/chat/enhanced_chat.py
|
|
|
39
39
|
src/mcli/chat/system_controller.py
|
|
40
40
|
src/mcli/chat/system_integration.py
|
|
41
41
|
src/mcli/lib/lib.py
|
|
42
|
+
src/mcli/lib/paths.py
|
|
42
43
|
src/mcli/lib/api/api.py
|
|
43
44
|
src/mcli/lib/api/daemon_client.py
|
|
44
45
|
src/mcli/lib/api/daemon_client_local.py
|
|
@@ -242,6 +243,7 @@ tests/test_main_app_functions.py
|
|
|
242
243
|
tests/test_ml_auth.py
|
|
243
244
|
tests/test_ml_models.py
|
|
244
245
|
tests/test_ml_pipeline.py
|
|
246
|
+
tests/test_model_cmd.py
|
|
245
247
|
tests/test_oi.py
|
|
246
248
|
tests/test_optional_dependencies.py
|
|
247
249
|
tests/test_politician_trading_integration.py
|