mcli-framework 8.0.68__tar.gz → 8.0.69__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.68/src/mcli_framework.egg-info → mcli_framework-8.0.69}/PKG-INFO +1 -1
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/pyproject.toml +1 -1
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/ci/act_runner.py +48 -30
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/ci/ci.py +18 -3
- {mcli_framework-8.0.68 → mcli_framework-8.0.69/src/mcli_framework.egg-info}/PKG-INFO +1 -1
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/LICENSE +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/MANIFEST.in +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/README.md +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/llms-full.txt +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/llms.txt +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/mcli_rust/Cargo.toml +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/mcli_rust/src/command_parser.rs +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/mcli_rust/src/file_watcher.rs +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/mcli_rust/src/lib.rs +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/mcli_rust/src/process_manager.rs +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/mcli_rust/src/tfidf.rs +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/setup.cfg +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/__main__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/app/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/app/completion_helpers.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/app/context_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/app/delete_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/app/edit_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/app/import_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/app/init_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/app/list_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/app/main.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/app/model/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/app/model/model.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/app/model_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/app/mv_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/app/new_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/app/search_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/app/services_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/app/setup_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/app/source_sync_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/app/sync_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/app/video/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/app/video/video.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/config.toml +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/api/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/api/api.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/api/daemon_client.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/api/daemon_client_local.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/api/daemon_decorator.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/api/mcli_decorators.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/auth/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/auth/auth.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/auth/aws_manager.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/auth/azure_manager.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/auth/credential_manager.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/auth/gcp_manager.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/auth/key_manager.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/auth/mcli_manager.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/auth/token_manager.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/auth/token_util.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/config/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/config/config.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/config/settings.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/constants/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/constants/commands.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/constants/defaults.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/constants/env.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/constants/messages.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/constants/paths.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/constants/scripts.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/constants/storage.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/custom_commands.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/discovery/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/discovery/command_discovery.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/erd/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/erd/erd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/erd/generate_graph.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/errors.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/feature_detection.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/files/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/files/files.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/folder_workflows.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/fs/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/fs/fs.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/ipfs_sync.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/ipfs_utils.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/ipns_manager.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/lib.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/logger/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/logger/correlation.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/logger/logger.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/logger/structured.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/optional_deps.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/paths.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/performance/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/performance/optimizer.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/performance/rust_bridge.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/performance/uvloop_config.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/pickles/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/pickles/pickles.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/pyenv/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/pyenv/deps.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/pyenv/manager.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/pyenv/venv.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/script_loader.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/script_sync.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/script_watcher.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/search/cached_vectorizer.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/secrets/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/secrets/commands.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/secrets/manager.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/secrets/repl.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/secrets/store.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/services/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/services/config.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/services/data_pipeline.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/services/health.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/services/lsh_client.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/services/manager.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/services/redis_service.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/services/registry.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/services/state.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/services/supervisor.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/shell/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/shell/exceptions.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/shell/shell.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/sync_key_store.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/templates/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/templates/command_templates.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/toml/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/toml/toml.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/types.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/ui/styling.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/ui/visual_effects.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/watcher/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/watcher/watcher.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/workflow_models.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/workflow_runtime.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/lib/workspace_registry.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/mygroup/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/mygroup/test_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/public/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/public/commands/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/public/oi/oi.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/public/public.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/self/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/self/completion_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/self/env_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/self/health_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/self/ipfs_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/self/logs_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/self/migrate_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/self/release_notes_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/self/self_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/self/store_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/self/test_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/self/workflows_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/storage/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/storage/backends/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/storage/backends/ipfs_backend.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/storage/base.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/storage/cache.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/storage/encryption.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/storage/factory.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/storage/registry.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/storage/storacha_cli.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/ci/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/ci/act_lock.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/ci/runner_status.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/ci/workflow_transform.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/daemon/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/daemon/async_command_database.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/daemon/async_process_manager.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/daemon/client.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/daemon/daemon.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/daemon/daemon_api.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/daemon/enhanced_daemon.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/daemon/process_cli.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/daemon/process_manager.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/daemon/test_daemon.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/doc_convert.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/docker/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/docker/docker.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/file/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/gcloud/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/gcloud/config.toml +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/gcloud/gcloud.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/git_commit/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/git_commit/ai_service.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/interview/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/lsh_integration.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/client.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/download_and_run_efficient_models.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/lightweight_embedder.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/lightweight_model_server.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/lightweight_test.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/model_service.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/ollama_efficient_runner.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/openai_adapter.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/pdf_processor.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/test_efficient_runner.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/test_example.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/test_integration.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/test_new_features.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/notebook/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/notebook/command_loader.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/notebook/converter.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/notebook/executor.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/notebook/notebook_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/notebook/schema.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/notebook/validator.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/openai/openai.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/registry/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/registry/registry.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/repo/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/repo/repo.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/scheduler/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/scheduler/cron_parser.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/scheduler/job.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/scheduler/models.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/scheduler/monitor.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/scheduler/persistence.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/scheduler/scheduler.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/scheduler/validation.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/search/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/secrets/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/secrets/secrets_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/storage/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/storage/storage_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/sync/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/sync/test_cmd.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/videos/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/wakatime/__init__.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/wakatime/wakatime.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli/workflow/workflow.py +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli_framework.egg-info/SOURCES.txt +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli_framework.egg-info/dependency_links.txt +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli_framework.egg-info/entry_points.txt +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/src/mcli_framework.egg-info/requires.txt +0 -0
- {mcli_framework-8.0.68 → mcli_framework-8.0.69}/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.69
|
|
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.69"
|
|
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"
|
|
@@ -4,6 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import os
|
|
6
6
|
import platform
|
|
7
|
+
import re
|
|
7
8
|
import shutil
|
|
8
9
|
import subprocess
|
|
9
10
|
import sys
|
|
@@ -23,8 +24,10 @@ _RATE_LIMIT_MARKERS = (
|
|
|
23
24
|
)
|
|
24
25
|
|
|
25
26
|
# act emits this when no job matches the requested event (e.g. a
|
|
26
|
-
# workflow_dispatch-only workflow queried for pull_request). That is a
|
|
27
|
-
#
|
|
27
|
+
# workflow_dispatch-only workflow queried for pull_request). That is not a
|
|
28
|
+
# failure (it must not block the push, #205), but it is not a pass either:
|
|
29
|
+
# run_act falls back to workflow_dispatch gates, and reports NOT_VALIDATED when
|
|
30
|
+
# no job ran at all (#242).
|
|
28
31
|
_NO_STAGES_MARKERS = ("could not find any stages to run",)
|
|
29
32
|
|
|
30
33
|
# Backoff (seconds) between docker rate-limit retries; the last value repeats.
|
|
@@ -32,9 +35,17 @@ _RETRY_BACKOFF = (15, 45)
|
|
|
32
35
|
_MAX_RETRIES = 2
|
|
33
36
|
|
|
34
37
|
# Dispatch-only workflows that are safe and expected to run as local gates.
|
|
35
|
-
#
|
|
38
|
+
# A workflow file is a gate when its stem (split on "-", "_", ".") has a gate
|
|
39
|
+
# token and no side-effect token. Deploy, release, publish, build and audit
|
|
40
|
+
# workflows are never selected; neither is the dormant self-hosted fallback.
|
|
36
41
|
_WORKFLOW_DIR = Path(".github/workflows")
|
|
37
|
-
|
|
42
|
+
_DISPATCH_GATE_TOKENS = frozenset(
|
|
43
|
+
{"ci", "test", "tests", "lint", "typecheck", "check", "checks", "scan", "security", "quality"}
|
|
44
|
+
)
|
|
45
|
+
_DISPATCH_SKIP_TOKENS = frozenset(
|
|
46
|
+
{"deploy", "release", "publish", "build", "audit", "ops", "upload", "notify", "sync"}
|
|
47
|
+
)
|
|
48
|
+
_DISPATCH_SKIP_STEMS = frozenset({"self-hosted-ci"})
|
|
38
49
|
|
|
39
50
|
# Header label of the job-id column in `act --list` table output.
|
|
40
51
|
_JOB_ID_HEADER = "Job ID"
|
|
@@ -46,9 +57,10 @@ def _act_command(*args: str) -> list[str]:
|
|
|
46
57
|
|
|
47
58
|
|
|
48
59
|
class PreflightResult(Enum):
|
|
49
|
-
PASS = "pass"
|
|
60
|
+
PASS = "pass" # act ran >=1 job and every job passed
|
|
50
61
|
FAIL = "fail"
|
|
51
|
-
UNREACHABLE = "unreachable"
|
|
62
|
+
UNREACHABLE = "unreachable" # act cannot run here
|
|
63
|
+
NOT_VALIDATED = "not_validated" # act ran, but no job matched: nothing validated
|
|
52
64
|
|
|
53
65
|
|
|
54
66
|
def _is_docker_rate_limited(output: str) -> bool:
|
|
@@ -152,26 +164,28 @@ def default_container_arch() -> str | None:
|
|
|
152
164
|
return None
|
|
153
165
|
|
|
154
166
|
|
|
167
|
+
def _is_dispatch_gate(stem: str) -> bool:
|
|
168
|
+
"""True if a workflow file stem names a check (ci/test/lint/scan…), not a
|
|
169
|
+
deploy/release/publish/build job."""
|
|
170
|
+
stem = stem.lower()
|
|
171
|
+
if stem in _DISPATCH_SKIP_STEMS:
|
|
172
|
+
return False
|
|
173
|
+
tokens = set(re.split(r"[-_.]", stem))
|
|
174
|
+
return bool(tokens & _DISPATCH_GATE_TOKENS) and not tokens & _DISPATCH_SKIP_TOKENS
|
|
175
|
+
|
|
176
|
+
|
|
155
177
|
def dispatch_workflows() -> list[str]:
|
|
156
|
-
"""Return dispatch-only
|
|
178
|
+
"""Return dispatch-only check workflows safe to run locally, sorted by path.
|
|
157
179
|
|
|
158
|
-
The act-first migration
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
180
|
+
The act-first migration preserved workflow filenames, so a real gate may be
|
|
181
|
+
``elixir-ci.yml``, ``test.yml`` or ``lint.yml`` rather than ``ci.yml``.
|
|
182
|
+
Select by name token (see ``_DISPATCH_GATE_TOKENS``), and never select a
|
|
183
|
+
deploy/release/publish/build workflow or the dormant self-hosted fallback.
|
|
162
184
|
"""
|
|
163
185
|
if not _WORKFLOW_DIR.is_dir():
|
|
164
186
|
return []
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
for path in sorted((*_WORKFLOW_DIR.glob("*.yml"), *_WORKFLOW_DIR.glob("*.yaml"))):
|
|
168
|
-
stem = path.stem.lower()
|
|
169
|
-
is_ci = stem == "ci" or stem.startswith("ci-") or stem.endswith("-ci")
|
|
170
|
-
if stem == "self-hosted-ci":
|
|
171
|
-
continue
|
|
172
|
-
if is_ci or stem in _DISPATCH_GATE_NAMES:
|
|
173
|
-
workflows.append(str(path))
|
|
174
|
-
return workflows
|
|
187
|
+
paths = sorted((*_WORKFLOW_DIR.glob("*.yml"), *_WORKFLOW_DIR.glob("*.yaml")))
|
|
188
|
+
return [str(path) for path in paths if _is_dispatch_gate(path.stem)]
|
|
175
189
|
|
|
176
190
|
|
|
177
191
|
def list_jobs(event: str, workflow: str | None = None) -> list[str] | None:
|
|
@@ -296,12 +310,14 @@ def run_act(
|
|
|
296
310
|
|
|
297
311
|
Migrated repos are ``workflow_dispatch``-only, so the default
|
|
298
312
|
``pull_request`` event matches no jobs. Rather than hollow-pass, discover
|
|
299
|
-
|
|
300
|
-
``workflow_dispatch``. Deploy
|
|
313
|
+
check workflows (ci/test/lint/scan…, see ``dispatch_workflows``) and run
|
|
314
|
+
their real job ids via ``workflow_dispatch``. Deploy, release, publish and
|
|
315
|
+
build workflows are never selected.
|
|
301
316
|
|
|
302
317
|
A green result means act actually executed ≥1 job and every job passed. If
|
|
303
318
|
``act --list`` shows jobs but a run reports "could not find any stages"
|
|
304
|
-
(i.e. act ran nothing), that is a FAILURE
|
|
319
|
+
(i.e. act ran nothing), that is a FAILURE. If no job matched the event and
|
|
320
|
+
no dispatch gate has a job, the result is NOT_VALIDATED — never PASS (#242).
|
|
305
321
|
"""
|
|
306
322
|
arch = default_container_arch()
|
|
307
323
|
result, output = _run_with_retries(build_act_command(event, arch=arch), retries, backoff)
|
|
@@ -313,10 +329,10 @@ def run_act(
|
|
|
313
329
|
workflows = dispatch_workflows()
|
|
314
330
|
if not workflows:
|
|
315
331
|
sys.stdout.write(
|
|
316
|
-
"
|
|
317
|
-
"
|
|
332
|
+
f"⚠️ No '{event}' jobs and no ci/test/lint/scan workflow_dispatch "
|
|
333
|
+
"workflow — nothing was validated.\n"
|
|
318
334
|
)
|
|
319
|
-
return PreflightResult.
|
|
335
|
+
return PreflightResult.NOT_VALIDATED
|
|
320
336
|
|
|
321
337
|
ran_job = False
|
|
322
338
|
for workflow in workflows:
|
|
@@ -351,9 +367,10 @@ def run_act(
|
|
|
351
367
|
|
|
352
368
|
if not ran_job:
|
|
353
369
|
sys.stdout.write(
|
|
354
|
-
"
|
|
355
|
-
"
|
|
370
|
+
f"⚠️ No '{event}' jobs, and {', '.join(workflows)} "
|
|
371
|
+
"have no workflow_dispatch jobs — nothing was validated.\n"
|
|
356
372
|
)
|
|
373
|
+
return PreflightResult.NOT_VALIDATED
|
|
357
374
|
|
|
358
375
|
return PreflightResult.PASS
|
|
359
376
|
|
|
@@ -361,7 +378,8 @@ def run_act(
|
|
|
361
378
|
def preflight(
|
|
362
379
|
repo_slug: str, event: str = "pull_request", lock_timeout: float | None = None
|
|
363
380
|
) -> PreflightResult:
|
|
364
|
-
"""Primary gate. PASS/FAIL if act can run; UNREACHABLE if act can't start here
|
|
381
|
+
"""Primary gate. PASS/FAIL if act can run; UNREACHABLE if act can't start here;
|
|
382
|
+
NOT_VALIDATED if act ran but no job matched (nothing was validated).
|
|
365
383
|
|
|
366
384
|
`repo_slug` is accepted for symmetry and future use; the runner fallback is
|
|
367
385
|
orchestrated by the CLI layer based on runner_status.has_online_runner.
|
|
@@ -120,6 +120,13 @@ def preflight(event, lock_timeout):
|
|
|
120
120
|
if result == PreflightResult.FAIL:
|
|
121
121
|
click.echo("❌ act failed — fix before opening PR.")
|
|
122
122
|
raise SystemExit(1)
|
|
123
|
+
if result == PreflightResult.NOT_VALIDATED:
|
|
124
|
+
click.echo(
|
|
125
|
+
"⚠️ act ran no job — nothing was validated (this is NOT a pass). Add a "
|
|
126
|
+
"ci/test/lint workflow with a workflow_dispatch trigger, or validate "
|
|
127
|
+
"this PR by other means."
|
|
128
|
+
)
|
|
129
|
+
raise SystemExit(2)
|
|
123
130
|
# UNREACHABLE
|
|
124
131
|
if slug and has_online_runner(slug):
|
|
125
132
|
click.echo(
|
|
@@ -144,6 +151,9 @@ def pr():
|
|
|
144
151
|
if result == PreflightResult.FAIL:
|
|
145
152
|
click.echo("act failed; not opening PR.")
|
|
146
153
|
raise SystemExit(1)
|
|
154
|
+
if result == PreflightResult.NOT_VALIDATED:
|
|
155
|
+
click.echo("act ran no job; refusing to open an unvalidated PR.")
|
|
156
|
+
raise SystemExit(2)
|
|
147
157
|
if slug and has_online_runner(slug):
|
|
148
158
|
click.echo("act unreachable; pushing so the runner can validate.")
|
|
149
159
|
subprocess.run(["git", "push", "-u", "origin", "HEAD"], check=False, timeout=120)
|
|
@@ -156,9 +166,11 @@ def pr():
|
|
|
156
166
|
PRE_PUSH_HOOK = """#!/usr/bin/env bash
|
|
157
167
|
# mcli-ci pre-push gate: validate with act before pushing.
|
|
158
168
|
# Blocks ONLY on a real act failure (exit 1). When act cannot validate locally
|
|
159
|
-
# — e.g. Docker Hub rate-limit (toomanyrequests, retried first), no docker,
|
|
160
|
-
#
|
|
161
|
-
# environment hiccup
|
|
169
|
+
# — e.g. Docker Hub rate-limit (toomanyrequests, retried first), no docker, an
|
|
170
|
+
# online runner will validate instead, or the repo has no workflow job act can
|
|
171
|
+
# run (exit 2/3) — the push is allowed so an environment hiccup or a repo with
|
|
172
|
+
# no gate never wedges your workflow, but the hook says loudly that the push
|
|
173
|
+
# was NOT validated. It never reports such a push as green.
|
|
162
174
|
# act runs are serialised machine-wide, so this may wait for another repo's
|
|
163
175
|
# preflight to finish (bounded; see --lock-timeout / MCLI_CI_LOCK_TIMEOUT).
|
|
164
176
|
# Override a real failure with:
|
|
@@ -183,6 +195,9 @@ if [ "$code" -eq 1 ]; then
|
|
|
183
195
|
echo "mcli-ci: act reported failures — push blocked. Override: git push --no-verify" >&2
|
|
184
196
|
exit 1
|
|
185
197
|
fi
|
|
198
|
+
if [ "$code" -ne 0 ]; then
|
|
199
|
+
echo "mcli-ci: WARNING — this push was NOT validated (preflight exit $code). Push allowed." >&2
|
|
200
|
+
fi
|
|
186
201
|
exit 0
|
|
187
202
|
"""
|
|
188
203
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcli-framework
|
|
3
|
-
Version: 8.0.
|
|
3
|
+
Version: 8.0.69
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|