mcli-framework 8.0.16__tar.gz → 8.0.18__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 (448) hide show
  1. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/PKG-INFO +1 -1
  2. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/pyproject.toml +1 -1
  3. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/self/health_cmd.py +551 -17
  4. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/self/self_cmd.py +5 -147
  5. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/self/workflows_cmd.py +151 -78
  6. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli_framework.egg-info/PKG-INFO +1 -1
  7. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/.github/dependabot.yml +0 -0
  8. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/.github/dependency-review-config.yml +0 -0
  9. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/.github/workflows/build.yml +0 -0
  10. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/.github/workflows/ci.yml +0 -0
  11. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/.github/workflows/codeql.yml +0 -0
  12. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/.github/workflows/docs-links.yml +0 -0
  13. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/.github/workflows/publish-self-hosted.yml +0 -0
  14. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/.github/workflows/publish.yml +0 -0
  15. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/.github/workflows/release.yml +0 -0
  16. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/.github/workflows/security.yml +0 -0
  17. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/.github/workflows/test.yml +0 -0
  18. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/LICENSE +0 -0
  19. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/MANIFEST.in +0 -0
  20. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/README.md +0 -0
  21. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/llms-full.txt +0 -0
  22. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/llms.txt +0 -0
  23. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/mcli_rust/Cargo.toml +0 -0
  24. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/mcli_rust/src/command_parser.rs +0 -0
  25. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/mcli_rust/src/file_watcher.rs +0 -0
  26. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/mcli_rust/src/lib.rs +0 -0
  27. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/mcli_rust/src/process_manager.rs +0 -0
  28. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/mcli_rust/src/tfidf.rs +0 -0
  29. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/setup.cfg +0 -0
  30. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/__init__.py +0 -0
  31. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/app/__init__.py +0 -0
  32. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/app/commands_cmd.py +0 -0
  33. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/app/completion_helpers.py +0 -0
  34. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/app/context_cmd.py +0 -0
  35. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/app/create_cmd.py +0 -0
  36. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/app/delete_cmd.py +0 -0
  37. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/app/edit_cmd.py +0 -0
  38. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/app/init_cmd.py +0 -0
  39. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/app/list_cmd.py +0 -0
  40. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/app/main.py +0 -0
  41. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/app/migrate_cmd.py +0 -0
  42. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/app/model/__init__.py +0 -0
  43. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/app/model/model.py +0 -0
  44. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/app/model_cmd.py +0 -0
  45. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/app/new_cmd.py +0 -0
  46. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/app/remove_cmd.py +0 -0
  47. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/app/rm_cmd.py +0 -0
  48. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/app/search_cmd.py +0 -0
  49. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/app/sync_cmd.py +0 -0
  50. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/app/video/__init__.py +0 -0
  51. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/app/video/video.py +0 -0
  52. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/config.toml +0 -0
  53. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/__init__.py +0 -0
  54. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/api/__init__.py +0 -0
  55. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/api/api.py +0 -0
  56. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/api/daemon_client.py +0 -0
  57. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/api/daemon_client_local.py +0 -0
  58. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/api/daemon_decorator.py +0 -0
  59. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/api/mcli_decorators.py +0 -0
  60. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/auth/__init__.py +0 -0
  61. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/auth/auth.py +0 -0
  62. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/auth/aws_manager.py +0 -0
  63. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/auth/azure_manager.py +0 -0
  64. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/auth/credential_manager.py +0 -0
  65. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/auth/gcp_manager.py +0 -0
  66. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/auth/key_manager.py +0 -0
  67. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/auth/mcli_manager.py +0 -0
  68. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/auth/token_manager.py +0 -0
  69. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/auth/token_util.py +0 -0
  70. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/config/__init__.py +0 -0
  71. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/config/config.py +0 -0
  72. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/constants/__init__.py +0 -0
  73. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/constants/commands.py +0 -0
  74. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/constants/defaults.py +0 -0
  75. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/constants/env.py +0 -0
  76. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/constants/messages.py +0 -0
  77. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/constants/paths.py +0 -0
  78. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/constants/scripts.py +0 -0
  79. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/constants/storage.py +0 -0
  80. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/custom_commands.py +0 -0
  81. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/discovery/__init__.py +0 -0
  82. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/discovery/command_discovery.py +0 -0
  83. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/erd/__init__.py +0 -0
  84. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/erd/erd.py +0 -0
  85. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/erd/generate_graph.py +0 -0
  86. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/errors.py +0 -0
  87. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/feature_detection.py +0 -0
  88. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/files/__init__.py +0 -0
  89. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/files/files.py +0 -0
  90. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/folder_workflows.py +0 -0
  91. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/fs/__init__.py +0 -0
  92. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/fs/fs.py +0 -0
  93. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/ipfs_sync.py +0 -0
  94. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/lib.py +0 -0
  95. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/logger/__init__.py +0 -0
  96. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/logger/logger.py +0 -0
  97. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/optional_deps.py +0 -0
  98. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/paths.py +0 -0
  99. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/performance/__init__.py +0 -0
  100. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/performance/optimizer.py +0 -0
  101. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/performance/rust_bridge.py +0 -0
  102. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/performance/uvloop_config.py +0 -0
  103. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/pickles/__init__.py +0 -0
  104. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/pickles/pickles.py +0 -0
  105. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/pyenv/__init__.py +0 -0
  106. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/pyenv/deps.py +0 -0
  107. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/pyenv/manager.py +0 -0
  108. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/pyenv/venv.py +0 -0
  109. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/script_loader.py +0 -0
  110. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/script_sync.py +0 -0
  111. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/script_watcher.py +0 -0
  112. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/search/cached_vectorizer.py +0 -0
  113. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/secrets/__init__.py +0 -0
  114. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/secrets/commands.py +0 -0
  115. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/secrets/manager.py +0 -0
  116. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/secrets/repl.py +0 -0
  117. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/secrets/store.py +0 -0
  118. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/services/data_pipeline.py +0 -0
  119. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/services/lsh_client.py +0 -0
  120. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/services/redis_service.py +0 -0
  121. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/shell/__init__.py +0 -0
  122. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/shell/shell.py +0 -0
  123. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/templates/__init__.py +0 -0
  124. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/templates/command_templates.py +0 -0
  125. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/toml/__init__.py +0 -0
  126. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/toml/toml.py +0 -0
  127. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/types.py +0 -0
  128. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/ui/styling.py +0 -0
  129. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/ui/visual_effects.py +0 -0
  130. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/watcher/__init__.py +0 -0
  131. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/watcher/watcher.py +0 -0
  132. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/lib/workspace_registry.py +0 -0
  133. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/__init__.py +0 -0
  134. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/api/__init__.py +0 -0
  135. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/api/app.py +0 -0
  136. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/api/middleware.py +0 -0
  137. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/api/routers/__init__.py +0 -0
  138. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/api/routers/admin_router.py +0 -0
  139. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/api/routers/auth_router.py +0 -0
  140. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/api/routers/backtest_router.py +0 -0
  141. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/api/routers/data_router.py +0 -0
  142. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/api/routers/model_router.py +0 -0
  143. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/api/routers/monitoring_router.py +0 -0
  144. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/api/routers/portfolio_router.py +0 -0
  145. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/api/routers/prediction_router.py +0 -0
  146. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/api/routers/trade_router.py +0 -0
  147. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/api/routers/websocket_router.py +0 -0
  148. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/api/schemas.py +0 -0
  149. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/auth/__init__.py +0 -0
  150. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/auth/auth_manager.py +0 -0
  151. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/auth/models.py +0 -0
  152. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/auth/permissions.py +0 -0
  153. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/backtesting/__init__.py +0 -0
  154. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/backtesting/backtest_engine.py +0 -0
  155. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/backtesting/performance_metrics.py +0 -0
  156. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/backtesting/run.py +0 -0
  157. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/cache.py +0 -0
  158. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/cli/__init__.py +0 -0
  159. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/cli/main.py +0 -0
  160. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/config/__init__.py +0 -0
  161. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/config/settings.py +0 -0
  162. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/configs/__init__.py +0 -0
  163. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/configs/dvc_config.py +0 -0
  164. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/configs/mlflow_config.py +0 -0
  165. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/configs/mlops_manager.py +0 -0
  166. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/__init__.py +0 -0
  167. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/app.py +0 -0
  168. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/app_integrated.py +0 -0
  169. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/app_supabase.py +0 -0
  170. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/app_training.py +0 -0
  171. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/cli.py +0 -0
  172. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/common.py +0 -0
  173. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/components/__init__.py +0 -0
  174. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/components/charts.py +0 -0
  175. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/components/metrics.py +0 -0
  176. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/components/tables.py +0 -0
  177. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/overview.py +0 -0
  178. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/pages/__init__.py +0 -0
  179. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/pages/cicd.py +0 -0
  180. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/pages/debug_dependencies.py +0 -0
  181. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/pages/gravity_viz.py +0 -0
  182. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/pages/monte_carlo_predictions.py +0 -0
  183. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/pages/predictions_enhanced.py +0 -0
  184. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/pages/scrapers_and_logs.py +0 -0
  185. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/pages/test_portfolio.py +0 -0
  186. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/pages/trading.py +0 -0
  187. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/pages/workflows.py +0 -0
  188. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/streamlit_extras_utils.py +0 -0
  189. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/styles.py +0 -0
  190. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/utils.py +0 -0
  191. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/dashboard/warning_suppression.py +0 -0
  192. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/data_ingestion/__init__.py +0 -0
  193. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/data_ingestion/api_connectors.py +0 -0
  194. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/data_ingestion/data_pipeline.py +0 -0
  195. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/data_ingestion/stream_processor.py +0 -0
  196. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/database/__init__.py +0 -0
  197. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/database/migrations/env.py +0 -0
  198. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/database/models.py +0 -0
  199. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/database/session.py +0 -0
  200. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/experimentation/__init__.py +0 -0
  201. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/experimentation/ab_testing.py +0 -0
  202. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/features/__init__.py +0 -0
  203. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/features/ensemble_features.py +0 -0
  204. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/features/recommendation_engine.py +0 -0
  205. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/features/stock_features.py +0 -0
  206. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/features/test_feature_engineering.py +0 -0
  207. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/logging.py +0 -0
  208. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/mlops/__init__.py +0 -0
  209. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/mlops/data_versioning.py +0 -0
  210. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/mlops/experiment_tracker.py +0 -0
  211. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/mlops/model_serving.py +0 -0
  212. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/mlops/pipeline_orchestrator.py +0 -0
  213. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/models/__init__.py +0 -0
  214. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/models/base_models.py +0 -0
  215. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/models/ensemble_models.py +0 -0
  216. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/models/recommendation_models.py +0 -0
  217. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/models/test_models.py +0 -0
  218. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/monitoring/__init__.py +0 -0
  219. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/monitoring/drift_detection.py +0 -0
  220. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/monitoring/metrics.py +0 -0
  221. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/optimization/__init__.py +0 -0
  222. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/optimization/optimize.py +0 -0
  223. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/optimization/portfolio_optimizer.py +0 -0
  224. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/predictions/__init__.py +0 -0
  225. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/predictions/monte_carlo.py +0 -0
  226. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/predictions/prediction_engine.py +0 -0
  227. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/preprocessing/__init__.py +0 -0
  228. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/preprocessing/data_cleaners.py +0 -0
  229. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/preprocessing/feature_extractors.py +0 -0
  230. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/preprocessing/ml_pipeline.py +0 -0
  231. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/preprocessing/test_preprocessing.py +0 -0
  232. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/scripts/__init__.py +0 -0
  233. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/scripts/populate_sample_data.py +0 -0
  234. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/serving/__init__.py +0 -0
  235. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/serving/serve.py +0 -0
  236. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/tasks.py +0 -0
  237. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/tests/test_integration.py +0 -0
  238. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/tests/test_training_dashboard.py +0 -0
  239. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/trading/__init__.py +0 -0
  240. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/trading/alpaca_client.py +0 -0
  241. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/trading/migrations.py +0 -0
  242. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/trading/models.py +0 -0
  243. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/trading/paper_trading.py +0 -0
  244. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/trading/risk_management.py +0 -0
  245. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/trading/trading_service.py +0 -0
  246. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/training/__init__.py +0 -0
  247. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/training/train.py +0 -0
  248. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/ml/training/train_model.py +0 -0
  249. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/mygroup/__init__.py +0 -0
  250. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/mygroup/test_cmd.py +0 -0
  251. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/public/__init__.py +0 -0
  252. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/public/commands/__init__.py +0 -0
  253. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/public/oi/oi.py +0 -0
  254. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/public/public.py +0 -0
  255. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/self/__init__.py +0 -0
  256. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/self/completion_cmd.py +0 -0
  257. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/self/logs_cmd.py +0 -0
  258. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/self/migrate_cmd.py +0 -0
  259. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/self/redis_cmd.py +0 -0
  260. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/self/store_cmd.py +0 -0
  261. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/self/test_cmd.py +0 -0
  262. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/self/visual_cmd.py +0 -0
  263. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/self/zsh_cmd.py +0 -0
  264. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/storage/__init__.py +0 -0
  265. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/storage/backends/__init__.py +0 -0
  266. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/storage/backends/ipfs_backend.py +0 -0
  267. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/storage/base.py +0 -0
  268. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/storage/cache.py +0 -0
  269. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/storage/encryption.py +0 -0
  270. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/storage/factory.py +0 -0
  271. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/storage/registry.py +0 -0
  272. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/storage/storacha_cli.py +0 -0
  273. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/__init__.py +0 -0
  274. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/daemon/__init__.py +0 -0
  275. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/daemon/async_command_database.py +0 -0
  276. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/daemon/async_process_manager.py +0 -0
  277. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/daemon/client.py +0 -0
  278. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/daemon/daemon.py +0 -0
  279. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/daemon/daemon_api.py +0 -0
  280. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/daemon/enhanced_daemon.py +0 -0
  281. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/daemon/process_cli.py +0 -0
  282. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/daemon/process_manager.py +0 -0
  283. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/daemon/test_daemon.py +0 -0
  284. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/dashboard/__init__.py +0 -0
  285. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/dashboard/dashboard_cmd.py +0 -0
  286. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/doc_convert.py +0 -0
  287. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/docker/__init__.py +0 -0
  288. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/docker/docker.py +0 -0
  289. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/file/__init__.py +0 -0
  290. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/gcloud/__init__.py +0 -0
  291. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/gcloud/config.toml +0 -0
  292. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/gcloud/gcloud.py +0 -0
  293. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/git_commit/__init__.py +0 -0
  294. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/git_commit/ai_service.py +0 -0
  295. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/interview/__init__.py +0 -0
  296. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/lsh_integration.py +0 -0
  297. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/model_service/client.py +0 -0
  298. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/model_service/download_and_run_efficient_models.py +0 -0
  299. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/model_service/lightweight_embedder.py +0 -0
  300. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/model_service/lightweight_model_server.py +0 -0
  301. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/model_service/lightweight_test.py +0 -0
  302. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/model_service/model_service.py +0 -0
  303. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/model_service/ollama_efficient_runner.py +0 -0
  304. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/model_service/openai_adapter.py +0 -0
  305. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/model_service/pdf_processor.py +0 -0
  306. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/model_service/test_efficient_runner.py +0 -0
  307. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/model_service/test_example.py +0 -0
  308. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/model_service/test_integration.py +0 -0
  309. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/model_service/test_new_features.py +0 -0
  310. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/notebook/__init__.py +0 -0
  311. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/notebook/command_loader.py +0 -0
  312. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/notebook/converter.py +0 -0
  313. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/notebook/executor.py +0 -0
  314. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/notebook/notebook_cmd.py +0 -0
  315. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/notebook/schema.py +0 -0
  316. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/notebook/validator.py +0 -0
  317. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/openai/openai.py +0 -0
  318. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/registry/__init__.py +0 -0
  319. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/registry/registry.py +0 -0
  320. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/repo/__init__.py +0 -0
  321. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/repo/repo.py +0 -0
  322. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/scheduler/__init__.py +0 -0
  323. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/scheduler/cron_parser.py +0 -0
  324. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/scheduler/job.py +0 -0
  325. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/scheduler/monitor.py +0 -0
  326. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/scheduler/persistence.py +0 -0
  327. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/scheduler/scheduler.py +0 -0
  328. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/search/__init__.py +0 -0
  329. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/secrets/__init__.py +0 -0
  330. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/secrets/secrets_cmd.py +0 -0
  331. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/storage/__init__.py +0 -0
  332. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/storage/storage_cmd.py +0 -0
  333. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/sync/__init__.py +0 -0
  334. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/sync/test_cmd.py +0 -0
  335. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/videos/__init__.py +0 -0
  336. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/wakatime/__init__.py +0 -0
  337. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/wakatime/wakatime.py +0 -0
  338. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli/workflow/workflow.py +0 -0
  339. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli_framework.egg-info/SOURCES.txt +0 -0
  340. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli_framework.egg-info/dependency_links.txt +0 -0
  341. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli_framework.egg-info/entry_points.txt +0 -0
  342. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli_framework.egg-info/requires.txt +0 -0
  343. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/src/mcli_framework.egg-info/top_level.txt +0 -0
  344. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/cli/__init__.py +0 -0
  345. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/cli/test_all_commands.py +0 -0
  346. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/cli/test_app_logs_cmd.py +0 -0
  347. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/cli/test_app_redis_cmd.py +0 -0
  348. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/cli/test_logs_cmd.py +0 -0
  349. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/cli/test_main_app.py +0 -0
  350. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/cli/test_model_cmd.py +0 -0
  351. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/cli/test_self_cmd.py +0 -0
  352. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/cli/test_self_cmd_plugins.py +0 -0
  353. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/cli/test_self_cmd_utilities.py +0 -0
  354. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/cli/test_workflow_creation_commands.py +0 -0
  355. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/cli/test_workflow_file.py +0 -0
  356. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/cli/test_workflow_gcloud.py +0 -0
  357. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/cli/test_workflow_registry.py +0 -0
  358. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/conftest.py +0 -0
  359. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/e2e/__init__.py +0 -0
  360. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/e2e/test_complete_workflows.py +0 -0
  361. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/e2e/test_model_workflow.py +0 -0
  362. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/e2e/test_new_user_workflow.py +0 -0
  363. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/e2e/test_update_workflow.py +0 -0
  364. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/fixtures/__init__.py +0 -0
  365. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/fixtures/cli_fixtures.py +0 -0
  366. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/fixtures/data_fixtures.py +0 -0
  367. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/fixtures/db_fixtures.py +0 -0
  368. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/fixtures/model_fixtures.py +0 -0
  369. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/integration/__init__.py +0 -0
  370. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/integration/test_all_commands_comprehensive.py +0 -0
  371. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/integration/test_daemon_server.py +0 -0
  372. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/integration/test_direct_file_execution.py +0 -0
  373. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/integration/test_e2e_dashboard_lsh_supabase.py +0 -0
  374. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/integration/test_flask_webapp.py +0 -0
  375. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/integration/test_folder_workflows_integration.py +0 -0
  376. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/integration/test_gcloud_services.py +0 -0
  377. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/integration/test_ml_auth.py +0 -0
  378. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/integration/test_ml_data_pipeline.py +0 -0
  379. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/integration/test_ml_models.py +0 -0
  380. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/integration/test_ml_pipeline.py +0 -0
  381. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/integration/test_module_imports.py +0 -0
  382. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/integration/test_notebook_workflows.py +0 -0
  383. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/integration/test_oi_service.py +0 -0
  384. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/integration/test_repo_operations.py +0 -0
  385. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/integration/test_scheduler_integration.py +0 -0
  386. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/integration/test_service_registry.py +0 -0
  387. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/integration/test_supabase_live_connection.py +0 -0
  388. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/integration/test_video_processing.py +0 -0
  389. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/integration/test_wakatime_api.py +0 -0
  390. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/integration/test_webapp_full.py +0 -0
  391. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/integration/test_workflow.py +0 -0
  392. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/integration/test_workflow_commands.py +0 -0
  393. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/performance/__init__.py +0 -0
  394. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/property/__init__.py +0 -0
  395. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/__init__.py +0 -0
  396. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/storage/__init__.py +0 -0
  397. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/storage/test_cache.py +0 -0
  398. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/storage/test_encryption.py +0 -0
  399. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/storage/test_storacha_cli.py +0 -0
  400. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_api_utils.py +0 -0
  401. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_async_process_manager.py +0 -0
  402. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_auth_modules.py +0 -0
  403. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_bug_fixes.py +0 -0
  404. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_config.py +0 -0
  405. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_custom_commands.py +0 -0
  406. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_custom_commands_filtering.py +0 -0
  407. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_daemon_api.py +0 -0
  408. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_dashboard_components.py +0 -0
  409. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_dashboard_functions.py +0 -0
  410. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_dashboard_pages.py +0 -0
  411. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_dependencies.py +0 -0
  412. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_doc_convert_workflow.py +0 -0
  413. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_emulator_workflow.py +0 -0
  414. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_erd_generation.py +0 -0
  415. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_erd_generic.py +0 -0
  416. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_erd_imports.py +0 -0
  417. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_folder_workflows.py +0 -0
  418. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_git_commit_workflow.py +0 -0
  419. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_health_cmd.py +0 -0
  420. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_lib_auth.py +0 -0
  421. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_lib_files.py +0 -0
  422. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_lib_utils.py +0 -0
  423. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_logger.py +0 -0
  424. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_ml_preprocessing.py +0 -0
  425. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_new_cmd.py +0 -0
  426. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_notebook_command_loader.py +0 -0
  427. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_notebook_executor.py +0 -0
  428. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_optional_deps.py +0 -0
  429. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_paths.py +0 -0
  430. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_pdf_compress.py +0 -0
  431. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_prediction_engine.py +0 -0
  432. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_pyenv.py +0 -0
  433. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_regression.py +0 -0
  434. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_scheduler.py +0 -0
  435. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_scheduler_cron_parser.py +0 -0
  436. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_scheduler_job.py +0 -0
  437. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_scheduler_monitor.py +0 -0
  438. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_scheduler_persistence.py +0 -0
  439. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_self_update.py +0 -0
  440. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_store_cmd.py +0 -0
  441. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_supabase_connection.py +0 -0
  442. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_supabase_pagination.py +0 -0
  443. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_toml_utils.py +0 -0
  444. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_trading_imports.py +0 -0
  445. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_ui_rich.py +0 -0
  446. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_uv_compat.py +0 -0
  447. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/tests/unit/test_workflow_file_completion.py +0 -0
  448. {mcli_framework-8.0.16 → mcli_framework-8.0.18}/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.16
