mcli-framework 7.5.1__tar.gz → 7.6.0__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.

Potentially problematic release.


This version of mcli-framework might be problematic. Click here for more details.

Files changed (331) hide show
  1. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/PKG-INFO +1 -1
  2. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/pyproject.toml +1 -1
  3. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/app/completion_helpers.py +4 -13
  4. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/app/main.py +13 -25
  5. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/app/model_cmd.py +119 -9
  6. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/custom_commands.py +12 -1
  7. {mcli_framework-7.5.1/src/mcli/app → mcli_framework-7.6.0/src/mcli/self}/completion_cmd.py +6 -6
  8. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/self/self_cmd.py +29 -0
  9. mcli_framework-7.6.0/src/mcli/test/test_cmd.py +30 -0
  10. mcli_framework-7.6.0/src/mcli/workflow/model_service/openai_adapter.py +343 -0
  11. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli_framework.egg-info/PKG-INFO +1 -1
  12. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli_framework.egg-info/SOURCES.txt +9 -5
  13. mcli_framework-7.6.0/tests/test_openai_adapter.py +242 -0
  14. mcli_framework-7.6.0/tests/unit/test_emulator_workflow.py +638 -0
  15. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/.github/dependabot.yml +0 -0
  16. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/.github/workflows/build.yml +0 -0
  17. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/.github/workflows/ci.yml +0 -0
  18. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/.github/workflows/ml-pipeline.yml +0 -0
  19. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/.github/workflows/publish-self-hosted.yml +0 -0
  20. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/.github/workflows/publish.yml +0 -0
  21. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/.github/workflows/release.yml +0 -0
  22. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/.github/workflows/security.yml +0 -0
  23. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/.github/workflows/test.yml +0 -0
  24. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/LICENSE +0 -0
  25. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/MANIFEST.in +0 -0
  26. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/PERFORMANCE_OPTIMIZATIONS.md +0 -0
  27. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/README.md +0 -0
  28. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/mcli_rust/Cargo.toml +0 -0
  29. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/mcli_rust/src/command_parser.rs +0 -0
  30. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/mcli_rust/src/file_watcher.rs +0 -0
  31. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/mcli_rust/src/lib.rs +0 -0
  32. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/mcli_rust/src/process_manager.rs +0 -0
  33. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/mcli_rust/src/tfidf.rs +0 -0
  34. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/setup.cfg +0 -0
  35. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/app/chat_cmd.py +0 -0
  36. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/app/commands_cmd.py +0 -0
  37. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/app/model/model.py +0 -0
  38. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/app/video/video.py +0 -0
  39. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/chat/chat.py +0 -0
  40. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/chat/command_rag.py +0 -0
  41. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/chat/enhanced_chat.py +0 -0
  42. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/chat/system_controller.py +0 -0
  43. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/chat/system_integration.py +0 -0
  44. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/cli.py +0 -0
  45. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/config.toml +0 -0
  46. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/api/api.py +0 -0
  47. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/api/daemon_client.py +0 -0
  48. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/api/daemon_client_local.py +0 -0
  49. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/api/daemon_decorator.py +0 -0
  50. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/api/mcli_decorators.py +0 -0
  51. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/auth/auth.py +0 -0
  52. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/auth/aws_manager.py +0 -0
  53. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/auth/azure_manager.py +0 -0
  54. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/auth/credential_manager.py +0 -0
  55. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/auth/gcp_manager.py +0 -0
  56. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/auth/key_manager.py +0 -0
  57. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/auth/mcli_manager.py +0 -0
  58. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/auth/token_manager.py +0 -0
  59. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/auth/token_util.py +0 -0
  60. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/config/config.py +0 -0
  61. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/discovery/__init__.py +0 -0
  62. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/discovery/command_discovery.py +0 -0
  63. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/erd/erd.py +0 -0
  64. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/erd/generate_graph.py +0 -0
  65. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/files/files.py +0 -0
  66. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/fs/fs.py +0 -0
  67. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/lib.py +0 -0
  68. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/logger/logger.py +0 -0
  69. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/paths.py +0 -0
  70. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/performance/optimizer.py +0 -0
  71. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/performance/rust_bridge.py +0 -0
  72. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/performance/uvloop_config.py +0 -0
  73. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/pickles/pickles.py +0 -0
  74. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/search/cached_vectorizer.py +0 -0
  75. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/services/data_pipeline.py +0 -0
  76. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/services/lsh_client.py +0 -0
  77. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/services/redis_service.py +0 -0
  78. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/shell/shell.py +0 -0
  79. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/toml/toml.py +0 -0
  80. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/ui/styling.py +0 -0
  81. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/ui/visual_effects.py +0 -0
  82. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/lib/watcher/watcher.py +0 -0
  83. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/api/app.py +0 -0
  84. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/api/middleware.py +0 -0
  85. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/api/routers/admin_router.py +0 -0
  86. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/api/routers/auth_router.py +0 -0
  87. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/api/routers/backtest_router.py +0 -0
  88. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/api/routers/data_router.py +0 -0
  89. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/api/routers/model_router.py +0 -0
  90. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/api/routers/monitoring_router.py +0 -0
  91. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/api/routers/portfolio_router.py +0 -0
  92. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/api/routers/prediction_router.py +0 -0
  93. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/api/routers/trade_router.py +0 -0
  94. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/api/routers/websocket_router.py +0 -0
  95. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/api/schemas.py +0 -0
  96. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/auth/auth_manager.py +0 -0
  97. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/auth/models.py +0 -0
  98. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/auth/permissions.py +0 -0
  99. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/backtesting/backtest_engine.py +0 -0
  100. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/backtesting/performance_metrics.py +0 -0
  101. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/cache.py +0 -0
  102. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/cli/main.py +0 -0
  103. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/config/settings.py +0 -0
  104. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/configs/dvc_config.py +0 -0
  105. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/configs/mlflow_config.py +0 -0
  106. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/configs/mlops_manager.py +0 -0
  107. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/dashboard/app.py +0 -0
  108. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/dashboard/app_integrated.py +0 -0
  109. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/dashboard/app_supabase.py +0 -0
  110. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/dashboard/app_training.py +0 -0
  111. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/dashboard/cli.py +0 -0
  112. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/dashboard/common.py +0 -0
  113. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/dashboard/components/charts.py +0 -0
  114. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/dashboard/components/metrics.py +0 -0
  115. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/dashboard/components/tables.py +0 -0
  116. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/dashboard/overview.py +0 -0
  117. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/dashboard/pages/cicd.py +0 -0
  118. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/dashboard/pages/debug_dependencies.py +0 -0
  119. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/dashboard/pages/gravity_viz.py +0 -0
  120. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/dashboard/pages/monte_carlo_predictions.py +0 -0
  121. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/dashboard/pages/predictions_enhanced.py +0 -0
  122. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/dashboard/pages/scrapers_and_logs.py +0 -0
  123. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/dashboard/pages/test_portfolio.py +0 -0
  124. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/dashboard/pages/trading.py +0 -0
  125. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/dashboard/pages/workflows.py +0 -0
  126. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/dashboard/streamlit_extras_utils.py +0 -0
  127. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/dashboard/styles.py +0 -0
  128. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/dashboard/utils.py +0 -0
  129. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/dashboard/warning_suppression.py +0 -0
  130. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/data_ingestion/api_connectors.py +0 -0
  131. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/data_ingestion/data_pipeline.py +0 -0
  132. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/data_ingestion/stream_processor.py +0 -0
  133. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/database/migrations/env.py +0 -0
  134. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/database/models.py +0 -0
  135. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/database/session.py +0 -0
  136. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/experimentation/ab_testing.py +0 -0
  137. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/features/ensemble_features.py +0 -0
  138. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/features/political_features.py +0 -0
  139. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/features/recommendation_engine.py +0 -0
  140. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/features/stock_features.py +0 -0
  141. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/features/test_feature_engineering.py +0 -0
  142. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/logging.py +0 -0
  143. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/mlops/data_versioning.py +0 -0
  144. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/mlops/experiment_tracker.py +0 -0
  145. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/mlops/model_serving.py +0 -0
  146. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/mlops/pipeline_orchestrator.py +0 -0
  147. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/models/base_models.py +0 -0
  148. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/models/ensemble_models.py +0 -0
  149. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/models/recommendation_models.py +0 -0
  150. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/models/test_models.py +0 -0
  151. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/monitoring/drift_detection.py +0 -0
  152. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/monitoring/metrics.py +0 -0
  153. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/optimization/portfolio_optimizer.py +0 -0
  154. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/predictions/monte_carlo.py +0 -0
  155. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/predictions/prediction_engine.py +0 -0
  156. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/preprocessing/data_cleaners.py +0 -0
  157. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/preprocessing/feature_extractors.py +0 -0
  158. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/preprocessing/ml_pipeline.py +0 -0
  159. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/preprocessing/politician_trading_preprocessor.py +0 -0
  160. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/preprocessing/test_preprocessing.py +0 -0
  161. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/scripts/populate_sample_data.py +0 -0
  162. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/tasks.py +0 -0
  163. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/tests/test_integration.py +0 -0
  164. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/tests/test_training_dashboard.py +0 -0
  165. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/trading/alpaca_client.py +0 -0
  166. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/trading/migrations.py +0 -0
  167. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/trading/models.py +0 -0
  168. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/trading/paper_trading.py +0 -0
  169. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/trading/risk_management.py +0 -0
  170. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/trading/trading_service.py +0 -0
  171. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/ml/training/train_model.py +0 -0
  172. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/mygroup/test_cmd.py +0 -0
  173. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/public/oi/oi.py +0 -0
  174. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/public/public.py +0 -0
  175. {mcli_framework-7.5.1/src/mcli/app → mcli_framework-7.6.0/src/mcli/self}/logs_cmd.py +0 -0
  176. {mcli_framework-7.5.1/src/mcli/app → mcli_framework-7.6.0/src/mcli/self}/redis_cmd.py +0 -0
  177. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/self/test_cmd.py +0 -0
  178. {mcli_framework-7.5.1/src/mcli/app → mcli_framework-7.6.0/src/mcli/self}/visual_cmd.py +0 -0
  179. {mcli_framework-7.5.1/src/mcli/app → mcli_framework-7.6.0/src/mcli/test}/cron_test_cmd.py +0 -0
  180. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/daemon/async_command_database.py +0 -0
  181. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/daemon/async_process_manager.py +0 -0
  182. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/daemon/client.py +0 -0
  183. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/daemon/daemon.py +0 -0
  184. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/daemon/daemon_api.py +0 -0
  185. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/daemon/enhanced_daemon.py +0 -0
  186. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/daemon/process_cli.py +0 -0
  187. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/daemon/process_manager.py +0 -0
  188. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/daemon/test_daemon.py +0 -0
  189. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/docker/docker.py +0 -0
  190. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/gcloud/config.toml +0 -0
  191. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/gcloud/gcloud.py +0 -0
  192. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/git_commit/ai_service.py +0 -0
  193. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/lsh_integration.py +0 -0
  194. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/model_service/client.py +0 -0
  195. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/model_service/download_and_run_efficient_models.py +0 -0
  196. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/model_service/lightweight_embedder.py +0 -0
  197. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/model_service/lightweight_model_server.py +0 -0
  198. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/model_service/lightweight_test.py +0 -0
  199. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/model_service/model_service.py +0 -0
  200. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/model_service/ollama_efficient_runner.py +0 -0
  201. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/model_service/pdf_processor.py +0 -0
  202. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/model_service/test_efficient_runner.py +0 -0
  203. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/model_service/test_example.py +0 -0
  204. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/model_service/test_integration.py +0 -0
  205. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/model_service/test_new_features.py +0 -0
  206. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/openai/openai.py +0 -0
  207. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/politician_trading/config.py +0 -0
  208. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/politician_trading/connectivity.py +0 -0
  209. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/politician_trading/data_sources.py +0 -0
  210. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/politician_trading/database.py +0 -0
  211. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/politician_trading/demo.py +0 -0
  212. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/politician_trading/models.py +0 -0
  213. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/politician_trading/monitoring.py +0 -0
  214. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/politician_trading/scrapers.py +0 -0
  215. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/politician_trading/scrapers_california.py +0 -0
  216. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/politician_trading/scrapers_corporate_registry.py +0 -0
  217. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/politician_trading/scrapers_eu.py +0 -0
  218. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/politician_trading/scrapers_free_sources.py +0 -0
  219. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/politician_trading/scrapers_third_party.py +0 -0
  220. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/politician_trading/scrapers_uk.py +0 -0
  221. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/politician_trading/scrapers_us_states.py +0 -0
  222. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/politician_trading/seed_database.py +0 -0
  223. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/politician_trading/supabase_functions.py +0 -0
  224. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/politician_trading/workflow.py +0 -0
  225. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/registry/registry.py +0 -0
  226. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/repo/repo.py +0 -0
  227. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/scheduler/cron_parser.py +0 -0
  228. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/scheduler/job.py +0 -0
  229. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/scheduler/monitor.py +0 -0
  230. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/scheduler/persistence.py +0 -0
  231. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/scheduler/scheduler.py +0 -0
  232. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/sync/test_cmd.py +0 -0
  233. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/wakatime/wakatime.py +0 -0
  234. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli/workflow/workflow.py +0 -0
  235. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli_framework.egg-info/dependency_links.txt +0 -0
  236. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli_framework.egg-info/entry_points.txt +0 -0
  237. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli_framework.egg-info/requires.txt +0 -0
  238. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/src/mcli_framework.egg-info/top_level.txt +0 -0
  239. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/cli/test_all_commands.py +0 -0
  240. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/cli/test_app_logs_cmd.py +0 -0
  241. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/cli/test_app_redis_cmd.py +0 -0
  242. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/cli/test_chat_cmd.py +0 -0
  243. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/cli/test_logs_cmd.py +0 -0
  244. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/cli/test_main_app.py +0 -0
  245. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/cli/test_model_cmd.py +0 -0
  246. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/cli/test_self_cmd.py +0 -0
  247. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/cli/test_self_cmd_commands.py +0 -0
  248. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/cli/test_self_cmd_plugins.py +0 -0
  249. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/cli/test_self_cmd_utilities.py +0 -0
  250. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/cli/test_workflow_file.py +0 -0
  251. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/cli/test_workflow_gcloud.py +0 -0
  252. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/cli/test_workflow_registry.py +0 -0
  253. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/conftest.py +0 -0
  254. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/demo_generate_graph.py +0 -0
  255. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/demo_hierarchical_transform.py +0 -0
  256. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/e2e/test_complete_workflows.py +0 -0
  257. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/e2e/test_model_workflow.py +0 -0
  258. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/e2e/test_new_user_workflow.py +0 -0
  259. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/e2e/test_update_workflow.py +0 -0
  260. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/fixtures/chat_fixtures.py +0 -0
  261. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/fixtures/cli_fixtures.py +0 -0
  262. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/fixtures/data_fixtures.py +0 -0
  263. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/fixtures/db_fixtures.py +0 -0
  264. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/fixtures/model_fixtures.py +0 -0
  265. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_agent.py +0 -0
  266. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_california_scraper.py +0 -0
  267. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_chat_client.py +0 -0
  268. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_chat_system.py +0 -0
  269. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_congress_scraper.py +0 -0
  270. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_daemon_client.py +0 -0
  271. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_daemon_server.py +0 -0
  272. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_e2e_dashboard_lsh_supabase.py +0 -0
  273. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_flask_webapp.py +0 -0
  274. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_gcloud_services.py +0 -0
  275. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_lsh_client.py +0 -0
  276. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_lsh_service.py +0 -0
  277. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_ml_auth.py +0 -0
  278. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_ml_data_pipeline.py +0 -0
  279. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_ml_models.py +0 -0
  280. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_ml_pipeline.py +0 -0
  281. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_module_imports.py +0 -0
  282. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_oi_service.py +0 -0
  283. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_politician_trading.py +0 -0
  284. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_repo_operations.py +0 -0
  285. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_scheduler_integration.py +0 -0
  286. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_service_registry.py +0 -0
  287. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_supabase_live_connection.py +0 -0
  288. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_uk_scraper.py +0 -0
  289. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_us_states_scraper.py +0 -0
  290. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_video_processing.py +0 -0
  291. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_wakatime_api.py +0 -0
  292. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_webapp_full.py +0 -0
  293. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_workflow.py +0 -0
  294. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/integration/test_workflow_commands.py +0 -0
  295. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/run_tests.py +0 -0
  296. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/test_harness.py +0 -0
  297. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_api_utils.py +0 -0
  298. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_async_process_manager.py +0 -0
  299. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_auth_modules.py +0 -0
  300. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_bug_fixes.py +0 -0
  301. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_config.py +0 -0
  302. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_custom_commands.py +0 -0
  303. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_daemon_api.py +0 -0
  304. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_dashboard_components.py +0 -0
  305. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_dashboard_functions.py +0 -0
  306. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_dashboard_pages.py +0 -0
  307. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_dependencies.py +0 -0
  308. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_erd_generation.py +0 -0
  309. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_erd_generic.py +0 -0
  310. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_erd_imports.py +0 -0
  311. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_git_commit_workflow.py +0 -0
  312. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_lib_auth.py +0 -0
  313. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_lib_files.py +0 -0
  314. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_lib_utils.py +0 -0
  315. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_logger.py +0 -0
  316. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_ml_preprocessing.py +0 -0
  317. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_paths.py +0 -0
  318. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_prediction_engine.py +0 -0
  319. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_regression.py +0 -0
  320. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_scheduler.py +0 -0
  321. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_scheduler_cron_parser.py +0 -0
  322. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_scheduler_job.py +0 -0
  323. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_scheduler_monitor.py +0 -0
  324. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_scheduler_persistence.py +0 -0
  325. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_self_update.py +0 -0
  326. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_supabase_connection.py +0 -0
  327. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_supabase_pagination.py +0 -0
  328. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_toml_utils.py +0 -0
  329. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_trading_imports.py +0 -0
  330. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_ui_rich.py +0 -0
  331. {mcli_framework-7.5.1 → mcli_framework-7.6.0}/tests/unit/test_uv_compat.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcli-framework
