mcli-framework 8.0.59__tar.gz → 8.0.61__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. {mcli_framework-8.0.59/src/mcli_framework.egg-info → mcli_framework-8.0.61}/PKG-INFO +1 -1
  2. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/pyproject.toml +1 -1
  3. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/constants/paths.py +6 -0
  4. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/pyenv/deps.py +20 -0
  5. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/pyenv/manager.py +11 -7
  6. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/ci/act_runner.py +90 -27
  7. {mcli_framework-8.0.59 → mcli_framework-8.0.61/src/mcli_framework.egg-info}/PKG-INFO +1 -1
  8. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/LICENSE +0 -0
  9. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/MANIFEST.in +0 -0
  10. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/README.md +0 -0
  11. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/llms-full.txt +0 -0
  12. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/llms.txt +0 -0
  13. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/mcli_rust/Cargo.toml +0 -0
  14. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/mcli_rust/src/command_parser.rs +0 -0
  15. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/mcli_rust/src/file_watcher.rs +0 -0
  16. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/mcli_rust/src/lib.rs +0 -0
  17. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/mcli_rust/src/process_manager.rs +0 -0
  18. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/mcli_rust/src/tfidf.rs +0 -0
  19. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/setup.cfg +0 -0
  20. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/__init__.py +0 -0
  21. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/__main__.py +0 -0
  22. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/__init__.py +0 -0
  23. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/completion_helpers.py +0 -0
  24. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/context_cmd.py +0 -0
  25. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/delete_cmd.py +0 -0
  26. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/edit_cmd.py +0 -0
  27. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/import_cmd.py +0 -0
  28. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/init_cmd.py +0 -0
  29. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/list_cmd.py +0 -0
  30. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/main.py +0 -0
  31. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/model/__init__.py +0 -0
  32. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/model/model.py +0 -0
  33. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/model_cmd.py +0 -0
  34. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/mv_cmd.py +0 -0
  35. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/new_cmd.py +0 -0
  36. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/search_cmd.py +0 -0
  37. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/services_cmd.py +0 -0
  38. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/setup_cmd.py +0 -0
  39. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/source_sync_cmd.py +0 -0
  40. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/sync_cmd.py +0 -0
  41. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/video/__init__.py +0 -0
  42. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/app/video/video.py +0 -0
  43. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/config.toml +0 -0
  44. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/__init__.py +0 -0
  45. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/api/__init__.py +0 -0
  46. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/api/api.py +0 -0
  47. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/api/daemon_client.py +0 -0
  48. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/api/daemon_client_local.py +0 -0
  49. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/api/daemon_decorator.py +0 -0
  50. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/api/mcli_decorators.py +0 -0
  51. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/auth/__init__.py +0 -0
  52. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/auth/auth.py +0 -0
  53. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/auth/aws_manager.py +0 -0
  54. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/auth/azure_manager.py +0 -0
  55. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/auth/credential_manager.py +0 -0
  56. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/auth/gcp_manager.py +0 -0
  57. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/auth/key_manager.py +0 -0
  58. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/auth/mcli_manager.py +0 -0
  59. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/auth/token_manager.py +0 -0
  60. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/auth/token_util.py +0 -0
  61. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/config/__init__.py +0 -0
  62. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/config/config.py +0 -0
  63. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/config/settings.py +0 -0
  64. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/constants/__init__.py +0 -0
  65. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/constants/commands.py +0 -0
  66. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/constants/defaults.py +0 -0
  67. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/constants/env.py +0 -0
  68. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/constants/messages.py +0 -0
  69. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/constants/scripts.py +0 -0
  70. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/constants/storage.py +0 -0
  71. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/custom_commands.py +0 -0
  72. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/discovery/__init__.py +0 -0
  73. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/discovery/command_discovery.py +0 -0
  74. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/erd/__init__.py +0 -0
  75. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/erd/erd.py +0 -0
  76. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/erd/generate_graph.py +0 -0
  77. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/errors.py +0 -0
  78. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/feature_detection.py +0 -0
  79. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/files/__init__.py +0 -0
  80. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/files/files.py +0 -0
  81. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/folder_workflows.py +0 -0
  82. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/fs/__init__.py +0 -0
  83. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/fs/fs.py +0 -0
  84. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/ipfs_sync.py +0 -0
  85. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/ipfs_utils.py +0 -0
  86. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/ipns_manager.py +0 -0
  87. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/lib.py +0 -0
  88. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/logger/__init__.py +0 -0
  89. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/logger/correlation.py +0 -0
  90. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/logger/logger.py +0 -0
  91. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/logger/structured.py +0 -0
  92. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/optional_deps.py +0 -0
  93. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/paths.py +0 -0
  94. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/performance/__init__.py +0 -0
  95. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/performance/optimizer.py +0 -0
  96. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/performance/rust_bridge.py +0 -0
  97. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/performance/uvloop_config.py +0 -0
  98. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/pickles/__init__.py +0 -0
  99. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/pickles/pickles.py +0 -0
  100. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/pyenv/__init__.py +0 -0
  101. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/pyenv/venv.py +0 -0
  102. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/script_loader.py +0 -0
  103. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/script_sync.py +0 -0
  104. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/script_watcher.py +0 -0
  105. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/search/cached_vectorizer.py +0 -0
  106. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/secrets/__init__.py +0 -0
  107. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/secrets/commands.py +0 -0
  108. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/secrets/manager.py +0 -0
  109. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/secrets/repl.py +0 -0
  110. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/secrets/store.py +0 -0
  111. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/services/__init__.py +0 -0
  112. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/services/config.py +0 -0
  113. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/services/data_pipeline.py +0 -0
  114. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/services/health.py +0 -0
  115. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/services/lsh_client.py +0 -0
  116. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/services/manager.py +0 -0
  117. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/services/redis_service.py +0 -0
  118. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/services/registry.py +0 -0
  119. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/services/state.py +0 -0
  120. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/services/supervisor.py +0 -0
  121. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/shell/__init__.py +0 -0
  122. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/shell/exceptions.py +0 -0
  123. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/shell/shell.py +0 -0
  124. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/sync_key_store.py +0 -0
  125. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/templates/__init__.py +0 -0
  126. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/templates/command_templates.py +0 -0
  127. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/toml/__init__.py +0 -0
  128. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/toml/toml.py +0 -0
  129. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/types.py +0 -0
  130. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/ui/styling.py +0 -0
  131. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/ui/visual_effects.py +0 -0
  132. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/watcher/__init__.py +0 -0
  133. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/watcher/watcher.py +0 -0
  134. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/workflow_models.py +0 -0
  135. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/lib/workspace_registry.py +0 -0
  136. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/mygroup/__init__.py +0 -0
  137. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/mygroup/test_cmd.py +0 -0
  138. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/public/__init__.py +0 -0
  139. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/public/commands/__init__.py +0 -0
  140. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/public/oi/oi.py +0 -0
  141. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/public/public.py +0 -0
  142. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/self/__init__.py +0 -0
  143. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/self/completion_cmd.py +0 -0
  144. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/self/env_cmd.py +0 -0
  145. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/self/health_cmd.py +0 -0
  146. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/self/ipfs_cmd.py +0 -0
  147. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/self/logs_cmd.py +0 -0
  148. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/self/migrate_cmd.py +0 -0
  149. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/self/release_notes_cmd.py +0 -0
  150. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/self/self_cmd.py +0 -0
  151. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/self/store_cmd.py +0 -0
  152. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/self/test_cmd.py +0 -0
  153. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/self/workflows_cmd.py +0 -0
  154. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/storage/__init__.py +0 -0
  155. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/storage/backends/__init__.py +0 -0
  156. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/storage/backends/ipfs_backend.py +0 -0
  157. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/storage/base.py +0 -0
  158. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/storage/cache.py +0 -0
  159. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/storage/encryption.py +0 -0
  160. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/storage/factory.py +0 -0
  161. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/storage/registry.py +0 -0
  162. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/storage/storacha_cli.py +0 -0
  163. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/__init__.py +0 -0
  164. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/ci/__init__.py +0 -0
  165. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/ci/ci.py +0 -0
  166. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/ci/runner_status.py +0 -0
  167. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/ci/workflow_transform.py +0 -0
  168. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/daemon/__init__.py +0 -0
  169. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/daemon/async_command_database.py +0 -0
  170. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/daemon/async_process_manager.py +0 -0
  171. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/daemon/client.py +0 -0
  172. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/daemon/daemon.py +0 -0
  173. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/daemon/daemon_api.py +0 -0
  174. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/daemon/enhanced_daemon.py +0 -0
  175. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/daemon/process_cli.py +0 -0
  176. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/daemon/process_manager.py +0 -0
  177. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/daemon/test_daemon.py +0 -0
  178. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/doc_convert.py +0 -0
  179. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/docker/__init__.py +0 -0
  180. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/docker/docker.py +0 -0
  181. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/file/__init__.py +0 -0
  182. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/gcloud/__init__.py +0 -0
  183. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/gcloud/config.toml +0 -0
  184. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/gcloud/gcloud.py +0 -0
  185. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/git_commit/__init__.py +0 -0
  186. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/git_commit/ai_service.py +0 -0
  187. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/interview/__init__.py +0 -0
  188. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/lsh_integration.py +0 -0
  189. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/client.py +0 -0
  190. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/download_and_run_efficient_models.py +0 -0
  191. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/lightweight_embedder.py +0 -0
  192. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/lightweight_model_server.py +0 -0
  193. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/lightweight_test.py +0 -0
  194. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/model_service.py +0 -0
  195. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/ollama_efficient_runner.py +0 -0
  196. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/openai_adapter.py +0 -0
  197. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/pdf_processor.py +0 -0
  198. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/test_efficient_runner.py +0 -0
  199. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/test_example.py +0 -0
  200. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/test_integration.py +0 -0
  201. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/model_service/test_new_features.py +0 -0
  202. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/notebook/__init__.py +0 -0
  203. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/notebook/command_loader.py +0 -0
  204. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/notebook/converter.py +0 -0
  205. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/notebook/executor.py +0 -0
  206. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/notebook/notebook_cmd.py +0 -0
  207. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/notebook/schema.py +0 -0
  208. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/notebook/validator.py +0 -0
  209. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/openai/openai.py +0 -0
  210. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/registry/__init__.py +0 -0
  211. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/registry/registry.py +0 -0
  212. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/repo/__init__.py +0 -0
  213. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/repo/repo.py +0 -0
  214. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/scheduler/__init__.py +0 -0
  215. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/scheduler/cron_parser.py +0 -0
  216. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/scheduler/job.py +0 -0
  217. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/scheduler/models.py +0 -0
  218. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/scheduler/monitor.py +0 -0
  219. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/scheduler/persistence.py +0 -0
  220. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/scheduler/scheduler.py +0 -0
  221. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/scheduler/validation.py +0 -0
  222. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/search/__init__.py +0 -0
  223. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/secrets/__init__.py +0 -0
  224. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/secrets/secrets_cmd.py +0 -0
  225. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/storage/__init__.py +0 -0
  226. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/storage/storage_cmd.py +0 -0
  227. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/sync/__init__.py +0 -0
  228. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/sync/test_cmd.py +0 -0
  229. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/videos/__init__.py +0 -0
  230. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/wakatime/__init__.py +0 -0
  231. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/wakatime/wakatime.py +0 -0
  232. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli/workflow/workflow.py +0 -0
  233. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli_framework.egg-info/SOURCES.txt +0 -0
  234. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli_framework.egg-info/dependency_links.txt +0 -0
  235. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli_framework.egg-info/entry_points.txt +0 -0
  236. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli_framework.egg-info/requires.txt +0 -0
  237. {mcli_framework-8.0.59 → mcli_framework-8.0.61}/src/mcli_framework.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcli-framework
