mcli-framework 8.0.49__tar.gz → 8.0.51__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 (242) hide show
  1. {mcli_framework-8.0.49/src/mcli_framework.egg-info → mcli_framework-8.0.51}/PKG-INFO +1 -1
  2. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/pyproject.toml +1 -1
  3. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/ipfs_sync.py +14 -2
  4. mcli_framework-8.0.51/src/mcli/workflow/ci/act_runner.py +121 -0
  5. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/ci/ci.py +12 -1
  6. {mcli_framework-8.0.49 → mcli_framework-8.0.51/src/mcli_framework.egg-info}/PKG-INFO +1 -1
  7. mcli_framework-8.0.49/src/mcli/workflow/ci/act_runner.py +0 -61
  8. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/LICENSE +0 -0
  9. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/MANIFEST.in +0 -0
  10. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/README.md +0 -0
  11. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/llms-full.txt +0 -0
  12. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/llms.txt +0 -0
  13. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/mcli_rust/Cargo.toml +0 -0
  14. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/mcli_rust/src/command_parser.rs +0 -0
  15. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/mcli_rust/src/file_watcher.rs +0 -0
  16. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/mcli_rust/src/lib.rs +0 -0
  17. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/mcli_rust/src/process_manager.rs +0 -0
  18. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/mcli_rust/src/tfidf.rs +0 -0
  19. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/setup.cfg +0 -0
  20. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/__init__.py +0 -0
  21. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/__init__.py +0 -0
  22. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/commands_cmd.py +0 -0
  23. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/completion_helpers.py +0 -0
  24. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/context_cmd.py +0 -0
  25. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/create_cmd.py +0 -0
  26. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/delete_cmd.py +0 -0
  27. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/edit_cmd.py +0 -0
  28. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/import_cmd.py +0 -0
  29. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/init_cmd.py +0 -0
  30. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/list_cmd.py +0 -0
  31. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/main.py +0 -0
  32. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/migrate_cmd.py +0 -0
  33. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/model/__init__.py +0 -0
  34. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/model/model.py +0 -0
  35. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/model_cmd.py +0 -0
  36. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/mv_cmd.py +0 -0
  37. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/new_cmd.py +0 -0
  38. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/remove_cmd.py +0 -0
  39. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/rm_cmd.py +0 -0
  40. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/search_cmd.py +0 -0
  41. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/services_cmd.py +0 -0
  42. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/setup_cmd.py +0 -0
  43. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/source_sync_cmd.py +0 -0
  44. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/sync_cmd.py +0 -0
  45. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/video/__init__.py +0 -0
  46. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/app/video/video.py +0 -0
  47. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/config.toml +0 -0
  48. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/__init__.py +0 -0
  49. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/api/__init__.py +0 -0
  50. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/api/api.py +0 -0
  51. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/api/daemon_client.py +0 -0
  52. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/api/daemon_client_local.py +0 -0
  53. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/api/daemon_decorator.py +0 -0
  54. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/api/mcli_decorators.py +0 -0
  55. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/auth/__init__.py +0 -0
  56. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/auth/auth.py +0 -0
  57. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/auth/aws_manager.py +0 -0
  58. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/auth/azure_manager.py +0 -0
  59. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/auth/credential_manager.py +0 -0
  60. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/auth/gcp_manager.py +0 -0
  61. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/auth/key_manager.py +0 -0
  62. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/auth/mcli_manager.py +0 -0
  63. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/auth/token_manager.py +0 -0
  64. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/auth/token_util.py +0 -0
  65. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/config/__init__.py +0 -0
  66. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/config/config.py +0 -0
  67. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/config/settings.py +0 -0
  68. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/constants/__init__.py +0 -0
  69. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/constants/commands.py +0 -0
  70. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/constants/defaults.py +0 -0
  71. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/constants/env.py +0 -0
  72. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/constants/messages.py +0 -0
  73. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/constants/paths.py +0 -0
  74. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/constants/scripts.py +0 -0
  75. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/constants/storage.py +0 -0
  76. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/custom_commands.py +0 -0
  77. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/discovery/__init__.py +0 -0
  78. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/discovery/command_discovery.py +0 -0
  79. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/erd/__init__.py +0 -0
  80. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/erd/erd.py +0 -0
  81. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/erd/generate_graph.py +0 -0
  82. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/errors.py +0 -0
  83. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/feature_detection.py +0 -0
  84. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/files/__init__.py +0 -0
  85. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/files/files.py +0 -0
  86. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/folder_workflows.py +0 -0
  87. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/fs/__init__.py +0 -0
  88. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/fs/fs.py +0 -0
  89. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/ipfs_utils.py +0 -0
  90. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/ipns_manager.py +0 -0
  91. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/lib.py +0 -0
  92. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/logger/__init__.py +0 -0
  93. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/logger/correlation.py +0 -0
  94. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/logger/logger.py +0 -0
  95. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/logger/structured.py +0 -0
  96. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/optional_deps.py +0 -0
  97. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/paths.py +0 -0
  98. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/performance/__init__.py +0 -0
  99. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/performance/optimizer.py +0 -0
  100. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/performance/rust_bridge.py +0 -0
  101. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/performance/uvloop_config.py +0 -0
  102. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/pickles/__init__.py +0 -0
  103. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/pickles/pickles.py +0 -0
  104. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/pyenv/__init__.py +0 -0
  105. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/pyenv/deps.py +0 -0
  106. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/pyenv/manager.py +0 -0
  107. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/pyenv/venv.py +0 -0
  108. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/script_loader.py +0 -0
  109. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/script_sync.py +0 -0
  110. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/script_watcher.py +0 -0
  111. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/search/cached_vectorizer.py +0 -0
  112. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/secrets/__init__.py +0 -0
  113. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/secrets/commands.py +0 -0
  114. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/secrets/manager.py +0 -0
  115. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/secrets/repl.py +0 -0
  116. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/secrets/store.py +0 -0
  117. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/services/__init__.py +0 -0
  118. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/services/config.py +0 -0
  119. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/services/data_pipeline.py +0 -0
  120. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/services/health.py +0 -0
  121. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/services/lsh_client.py +0 -0
  122. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/services/manager.py +0 -0
  123. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/services/redis_service.py +0 -0
  124. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/services/registry.py +0 -0
  125. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/services/state.py +0 -0
  126. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/services/supervisor.py +0 -0
  127. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/shell/__init__.py +0 -0
  128. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/shell/exceptions.py +0 -0
  129. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/shell/shell.py +0 -0
  130. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/sync_key_store.py +0 -0
  131. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/templates/__init__.py +0 -0
  132. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/templates/command_templates.py +0 -0
  133. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/toml/__init__.py +0 -0
  134. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/toml/toml.py +0 -0
  135. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/types.py +0 -0
  136. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/ui/styling.py +0 -0
  137. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/ui/visual_effects.py +0 -0
  138. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/watcher/__init__.py +0 -0
  139. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/watcher/watcher.py +0 -0
  140. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/workflow_models.py +0 -0
  141. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/lib/workspace_registry.py +0 -0
  142. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/mygroup/__init__.py +0 -0
  143. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/mygroup/test_cmd.py +0 -0
  144. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/public/__init__.py +0 -0
  145. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/public/commands/__init__.py +0 -0
  146. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/public/oi/oi.py +0 -0
  147. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/public/public.py +0 -0
  148. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/self/__init__.py +0 -0
  149. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/self/completion_cmd.py +0 -0
  150. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/self/env_cmd.py +0 -0
  151. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/self/health_cmd.py +0 -0
  152. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/self/ipfs_cmd.py +0 -0
  153. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/self/logs_cmd.py +0 -0
  154. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/self/migrate_cmd.py +0 -0
  155. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/self/release_notes_cmd.py +0 -0
  156. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/self/self_cmd.py +0 -0
  157. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/self/store_cmd.py +0 -0
  158. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/self/test_cmd.py +0 -0
  159. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/self/workflows_cmd.py +0 -0
  160. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/storage/__init__.py +0 -0
  161. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/storage/backends/__init__.py +0 -0
  162. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/storage/backends/ipfs_backend.py +0 -0
  163. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/storage/base.py +0 -0
  164. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/storage/cache.py +0 -0
  165. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/storage/encryption.py +0 -0
  166. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/storage/factory.py +0 -0
  167. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/storage/registry.py +0 -0
  168. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/storage/storacha_cli.py +0 -0
  169. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/__init__.py +0 -0
  170. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/ci/__init__.py +0 -0
  171. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/ci/runner_status.py +0 -0
  172. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/ci/workflow_transform.py +0 -0
  173. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/daemon/__init__.py +0 -0
  174. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/daemon/async_command_database.py +0 -0
  175. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/daemon/async_process_manager.py +0 -0
  176. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/daemon/client.py +0 -0
  177. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/daemon/daemon.py +0 -0
  178. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/daemon/daemon_api.py +0 -0
  179. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/daemon/enhanced_daemon.py +0 -0
  180. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/daemon/process_cli.py +0 -0
  181. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/daemon/process_manager.py +0 -0
  182. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/daemon/test_daemon.py +0 -0
  183. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/doc_convert.py +0 -0
  184. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/docker/__init__.py +0 -0
  185. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/docker/docker.py +0 -0
  186. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/file/__init__.py +0 -0
  187. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/gcloud/__init__.py +0 -0
  188. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/gcloud/config.toml +0 -0
  189. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/gcloud/gcloud.py +0 -0
  190. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/git_commit/__init__.py +0 -0
  191. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/git_commit/ai_service.py +0 -0
  192. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/interview/__init__.py +0 -0
  193. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/lsh_integration.py +0 -0
  194. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/model_service/client.py +0 -0
  195. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/model_service/download_and_run_efficient_models.py +0 -0
  196. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/model_service/lightweight_embedder.py +0 -0
  197. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/model_service/lightweight_model_server.py +0 -0
  198. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/model_service/lightweight_test.py +0 -0
  199. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/model_service/model_service.py +0 -0
  200. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/model_service/ollama_efficient_runner.py +0 -0
  201. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/model_service/openai_adapter.py +0 -0
  202. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/model_service/pdf_processor.py +0 -0
  203. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/model_service/test_efficient_runner.py +0 -0
  204. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/model_service/test_example.py +0 -0
  205. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/model_service/test_integration.py +0 -0
  206. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/model_service/test_new_features.py +0 -0
  207. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/notebook/__init__.py +0 -0
  208. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/notebook/command_loader.py +0 -0
  209. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/notebook/converter.py +0 -0
  210. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/notebook/executor.py +0 -0
  211. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/notebook/notebook_cmd.py +0 -0
  212. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/notebook/schema.py +0 -0
  213. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/notebook/validator.py +0 -0
  214. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/openai/openai.py +0 -0
  215. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/registry/__init__.py +0 -0
  216. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/registry/registry.py +0 -0
  217. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/repo/__init__.py +0 -0
  218. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/repo/repo.py +0 -0
  219. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/scheduler/__init__.py +0 -0
  220. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/scheduler/cron_parser.py +0 -0
  221. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/scheduler/job.py +0 -0
  222. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/scheduler/models.py +0 -0
  223. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/scheduler/monitor.py +0 -0
  224. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/scheduler/persistence.py +0 -0
  225. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/scheduler/scheduler.py +0 -0
  226. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/scheduler/validation.py +0 -0
  227. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/search/__init__.py +0 -0
  228. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/secrets/__init__.py +0 -0
  229. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/secrets/secrets_cmd.py +0 -0
  230. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/storage/__init__.py +0 -0
  231. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/storage/storage_cmd.py +0 -0
  232. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/sync/__init__.py +0 -0
  233. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/sync/test_cmd.py +0 -0
  234. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/videos/__init__.py +0 -0
  235. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/wakatime/__init__.py +0 -0
  236. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/wakatime/wakatime.py +0 -0
  237. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli/workflow/workflow.py +0 -0
  238. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli_framework.egg-info/SOURCES.txt +0 -0
  239. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli_framework.egg-info/dependency_links.txt +0 -0
  240. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli_framework.egg-info/entry_points.txt +0 -0
  241. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/src/mcli_framework.egg-info/requires.txt +0 -0
  242. {mcli_framework-8.0.49 → mcli_framework-8.0.51}/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.49
