mcli-framework 8.0.41__tar.gz → 8.0.43__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 (487) hide show
  1. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/PKG-INFO +1 -1
  2. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/pyproject.toml +1 -1
  3. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/init_cmd.py +6 -1
  4. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/new_cmd.py +33 -17
  5. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/constants/messages.py +7 -1
  6. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/pyenv/manager.py +30 -17
  7. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/script_loader.py +2 -1
  8. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli_framework.egg-info/PKG-INFO +1 -1
  9. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_new_cmd.py +57 -0
  10. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_pyenv.py +62 -0
  11. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/.github/dependabot.yml +0 -0
  12. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/.github/dependency-review-config.yml +0 -0
  13. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/.github/workflows/build.yml +0 -0
  14. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/.github/workflows/ci.yml +0 -0
  15. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/.github/workflows/codeql.yml +0 -0
  16. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/.github/workflows/docs-links.yml +0 -0
  17. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/.github/workflows/publish-self-hosted.yml +0 -0
  18. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/.github/workflows/publish.yml +0 -0
  19. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/.github/workflows/release.yml +0 -0
  20. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/.github/workflows/security.yml +0 -0
  21. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/.github/workflows/test.yml +0 -0
  22. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/LICENSE +0 -0
  23. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/MANIFEST.in +0 -0
  24. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/README.md +0 -0
  25. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/llms-full.txt +0 -0
  26. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/llms.txt +0 -0
  27. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/mcli_rust/Cargo.toml +0 -0
  28. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/mcli_rust/src/command_parser.rs +0 -0
  29. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/mcli_rust/src/file_watcher.rs +0 -0
  30. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/mcli_rust/src/lib.rs +0 -0
  31. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/mcli_rust/src/process_manager.rs +0 -0
  32. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/mcli_rust/src/tfidf.rs +0 -0
  33. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/setup.cfg +0 -0
  34. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/__init__.py +0 -0
  35. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/__init__.py +0 -0
  36. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/commands_cmd.py +0 -0
  37. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/completion_helpers.py +0 -0
  38. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/context_cmd.py +0 -0
  39. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/create_cmd.py +0 -0
  40. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/delete_cmd.py +0 -0
  41. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/edit_cmd.py +0 -0
  42. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/import_cmd.py +0 -0
  43. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/list_cmd.py +0 -0
  44. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/main.py +0 -0
  45. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/migrate_cmd.py +0 -0
  46. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/model/__init__.py +0 -0
  47. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/model/model.py +0 -0
  48. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/model_cmd.py +0 -0
  49. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/mv_cmd.py +0 -0
  50. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/remove_cmd.py +0 -0
  51. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/rm_cmd.py +0 -0
  52. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/search_cmd.py +0 -0
  53. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/services_cmd.py +0 -0
  54. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/sync_cmd.py +0 -0
  55. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/video/__init__.py +0 -0
  56. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/app/video/video.py +0 -0
  57. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/config.toml +0 -0
  58. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/__init__.py +0 -0
  59. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/api/__init__.py +0 -0
  60. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/api/api.py +0 -0
  61. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/api/daemon_client.py +0 -0
  62. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/api/daemon_client_local.py +0 -0
  63. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/api/daemon_decorator.py +0 -0
  64. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/api/mcli_decorators.py +0 -0
  65. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/auth/__init__.py +0 -0
  66. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/auth/auth.py +0 -0
  67. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/auth/aws_manager.py +0 -0
  68. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/auth/azure_manager.py +0 -0
  69. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/auth/credential_manager.py +0 -0
  70. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/auth/gcp_manager.py +0 -0
  71. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/auth/key_manager.py +0 -0
  72. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/auth/mcli_manager.py +0 -0
  73. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/auth/token_manager.py +0 -0
  74. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/auth/token_util.py +0 -0
  75. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/config/__init__.py +0 -0
  76. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/config/config.py +0 -0
  77. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/constants/__init__.py +0 -0
  78. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/constants/commands.py +0 -0
  79. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/constants/defaults.py +0 -0
  80. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/constants/env.py +0 -0
  81. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/constants/paths.py +0 -0
  82. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/constants/scripts.py +0 -0
  83. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/constants/storage.py +0 -0
  84. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/custom_commands.py +0 -0
  85. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/discovery/__init__.py +0 -0
  86. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/discovery/command_discovery.py +0 -0
  87. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/erd/__init__.py +0 -0
  88. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/erd/erd.py +0 -0
  89. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/erd/generate_graph.py +0 -0
  90. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/errors.py +0 -0
  91. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/feature_detection.py +0 -0
  92. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/files/__init__.py +0 -0
  93. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/files/files.py +0 -0
  94. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/folder_workflows.py +0 -0
  95. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/fs/__init__.py +0 -0
  96. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/fs/fs.py +0 -0
  97. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/ipfs_sync.py +0 -0
  98. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/ipfs_utils.py +0 -0
  99. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/lib.py +0 -0
  100. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/logger/__init__.py +0 -0
  101. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/logger/correlation.py +0 -0
  102. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/logger/logger.py +0 -0
  103. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/logger/structured.py +0 -0
  104. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/optional_deps.py +0 -0
  105. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/paths.py +0 -0
  106. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/performance/__init__.py +0 -0
  107. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/performance/optimizer.py +0 -0
  108. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/performance/rust_bridge.py +0 -0
  109. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/performance/uvloop_config.py +0 -0
  110. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/pickles/__init__.py +0 -0
  111. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/pickles/pickles.py +0 -0
  112. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/pyenv/__init__.py +0 -0
  113. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/pyenv/deps.py +0 -0
  114. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/pyenv/venv.py +0 -0
  115. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/script_sync.py +0 -0
  116. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/script_watcher.py +0 -0
  117. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/search/cached_vectorizer.py +0 -0
  118. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/secrets/__init__.py +0 -0
  119. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/secrets/commands.py +0 -0
  120. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/secrets/manager.py +0 -0
  121. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/secrets/repl.py +0 -0
  122. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/secrets/store.py +0 -0
  123. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/services/__init__.py +0 -0
  124. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/services/config.py +0 -0
  125. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/services/data_pipeline.py +0 -0
  126. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/services/health.py +0 -0
  127. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/services/lsh_client.py +0 -0
  128. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/services/manager.py +0 -0
  129. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/services/redis_service.py +0 -0
  130. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/services/registry.py +0 -0
  131. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/services/state.py +0 -0
  132. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/services/supervisor.py +0 -0
  133. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/shell/__init__.py +0 -0
  134. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/shell/exceptions.py +0 -0
  135. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/shell/shell.py +0 -0
  136. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/templates/__init__.py +0 -0
  137. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/templates/command_templates.py +0 -0
  138. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/toml/__init__.py +0 -0
  139. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/toml/toml.py +0 -0
  140. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/types.py +0 -0
  141. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/ui/styling.py +0 -0
  142. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/ui/visual_effects.py +0 -0
  143. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/watcher/__init__.py +0 -0
  144. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/watcher/watcher.py +0 -0
  145. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/workflow_models.py +0 -0
  146. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/lib/workspace_registry.py +0 -0
  147. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/__init__.py +0 -0
  148. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/__init__.py +0 -0
  149. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/app.py +0 -0
  150. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/middleware.py +0 -0
  151. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/routers/__init__.py +0 -0
  152. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/routers/admin_router.py +0 -0
  153. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/routers/auth_router.py +0 -0
  154. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/routers/backtest_router.py +0 -0
  155. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/routers/data_router.py +0 -0
  156. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/routers/model_router.py +0 -0
  157. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/routers/monitoring_router.py +0 -0
  158. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/routers/portfolio_router.py +0 -0
  159. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/routers/prediction_router.py +0 -0
  160. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/routers/trade_router.py +0 -0
  161. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/routers/websocket_router.py +0 -0
  162. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/api/schemas.py +0 -0
  163. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/auth/__init__.py +0 -0
  164. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/auth/auth_manager.py +0 -0
  165. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/auth/models.py +0 -0
  166. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/auth/permissions.py +0 -0
  167. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/backtesting/__init__.py +0 -0
  168. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/backtesting/backtest_engine.py +0 -0
  169. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/backtesting/performance_metrics.py +0 -0
  170. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/backtesting/run.py +0 -0
  171. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/cache.py +0 -0
  172. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/cli/__init__.py +0 -0
  173. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/cli/main.py +0 -0
  174. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/config/__init__.py +0 -0
  175. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/config/settings.py +0 -0
  176. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/configs/__init__.py +0 -0
  177. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/configs/dvc_config.py +0 -0
  178. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/configs/mlflow_config.py +0 -0
  179. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/configs/mlops_manager.py +0 -0
  180. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/__init__.py +0 -0
  181. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/app.py +0 -0
  182. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/app_integrated.py +0 -0
  183. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/app_supabase.py +0 -0
  184. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/app_training.py +0 -0
  185. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/cli.py +0 -0
  186. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/common.py +0 -0
  187. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/components/__init__.py +0 -0
  188. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/components/charts.py +0 -0
  189. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/components/metrics.py +0 -0
  190. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/components/tables.py +0 -0
  191. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/overview.py +0 -0
  192. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/pages/__init__.py +0 -0
  193. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/pages/cicd.py +0 -0
  194. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/pages/debug_dependencies.py +0 -0
  195. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/pages/gravity_viz.py +0 -0
  196. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/pages/monte_carlo_predictions.py +0 -0
  197. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/pages/predictions_enhanced.py +0 -0
  198. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/pages/scrapers_and_logs.py +0 -0
  199. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/pages/test_portfolio.py +0 -0
  200. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/pages/trading.py +0 -0
  201. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/pages/workflows.py +0 -0
  202. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/streamlit_extras_utils.py +0 -0
  203. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/styles.py +0 -0
  204. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/utils.py +0 -0
  205. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/dashboard/warning_suppression.py +0 -0
  206. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/data_ingestion/__init__.py +0 -0
  207. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/data_ingestion/api_connectors.py +0 -0
  208. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/data_ingestion/data_pipeline.py +0 -0
  209. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/data_ingestion/stream_processor.py +0 -0
  210. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/database/__init__.py +0 -0
  211. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/database/migrations/env.py +0 -0
  212. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/database/models.py +0 -0
  213. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/database/session.py +0 -0
  214. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/experimentation/__init__.py +0 -0
  215. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/experimentation/ab_testing.py +0 -0
  216. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/features/__init__.py +0 -0
  217. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/features/ensemble_features.py +0 -0
  218. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/features/recommendation_engine.py +0 -0
  219. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/features/stock_features.py +0 -0
  220. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/features/test_feature_engineering.py +0 -0
  221. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/logging.py +0 -0
  222. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/mlops/__init__.py +0 -0
  223. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/mlops/data_versioning.py +0 -0
  224. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/mlops/experiment_tracker.py +0 -0
  225. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/mlops/model_serving.py +0 -0
  226. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/mlops/pipeline_orchestrator.py +0 -0
  227. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/models/__init__.py +0 -0
  228. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/models/base_models.py +0 -0
  229. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/models/ensemble_models.py +0 -0
  230. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/models/recommendation_models.py +0 -0
  231. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/models/test_models.py +0 -0
  232. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/monitoring/__init__.py +0 -0
  233. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/monitoring/drift_detection.py +0 -0
  234. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/monitoring/metrics.py +0 -0
  235. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/optimization/__init__.py +0 -0
  236. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/optimization/optimize.py +0 -0
  237. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/optimization/portfolio_optimizer.py +0 -0
  238. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/predictions/__init__.py +0 -0
  239. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/predictions/monte_carlo.py +0 -0
  240. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/predictions/prediction_engine.py +0 -0
  241. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/preprocessing/__init__.py +0 -0
  242. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/preprocessing/data_cleaners.py +0 -0
  243. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/preprocessing/feature_extractors.py +0 -0
  244. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/preprocessing/ml_pipeline.py +0 -0
  245. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/preprocessing/test_preprocessing.py +0 -0
  246. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/scripts/__init__.py +0 -0
  247. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/scripts/populate_sample_data.py +0 -0
  248. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/serving/__init__.py +0 -0
  249. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/serving/serve.py +0 -0
  250. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/tasks.py +0 -0
  251. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/tests/test_integration.py +0 -0
  252. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/tests/test_training_dashboard.py +0 -0
  253. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/trading/__init__.py +0 -0
  254. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/trading/alpaca_client.py +0 -0
  255. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/trading/migrations.py +0 -0
  256. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/trading/models.py +0 -0
  257. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/trading/paper_trading.py +0 -0
  258. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/trading/risk_management.py +0 -0
  259. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/trading/trading_service.py +0 -0
  260. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/training/__init__.py +0 -0
  261. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/training/train.py +0 -0
  262. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/ml/training/train_model.py +0 -0
  263. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/mygroup/__init__.py +0 -0
  264. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/mygroup/test_cmd.py +0 -0
  265. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/public/__init__.py +0 -0
  266. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/public/commands/__init__.py +0 -0
  267. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/public/oi/oi.py +0 -0
  268. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/public/public.py +0 -0
  269. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/self/__init__.py +0 -0
  270. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/self/completion_cmd.py +0 -0
  271. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/self/env_cmd.py +0 -0
  272. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/self/health_cmd.py +0 -0
  273. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/self/ipfs_cmd.py +0 -0
  274. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/self/logs_cmd.py +0 -0
  275. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/self/migrate_cmd.py +0 -0
  276. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/self/self_cmd.py +0 -0
  277. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/self/store_cmd.py +0 -0
  278. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/self/test_cmd.py +0 -0
  279. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/self/workflows_cmd.py +0 -0
  280. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/storage/__init__.py +0 -0
  281. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/storage/backends/__init__.py +0 -0
  282. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/storage/backends/ipfs_backend.py +0 -0
  283. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/storage/base.py +0 -0
  284. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/storage/cache.py +0 -0
  285. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/storage/encryption.py +0 -0
  286. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/storage/factory.py +0 -0
  287. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/storage/registry.py +0 -0
  288. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/storage/storacha_cli.py +0 -0
  289. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/__init__.py +0 -0
  290. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/daemon/__init__.py +0 -0
  291. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/daemon/async_command_database.py +0 -0
  292. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/daemon/async_process_manager.py +0 -0
  293. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/daemon/client.py +0 -0
  294. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/daemon/daemon.py +0 -0
  295. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/daemon/daemon_api.py +0 -0
  296. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/daemon/enhanced_daemon.py +0 -0
  297. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/daemon/process_cli.py +0 -0
  298. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/daemon/process_manager.py +0 -0
  299. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/daemon/test_daemon.py +0 -0
  300. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/dashboard/__init__.py +0 -0
  301. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/dashboard/dashboard_cmd.py +0 -0
  302. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/doc_convert.py +0 -0
  303. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/docker/__init__.py +0 -0
  304. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/docker/docker.py +0 -0
  305. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/file/__init__.py +0 -0
  306. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/gcloud/__init__.py +0 -0
  307. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/gcloud/config.toml +0 -0
  308. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/gcloud/gcloud.py +0 -0
  309. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/git_commit/__init__.py +0 -0
  310. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/git_commit/ai_service.py +0 -0
  311. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/interview/__init__.py +0 -0
  312. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/lsh_integration.py +0 -0
  313. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/client.py +0 -0
  314. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/download_and_run_efficient_models.py +0 -0
  315. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/lightweight_embedder.py +0 -0
  316. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/lightweight_model_server.py +0 -0
  317. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/lightweight_test.py +0 -0
  318. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/model_service.py +0 -0
  319. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/ollama_efficient_runner.py +0 -0
  320. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/openai_adapter.py +0 -0
  321. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/pdf_processor.py +0 -0
  322. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/test_efficient_runner.py +0 -0
  323. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/test_example.py +0 -0
  324. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/test_integration.py +0 -0
  325. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/model_service/test_new_features.py +0 -0
  326. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/notebook/__init__.py +0 -0
  327. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/notebook/command_loader.py +0 -0
  328. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/notebook/converter.py +0 -0
  329. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/notebook/executor.py +0 -0
  330. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/notebook/notebook_cmd.py +0 -0
  331. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/notebook/schema.py +0 -0
  332. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/notebook/validator.py +0 -0
  333. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/openai/openai.py +0 -0
  334. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/registry/__init__.py +0 -0
  335. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/registry/registry.py +0 -0
  336. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/repo/__init__.py +0 -0
  337. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/repo/repo.py +0 -0
  338. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/scheduler/__init__.py +0 -0
  339. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/scheduler/cron_parser.py +0 -0
  340. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/scheduler/job.py +0 -0
  341. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/scheduler/models.py +0 -0
  342. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/scheduler/monitor.py +0 -0
  343. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/scheduler/persistence.py +0 -0
  344. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/scheduler/scheduler.py +0 -0
  345. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/scheduler/validation.py +0 -0
  346. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/search/__init__.py +0 -0
  347. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/secrets/__init__.py +0 -0
  348. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/secrets/secrets_cmd.py +0 -0
  349. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/storage/__init__.py +0 -0
  350. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/storage/storage_cmd.py +0 -0
  351. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/sync/__init__.py +0 -0
  352. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/sync/test_cmd.py +0 -0
  353. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/videos/__init__.py +0 -0
  354. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/wakatime/__init__.py +0 -0
  355. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/wakatime/wakatime.py +0 -0
  356. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli/workflow/workflow.py +0 -0
  357. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli_framework.egg-info/SOURCES.txt +0 -0
  358. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli_framework.egg-info/dependency_links.txt +0 -0
  359. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli_framework.egg-info/entry_points.txt +0 -0
  360. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli_framework.egg-info/requires.txt +0 -0
  361. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/src/mcli_framework.egg-info/top_level.txt +0 -0
  362. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/__init__.py +0 -0
  363. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_all_commands.py +0 -0
  364. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_app_logs_cmd.py +0 -0
  365. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_app_redis_cmd.py +0 -0
  366. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_logs_cmd.py +0 -0
  367. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_main_app.py +0 -0
  368. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_model_cmd.py +0 -0
  369. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_self_cmd.py +0 -0
  370. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_self_cmd_plugins.py +0 -0
  371. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_self_cmd_utilities.py +0 -0
  372. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_workflow_creation_commands.py +0 -0
  373. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_workflow_file.py +0 -0
  374. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_workflow_gcloud.py +0 -0
  375. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/cli/test_workflow_registry.py +0 -0
  376. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/conftest.py +0 -0
  377. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/e2e/__init__.py +0 -0
  378. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/e2e/test_complete_workflows.py +0 -0
  379. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/e2e/test_model_workflow.py +0 -0
  380. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/e2e/test_new_user_workflow.py +0 -0
  381. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/e2e/test_update_workflow.py +0 -0
  382. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/fixtures/__init__.py +0 -0
  383. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/fixtures/chat_fixtures.py +0 -0
  384. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/fixtures/cli_fixtures.py +0 -0
  385. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/fixtures/command_fixtures.py +0 -0
  386. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/fixtures/data_fixtures.py +0 -0
  387. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/fixtures/db_fixtures.py +0 -0
  388. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/fixtures/model_fixtures.py +0 -0
  389. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/__init__.py +0 -0
  390. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_all_commands_comprehensive.py +0 -0
  391. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_daemon_server.py +0 -0
  392. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_direct_file_execution.py +0 -0
  393. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_e2e_dashboard_lsh_supabase.py +0 -0
  394. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_flask_webapp.py +0 -0
  395. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_folder_workflows_integration.py +0 -0
  396. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_gcloud_services.py +0 -0
  397. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_ml_auth.py +0 -0
  398. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_ml_data_pipeline.py +0 -0
  399. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_ml_models.py +0 -0
  400. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_ml_pipeline.py +0 -0
  401. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_module_imports.py +0 -0
  402. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_notebook_workflows.py +0 -0
  403. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_oi_service.py +0 -0
  404. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_repo_operations.py +0 -0
  405. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_scheduler_integration.py +0 -0
  406. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_service_registry.py +0 -0
  407. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_supabase_live_connection.py +0 -0
  408. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_video_processing.py +0 -0
  409. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_wakatime_api.py +0 -0
  410. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_webapp_full.py +0 -0
  411. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_workflow.py +0 -0
  412. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/integration/test_workflow_commands.py +0 -0
  413. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/performance/__init__.py +0 -0
  414. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/property/__init__.py +0 -0
  415. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/__init__.py +0 -0
  416. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/storage/__init__.py +0 -0
  417. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/storage/test_cache.py +0 -0
  418. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/storage/test_encryption.py +0 -0
  419. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/storage/test_storacha_cli.py +0 -0
  420. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_api_utils.py +0 -0
  421. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_async_process_manager.py +0 -0
  422. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_auth_modules.py +0 -0
  423. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_bug_fixes.py +0 -0
  424. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_command_fixtures.py +0 -0
  425. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_config.py +0 -0
  426. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_correlation_logging.py +0 -0
  427. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_custom_commands.py +0 -0
  428. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_custom_commands_filtering.py +0 -0
  429. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_daemon_api.py +0 -0
  430. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_dashboard_components.py +0 -0
  431. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_dashboard_functions.py +0 -0
  432. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_dashboard_pages.py +0 -0
  433. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_dependencies.py +0 -0
  434. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_doc_convert_workflow.py +0 -0
  435. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_emulator_workflow.py +0 -0
  436. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_erd_generation.py +0 -0
  437. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_erd_generic.py +0 -0
  438. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_erd_imports.py +0 -0
  439. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_folder_workflows.py +0 -0
  440. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_git_commit_workflow.py +0 -0
  441. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_health_cmd.py +0 -0
  442. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_import_cmd.py +0 -0
  443. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_init_mv_cmd.py +0 -0
  444. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_ipfs_cmd.py +0 -0
  445. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_ipfs_retry.py +0 -0
  446. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_language_suffix.py +0 -0
  447. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_lib_auth.py +0 -0
  448. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_lib_files.py +0 -0
  449. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_lib_utils.py +0 -0
  450. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_logger.py +0 -0
  451. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_ml_preprocessing.py +0 -0
  452. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_notebook_command_loader.py +0 -0
  453. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_notebook_executor.py +0 -0
  454. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_optional_deps.py +0 -0
  455. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_paths.py +0 -0
  456. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_pdf_compress.py +0 -0
  457. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_prediction_engine.py +0 -0
  458. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_regression.py +0 -0
  459. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_scheduler.py +0 -0
  460. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_scheduler_cron_parser.py +0 -0
  461. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_scheduler_job.py +0 -0
  462. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_scheduler_models.py +0 -0
  463. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_scheduler_monitor.py +0 -0
  464. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_scheduler_persistence.py +0 -0
  465. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_scheduler_validation.py +0 -0
  466. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_script_loader_options.py +0 -0
  467. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_security_command_injection.py +0 -0
  468. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_self_update.py +0 -0
  469. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_service_config.py +0 -0
  470. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_service_health.py +0 -0
  471. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_service_manager.py +0 -0
  472. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_service_state.py +0 -0
  473. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_services_cmd.py +0 -0
  474. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_shell_exceptions.py +0 -0
  475. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_shell_functions.py +0 -0
  476. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_shell_security.py +0 -0
  477. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_store_cmd.py +0 -0
  478. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_supabase_connection.py +0 -0
  479. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_supabase_pagination.py +0 -0
  480. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_sync_cmd.py +0 -0
  481. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_toml_utils.py +0 -0
  482. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_trading_imports.py +0 -0
  483. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_ui_rich.py +0 -0
  484. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_uv_compat.py +0 -0
  485. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_workflow_file_completion.py +0 -0
  486. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/test_workflow_models.py +0 -0
  487. {mcli_framework-8.0.41 → mcli_framework-8.0.43}/tests/unit/workflow/test_notebook.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcli-framework
