mcli-framework 8.0.41__tar.gz → 8.0.43__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.41 → mcli_framework-8.0.43}/PKG-INFO +1 -1
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/pyproject.toml +1 -1
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/init_cmd.py +6 -1
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/new_cmd.py +33 -17
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/constants/messages.py +7 -1
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/pyenv/manager.py +30 -17
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/script_loader.py +2 -1
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli_framework.egg-info/PKG-INFO +1 -1
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_new_cmd.py +57 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_pyenv.py +62 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/.github/dependabot.yml +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/.github/dependency-review-config.yml +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/.github/workflows/build.yml +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/.github/workflows/ci.yml +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/.github/workflows/codeql.yml +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/.github/workflows/docs-links.yml +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/.github/workflows/publish-self-hosted.yml +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/.github/workflows/publish.yml +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/.github/workflows/release.yml +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/.github/workflows/security.yml +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/.github/workflows/test.yml +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/LICENSE +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/MANIFEST.in +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/README.md +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/llms-full.txt +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/llms.txt +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/mcli_rust/Cargo.toml +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/mcli_rust/src/command_parser.rs +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/mcli_rust/src/file_watcher.rs +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/mcli_rust/src/lib.rs +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/mcli_rust/src/process_manager.rs +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/mcli_rust/src/tfidf.rs +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/setup.cfg +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/commands_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/completion_helpers.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/context_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/create_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/delete_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/edit_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/import_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/list_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/main.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/migrate_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/model/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/model/model.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/model_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/mv_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/remove_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/rm_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/search_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/services_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/sync_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/video/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/video/video.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/config.toml +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/api/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/api/api.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/api/daemon_client.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/api/daemon_client_local.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/api/daemon_decorator.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/api/mcli_decorators.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/auth/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/auth/auth.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/auth/aws_manager.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/auth/azure_manager.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/auth/credential_manager.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/auth/gcp_manager.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/auth/key_manager.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/auth/mcli_manager.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/auth/token_manager.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/auth/token_util.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/config/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/config/config.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/constants/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/constants/commands.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/constants/defaults.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/constants/env.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/constants/paths.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/constants/scripts.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/constants/storage.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/custom_commands.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/discovery/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/discovery/command_discovery.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/erd/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/erd/erd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/erd/generate_graph.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/errors.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/feature_detection.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/files/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/files/files.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/folder_workflows.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/fs/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/fs/fs.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/ipfs_sync.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/ipfs_utils.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/lib.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/logger/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/logger/correlation.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/logger/logger.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/logger/structured.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/optional_deps.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/paths.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/performance/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/performance/optimizer.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/performance/rust_bridge.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/performance/uvloop_config.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/pickles/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/pickles/pickles.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/pyenv/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/pyenv/deps.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/pyenv/venv.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/script_sync.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/script_watcher.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/search/cached_vectorizer.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/secrets/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/secrets/commands.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/secrets/manager.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/secrets/repl.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/secrets/store.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/services/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/services/config.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/services/data_pipeline.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/services/health.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/services/lsh_client.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/services/manager.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/services/redis_service.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/services/registry.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/services/state.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/services/supervisor.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/shell/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/shell/exceptions.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/shell/shell.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/templates/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/templates/command_templates.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/toml/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/toml/toml.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/types.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/ui/styling.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/ui/visual_effects.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/watcher/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/watcher/watcher.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/workflow_models.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/workspace_registry.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/app.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/middleware.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/routers/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/routers/admin_router.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/routers/auth_router.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/routers/backtest_router.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/routers/data_router.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/routers/model_router.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/routers/monitoring_router.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/routers/portfolio_router.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/routers/prediction_router.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/routers/trade_router.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/routers/websocket_router.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/schemas.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/auth/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/auth/auth_manager.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/auth/models.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/auth/permissions.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/backtesting/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/backtesting/backtest_engine.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/backtesting/performance_metrics.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/backtesting/run.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/cache.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/cli/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/cli/main.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/config/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/config/settings.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/configs/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/configs/dvc_config.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/configs/mlflow_config.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/configs/mlops_manager.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/app.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/app_integrated.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/app_supabase.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/app_training.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/cli.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/common.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/components/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/components/charts.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/components/metrics.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/components/tables.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/overview.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/pages/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/pages/cicd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/pages/debug_dependencies.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/pages/gravity_viz.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/pages/monte_carlo_predictions.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/pages/predictions_enhanced.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/pages/scrapers_and_logs.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/pages/test_portfolio.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/pages/trading.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/pages/workflows.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/streamlit_extras_utils.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/styles.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/utils.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/warning_suppression.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/data_ingestion/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/data_ingestion/api_connectors.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/data_ingestion/data_pipeline.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/data_ingestion/stream_processor.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/database/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/database/migrations/env.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/database/models.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/database/session.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/experimentation/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/experimentation/ab_testing.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/features/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/features/ensemble_features.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/features/recommendation_engine.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/features/stock_features.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/features/test_feature_engineering.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/logging.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/mlops/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/mlops/data_versioning.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/mlops/experiment_tracker.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/mlops/model_serving.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/mlops/pipeline_orchestrator.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/models/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/models/base_models.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/models/ensemble_models.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/models/recommendation_models.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/models/test_models.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/monitoring/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/monitoring/drift_detection.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/monitoring/metrics.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/optimization/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/optimization/optimize.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/optimization/portfolio_optimizer.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/predictions/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/predictions/monte_carlo.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/predictions/prediction_engine.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/preprocessing/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/preprocessing/data_cleaners.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/preprocessing/feature_extractors.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/preprocessing/ml_pipeline.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/preprocessing/test_preprocessing.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/scripts/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/scripts/populate_sample_data.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/serving/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/serving/serve.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/tasks.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/tests/test_integration.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/tests/test_training_dashboard.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/trading/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/trading/alpaca_client.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/trading/migrations.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/trading/models.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/trading/paper_trading.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/trading/risk_management.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/trading/trading_service.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/training/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/training/train.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/training/train_model.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/mygroup/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/mygroup/test_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/public/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/public/commands/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/public/oi/oi.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/public/public.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/self/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/self/completion_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/self/env_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/self/health_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/self/ipfs_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/self/logs_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/self/migrate_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/self/self_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/self/store_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/self/test_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/self/workflows_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/storage/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/storage/backends/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/storage/backends/ipfs_backend.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/storage/base.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/storage/cache.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/storage/encryption.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/storage/factory.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/storage/registry.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/storage/storacha_cli.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/daemon/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/daemon/async_command_database.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/daemon/async_process_manager.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/daemon/client.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/daemon/daemon.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/daemon/daemon_api.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/daemon/enhanced_daemon.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/daemon/process_cli.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/daemon/process_manager.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/daemon/test_daemon.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/dashboard/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/dashboard/dashboard_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/doc_convert.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/docker/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/docker/docker.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/file/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/gcloud/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/gcloud/config.toml +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/gcloud/gcloud.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/git_commit/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/git_commit/ai_service.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/interview/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/lsh_integration.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/client.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/download_and_run_efficient_models.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/lightweight_embedder.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/lightweight_model_server.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/lightweight_test.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/model_service.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/ollama_efficient_runner.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/openai_adapter.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/pdf_processor.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/test_efficient_runner.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/test_example.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/test_integration.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/test_new_features.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/notebook/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/notebook/command_loader.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/notebook/converter.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/notebook/executor.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/notebook/notebook_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/notebook/schema.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/notebook/validator.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/openai/openai.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/registry/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/registry/registry.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/repo/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/repo/repo.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/scheduler/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/scheduler/cron_parser.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/scheduler/job.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/scheduler/models.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/scheduler/monitor.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/scheduler/persistence.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/scheduler/scheduler.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/scheduler/validation.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/search/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/secrets/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/secrets/secrets_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/storage/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/storage/storage_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/sync/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/sync/test_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/videos/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/wakatime/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/wakatime/wakatime.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/workflow.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli_framework.egg-info/SOURCES.txt +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli_framework.egg-info/dependency_links.txt +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli_framework.egg-info/entry_points.txt +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli_framework.egg-info/requires.txt +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli_framework.egg-info/top_level.txt +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_all_commands.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_app_logs_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_app_redis_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_logs_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_main_app.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_model_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_self_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_self_cmd_plugins.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_self_cmd_utilities.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_workflow_creation_commands.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_workflow_file.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_workflow_gcloud.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_workflow_registry.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/conftest.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/e2e/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/e2e/test_complete_workflows.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/e2e/test_model_workflow.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/e2e/test_new_user_workflow.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/e2e/test_update_workflow.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/fixtures/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/fixtures/chat_fixtures.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/fixtures/cli_fixtures.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/fixtures/command_fixtures.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/fixtures/data_fixtures.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/fixtures/db_fixtures.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/fixtures/model_fixtures.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_all_commands_comprehensive.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_daemon_server.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_direct_file_execution.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_e2e_dashboard_lsh_supabase.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_flask_webapp.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_folder_workflows_integration.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_gcloud_services.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_ml_auth.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_ml_data_pipeline.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_ml_models.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_ml_pipeline.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_module_imports.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_notebook_workflows.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_oi_service.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_repo_operations.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_scheduler_integration.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_service_registry.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_supabase_live_connection.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_video_processing.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_wakatime_api.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_webapp_full.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_workflow.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_workflow_commands.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/performance/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/property/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/storage/__init__.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/storage/test_cache.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/storage/test_encryption.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/storage/test_storacha_cli.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_api_utils.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_async_process_manager.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_auth_modules.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_bug_fixes.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_command_fixtures.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_config.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_correlation_logging.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_custom_commands.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_custom_commands_filtering.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_daemon_api.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_dashboard_components.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_dashboard_functions.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_dashboard_pages.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_dependencies.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_doc_convert_workflow.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_emulator_workflow.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_erd_generation.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_erd_generic.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_erd_imports.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_folder_workflows.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_git_commit_workflow.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_health_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_import_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_init_mv_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_ipfs_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_ipfs_retry.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_language_suffix.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_lib_auth.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_lib_files.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_lib_utils.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_logger.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_ml_preprocessing.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_notebook_command_loader.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_notebook_executor.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_optional_deps.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_paths.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_pdf_compress.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_prediction_engine.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_regression.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_scheduler.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_scheduler_cron_parser.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_scheduler_job.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_scheduler_models.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_scheduler_monitor.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_scheduler_persistence.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_scheduler_validation.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_script_loader_options.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_security_command_injection.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_self_update.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_service_config.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_service_health.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_service_manager.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_service_state.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_services_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_shell_exceptions.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_shell_functions.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_shell_security.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_store_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_supabase_connection.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_supabase_pagination.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_sync_cmd.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_toml_utils.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_trading_imports.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_ui_rich.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_uv_compat.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_workflow_file_completion.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_workflow_models.py +0 -0
- {mcli_framework-8.0.41 → mcli_framework-8.0.43}/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.43
|
|
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.43"
|
|
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"
|
|
@@ -252,7 +252,12 @@ Thumbs.db
|
|
|
252
252
|
if git_root:
|
|
253
253
|
table.add_row("Git Repository", str(git_root))
|
|
254
254
|
table.add_row("Lockfile", str(lockfile_path))
|
|
255
|
-
table.add_row("Git
|
|
255
|
+
table.add_row("Git Tracked", "Yes" if in_git_repo else "No")
|
|
256
|
+
if git:
|
|
257
|
+
table.add_row(
|
|
258
|
+
"Workflows Git",
|
|
259
|
+
"Yes" if (workflows_dir / ".git").exists() else "No",
|
|
260
|
+
)
|
|
256
261
|
|
|
257
262
|
console.print(table)
|
|
258
263
|
console.print()
|
|
@@ -12,8 +12,9 @@ Example:
|
|
|
12
12
|
import json
|
|
13
13
|
import os
|
|
14
14
|
import re
|
|
15
|
+
import shutil
|
|
15
16
|
import stat
|
|
16
|
-
import subprocess
|
|
17
|
+
import subprocess # nosec B404
|
|
17
18
|
import sys
|
|
18
19
|
import tempfile
|
|
19
20
|
from pathlib import Path
|
|
@@ -269,7 +270,7 @@ def restructure_file_as_command(
|
|
|
269
270
|
click.ClickException: If file cannot be read
|
|
270
271
|
"""
|
|
271
272
|
try:
|
|
272
|
-
with open(file_path,
|
|
273
|
+
with open(file_path, encoding="utf-8", errors="ignore") as f:
|
|
273
274
|
content = f.read()
|
|
274
275
|
except OSError as e:
|
|
275
276
|
logger.error(f"Failed to read file {file_path}: {e}")
|
|
@@ -329,9 +330,12 @@ def _get_python_template(t: ScriptTemplate) -> str:
|
|
|
329
330
|
import click
|
|
330
331
|
from typing import Optional, List
|
|
331
332
|
from pathlib import Path
|
|
332
|
-
from mcli.lib.logger.logger import get_logger
|
|
333
333
|
|
|
334
|
-
|
|
334
|
+
try:
|
|
335
|
+
from mcli.lib.logger.logger import get_logger
|
|
336
|
+
logger = get_logger()
|
|
337
|
+
except ImportError:
|
|
338
|
+
logger = None
|
|
335
339
|
|
|
336
340
|
|
|
337
341
|
@click.group(name="{t.name}")
|
|
@@ -346,8 +350,13 @@ def app():
|
|
|
346
350
|
@click.argument("name", default="World")
|
|
347
351
|
def hello(name: str):
|
|
348
352
|
"""Example subcommand."""
|
|
349
|
-
logger
|
|
353
|
+
if logger:
|
|
354
|
+
logger.info(f"Hello, {{name}}!")
|
|
350
355
|
click.echo(f"Hello, {{name}}!")
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
if __name__ == "__main__":
|
|
359
|
+
app()
|
|
351
360
|
'''
|
|
352
361
|
else:
|
|
353
362
|
return f'''#!/usr/bin/env python3
|
|
@@ -361,9 +370,12 @@ def hello(name: str):
|
|
|
361
370
|
import click
|
|
362
371
|
from typing import Optional, List
|
|
363
372
|
from pathlib import Path
|
|
364
|
-
from mcli.lib.logger.logger import get_logger
|
|
365
373
|
|
|
366
|
-
|
|
374
|
+
try:
|
|
375
|
+
from mcli.lib.logger.logger import get_logger
|
|
376
|
+
logger = get_logger()
|
|
377
|
+
except ImportError:
|
|
378
|
+
logger = None
|
|
367
379
|
|
|
368
380
|
|
|
369
381
|
@click.command(name="{t.name}")
|
|
@@ -372,8 +384,13 @@ def {t.name}_command(name: str):
|
|
|
372
384
|
"""
|
|
373
385
|
{t.description}
|
|
374
386
|
"""
|
|
375
|
-
logger
|
|
387
|
+
if logger:
|
|
388
|
+
logger.info(f"Hello, {{name}}! This is the {t.name} command.")
|
|
376
389
|
click.echo(f"Hello, {{name}}! This is the {t.name} command.")
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
if __name__ == "__main__":
|
|
393
|
+
{t.name}_command()
|
|
377
394
|
'''
|
|
378
395
|
|
|
379
396
|
|
|
@@ -505,7 +522,7 @@ if (args.length > 0) {{
|
|
|
505
522
|
|
|
506
523
|
def _get_ipynb_template(t: ScriptTemplate) -> str:
|
|
507
524
|
"""Generate Jupyter notebook template."""
|
|
508
|
-
notebook:
|
|
525
|
+
notebook: dict[str, Any] = {
|
|
509
526
|
"cells": [
|
|
510
527
|
{
|
|
511
528
|
"cell_type": "markdown",
|
|
@@ -609,13 +626,13 @@ def open_editor_for_script(
|
|
|
609
626
|
click.echo("Write your code and save the file to continue.")
|
|
610
627
|
click.echo("Press Ctrl+C to cancel.")
|
|
611
628
|
|
|
612
|
-
result = subprocess.run([editor, temp_file_path], check=False)
|
|
629
|
+
result = subprocess.run([editor, temp_file_path], check=False) # nosec B603
|
|
613
630
|
|
|
614
631
|
if result.returncode != 0:
|
|
615
632
|
click.echo("Editor exited with error. Command creation cancelled.")
|
|
616
633
|
return None
|
|
617
634
|
|
|
618
|
-
with open(temp_file_path
|
|
635
|
+
with open(temp_file_path) as f:
|
|
619
636
|
edited_code = f.read()
|
|
620
637
|
|
|
621
638
|
if not edited_code.strip():
|
|
@@ -642,8 +659,7 @@ def _find_editor() -> Optional[str]:
|
|
|
642
659
|
return editor
|
|
643
660
|
|
|
644
661
|
for common_editor in ["vim", "nano", "code", "subl", "atom", "emacs"]:
|
|
645
|
-
|
|
646
|
-
if result.returncode == 0:
|
|
662
|
+
if shutil.which(common_editor):
|
|
647
663
|
return common_editor
|
|
648
664
|
|
|
649
665
|
return None
|
|
@@ -783,7 +799,7 @@ def new(
|
|
|
783
799
|
description=description,
|
|
784
800
|
cmd_version=cmd_version,
|
|
785
801
|
template=template,
|
|
786
|
-
shell=shell,
|
|
802
|
+
shell=shell, # nosec B604
|
|
787
803
|
is_global=is_global,
|
|
788
804
|
source_file=source_file,
|
|
789
805
|
)
|
|
@@ -892,7 +908,7 @@ def _execute_new_command(
|
|
|
892
908
|
cmd_version=cmd_version,
|
|
893
909
|
language=language,
|
|
894
910
|
command_type=command_type,
|
|
895
|
-
shell=shell,
|
|
911
|
+
shell=shell, # nosec B604
|
|
896
912
|
template=template,
|
|
897
913
|
script_path=script_path,
|
|
898
914
|
)
|
|
@@ -913,7 +929,7 @@ def _execute_new_command(
|
|
|
913
929
|
_display_success_message(
|
|
914
930
|
command_name=command_name,
|
|
915
931
|
language=language,
|
|
916
|
-
shell=shell,
|
|
932
|
+
shell=shell, # nosec B604
|
|
917
933
|
saved_path=saved_path,
|
|
918
934
|
command_group=command_group,
|
|
919
935
|
is_global=is_global,
|
|
@@ -948,7 +964,7 @@ def _generate_or_edit_code(
|
|
|
948
964
|
version=cmd_version,
|
|
949
965
|
language=language,
|
|
950
966
|
command_type=command_type,
|
|
951
|
-
shell=shell,
|
|
967
|
+
shell=shell, # nosec B604
|
|
952
968
|
)
|
|
953
969
|
|
|
954
970
|
try:
|
|
@@ -1095,19 +1095,25 @@ class VenvMessages:
|
|
|
1095
1095
|
|
|
1096
1096
|
# Info
|
|
1097
1097
|
DETECTING_VENV = "Detecting Python environment..."
|
|
1098
|
+
USING_OVERRIDE_VENV = "Using override venv: {path}"
|
|
1098
1099
|
USING_LOCAL_VENV = "Using local venv: {path}"
|
|
1099
|
-
USING_GLOBAL_VENV = "Using global
|
|
1100
|
+
USING_GLOBAL_VENV = "Using global venv: {path}"
|
|
1100
1101
|
USING_SYSTEM_PYTHON = "Using system Python: {path}"
|
|
1102
|
+
USING_SYSTEM_PYTHON_ENV_SET = "Using system Python (MCLI_USE_SYSTEM_PYTHON set)"
|
|
1101
1103
|
CREATING_GLOBAL_VENV = "Creating global MCLI venv at {path}..."
|
|
1102
1104
|
GLOBAL_VENV_CREATED = "Created global MCLI venv at {path}"
|
|
1103
1105
|
|
|
1104
1106
|
# Dependency messages
|
|
1107
|
+
NO_DEPS_SPECIFIED = "No dependencies specified"
|
|
1105
1108
|
CHECKING_DEPS = "Checking dependencies for {script}..."
|
|
1106
1109
|
DEPS_SATISFIED = "All dependencies satisfied"
|
|
1107
1110
|
MISSING_DEPS = "Missing dependencies: {packages}"
|
|
1108
1111
|
INSTALLING_DEPS = "Installing dependencies: {packages}"
|
|
1109
1112
|
DEPS_INSTALLED = "Dependencies installed successfully"
|
|
1110
1113
|
|
|
1114
|
+
# Non-interactive
|
|
1115
|
+
NON_INTERACTIVE_AUTO_INSTALL = "Non-interactive mode detected, auto-installing dependencies"
|
|
1116
|
+
|
|
1111
1117
|
# Prompts
|
|
1112
1118
|
PROMPT_INSTALL_DEPS = "Install missing dependencies to {venv}? [{packages}]"
|
|
1113
1119
|
|
|
@@ -5,7 +5,7 @@ including environment detection, dependency checking, and script execution.
|
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
7
|
import os
|
|
8
|
-
import subprocess
|
|
8
|
+
import subprocess # nosec B404
|
|
9
9
|
import sys
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
from typing import Dict, List, Optional, Tuple
|
|
@@ -42,7 +42,7 @@ class PyEnvManager:
|
|
|
42
42
|
self._resolved_venv: Optional[Path] = None
|
|
43
43
|
self._resolved_source: Optional[str] = None
|
|
44
44
|
|
|
45
|
-
def resolve_environment(self) ->
|
|
45
|
+
def resolve_environment(self) -> tuple[Optional[Path], str]:
|
|
46
46
|
"""Resolve which virtual environment to use.
|
|
47
47
|
|
|
48
48
|
Resolution order:
|
|
@@ -65,14 +65,14 @@ class PyEnvManager:
|
|
|
65
65
|
if venv_path.is_dir():
|
|
66
66
|
self._resolved_venv = venv_path
|
|
67
67
|
self._resolved_source = "override"
|
|
68
|
-
logger.debug(
|
|
68
|
+
logger.debug(VenvMessages.USING_OVERRIDE_VENV.format(path=venv_path))
|
|
69
69
|
return venv_path, "override"
|
|
70
70
|
|
|
71
71
|
# Check if user wants system Python
|
|
72
72
|
if os.getenv(EnvVars.MCLI_USE_SYSTEM_PYTHON, "").lower() in ("true", "1", "yes"):
|
|
73
73
|
self._resolved_venv = None
|
|
74
74
|
self._resolved_source = "system"
|
|
75
|
-
logger.debug(
|
|
75
|
+
logger.debug(VenvMessages.USING_SYSTEM_PYTHON_ENV_SET)
|
|
76
76
|
return None, "system"
|
|
77
77
|
|
|
78
78
|
# Try to find local venv
|
|
@@ -80,14 +80,14 @@ class PyEnvManager:
|
|
|
80
80
|
if local_venv:
|
|
81
81
|
self._resolved_venv = local_venv
|
|
82
82
|
self._resolved_source = "local"
|
|
83
|
-
logger.debug(
|
|
83
|
+
logger.debug(VenvMessages.USING_LOCAL_VENV.format(path=local_venv))
|
|
84
84
|
return local_venv, "local"
|
|
85
85
|
|
|
86
86
|
# Fall back to global venv
|
|
87
87
|
global_venv = self.venv_manager.get_global_venv_path()
|
|
88
88
|
self._resolved_venv = global_venv
|
|
89
89
|
self._resolved_source = "global"
|
|
90
|
-
logger.debug(
|
|
90
|
+
logger.debug(VenvMessages.USING_GLOBAL_VENV.format(path=global_venv))
|
|
91
91
|
return global_venv, "global"
|
|
92
92
|
|
|
93
93
|
def get_python_executable(self) -> Path:
|
|
@@ -105,7 +105,7 @@ class PyEnvManager:
|
|
|
105
105
|
|
|
106
106
|
def check_and_install_deps(
|
|
107
107
|
self,
|
|
108
|
-
requires:
|
|
108
|
+
requires: list[str],
|
|
109
109
|
script_name: str,
|
|
110
110
|
auto_install: bool = False,
|
|
111
111
|
) -> bool:
|
|
@@ -120,7 +120,7 @@ class PyEnvManager:
|
|
|
120
120
|
True if all dependencies are satisfied or installed.
|
|
121
121
|
"""
|
|
122
122
|
if not requires:
|
|
123
|
-
logger.debug(
|
|
123
|
+
logger.debug(VenvMessages.NO_DEPS_SPECIFIED)
|
|
124
124
|
return True
|
|
125
125
|
|
|
126
126
|
venv_path, source = self.resolve_environment()
|
|
@@ -155,6 +155,10 @@ class PyEnvManager:
|
|
|
155
155
|
|
|
156
156
|
if auto_install or env_auto_install:
|
|
157
157
|
should_install = True
|
|
158
|
+
elif not sys.stdin.isatty():
|
|
159
|
+
# Non-interactive context (piped input, CI, subprocess) — auto-install
|
|
160
|
+
logger.info(VenvMessages.NON_INTERACTIVE_AUTO_INSTALL)
|
|
161
|
+
should_install = True
|
|
158
162
|
else:
|
|
159
163
|
# Prompt user
|
|
160
164
|
venv_display = str(venv_path) if venv_path else "system"
|
|
@@ -177,11 +181,14 @@ class PyEnvManager:
|
|
|
177
181
|
def execute_in_venv(
|
|
178
182
|
self,
|
|
179
183
|
script_path: Path,
|
|
180
|
-
args:
|
|
181
|
-
env: Optional[
|
|
184
|
+
args: list[str],
|
|
185
|
+
env: Optional[dict[str, str]] = None,
|
|
182
186
|
) -> subprocess.CompletedProcess:
|
|
183
187
|
"""Execute a Python script in the resolved virtual environment.
|
|
184
188
|
|
|
189
|
+
When running in a TTY, stdio is inherited so interactive/TUI apps
|
|
190
|
+
(e.g. Textual, curses) work correctly. Otherwise output is captured.
|
|
191
|
+
|
|
185
192
|
Args:
|
|
186
193
|
script_path: Path to the Python script.
|
|
187
194
|
args: Command line arguments for the script.
|
|
@@ -203,15 +210,21 @@ class PyEnvManager:
|
|
|
203
210
|
exec_env.update(env)
|
|
204
211
|
|
|
205
212
|
python_exe = self.get_python_executable()
|
|
213
|
+
cmd = [str(python_exe), str(script_path)] + args
|
|
206
214
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
env=exec_env
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
215
|
+
if sys.stdout.isatty():
|
|
216
|
+
# Interactive: inherit stdio so TUI frameworks work
|
|
217
|
+
return subprocess.run(cmd, env=exec_env) # nosec B603
|
|
218
|
+
else:
|
|
219
|
+
# Non-interactive: capture output for piping
|
|
220
|
+
return subprocess.run( # nosec B603
|
|
221
|
+
cmd,
|
|
222
|
+
env=exec_env,
|
|
223
|
+
capture_output=True,
|
|
224
|
+
text=True,
|
|
225
|
+
)
|
|
213
226
|
|
|
214
|
-
def get_status(self) ->
|
|
227
|
+
def get_status(self) -> dict[str, str]:
|
|
215
228
|
"""Get the current environment status for display.
|
|
216
229
|
|
|
217
230
|
Returns:
|
|
@@ -518,7 +518,7 @@ class ScriptLoader:
|
|
|
518
518
|
ctx.exit(1)
|
|
519
519
|
return
|
|
520
520
|
|
|
521
|
-
# Execute in venv
|
|
521
|
+
# Execute in venv (inherits stdio when TTY, captures otherwise)
|
|
522
522
|
logger.info(f"Executing Python command in venv: {name}")
|
|
523
523
|
result = env_manager.execute_in_venv(
|
|
524
524
|
script_path,
|
|
@@ -526,6 +526,7 @@ class ScriptLoader:
|
|
|
526
526
|
env={"MCLI_COMMAND": name},
|
|
527
527
|
)
|
|
528
528
|
|
|
529
|
+
# Only echo captured output (non-TTY mode)
|
|
529
530
|
if result.stdout:
|
|
530
531
|
click.echo(result.stdout, nl=False)
|
|
531
532
|
if result.stderr:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcli-framework
|
|
3
|
-
Version: 8.0.
|
|
3
|
+
Version: 8.0.43
|
|
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>
|
|
@@ -328,6 +328,35 @@ class TestGetTemplate:
|
|
|
328
328
|
assert "def mycommand_command" in result
|
|
329
329
|
assert "@click.command" in result
|
|
330
330
|
|
|
331
|
+
def test_python_template_standalone_has_main_guard(self):
|
|
332
|
+
"""Standalone template includes if __name__ == '__main__' for subprocess compat."""
|
|
333
|
+
template = ScriptTemplate(
|
|
334
|
+
name="mycommand",
|
|
335
|
+
description="My command",
|
|
336
|
+
group="utils",
|
|
337
|
+
version="1.0.0",
|
|
338
|
+
language=ScriptLanguages.PYTHON,
|
|
339
|
+
command_type=CommandTypes.COMMAND,
|
|
340
|
+
)
|
|
341
|
+
result = get_template(template)
|
|
342
|
+
assert 'if __name__ == "__main__":' in result
|
|
343
|
+
assert "mycommand_command()" in result
|
|
344
|
+
|
|
345
|
+
def test_python_template_standalone_safe_logger_import(self):
|
|
346
|
+
"""Standalone template uses try/except for mcli logger import."""
|
|
347
|
+
template = ScriptTemplate(
|
|
348
|
+
name="mycommand",
|
|
349
|
+
description="My command",
|
|
350
|
+
group="utils",
|
|
351
|
+
version="1.0.0",
|
|
352
|
+
language=ScriptLanguages.PYTHON,
|
|
353
|
+
command_type=CommandTypes.COMMAND,
|
|
354
|
+
)
|
|
355
|
+
result = get_template(template)
|
|
356
|
+
assert "try:" in result
|
|
357
|
+
assert "except ImportError:" in result
|
|
358
|
+
assert "from mcli.lib.logger.logger import get_logger" in result
|
|
359
|
+
|
|
331
360
|
def test_python_template_group(self):
|
|
332
361
|
"""Generate Python command group template."""
|
|
333
362
|
template = ScriptTemplate(
|
|
@@ -345,6 +374,34 @@ class TestGetTemplate:
|
|
|
345
374
|
assert "def app():" in result
|
|
346
375
|
assert "@app.command" in result
|
|
347
376
|
|
|
377
|
+
def test_python_template_group_has_main_guard(self):
|
|
378
|
+
"""Group template includes if __name__ == '__main__' for subprocess compat."""
|
|
379
|
+
template = ScriptTemplate(
|
|
380
|
+
name="mygroup",
|
|
381
|
+
description="My group",
|
|
382
|
+
group="utils",
|
|
383
|
+
version="1.0.0",
|
|
384
|
+
language=ScriptLanguages.PYTHON,
|
|
385
|
+
command_type=CommandTypes.GROUP,
|
|
386
|
+
)
|
|
387
|
+
result = get_template(template)
|
|
388
|
+
assert 'if __name__ == "__main__":' in result
|
|
389
|
+
assert "app()" in result
|
|
390
|
+
|
|
391
|
+
def test_python_template_group_safe_logger_import(self):
|
|
392
|
+
"""Group template uses try/except for mcli logger import."""
|
|
393
|
+
template = ScriptTemplate(
|
|
394
|
+
name="mygroup",
|
|
395
|
+
description="My group",
|
|
396
|
+
group="utils",
|
|
397
|
+
version="1.0.0",
|
|
398
|
+
language=ScriptLanguages.PYTHON,
|
|
399
|
+
command_type=CommandTypes.GROUP,
|
|
400
|
+
)
|
|
401
|
+
result = get_template(template)
|
|
402
|
+
assert "try:" in result
|
|
403
|
+
assert "except ImportError:" in result
|
|
404
|
+
|
|
348
405
|
def test_shell_template(self):
|
|
349
406
|
"""Generate shell template."""
|
|
350
407
|
template = ScriptTemplate(
|
|
@@ -339,6 +339,68 @@ class TestPyEnvManager:
|
|
|
339
339
|
assert status["source"] == "system"
|
|
340
340
|
|
|
341
341
|
|
|
342
|
+
class TestCheckAndInstallDeps:
|
|
343
|
+
"""Tests for PyEnvManager.check_and_install_deps non-interactive behavior."""
|
|
344
|
+
|
|
345
|
+
def test_auto_installs_when_stdin_not_tty(self):
|
|
346
|
+
"""Auto-install deps when stdin is not a TTY (non-interactive)."""
|
|
347
|
+
from mcli.lib.pyenv import PyEnvManager
|
|
348
|
+
|
|
349
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
|
350
|
+
workspace = Path(tmpdir)
|
|
351
|
+
|
|
352
|
+
with patch.dict(os.environ, {"MCLI_USE_SYSTEM_PYTHON": "true"}):
|
|
353
|
+
manager = PyEnvManager(workspace_dir=workspace)
|
|
354
|
+
|
|
355
|
+
with (
|
|
356
|
+
patch.object(manager, "resolve_environment", return_value=(None, "system")),
|
|
357
|
+
patch.object(
|
|
358
|
+
manager, "get_python_executable", return_value=Path(sys.executable)
|
|
359
|
+
),
|
|
360
|
+
patch("mcli.lib.pyenv.manager.DependencyChecker") as mock_checker_cls,
|
|
361
|
+
patch("sys.stdin") as mock_stdin,
|
|
362
|
+
):
|
|
363
|
+
mock_stdin.isatty.return_value = False
|
|
364
|
+
mock_checker = mock_checker_cls.return_value
|
|
365
|
+
mock_checker.parse_requires.return_value = ["fake-pkg"]
|
|
366
|
+
mock_checker.check_installed.return_value = ([], ["fake-pkg"])
|
|
367
|
+
mock_checker.install_packages.return_value = None
|
|
368
|
+
|
|
369
|
+
result = manager.check_and_install_deps(["fake-pkg"], "test_script")
|
|
370
|
+
|
|
371
|
+
assert result is True
|
|
372
|
+
mock_checker.install_packages.assert_called_once()
|
|
373
|
+
|
|
374
|
+
def test_prompts_when_stdin_is_tty(self):
|
|
375
|
+
"""Prompt user when stdin IS a TTY (interactive)."""
|
|
376
|
+
from mcli.lib.pyenv import PyEnvManager
|
|
377
|
+
|
|
378
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
|
379
|
+
workspace = Path(tmpdir)
|
|
380
|
+
|
|
381
|
+
with patch.dict(os.environ, {"MCLI_USE_SYSTEM_PYTHON": "true"}):
|
|
382
|
+
manager = PyEnvManager(workspace_dir=workspace)
|
|
383
|
+
|
|
384
|
+
with (
|
|
385
|
+
patch.object(manager, "resolve_environment", return_value=(None, "system")),
|
|
386
|
+
patch.object(
|
|
387
|
+
manager, "get_python_executable", return_value=Path(sys.executable)
|
|
388
|
+
),
|
|
389
|
+
patch("mcli.lib.pyenv.manager.DependencyChecker") as mock_checker_cls,
|
|
390
|
+
patch("sys.stdin") as mock_stdin,
|
|
391
|
+
patch("click.confirm", return_value=False) as mock_confirm,
|
|
392
|
+
):
|
|
393
|
+
mock_stdin.isatty.return_value = True
|
|
394
|
+
mock_checker = mock_checker_cls.return_value
|
|
395
|
+
mock_checker.parse_requires.return_value = ["fake-pkg"]
|
|
396
|
+
mock_checker.check_installed.return_value = ([], ["fake-pkg"])
|
|
397
|
+
|
|
398
|
+
result = manager.check_and_install_deps(["fake-pkg"], "test_script")
|
|
399
|
+
|
|
400
|
+
assert result is False
|
|
401
|
+
mock_confirm.assert_called_once()
|
|
402
|
+
|
|
403
|
+
|
|
342
404
|
class TestPyEnvIntegration:
|
|
343
405
|
"""Integration tests for pyenv module."""
|
|
344
406
|
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|