3
+ Version: 8.0.51
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.49"
3
+ version = "8.0.51"
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"
@@ -28,7 +28,7 @@ import hashlib
28
28
  import json
29
29
  import time
30
30
  from datetime import datetime
31
- from pathlib import Path
31
+ from pathlib import Path, PurePosixPath
32
32
  from typing import Optional
33
33
 
34
34
  import requests
@@ -535,7 +535,19 @@ class IPFSSync:
535
535
  f"hash mismatch for '{name}': expected {expected_value}, got {actual}"
536
536
  )
537
537
 
538
- target = workflows_dir / script_filename
538
+ # SECURITY: `script_filename` comes from a remote, untrusted manifest.
539
+ # Contain it inside workflows_dir so a crafted manifest cannot write
540
+ # outside the directory via '..' segments or an absolute path.
541
+ rel = PurePosixPath(script_filename)
542
+ if rel.is_absolute() or any(part == ".." for part in rel.parts):
543
+ raise ValueError(f"unsafe script path in manifest: {script_filename}")
544
+ base = Path(workflows_dir).resolve()
545
+ target = (base / Path(*rel.parts)).resolve()
546
+ if base != target and base not in target.parents:
547
+ raise ValueError(f"script path escapes workflows dir: {script_filename}")
548
+
549
+ # Recreate group subdirectories (e.g. "demo/hello.py") on pull.
550
+ target.parent.mkdir(parents=True, exist_ok=True)
539
551
  target.write_bytes(payload)
