mcli-framework 7.8.2__tar.gz → 7.8.3__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.8.2 → mcli_framework-7.8.3}/PKG-INFO +1 -1
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/pyproject.toml +1 -1
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/dashboard/app_supabase.py +1 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/self/self_cmd.py +8 -0
- mcli_framework-7.8.3/src/mcli/self/store_cmd.py +422 -0
- mcli_framework-7.8.3/src/mcli/workflow/dashboard/dashboard_cmd.py +179 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli_framework.egg-info/PKG-INFO +1 -1
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli_framework.egg-info/SOURCES.txt +3 -0
- mcli_framework-7.8.3/tests/unit/test_store_cmd.py +462 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/.github/dependabot.yml +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/.github/workflows/build.yml +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/.github/workflows/ci.yml +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/.github/workflows/ml-pipeline.yml +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/.github/workflows/publish-self-hosted.yml +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/.github/workflows/publish.yml +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/.github/workflows/release.yml +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/.github/workflows/security.yml +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/.github/workflows/test.yml +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/LICENSE +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/MANIFEST.in +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/README.md +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/mcli_rust/Cargo.toml +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/mcli_rust/src/command_parser.rs +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/mcli_rust/src/file_watcher.rs +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/mcli_rust/src/lib.rs +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/mcli_rust/src/process_manager.rs +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/mcli_rust/src/tfidf.rs +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/setup.cfg +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/app/chat_cmd.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/app/commands_cmd.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/app/completion_helpers.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/app/main.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/app/model/model.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/app/model_cmd.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/app/video/video.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/chat/chat.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/chat/command_rag.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/chat/enhanced_chat.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/chat/system_controller.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/chat/system_integration.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/cli.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/config.toml +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/api/api.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/api/daemon_client.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/api/daemon_client_local.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/api/daemon_decorator.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/api/mcli_decorators.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/auth/auth.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/auth/aws_manager.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/auth/azure_manager.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/auth/credential_manager.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/auth/gcp_manager.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/auth/key_manager.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/auth/mcli_manager.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/auth/token_manager.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/auth/token_util.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/config/config.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/custom_commands.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/discovery/__init__.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/discovery/command_discovery.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/erd/erd.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/erd/generate_graph.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/files/files.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/fs/fs.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/lib.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/logger/logger.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/paths.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/performance/optimizer.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/performance/rust_bridge.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/performance/uvloop_config.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/pickles/pickles.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/search/cached_vectorizer.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/services/data_pipeline.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/services/lsh_client.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/services/redis_service.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/shell/shell.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/toml/toml.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/ui/styling.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/ui/visual_effects.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/lib/watcher/watcher.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/api/app.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/api/middleware.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/api/routers/admin_router.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/api/routers/auth_router.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/api/routers/backtest_router.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/api/routers/data_router.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/api/routers/model_router.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/api/routers/monitoring_router.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/api/routers/portfolio_router.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/api/routers/prediction_router.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/api/routers/trade_router.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/api/routers/websocket_router.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/api/schemas.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/auth/auth_manager.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/auth/models.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/auth/permissions.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/backtesting/backtest_engine.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/backtesting/performance_metrics.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/cache.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/cli/main.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/config/settings.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/configs/dvc_config.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/configs/mlflow_config.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/configs/mlops_manager.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/dashboard/app.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/dashboard/app_integrated.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/dashboard/app_training.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/dashboard/cli.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/dashboard/common.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/dashboard/components/charts.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/dashboard/components/metrics.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/dashboard/components/tables.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/dashboard/overview.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/dashboard/pages/cicd.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/dashboard/pages/debug_dependencies.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/dashboard/pages/gravity_viz.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/dashboard/pages/monte_carlo_predictions.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/dashboard/pages/predictions_enhanced.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/dashboard/pages/scrapers_and_logs.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/dashboard/pages/test_portfolio.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/dashboard/pages/trading.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/dashboard/pages/workflows.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/dashboard/streamlit_extras_utils.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/dashboard/styles.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/dashboard/utils.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/dashboard/warning_suppression.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/data_ingestion/api_connectors.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/data_ingestion/data_pipeline.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/data_ingestion/stream_processor.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/database/migrations/env.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/database/models.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/database/session.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/experimentation/ab_testing.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/features/ensemble_features.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/features/political_features.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/features/recommendation_engine.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/features/stock_features.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/features/test_feature_engineering.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/logging.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/mlops/data_versioning.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/mlops/experiment_tracker.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/mlops/model_serving.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/mlops/pipeline_orchestrator.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/models/base_models.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/models/ensemble_models.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/models/recommendation_models.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/models/test_models.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/monitoring/drift_detection.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/monitoring/metrics.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/optimization/portfolio_optimizer.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/predictions/monte_carlo.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/predictions/prediction_engine.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/preprocessing/data_cleaners.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/preprocessing/feature_extractors.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/preprocessing/ml_pipeline.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/preprocessing/politician_trading_preprocessor.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/preprocessing/test_preprocessing.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/scripts/populate_sample_data.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/tasks.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/tests/test_integration.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/tests/test_training_dashboard.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/trading/alpaca_client.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/trading/migrations.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/trading/models.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/trading/paper_trading.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/trading/risk_management.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/trading/trading_service.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/ml/training/train_model.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/mygroup/test_cmd.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/public/oi/oi.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/public/public.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/self/completion_cmd.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/self/logs_cmd.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/self/redis_cmd.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/self/test_cmd.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/self/visual_cmd.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/test/cron_test_cmd.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/test/test_cmd.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/daemon/async_command_database.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/daemon/async_process_manager.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/daemon/client.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/daemon/daemon.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/daemon/daemon_api.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/daemon/enhanced_daemon.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/daemon/process_cli.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/daemon/process_manager.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/daemon/test_daemon.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/docker/docker.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/gcloud/config.toml +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/gcloud/gcloud.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/git_commit/ai_service.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/lsh_integration.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/model_service/client.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/model_service/download_and_run_efficient_models.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/model_service/lightweight_embedder.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/model_service/lightweight_model_server.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/model_service/lightweight_test.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/model_service/model_service.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/model_service/ollama_efficient_runner.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/model_service/openai_adapter.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/model_service/pdf_processor.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/model_service/test_efficient_runner.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/model_service/test_example.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/model_service/test_integration.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/model_service/test_new_features.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/openai/openai.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/politician_trading/config.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/politician_trading/connectivity.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/politician_trading/data_sources.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/politician_trading/database.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/politician_trading/demo.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/politician_trading/models.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/politician_trading/monitoring.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/politician_trading/scrapers.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/politician_trading/scrapers_california.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/politician_trading/scrapers_corporate_registry.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/politician_trading/scrapers_eu.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/politician_trading/scrapers_free_sources.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/politician_trading/scrapers_third_party.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/politician_trading/scrapers_uk.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/politician_trading/scrapers_us_states.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/politician_trading/seed_database.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/politician_trading/supabase_functions.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/politician_trading/workflow.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/registry/registry.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/repo/repo.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/scheduler/cron_parser.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/scheduler/job.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/scheduler/monitor.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/scheduler/persistence.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/scheduler/scheduler.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/sync/test_cmd.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/wakatime/wakatime.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli/workflow/workflow.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli_framework.egg-info/dependency_links.txt +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli_framework.egg-info/entry_points.txt +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli_framework.egg-info/requires.txt +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/src/mcli_framework.egg-info/top_level.txt +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/cli/test_all_commands.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/cli/test_app_logs_cmd.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/cli/test_app_redis_cmd.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/cli/test_chat_cmd.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/cli/test_logs_cmd.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/cli/test_main_app.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/cli/test_model_cmd.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/cli/test_self_cmd.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/cli/test_self_cmd_commands.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/cli/test_self_cmd_plugins.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/cli/test_self_cmd_utilities.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/cli/test_workflow_file.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/cli/test_workflow_gcloud.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/cli/test_workflow_registry.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/conftest.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/demo_generate_graph.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/demo_hierarchical_transform.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/e2e/test_complete_workflows.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/e2e/test_model_workflow.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/e2e/test_new_user_workflow.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/e2e/test_update_workflow.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/fixtures/chat_fixtures.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/fixtures/cli_fixtures.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/fixtures/data_fixtures.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/fixtures/db_fixtures.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/fixtures/model_fixtures.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_agent.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_california_scraper.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_chat_client.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_chat_system.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_congress_scraper.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_daemon_client.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_daemon_server.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_e2e_dashboard_lsh_supabase.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_flask_webapp.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_gcloud_services.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_lsh_client.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_lsh_service.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_ml_auth.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_ml_data_pipeline.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_ml_models.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_ml_pipeline.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_module_imports.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_oi_service.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_politician_trading.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_repo_operations.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_scheduler_integration.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_service_registry.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_supabase_live_connection.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_uk_scraper.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_us_states_scraper.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_video_processing.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_wakatime_api.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_webapp_full.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_workflow.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/integration/test_workflow_commands.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/run_tests.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/test_harness.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/test_openai_adapter.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_api_utils.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_async_process_manager.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_auth_modules.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_bug_fixes.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_config.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_custom_commands.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_daemon_api.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_dashboard_components.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_dashboard_functions.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_dashboard_pages.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_dependencies.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_emulator_workflow.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_erd_generation.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_erd_generic.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_erd_imports.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_git_commit_workflow.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_lib_auth.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_lib_files.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_lib_utils.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_logger.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_ml_preprocessing.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_paths.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_pdf_compress.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_prediction_engine.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_regression.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_scheduler.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_scheduler_cron_parser.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_scheduler_job.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_scheduler_monitor.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_scheduler_persistence.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_self_update.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_supabase_connection.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_supabase_pagination.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_toml_utils.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_trading_imports.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_ui_rich.py +0 -0
- {mcli_framework-7.8.2 → mcli_framework-7.8.3}/tests/unit/test_uv_compat.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcli-framework
|
|
3
|
-
Version: 7.8.
|
|
3
|
+
Version: 7.8.3
|
|
4
4
|
Summary: Portable workflow framework - transform any script into a versioned, schedulable command. Store in ~/.mcli/commands/, version with lockfile, run as daemon or cron job.
|
|
5
5
|
Author-email: Luis Fernandez de la Vara <luis@lefv.io>
|
|
6
6
|
Maintainer-email: Luis Fernandez de la Vara <luis@lefv.io>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "mcli-framework"
|
|
3
|
-
version = "7.8.
|
|
3
|
+
version = "7.8.3"
|
|
4
4
|
description = "Portable workflow framework - transform any script into a versioned, schedulable command. Store in ~/.mcli/commands/, version with lockfile, run as daemon or cron job."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.9"
|
|
@@ -1280,6 +1280,14 @@ try:
|
|
|
1280
1280
|
except ImportError as e:
|
|
1281
1281
|
logger.debug(f"Could not load visual command: {e}")
|
|
1282
1282
|
|
|
1283
|
+
try:
|
|
1284
|
+
from mcli.self.store_cmd import store
|
|
1285
|
+
|
|
1286
|
+
self_app.add_command(store, name="store")
|
|
1287
|
+
logger.debug("Added store command to self group")
|
|
1288
|
+
except ImportError as e:
|
|
1289
|
+
logger.debug(f"Could not load store command: {e}")
|
|
1290
|
+
|
|
1283
1291
|
# This part is important to make the command available to the CLI
|
|
1284
1292
|
if __name__ == "__main__":
|
|
1285
1293
|
self_app()
|
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Command Store Management - Sync ~/.mcli/commands/ to git
|
|
3
|
+
Similar to lsh secrets but for workflow commands
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import click
|
|
7
|
+
import os
|
|
8
|
+
import shutil
|
|
9
|
+
import subprocess
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from datetime import datetime
|
|
12
|
+
from mcli.lib.ui.styling import success, error, info, warning
|
|
13
|
+
from mcli.lib.logger.logger import get_logger
|
|
14
|
+
|
|
15
|
+
logger = get_logger()
|
|
16
|
+
|
|
17
|
+
# Default store location
|
|
18
|
+
DEFAULT_STORE_PATH = Path.home() / "repos" / "mcli-commands"
|
|
19
|
+
COMMANDS_PATH = Path.home() / ".mcli" / "commands"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@click.group(name="store")
|
|
23
|
+
def store():
|
|
24
|
+
"""Manage command store - sync ~/.mcli/commands/ to git"""
|
|
25
|
+
pass
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@store.command(name="init")
|
|
29
|
+
@click.option("--path", "-p", type=click.Path(), help=f"Store path (default: {DEFAULT_STORE_PATH})")
|
|
30
|
+
@click.option("--remote", "-r", help="Git remote URL (optional)")
|
|
31
|
+
def init_store(path, remote):
|
|
32
|
+
"""Initialize command store with git"""
|
|
33
|
+
store_path = Path(path) if path else DEFAULT_STORE_PATH
|
|
34
|
+
|
|
35
|
+
try:
|
|
36
|
+
# Create store directory
|
|
37
|
+
store_path.mkdir(parents=True, exist_ok=True)
|
|
38
|
+
|
|
39
|
+
# Initialize git if not already initialized
|
|
40
|
+
git_dir = store_path / ".git"
|
|
41
|
+
if not git_dir.exists():
|
|
42
|
+
subprocess.run(["git", "init"], cwd=store_path, check=True, capture_output=True)
|
|
43
|
+
success(f"Initialized git repository at {store_path}")
|
|
44
|
+
|
|
45
|
+
# Create .gitignore
|
|
46
|
+
gitignore = store_path / ".gitignore"
|
|
47
|
+
gitignore.write_text("*.backup\n.DS_Store\n")
|
|
48
|
+
|
|
49
|
+
# Create README
|
|
50
|
+
readme = store_path / "README.md"
|
|
51
|
+
readme.write_text(
|
|
52
|
+
f"""# MCLI Commands Store
|
|
53
|
+
|
|
54
|
+
Personal workflow commands for mcli framework.
|
|
55
|
+
|
|
56
|
+
## Usage
|
|
57
|
+
|
|
58
|
+
Push commands:
|
|
59
|
+
```bash
|
|
60
|
+
mcli self store push
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Pull commands:
|
|
64
|
+
```bash
|
|
65
|
+
mcli self store pull
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Sync (bidirectional):
|
|
69
|
+
```bash
|
|
70
|
+
mcli self store sync
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Structure
|
|
74
|
+
|
|
75
|
+
All JSON command files from `~/.mcli/commands/` are stored here and version controlled.
|
|
76
|
+
|
|
77
|
+
Last updated: {datetime.now().isoformat()}
|
|
78
|
+
"""
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
# Add remote if provided
|
|
82
|
+
if remote:
|
|
83
|
+
subprocess.run(
|
|
84
|
+
["git", "remote", "add", "origin", remote], cwd=store_path, check=True
|
|
85
|
+
)
|
|
86
|
+
success(f"Added remote: {remote}")
|
|
87
|
+
else:
|
|
88
|
+
info(f"Git repository already exists at {store_path}")
|
|
89
|
+
|
|
90
|
+
# Save store path to config
|
|
91
|
+
config_file = Path.home() / ".mcli" / "store.conf"
|
|
92
|
+
config_file.parent.mkdir(parents=True, exist_ok=True)
|
|
93
|
+
config_file.write_text(str(store_path))
|
|
94
|
+
|
|
95
|
+
success(f"Command store initialized at {store_path}")
|
|
96
|
+
info(f"Store path saved to {config_file}")
|
|
97
|
+
|
|
98
|
+
except subprocess.CalledProcessError as e:
|
|
99
|
+
error(f"Git command failed: {e}")
|
|
100
|
+
logger.error(f"Git init failed: {e}")
|
|
101
|
+
except Exception as e:
|
|
102
|
+
error(f"Failed to initialize store: {e}")
|
|
103
|
+
logger.exception(e)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
@store.command(name="push")
|
|
107
|
+
@click.option("--message", "-m", help="Commit message")
|
|
108
|
+
@click.option("--all", "-a", is_flag=True, help="Push all files (including backups)")
|
|
109
|
+
def push_commands(message, all):
|
|
110
|
+
"""Push commands from ~/.mcli/commands/ to git store"""
|
|
111
|
+
try:
|
|
112
|
+
store_path = _get_store_path()
|
|
113
|
+
|
|
114
|
+
# Copy commands to store
|
|
115
|
+
info(f"Copying commands from {COMMANDS_PATH} to {store_path}...")
|
|
116
|
+
|
|
117
|
+
copied_count = 0
|
|
118
|
+
for item in COMMANDS_PATH.glob("*"):
|
|
119
|
+
# Skip backups unless --all specified
|
|
120
|
+
if not all and item.name.endswith(".backup"):
|
|
121
|
+
continue
|
|
122
|
+
|
|
123
|
+
dest = store_path / item.name
|
|
124
|
+
if item.is_file():
|
|
125
|
+
shutil.copy2(item, dest)
|
|
126
|
+
copied_count += 1
|
|
127
|
+
elif item.is_dir():
|
|
128
|
+
shutil.copytree(item, dest, dirs_exist_ok=True)
|
|
129
|
+
copied_count += 1
|
|
130
|
+
|
|
131
|
+
success(f"Copied {copied_count} items to store")
|
|
132
|
+
|
|
133
|
+
# Git add, commit, push
|
|
134
|
+
subprocess.run(["git", "add", "."], cwd=store_path, check=True)
|
|
135
|
+
|
|
136
|
+
# Check if there are changes
|
|
137
|
+
result = subprocess.run(
|
|
138
|
+
["git", "status", "--porcelain"], cwd=store_path, capture_output=True, text=True
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
if not result.stdout.strip():
|
|
142
|
+
info("No changes to commit")
|
|
143
|
+
return
|
|
144
|
+
|
|
145
|
+
# Commit with message
|
|
146
|
+
commit_msg = message or f"Update commands {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
|
|
147
|
+
subprocess.run(["git", "commit", "-m", commit_msg], cwd=store_path, check=True)
|
|
148
|
+
success(f"Committed changes: {commit_msg}")
|
|
149
|
+
|
|
150
|
+
# Push to remote if configured
|
|
151
|
+
try:
|
|
152
|
+
subprocess.run(["git", "push"], cwd=store_path, check=True, capture_output=True)
|
|
153
|
+
success("Pushed to remote")
|
|
154
|
+
except subprocess.CalledProcessError:
|
|
155
|
+
warning("No remote configured or push failed. Commands committed locally.")
|
|
156
|
+
|
|
157
|
+
except Exception as e:
|
|
158
|
+
error(f"Failed to push commands: {e}")
|
|
159
|
+
logger.exception(e)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
@store.command(name="pull")
|
|
163
|
+
@click.option("--force", "-f", is_flag=True, help="Overwrite local commands without backup")
|
|
164
|
+
def pull_commands(force):
|
|
165
|
+
"""Pull commands from git store to ~/.mcli/commands/"""
|
|
166
|
+
try:
|
|
167
|
+
store_path = _get_store_path()
|
|
168
|
+
|
|
169
|
+
# Pull from remote
|
|
170
|
+
try:
|
|
171
|
+
subprocess.run(["git", "pull"], cwd=store_path, check=True)
|
|
172
|
+
success("Pulled latest changes from remote")
|
|
173
|
+
except subprocess.CalledProcessError:
|
|
174
|
+
warning("No remote configured or pull failed. Using local store.")
|
|
175
|
+
|
|
176
|
+
# Backup existing commands if not force
|
|
177
|
+
if not force and COMMANDS_PATH.exists():
|
|
178
|
+
backup_dir = (
|
|
179
|
+
COMMANDS_PATH.parent / f"commands_backup_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
|
|
180
|
+
)
|
|
181
|
+
shutil.copytree(COMMANDS_PATH, backup_dir)
|
|
182
|
+
info(f"Backed up existing commands to {backup_dir}")
|
|
183
|
+
|
|
184
|
+
# Copy from store to commands directory
|
|
185
|
+
info(f"Copying commands from {store_path} to {COMMANDS_PATH}...")
|
|
186
|
+
|
|
187
|
+
COMMANDS_PATH.mkdir(parents=True, exist_ok=True)
|
|
188
|
+
|
|
189
|
+
copied_count = 0
|
|
190
|
+
for item in store_path.glob("*"):
|
|
191
|
+
# Skip git directory and README
|
|
192
|
+
if item.name in [".git", "README.md", ".gitignore"]:
|
|
193
|
+
continue
|
|
194
|
+
|
|
195
|
+
dest = COMMANDS_PATH / item.name
|
|
196
|
+
if item.is_file():
|
|
197
|
+
shutil.copy2(item, dest)
|
|
198
|
+
copied_count += 1
|
|
199
|
+
elif item.is_dir():
|
|
200
|
+
shutil.copytree(item, dest, dirs_exist_ok=True)
|
|
201
|
+
copied_count += 1
|
|
202
|
+
|
|
203
|
+
success(f"Pulled {copied_count} items from store")
|
|
204
|
+
|
|
205
|
+
except Exception as e:
|
|
206
|
+
error(f"Failed to pull commands: {e}")
|
|
207
|
+
logger.exception(e)
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
@store.command(name="sync")
|
|
211
|
+
@click.option("--message", "-m", help="Commit message if pushing")
|
|
212
|
+
def sync_commands(message):
|
|
213
|
+
"""Sync commands bidirectionally (pull then push if changes)"""
|
|
214
|
+
try:
|
|
215
|
+
store_path = _get_store_path()
|
|
216
|
+
|
|
217
|
+
# First pull
|
|
218
|
+
info("Pulling latest changes...")
|
|
219
|
+
try:
|
|
220
|
+
subprocess.run(["git", "pull"], cwd=store_path, check=True, capture_output=True)
|
|
221
|
+
success("Pulled from remote")
|
|
222
|
+
except subprocess.CalledProcessError:
|
|
223
|
+
warning("No remote or pull failed")
|
|
224
|
+
|
|
225
|
+
# Then push local changes
|
|
226
|
+
info("Pushing local changes...")
|
|
227
|
+
|
|
228
|
+
# Copy commands
|
|
229
|
+
for item in COMMANDS_PATH.glob("*"):
|
|
230
|
+
if item.name.endswith(".backup"):
|
|
231
|
+
continue
|
|
232
|
+
dest = store_path / item.name
|
|
233
|
+
if item.is_file():
|
|
234
|
+
shutil.copy2(item, dest)
|
|
235
|
+
elif item.is_dir():
|
|
236
|
+
shutil.copytree(item, dest, dirs_exist_ok=True)
|
|
237
|
+
|
|
238
|
+
# Check for changes
|
|
239
|
+
result = subprocess.run(
|
|
240
|
+
["git", "status", "--porcelain"], cwd=store_path, capture_output=True, text=True
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
if not result.stdout.strip():
|
|
244
|
+
success("Everything in sync!")
|
|
245
|
+
return
|
|
246
|
+
|
|
247
|
+
# Commit and push
|
|
248
|
+
subprocess.run(["git", "add", "."], cwd=store_path, check=True)
|
|
249
|
+
commit_msg = message or f"Sync commands {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
|
|
250
|
+
subprocess.run(["git", "commit", "-m", commit_msg], cwd=store_path, check=True)
|
|
251
|
+
|
|
252
|
+
try:
|
|
253
|
+
subprocess.run(["git", "push"], cwd=store_path, check=True, capture_output=True)
|
|
254
|
+
success("Synced and pushed to remote")
|
|
255
|
+
except subprocess.CalledProcessError:
|
|
256
|
+
success("Synced locally (no remote configured)")
|
|
257
|
+
|
|
258
|
+
except Exception as e:
|
|
259
|
+
error(f"Sync failed: {e}")
|
|
260
|
+
logger.exception(e)
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
@store.command(name="list")
|
|
264
|
+
@click.option("--store", "-s", is_flag=True, help="List store instead of local")
|
|
265
|
+
def list_commands(store):
|
|
266
|
+
"""List all commands"""
|
|
267
|
+
try:
|
|
268
|
+
if store:
|
|
269
|
+
store_path = _get_store_path()
|
|
270
|
+
path = store_path
|
|
271
|
+
title = f"Commands in store ({store_path})"
|
|
272
|
+
else:
|
|
273
|
+
path = COMMANDS_PATH
|
|
274
|
+
title = f"Local commands ({COMMANDS_PATH})"
|
|
275
|
+
|
|
276
|
+
click.echo(f"\n{title}:\n")
|
|
277
|
+
|
|
278
|
+
if not path.exists():
|
|
279
|
+
warning(f"Directory does not exist: {path}")
|
|
280
|
+
return
|
|
281
|
+
|
|
282
|
+
items = sorted(path.glob("*"))
|
|
283
|
+
if not items:
|
|
284
|
+
info("No commands found")
|
|
285
|
+
return
|
|
286
|
+
|
|
287
|
+
for item in items:
|
|
288
|
+
if item.name in [".git", ".gitignore", "README.md"]:
|
|
289
|
+
continue
|
|
290
|
+
|
|
291
|
+
if item.is_file():
|
|
292
|
+
size = item.stat().st_size / 1024
|
|
293
|
+
modified = datetime.fromtimestamp(item.stat().st_mtime).strftime("%Y-%m-%d %H:%M")
|
|
294
|
+
click.echo(f" 📄 {item.name:<40} {size:>8.1f} KB {modified}")
|
|
295
|
+
elif item.is_dir():
|
|
296
|
+
count = len(list(item.glob("*")))
|
|
297
|
+
click.echo(f" 📁 {item.name:<40} {count:>3} files")
|
|
298
|
+
|
|
299
|
+
click.echo()
|
|
300
|
+
|
|
301
|
+
except Exception as e:
|
|
302
|
+
error(f"Failed to list commands: {e}")
|
|
303
|
+
logger.exception(e)
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
@store.command(name="status")
|
|
307
|
+
def store_status():
|
|
308
|
+
"""Show git status of command store"""
|
|
309
|
+
try:
|
|
310
|
+
store_path = _get_store_path()
|
|
311
|
+
|
|
312
|
+
click.echo(f"\n📦 Store: {store_path}\n")
|
|
313
|
+
|
|
314
|
+
# Git status
|
|
315
|
+
result = subprocess.run(
|
|
316
|
+
["git", "status", "--short", "--branch"], cwd=store_path, capture_output=True, text=True
|
|
317
|
+
)
|
|
318
|
+
|
|
319
|
+
if result.stdout:
|
|
320
|
+
click.echo(result.stdout)
|
|
321
|
+
|
|
322
|
+
# Show remote
|
|
323
|
+
result = subprocess.run(
|
|
324
|
+
["git", "remote", "-v"], cwd=store_path, capture_output=True, text=True
|
|
325
|
+
)
|
|
326
|
+
|
|
327
|
+
if result.stdout:
|
|
328
|
+
click.echo("\n🌐 Remotes:")
|
|
329
|
+
click.echo(result.stdout)
|
|
330
|
+
else:
|
|
331
|
+
info("\nNo remote configured")
|
|
332
|
+
|
|
333
|
+
click.echo()
|
|
334
|
+
|
|
335
|
+
except Exception as e:
|
|
336
|
+
error(f"Failed to get status: {e}")
|
|
337
|
+
logger.exception(e)
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
@store.command(name="show")
|
|
341
|
+
@click.argument("command_name")
|
|
342
|
+
@click.option("--store", "-s", is_flag=True, help="Show from store instead of local")
|
|
343
|
+
def show_command(command_name, store):
|
|
344
|
+
"""Show command file contents"""
|
|
345
|
+
try:
|
|
346
|
+
if store:
|
|
347
|
+
store_path = _get_store_path()
|
|
348
|
+
path = store_path / command_name
|
|
349
|
+
else:
|
|
350
|
+
path = COMMANDS_PATH / command_name
|
|
351
|
+
|
|
352
|
+
if not path.exists():
|
|
353
|
+
error(f"Command not found: {command_name}")
|
|
354
|
+
return
|
|
355
|
+
|
|
356
|
+
if path.is_file():
|
|
357
|
+
click.echo(f"\n📄 {path}:\n")
|
|
358
|
+
click.echo(path.read_text())
|
|
359
|
+
else:
|
|
360
|
+
info(f"{command_name} is a directory")
|
|
361
|
+
for item in sorted(path.glob("*")):
|
|
362
|
+
click.echo(f" {item.name}")
|
|
363
|
+
|
|
364
|
+
click.echo()
|
|
365
|
+
|
|
366
|
+
except Exception as e:
|
|
367
|
+
error(f"Failed to show command: {e}")
|
|
368
|
+
logger.exception(e)
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
@store.command(name="config")
|
|
372
|
+
@click.option("--remote", "-r", help="Set git remote URL")
|
|
373
|
+
@click.option("--path", "-p", type=click.Path(), help="Change store path")
|
|
374
|
+
def configure_store(remote, path):
|
|
375
|
+
"""Configure store settings"""
|
|
376
|
+
try:
|
|
377
|
+
store_path = _get_store_path()
|
|
378
|
+
|
|
379
|
+
if path:
|
|
380
|
+
new_path = Path(path).expanduser().resolve()
|
|
381
|
+
config_file = Path.home() / ".mcli" / "store.conf"
|
|
382
|
+
config_file.write_text(str(new_path))
|
|
383
|
+
success(f"Store path updated to: {new_path}")
|
|
384
|
+
return
|
|
385
|
+
|
|
386
|
+
if remote:
|
|
387
|
+
# Check if remote exists
|
|
388
|
+
result = subprocess.run(
|
|
389
|
+
["git", "remote"], cwd=store_path, capture_output=True, text=True
|
|
390
|
+
)
|
|
391
|
+
|
|
392
|
+
if "origin" in result.stdout:
|
|
393
|
+
subprocess.run(
|
|
394
|
+
["git", "remote", "set-url", "origin", remote], cwd=store_path, check=True
|
|
395
|
+
)
|
|
396
|
+
success(f"Updated remote URL: {remote}")
|
|
397
|
+
else:
|
|
398
|
+
subprocess.run(
|
|
399
|
+
["git", "remote", "add", "origin", remote], cwd=store_path, check=True
|
|
400
|
+
)
|
|
401
|
+
success(f"Added remote URL: {remote}")
|
|
402
|
+
|
|
403
|
+
except Exception as e:
|
|
404
|
+
error(f"Configuration failed: {e}")
|
|
405
|
+
logger.exception(e)
|
|
406
|
+
|
|
407
|
+
|
|
408
|
+
def _get_store_path() -> Path:
|
|
409
|
+
"""Get store path from config or default"""
|
|
410
|
+
config_file = Path.home() / ".mcli" / "store.conf"
|
|
411
|
+
|
|
412
|
+
if config_file.exists():
|
|
413
|
+
store_path = Path(config_file.read_text().strip())
|
|
414
|
+
if store_path.exists():
|
|
415
|
+
return store_path
|
|
416
|
+
|
|
417
|
+
# Use default
|
|
418
|
+
return DEFAULT_STORE_PATH
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
if __name__ == "__main__":
|
|
422
|
+
store()
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"""ML Dashboard commands for mcli."""
|
|
2
|
+
|
|
3
|
+
import subprocess
|
|
4
|
+
import sys
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
import click
|
|
8
|
+
|
|
9
|
+
from mcli.lib.logger.logger import get_logger
|
|
10
|
+
|
|
11
|
+
logger = get_logger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@click.group(name="dashboard")
|
|
15
|
+
def dashboard():
|
|
16
|
+
"""ML monitoring dashboard commands."""
|
|
17
|
+
pass
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dashboard.command()
|
|
21
|
+
@click.option("--port", "-p", default=8501, help="Port to run dashboard on")
|
|
22
|
+
@click.option("--host", "-h", default="localhost", help="Host to bind to")
|
|
23
|
+
@click.option("--debug", is_flag=True, help="Run in debug mode")
|
|
24
|
+
@click.option(
|
|
25
|
+
"--variant",
|
|
26
|
+
"-v",
|
|
27
|
+
type=click.Choice(["integrated", "supabase", "training"]),
|
|
28
|
+
default="supabase",
|
|
29
|
+
help="Dashboard variant to launch (default: supabase)",
|
|
30
|
+
)
|
|
31
|
+
def launch(port, host, debug, variant):
|
|
32
|
+
"""Launch the ML monitoring dashboard.
|
|
33
|
+
|
|
34
|
+
Variants:
|
|
35
|
+
- supabase: Politician trading dashboard with Supabase integration (default)
|
|
36
|
+
- integrated: Full ML dashboard with local database
|
|
37
|
+
- training: ML training dashboard
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
click.echo(f"🚀 Starting {variant.title()} Dashboard on http://{host}:{port}")
|
|
41
|
+
|
|
42
|
+
# Get the dashboard app path based on variant
|
|
43
|
+
dashboard_dir = Path(__file__).parent.parent.parent / "ml" / "dashboard"
|
|
44
|
+
|
|
45
|
+
if variant == "supabase":
|
|
46
|
+
dashboard_path = dashboard_dir / "app_supabase.py"
|
|
47
|
+
elif variant == "integrated":
|
|
48
|
+
dashboard_path = dashboard_dir / "app_integrated.py"
|
|
49
|
+
elif variant == "training":
|
|
50
|
+
dashboard_path = dashboard_dir / "app_training.py"
|
|
51
|
+
else:
|
|
52
|
+
dashboard_path = dashboard_dir / "app.py"
|
|
53
|
+
|
|
54
|
+
if not dashboard_path.exists():
|
|
55
|
+
click.echo(f"❌ Dashboard app not found at {dashboard_path}!")
|
|
56
|
+
logger.error(f"Dashboard app not found at {dashboard_path}")
|
|
57
|
+
sys.exit(1)
|
|
58
|
+
|
|
59
|
+
# Build streamlit command
|
|
60
|
+
cmd = [
|
|
61
|
+
sys.executable,
|
|
62
|
+
"-m",
|
|
63
|
+
"streamlit",
|
|
64
|
+
"run",
|
|
65
|
+
str(dashboard_path),
|
|
66
|
+
"--server.port",
|
|
67
|
+
str(port),
|
|
68
|
+
"--server.address",
|
|
69
|
+
host,
|
|
70
|
+
"--browser.gatherUsageStats",
|
|
71
|
+
"false",
|
|
72
|
+
]
|
|
73
|
+
|
|
74
|
+
if debug:
|
|
75
|
+
cmd.extend(["--logger.level", "debug"])
|
|
76
|
+
|
|
77
|
+
click.echo(f"📊 Dashboard is starting from {dashboard_path.name}...")
|
|
78
|
+
click.echo("Press Ctrl+C to stop")
|
|
79
|
+
|
|
80
|
+
try:
|
|
81
|
+
subprocess.run(cmd, check=True)
|
|
82
|
+
except KeyboardInterrupt:
|
|
83
|
+
click.echo("\n⏹️ Dashboard stopped")
|
|
84
|
+
except subprocess.CalledProcessError as e:
|
|
85
|
+
click.echo(f"❌ Failed to start dashboard: {e}")
|
|
86
|
+
logger.error(f"Dashboard failed to start: {e}")
|
|
87
|
+
sys.exit(1)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
@dashboard.command()
|
|
91
|
+
def info():
|
|
92
|
+
"""Show dashboard information and status."""
|
|
93
|
+
|
|
94
|
+
click.echo("📊 ML Dashboard Information")
|
|
95
|
+
click.echo("━" * 40)
|
|
96
|
+
|
|
97
|
+
# Check if dependencies are installed
|
|
98
|
+
try:
|
|
99
|
+
import plotly
|
|
100
|
+
import streamlit
|
|
101
|
+
|
|
102
|
+
click.echo("✅ Dashboard dependencies installed")
|
|
103
|
+
click.echo(f" Streamlit version: {streamlit.__version__}")
|
|
104
|
+
click.echo(f" Plotly version: {plotly.__version__}")
|
|
105
|
+
except ImportError as e:
|
|
106
|
+
click.echo(f"❌ Missing dependencies: {e}")
|
|
107
|
+
click.echo(" Run: uv pip install streamlit plotly")
|
|
108
|
+
|
|
109
|
+
# Check Supabase configuration
|
|
110
|
+
import os
|
|
111
|
+
|
|
112
|
+
supabase_url = os.getenv("SUPABASE_URL")
|
|
113
|
+
supabase_key = os.getenv("SUPABASE_KEY") or os.getenv("SUPABASE_ANON_KEY")
|
|
114
|
+
|
|
115
|
+
click.echo("\n🔌 Supabase Configuration:")
|
|
116
|
+
if supabase_url:
|
|
117
|
+
click.echo(f" URL: {supabase_url}")
|
|
118
|
+
else:
|
|
119
|
+
click.echo(" ❌ SUPABASE_URL not set")
|
|
120
|
+
|
|
121
|
+
if supabase_key:
|
|
122
|
+
click.echo(f" Key: {'*' * 20}...{supabase_key[-8:]}")
|
|
123
|
+
else:
|
|
124
|
+
click.echo(" ❌ SUPABASE_KEY not set")
|
|
125
|
+
|
|
126
|
+
if not supabase_url or not supabase_key:
|
|
127
|
+
click.echo("\n⚠️ To configure Supabase, set environment variables:")
|
|
128
|
+
click.echo(" export SUPABASE_URL=https://your-project.supabase.co")
|
|
129
|
+
click.echo(" export SUPABASE_KEY=your-anon-key")
|
|
130
|
+
|
|
131
|
+
click.echo("\n💡 Quick start:")
|
|
132
|
+
click.echo(" mcli workflow dashboard launch # Launch Supabase dashboard")
|
|
133
|
+
click.echo(" mcli workflow dashboard launch --variant training # Launch training dashboard")
|
|
134
|
+
click.echo(" mcli workflow dashboard launch --port 8502 # Custom port")
|
|
135
|
+
click.echo(" mcli workflow dashboard launch --host 0.0.0.0 # Expose to network")
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
@dashboard.command()
|
|
139
|
+
def test():
|
|
140
|
+
"""Test Supabase connection."""
|
|
141
|
+
import os
|
|
142
|
+
from mcli.ml.dashboard.common import get_supabase_client
|
|
143
|
+
|
|
144
|
+
click.echo("🔍 Testing Supabase connection...")
|
|
145
|
+
click.echo("━" * 40)
|
|
146
|
+
|
|
147
|
+
# Check environment variables
|
|
148
|
+
url = os.getenv("SUPABASE_URL")
|
|
149
|
+
key = os.getenv("SUPABASE_KEY") or os.getenv("SUPABASE_ANON_KEY")
|
|
150
|
+
|
|
151
|
+
if not url:
|
|
152
|
+
click.echo("❌ SUPABASE_URL not set")
|
|
153
|
+
sys.exit(1)
|
|
154
|
+
|
|
155
|
+
if not key:
|
|
156
|
+
click.echo("❌ SUPABASE_KEY or SUPABASE_ANON_KEY not set")
|
|
157
|
+
sys.exit(1)
|
|
158
|
+
|
|
159
|
+
click.echo(f"✅ URL configured: {url}")
|
|
160
|
+
click.echo(f"✅ Key configured: {'*' * 20}...{key[-8:]}")
|
|
161
|
+
|
|
162
|
+
# Try to connect
|
|
163
|
+
client = get_supabase_client()
|
|
164
|
+
|
|
165
|
+
if not client:
|
|
166
|
+
click.echo("❌ Failed to create Supabase client")
|
|
167
|
+
sys.exit(1)
|
|
168
|
+
|
|
169
|
+
click.echo("✅ Supabase client created")
|
|
170
|
+
|
|
171
|
+
# Try to query a table
|
|
172
|
+
try:
|
|
173
|
+
response = client.table("politicians").select("id").limit(1).execute()
|
|
174
|
+
click.echo(f"✅ Successfully queried 'politicians' table ({len(response.data)} records)")
|
|
175
|
+
except Exception as e:
|
|
176
|
+
click.echo(f"⚠️ Could not query 'politicians' table: {e}")
|
|
177
|
+
click.echo(" (Table might not exist yet)")
|
|
178
|
+
|
|
179
|
+
click.echo("\n✅ Connection test passed!")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcli-framework
|
|
3
|
-
Version: 7.8.
|
|
3
|
+
Version: 7.8.3
|
|
4
4
|
Summary: Portable workflow framework - transform any script into a versioned, schedulable command. Store in ~/.mcli/commands/, version with lockfile, run as daemon or cron job.
|
|
5
5
|
Author-email: Luis Fernandez de la Vara <luis@lefv.io>
|
|
6
6
|
Maintainer-email: Luis Fernandez de la Vara <luis@lefv.io>
|
|
@@ -166,6 +166,7 @@ src/mcli/self/completion_cmd.py
|
|
|
166
166
|
src/mcli/self/logs_cmd.py
|
|
167
167
|
src/mcli/self/redis_cmd.py
|
|
168
168
|
src/mcli/self/self_cmd.py
|
|
169
|
+
src/mcli/self/store_cmd.py
|
|
169
170
|
src/mcli/self/test_cmd.py
|
|
170
171
|
src/mcli/self/visual_cmd.py
|
|
171
172
|
src/mcli/test/cron_test_cmd.py
|
|
@@ -181,6 +182,7 @@ src/mcli/workflow/daemon/enhanced_daemon.py
|
|
|
181
182
|
src/mcli/workflow/daemon/process_cli.py
|
|
182
183
|
src/mcli/workflow/daemon/process_manager.py
|
|
183
184
|
src/mcli/workflow/daemon/test_daemon.py
|
|
185
|
+
src/mcli/workflow/dashboard/dashboard_cmd.py
|
|
184
186
|
src/mcli/workflow/docker/docker.py
|
|
185
187
|
src/mcli/workflow/gcloud/config.toml
|
|
186
188
|
src/mcli/workflow/gcloud/gcloud.py
|
|
@@ -322,6 +324,7 @@ tests/unit/test_scheduler_job.py
|
|
|
322
324
|
tests/unit/test_scheduler_monitor.py
|
|
323
325
|
tests/unit/test_scheduler_persistence.py
|
|
324
326
|
tests/unit/test_self_update.py
|
|
327
|
+
tests/unit/test_store_cmd.py
|
|
325
328
|
tests/unit/test_supabase_connection.py
|
|
326
329
|
tests/unit/test_supabase_pagination.py
|
|
327
330
|
tests/unit/test_toml_utils.py
|