mcli-framework 8.0.59__tar.gz → 8.0.61__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.59/src/mcli_framework.egg-info → mcli_framework-8.0.61}/PKG-INFO +1 -1
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/pyproject.toml +1 -1
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/constants/paths.py +6 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/pyenv/deps.py +20 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/pyenv/manager.py +11 -7
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/ci/act_runner.py +90 -27
- {mcli_framework-8.0.59 → mcli_framework-8.0.61/src/mcli_framework.egg-info}/PKG-INFO +1 -1
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/LICENSE +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/MANIFEST.in +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/README.md +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/llms-full.txt +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/llms.txt +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/mcli_rust/Cargo.toml +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/mcli_rust/src/command_parser.rs +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/mcli_rust/src/file_watcher.rs +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/mcli_rust/src/lib.rs +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/mcli_rust/src/process_manager.rs +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/mcli_rust/src/tfidf.rs +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/setup.cfg +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/__main__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/completion_helpers.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/context_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/delete_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/edit_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/import_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/init_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/list_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/main.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/model/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/model/model.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/model_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/mv_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/new_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/search_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/services_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/setup_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/source_sync_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/sync_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/video/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/video/video.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/config.toml +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/api/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/api/api.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/api/daemon_client.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/api/daemon_client_local.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/api/daemon_decorator.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/api/mcli_decorators.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/auth/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/auth/auth.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/auth/aws_manager.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/auth/azure_manager.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/auth/credential_manager.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/auth/gcp_manager.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/auth/key_manager.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/auth/mcli_manager.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/auth/token_manager.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/auth/token_util.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/config/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/config/config.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/config/settings.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/constants/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/constants/commands.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/constants/defaults.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/constants/env.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/constants/messages.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/constants/scripts.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/constants/storage.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/custom_commands.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/discovery/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/discovery/command_discovery.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/erd/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/erd/erd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/erd/generate_graph.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/errors.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/feature_detection.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/files/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/files/files.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/folder_workflows.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/fs/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/fs/fs.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/ipfs_sync.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/ipfs_utils.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/ipns_manager.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/lib.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/logger/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/logger/correlation.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/logger/logger.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/logger/structured.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/optional_deps.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/paths.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/performance/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/performance/optimizer.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/performance/rust_bridge.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/performance/uvloop_config.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/pickles/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/pickles/pickles.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/pyenv/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/pyenv/venv.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/script_loader.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/script_sync.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/script_watcher.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/search/cached_vectorizer.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/secrets/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/secrets/commands.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/secrets/manager.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/secrets/repl.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/secrets/store.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/services/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/services/config.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/services/data_pipeline.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/services/health.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/services/lsh_client.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/services/manager.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/services/redis_service.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/services/registry.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/services/state.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/services/supervisor.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/shell/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/shell/exceptions.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/shell/shell.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/sync_key_store.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/templates/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/templates/command_templates.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/toml/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/toml/toml.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/types.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/ui/styling.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/ui/visual_effects.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/watcher/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/watcher/watcher.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/workflow_models.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/workspace_registry.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/mygroup/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/mygroup/test_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/public/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/public/commands/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/public/oi/oi.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/public/public.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/self/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/self/completion_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/self/env_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/self/health_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/self/ipfs_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/self/logs_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/self/migrate_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/self/release_notes_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/self/self_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/self/store_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/self/test_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/self/workflows_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/storage/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/storage/backends/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/storage/backends/ipfs_backend.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/storage/base.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/storage/cache.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/storage/encryption.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/storage/factory.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/storage/registry.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/storage/storacha_cli.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/ci/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/ci/ci.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/ci/runner_status.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/ci/workflow_transform.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/daemon/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/daemon/async_command_database.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/daemon/async_process_manager.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/daemon/client.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/daemon/daemon.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/daemon/daemon_api.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/daemon/enhanced_daemon.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/daemon/process_cli.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/daemon/process_manager.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/daemon/test_daemon.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/doc_convert.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/docker/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/docker/docker.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/file/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/gcloud/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/gcloud/config.toml +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/gcloud/gcloud.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/git_commit/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/git_commit/ai_service.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/interview/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/lsh_integration.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/client.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/download_and_run_efficient_models.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/lightweight_embedder.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/lightweight_model_server.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/lightweight_test.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/model_service.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/ollama_efficient_runner.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/openai_adapter.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/pdf_processor.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/test_efficient_runner.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/test_example.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/test_integration.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/test_new_features.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/notebook/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/notebook/command_loader.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/notebook/converter.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/notebook/executor.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/notebook/notebook_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/notebook/schema.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/notebook/validator.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/openai/openai.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/registry/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/registry/registry.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/repo/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/repo/repo.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/scheduler/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/scheduler/cron_parser.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/scheduler/job.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/scheduler/models.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/scheduler/monitor.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/scheduler/persistence.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/scheduler/scheduler.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/scheduler/validation.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/search/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/secrets/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/secrets/secrets_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/storage/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/storage/storage_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/sync/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/sync/test_cmd.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/videos/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/wakatime/__init__.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/wakatime/wakatime.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/workflow.py +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli_framework.egg-info/SOURCES.txt +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli_framework.egg-info/dependency_links.txt +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli_framework.egg-info/entry_points.txt +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli_framework.egg-info/requires.txt +0 -0
- {mcli_framework-8.0.59 → mcli_framework-8.0.61}/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.61
|
|
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.61"
|
|
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"
|
|
@@ -101,5 +101,11 @@ class VenvPaths:
|
|
|
101
101
|
PYTHON_UNIX = "python"
|
|
102
102
|
PYTHON_WINDOWS = "python.exe"
|
|
103
103
|
|
|
104
|
+
# Framework runtime primitives that mcli python workflows assume are
|
|
105
|
+
# importable. The generated script templates `import click` unconditionally,
|
|
106
|
+
# so an isolated (bare) global venv must be seeded with these even when a
|
|
107
|
+
# script omits them from its @requires metadata.
|
|
108
|
+
BASE_RUNTIME_PACKAGES = ["click"]
|
|
109
|
+
|
|
104
110
|
|
|
105
111
|
__all__ = ["DirNames", "FileNames", "PathPatterns", "GitIgnorePatterns", "VenvPaths"]
|
|
@@ -75,6 +75,26 @@ class DependencyChecker:
|
|
|
75
75
|
|
|
76
76
|
return installed, missing
|
|
77
77
|
|
|
78
|
+
def merge_base_runtime(self, packages: List[str], base: List[str]) -> List[str]:
|
|
79
|
+
"""Append base runtime packages that are not already declared.
|
|
80
|
+
|
|
81
|
+
Comparison is by normalized package name, so a declared spec like
|
|
82
|
+
``click>=8.0`` or ``Click`` suppresses adding the bare ``click`` base.
|
|
83
|
+
|
|
84
|
+
Args:
|
|
85
|
+
packages: Packages already requested (from @requires).
|
|
86
|
+
base: Base runtime packages to ensure are present.
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
``packages`` plus any base package whose normalized name is absent.
|
|
90
|
+
"""
|
|
91
|
+
have = {self._normalize_package_name(self._extract_package_name(p)) for p in packages}
|
|
92
|
+
merged = list(packages)
|
|
93
|
+
for pkg in base:
|
|
94
|
+
if self._normalize_package_name(self._extract_package_name(pkg)) not in have:
|
|
95
|
+
merged.append(pkg)
|
|
96
|
+
return merged
|
|
97
|
+
|
|
78
98
|
def install_packages(self, packages: List[str], venv_path: Path) -> bool:
|
|
79
99
|
"""Install packages using uv pip install.
|
|
80
100
|
|
|
@@ -12,7 +12,7 @@ from typing import Dict, List, Optional, Tuple
|
|
|
12
12
|
|
|
13
13
|
import click
|
|
14
14
|
|
|
15
|
-
from mcli.lib.constants import EnvVars, VenvMessages
|
|
15
|
+
from mcli.lib.constants import EnvVars, VenvMessages, VenvPaths
|
|
16
16
|
from mcli.lib.logger import get_logger
|
|
17
17
|
|
|
18
18
|
from .deps import DependencyChecker
|
|
@@ -119,10 +119,6 @@ class PyEnvManager:
|
|
|
119
119
|
Returns:
|
|
120
120
|
True if all dependencies are satisfied or installed.
|
|
121
121
|
"""
|
|
122
|
-
if not requires:
|
|
123
|
-
logger.debug(VenvMessages.NO_DEPS_SPECIFIED)
|
|
124
|
-
return True
|
|
125
|
-
|
|
126
122
|
venv_path, source = self.resolve_environment()
|
|
127
123
|
|
|
128
124
|
# Ensure the venv exists (create global venv if needed)
|
|
@@ -132,8 +128,16 @@ class PyEnvManager:
|
|
|
132
128
|
python_exe = self.get_python_executable()
|
|
133
129
|
checker = DependencyChecker(python_exe)
|
|
134
130
|
|
|
135
|
-
# Parse
|
|
136
|
-
|
|
131
|
+
# Parse declared dependencies, then ensure framework runtime primitives
|
|
132
|
+
# (e.g. click) are present even when @requires is empty — an isolated
|
|
133
|
+
# global venv is created bare and mcli workflow scripts import click.
|
|
134
|
+
packages = checker.parse_requires(requires) if requires else []
|
|
135
|
+
packages = checker.merge_base_runtime(packages, VenvPaths.BASE_RUNTIME_PACKAGES)
|
|
136
|
+
|
|
137
|
+
if not packages:
|
|
138
|
+
logger.debug(VenvMessages.NO_DEPS_SPECIFIED)
|
|
139
|
+
return True
|
|
140
|
+
|
|
137
141
|
logger.debug(VenvMessages.CHECKING_DEPS.format(script=script_name))
|
|
138
142
|
|
|
139
143
|
installed, missing = checker.check_installed(packages)
|
|
@@ -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:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcli-framework
|
|
3
|
-
Version: 8.0.
|
|
3
|
+
Version: 8.0.61
|
|
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
|
|
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
|