3
- Version: 7.5.1
3
+ Version: 7.6.0
4
4
  Summary: 🚀 High-performance CLI framework with Rust extensions, AI chat, and stunning visuals
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 = "7.5.1"
3
+ version = "7.6.0"
4
4
  description = "🚀 High-performance CLI framework with Rust extensions, AI chat, and stunning visuals"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.9"
@@ -183,22 +183,13 @@ class CompletionAwareLazyGroup(click.Group):
183
183
  group = self._load_group()
184
184
  return group.list_commands(ctx)
185
185
 
186
- def shell_complete(self, ctx, incomplete):
186
+ def shell_complete(self, ctx, param, incomplete):
187
187
  """Provide shell completion using static data when possible."""
188
- # For workflow group, provide static subcommand completions
189
- if self.name in LAZY_COMMAND_COMPLETIONS:
190
- data = LAZY_COMMAND_COMPLETIONS[self.name]
191
- if "subcommands" in data:
192
- items = []
193
- for subcommand in data["subcommands"]:
194
- if subcommand.startswith(incomplete):
195
- items.append(CompletionItem(subcommand))
196
- return items
197
-
198
- # Fallback to loading the actual group
188
+ # Load the actual group to get proper completion for nested commands
189
+ # This ensures file path completion works for subcommands
199
190
  group = self._load_group()