540
552
  written.append(target)
541
553
 
@@ -0,0 +1,121 @@
1
+ """Run `act` locally and classify the outcome for the PR gate."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import shutil
6
+ import subprocess
7
+ import sys
8
+ import time
9
+ from enum import Enum
10
+ from pathlib import Path
11
+
12
+ # Docker Hub returns these when the unauthenticated image-pull rate limit is hit.
13
+ # act surfaces them while pulling the runner image — this is an environment
14
+ # problem, NOT a test failure, so it must not hard-block a push.
15
+ _RATE_LIMIT_MARKERS = (
16
+ "toomanyrequests",
17
+ "you have reached your unauthenticated pull rate limit",
18
+ "pull rate limit",
19
+ )
20
+
21
+ # Backoff (seconds) between docker rate-limit retries; the last value repeats.
22
+ _RETRY_BACKOFF = (15, 45)
23
+ _MAX_RETRIES = 2
24
+
25
+
26
+ class PreflightResult(Enum):
27
+ PASS = "pass"
28
+ FAIL = "fail"
29
+ UNREACHABLE = "unreachable"
30
+
31
+
32
+ def _is_docker_rate_limited(output: str) -> bool:
33
+ low = (output or "").lower()
34
+ return any(marker in low for marker in _RATE_LIMIT_MARKERS)
35
+
36
+
37
+ def act_available() -> bool:
38
+ return shutil.which("act") is not None
39
+
40
+
41
+ def docker_running() -> bool:
42
+ try:
43
+ proc = subprocess.run(["docker", "info"], capture_output=True, timeout=30)
44
+ return proc.returncode == 0
45
+ except (FileNotFoundError, subprocess.TimeoutExpired):
46
+ return False
47
+
48
+
49
+ def probe() -> bool:
50
+ """Can act actually run here? Needs the binary, a live docker daemon, and `act -l`."""
51
+ if not act_available() or not docker_running():
52
+ return False
53
+ try:
54
+ proc = subprocess.run(["act", "-l"], capture_output=True, text=True, timeout=60)
55
+ except (FileNotFoundError, subprocess.TimeoutExpired):
56
+ return False
57
+ return proc.returncode == 0
58
+
59
+
60
+ def build_act_command(event: str) -> list[str]:
61
+ cmd = ["act", event]
62
+ if Path(".secrets").exists():
63
+ cmd += ["--secret-file", ".secrets"]
64
+ return cmd
65
+
66
+
67
+ def run_act(
68
+ event: str = "pull_request",
69
+ retries: int = _MAX_RETRIES,
70
+ backoff: tuple[int, ...] = _RETRY_BACKOFF,
71
+ ) -> PreflightResult:
72
+ """Run act for `event` and classify the outcome.
73
+
74
+ - exit 0 -> PASS.
75
+ - non-zero whose output shows a Docker Hub pull rate limit
76
+ (``toomanyrequests``) -> retry up to ``retries`` times with backoff;
77
+ if still rate-limited, return UNREACHABLE (cannot validate — an
78
+ environment problem, not a test failure, so the gate must not block).
79
+ - any other non-zero exit -> FAIL.
80
+
81
+ Output is captured (to detect the rate limit) and echoed so the user still
82
+ sees act's progress.
83
+ """
84
+ attempt = 0
85
+ while True:
86
+ proc = subprocess.run(build_act_command(event), capture_output=True, text=True)
87
+ output = (proc.stdout or "") + (proc.stderr or "")
88
+ if output:
89
+ sys.stdout.write(output if output.endswith("\n") else output + "\n")
90
+
91
+ if proc.returncode == 0:
92
+ return PreflightResult.PASS
93
+
94
+ if _is_docker_rate_limited(output):
95
+ if attempt < retries:
96
+ delay = backoff[min(attempt, len(backoff) - 1)]
97
+ sys.stdout.write(
98
+ f"⚠️ Docker Hub rate limit (toomanyrequests); retrying in {delay}s "
99
+ f"(attempt {attempt + 1}/{retries})…\n"
100
+ )
101
+ time.sleep(delay)
102
+ attempt += 1
103
+ continue
104
+ sys.stdout.write(
105
+ "⚠️ Docker Hub still rate-limited after retries — cannot validate "
106
+ "locally; allowing push (run `mcli ci preflight` again later).\n"
107
+ )
108
+ return PreflightResult.UNREACHABLE
109
+
110
+ return PreflightResult.FAIL
111
+
112
+
113
+ def preflight(repo_slug: str, event: str = "pull_request") -> PreflightResult:
114
+ """Primary gate. PASS/FAIL if act can run; UNREACHABLE if act can't start here.
115
+
116
+ `repo_slug` is accepted for symmetry and future use; the runner fallback is
117
+ orchestrated by the CLI layer based on runner_status.has_online_runner.
118
+ """
119
+ if not probe():
120
+ return PreflightResult.UNREACHABLE
121
+ return run_act(event)
@@ -143,7 +143,18 @@ def pr():
143
143
 
144
144
  PRE_PUSH_HOOK = """#!/usr/bin/env bash