3
+ Version: 8.0.18
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.16"
3
+ version = "8.0.18"
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"
@@ -134,6 +134,502 @@ def find_repo_root() -> Path:
134
134
  return Path.cwd()
135
135
 
136
136
 
137
+ # =============================================================================
138
+ # Language Detection
139
+ # =============================================================================
140
+
141
+
142
+ def detect_languages(repo_path: Path) -> Dict[str, bool]:
143
+ """Detect which programming languages are used in the repository."""
144
+ languages = {
145
+ "python": False,
146
+ "typescript": False,
147
+ "javascript": False,
148
+ "java": False,
149
+ "elixir": False,
150
+ "dart": False,
151
+ }
152
+
153
+ # Python: pyproject.toml, setup.py, requirements.txt, or .py files
154
+ if (
155
+ (repo_path / "pyproject.toml").exists()
156
+ or (repo_path / "setup.py").exists()
157
+ or (repo_path / "requirements.txt").exists()
158
+ or list(repo_path.glob("**/*.py"))[:1]
159
+ ):
160
+ languages["python"] = True
161
+
162
+ # TypeScript: tsconfig.json or .ts files
163
+ if (repo_path / "tsconfig.json").exists() or list(repo_path.glob("**/*.ts"))[:1]:
164
+ languages["typescript"] = True
165
+
166
+ # JavaScript: package.json or .js files
167
+ if (repo_path / "package.json").exists() or list(repo_path.glob("**/*.js"))[:1]:
168
+ languages["javascript"] = True
169
+
170
+ # Java: pom.xml, build.gradle, or .java files
171
+ if (
172
+ (repo_path / "pom.xml").exists()
173
+ or (repo_path / "build.gradle").exists()
174
+ or (repo_path / "build.gradle.kts").exists()
175
+ or list(repo_path.glob("**/*.java"))[:1]
176
+ ):
177
+ languages["java"] = True
178
+
179
+ # Elixir: mix.exs or .ex/.exs files
180
+ if (repo_path / "mix.exs").exists() or list(repo_path.glob("**/*.ex"))[:1]:
181
+ languages["elixir"] = True
182
+
183
+ # Dart: pubspec.yaml or .dart files
184
+ if (repo_path / "pubspec.yaml").exists() or list(repo_path.glob("**/*.dart"))[:1]:
185
+ languages["dart"] = True
186
+
187
+ return languages
188
+
189
+
190
+ # =============================================================================
191
+ # TypeScript/JavaScript Checks
192
+ # =============================================================================
193
+
194
+
195
+ def check_npm_test(repo_path: Path) -> CheckResult:
196
+ """Run npm/yarn tests."""
197
+ start = time.time()
198
+
199
+ if not (repo_path / "package.json").exists():
200
+ return CheckResult(
201
+ name="JS/TS Tests",
202
+ status=HealthStatus.SKIPPED,
203
+ message="No package.json found",
204
+ duration_ms=(time.time() - start) * 1000,
205
+ )
206
+
207
+ # Determine package manager
208
+ if (repo_path / "yarn.lock").exists():
209
+ pkg_manager = "yarn"
210
+ test_cmd = ["yarn", "test", "--passWithNoTests"]
211
+ elif (repo_path / "pnpm-lock.yaml").exists():
212
+ pkg_manager = "pnpm"
213
+ test_cmd = ["pnpm", "test", "--passWithNoTests"]
214
+ else:
215
+ pkg_manager = "npm"
216
+ test_cmd = ["npm", "test", "--", "--passWithNoTests"]
217
+
218
+ # Check if test script exists
219
+ try:
220
+ import json as json_mod
221
+
222
+ pkg_json = json_mod.loads((repo_path / "package.json").read_text())
223
+ if "test" not in pkg_json.get("scripts", {}):
224
+ return CheckResult(
225
+ name="JS/TS Tests",
226
+ status=HealthStatus.SKIPPED,
227
+ message="No test script in package.json",
228
+ duration_ms=(time.time() - start) * 1000,
229
+ )
230
+ except Exception:
231
+ pass
232
+
233
+ code, stdout, stderr = run_command(test_cmd, cwd=repo_path, timeout=300)
234
+
235
+ if code == 0:
236
+ return CheckResult(
237
+ name="JS/TS Tests",
238
+ status=HealthStatus.PASSING,
239
+ message=f"Tests passed ({pkg_manager})",
240
+ duration_ms=(time.time() - start) * 1000,
241
+ )
242
+
243
+ return CheckResult(
244
+ name="JS/TS Tests",
245
+ status=HealthStatus.FAILING,
246
+ message=f"Tests failed ({pkg_manager})",
247
+ details=(stderr or stdout)[:300],
248
+ suggestions=["Fix failing tests", f"Run: {pkg_manager} test"],
249
+ duration_ms=(time.time() - start) * 1000,
250
+ )
251
+
252
+
253
+ def check_eslint(repo_path: Path) -> CheckResult:
254
+ """Check JavaScript/TypeScript linting with ESLint."""
255
+ start = time.time()
256
+
257
+ eslint_configs = [".eslintrc", ".eslintrc.js", ".eslintrc.json", ".eslintrc.yml", "eslint.config.js"]
258
+ has_eslint = any((repo_path / cfg).exists() for cfg in eslint_configs)
259
+
260
+ if not has_eslint:
261
+ try:
262
+ import json as json_mod
263
+
264
+ pkg_json = json_mod.loads((repo_path / "package.json").read_text())
265
+ has_eslint = "eslintConfig" in pkg_json
266
+ except Exception:
267
+ pass
268
+
269
+ if not has_eslint:
270
+ return CheckResult(
271
+ name="ESLint",
272
+ status=HealthStatus.SKIPPED,
273
+ message="No ESLint config found",
274
+ duration_ms=(time.time() - start) * 1000,
275
+ )
276
+
277
+ code, stdout, stderr = run_command(["npx", "eslint", ".", "--max-warnings=0"], cwd=repo_path)
278
+
279
+ if code == 0:
280
+ return CheckResult(
281
+ name="ESLint",
282
+ status=HealthStatus.PASSING,
283
+ message="No linting errors",
284
+ duration_ms=(time.time() - start) * 1000,
285
+ )
286
+
287
+ output = stdout + stderr
288
+ error_count = len(re.findall(r"^\s*\d+:\d+\s+error", output, re.MULTILINE))
289
+ warn_count = len(re.findall(r"^\s*\d+:\d+\s+warning", output, re.MULTILINE))
290
+
291
+ return CheckResult(
292
+ name="ESLint",
293
+ status=HealthStatus.FAILING if error_count > 0 else HealthStatus.WARNING,
294
+ message=f"{error_count} errors, {warn_count} warnings",
295
+ suggestions=["Run: npx eslint . --fix"],
296
+ duration_ms=(time.time() - start) * 1000,
297
+ )
298
+
299
+
300
+ def check_typescript(repo_path: Path) -> CheckResult:
301
+ """Check TypeScript compilation."""
302
+ start = time.time()
303
+
304
+ if not (repo_path / "tsconfig.json").exists():
305
+ return CheckResult(
306
+ name="TypeScript",
307
+ status=HealthStatus.SKIPPED,
308
+ message="No tsconfig.json found",
309
+ duration_ms=(time.time() - start) * 1000,
310
+ )
311
+
312
+ code, stdout, stderr = run_command(["npx", "tsc", "--noEmit"], cwd=repo_path)
313
+
314
+ if code == 0:
315
+ return CheckResult(
316
+ name="TypeScript",
317
+ status=HealthStatus.PASSING,
318
+ message="No type errors",
319
+ duration_ms=(time.time() - start) * 1000,
320
+ )
321
+
322
+ output = stdout + stderr
323
+ error_count = len(re.findall(r"error TS\d+:", output))
324
+
325
+ return CheckResult(
326
+ name="TypeScript",
327
+ status=HealthStatus.FAILING,
328
+ message=f"{error_count} type error(s)",
329
+ suggestions=["Fix TypeScript errors", "Run: npx tsc --noEmit"],
330
+ duration_ms=(time.time() - start) * 1000,
331
+ )
332
+
333
+
334
+ # =============================================================================
335
+ # Java Checks
336
+ # =============================================================================
337
+
338
+
339
+ def check_java_build(repo_path: Path) -> CheckResult:
340
+ """Check Java build and tests."""
341
+ start = time.time()
342
+
343
+ if (repo_path / "pom.xml").exists():
344
+ build_tool = "maven"
345
+ test_cmd = ["mvn", "test", "-q"]
346
+ build_cmd = ["mvn", "compile", "-q"]
347
+ elif (repo_path / "build.gradle").exists() or (repo_path / "build.gradle.kts").exists():
348
+ build_tool = "gradle"
349
+ gradlew = "./gradlew" if (repo_path / "gradlew").exists() else "gradle"
350
+ test_cmd = [gradlew, "test", "-q"]
351
+ build_cmd = [gradlew, "build", "-q"]
352
+ else:
353
+ return CheckResult(
354
+ name="Java Build",
355
+ status=HealthStatus.SKIPPED,
356
+ message="No pom.xml or build.gradle found",
357
+ duration_ms=(time.time() - start) * 1000,
358
+ )
359
+
360
+ code, stdout, stderr = run_command(build_cmd, cwd=repo_path, timeout=300)
361
+ if code != 0:
362
+ return CheckResult(
363
+ name="Java Build",
364
+ status=HealthStatus.FAILING,
365
+ message=f"Build failed ({build_tool})",
366
+ details=(stderr or stdout)[:300],
367
+ suggestions=["Fix build errors"],
368
+ duration_ms=(time.time() - start) * 1000,
369
+ )
370
+
371
+ code, stdout, stderr = run_command(test_cmd, cwd=repo_path, timeout=300)
372
+ if code == 0:
373
+ return CheckResult(
374
+ name="Java Build",
375
+ status=HealthStatus.PASSING,
376
+ message=f"Build and tests passed ({build_tool})",
377
+ duration_ms=(time.time() - start) * 1000,
378
+ )
379
+
380
+ return CheckResult(
381
+ name="Java Build",
382
+ status=HealthStatus.FAILING,
383
+ message=f"Tests failed ({build_tool})",
384
+ suggestions=["Fix failing tests"],
385
+ duration_ms=(time.time() - start) * 1000,
386
+ )
387
+
388
+
389
+ # =============================================================================
390
+ # Elixir Checks
391
+ # =============================================================================
392
+
393
+
394
+ def check_mix_test(repo_path: Path) -> CheckResult:
395
+ """Run Elixir tests with mix."""
396
+ start = time.time()
397
+
398
+ if not (repo_path / "mix.exs").exists():
399
+ return CheckResult(
400
+ name="Elixir Tests",
401
+ status=HealthStatus.SKIPPED,
402
+ message="No mix.exs found",
403
+ duration_ms=(time.time() - start) * 1000,
404
+ )
405
+
406
+ code, stdout, stderr = run_command(["mix", "test"], cwd=repo_path, timeout=300)
407
+
408
+ if code == 0:
409
+ output = stdout + stderr
410
+ match = re.search(r"(\d+) tests?, (\d+) failures?", output)
411
+ if match:
412
+ tests, failures = int(match.group(1)), int(match.group(2))
413
+ return CheckResult(
414
+ name="Elixir Tests",
415
+ status=HealthStatus.PASSING,
416
+ message=f"{tests} tests passed",
417
+ metrics={"tests": tests, "failures": failures},
418
+ duration_ms=(time.time() - start) * 1000,
419
+ )
420
+ return CheckResult(
421
+ name="Elixir Tests",
422
+ status=HealthStatus.PASSING,
423
+ message="Tests passed",
424
+ duration_ms=(time.time() - start) * 1000,
425
+ )
426
+
427
+ return CheckResult(
428
+ name="Elixir Tests",
429
+ status=HealthStatus.FAILING,
430
+ message="Tests failed",
431
+ details=(stderr or stdout)[:300],
432
+ suggestions=["Fix failing tests", "Run: mix test"],
433
+ duration_ms=(time.time() - start) * 1000,
434
+ )
435
+
436
+
437
+ def check_mix_format(repo_path: Path) -> CheckResult:
438
+ """Check Elixir formatting with mix format."""
439
+ start = time.time()
440
+
441
+ if not (repo_path / "mix.exs").exists():
442
+ return CheckResult(
443
+ name="Elixir Format",
444
+ status=HealthStatus.SKIPPED,
445
+ message="No mix.exs found",
446
+ duration_ms=(time.time() - start) * 1000,
447
+ )
448
+
449
+ code, _, _ = run_command(["mix", "format", "--check-formatted"], cwd=repo_path)
450
+
451
+ if code == 0:
452
+ return CheckResult(
453
+ name="Elixir Format",
454
+ status=HealthStatus.PASSING,
455
+ message="All files formatted",
456
+ duration_ms=(time.time() - start) * 1000,
457
+ )
458
+
459
+ return CheckResult(
460
+ name="Elixir Format",
461
+ status=HealthStatus.FAILING,
462
+ message="Files need formatting",
463
+ suggestions=["Run: mix format"],
464
+ duration_ms=(time.time() - start) * 1000,
465
+ )
466
+
467
+
468
+ def check_credo(repo_path: Path) -> CheckResult:
469
+ """Check Elixir code quality with Credo."""
470
+ start = time.time()
471
+
472
+ if not (repo_path / "mix.exs").exists():
473
+ return CheckResult(
474
+ name="Credo",
475
+ status=HealthStatus.SKIPPED,
476
+ message="No mix.exs found",
477
+ duration_ms=(time.time() - start) * 1000,
478
+ )
479
+
480
+ try:
481
+ mix_content = (repo_path / "mix.exs").read_text()
482
+ if ":credo" not in mix_content:
483
+ return CheckResult(
484
+ name="Credo",
485
+ status=HealthStatus.SKIPPED,
486
+ message="Credo not in dependencies",
487
+ duration_ms=(time.time() - start) * 1000,
488
+ )
489
+ except Exception:
490
+ pass
491
+
492
+ code, stdout, stderr = run_command(["mix", "credo", "--strict"], cwd=repo_path)
493
+
494
+ if code == 0:
495
+ return CheckResult(
496
+ name="Credo",
497
+ status=HealthStatus.PASSING,
498
+ message="No issues found",
499
+ duration_ms=(time.time() - start) * 1000,
500
+ )
501
+
502
+ output = stdout + stderr
503
+ issues = len(re.findall(r"┃", output))
504
+
505
+ return CheckResult(
506
+ name="Credo",
507
+ status=HealthStatus.WARNING,
508
+ message=f"{issues} issue(s) found",
509
+ suggestions=["Run: mix credo --strict"],
510
+ duration_ms=(time.time() - start) * 1000,
511
+ )
512
+
513
+
514
+ # =============================================================================
515
+ # Dart Checks
516
+ # =============================================================================
517
+
518
+
519
+ def check_dart_test(repo_path: Path) -> CheckResult:
520
+ """Run Dart tests."""
521
+ start = time.time()
522
+
523
+ if not (repo_path / "pubspec.yaml").exists():
524
+ return CheckResult(
525
+ name="Dart Tests",
526
+ status=HealthStatus.SKIPPED,
527
+ message="No pubspec.yaml found",
528
+ duration_ms=(time.time() - start) * 1000,
529
+ )
530
+
531
+ if not (repo_path / "test").exists():
532
+ return CheckResult(
533
+ name="Dart Tests",
534
+ status=HealthStatus.SKIPPED,
535
+ message="No test directory found",
536
+ duration_ms=(time.time() - start) * 1000,
537
+ )
538
+
539
+ is_flutter = "flutter" in (repo_path / "pubspec.yaml").read_text().lower()
540
+ test_cmd = ["flutter", "test"] if is_flutter else ["dart", "test"]
541
+
542
+ code, stdout, stderr = run_command(test_cmd, cwd=repo_path, timeout=300)
543
+
544
+ if code == 0:
545
+ return CheckResult(
546
+ name="Dart Tests",
547
+ status=HealthStatus.PASSING,
548
+ message="Tests passed",
549
+ duration_ms=(time.time() - start) * 1000,
550
+ )
551
+
552
+ return CheckResult(
553
+ name="Dart Tests",
554
+ status=HealthStatus.FAILING,
555
+ message="Tests failed",
556
+ details=(stderr or stdout)[:300],
557
+ suggestions=["Fix failing tests"],
558
+ duration_ms=(time.time() - start) * 1000,
559
+ )
560
+
561
+
562
+ def check_dart_analyze(repo_path: Path) -> CheckResult:
563
+ """Run Dart static analysis."""
564
+ start = time.time()
565
+
566
+ if not (repo_path / "pubspec.yaml").exists():
567
+ return CheckResult(
568
+ name="Dart Analyze",
569
+ status=HealthStatus.SKIPPED,
570
+ message="No pubspec.yaml found",
571
+ duration_ms=(time.time() - start) * 1000,
572
+ )
573
+
574
+ code, stdout, stderr = run_command(["dart", "analyze", "--fatal-infos"], cwd=repo_path)
575
+
576
+ if code == 0:
577
+ return CheckResult(
578
+ name="Dart Analyze",
579
+ status=HealthStatus.PASSING,
580
+ message="No issues found",
581
+ duration_ms=(time.time() - start) * 1000,
582
+ )
583
+
584
+ output = stdout + stderr
585
+ errors = len(re.findall(r"error •", output, re.IGNORECASE))
586
+ warnings = len(re.findall(r"warning •", output, re.IGNORECASE))
587
+
588
+ return CheckResult(
589
+ name="Dart Analyze",
590
+ status=HealthStatus.FAILING if errors > 0 else HealthStatus.WARNING,
591
+ message=f"{errors} errors, {warnings} warnings",
592
+ suggestions=["Run: dart analyze"],
593
+ duration_ms=(time.time() - start) * 1000,
594
+ )
595
+
596
+
597
+ def check_dart_format(repo_path: Path) -> CheckResult:
598
+ """Check Dart formatting."""
599
+ start = time.time()
600
+
601
+ if not (repo_path / "pubspec.yaml").exists():
602
+ return CheckResult(
603
+ name="Dart Format",
604
+ status=HealthStatus.SKIPPED,
605
+ message="No pubspec.yaml found",
606
+ duration_ms=(time.time() - start) * 1000,
607
+ )
608
+
609
+ code, _, _ = run_command(["dart", "format", "--set-exit-if-changed", "--output=none", "."], cwd=repo_path)
610
+
611
+ if code == 0:
612
+ return CheckResult(
613
+ name="Dart Format",
614
+ status=HealthStatus.PASSING,
615
+ message="All files formatted",
616
+ duration_ms=(time.time() - start) * 1000,
617
+ )
618
+
619
+ return CheckResult(
620
+ name="Dart Format",
621
+ status=HealthStatus.FAILING,
622
+ message="Files need formatting",
623
+ suggestions=["Run: dart format ."],
624
+ duration_ms=(time.time() - start) * 1000,
625
+ )
626
+
627
+
628
+ # =============================================================================
629
+ # Python Checks
630
+ # =============================================================================
631
+
632
+
137
633
  def check_git_status(repo_path: Path) -> CheckResult:
