mcli-framework 8.0.60__tar.gz → 8.0.62__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.60/src/mcli_framework.egg-info → mcli_framework-8.0.62}/PKG-INFO +1 -1
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/pyproject.toml +1 -1
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/constants/defaults.py +1 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/constants/messages.py +4 -0
- mcli_framework-8.0.62/src/mcli/lib/workflow_runtime.py +100 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/ci/act_runner.py +90 -27
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/workflow.py +3 -2
- {mcli_framework-8.0.60 → mcli_framework-8.0.62/src/mcli_framework.egg-info}/PKG-INFO +1 -1
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli_framework.egg-info/SOURCES.txt +1 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/LICENSE +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/MANIFEST.in +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/README.md +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/llms-full.txt +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/llms.txt +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/mcli_rust/Cargo.toml +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/mcli_rust/src/command_parser.rs +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/mcli_rust/src/file_watcher.rs +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/mcli_rust/src/lib.rs +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/mcli_rust/src/process_manager.rs +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/mcli_rust/src/tfidf.rs +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/setup.cfg +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/__main__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/app/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/app/completion_helpers.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/app/context_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/app/delete_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/app/edit_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/app/import_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/app/init_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/app/list_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/app/main.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/app/model/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/app/model/model.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/app/model_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/app/mv_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/app/new_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/app/search_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/app/services_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/app/setup_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/app/source_sync_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/app/sync_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/app/video/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/app/video/video.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/config.toml +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/api/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/api/api.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/api/daemon_client.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/api/daemon_client_local.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/api/daemon_decorator.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/api/mcli_decorators.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/auth/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/auth/auth.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/auth/aws_manager.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/auth/azure_manager.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/auth/credential_manager.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/auth/gcp_manager.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/auth/key_manager.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/auth/mcli_manager.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/auth/token_manager.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/auth/token_util.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/config/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/config/config.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/config/settings.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/constants/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/constants/commands.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/constants/env.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/constants/paths.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/constants/scripts.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/constants/storage.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/custom_commands.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/discovery/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/discovery/command_discovery.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/erd/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/erd/erd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/erd/generate_graph.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/errors.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/feature_detection.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/files/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/files/files.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/folder_workflows.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/fs/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/fs/fs.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/ipfs_sync.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/ipfs_utils.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/ipns_manager.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/lib.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/logger/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/logger/correlation.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/logger/logger.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/logger/structured.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/optional_deps.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/paths.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/performance/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/performance/optimizer.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/performance/rust_bridge.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/performance/uvloop_config.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/pickles/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/pickles/pickles.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/pyenv/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/pyenv/deps.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/pyenv/manager.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/pyenv/venv.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/script_loader.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/script_sync.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/script_watcher.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/search/cached_vectorizer.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/secrets/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/secrets/commands.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/secrets/manager.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/secrets/repl.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/secrets/store.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/services/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/services/config.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/services/data_pipeline.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/services/health.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/services/lsh_client.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/services/manager.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/services/redis_service.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/services/registry.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/services/state.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/services/supervisor.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/shell/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/shell/exceptions.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/shell/shell.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/sync_key_store.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/templates/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/templates/command_templates.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/toml/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/toml/toml.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/types.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/ui/styling.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/ui/visual_effects.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/watcher/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/watcher/watcher.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/workflow_models.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/lib/workspace_registry.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/mygroup/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/mygroup/test_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/public/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/public/commands/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/public/oi/oi.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/public/public.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/self/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/self/completion_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/self/env_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/self/health_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/self/ipfs_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/self/logs_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/self/migrate_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/self/release_notes_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/self/self_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/self/store_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/self/test_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/self/workflows_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/storage/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/storage/backends/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/storage/backends/ipfs_backend.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/storage/base.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/storage/cache.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/storage/encryption.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/storage/factory.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/storage/registry.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/storage/storacha_cli.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/ci/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/ci/ci.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/ci/runner_status.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/ci/workflow_transform.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/daemon/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/daemon/async_command_database.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/daemon/async_process_manager.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/daemon/client.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/daemon/daemon.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/daemon/daemon_api.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/daemon/enhanced_daemon.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/daemon/process_cli.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/daemon/process_manager.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/daemon/test_daemon.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/doc_convert.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/docker/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/docker/docker.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/file/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/gcloud/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/gcloud/config.toml +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/gcloud/gcloud.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/git_commit/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/git_commit/ai_service.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/interview/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/lsh_integration.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/model_service/client.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/model_service/download_and_run_efficient_models.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/model_service/lightweight_embedder.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/model_service/lightweight_model_server.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/model_service/lightweight_test.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/model_service/model_service.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/model_service/ollama_efficient_runner.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/model_service/openai_adapter.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/model_service/pdf_processor.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/model_service/test_efficient_runner.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/model_service/test_example.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/model_service/test_integration.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/model_service/test_new_features.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/notebook/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/notebook/command_loader.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/notebook/converter.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/notebook/executor.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/notebook/notebook_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/notebook/schema.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/notebook/validator.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/openai/openai.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/registry/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/registry/registry.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/repo/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/repo/repo.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/scheduler/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/scheduler/cron_parser.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/scheduler/job.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/scheduler/models.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/scheduler/monitor.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/scheduler/persistence.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/scheduler/scheduler.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/scheduler/validation.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/search/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/secrets/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/secrets/secrets_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/storage/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/storage/storage_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/sync/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/sync/test_cmd.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/videos/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/wakatime/__init__.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli/workflow/wakatime/wakatime.py +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli_framework.egg-info/dependency_links.txt +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli_framework.egg-info/entry_points.txt +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli_framework.egg-info/requires.txt +0 -0
- {mcli_framework-8.0.60 → mcli_framework-8.0.62}/src/mcli_framework.egg-info/top_level.txt +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.62
|
|
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.62"
|
|
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"
|
|
@@ -39,6 +39,7 @@ class URLs:
|
|
|
39
39
|
GITHUB_API = "https://api.github.com"
|
|
40
40
|
GITHUB_API_MCLI = "https://api.github.com/repos/gwicho38/mcli"
|
|
41
41
|
GITHUB_API_ACTIONS = "https://api.github.com/repos/gwicho38/mcli/actions/runs"
|
|
42
|
+
GITHUB_ISSUES_MCLI = "https://github.com/gwicho38/mcli/issues"
|
|
42
43
|
|
|
43
44
|
# PyPI
|
|
44
45
|
PYPI_API = "https://pypi.org/pypi"
|
|
@@ -17,6 +17,7 @@ class ErrorMessages:
|
|
|
17
17
|
)
|
|
18
18
|
COMMAND_NOT_FOUND = "Command '{name}' not found"
|
|
19
19
|
COMMAND_NOT_AVAILABLE = "Command {name} is not available"
|
|
20
|
+
WORKFLOW_CRASHED = "Workflow '{name}' crashed: {error}"
|
|
20
21
|
GIT_COMMAND_FAILED = "Git command failed: {error}"
|
|
21
22
|
FILE_NOT_FOUND = "File not found: {path}"
|
|
22
23
|
DIRECTORY_NOT_FOUND = "Directory not found: {path}"
|
|
@@ -66,6 +67,9 @@ class InfoMessages:
|
|
|
66
67
|
|
|
67
68
|
COPYING_COMMANDS = "Copying commands from {source} to {dest}..."
|
|
68
69
|
NO_CHANGES_TO_COMMIT = "No changes to commit"
|
|
70
|
+
WORKFLOW_CRASH_LOCATION = " in {location}"
|
|
71
|
+
WORKFLOW_CRASH_TRACE_HINT = " Set MCLI_TRACE_LEVEL=1 (or MCLI_DEBUG=1) for the full traceback."
|
|
72
|
+
WORKFLOW_CRASH_REPORT = " Report this: {url}"
|
|
69
73
|
LOADING = "Loading {item}..."
|
|
70
74
|
PROCESSING = "Processing {item}..."
|
|
71
75
|
CONNECTING = "Connecting to {service}..."
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"""Runtime helpers for executing user workflow scripts safely.
|
|
2
|
+
|
|
3
|
+
When a dynamically-loaded workflow script raises an unhandled exception at
|
|
4
|
+
*invoke* time (i.e. it loads fine but crashes while running), Click/Python
|
|
5
|
+
would dump a raw traceback at the user. That tells them little about which
|
|
6
|
+
script failed or what to do next.
|
|
7
|
+
|
|
8
|
+
``wrap_command_invoke`` wraps a loaded command so such crashes are rendered as
|
|
9
|
+
a concise, actionable message — which workflow crashed, the error, the script
|
|
10
|
+
location, and how to report it. The full traceback stays one env var away
|
|
11
|
+
(``MCLI_TRACE_LEVEL`` / ``MCLI_DEBUG``) for debugging.
|
|
12
|
+
|
|
13
|
+
Click usage errors, ``Abort`` and ``SystemExit`` are deliberately *not*
|
|
14
|
+
swallowed — those are normal control flow, not script crashes.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import os
|
|
20
|
+
import sys
|
|
21
|
+
import traceback
|
|
22
|
+
from pathlib import Path
|
|
23
|
+
|
|
24
|
+
import click
|
|
25
|
+
from rich.console import Console
|
|
26
|
+
|
|
27
|
+
from mcli.lib.constants.defaults import URLs
|
|
28
|
+
from mcli.lib.constants.env import EnvVars
|
|
29
|
+
from mcli.lib.constants.messages import ErrorMessages, InfoMessages
|
|
30
|
+
|
|
31
|
+
# Module-level so tests can redirect it to a buffer.
|
|
32
|
+
_console = Console(stderr=True)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _wants_traceback() -> bool:
|
|
36
|
+
"""Whether to print the full traceback (debug/trace modes)."""
|
|
37
|
+
trace = os.environ.get(EnvVars.MCLI_TRACE_LEVEL, "").strip()
|
|
38
|
+
if trace and trace != "0":
|
|
39
|
+
return True
|
|
40
|
+
debug = os.environ.get(EnvVars.MCLI_DEBUG, "").strip().lower()
|
|
41
|
+
return debug in ("1", "true", "yes", "on")
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _deepest_script_line(script_path: Path, exc: BaseException) -> int | None:
|
|
45
|
+
"""Return the deepest line number within the user's script, if any."""
|
|
46
|
+
target = str(script_path)
|
|
47
|
+
line: int | None = None
|
|
48
|
+
for frame, lineno in traceback.walk_tb(exc.__traceback__):
|
|
49
|
+
if frame.f_code.co_filename == target:
|
|
50
|
+
line = lineno
|
|
51
|
+
return line
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def render_script_error(name: str, script_path: str | Path, exc: BaseException) -> None:
|
|
55
|
+
"""Print a concise, actionable crash summary for a workflow script."""
|
|
56
|
+
script_path = Path(script_path)
|
|
57
|
+
line = _deepest_script_line(script_path, exc)
|
|
58
|
+
location = str(script_path) if line is None else f"{script_path}:{line}"
|
|
59
|
+
|
|
60
|
+
summary = ErrorMessages.WORKFLOW_CRASHED.format(name=name, error=f"{type(exc).__name__}: {exc}")
|
|
61
|
+
_console.print(f"[bold red]✗[/bold red] {summary}", soft_wrap=True, highlight=False)
|
|
62
|
+
_console.print(
|
|
63
|
+
InfoMessages.WORKFLOW_CRASH_LOCATION.format(location=location),
|
|
64
|
+
soft_wrap=True,
|
|
65
|
+
highlight=False,
|
|
66
|
+
)
|
|
67
|
+
_console.print(InfoMessages.WORKFLOW_CRASH_TRACE_HINT, soft_wrap=True, highlight=False)
|
|
68
|
+
_console.print(
|
|
69
|
+
InfoMessages.WORKFLOW_CRASH_REPORT.format(url=URLs.GITHUB_ISSUES_MCLI),
|
|
70
|
+
soft_wrap=True,
|
|
71
|
+
highlight=False,
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
if _wants_traceback():
|
|
75
|
+
traceback.print_exception(type(exc), exc, exc.__traceback__, file=sys.stderr)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def wrap_command_invoke(command: click.BaseCommand, script_path: str | Path):
|
|
79
|
+
"""Wrap a loaded command so runtime crashes render a friendly message.
|
|
80
|
+
|
|
81
|
+
Returns the same command (mutated in place). ``None`` passes through so
|
|
82
|
+
callers don't need to guard.
|
|
83
|
+
"""
|
|
84
|
+
if command is None:
|
|
85
|
+
return command
|
|
86
|
+
|
|
87
|
+
path = Path(script_path)
|
|
88
|
+
original_invoke = command.invoke
|
|
89
|
+
|
|
90
|
+
def safe_invoke(ctx):
|
|
91
|
+
try:
|
|
92
|
+
return original_invoke(ctx)
|
|
93
|
+
except (click.ClickException, click.Abort, SystemExit, KeyboardInterrupt):
|
|
94
|
+
raise
|
|
95
|
+
except Exception as exc: # noqa: BLE001 - intentional catch-all for user scripts
|
|
96
|
+
render_script_error(command.name or path.stem, path, exc)
|
|
97
|
+
raise SystemExit(1) from exc
|
|
98
|
+
|
|
99
|
+
command.invoke = safe_invoke # type: ignore[method-assign]
|
|
100
|
+
return command
|
|
@@ -28,13 +28,14 @@ _NO_STAGES_MARKERS = ("could not find any stages to run",)
|
|
|
28
28
|
_RETRY_BACKOFF = (15, 45)
|
|
29
29
|
_MAX_RETRIES = 2
|
|
30
30
|
|
|
31
|
-
# Canonical CI entrypoint created by `mcli ci migrate`: ci.yml
|
|
32
|
-
#
|
|
33
|
-
# `
|
|
34
|
-
#
|
|
35
|
-
# must drive it through this caller.
|
|
31
|
+
# Canonical CI entrypoint created by `mcli ci migrate`: ci.yml runs on
|
|
32
|
+
# `workflow_dispatch`. The job id is NOT fixed (`mcli ci migrate` keeps the
|
|
33
|
+
# repo's original job name, e.g. `test`) — so preflight discovers the real job
|
|
34
|
+
# id(s) from `act --list` rather than assuming a hardcoded name.
|
|
36
35
|
_DISPATCH_WORKFLOW = Path(".github/workflows/ci.yml")
|
|
37
|
-
|
|
36
|
+
|
|
37
|
+
# Header label of the job-id column in `act --list` table output.
|
|
38
|
+
_JOB_ID_HEADER = "Job ID"
|
|
38
39
|
|
|
39
40
|
|
|
40
41
|
class PreflightResult(Enum):
|
|
@@ -115,13 +116,53 @@ def default_container_arch() -> str | None:
|
|
|
115
116
|
return None
|
|
116
117
|
|
|
117
118
|
|
|
118
|
-
def
|
|
119
|
-
"""The canonical
|
|
119
|
+
def dispatch_workflow() -> str | None:
|
|
120
|
+
"""The canonical workflow file to drive via `workflow_dispatch`, or None."""
|
|
120
121
|
if _DISPATCH_WORKFLOW.exists():
|
|
121
|
-
return
|
|
122
|
+
return str(_DISPATCH_WORKFLOW)
|
|
122
123
|
return None
|
|
123
124
|
|
|
124
125
|
|
|
126
|
+
def list_jobs(event: str, workflow: str | None = None) -> list[str]:
|
|
127
|
+
"""Real job ids act would run for `event`, parsed from the `act --list` table.
|
|
128
|
+
|
|
129
|
+
`act --list` prints a table whose first row is a header containing a `Job ID`
|
|
130
|
+
column; each subsequent row is a runnable job. Returns job ids in table order
|
|
131
|
+
(deduplicated). Returns ``[]`` when act lists no jobs for the event (including
|
|
132
|
+
the "could not find any stages" no-op) or when act can't be invoked — never
|
|
133
|
+
raises, so callers can treat an empty result as "nothing to run".
|
|
134
|
+
"""
|
|
135
|
+
cmd = ["act", event, "--list"]
|
|
136
|
+
if workflow is not None:
|
|
137
|
+
cmd += ["-W", workflow]
|
|
138
|
+
try:
|
|
139
|
+
proc = subprocess.run(cmd, capture_output=True, text=True, timeout=120)
|
|
140
|
+
except (FileNotFoundError, subprocess.TimeoutExpired):
|
|
141
|
+
return []
|
|
142
|
+
return _parse_job_ids(proc.stdout or "")
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def _parse_job_ids(listing: str) -> list[str]:
|
|
146
|
+
"""Extract the `Job ID` column from `act --list` table output."""
|
|
147
|
+
lines = [ln for ln in listing.splitlines() if ln.strip()]
|
|
148
|
+
if not lines:
|
|
149
|
+
return []
|
|
150
|
+
header = lines[0]
|
|
151
|
+
if _JOB_ID_HEADER not in header:
|
|
152
|
+
return []
|
|
153
|
+
# Columns are whitespace-separated; the job id is the second field in act's
|
|
154
|
+
# fixed-order table (Stage, Job ID, Job name, ...).
|
|
155
|
+
col = header.split().index(_JOB_ID_HEADER.split()[1]) - 1
|
|
156
|
+
job_ids: list[str] = []
|
|
157
|
+
for row in lines[1:]:
|
|
158
|
+
fields = row.split()
|
|
159
|
+
if len(fields) > col:
|
|
160
|
+
jid = fields[col]
|
|
161
|
+
if jid not in job_ids:
|
|
162
|
+
job_ids.append(jid)
|
|
163
|
+
return job_ids
|
|
164
|
+
|
|
165
|
+
|
|
125
166
|
def build_act_command(
|
|
126
167
|
event: str,
|
|
127
168
|
workflow: str | None = None,
|
|
@@ -194,35 +235,57 @@ def run_act(
|
|
|
194
235
|
|
|
195
236
|
Migrated repos are ``workflow_dispatch``-only, so the default
|
|
196
237
|
``pull_request`` event matches no jobs. Rather than hollow-pass, fall back
|
|
197
|
-
to the canonical ``ci.yml``
|
|
198
|
-
|
|
238
|
+
to the canonical ``ci.yml`` on ``workflow_dispatch``: discover its real job
|
|
239
|
+
id(s) via ``act --list`` (the job name is NOT fixed — ``mcli ci migrate``
|
|
240
|
+
keeps the repo's original name) and run each so the gate validates for real.
|
|
241
|
+
|
|
242
|
+
A green result means act actually executed ≥1 job and every job passed. If
|
|
243
|
+
``act --list`` shows jobs but a run reports "could not find any stages"
|
|
244
|
+
(i.e. act ran nothing), that is a FAILURE, not a no-op — never a hollow pass.
|
|
199
245
|
"""
|
|
200
246
|
arch = default_container_arch()
|
|
201
247
|
result, output = _run_with_retries(build_act_command(event, arch=arch), retries, backoff)
|
|
202
248
|
|
|
203
|
-
if result == PreflightResult.PASS and _has_no_stages(output):
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
)
|
|
210
|
-
return PreflightResult.PASS
|
|
211
|
-
workflow, job = entry
|
|
249
|
+
if not (result == PreflightResult.PASS and _has_no_stages(output)):
|
|
250
|
+
return result
|
|
251
|
+
|
|
252
|
+
# No stages for the requested event — try the workflow_dispatch entrypoint.
|
|
253
|
+
workflow = dispatch_workflow()
|
|
254
|
+
if workflow is None:
|
|
212
255
|
sys.stdout.write(
|
|
213
|
-
|
|
214
|
-
|
|
256
|
+
"ℹ️ No act stages for this event and no ci.yml dispatch "
|
|
257
|
+
"entrypoint — nothing to validate; treating as pass.\n"
|
|
215
258
|
)
|
|
259
|
+
return PreflightResult.PASS
|
|
260
|
+
|
|
261
|
+
jobs = list_jobs("workflow_dispatch", workflow)
|
|
262
|
+
if not jobs:
|
|
263
|
+
# The dispatch entrypoint genuinely has no jobs — a real no-op.
|
|
264
|
+
sys.stdout.write(
|
|
265
|
+
f"ℹ️ {workflow} has no workflow_dispatch jobs — nothing to "
|
|
266
|
+
"validate; treating as pass.\n"
|
|
267
|
+
)
|
|
268
|
+
return PreflightResult.PASS
|
|
269
|
+
|
|
270
|
+
targets = f"{workflow} {jobs}"
|
|
271
|
+
sys.stdout.write(
|
|
272
|
+
f"ℹ️ No '{event}' stages (workflow_dispatch-only); running "
|
|
273
|
+
f"{targets} via workflow_dispatch…\n"
|
|
274
|
+
)
|
|
275
|
+
for job in jobs:
|
|
216
276
|
result, output = _run_with_retries(
|
|
217
277
|
build_act_command("workflow_dispatch", workflow=workflow, job=job, arch=arch),
|
|
218
278
|
retries,
|
|
219
279
|
backoff,
|
|
220
280
|
)
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
281
|
+
if result == PreflightResult.UNREACHABLE:
|
|
282
|
+
return PreflightResult.UNREACHABLE
|
|
283
|
+
# We KNOW this job exists (it came from `act --list`), so "no stages"
|
|
284
|
+
# here means act ran nothing — a failure, not a no-op. Do not pass.
|
|
285
|
+
if result != PreflightResult.PASS or _has_no_stages(output):
|
|
286
|
+
return PreflightResult.FAIL
|
|
287
|
+
|
|
288
|
+
return PreflightResult.PASS
|
|
226
289
|
|
|
227
290
|
|
|
228
291
|
def preflight(repo_slug: str, event: str = "pull_request") -> PreflightResult:
|
|
@@ -140,6 +140,7 @@ class ScopedWorkflowsGroup(click.Group):
|
|
|
140
140
|
from mcli.lib.constants.messages import WarningMessages
|
|
141
141
|
from mcli.lib.logger.logger import get_logger
|
|
142
142
|
from mcli.lib.script_loader import LANGUAGE_TO_SUFFIX, ScriptLoader, parse_command_name
|
|
143
|
+
from mcli.lib.workflow_runtime import wrap_command_invoke
|
|
143
144
|
|
|
144
145
|
logger = get_logger()
|
|
145
146
|
|
|
@@ -171,7 +172,7 @@ class ScopedWorkflowsGroup(click.Group):
|
|
|
171
172
|
command = loader.load_command(matches[0])
|
|
172
173
|
if command:
|
|
173
174
|
logger.debug(f"Loaded native script command: {cmd_name}")
|
|
174
|
-
return command
|
|
175
|
+
return wrap_command_invoke(command, matches[0])
|
|
175
176
|
except Exception as e:
|
|
176
177
|
logger.debug(f"Failed to load script '{cmd_name}': {e}")
|
|
177
178
|
elif len(matches) > 1 and not lang_filter:
|
|
@@ -185,7 +186,7 @@ class ScopedWorkflowsGroup(click.Group):
|
|
|
185
186
|
command = loader.load_command(matches[0])
|
|
186
187
|
if command:
|
|
187
188
|
logger.debug(f"Loaded first match for ambiguous command: {base_name}")
|
|
188
|
-
return command
|
|
189
|
+
return wrap_command_invoke(command, matches[0])
|
|
189
190
|
except Exception as e:
|
|
190
191
|
logger.debug(f"Failed to load script '{base_name}': {e}")
|
|
191
192
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcli-framework
|
|
3
|
-
Version: 8.0.
|
|
3
|
+
Version: 8.0.62
|
|
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
|
|
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
|
|
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
|