mcli-framework 8.0.54__tar.gz → 8.0.55__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.54 → mcli_framework-8.0.55}/PKG-INFO +11 -3
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/pyproject.toml +37 -8
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/commands_cmd.py +4 -1
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/create_cmd.py +4 -1
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/init_cmd.py +6 -2
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/sync_cmd.py +9 -1
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/api/api.py +2 -2
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/pickles/pickles.py +50 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/search/cached_vectorizer.py +4 -1
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/self/release_notes_cmd.py +1 -1
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/self/self_cmd.py +4 -1
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/self/store_cmd.py +17 -9
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/ci/act_runner.py +19 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/ci/ci.py +1 -1
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/doc_convert.py +13 -7
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli_framework.egg-info/PKG-INFO +11 -3
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli_framework.egg-info/requires.txt +10 -2
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/.github/dependabot.yml +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/.github/dependency-review-config.yml +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/.github/workflows/build.yml +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/.github/workflows/ci.yml +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/.github/workflows/codeql.yml +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/.github/workflows/docs-links.yml +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/.github/workflows/publish-self-hosted.yml +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/.github/workflows/publish.yml +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/.github/workflows/release.yml +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/.github/workflows/security.yml +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/.github/workflows/test.yml +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/LICENSE +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/MANIFEST.in +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/README.md +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/llms-full.txt +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/llms.txt +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/mcli_rust/Cargo.toml +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/mcli_rust/src/command_parser.rs +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/mcli_rust/src/file_watcher.rs +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/mcli_rust/src/lib.rs +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/mcli_rust/src/process_manager.rs +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/mcli_rust/src/tfidf.rs +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/setup.cfg +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/__main__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/completion_helpers.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/context_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/delete_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/edit_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/import_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/list_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/main.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/migrate_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/model/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/model/model.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/model_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/mv_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/new_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/remove_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/rm_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/search_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/services_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/setup_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/source_sync_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/video/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/video/video.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/config.toml +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/api/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/api/daemon_client.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/api/daemon_client_local.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/api/daemon_decorator.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/api/mcli_decorators.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/auth/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/auth/auth.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/auth/aws_manager.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/auth/azure_manager.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/auth/credential_manager.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/auth/gcp_manager.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/auth/key_manager.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/auth/mcli_manager.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/auth/token_manager.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/auth/token_util.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/config/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/config/config.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/config/settings.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/constants/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/constants/commands.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/constants/defaults.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/constants/env.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/constants/messages.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/constants/paths.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/constants/scripts.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/constants/storage.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/custom_commands.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/discovery/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/discovery/command_discovery.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/erd/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/erd/erd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/erd/generate_graph.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/errors.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/feature_detection.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/files/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/files/files.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/folder_workflows.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/fs/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/fs/fs.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/ipfs_sync.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/ipfs_utils.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/ipns_manager.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/lib.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/logger/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/logger/correlation.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/logger/logger.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/logger/structured.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/optional_deps.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/paths.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/performance/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/performance/optimizer.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/performance/rust_bridge.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/performance/uvloop_config.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/pickles/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/pyenv/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/pyenv/deps.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/pyenv/manager.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/pyenv/venv.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/script_loader.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/script_sync.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/script_watcher.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/secrets/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/secrets/commands.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/secrets/manager.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/secrets/repl.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/secrets/store.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/services/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/services/config.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/services/data_pipeline.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/services/health.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/services/lsh_client.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/services/manager.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/services/redis_service.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/services/registry.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/services/state.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/services/supervisor.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/shell/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/shell/exceptions.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/shell/shell.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/sync_key_store.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/templates/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/templates/command_templates.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/toml/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/toml/toml.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/types.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/ui/styling.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/ui/visual_effects.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/watcher/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/watcher/watcher.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/workflow_models.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/workspace_registry.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/mygroup/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/mygroup/test_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/public/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/public/commands/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/public/oi/oi.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/public/public.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/self/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/self/completion_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/self/env_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/self/health_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/self/ipfs_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/self/logs_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/self/migrate_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/self/test_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/self/workflows_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/storage/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/storage/backends/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/storage/backends/ipfs_backend.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/storage/base.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/storage/cache.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/storage/encryption.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/storage/factory.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/storage/registry.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/storage/storacha_cli.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/ci/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/ci/runner_status.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/ci/workflow_transform.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/daemon/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/daemon/async_command_database.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/daemon/async_process_manager.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/daemon/client.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/daemon/daemon.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/daemon/daemon_api.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/daemon/enhanced_daemon.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/daemon/process_cli.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/daemon/process_manager.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/daemon/test_daemon.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/docker/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/docker/docker.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/file/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/gcloud/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/gcloud/config.toml +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/gcloud/gcloud.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/git_commit/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/git_commit/ai_service.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/interview/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/lsh_integration.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/client.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/download_and_run_efficient_models.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/lightweight_embedder.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/lightweight_model_server.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/lightweight_test.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/model_service.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/ollama_efficient_runner.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/openai_adapter.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/pdf_processor.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/test_efficient_runner.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/test_example.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/test_integration.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/test_new_features.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/notebook/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/notebook/command_loader.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/notebook/converter.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/notebook/executor.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/notebook/notebook_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/notebook/schema.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/notebook/validator.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/openai/openai.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/registry/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/registry/registry.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/repo/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/repo/repo.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/scheduler/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/scheduler/cron_parser.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/scheduler/job.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/scheduler/models.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/scheduler/monitor.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/scheduler/persistence.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/scheduler/scheduler.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/scheduler/validation.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/search/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/secrets/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/secrets/secrets_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/storage/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/storage/storage_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/sync/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/sync/test_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/videos/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/wakatime/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/wakatime/wakatime.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/workflow.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli_framework.egg-info/SOURCES.txt +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli_framework.egg-info/dependency_links.txt +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli_framework.egg-info/entry_points.txt +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli_framework.egg-info/top_level.txt +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_all_commands.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_app_logs_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_app_redis_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_logs_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_main_app.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_model_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_self_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_self_cmd_plugins.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_self_cmd_utilities.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_workflow_creation_commands.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_workflow_file.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_workflow_gcloud.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_workflow_registry.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/conftest.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/e2e/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/e2e/test_complete_workflows.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/e2e/test_model_workflow.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/e2e/test_new_user_workflow.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/e2e/test_update_workflow.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/fixtures/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/fixtures/chat_fixtures.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/fixtures/cli_fixtures.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/fixtures/command_fixtures.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/fixtures/data_fixtures.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/fixtures/db_fixtures.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/fixtures/model_fixtures.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_all_commands_comprehensive.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_daemon_server.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_direct_file_execution.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_e2e_dashboard_lsh_supabase.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_flask_webapp.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_folder_workflows_integration.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_gcloud_services.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_ml_data_pipeline.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_module_imports.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_notebook_workflows.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_oi_service.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_repo_operations.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_scheduler_integration.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_service_registry.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_video_processing.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_wakatime_api.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_webapp_full.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_workflow.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_workflow_commands.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/performance/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/property/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/storage/__init__.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/storage/test_cache.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/storage/test_encryption.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/storage/test_storacha_cli.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_api_utils.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_async_process_manager.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_auth_modules.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_bug_fixes.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_command_fixtures.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_config.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_correlation_logging.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_custom_commands.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_custom_commands_filtering.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_daemon_api.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_dependencies.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_doc_convert_workflow.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_emulator_workflow.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_erd_generation.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_erd_generic.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_erd_imports.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_folder_workflows.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_git_commit_workflow.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_health_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_import_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_init_mv_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_ipfs_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_ipfs_retry.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_language_suffix.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_lib_auth.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_lib_files.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_lib_utils.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_logger.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_new_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_notebook_command_loader.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_notebook_executor.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_optional_deps.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_paths.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_pdf_compress.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_pyenv.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_regression.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_scheduler.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_scheduler_cron_parser.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_scheduler_job.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_scheduler_models.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_scheduler_monitor.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_scheduler_persistence.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_scheduler_validation.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_script_loader_options.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_security_command_injection.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_self_update.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_service_config.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_service_health.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_service_manager.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_service_state.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_services_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_shell_exceptions.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_shell_functions.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_shell_security.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_store_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_sync_cmd.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_toml_utils.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_ui_rich.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_uv_compat.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_workflow_file_completion.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_workflow_models.py +0 -0
- {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/workflow/test_notebook.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcli-framework
|
|
3
|
-
Version: 8.0.
|
|
3
|
+
Version: 8.0.55
|
|
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>
|
|
@@ -82,10 +82,18 @@ Requires-Dist: freezegun>=1.4.0; extra == "dev"
|
|
|
82
82
|
Requires-Dist: pytest-html>=4.1.0; extra == "dev"
|
|
83
83
|
Requires-Dist: pytest-json-report>=1.5.0; extra == "dev"
|
|
84
84
|
Requires-Dist: black<26.0.0,>=25.0.0; extra == "dev"
|
|
85
|
-
Requires-Dist: isort<6.0.0,>=5.
|
|
86
|
-
Requires-Dist: mypy<2.0.0,>=1.
|
|
85
|
+
Requires-Dist: isort<6.0.0,>=5.13.2; extra == "dev"
|
|
86
|
+
Requires-Dist: mypy<2.0.0,>=1.16.1; extra == "dev"
|
|
87
87
|
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
88
|
+
Requires-Dist: pylint>=3.0.0; extra == "dev"
|
|
89
|
+
Requires-Dist: flake8>=7.0.0; extra == "dev"
|
|
90
|
+
Requires-Dist: flake8-docstrings>=1.7.0; extra == "dev"
|
|
91
|
+
Requires-Dist: flake8-bugbear>=24.1.0; extra == "dev"
|
|
92
|
+
Requires-Dist: flake8-comprehensions>=3.14.0; extra == "dev"
|
|
93
|
+
Requires-Dist: flake8-simplify>=0.21.0; extra == "dev"
|
|
88
94
|
Requires-Dist: pre-commit>=4.5.1; extra == "dev"
|
|
95
|
+
Requires-Dist: bandit>=1.7.0; extra == "dev"
|
|
96
|
+
Requires-Dist: safety>=3.0.0; extra == "dev"
|
|
89
97
|
Requires-Dist: build>=1.2.2.post1; extra == "dev"
|
|
90
98
|
Requires-Dist: maturin>=1.9.3; extra == "dev"
|
|
91
99
|
Requires-Dist: twine>=4.0.0; extra == "dev"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "mcli-framework"
|
|
3
|
-
version = "8.0.
|
|
3
|
+
version = "8.0.55"
|
|
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"
|
|
@@ -102,11 +102,21 @@ dev = [
|
|
|
102
102
|
|
|
103
103
|
# Code quality
|
|
104
104
|
"black>=25.0.0,<26.0.0", # Pin to 25.x to match lockfile, avoid 26.x formatting changes
|
|
105
|
-
"isort>=5.
|
|
106
|
-
"mypy>=1.
|
|
105
|
+
"isort>=5.13.2,<6.0.0",
|
|
106
|
+
"mypy>=1.16.1,<2.0.0",
|
|
107
107
|
"ruff>=0.1.0", # Fast linter
|
|
108
|
+
"pylint>=3.0.0",
|
|
109
|
+
"flake8>=7.0.0",
|
|
110
|
+
"flake8-docstrings>=1.7.0",
|
|
111
|
+
"flake8-bugbear>=24.1.0",
|
|
112
|
+
"flake8-comprehensions>=3.14.0",
|
|
113
|
+
"flake8-simplify>=0.21.0",
|
|
108
114
|
"pre-commit>=4.5.1", # Git hooks
|
|
109
115
|
|
|
116
|
+
# Security
|
|
117
|
+
"bandit>=1.7.0",
|
|
118
|
+
"safety>=3.0.0",
|
|
119
|
+
|
|
110
120
|
# Build tools
|
|
111
121
|
"build>=1.2.2.post1",
|
|
112
122
|
"maturin>=1.9.3",
|
|
@@ -260,20 +270,39 @@ build-backend = "setuptools.build_meta"
|
|
|
260
270
|
# NOTE: This is the primary dev dependency specification (PEP 735).
|
|
261
271
|
# [project.optional-dependencies] dev is kept for pip compatibility.
|
|
262
272
|
dev = [
|
|
273
|
+
# Testing
|
|
274
|
+
"pytest>=8.4.1",
|
|
275
|
+
"pytest-cov>=4.1.0,<5.0.0",
|
|
276
|
+
"pytest-mock>=3.14.1",
|
|
277
|
+
"pytest-asyncio>=1.1.0",
|
|
278
|
+
"pytest-benchmark>=4.0.0",
|
|
279
|
+
"pytest-timeout>=2.2.0",
|
|
280
|
+
"pytest-xdist>=3.5.0",
|
|
281
|
+
"pytest-html>=4.1.0",
|
|
282
|
+
"pytest-json-report>=1.5.0",
|
|
283
|
+
"hypothesis>=6.92.0",
|
|
284
|
+
"faker>=22.0.0",
|
|
285
|
+
"responses>=0.24.0",
|
|
286
|
+
"freezegun>=1.4.0",
|
|
287
|
+
# Linting / formatting / typing
|
|
263
288
|
"black>=25.0.0,<26.0.0", # Pin to 25.x to match lockfile
|
|
264
|
-
"isort>=5.13.2",
|
|
265
|
-
"mypy>=1.16.1",
|
|
289
|
+
"isort>=5.13.2,<6.0.0",
|
|
290
|
+
"mypy>=1.16.1,<2.0.0",
|
|
291
|
+
"ruff>=0.1.0",
|
|
266
292
|
"pylint>=3.0.0",
|
|
267
|
-
"pytest>=8.4.1",
|
|
268
|
-
"pytest-cov>=4.1.0",
|
|
269
|
-
"pre-commit>=3.6.0",
|
|
270
293
|
"flake8>=7.0.0",
|
|
271
294
|
"flake8-docstrings>=1.7.0",
|
|
272
295
|
"flake8-bugbear>=24.1.0",
|
|
273
296
|
"flake8-comprehensions>=3.14.0",
|
|
274
297
|
"flake8-simplify>=0.21.0",
|
|
298
|
+
# Security
|
|
275
299
|
"bandit>=1.7.0",
|
|
276
300
|
"safety>=3.0.0",
|
|
301
|
+
# Pre-commit / build / publish
|
|
302
|
+
"pre-commit>=4.5.1",
|
|
303
|
+
"build>=1.2.2.post1",
|
|
304
|
+
"maturin>=1.9.3",
|
|
305
|
+
"twine>=4.0.0",
|
|
277
306
|
]
|
|
278
307
|
|
|
279
308
|
[tool.setuptools]
|
|
@@ -1135,7 +1135,10 @@ def open_editor_for_command(
|
|
|
1135
1135
|
if not editor:
|
|
1136
1136
|
# Try common editors in order of preference
|
|
1137
1137
|
for common_editor in ["vim", "nano", "code", "subl", "atom", "emacs"]:
|
|
1138
|
-
if
|
|
1138
|
+
if (
|
|
1139
|
+
subprocess.run(["which", common_editor], capture_output=True, timeout=5).returncode
|
|
1140
|
+
== 0
|
|
1141
|
+
):
|
|
1139
1142
|
editor = common_editor
|
|
1140
1143
|
break
|
|
1141
1144
|
|
|
@@ -124,7 +124,10 @@ def open_editor_for_command(
|
|
|
124
124
|
if not editor:
|
|
125
125
|
# Try common editors in order of preference
|
|
126
126
|
for common_editor in ["vim", "nano", "code", "subl", "atom", "emacs"]:
|
|
127
|
-
if
|
|
127
|
+
if (
|
|
128
|
+
subprocess.run(["which", common_editor], capture_output=True, timeout=5).returncode
|
|
129
|
+
== 0
|
|
130
|
+
):
|
|
128
131
|
editor = common_editor
|
|
129
132
|
break
|
|
130
133
|
|
|
@@ -217,11 +217,15 @@ Thumbs.db
|
|
|
217
217
|
# Initialize git if requested
|
|
218
218
|
if git and not (workflows_dir / ".git").exists():
|
|
219
219
|
try:
|
|
220
|
-
subprocess.run(
|
|
220
|
+
subprocess.run(
|
|
221
|
+
["git", "init"], cwd=workflows_dir, check=True, capture_output=True, timeout=30
|
|
222
|
+
)
|
|
221
223
|
console.print("[green]✓[/green] Initialized git repository in workflows directory")
|
|
222
224
|
|
|
223
225
|
# Create initial commit
|
|
224
|
-
subprocess.run(
|
|
226
|
+
subprocess.run(
|
|
227
|
+
["git", "add", "."], cwd=workflows_dir, check=True, capture_output=True, timeout=30
|
|
228
|
+
)
|
|
225
229
|
subprocess.run(
|
|
226
230
|
["git", "commit", "-m", "Initial commit: Initialize workflows directory"],
|
|
227
231
|
cwd=workflows_dir,
|
|
@@ -135,12 +135,20 @@ def sync_init(install: bool, foreground: bool):
|
|
|
135
135
|
else:
|
|
136
136
|
info("Starting IPFS daemon in background...")
|
|
137
137
|
|
|
138
|
+
# Detach the daemon from this process group. start_new_session is
|
|
139
|
+
# POSIX-only; on Windows use CREATE_NEW_PROCESS_GROUP instead so the
|
|
140
|
+
# call doesn't raise (#190).
|
|
141
|
+
if sys.platform == "win32":
|
|
142
|
+
_detach_kwargs = {"creationflags": subprocess.CREATE_NEW_PROCESS_GROUP}
|
|
143
|
+
else:
|
|
144
|
+
_detach_kwargs = {"start_new_session": True}
|
|
145
|
+
|
|
138
146
|
# Start daemon in background
|
|
139
147
|
process = subprocess.Popen(
|
|
140
148
|
["ipfs", "daemon"],
|
|
141
149
|
stdout=subprocess.DEVNULL,
|
|
142
150
|
stderr=subprocess.DEVNULL,
|
|
143
|
-
|
|
151
|
+
**_detach_kwargs,
|
|
144
152
|
)
|
|
145
153
|
|
|
146
154
|
# Save PID for tracking
|
|
@@ -389,7 +389,7 @@ def ensure_api_app() -> Optional[FastAPI]:
|
|
|
389
389
|
# Add CORS middleware
|
|
390
390
|
_api_app.add_middleware(
|
|
391
391
|
CORSMiddleware,
|
|
392
|
-
allow_origins=
|
|
392
|
+
allow_origins=os.environ.get("MCLI_CORS_ORIGINS", "http://localhost:3000").split(","),
|
|
393
393
|
allow_credentials=True,
|
|
394
394
|
allow_methods=["*"],
|
|
395
395
|
allow_headers=["*"],
|
|
@@ -455,7 +455,7 @@ def start_api_server(
|
|
|
455
455
|
# Add CORS middleware
|
|
456
456
|
_api_app.add_middleware(
|
|
457
457
|
CORSMiddleware,
|
|
458
|
-
allow_origins=
|
|
458
|
+
allow_origins=os.environ.get("MCLI_CORS_ORIGINS", "http://localhost:3000").split(","),
|
|
459
459
|
allow_credentials=True,
|
|
460
460
|
allow_methods=["*"],
|
|
461
461
|
allow_headers=["*"],
|
|
@@ -20,6 +20,56 @@ class RestrictedUnpickler(pickle.Unpickler):
|
|
|
20
20
|
raise pickle.UnpicklingError(f"Forbidden class: {module}.{name}")
|
|
21
21
|
|
|
22
22
|
|
|
23
|
+
# Allowlist of (module, qualified-name) globals that are safe to reconstruct
|
|
24
|
+
# from untrusted pickle data: builtin containers/scalars plus numpy array
|
|
25
|
+
# primitives. Anything else (callables like os.system/eval, arbitrary classes)
|
|
26
|
+
# is rejected, closing the pickle-RCE vector when deserializing cache data.
|
|
27
|
+
_SAFE_GLOBALS = {
|
|
28
|
+
("builtins", "list"),
|
|
29
|
+
("builtins", "dict"),
|
|
30
|
+
("builtins", "tuple"),
|
|
31
|
+
("builtins", "set"),
|
|
32
|
+
("builtins", "frozenset"),
|
|
33
|
+
("builtins", "str"),
|
|
34
|
+
("builtins", "bytes"),
|
|
35
|
+
("builtins", "bytearray"),
|
|
36
|
+
("builtins", "int"),
|
|
37
|
+
("builtins", "float"),
|
|
38
|
+
("builtins", "complex"),
|
|
39
|
+
("builtins", "bool"),
|
|
40
|
+
("builtins", "NoneType"),
|
|
41
|
+
# numpy array reconstruction primitives (only used when numpy is installed)
|
|
42
|
+
("numpy", "ndarray"),
|
|
43
|
+
("numpy", "dtype"),
|
|
44
|
+
("numpy.core.multiarray", "_reconstruct"),
|
|
45
|
+
("numpy.core.multiarray", "scalar"),
|
|
46
|
+
("numpy._core.multiarray", "_reconstruct"),
|
|
47
|
+
("numpy._core.multiarray", "scalar"),
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class SafeUnpickler(pickle.Unpickler):
|
|
52
|
+
"""Unpickler restricted to an allowlist of safe builtin/numpy globals.
|
|
53
|
+
|
|
54
|
+
Use for deserializing data from untrusted or shared stores (e.g. a Redis
|
|
55
|
+
cache) where a poisoned entry could otherwise trigger arbitrary code
|
|
56
|
+
execution via pickle reduce gadgets.
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
def find_class(self, module: str, name: str) -> Type:
|
|
60
|
+
if (module, name) in _SAFE_GLOBALS:
|
|
61
|
+
return super().find_class(module, name)
|
|
62
|
+
raise pickle.UnpicklingError(f"Forbidden global during unpickling: {module}.{name}")
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def safe_loads(data: bytes):
|
|
66
|
+
"""Deserialize *data* allowing only safe builtin/numpy globals.
|
|
67
|
+
|
|
68
|
+
Raises ``pickle.UnpicklingError`` for anything outside the allowlist.
|
|
69
|
+
"""
|
|
70
|
+
return SafeUnpickler(io.BytesIO(data)).load()
|
|
71
|
+
|
|
72
|
+
|
|
23
73
|
class ObjectCache(Generic[T]):
|
|
24
74
|
def __init__(self, class_type: Type[T], app_name: str, factory: Callable[[], T] = None):
|
|
25
75
|
self.class_type = class_type
|
|
@@ -19,6 +19,7 @@ except ImportError:
|
|
|
19
19
|
redis = None # type: ignore
|
|
20
20
|
|
|
21
21
|
from mcli.lib.logger.logger import get_logger
|
|
22
|
+
from mcli.lib.pickles.pickles import safe_loads
|
|
22
23
|
|
|
23
24
|
logger = get_logger(__name__)
|
|
24
25
|
|
|
@@ -315,7 +316,9 @@ class CachedTfIdfVectorizer:
|
|
|
315
316
|
try:
|
|
316
317
|
cached_data = await self.redis_client.get(cache_key)
|
|
317
318
|
if cached_data:
|
|
318
|
-
|
|
319
|
+
# Cache is shared/untrusted; restrict deserialization to a safe
|
|
320
|
+
# allowlist to prevent pickle-RCE from a poisoned entry (#170).
|
|
321
|
+
return safe_loads(cached_data)
|
|
319
322
|
except Exception as e:
|
|
320
323
|
logger.warning(f"Failed to get from cache: {e}")
|
|
321
324
|
|
|
@@ -87,7 +87,7 @@ class ReleaseNotes:
|
|
|
87
87
|
|
|
88
88
|
def _run_git(args: list[str]) -> str:
|
|
89
89
|
"""Run a git command and return stdout."""
|
|
90
|
-
result = subprocess.run(["git"] + args, capture_output=True, text=True, check=True)
|
|
90
|
+
result = subprocess.run(["git"] + args, capture_output=True, text=True, check=True, timeout=30)
|
|
91
91
|
return result.stdout.strip()
|
|
92
92
|
|
|
93
93
|
|
|
@@ -343,7 +343,10 @@ def open_editor_for_command(
|
|
|
343
343
|
if not editor:
|
|
344
344
|
# Try common editors in order of preference
|
|
345
345
|
for common_editor in ["vim", "nano", "code", "subl", "atom", "emacs"]:
|
|
346
|
-
if
|
|
346
|
+
if (
|
|
347
|
+
subprocess.run(["which", common_editor], capture_output=True, timeout=5).returncode
|
|
348
|
+
== 0
|
|
349
|
+
):
|
|
347
350
|
editor = common_editor
|
|
348
351
|
break
|
|
349
352
|
|
|
@@ -40,7 +40,9 @@ def init_store(path, remote):
|
|
|
40
40
|
# Initialize git if not already initialized
|
|
41
41
|
git_dir = store_path / ".git"
|
|
42
42
|
if not git_dir.exists():
|
|
43
|
-
subprocess.run(
|
|
43
|
+
subprocess.run(
|
|
44
|
+
["git", "init"], cwd=store_path, check=True, capture_output=True, timeout=30
|
|
45
|
+
)
|
|
44
46
|
success(f"Initialized git repository at {store_path}")
|
|
45
47
|
|
|
46
48
|
# Create .gitignore
|
|
@@ -132,7 +134,7 @@ def push_commands(message, all):
|
|
|
132
134
|
success(f"Copied {copied_count} items to store")
|
|
133
135
|
|
|
134
136
|
# Git add, commit, push
|
|
135
|
-
subprocess.run(["git", "add", "."], cwd=store_path, check=True)
|
|
137
|
+
subprocess.run(["git", "add", "."], cwd=store_path, check=True, timeout=30)
|
|
136
138
|
|
|
137
139
|
# Check if there are changes
|
|
138
140
|
result = subprocess.run(
|
|
@@ -145,12 +147,14 @@ def push_commands(message, all):
|
|
|
145
147
|
|
|
146
148
|
# Commit with message
|
|
147
149
|
commit_msg = message or f"Update commands {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
|
|
148
|
-
subprocess.run(["git", "commit", "-m", commit_msg], cwd=store_path, check=True)
|
|
150
|
+
subprocess.run(["git", "commit", "-m", commit_msg], cwd=store_path, check=True, timeout=30)
|
|
149
151
|
success(f"Committed changes: {commit_msg}")
|
|
150
152
|
|
|
151
153
|
# Push to remote if configured
|
|
152
154
|
try:
|
|
153
|
-
subprocess.run(
|
|
155
|
+
subprocess.run(
|
|
156
|
+
["git", "push"], cwd=store_path, check=True, capture_output=True, timeout=60
|
|
157
|
+
)
|
|
154
158
|
success("Pushed to remote")
|
|
155
159
|
except subprocess.CalledProcessError:
|
|
156
160
|
warning("No remote configured or push failed. Commands committed locally.")
|
|
@@ -169,7 +173,7 @@ def pull_commands(force):
|
|
|
169
173
|
|
|
170
174
|
# Pull from remote
|
|
171
175
|
try:
|
|
172
|
-
subprocess.run(["git", "pull"], cwd=store_path, check=True)
|
|
176
|
+
subprocess.run(["git", "pull"], cwd=store_path, check=True, timeout=60)
|
|
173
177
|
success("Pulled latest changes from remote")
|
|
174
178
|
except subprocess.CalledProcessError:
|
|
175
179
|
warning("No remote configured or pull failed. Using local store.")
|
|
@@ -218,7 +222,9 @@ def sync_commands(message):
|
|
|
218
222
|
# First pull
|
|
219
223
|
info("Pulling latest changes...")
|
|
220
224
|
try:
|
|
221
|
-
subprocess.run(
|
|
225
|
+
subprocess.run(
|
|
226
|
+
["git", "pull"], cwd=store_path, check=True, capture_output=True, timeout=60
|
|
227
|
+
)
|
|
222
228
|
success("Pulled from remote")
|
|
223
229
|
except subprocess.CalledProcessError:
|
|
224
230
|
warning("No remote or pull failed")
|
|
@@ -246,12 +252,14 @@ def sync_commands(message):
|
|
|
246
252
|
return
|
|
247
253
|
|
|
248
254
|
# Commit and push
|
|
249
|
-
subprocess.run(["git", "add", "."], cwd=store_path, check=True)
|
|
255
|
+
subprocess.run(["git", "add", "."], cwd=store_path, check=True, timeout=30)
|
|
250
256
|
commit_msg = message or f"Sync commands {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
|
|
251
|
-
subprocess.run(["git", "commit", "-m", commit_msg], cwd=store_path, check=True)
|
|
257
|
+
subprocess.run(["git", "commit", "-m", commit_msg], cwd=store_path, check=True, timeout=30)
|
|
252
258
|
|
|
253
259
|
try:
|
|
254
|
-
subprocess.run(
|
|
260
|
+
subprocess.run(
|
|
261
|
+
["git", "push"], cwd=store_path, check=True, capture_output=True, timeout=60
|
|
262
|
+
)
|
|
255
263
|
success("Synced and pushed to remote")
|
|
256
264
|
except subprocess.CalledProcessError:
|
|
257
265
|
success("Synced locally (no remote configured)")
|
|
@@ -18,6 +18,11 @@ _RATE_LIMIT_MARKERS = (
|
|
|
18
18
|
"pull rate limit",
|
|
19
19
|
)
|
|
20
20
|
|
|
21
|
+
# act emits this when no job matches the requested event (e.g. a
|
|
22
|
+
# workflow_dispatch-only workflow queried for pull_request). That is a no-op,
|
|
23
|
+
# not a failure, so the gate must treat it as PASS rather than block the push.
|
|
24
|
+
_NO_STAGES_MARKERS = ("could not find any stages to run",)
|
|
25
|
+
|
|
21
26
|
# Backoff (seconds) between docker rate-limit retries; the last value repeats.
|
|
22
27
|
_RETRY_BACKOFF = (15, 45)
|
|
23
28
|
_MAX_RETRIES = 2
|
|
@@ -34,6 +39,11 @@ def _is_docker_rate_limited(output: str) -> bool:
|
|
|
34
39
|
return any(marker in low for marker in _RATE_LIMIT_MARKERS)
|
|
35
40
|
|
|
36
41
|
|
|
42
|
+
def _has_no_stages(output: str) -> bool:
|
|
43
|
+
low = (output or "").lower()
|
|
44
|
+
return any(marker in low for marker in _NO_STAGES_MARKERS)
|
|
45
|
+
|
|
46
|
+
|
|
37
47
|
def act_available() -> bool:
|
|
38
48
|
return shutil.which("act") is not None
|
|
39
49
|
|
|
@@ -91,6 +101,15 @@ def run_act(
|
|
|
91
101
|
if proc.returncode == 0:
|
|
92
102
|
return PreflightResult.PASS
|
|
93
103
|
|
|
104
|
+
# No job matches this event (e.g. workflow_dispatch-only) — nothing to
|
|
105
|
+
# validate, so this is a pass, not a gate failure.
|
|
106
|
+
if _has_no_stages(output):
|
|
107
|
+
sys.stdout.write(
|
|
108
|
+
"ℹ️ No act stages for this event (workflow_dispatch-only?); "
|
|
109
|
+
"nothing to validate — treating as pass.\n"
|
|
110
|
+
)
|
|
111
|
+
return PreflightResult.PASS
|
|
112
|
+
|
|
94
113
|
if _is_docker_rate_limited(output):
|
|
95
114
|
if attempt < retries:
|
|
96
115
|
delay = backoff[min(attempt, len(backoff) - 1)]
|
|
@@ -134,7 +134,7 @@ def pr():
|
|
|
134
134
|
raise SystemExit(1)
|
|
135
135
|
if slug and has_online_runner(slug):
|
|
136
136
|
click.echo("act unreachable; pushing so the runner can validate.")
|
|
137
|
-
subprocess.run(["git", "push", "-u", "origin", "HEAD"], check=False)
|
|
137
|
+
subprocess.run(["git", "push", "-u", "origin", "HEAD"], check=False, timeout=120)
|
|
138
138
|
subprocess.run(["gh", "pr", "create", "--fill", "--base", "main"], check=False)
|
|
139
139
|
return
|
|
140
140
|
click.echo("act unreachable and no runner; refusing to open an unvalidated PR.")
|
|
@@ -349,7 +349,7 @@ def init():
|
|
|
349
349
|
|
|
350
350
|
# Check if Homebrew is installed
|
|
351
351
|
try:
|
|
352
|
-
subprocess.run(["brew", "--version"], capture_output=True, check=True)
|
|
352
|
+
subprocess.run(["brew", "--version"], capture_output=True, check=True, timeout=10)
|
|
353
353
|
success("✅ Homebrew is installed")
|
|
354
354
|
except (subprocess.CalledProcessError, FileNotFoundError):
|
|
355
355
|
error("❌ Homebrew is not installed. Install it from https://brew.sh")
|
|
@@ -360,11 +360,13 @@ def init():
|
|
|
360
360
|
# Install pandoc
|
|
361
361
|
info("📥 Installing pandoc...")
|
|
362
362
|
try:
|
|
363
|
-
result = subprocess.run(
|
|
363
|
+
result = subprocess.run(
|
|
364
|
+
["brew", "install", "pandoc"], capture_output=True, text=True, timeout=300
|
|
365
|
+
)
|
|
364
366
|
if result.returncode == 0:
|
|
365
367
|
success(" ✅ pandoc installed successfully")
|
|
366
368
|
else:
|
|
367
|
-
check = subprocess.run(["which", "pandoc"], capture_output=True)
|
|
369
|
+
check = subprocess.run(["which", "pandoc"], capture_output=True, timeout=10)
|
|
368
370
|
if check.returncode == 0:
|
|
369
371
|
info(" ℹ️ pandoc is already installed")
|
|
370
372
|
else:
|
|
@@ -378,7 +380,9 @@ def init():
|
|
|
378
380
|
info("📥 Installing Jupyter & nbconvert (for notebook conversion)...")
|
|
379
381
|
try:
|
|
380
382
|
# Check if already installed
|
|
381
|
-
check = subprocess.run(
|
|
383
|
+
check = subprocess.run(
|
|
384
|
+
["jupyter", "nbconvert", "--version"], capture_output=True, timeout=10
|
|
385
|
+
)
|
|
382
386
|
if check.returncode == 0:
|
|
383
387
|
info(" ℹ️ jupyter nbconvert is already installed")
|
|
384
388
|
else:
|
|
@@ -425,7 +429,7 @@ def init():
|
|
|
425
429
|
info(" sudo tlmgr install collection-fontsrecommended")
|
|
426
430
|
info(" sudo mktexlsr")
|
|
427
431
|
else:
|
|
428
|
-
check = subprocess.run(["which", "pdflatex"], capture_output=True)
|
|
432
|
+
check = subprocess.run(["which", "pdflatex"], capture_output=True, timeout=10)
|
|
429
433
|
if check.returncode == 0:
|
|
430
434
|
info(" ℹ️ LaTeX is already installed")
|
|
431
435
|
else:
|
|
@@ -512,7 +516,7 @@ def convert(from_format, to_format, path, output_dir, pandoc_args, no_fallback):
|
|
|
512
516
|
# Check if pandoc is installed (primary tool)
|
|
513
517
|
has_pandoc = False
|
|
514
518
|
try:
|
|
515
|
-
subprocess.run(["pandoc", "--version"], capture_output=True, check=True)
|
|
519
|
+
subprocess.run(["pandoc", "--version"], capture_output=True, check=True, timeout=10)
|
|
516
520
|
has_pandoc = True
|
|
517
521
|
except (subprocess.CalledProcessError, FileNotFoundError):
|
|
518
522
|
pass
|
|
@@ -520,7 +524,9 @@ def convert(from_format, to_format, path, output_dir, pandoc_args, no_fallback):
|
|
|
520
524
|
# Check if nbconvert is available
|
|
521
525
|
has_nbconvert = False
|
|
522
526
|
try:
|
|
523
|
-
subprocess.run(
|
|
527
|
+
subprocess.run(
|
|
528
|
+
["jupyter", "nbconvert", "--version"], capture_output=True, check=True, timeout=10
|
|
529
|
+
)
|
|
524
530
|
has_nbconvert = True
|
|
525
531
|
except (subprocess.CalledProcessError, FileNotFoundError):
|
|
526
532
|
pass
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcli-framework
|
|
3
|
-
Version: 8.0.
|
|
3
|
+
Version: 8.0.55
|
|
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>
|
|
@@ -82,10 +82,18 @@ Requires-Dist: freezegun>=1.4.0; extra == "dev"
|
|
|
82
82
|
Requires-Dist: pytest-html>=4.1.0; extra == "dev"
|
|
83
83
|
Requires-Dist: pytest-json-report>=1.5.0; extra == "dev"
|
|
84
84
|
Requires-Dist: black<26.0.0,>=25.0.0; extra == "dev"
|
|
85
|
-
Requires-Dist: isort<6.0.0,>=5.
|
|
86
|
-
Requires-Dist: mypy<2.0.0,>=1.
|
|
85
|
+
Requires-Dist: isort<6.0.0,>=5.13.2; extra == "dev"
|
|
86
|
+
Requires-Dist: mypy<2.0.0,>=1.16.1; extra == "dev"
|
|
87
87
|
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
88
|
+
Requires-Dist: pylint>=3.0.0; extra == "dev"
|
|
89
|
+
Requires-Dist: flake8>=7.0.0; extra == "dev"
|
|
90
|
+
Requires-Dist: flake8-docstrings>=1.7.0; extra == "dev"
|
|
91
|
+
Requires-Dist: flake8-bugbear>=24.1.0; extra == "dev"
|
|
92
|
+
Requires-Dist: flake8-comprehensions>=3.14.0; extra == "dev"
|
|
93
|
+
Requires-Dist: flake8-simplify>=0.21.0; extra == "dev"
|
|
88
94
|
Requires-Dist: pre-commit>=4.5.1; extra == "dev"
|
|
95
|
+
Requires-Dist: bandit>=1.7.0; extra == "dev"
|
|
96
|
+
Requires-Dist: safety>=3.0.0; extra == "dev"
|
|
89
97
|
Requires-Dist: build>=1.2.2.post1; extra == "dev"
|
|
90
98
|
Requires-Dist: maturin>=1.9.3; extra == "dev"
|
|
91
99
|
Requires-Dist: twine>=4.0.0; extra == "dev"
|
|
@@ -45,10 +45,18 @@ freezegun>=1.4.0
|
|
|
45
45
|
pytest-html>=4.1.0
|
|
46
46
|
pytest-json-report>=1.5.0
|
|
47
47
|
black<26.0.0,>=25.0.0
|
|
48
|
-
isort<6.0.0,>=5.
|
|
49
|
-
mypy<2.0.0,>=1.
|
|
48
|
+
isort<6.0.0,>=5.13.2
|
|
49
|
+
mypy<2.0.0,>=1.16.1
|
|
50
50
|
ruff>=0.1.0
|
|
51
|
+
pylint>=3.0.0
|
|
52
|
+
flake8>=7.0.0
|
|
53
|
+
flake8-docstrings>=1.7.0
|
|
54
|
+
flake8-bugbear>=24.1.0
|
|
55
|
+
flake8-comprehensions>=3.14.0
|
|
56
|
+
flake8-simplify>=0.21.0
|
|
51
57
|
pre-commit>=4.5.1
|
|
58
|
+
bandit>=1.7.0
|
|
59
|
+
safety>=3.0.0
|
|
52
60
|
build>=1.2.2.post1
|
|
53
61
|
maturin>=1.9.3
|
|
54
62
|
twine>=4.0.0
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|