3
- Version: 8.0.59
3
+ Version: 8.0.61
4
4
  Summary: Portable workflow framework - transform any script into a versioned, schedulable command. Store in ~/.mcli/workflows/, version with lockfile, run as daemon or cron job.
5
5
  Author-email: Luis Fernandez de la Vara <luis@lefv.io>
6
6
  Maintainer-email: Luis Fernandez de la Vara <luis@lefv.io>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mcli-framework"
3
- version = "8.0.59"
3
+ version = "8.0.61"
4
4
  description = "Portable workflow framework - transform any script into a versioned, schedulable command. Store in ~/.mcli/workflows/, version with lockfile, run as daemon or cron job."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -101,5 +101,11 @@ class VenvPaths:
101
101
  PYTHON_UNIX = "python"
102
102
  PYTHON_WINDOWS = "python.exe"
103
103
 
104
+ # Framework runtime primitives that mcli python workflows assume are
105
+ # importable. The generated script templates `import click` unconditionally,
106
+ # so an isolated (bare) global venv must be seeded with these even when a
107
+ # script omits them from its @requires metadata.
108
+ BASE_RUNTIME_PACKAGES = ["click"]
109
+
104
110
 
105
111
  __all__ = ["DirNames", "FileNames", "PathPatterns", "GitIgnorePatterns", "VenvPaths"]
