mcli-framework 8.0.16__tar.gz → 8.0.17__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.
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/PKG-INFO +1 -1
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/pyproject.toml +1 -1
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/self/health_cmd.py +551 -17
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli_framework.egg-info/PKG-INFO +1 -1
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/.github/dependabot.yml +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/.github/dependency-review-config.yml +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/.github/workflows/build.yml +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/.github/workflows/ci.yml +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/.github/workflows/codeql.yml +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/.github/workflows/docs-links.yml +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/.github/workflows/publish-self-hosted.yml +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/.github/workflows/publish.yml +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/.github/workflows/release.yml +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/.github/workflows/security.yml +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/.github/workflows/test.yml +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/LICENSE +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/MANIFEST.in +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/README.md +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/llms-full.txt +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/llms.txt +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/mcli_rust/Cargo.toml +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/mcli_rust/src/command_parser.rs +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/mcli_rust/src/file_watcher.rs +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/mcli_rust/src/lib.rs +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/mcli_rust/src/process_manager.rs +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/mcli_rust/src/tfidf.rs +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/setup.cfg +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/app/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/app/commands_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/app/completion_helpers.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/app/context_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/app/create_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/app/delete_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/app/edit_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/app/init_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/app/list_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/app/main.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/app/migrate_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/app/model/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/app/model/model.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/app/model_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/app/new_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/app/remove_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/app/rm_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/app/search_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/app/sync_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/app/video/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/app/video/video.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/config.toml +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/api/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/api/api.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/api/daemon_client.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/api/daemon_client_local.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/api/daemon_decorator.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/api/mcli_decorators.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/auth/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/auth/auth.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/auth/aws_manager.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/auth/azure_manager.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/auth/credential_manager.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/auth/gcp_manager.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/auth/key_manager.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/auth/mcli_manager.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/auth/token_manager.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/auth/token_util.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/config/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/config/config.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/constants/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/constants/commands.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/constants/defaults.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/constants/env.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/constants/messages.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/constants/paths.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/constants/scripts.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/constants/storage.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/custom_commands.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/discovery/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/discovery/command_discovery.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/erd/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/erd/erd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/erd/generate_graph.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/errors.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/feature_detection.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/files/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/files/files.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/folder_workflows.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/fs/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/fs/fs.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/ipfs_sync.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/lib.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/logger/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/logger/logger.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/optional_deps.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/paths.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/performance/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/performance/optimizer.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/performance/rust_bridge.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/performance/uvloop_config.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/pickles/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/pickles/pickles.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/pyenv/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/pyenv/deps.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/pyenv/manager.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/pyenv/venv.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/script_loader.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/script_sync.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/script_watcher.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/search/cached_vectorizer.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/secrets/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/secrets/commands.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/secrets/manager.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/secrets/repl.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/secrets/store.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/services/data_pipeline.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/services/lsh_client.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/services/redis_service.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/shell/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/shell/shell.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/templates/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/templates/command_templates.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/toml/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/toml/toml.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/types.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/ui/styling.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/ui/visual_effects.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/watcher/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/watcher/watcher.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/lib/workspace_registry.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/api/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/api/app.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/api/middleware.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/api/routers/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/api/routers/admin_router.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/api/routers/auth_router.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/api/routers/backtest_router.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/api/routers/data_router.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/api/routers/model_router.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/api/routers/monitoring_router.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/api/routers/portfolio_router.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/api/routers/prediction_router.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/api/routers/trade_router.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/api/routers/websocket_router.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/api/schemas.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/auth/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/auth/auth_manager.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/auth/models.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/auth/permissions.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/backtesting/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/backtesting/backtest_engine.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/backtesting/performance_metrics.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/backtesting/run.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/cache.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/cli/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/cli/main.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/config/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/config/settings.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/configs/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/configs/dvc_config.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/configs/mlflow_config.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/configs/mlops_manager.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/app.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/app_integrated.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/app_supabase.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/app_training.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/cli.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/common.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/components/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/components/charts.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/components/metrics.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/components/tables.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/overview.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/pages/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/pages/cicd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/pages/debug_dependencies.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/pages/gravity_viz.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/pages/monte_carlo_predictions.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/pages/predictions_enhanced.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/pages/scrapers_and_logs.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/pages/test_portfolio.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/pages/trading.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/pages/workflows.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/streamlit_extras_utils.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/styles.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/utils.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/dashboard/warning_suppression.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/data_ingestion/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/data_ingestion/api_connectors.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/data_ingestion/data_pipeline.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/data_ingestion/stream_processor.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/database/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/database/migrations/env.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/database/models.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/database/session.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/experimentation/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/experimentation/ab_testing.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/features/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/features/ensemble_features.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/features/recommendation_engine.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/features/stock_features.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/features/test_feature_engineering.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/logging.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/mlops/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/mlops/data_versioning.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/mlops/experiment_tracker.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/mlops/model_serving.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/mlops/pipeline_orchestrator.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/models/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/models/base_models.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/models/ensemble_models.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/models/recommendation_models.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/models/test_models.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/monitoring/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/monitoring/drift_detection.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/monitoring/metrics.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/optimization/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/optimization/optimize.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/optimization/portfolio_optimizer.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/predictions/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/predictions/monte_carlo.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/predictions/prediction_engine.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/preprocessing/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/preprocessing/data_cleaners.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/preprocessing/feature_extractors.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/preprocessing/ml_pipeline.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/preprocessing/test_preprocessing.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/scripts/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/scripts/populate_sample_data.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/serving/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/serving/serve.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/tasks.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/tests/test_integration.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/tests/test_training_dashboard.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/trading/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/trading/alpaca_client.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/trading/migrations.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/trading/models.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/trading/paper_trading.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/trading/risk_management.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/trading/trading_service.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/training/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/training/train.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/ml/training/train_model.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/mygroup/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/mygroup/test_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/public/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/public/commands/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/public/oi/oi.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/public/public.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/self/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/self/completion_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/self/logs_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/self/migrate_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/self/redis_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/self/self_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/self/store_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/self/test_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/self/visual_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/self/workflows_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/self/zsh_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/storage/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/storage/backends/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/storage/backends/ipfs_backend.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/storage/base.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/storage/cache.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/storage/encryption.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/storage/factory.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/storage/registry.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/storage/storacha_cli.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/daemon/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/daemon/async_command_database.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/daemon/async_process_manager.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/daemon/client.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/daemon/daemon.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/daemon/daemon_api.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/daemon/enhanced_daemon.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/daemon/process_cli.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/daemon/process_manager.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/daemon/test_daemon.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/dashboard/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/dashboard/dashboard_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/doc_convert.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/docker/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/docker/docker.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/file/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/gcloud/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/gcloud/config.toml +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/gcloud/gcloud.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/git_commit/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/git_commit/ai_service.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/interview/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/lsh_integration.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/model_service/client.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/model_service/download_and_run_efficient_models.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/model_service/lightweight_embedder.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/model_service/lightweight_model_server.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/model_service/lightweight_test.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/model_service/model_service.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/model_service/ollama_efficient_runner.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/model_service/openai_adapter.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/model_service/pdf_processor.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/model_service/test_efficient_runner.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/model_service/test_example.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/model_service/test_integration.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/model_service/test_new_features.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/notebook/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/notebook/command_loader.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/notebook/converter.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/notebook/executor.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/notebook/notebook_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/notebook/schema.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/notebook/validator.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/openai/openai.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/registry/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/registry/registry.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/repo/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/repo/repo.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/scheduler/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/scheduler/cron_parser.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/scheduler/job.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/scheduler/monitor.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/scheduler/persistence.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/scheduler/scheduler.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/search/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/secrets/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/secrets/secrets_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/storage/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/storage/storage_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/sync/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/sync/test_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/videos/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/wakatime/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/wakatime/wakatime.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli/workflow/workflow.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli_framework.egg-info/SOURCES.txt +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli_framework.egg-info/dependency_links.txt +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli_framework.egg-info/entry_points.txt +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli_framework.egg-info/requires.txt +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/src/mcli_framework.egg-info/top_level.txt +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/cli/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/cli/test_all_commands.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/cli/test_app_logs_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/cli/test_app_redis_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/cli/test_logs_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/cli/test_main_app.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/cli/test_model_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/cli/test_self_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/cli/test_self_cmd_plugins.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/cli/test_self_cmd_utilities.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/cli/test_workflow_creation_commands.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/cli/test_workflow_file.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/cli/test_workflow_gcloud.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/cli/test_workflow_registry.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/conftest.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/e2e/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/e2e/test_complete_workflows.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/e2e/test_model_workflow.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/e2e/test_new_user_workflow.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/e2e/test_update_workflow.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/fixtures/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/fixtures/cli_fixtures.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/fixtures/data_fixtures.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/fixtures/db_fixtures.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/fixtures/model_fixtures.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/integration/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/integration/test_all_commands_comprehensive.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/integration/test_daemon_server.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/integration/test_direct_file_execution.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/integration/test_e2e_dashboard_lsh_supabase.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/integration/test_flask_webapp.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/integration/test_folder_workflows_integration.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/integration/test_gcloud_services.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/integration/test_ml_auth.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/integration/test_ml_data_pipeline.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/integration/test_ml_models.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/integration/test_ml_pipeline.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/integration/test_module_imports.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/integration/test_notebook_workflows.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/integration/test_oi_service.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/integration/test_repo_operations.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/integration/test_scheduler_integration.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/integration/test_service_registry.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/integration/test_supabase_live_connection.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/integration/test_video_processing.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/integration/test_wakatime_api.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/integration/test_webapp_full.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/integration/test_workflow.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/integration/test_workflow_commands.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/performance/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/property/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/storage/__init__.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/storage/test_cache.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/storage/test_encryption.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/storage/test_storacha_cli.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_api_utils.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_async_process_manager.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_auth_modules.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_bug_fixes.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_config.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_custom_commands.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_custom_commands_filtering.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_daemon_api.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_dashboard_components.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_dashboard_functions.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_dashboard_pages.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_dependencies.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_doc_convert_workflow.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_emulator_workflow.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_erd_generation.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_erd_generic.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_erd_imports.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_folder_workflows.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_git_commit_workflow.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_health_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_lib_auth.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_lib_files.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_lib_utils.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_logger.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_ml_preprocessing.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_new_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_notebook_command_loader.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_notebook_executor.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_optional_deps.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_paths.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_pdf_compress.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_prediction_engine.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_pyenv.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_regression.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_scheduler.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_scheduler_cron_parser.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_scheduler_job.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_scheduler_monitor.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_scheduler_persistence.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_self_update.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_store_cmd.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_supabase_connection.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_supabase_pagination.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_toml_utils.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_trading_imports.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_ui_rich.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_uv_compat.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/test_workflow_file_completion.py +0 -0
- {mcli_framework-8.0.16 → mcli_framework-8.0.17}/tests/unit/workflow/test_notebook.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcli-framework
|
|
3
|
-
Version: 8.0.
|
|
3
|
+
Version: 8.0.17
|
|
4
4
|
Summary: Portable workflow framework - transform any script into a versioned, schedulable command. Store in ~/.mcli/workflows/, 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 = "8.0.
|
|
3
|
+
version = "8.0.17"
|
|
4
4
|
description = "Portable workflow framework - transform any script into a versioned, schedulable command. Store in ~/.mcli/workflows/, version with lockfile, run as daemon or cron job."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.10"
|
|
@@ -134,6 +134,502 @@ def find_repo_root() -> Path:
|
|
|
134
134
|
return Path.cwd()
|
|
135
135
|
|
|
136
136
|
|
|
137
|
+
# =============================================================================
|
|
138
|
+
# Language Detection
|
|
139
|
+
# =============================================================================
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def detect_languages(repo_path: Path) -> Dict[str, bool]:
|
|
143
|
+
"""Detect which programming languages are used in the repository."""
|
|
144
|
+
languages = {
|
|
145
|
+
"python": False,
|
|
146
|
+
"typescript": False,
|
|
147
|
+
"javascript": False,
|
|
148
|
+
"java": False,
|
|
149
|
+
"elixir": False,
|
|
150
|
+
"dart": False,
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
# Python: pyproject.toml, setup.py, requirements.txt, or .py files
|
|
154
|
+
if (
|
|
155
|
+
(repo_path / "pyproject.toml").exists()
|
|
156
|
+
or (repo_path / "setup.py").exists()
|
|
157
|
+
or (repo_path / "requirements.txt").exists()
|
|
158
|
+
or list(repo_path.glob("**/*.py"))[:1]
|
|
159
|
+
):
|
|
160
|
+
languages["python"] = True
|
|
161
|
+
|
|
162
|
+
# TypeScript: tsconfig.json or .ts files
|
|
163
|
+
if (repo_path / "tsconfig.json").exists() or list(repo_path.glob("**/*.ts"))[:1]:
|
|
164
|
+
languages["typescript"] = True
|
|
165
|
+
|
|
166
|
+
# JavaScript: package.json or .js files
|
|
167
|
+
if (repo_path / "package.json").exists() or list(repo_path.glob("**/*.js"))[:1]:
|
|
168
|
+
languages["javascript"] = True
|
|
169
|
+
|
|
170
|
+
# Java: pom.xml, build.gradle, or .java files
|
|
171
|
+
if (
|
|
172
|
+
(repo_path / "pom.xml").exists()
|
|
173
|
+
or (repo_path / "build.gradle").exists()
|
|
174
|
+
or (repo_path / "build.gradle.kts").exists()
|
|
175
|
+
or list(repo_path.glob("**/*.java"))[:1]
|
|
176
|
+
):
|
|
177
|
+
languages["java"] = True
|
|
178
|
+
|
|
179
|
+
# Elixir: mix.exs or .ex/.exs files
|
|
180
|
+
if (repo_path / "mix.exs").exists() or list(repo_path.glob("**/*.ex"))[:1]:
|
|
181
|
+
languages["elixir"] = True
|
|
182
|
+
|
|
183
|
+
# Dart: pubspec.yaml or .dart files
|
|
184
|
+
if (repo_path / "pubspec.yaml").exists() or list(repo_path.glob("**/*.dart"))[:1]:
|
|
185
|
+
languages["dart"] = True
|
|
186
|
+
|
|
187
|
+
return languages
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
# =============================================================================
|
|
191
|
+
# TypeScript/JavaScript Checks
|
|
192
|
+
# =============================================================================
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def check_npm_test(repo_path: Path) -> CheckResult:
|
|
196
|
+
"""Run npm/yarn tests."""
|
|
197
|
+
start = time.time()
|
|
198
|
+
|
|
199
|
+
if not (repo_path / "package.json").exists():
|
|
200
|
+
return CheckResult(
|
|
201
|
+
name="JS/TS Tests",
|
|
202
|
+
status=HealthStatus.SKIPPED,
|
|
203
|
+
message="No package.json found",
|
|
204
|
+
duration_ms=(time.time() - start) * 1000,
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
# Determine package manager
|
|
208
|
+
if (repo_path / "yarn.lock").exists():
|
|
209
|
+
pkg_manager = "yarn"
|
|
210
|
+
test_cmd = ["yarn", "test", "--passWithNoTests"]
|
|
211
|
+
elif (repo_path / "pnpm-lock.yaml").exists():
|
|
212
|
+
pkg_manager = "pnpm"
|
|
213
|
+
test_cmd = ["pnpm", "test", "--passWithNoTests"]
|
|
214
|
+
else:
|
|
215
|
+
pkg_manager = "npm"
|
|
216
|
+
test_cmd = ["npm", "test", "--", "--passWithNoTests"]
|
|
217
|
+
|
|
218
|
+
# Check if test script exists
|
|
219
|
+
try:
|
|
220
|
+
import json as json_mod
|
|
221
|
+
|
|
222
|
+
pkg_json = json_mod.loads((repo_path / "package.json").read_text())
|
|
223
|
+
if "test" not in pkg_json.get("scripts", {}):
|
|
224
|
+
return CheckResult(
|
|
225
|
+
name="JS/TS Tests",
|
|
226
|
+
status=HealthStatus.SKIPPED,
|
|
227
|
+
message="No test script in package.json",
|
|
228
|
+
duration_ms=(time.time() - start) * 1000,
|
|
229
|
+
)
|
|
230
|
+
except Exception:
|
|
231
|
+
pass
|
|
232
|
+
|
|
233
|
+
code, stdout, stderr = run_command(test_cmd, cwd=repo_path, timeout=300)
|
|
234
|
+
|
|
235
|
+
if code == 0:
|
|
236
|
+
return CheckResult(
|
|
237
|
+
name="JS/TS Tests",
|
|
238
|
+
status=HealthStatus.PASSING,
|
|
239
|
+
message=f"Tests passed ({pkg_manager})",
|
|
240
|
+
duration_ms=(time.time() - start) * 1000,
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
return CheckResult(
|
|
244
|
+
name="JS/TS Tests",
|
|
245
|
+
status=HealthStatus.FAILING,
|
|
246
|
+
message=f"Tests failed ({pkg_manager})",
|
|
247
|
+
details=(stderr or stdout)[:300],
|
|
248
|
+
suggestions=["Fix failing tests", f"Run: {pkg_manager} test"],
|
|
249
|
+
duration_ms=(time.time() - start) * 1000,
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
def check_eslint(repo_path: Path) -> CheckResult:
|
|
254
|
+
"""Check JavaScript/TypeScript linting with ESLint."""
|
|
255
|
+
start = time.time()
|
|
256
|
+
|
|
257
|
+
eslint_configs = [".eslintrc", ".eslintrc.js", ".eslintrc.json", ".eslintrc.yml", "eslint.config.js"]
|
|
258
|
+
has_eslint = any((repo_path / cfg).exists() for cfg in eslint_configs)
|
|
259
|
+
|
|
260
|
+
if not has_eslint:
|
|
261
|
+
try:
|
|
262
|
+
import json as json_mod
|
|
263
|
+
|
|
264
|
+
pkg_json = json_mod.loads((repo_path / "package.json").read_text())
|
|
265
|
+
has_eslint = "eslintConfig" in pkg_json
|
|
266
|
+
except Exception:
|
|
267
|
+
pass
|
|
268
|
+
|
|
269
|
+
if not has_eslint:
|
|
270
|
+
return CheckResult(
|
|
271
|
+
name="ESLint",
|
|
272
|
+
status=HealthStatus.SKIPPED,
|
|
273
|
+
message="No ESLint config found",
|
|
274
|
+
duration_ms=(time.time() - start) * 1000,
|
|
275
|
+
)
|
|
276
|
+
|
|
277
|
+
code, stdout, stderr = run_command(["npx", "eslint", ".", "--max-warnings=0"], cwd=repo_path)
|
|
278
|
+
|
|
279
|
+
if code == 0:
|
|
280
|
+
return CheckResult(
|
|
281
|
+
name="ESLint",
|
|
282
|
+
status=HealthStatus.PASSING,
|
|
283
|
+
message="No linting errors",
|
|
284
|
+
duration_ms=(time.time() - start) * 1000,
|
|
285
|
+
)
|
|
286
|
+
|
|
287
|
+
output = stdout + stderr
|
|
288
|
+
error_count = len(re.findall(r"^\s*\d+:\d+\s+error", output, re.MULTILINE))
|
|
289
|
+
warn_count = len(re.findall(r"^\s*\d+:\d+\s+warning", output, re.MULTILINE))
|
|
290
|
+
|
|
291
|
+
return CheckResult(
|
|
292
|
+
name="ESLint",
|
|
293
|
+
status=HealthStatus.FAILING if error_count > 0 else HealthStatus.WARNING,
|
|
294
|
+
message=f"{error_count} errors, {warn_count} warnings",
|
|
295
|
+
suggestions=["Run: npx eslint . --fix"],
|
|
296
|
+
duration_ms=(time.time() - start) * 1000,
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def check_typescript(repo_path: Path) -> CheckResult:
|
|
301
|
+
"""Check TypeScript compilation."""
|
|
302
|
+
start = time.time()
|
|
303
|
+
|
|
304
|
+
if not (repo_path / "tsconfig.json").exists():
|
|
305
|
+
return CheckResult(
|
|
306
|
+
name="TypeScript",
|
|
307
|
+
status=HealthStatus.SKIPPED,
|
|
308
|
+
message="No tsconfig.json found",
|
|
309
|
+
duration_ms=(time.time() - start) * 1000,
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
code, stdout, stderr = run_command(["npx", "tsc", "--noEmit"], cwd=repo_path)
|
|
313
|
+
|
|
314
|
+
if code == 0:
|
|
315
|
+
return CheckResult(
|
|
316
|
+
name="TypeScript",
|
|
317
|
+
status=HealthStatus.PASSING,
|
|
318
|
+
message="No type errors",
|
|
319
|
+
duration_ms=(time.time() - start) * 1000,
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
output = stdout + stderr
|
|
323
|
+
error_count = len(re.findall(r"error TS\d+:", output))
|
|
324
|
+
|
|
325
|
+
return CheckResult(
|
|
326
|
+
name="TypeScript",
|
|
327
|
+
status=HealthStatus.FAILING,
|
|
328
|
+
message=f"{error_count} type error(s)",
|
|
329
|
+
suggestions=["Fix TypeScript errors", "Run: npx tsc --noEmit"],
|
|
330
|
+
duration_ms=(time.time() - start) * 1000,
|
|
331
|
+
)
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
# =============================================================================
|
|
335
|
+
# Java Checks
|
|
336
|
+
# =============================================================================
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
def check_java_build(repo_path: Path) -> CheckResult:
|
|
340
|
+
"""Check Java build and tests."""
|
|
341
|
+
start = time.time()
|
|
342
|
+
|
|
343
|
+
if (repo_path / "pom.xml").exists():
|
|
344
|
+
build_tool = "maven"
|
|
345
|
+
test_cmd = ["mvn", "test", "-q"]
|
|
346
|
+
build_cmd = ["mvn", "compile", "-q"]
|
|
347
|
+
elif (repo_path / "build.gradle").exists() or (repo_path / "build.gradle.kts").exists():
|
|
348
|
+
build_tool = "gradle"
|
|
349
|
+
gradlew = "./gradlew" if (repo_path / "gradlew").exists() else "gradle"
|
|
350
|
+
test_cmd = [gradlew, "test", "-q"]
|
|
351
|
+
build_cmd = [gradlew, "build", "-q"]
|
|
352
|
+
else:
|
|
353
|
+
return CheckResult(
|
|
354
|
+
name="Java Build",
|
|
355
|
+
status=HealthStatus.SKIPPED,
|
|
356
|
+
message="No pom.xml or build.gradle found",
|
|
357
|
+
duration_ms=(time.time() - start) * 1000,
|
|
358
|
+
)
|
|
359
|
+
|
|
360
|
+
code, stdout, stderr = run_command(build_cmd, cwd=repo_path, timeout=300)
|
|
361
|
+
if code != 0:
|
|
362
|
+
return CheckResult(
|
|
363
|
+
name="Java Build",
|
|
364
|
+
status=HealthStatus.FAILING,
|
|
365
|
+
message=f"Build failed ({build_tool})",
|
|
366
|
+
details=(stderr or stdout)[:300],
|
|
367
|
+
suggestions=["Fix build errors"],
|
|
368
|
+
duration_ms=(time.time() - start) * 1000,
|
|
369
|
+
)
|
|
370
|
+
|
|
371
|
+
code, stdout, stderr = run_command(test_cmd, cwd=repo_path, timeout=300)
|
|
372
|
+
if code == 0:
|
|
373
|
+
return CheckResult(
|
|
374
|
+
name="Java Build",
|
|
375
|
+
status=HealthStatus.PASSING,
|
|
376
|
+
message=f"Build and tests passed ({build_tool})",
|
|
377
|
+
duration_ms=(time.time() - start) * 1000,
|
|
378
|
+
)
|
|
379
|
+
|
|
380
|
+
return CheckResult(
|
|
381
|
+
name="Java Build",
|
|
382
|
+
status=HealthStatus.FAILING,
|
|
383
|
+
message=f"Tests failed ({build_tool})",
|
|
384
|
+
suggestions=["Fix failing tests"],
|
|
385
|
+
duration_ms=(time.time() - start) * 1000,
|
|
386
|
+
)
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
# =============================================================================
|
|
390
|
+
# Elixir Checks
|
|
391
|
+
# =============================================================================
|
|
392
|
+
|
|
393
|
+
|
|
394
|
+
def check_mix_test(repo_path: Path) -> CheckResult:
|
|
395
|
+
"""Run Elixir tests with mix."""
|
|
396
|
+
start = time.time()
|
|
397
|
+
|
|
398
|
+
if not (repo_path / "mix.exs").exists():
|
|
399
|
+
return CheckResult(
|
|
400
|
+
name="Elixir Tests",
|
|
401
|
+
status=HealthStatus.SKIPPED,
|
|
402
|
+
message="No mix.exs found",
|
|
403
|
+
duration_ms=(time.time() - start) * 1000,
|
|
404
|
+
)
|
|
405
|
+
|
|
406
|
+
code, stdout, stderr = run_command(["mix", "test"], cwd=repo_path, timeout=300)
|
|
407
|
+
|
|
408
|
+
if code == 0:
|
|
409
|
+
output = stdout + stderr
|
|
410
|
+
match = re.search(r"(\d+) tests?, (\d+) failures?", output)
|
|
411
|
+
if match:
|
|
412
|
+
tests, failures = int(match.group(1)), int(match.group(2))
|
|
413
|
+
return CheckResult(
|
|
414
|
+
name="Elixir Tests",
|
|
415
|
+
status=HealthStatus.PASSING,
|
|
416
|
+
message=f"{tests} tests passed",
|
|
417
|
+
metrics={"tests": tests, "failures": failures},
|
|
418
|
+
duration_ms=(time.time() - start) * 1000,
|
|
419
|
+
)
|
|
420
|
+
return CheckResult(
|
|
421
|
+
name="Elixir Tests",
|
|
422
|
+
status=HealthStatus.PASSING,
|
|
423
|
+
message="Tests passed",
|
|
424
|
+
duration_ms=(time.time() - start) * 1000,
|
|
425
|
+
)
|
|
426
|
+
|
|
427
|
+
return CheckResult(
|
|
428
|
+
name="Elixir Tests",
|
|
429
|
+
status=HealthStatus.FAILING,
|
|
430
|
+
message="Tests failed",
|
|
431
|
+
details=(stderr or stdout)[:300],
|
|
432
|
+
suggestions=["Fix failing tests", "Run: mix test"],
|
|
433
|
+
duration_ms=(time.time() - start) * 1000,
|
|
434
|
+
)
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
def check_mix_format(repo_path: Path) -> CheckResult:
|
|
438
|
+
"""Check Elixir formatting with mix format."""
|
|
439
|
+
start = time.time()
|
|
440
|
+
|
|
441
|
+
if not (repo_path / "mix.exs").exists():
|
|
442
|
+
return CheckResult(
|
|
443
|
+
name="Elixir Format",
|
|
444
|
+
status=HealthStatus.SKIPPED,
|
|
445
|
+
message="No mix.exs found",
|
|
446
|
+
duration_ms=(time.time() - start) * 1000,
|
|
447
|
+
)
|
|
448
|
+
|
|
449
|
+
code, _, _ = run_command(["mix", "format", "--check-formatted"], cwd=repo_path)
|
|
450
|
+
|
|
451
|
+
if code == 0:
|
|
452
|
+
return CheckResult(
|
|
453
|
+
name="Elixir Format",
|
|
454
|
+
status=HealthStatus.PASSING,
|
|
455
|
+
message="All files formatted",
|
|
456
|
+
duration_ms=(time.time() - start) * 1000,
|
|
457
|
+
)
|
|
458
|
+
|
|
459
|
+
return CheckResult(
|
|
460
|
+
name="Elixir Format",
|
|
461
|
+
status=HealthStatus.FAILING,
|
|
462
|
+
message="Files need formatting",
|
|
463
|
+
suggestions=["Run: mix format"],
|
|
464
|
+
duration_ms=(time.time() - start) * 1000,
|
|
465
|
+
)
|
|
466
|
+
|
|
467
|
+
|
|
468
|
+
def check_credo(repo_path: Path) -> CheckResult:
|
|
469
|
+
"""Check Elixir code quality with Credo."""
|
|
470
|
+
start = time.time()
|
|
471
|
+
|
|
472
|
+
if not (repo_path / "mix.exs").exists():
|
|
473
|
+
return CheckResult(
|
|
474
|
+
name="Credo",
|
|
475
|
+
status=HealthStatus.SKIPPED,
|
|
476
|
+
message="No mix.exs found",
|
|
477
|
+
duration_ms=(time.time() - start) * 1000,
|
|
478
|
+
)
|
|
479
|
+
|
|
480
|
+
try:
|
|
481
|
+
mix_content = (repo_path / "mix.exs").read_text()
|
|
482
|
+
if ":credo" not in mix_content:
|
|
483
|
+
return CheckResult(
|
|
484
|
+
name="Credo",
|
|
485
|
+
status=HealthStatus.SKIPPED,
|
|
486
|
+
message="Credo not in dependencies",
|
|
487
|
+
duration_ms=(time.time() - start) * 1000,
|
|
488
|
+
)
|
|
489
|
+
except Exception:
|
|
490
|
+
pass
|
|
491
|
+
|
|
492
|
+
code, stdout, stderr = run_command(["mix", "credo", "--strict"], cwd=repo_path)
|
|
493
|
+
|
|
494
|
+
if code == 0:
|
|
495
|
+
return CheckResult(
|
|
496
|
+
name="Credo",
|
|
497
|
+
status=HealthStatus.PASSING,
|
|
498
|
+
message="No issues found",
|
|
499
|
+
duration_ms=(time.time() - start) * 1000,
|
|
500
|
+
)
|
|
501
|
+
|
|
502
|
+
output = stdout + stderr
|
|
503
|
+
issues = len(re.findall(r"┃", output))
|
|
504
|
+
|
|
505
|
+
return CheckResult(
|
|
506
|
+
name="Credo",
|
|
507
|
+
status=HealthStatus.WARNING,
|
|
508
|
+
message=f"{issues} issue(s) found",
|
|
509
|
+
suggestions=["Run: mix credo --strict"],
|
|
510
|
+
duration_ms=(time.time() - start) * 1000,
|
|
511
|
+
)
|
|
512
|
+
|
|
513
|
+
|
|
514
|
+
# =============================================================================
|
|
515
|
+
# Dart Checks
|
|
516
|
+
# =============================================================================
|
|
517
|
+
|
|
518
|
+
|
|
519
|
+
def check_dart_test(repo_path: Path) -> CheckResult:
|
|
520
|
+
"""Run Dart tests."""
|
|
521
|
+
start = time.time()
|
|
522
|
+
|
|
523
|
+
if not (repo_path / "pubspec.yaml").exists():
|
|
524
|
+
return CheckResult(
|
|
525
|
+
name="Dart Tests",
|
|
526
|
+
status=HealthStatus.SKIPPED,
|
|
527
|
+
message="No pubspec.yaml found",
|
|
528
|
+
duration_ms=(time.time() - start) * 1000,
|
|
529
|
+
)
|
|
530
|
+
|
|
531
|
+
if not (repo_path / "test").exists():
|
|
532
|
+
return CheckResult(
|
|
533
|
+
name="Dart Tests",
|
|
534
|
+
status=HealthStatus.SKIPPED,
|
|
535
|
+
message="No test directory found",
|
|
536
|
+
duration_ms=(time.time() - start) * 1000,
|
|
537
|
+
)
|
|
538
|
+
|
|
539
|
+
is_flutter = "flutter" in (repo_path / "pubspec.yaml").read_text().lower()
|
|
540
|
+
test_cmd = ["flutter", "test"] if is_flutter else ["dart", "test"]
|
|
541
|
+
|
|
542
|
+
code, stdout, stderr = run_command(test_cmd, cwd=repo_path, timeout=300)
|
|
543
|
+
|
|
544
|
+
if code == 0:
|
|
545
|
+
return CheckResult(
|
|
546
|
+
name="Dart Tests",
|
|
547
|
+
status=HealthStatus.PASSING,
|
|
548
|
+
message="Tests passed",
|
|
549
|
+
duration_ms=(time.time() - start) * 1000,
|
|
550
|
+
)
|
|
551
|
+
|
|
552
|
+
return CheckResult(
|
|
553
|
+
name="Dart Tests",
|
|
554
|
+
status=HealthStatus.FAILING,
|
|
555
|
+
message="Tests failed",
|
|
556
|
+
details=(stderr or stdout)[:300],
|
|
557
|
+
suggestions=["Fix failing tests"],
|
|
558
|
+
duration_ms=(time.time() - start) * 1000,
|
|
559
|
+
)
|
|
560
|
+
|
|
561
|
+
|
|
562
|
+
def check_dart_analyze(repo_path: Path) -> CheckResult:
|
|
563
|
+
"""Run Dart static analysis."""
|
|
564
|
+
start = time.time()
|
|
565
|
+
|
|
566
|
+
if not (repo_path / "pubspec.yaml").exists():
|
|
567
|
+
return CheckResult(
|
|
568
|
+
name="Dart Analyze",
|
|
569
|
+
status=HealthStatus.SKIPPED,
|
|
570
|
+
message="No pubspec.yaml found",
|
|
571
|
+
duration_ms=(time.time() - start) * 1000,
|
|
572
|
+
)
|
|
573
|
+
|
|
574
|
+
code, stdout, stderr = run_command(["dart", "analyze", "--fatal-infos"], cwd=repo_path)
|
|
575
|
+
|
|
576
|
+
if code == 0:
|
|
577
|
+
return CheckResult(
|
|
578
|
+
name="Dart Analyze",
|
|
579
|
+
status=HealthStatus.PASSING,
|
|
580
|
+
message="No issues found",
|
|
581
|
+
duration_ms=(time.time() - start) * 1000,
|
|
582
|
+
)
|
|
583
|
+
|
|
584
|
+
output = stdout + stderr
|
|
585
|
+
errors = len(re.findall(r"error •", output, re.IGNORECASE))
|
|
586
|
+
warnings = len(re.findall(r"warning •", output, re.IGNORECASE))
|
|
587
|
+
|
|
588
|
+
return CheckResult(
|
|
589
|
+
name="Dart Analyze",
|
|
590
|
+
status=HealthStatus.FAILING if errors > 0 else HealthStatus.WARNING,
|
|
591
|
+
message=f"{errors} errors, {warnings} warnings",
|
|
592
|
+
suggestions=["Run: dart analyze"],
|
|
593
|
+
duration_ms=(time.time() - start) * 1000,
|
|
594
|
+
)
|
|
595
|
+
|
|
596
|
+
|
|
597
|
+
def check_dart_format(repo_path: Path) -> CheckResult:
|
|
598
|
+
"""Check Dart formatting."""
|
|
599
|
+
start = time.time()
|
|
600
|
+
|
|
601
|
+
if not (repo_path / "pubspec.yaml").exists():
|
|
602
|
+
return CheckResult(
|
|
603
|
+
name="Dart Format",
|
|
604
|
+
status=HealthStatus.SKIPPED,
|
|
605
|
+
message="No pubspec.yaml found",
|
|
606
|
+
duration_ms=(time.time() - start) * 1000,
|
|
607
|
+
)
|
|
608
|
+
|
|
609
|
+
code, _, _ = run_command(["dart", "format", "--set-exit-if-changed", "--output=none", "."], cwd=repo_path)
|
|
610
|
+
|
|
611
|
+
if code == 0:
|
|
612
|
+
return CheckResult(
|
|
613
|
+
name="Dart Format",
|
|
614
|
+
status=HealthStatus.PASSING,
|
|
615
|
+
message="All files formatted",
|
|
616
|
+
duration_ms=(time.time() - start) * 1000,
|
|
617
|
+
)
|
|
618
|
+
|
|
619
|
+
return CheckResult(
|
|
620
|
+
name="Dart Format",
|
|
621
|
+
status=HealthStatus.FAILING,
|
|
622
|
+
message="Files need formatting",
|
|
623
|
+
suggestions=["Run: dart format ."],
|
|
624
|
+
duration_ms=(time.time() - start) * 1000,
|
|
625
|
+
)
|
|
626
|
+
|
|
627
|
+
|
|
628
|
+
# =============================================================================
|
|
629
|
+
# Python Checks
|
|
630
|
+
# =============================================================================
|
|
631
|
+
|
|
632
|
+
|
|
137
633
|
def check_git_status(repo_path: Path) -> CheckResult:
|
|
138
634
|
"""Check git repository status."""
|
|
139
635
|
start = time.time()
|
|
@@ -966,33 +1462,71 @@ def generate_report(
|
|
|
966
1462
|
checks: list[CheckResult] = []
|
|
967
1463
|
start_time = time.time()
|
|
968
1464
|
|
|
969
|
-
#
|
|
1465
|
+
# Detect languages in the repository
|
|
1466
|
+
languages = detect_languages(repo_path)
|
|
1467
|
+
detected = [lang for lang, present in languages.items() if present]
|
|
1468
|
+
console.print(f"[dim]Detected languages: {', '.join(detected) or 'none'}[/dim]\n")
|
|
1469
|
+
|
|
1470
|
+
# Universal checks
|
|
970
1471
|
check_functions = [
|
|
971
1472
|
("Git Status", lambda: check_git_status(repo_path)),
|
|
972
1473
|
("Code Metrics", lambda: check_code_metrics(repo_path)),
|
|
973
|
-
("Black", lambda: check_black(repo_path)),
|
|
974
|
-
("isort", lambda: check_isort(repo_path)),
|
|
975
|
-
("Flake8", lambda: check_flake8(repo_path)),
|
|
976
1474
|
]
|
|
977
1475
|
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
1476
|
+
# Python-specific checks
|
|
1477
|
+
if languages["python"]:
|
|
1478
|
+
check_functions.extend([
|
|
1479
|
+
("Black", lambda: check_black(repo_path)),
|
|
1480
|
+
("isort", lambda: check_isort(repo_path)),
|
|
1481
|
+
("Flake8", lambda: check_flake8(repo_path)),
|
|
1482
|
+
])
|
|
1483
|
+
if not skip_tests:
|
|
1484
|
+
check_functions.append(("Python Tests", lambda: check_tests(repo_path, fast=quick)))
|
|
1485
|
+
if not quick:
|
|
1486
|
+
check_functions.append(("Coverage", lambda: check_coverage(repo_path)))
|
|
1487
|
+
if not quick:
|
|
1488
|
+
check_functions.extend([
|
|
981
1489
|
("Mypy", lambda: check_mypy(repo_path)),
|
|
982
1490
|
("Security", lambda: check_security(repo_path)),
|
|
983
1491
|
("Dependencies", lambda: check_dependencies(repo_path)),
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
if
|
|
990
|
-
|
|
1492
|
+
])
|
|
1493
|
+
if not skip_build and not quick:
|
|
1494
|
+
check_functions.append(("Python Build", lambda: check_build(repo_path)))
|
|
1495
|
+
|
|
1496
|
+
# TypeScript/JavaScript checks
|
|
1497
|
+
if languages["typescript"] or languages["javascript"]:
|
|
1498
|
+
if not skip_tests:
|
|
1499
|
+
check_functions.append(("JS/TS Tests", lambda: check_npm_test(repo_path)))
|
|
1500
|
+
check_functions.append(("ESLint", lambda: check_eslint(repo_path)))
|
|
1501
|
+
if languages["typescript"]:
|
|
1502
|
+
check_functions.append(("TypeScript", lambda: check_typescript(repo_path)))
|
|
1503
|
+
|
|
1504
|
+
# Java checks
|
|
1505
|
+
if languages["java"]:
|
|
1506
|
+
if not skip_tests:
|
|
1507
|
+
check_functions.append(("Java Build", lambda: check_java_build(repo_path)))
|
|
1508
|
+
|
|
1509
|
+
# Elixir checks
|
|
1510
|
+
if languages["elixir"]:
|
|
1511
|
+
if not skip_tests:
|
|
1512
|
+
check_functions.append(("Elixir Tests", lambda: check_mix_test(repo_path)))
|
|
1513
|
+
check_functions.append(("Elixir Format", lambda: check_mix_format(repo_path)))
|
|
991
1514
|
if not quick:
|
|
992
|
-
check_functions.
|
|
1515
|
+
check_functions.append(("Credo", lambda: check_credo(repo_path)))
|
|
993
1516
|
|
|
994
|
-
|
|
995
|
-
|
|
1517
|
+
# Dart checks
|
|
1518
|
+
if languages["dart"]:
|
|
1519
|
+
if not skip_tests:
|
|
1520
|
+
check_functions.append(("Dart Tests", lambda: check_dart_test(repo_path)))
|
|
1521
|
+
check_functions.append(("Dart Analyze", lambda: check_dart_analyze(repo_path)))
|
|
1522
|
+
check_functions.append(("Dart Format", lambda: check_dart_format(repo_path)))
|
|
1523
|
+
|
|
1524
|
+
# Universal non-quick checks
|
|
1525
|
+
if not quick:
|
|
1526
|
+
check_functions.extend([
|
|
1527
|
+
("Documentation", lambda: check_documentation(repo_path)),
|
|
1528
|
+
("CI Status", lambda: check_ci_status(repo_path)),
|
|
1529
|
+
])
|
|
996
1530
|
|
|
997
1531
|
# Run checks with progress
|
|
998
1532
|
with Progress(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcli-framework
|
|
3
|
-
Version: 8.0.
|
|
3
|
+
Version: 8.0.17
|
|
4
4
|
Summary: Portable workflow framework - transform any script into a versioned, schedulable command. Store in ~/.mcli/workflows/, 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>
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|