138
634
  """Check git repository status."""
139
635
  start = time.time()
@@ -966,33 +1462,71 @@ def generate_report(
966
1462
  checks: list[CheckResult] = []
967
1463
  start_time = time.time()
968
1464
 
969
- # Define checks to run
1465
+ # Detect languages in the repository
1466
+ languages = detect_languages(repo_path)
1467
+ detected = [lang for lang, present in languages.items() if present]
1468
+ console.print(f"[dim]Detected languages: {', '.join(detected) or 'none'}[/dim]\n")
1469
+
1470
+ # Universal checks
970
1471
  check_functions = [
971
1472
  ("Git Status", lambda: check_git_status(repo_path)),
972
1473
  ("Code Metrics", lambda: check_code_metrics(repo_path)),
973
- ("Black", lambda: check_black(repo_path)),
974
- ("isort", lambda: check_isort(repo_path)),
975
- ("Flake8", lambda: check_flake8(repo_path)),
976
1474
  ]
977
1475
 
978
- if not quick:
979
- check_functions.extend(
980
- [
1476
+ # Python-specific checks
1477
+ if languages["python"]:
1478
+ check_functions.extend([
1479
+ ("Black", lambda: check_black(repo_path)),
1480
+ ("isort", lambda: check_isort(repo_path)),
1481
+ ("Flake8", lambda: check_flake8(repo_path)),
1482
+ ])
1483
+ if not skip_tests:
1484
+ check_functions.append(("Python Tests", lambda: check_tests(repo_path, fast=quick)))
1485
+ if not quick:
1486
+ check_functions.append(("Coverage", lambda: check_coverage(repo_path)))
1487
+ if not quick:
1488
+ check_functions.extend([
981
1489
  ("Mypy", lambda: check_mypy(repo_path)),
982
1490
  ("Security", lambda: check_security(repo_path)),
983
1491
  ("Dependencies", lambda: check_dependencies(repo_path)),
984
- ("Documentation", lambda: check_documentation(repo_path)),
985
- ("CI Status", lambda: check_ci_status(repo_path)),
986
- ]
987
- )
988
-
989
- if not skip_tests:
990
- check_functions.insert(2, ("Tests", lambda: check_tests(repo_path, fast=quick)))
1492
+ ])
1493
+ if not skip_build and not quick:
1494
+ check_functions.append(("Python Build", lambda: check_build(repo_path)))
1495
+
1496
+ # TypeScript/JavaScript checks
1497
+ if languages["typescript"] or languages["javascript"]:
1498
+ if not skip_tests:
1499
+ check_functions.append(("JS/TS Tests", lambda: check_npm_test(repo_path)))
1500
+ check_functions.append(("ESLint", lambda: check_eslint(repo_path)))
1501
+ if languages["typescript"]:
1502
+ check_functions.append(("TypeScript", lambda: check_typescript(repo_path)))
1503
+
1504
+ # Java checks
1505
+ if languages["java"]:
1506
+ if not skip_tests:
1507
+ check_functions.append(("Java Build", lambda: check_java_build(repo_path)))
1508
+
1509
+ # Elixir checks
1510
+ if languages["elixir"]:
1511
+ if not skip_tests:
1512
+ check_functions.append(("Elixir Tests", lambda: check_mix_test(repo_path)))
1513
+ check_functions.append(("Elixir Format", lambda: check_mix_format(repo_path)))
991
1514
  if not quick:
992
- check_functions.insert(3, ("Coverage", lambda: check_coverage(repo_path)))
1515
+ check_functions.append(("Credo", lambda: check_credo(repo_path)))
993
1516
 
994
- if not skip_build and not quick:
995
- check_functions.append(("Build", lambda: check_build(repo_path)))
1517
+ # Dart checks
1518
+ if languages["dart"]:
1519
+ if not skip_tests:
1520
+ check_functions.append(("Dart Tests", lambda: check_dart_test(repo_path)))
1521
+ check_functions.append(("Dart Analyze", lambda: check_dart_analyze(repo_path)))
1522
+ check_functions.append(("Dart Format", lambda: check_dart_format(repo_path)))
1523
+
1524
+ # Universal non-quick checks
1525
+ if not quick:
1526
+ check_functions.extend([
1527
+ ("Documentation", lambda: check_documentation(repo_path)),
1528
+ ("CI Status", lambda: check_ci_status(repo_path)),
1529
+ ])
996
1530
 
997
1531
  # Run checks with progress
998
1532
  with Progress(