200
191
  if hasattr(group, "shell_complete"):
201
- return group.shell_complete(ctx, incomplete)
192
+ return group.shell_complete(ctx, param, incomplete)
202
193
  return []
203
194
 
204
195
  def get_params(self, ctx):
@@ -255,9 +255,11 @@ class LazyCommand(click.Command):
255
255
  def shell_complete(self, ctx, param, incomplete):
256
256
  """Provide shell completion for the lazily loaded command."""
257
257
  cmd = self._load_command()
258
+ # Delegate to the loaded command's completion
258
259
  if hasattr(cmd, "shell_complete"):
259
260
  return cmd.shell_complete(ctx, param, incomplete)
260
- return []
261
+ # Fallback to default Click completion
262
+ return super().shell_complete(ctx, param, incomplete) if hasattr(super(), "shell_complete") else []
261
263
 
262
264
 
263
265
  class LazyGroup(click.Group):
@@ -309,9 +311,11 @@ class LazyGroup(click.Group):
309
311
  def shell_complete(self, ctx, param, incomplete):
310
312
  """Provide shell completion for the lazily loaded group."""
311
313
  group = self._load_group()
314
+ # Delegate to the loaded group's completion
312
315
  if hasattr(group, "shell_complete"):
313
316
  return group.shell_complete(ctx, param, incomplete)