@@ -75,6 +75,26 @@ class DependencyChecker:
75
75
 
76
76
  return installed, missing
77
77
 
78
+ def merge_base_runtime(self, packages: List[str], base: List[str]) -> List[str]:
79
+ """Append base runtime packages that are not already declared.
80
+
81
+ Comparison is by normalized package name, so a declared spec like
82
+ ``click>=8.0`` or ``Click`` suppresses adding the bare ``click`` base.
83
+
84
+ Args:
85
+ packages: Packages already requested (from @requires).
86
+ base: Base runtime packages to ensure are present.
87
+
88
+ Returns:
89
+ ``packages`` plus any base package whose normalized name is absent.
90
+ """
91
+ have = {self._normalize_package_name(self._extract_package_name(p)) for p in packages}
92
+ merged = list(packages)
93
+ for pkg in base:
94
+ if self._normalize_package_name(self._extract_package_name(pkg)) not in have:
95
+ merged.append(pkg)
96
+ return merged
97
+
78
98
  def install_packages(self, packages: List[str], venv_path: Path) -> bool:
79
99
  """Install packages using uv pip install.
80
100
 
@@ -12,7 +12,7 @@ from typing import Dict, List, Optional, Tuple
12
12
 
13
13
  import click
14
14
 
15
- from mcli.lib.constants import EnvVars, VenvMessages
15
+ from mcli.lib.constants import EnvVars, VenvMessages, VenvPaths
16
16
  from mcli.lib.logger import get_logger
17
17
 
18
18
  from .deps import DependencyChecker
@@ -119,10 +119,6 @@ class PyEnvManager:
119
119
  Returns:
120
120
  True if all dependencies are satisfied or installed.
121
121
  """
