mcli-framework 8.0.60__tar.gz → 8.0.62__tar.gz

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