314
- return []
317
+ # Fallback to default Click completion
318
+ return super().shell_complete(ctx, param, incomplete) if hasattr(super(), "shell_complete") else []
315
319
 
316
320
 
317
321
  def _add_lazy_commands(app: click.Group):
@@ -334,14 +338,14 @@ def _add_lazy_commands(app: click.Group):
334
338
  except Exception as e:
335
339
  logger.debug(f"Could not load self commands: {e}")
336
340
 
337
- # Shell completion - load immediately as it's lightweight and useful
341
+ # Test group - load immediately for testing commands
338
342
  try:
339
- from mcli.app.completion_cmd import completion
343
+ from mcli.test.test_cmd import test_group
340
344
 
341
- app.add_command(completion, name="completion")
342
- logger.debug("Added completion commands")
343
- except ImportError as e:
344
- logger.debug(f"Could not load completion commands: {e}")
345
+ app.add_command(test_group, name="test")
346
+ logger.debug("Added test group commands")
347
+ except Exception as e:
348
+ logger.debug(f"Could not load test commands: {e}")
345
349
 
346
350
  # Add workflow with completion-aware lazy loading
347
351
  try:
@@ -374,22 +378,6 @@ def _add_lazy_commands(app: click.Group):
374
378
  "import_path": "mcli.app.model_cmd.model",