122
- if not requires:
123
- logger.debug(VenvMessages.NO_DEPS_SPECIFIED)
124
- return True
125
-
126
122
  venv_path, source = self.resolve_environment()
127
123
 
128
124
  # Ensure the venv exists (create global venv if needed)
@@ -132,8 +128,16 @@ class PyEnvManager:
132
128
  python_exe = self.get_python_executable()
133
129
  checker = DependencyChecker(python_exe)
134
130
 
135
- # Parse and check dependencies
136
- packages = checker.parse_requires(requires)
131
+ # Parse declared dependencies, then ensure framework runtime primitives
132
+ # (e.g. click) are present even when @requires is empty — an isolated
133
+ # global venv is created bare and mcli workflow scripts import click.
134
+ packages = checker.parse_requires(requires) if requires else []
135
+ packages = checker.merge_base_runtime(packages, VenvPaths.BASE_RUNTIME_PACKAGES)
136
+
137
+ if not packages:
138
+ logger.debug(VenvMessages.NO_DEPS_SPECIFIED)
139
+ return True
140
+
137
141
  logger.debug(VenvMessages.CHECKING_DEPS.format(script=script_name))
138
142
 
139
143
  installed, missing = checker.check_installed(packages)
@@ -28,13 +28,14 @@ _NO_STAGES_MARKERS = ("could not find any stages to run",)
28
28
  _RETRY_BACKOFF = (15, 45)
29
29
  _MAX_RETRIES = 2
30
30
 
31
- # Canonical CI entrypoint created by `mcli ci migrate`: ci.yml'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:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcli-framework
3
- Version: 8.0.59
3
+ Version: 8.0.61
4
4
  Summary: Portable workflow framework - transform any script into a versioned, schedulable command. Store in ~/.mcli/workflows/, version with lockfile, run as daemon or cron job.
5
5
  Author-email: Luis Fernandez de la Vara <luis@lefv.io>
6
6
  Maintainer-email: Luis Fernandez de la Vara <luis@lefv.io>
File without changes