3
- Version: 8.0.41
3
+ Version: 8.0.43
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.41"
3
+ version = "8.0.43"
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"
@@ -252,7 +252,12 @@ Thumbs.db
252
252
  if git_root:
253
253
  table.add_row("Git Repository", str(git_root))
254
254
  table.add_row("Lockfile", str(lockfile_path))
255
- table.add_row("Git Initialized", "Yes" if git and (workflows_dir / ".git").exists() else "No")
255
+ table.add_row("Git Tracked", "Yes" if in_git_repo else "No")
256
+ if git:
257
+ table.add_row(
258
+ "Workflows Git",
259
+ "Yes" if (workflows_dir / ".git").exists() else "No",
260
+ )
256
261
 
257
262
  console.print(table)
258
263
  console.print()
@@ -12,8 +12,9 @@ Example:
12
12
  import json
13
13
  import os
14
14
  import re
15
+ import shutil
15
16
  import stat
16
- import subprocess
17
+ import subprocess # nosec B404
17
18
  import sys
18
19
  import tempfile
19
20
  from pathlib import Path
@@ -269,7 +270,7 @@ def restructure_file_as_command(
269
270
  click.ClickException: If file cannot be read
270
271
  """
271
272
  try:
272
- with open(file_path, "r", encoding="utf-8", errors="ignore") as f:
273
+ with open(file_path, encoding="utf-8", errors="ignore") as f:
273
274
  content = f.read()
274
275
  except OSError as e:
275
276
  logger.error(f"Failed to read file {file_path}: {e}")
@@ -329,9 +330,12 @@ def _get_python_template(t: ScriptTemplate) -> str:
329
330
  import click
330
331
  from typing import Optional, List
331
332
  from pathlib import Path
332
- from mcli.lib.logger.logger import get_logger
333
333
 
334
- logger = get_logger()
334
+ try:
335
+ from mcli.lib.logger.logger import get_logger
336
+ logger = get_logger()
337
+ except ImportError:
338
+ logger = None
335
339
 
336
340
 
337
341
  @click.group(name="{t.name}")
@@ -346,8 +350,13 @@ def app():
346
350
  @click.argument("name", default="World")
347
351
  def hello(name: str):
348
352
  """Example subcommand."""
349
- logger.info(f"Hello, {{name}}!")
353
+ if logger:
354
+ logger.info(f"Hello, {{name}}!")
350
355
  click.echo(f"Hello, {{name}}!")
356
+
357
+
358
+ if __name__ == "__main__":
359
+ app()
351
360
  '''
352
361
  else:
353
362
  return f'''#!/usr/bin/env python3
@@ -361,9 +370,12 @@ def hello(name: str):
361
370
  import click
362
371
  from typing import Optional, List
363
372
  from pathlib import Path
364
- from mcli.lib.logger.logger import get_logger
365
373
 
366
- logger = get_logger()
374
+ try:
375
+ from mcli.lib.logger.logger import get_logger
376
+ logger = get_logger()
377
+ except ImportError:
378
+ logger = None
367
379
 
368
380
 
369
381
  @click.command(name="{t.name}")
@@ -372,8 +384,13 @@ def {t.name}_command(name: str):
372
384
  """
373
385
  {t.description}
374
386
  """
375
- logger.info(f"Hello, {{name}}! This is the {t.name} command.")
387
+ if logger:
388
+ logger.info(f"Hello, {{name}}! This is the {t.name} command.")
376
389
  click.echo(f"Hello, {{name}}! This is the {t.name} command.")
390
+
391
+
392
+ if __name__ == "__main__":
393
+ {t.name}_command()
377
394
  '''
378
395
 
379
396
 
@@ -505,7 +522,7 @@ if (args.length > 0) {{
505
522
 
506
523
  def _get_ipynb_template(t: ScriptTemplate) -> str:
507
524
  """Generate Jupyter notebook template."""
508
- notebook: Dict[str, Any] = {
525
+ notebook: dict[str, Any] = {
509
526
  "cells": [
510
527
  {
511
528
  "cell_type": "markdown",
@@ -609,13 +626,13 @@ def open_editor_for_script(
609
626
  click.echo("Write your code and save the file to continue.")
610
627
  click.echo("Press Ctrl+C to cancel.")
611
628
 
612
- result = subprocess.run([editor, temp_file_path], check=False)
629
+ result = subprocess.run([editor, temp_file_path], check=False) # nosec B603
613
630
 
614
631
  if result.returncode != 0:
615
632
  click.echo("Editor exited with error. Command creation cancelled.")
616
633
  return None
617
634
 
618
- with open(temp_file_path, "r") as f:
635
+ with open(temp_file_path) as f:
619
636
  edited_code = f.read()
620
637
 
621
638
  if not edited_code.strip():
@@ -642,8 +659,7 @@ def _find_editor() -> Optional[str]:
642
659
  return editor
643
660
 
644
661
  for common_editor in ["vim", "nano", "code", "subl", "atom", "emacs"]:
645
- result = subprocess.run(["which", common_editor], capture_output=True)
646
- if result.returncode == 0:
662
+ if shutil.which(common_editor):
647
663
  return common_editor
648
664
 
649
665
  return None
@@ -783,7 +799,7 @@ def new(
783
799
  description=description,
784
800
  cmd_version=cmd_version,
785
801
  template=template,
786
- shell=shell,
802
+ shell=shell, # nosec B604
787
803
  is_global=is_global,
788
804
  source_file=source_file,
789
805
  )
@@ -892,7 +908,7 @@ def _execute_new_command(
892
908
  cmd_version=cmd_version,
893
909
  language=language,
894
910
  command_type=command_type,
895
- shell=shell,
911
+ shell=shell, # nosec B604
896
912
  template=template,
897
913
  script_path=script_path,
898
914
  )
@@ -913,7 +929,7 @@ def _execute_new_command(
913
929
  _display_success_message(
914
930
  command_name=command_name,
915
931
  language=language,
916
- shell=shell,
932
+ shell=shell, # nosec B604
917
933
  saved_path=saved_path,
918
934
  command_group=command_group,
919
935
  is_global=is_global,
@@ -948,7 +964,7 @@ def _generate_or_edit_code(
948
964
  version=cmd_version,
949
965
  language=language,
950
966
  command_type=command_type,
951
- shell=shell,
967
+ shell=shell, # nosec B604
952
968
  )
953
969
 
954
970
  try:
@@ -1095,19 +1095,25 @@ class VenvMessages:
1095
1095
 
1096
1096
  # Info
1097
1097
  DETECTING_VENV = "Detecting Python environment..."
1098
+ USING_OVERRIDE_VENV = "Using override venv: {path}"
1098
1099
  USING_LOCAL_VENV = "Using local venv: {path}"
1099
- USING_GLOBAL_VENV = "Using global MCLI venv: {path}"
1100
+ USING_GLOBAL_VENV = "Using global venv: {path}"
1100
1101
  USING_SYSTEM_PYTHON = "Using system Python: {path}"
1102
+ USING_SYSTEM_PYTHON_ENV_SET = "Using system Python (MCLI_USE_SYSTEM_PYTHON set)"
1101
1103
  CREATING_GLOBAL_VENV = "Creating global MCLI venv at {path}..."
1102
1104
  GLOBAL_VENV_CREATED = "Created global MCLI venv at {path}"
1103
1105
 
1104
1106
  # Dependency messages
1107
+ NO_DEPS_SPECIFIED = "No dependencies specified"
1105
1108
  CHECKING_DEPS = "Checking dependencies for {script}..."
1106
1109
  DEPS_SATISFIED = "All dependencies satisfied"
1107
1110
  MISSING_DEPS = "Missing dependencies: {packages}"
1108
1111
  INSTALLING_DEPS = "Installing dependencies: {packages}"
1109
1112
  DEPS_INSTALLED = "Dependencies installed successfully"
1110
1113
 
1114
+ # Non-interactive
1115
+ NON_INTERACTIVE_AUTO_INSTALL = "Non-interactive mode detected, auto-installing dependencies"
1116
+
1111
1117
  # Prompts
1112
1118
  PROMPT_INSTALL_DEPS = "Install missing dependencies to {venv}? [{packages}]"
1113
1119
 
@@ -5,7 +5,7 @@ including environment detection, dependency checking, and script execution.
5
5
  """
6
6
 
7
7
  import os
8
- import subprocess
8
+ import subprocess # nosec B404
9
9
  import sys
10
10
  from pathlib import Path
11
11
  from typing import Dict, List, Optional, Tuple
@@ -42,7 +42,7 @@ class PyEnvManager:
42
42
  self._resolved_venv: Optional[Path] = None
43
43
  self._resolved_source: Optional[str] = None
44
44
 
45
- def resolve_environment(self) -> Tuple[Optional[Path], str]:
45
+ def resolve_environment(self) -> tuple[Optional[Path], str]:
46
46
  """Resolve which virtual environment to use.
47
47
 
48
48
  Resolution order:
@@ -65,14 +65,14 @@ class PyEnvManager:
65
65
  if venv_path.is_dir():
66
66
  self._resolved_venv = venv_path
67
67
  self._resolved_source = "override"
68
- logger.debug(f"Using override venv: {venv_path}")
68
+ logger.debug(VenvMessages.USING_OVERRIDE_VENV.format(path=venv_path))
69
69
  return venv_path, "override"
70
70
 
71
71
  # Check if user wants system Python
72
72
  if os.getenv(EnvVars.MCLI_USE_SYSTEM_PYTHON, "").lower() in ("true", "1", "yes"):
73
73
  self._resolved_venv = None
74
74
  self._resolved_source = "system"
75
- logger.debug("Using system Python (MCLI_USE_SYSTEM_PYTHON set)")
75
+ logger.debug(VenvMessages.USING_SYSTEM_PYTHON_ENV_SET)
76
76
  return None, "system"
77
77
 
78
78
  # Try to find local venv
@@ -80,14 +80,14 @@ class PyEnvManager:
80
80
  if local_venv:
81
81
  self._resolved_venv = local_venv
82
82
  self._resolved_source = "local"
83
- logger.debug(f"Using local venv: {local_venv}")
83
+ logger.debug(VenvMessages.USING_LOCAL_VENV.format(path=local_venv))
84
84
  return local_venv, "local"
85
85
 
86
86
  # Fall back to global venv
87
87
  global_venv = self.venv_manager.get_global_venv_path()
88
88
  self._resolved_venv = global_venv
89
89
  self._resolved_source = "global"
90
- logger.debug(f"Using global venv: {global_venv}")
90
+ logger.debug(VenvMessages.USING_GLOBAL_VENV.format(path=global_venv))
91
91
  return global_venv, "global"
92
92
 
93
93
  def get_python_executable(self) -> Path:
@@ -105,7 +105,7 @@ class PyEnvManager:
105
105
 
106
106
  def check_and_install_deps(
107
107
  self,
108
- requires: List[str],
108
+ requires: list[str],
109
109
  script_name: str,
110
110
  auto_install: bool = False,
111
111
  ) -> bool:
@@ -120,7 +120,7 @@ class PyEnvManager:
120
120
  True if all dependencies are satisfied or installed.
121
121
  """
122
122
  if not requires:
123
- logger.debug("No dependencies specified")
123
+ logger.debug(VenvMessages.NO_DEPS_SPECIFIED)
124
124
  return True
125
125
 
126
126
  venv_path, source = self.resolve_environment()
@@ -155,6 +155,10 @@ class PyEnvManager:
155
155
 
156
156
  if auto_install or env_auto_install:
157
157
  should_install = True
158
+ elif not sys.stdin.isatty():
159
+ # Non-interactive context (piped input, CI, subprocess) — auto-install
160
+ logger.info(VenvMessages.NON_INTERACTIVE_AUTO_INSTALL)
161
+ should_install = True
158
162
  else:
159
163
  # Prompt user
160
164
  venv_display = str(venv_path) if venv_path else "system"
@@ -177,11 +181,14 @@ class PyEnvManager:
177
181
  def execute_in_venv(
178
182
  self,
179
183
  script_path: Path,
180
- args: List[str],
181
- env: Optional[Dict[str, str]] = None,
184
+ args: list[str],
185
+ env: Optional[dict[str, str]] = None,
182
186
  ) -> subprocess.CompletedProcess:
183
187
  """Execute a Python script in the resolved virtual environment.
184
188
 
189
+ When running in a TTY, stdio is inherited so interactive/TUI apps
190
+ (e.g. Textual, curses) work correctly. Otherwise output is captured.
191
+
185
192
  Args:
186
193
  script_path: Path to the Python script.
187
194
  args: Command line arguments for the script.
@@ -203,15 +210,21 @@ class PyEnvManager:
203
210
  exec_env.update(env)
204
211
 
205
212
  python_exe = self.get_python_executable()
213
+ cmd = [str(python_exe), str(script_path)] + args
206
214
 
207
- return subprocess.run(
208
- [str(python_exe), str(script_path)] + args,
209
- env=exec_env,
210
- capture_output=True,
211
- text=True,
212
- )
215
+ if sys.stdout.isatty():
216
+ # Interactive: inherit stdio so TUI frameworks work
217
+ return subprocess.run(cmd, env=exec_env) # nosec B603
218
+ else:
219
+ # Non-interactive: capture output for piping
220
+ return subprocess.run( # nosec B603
221
+ cmd,
222
+ env=exec_env,
223
+ capture_output=True,
224
+ text=True,
225
+ )
213
226
 
214
- def get_status(self) -> Dict[str, str]:
227
+ def get_status(self) -> dict[str, str]:
215
228
  """Get the current environment status for display.
216
229
 
217
230
  Returns:
@@ -518,7 +518,7 @@ class ScriptLoader:
518
518
  ctx.exit(1)
519
519
  return
520
520
 
521
- # Execute in venv
521
+ # Execute in venv (inherits stdio when TTY, captures otherwise)
522
522
  logger.info(f"Executing Python command in venv: {name}")
523
523
  result = env_manager.execute_in_venv(
524
524
  script_path,
@@ -526,6 +526,7 @@ class ScriptLoader:
526
526
  env={"MCLI_COMMAND": name},
527
527
  )
528
528
 
529
+ # Only echo captured output (non-TTY mode)
529
530
  if result.stdout:
530
531
  click.echo(result.stdout, nl=False)
531
532
  if result.stderr:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcli-framework
3
- Version: 8.0.41
3
+ Version: 8.0.43
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>
@@ -328,6 +328,35 @@ class TestGetTemplate:
328
328
  assert "def mycommand_command" in result
329
329
  assert "@click.command" in result
330
330
 
331
+ def test_python_template_standalone_has_main_guard(self):
332
+ """Standalone template includes if __name__ == '__main__' for subprocess compat."""
333
+ template = ScriptTemplate(
334
+ name="mycommand",
335
+ description="My command",
336
+ group="utils",
337
+ version="1.0.0",
338
+ language=ScriptLanguages.PYTHON,
339
+ command_type=CommandTypes.COMMAND,
340
+ )
341
+ result = get_template(template)
342
+ assert 'if __name__ == "__main__":' in result
343
+ assert "mycommand_command()" in result
344
+
345
+ def test_python_template_standalone_safe_logger_import(self):
346
+ """Standalone template uses try/except for mcli logger import."""
347
+ template = ScriptTemplate(
348
+ name="mycommand",
349
+ description="My command",
350
+ group="utils",
351
+ version="1.0.0",
352
+ language=ScriptLanguages.PYTHON,
353
+ command_type=CommandTypes.COMMAND,
354
+ )
355
+ result = get_template(template)
356
+ assert "try:" in result
357
+ assert "except ImportError:" in result
358
+ assert "from mcli.lib.logger.logger import get_logger" in result
359
+
331
360
  def test_python_template_group(self):
332
361
  """Generate Python command group template."""
333
362
  template = ScriptTemplate(
@@ -345,6 +374,34 @@ class TestGetTemplate:
345
374
  assert "def app():" in result
346
375
  assert "@app.command" in result
347
376
 
377
+ def test_python_template_group_has_main_guard(self):
378
+ """Group template includes if __name__ == '__main__' for subprocess compat."""
379
+ template = ScriptTemplate(
380
+ name="mygroup",
381
+ description="My group",
382
+ group="utils",
383
+ version="1.0.0",
384
+ language=ScriptLanguages.PYTHON,
385
+ command_type=CommandTypes.GROUP,
386
+ )
387
+ result = get_template(template)
388
+ assert 'if __name__ == "__main__":' in result
389
+ assert "app()" in result
390
+
391
+ def test_python_template_group_safe_logger_import(self):
392
+ """Group template uses try/except for mcli logger import."""
393
+ template = ScriptTemplate(
394
+ name="mygroup",
395
+ description="My group",
396
+ group="utils",
397
+ version="1.0.0",
398
+ language=ScriptLanguages.PYTHON,
399
+ command_type=CommandTypes.GROUP,
400
+ )
401
+ result = get_template(template)
402
+ assert "try:" in result
403
+ assert "except ImportError:" in result
404
+
348
405
  def test_shell_template(self):
349
406
  """Generate shell template."""
350
407
  template = ScriptTemplate(
@@ -339,6 +339,68 @@ class TestPyEnvManager:
339
339
  assert status["source"] == "system"
340
340
 
341
341
 
342
+ class TestCheckAndInstallDeps:
343
+ """Tests for PyEnvManager.check_and_install_deps non-interactive behavior."""
344
+
345
+ def test_auto_installs_when_stdin_not_tty(self):
346
+ """Auto-install deps when stdin is not a TTY (non-interactive)."""
347
+ from mcli.lib.pyenv import PyEnvManager
348
+
349
+ with tempfile.TemporaryDirectory() as tmpdir:
350
+ workspace = Path(tmpdir)
351
+
352
+ with patch.dict(os.environ, {"MCLI_USE_SYSTEM_PYTHON": "true"}):
353
+ manager = PyEnvManager(workspace_dir=workspace)
354
+
355
+ with (
356
+ patch.object(manager, "resolve_environment", return_value=(None, "system")),
357
+ patch.object(
358
+ manager, "get_python_executable", return_value=Path(sys.executable)
359
+ ),
360
+ patch("mcli.lib.pyenv.manager.DependencyChecker") as mock_checker_cls,
361
+ patch("sys.stdin") as mock_stdin,
362
+ ):
363
+ mock_stdin.isatty.return_value = False
364
+ mock_checker = mock_checker_cls.return_value
365
+ mock_checker.parse_requires.return_value = ["fake-pkg"]
366
+ mock_checker.check_installed.return_value = ([], ["fake-pkg"])
367
+ mock_checker.install_packages.return_value = None
368
+
369
+ result = manager.check_and_install_deps(["fake-pkg"], "test_script")
370
+
371
+ assert result is True
372
+ mock_checker.install_packages.assert_called_once()
373
+
374
+ def test_prompts_when_stdin_is_tty(self):
375
+ """Prompt user when stdin IS a TTY (interactive)."""
376
+ from mcli.lib.pyenv import PyEnvManager
377
+
378
+ with tempfile.TemporaryDirectory() as tmpdir:
379
+ workspace = Path(tmpdir)
380
+
381
+ with patch.dict(os.environ, {"MCLI_USE_SYSTEM_PYTHON": "true"}):
382
+ manager = PyEnvManager(workspace_dir=workspace)
383
+
384
+ with (
385
+ patch.object(manager, "resolve_environment", return_value=(None, "system")),
386
+ patch.object(
387
+ manager, "get_python_executable", return_value=Path(sys.executable)
388
+ ),
389
+ patch("mcli.lib.pyenv.manager.DependencyChecker") as mock_checker_cls,
390
+ patch("sys.stdin") as mock_stdin,
391
+ patch("click.confirm", return_value=False) as mock_confirm,
392
+ ):
393
+ mock_stdin.isatty.return_value = True
394
+ mock_checker = mock_checker_cls.return_value
395
+ mock_checker.parse_requires.return_value = ["fake-pkg"]
396
+ mock_checker.check_installed.return_value = ([], ["fake-pkg"])
397
+
398
+ result = manager.check_and_install_deps(["fake-pkg"], "test_script")
399
+
400
+ assert result is False
401
+ mock_confirm.assert_called_once()
402
+
403
+
342
404
  class TestPyEnvIntegration:
343
405
  """Integration tests for pyenv module."""
344
406
 
File without changes