375
379
  "help": "Model management commands for offline and online model usage",
376
380
  },
377
- "cron-test": {
378
- "import_path": "mcli.app.cron_test_cmd.cron_test",
379
- "help": "🕒 Validate and test MCLI cron/scheduler functionality with comprehensive tests.",
380
- },
381
- "visual": {
382
- "import_path": "mcli.app.visual_cmd.visual",
383
- "help": "🎨 Visual effects and enhancements showcase",
384
- },
385
- "redis": {
386
- "import_path": "mcli.app.redis_cmd.redis_group",
387
- "help": "🗄️ Manage Redis cache service for performance optimization",
388
- },
389
- "logs": {
390
- "import_path": "mcli.app.logs_cmd.logs_group",
391
- "help": "📋 Stream and manage MCLI log files with real-time updates",
392
- },
393
381
  }
394
382
 
395
383
  for cmd_name, cmd_info in lazy_commands.items():
@@ -397,7 +385,7 @@ def _add_lazy_commands(app: click.Group):
397
385
  if cmd_name == "workflow":
398
386
  continue
399
387
 
400
- if cmd_name in ["model", "redis", "logs"]:
388
+ if cmd_name in ["model"]:
401
389
  # Use completion-aware LazyGroup for commands that have subcommands
402
390
  try:
403
391
  from mcli.app.completion_helpers import create_completion_aware_lazy_group
@@ -18,6 +18,86 @@ from mcli.workflow.model_service.lightweight_model_server import (
18
18
  logger = get_logger(__name__)
19
19
 
20
20
 
21
+ def _start_openai_server(server, host: str, port: int, api_key: Optional[str], model: str):
22
+ """Start FastAPI server with OpenAI compatibility"""
23
+ try:
24
+ from fastapi import FastAPI
25
+ from fastapi.middleware.cors import CORSMiddleware
26
+ import uvicorn
27
+
28
+ from mcli.workflow.model_service.openai_adapter import create_openai_adapter
29
+
30
+ # Create FastAPI app
31
+ app = FastAPI(
32
+ title="MCLI Model Service (OpenAI Compatible)",
33
+ description="OpenAI-compatible API for MCLI lightweight models",
34
+ version="1.0.0",
35
+ )
36
+
37
+ # Add CORS middleware
38
+ app.add_middleware(
39
+ CORSMiddleware,
40
+ allow_origins=["*"],
41
+ allow_credentials=True,
42
+ allow_methods=["*"],
43
+ allow_headers=["*"],
44
+ )
45
+
46
+ # Create OpenAI adapter
47
+ require_auth = api_key is not None
48
+ adapter = create_openai_adapter(server, require_auth=require_auth)
49
+
50
+ # Add API key if provided
51
+ if api_key:
52
+ adapter.api_key_manager.add_key(api_key, name="default")
53
+ click.echo(f"🔐 API key authentication enabled")
54
+
55
+ # Include OpenAI routes
56
+ app.include_router(adapter.router)
57
+
58
+ # Add health check endpoint
59
+ @app.get("/health")
60
+ async def health():
61
+ return {"status": "healthy", "model": model}
62
+
63
+ # Display server info
64
+ click.echo(f"\n📝 Server running at:")
65
+ click.echo(f" - Base URL: http://{host}:{port}")
66
+ click.echo(f" - OpenAI API: http://{host}:{port}/v1")
67
+ click.echo(f" - Models: http://{host}:{port}/v1/models")
68
+ click.echo(f" - Chat: http://{host}:{port}/v1/chat/completions")
69
+ click.echo(f" - Health: http://{host}:{port}/health")
70
+
71
+ if require_auth:
72
+ click.echo(f"\n🔐 Authentication: Required")
73
+ click.echo(f" Use: Authorization: Bearer {api_key}")
74
+ else:
75
+ click.echo(f"\n⚠️ Authentication: Disabled (not recommended for public access)")
76
+
77
+ if host == "0.0.0.0":
78
+ click.echo(f"\n⚠️ Server is publicly accessible on all interfaces!")
79
+
80
+ click.echo(f"\n📚 For aider, use:")
81
+ if require_auth:
82
+ click.echo(f" export OPENAI_API_KEY={api_key}")
83
+ click.echo(f" export OPENAI_API_BASE=http://{host}:{port}/v1")
84
+ click.echo(f" aider --model {model}")
85
+
86
+ click.echo(f"\n Press Ctrl+C to stop the server")
87
+
88
+ # Start server
89
+ uvicorn.run(app, host=host, port=port, log_level="info")
90
+
91
+ except ImportError as e:
92
+ click.echo(f"❌ Missing dependencies for OpenAI-compatible server: {e}")
93
+ click.echo(f" Install with: pip install fastapi uvicorn")
94
+ sys.exit(1)
95
+ except Exception as e:
96
+ click.echo(f"❌ Failed to start OpenAI-compatible server: {e}")
97
+ logger.error(f"Server error: {e}", exc_info=True)
98
+ sys.exit(1)
99
+
100
+
21
101
  @click.group()
22
102
  def model():
23
103
  """Model management commands for offline and online model usage."""
@@ -103,13 +183,34 @@ def download(model_name: str):
103
183
  @click.option(
104
184
  "--port", "-p", default=None, help="Port to run server on (default: from config or 51234)"
105
185
  )
186
+ @click.option(
187
+ "--host", "-h", default="localhost", help="Host to bind to (use 0.0.0.0 for public access)"
188
+ )
106
189
  @click.option(
107
190
  "--auto-download",
108
191
  is_flag=True,
109
192
  default=True,
110
193
  help="Automatically download model if not available",
111
194
  )
112
- def start(model: Optional[str], port: Optional[int], auto_download: bool):
195
+ @click.option(
196
+ "--openai-compatible",
197
+ is_flag=True,
198
+ default=False,
199
+ help="Enable OpenAI-compatible API endpoints",
200
+ )
201
+ @click.option(
202
+ "--api-key",
203
+ default=None,
204
+ help="API key for authentication (if not set, auth is disabled)",
205
+ )
206
+ def start(
207
+ model: Optional[str],
208
+ port: Optional[int],
209
+ host: str,
210
+ auto_download: bool,
211
+ openai_compatible: bool,
212
+ api_key: Optional[str],
213
+ ):
113
214
  """Start the lightweight model server."""
114
215
  # Load port from config if not specified
115
216
  if port is None:
@@ -155,15 +256,24 @@ def start(model: Optional[str], port: Optional[int], auto_download: bool):
155
256
  click.echo(f"❌ Failed to load {model}")
156
257
  sys.exit(1)
157
258
 
158
- # Start server
159
- click.echo(f"🚀 Starting lightweight server on port {port}...")
160
- server.start_server()
259
+ # Start server with OpenAI compatibility if requested
260
+ if openai_compatible:
261
+ click.echo(f"🚀 Starting OpenAI-compatible server on {host}:{port}...")
262
+ _start_openai_server(server, host, port, api_key, model)
263
+ else:
264
+ click.echo(f"🚀 Starting lightweight server on {host}:{port}...")
265
+ server.start_server()
266
+
267
+ click.echo(f"\n📝 Server running at:")
268
+ click.echo(f" - API: http://{host}:{port}")
269
+ click.echo(f" - Health: http://{host}:{port}/health")
270
+ click.echo(f" - Models: http://{host}:{port}/models")
271
+
272
+ if host == "0.0.0.0":
273
+ click.echo(f"\n⚠️ Server is publicly accessible!")
274
+ click.echo(f" Consider using --openai-compatible with --api-key for security")
161
275
 
162
- click.echo(f"\n📝 Server running at:")
163
- click.echo(f" - API: http://localhost:{port}")
164
- click.echo(f" - Health: http://localhost:{port}/health")
165
- click.echo(f" - Models: http://localhost:{port}/models")
166
- click.echo(f"\n Press Ctrl+C to stop the server")
276
+ click.echo(f"\n Press Ctrl+C to stop the server")
167
277
 
168
278
  try:
169
279
  # Keep server running
@@ -274,12 +274,23 @@ class CustomCommandManager:
274
274
  spec.loader.exec_module(module)
275
275
 
276
276
  # Look for a command or command group in the module
277
+ # Prioritize Groups over Commands to handle commands with subcommands correctly
277
278
  command_obj = None
279
+ found_commands = []
280
+
278
281
  for attr_name in dir(module):
279
282
  attr = getattr(module, attr_name)
280
- if isinstance(attr, (click.Command, click.Group)):
283
+ if isinstance(attr, click.Group):
284
+ # Found a group - this takes priority
281
285
  command_obj = attr
282
286
  break
287
+ elif isinstance(attr, click.Command):
288
+ # Store command for fallback
289
+ found_commands.append(attr)
290
+
291
+ # If no group found, use the first command
292
+ if not command_obj and found_commands:
293
+ command_obj = found_commands[0]
283
294
 
284
295
  if command_obj:
285
296
  # Register with the target group
@@ -27,7 +27,7 @@ def bash_completion(ctx):
27
27
 
28
28
  # Get the root CLI app
29
29
  app = ctx.find_root().command
30
- complete = BashComplete(app, {}, "mcli", "complete")
30
+ complete = BashComplete(app, {}, "mcli", "_MCLI_COMPLETE")
31
31
  script = complete.source()
32
32
 
33
33
  click.echo("# Bash completion script for MCLI")
@@ -44,7 +44,7 @@ def zsh_completion(ctx):
44
44
 
45
45
  # Get the root CLI app
46
46
  app = ctx.find_root().command
47
- complete = ZshComplete(app, {}, "mcli", "complete")
47
+ complete = ZshComplete(app, {}, "mcli", "_MCLI_COMPLETE")
48
48
  script = complete.source()
49
49
 
50
50
  click.echo("# Zsh completion script for MCLI")
@@ -61,7 +61,7 @@ def fish_completion(ctx):
61
61
 
62
62
  # Get the root CLI app
63
63
  app = ctx.find_root().command
64
- complete = FishComplete(app, {}, "mcli", "complete")
64
+ complete = FishComplete(app, {}, "mcli", "_MCLI_COMPLETE")
65
65
  script = complete.source()
66
66
 
67
67
  click.echo("# Fish completion script for MCLI")
@@ -101,7 +101,7 @@ def install_completion(ctx, shell):
101
101
  if shell == "bash":
102
102
  from click.shell_completion import BashComplete
103
103
 
104
- complete = BashComplete(app, {}, "mcli", "complete")
104
+ complete = BashComplete(app, {}, "mcli", "_MCLI_COMPLETE")
105
105
  script = complete.source()
106
106
 
107
107
  # Install to bash completion directory
@@ -130,7 +130,7 @@ def install_completion(ctx, shell):
130
130
  elif shell == "zsh":
131
131
  from click.shell_completion import ZshComplete
132
132
 
133
- complete = ZshComplete(app, {}, "mcli", "complete")
133
+ complete = ZshComplete(app, {}, "mcli", "_MCLI_COMPLETE")
134
134
  script = complete.source()
135
135
 
136
136
  # Install to zsh completion directory
@@ -161,7 +161,7 @@ def install_completion(ctx, shell):
161
161
  elif shell == "fish":
162
162
  from click.shell_completion import FishComplete
163
163
 
164
- complete = FishComplete(app, {}, "mcli", "complete")
164
+ complete = FishComplete(app, {}, "mcli", "_MCLI_COMPLETE")
165
165
  script = complete.source()
166
166
 
167
167
  # Install to fish completion directory
@@ -1265,6 +1265,35 @@ def update(check: bool, pre: bool, yes: bool, skip_ci_check: bool):
1265
1265
  # Register the plugin group with self_app
1266
1266
  self_app.add_command(plugin)
1267
1267
 
1268
+ # Import and register new commands that have been moved to self
1269
+ try:
1270
+ from mcli.self.completion_cmd import completion
1271
+ self_app.add_command(completion, name="completion")
1272
+ logger.debug("Added completion command to self group")
1273
+ except ImportError as e:
1274
+ logger.debug(f"Could not load completion command: {e}")
1275
+
1276
+ try:
1277
+ from mcli.self.logs_cmd import logs_group
1278
+ self_app.add_command(logs_group, name="logs")
1279
+ logger.debug("Added logs command to self group")
1280
+ except ImportError as e:
1281
+ logger.debug(f"Could not load logs command: {e}")
1282
+
1283
+ try:
1284
+ from mcli.self.redis_cmd import redis_group
1285
+ self_app.add_command(redis_group, name="redis")
1286
+ logger.debug("Added redis command to self group")
1287
+ except ImportError as e:
1288
+ logger.debug(f"Could not load redis command: {e}")
1289
+
1290
+ try:
1291
+ from mcli.self.visual_cmd import visual
1292
+ self_app.add_command(visual, name="visual")
1293
+ logger.debug("Added visual command to self group")
1294
+ except ImportError as e:
1295
+ logger.debug(f"Could not load visual command: {e}")
1296
+
1268
1297
  # This part is important to make the command available to the CLI
1269
1298
  if __name__ == "__main__":
1270
1299
  self_app()
@@ -0,0 +1,30 @@
1
+ """
2
+ Test command group for mcli.
3
+ Contains testing and validation utilities.
4
+ """
5
+
6
+ import click
7
+
8
+ from mcli.lib.logger.logger import get_logger
9
+
10
+ logger = get_logger(__name__)
11
+
12
+
13
+ @click.group(name="test")
14
+ def test_group():
15
+ """Testing and validation commands"""
16
+ pass
17
+
18
+
19
+ # Import and register subcommands
20
+ try:
21
+ from mcli.test.cron_test_cmd import cron_test
22
+
23
+ test_group.add_command(cron_test, name="cron")
24
+ logger.debug("Added cron test command to test group")
25
+ except ImportError as e:
26
+ logger.debug(f"Could not load cron test command: {e}")
27
+
28
+
29
+ if __name__ == "__main__":
30
+ test_group()