145
145
  # mcli-ci pre-push gate: validate with act before pushing.
146
- exec mcli ci preflight
146
+ # Blocks ONLY on a real act failure (exit 1). When act cannot validate locally
147
+ # — e.g. Docker Hub rate-limit (toomanyrequests, retried first), no docker, or
148
+ # an online runner will validate instead (exit 2/3) — the push is allowed so an
149
+ # environment hiccup never wedges your workflow. Override a real failure with:
150
+ # git push --no-verify
151
+ mcli ci preflight
152
+ code=$?
153
+ if [ "$code" -eq 1 ]; then
154
+ echo "mcli-ci: act reported failures — push blocked. Override: git push --no-verify" >&2
155
+ exit 1
156
+ fi
157
+ exit 0
147
158
  """
148
159
 
149
160
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcli-framework
3
- Version: 8.0.49
3
+ Version: 8.0.51
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,61 +0,0 @@
1
- """Run `act` locally and classify the outcome for the PR gate."""
2
-
3
- from __future__ import annotations
4
-
5
- import shutil
6
- import subprocess
7
- from enum import Enum
8
- from pathlib import Path
9
-
10
-
11
- class PreflightResult(Enum):
12
- PASS = "pass"
13
- FAIL = "fail"
14
- UNREACHABLE = "unreachable"
15
-
16
-
17
- def act_available() -> bool:
18
- return shutil.which("act") is not None
19
-
20
-
21
- def docker_running() -> bool:
22
- try:
23
- proc = subprocess.run(["docker", "info"], capture_output=True, timeout=30)
24
- return proc.returncode == 0
25
- except (FileNotFoundError, subprocess.TimeoutExpired):
26
- return False
27
-
28
-
29
- def probe() -> bool:
30
- """Can act actually run here? Needs the binary, a live docker daemon, and `act -l`."""
31
- if not act_available() or not docker_running():
32
- return False
33
- try:
34
- proc = subprocess.run(["act", "-l"], capture_output=True, text=True, timeout=60)
35
- except (FileNotFoundError, subprocess.TimeoutExpired):
36
- return False
37
- return proc.returncode == 0
38
-
39
-
40
- def build_act_command(event: str) -> list[str]:
41
- cmd = ["act", event]
42
- if Path(".secrets").exists():
43
- cmd += ["--secret-file", ".secrets"]
44
- return cmd
45
-
46
-
47
- def run_act(event: str = "pull_request") -> PreflightResult:
48
- """Run act for `event`. PASS on exit 0, else FAIL. (Probe gates UNREACHABLE upstream.)"""
49
- proc = subprocess.run(build_act_command(event))
50
- return PreflightResult.PASS if proc.returncode == 0 else PreflightResult.FAIL
51
-
52
-
53
- def preflight(repo_slug: str, event: str = "pull_request") -> PreflightResult:
54
- """Primary gate. PASS/FAIL if act can run; UNREACHABLE if act can't start here.
55
-
56
- `repo_slug` is accepted for symmetry and future use; the runner fallback is
57
- orchestrated by the CLI layer based on runner_status.has_online_runner.
58
- """
59
- if not probe():
60
- return PreflightResult.UNREACHABLE
61
- return run_act(event)
File without changes