mcli-framework 7.0.0__tar.gz → 7.0.4__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 (266) hide show
  1. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/PKG-INFO +1 -1
  2. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/pyproject.toml +1 -1
  3. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/app/completion_helpers.py +6 -2
  4. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/app/logs_cmd.py +26 -27
  5. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/app/model_cmd.py +102 -0
  6. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/logger/logger.py +5 -7
  7. mcli_framework-7.0.4/src/mcli/lib/paths.py +82 -0
  8. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/self/self_cmd.py +58 -1
  9. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/model_service/lightweight_model_server.py +37 -0
  10. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli_framework.egg-info/PKG-INFO +1 -1
  11. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli_framework.egg-info/SOURCES.txt +2 -0
  12. mcli_framework-7.0.4/tests/test_model_cmd.py +362 -0
  13. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/.github/dependabot.yml +0 -0
  14. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/.github/workflows/build.yml +0 -0
  15. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/.github/workflows/ci.yml +0 -0
  16. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/.github/workflows/ml-pipeline.yml +0 -0
  17. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/.github/workflows/publish-self-hosted.yml +0 -0
  18. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/.github/workflows/publish.yml +0 -0
  19. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/.github/workflows/release.yml +0 -0
  20. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/.github/workflows/security.yml +0 -0
  21. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/.github/workflows/test.yml +0 -0
  22. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/LICENSE +0 -0
  23. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/MANIFEST.in +0 -0
  24. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/PERFORMANCE_OPTIMIZATIONS.md +0 -0
  25. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/README.md +0 -0
  26. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/mcli_rust/Cargo.toml +0 -0
  27. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/mcli_rust/src/command_parser.rs +0 -0
  28. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/mcli_rust/src/file_watcher.rs +0 -0
  29. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/mcli_rust/src/lib.rs +0 -0
  30. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/mcli_rust/src/process_manager.rs +0 -0
  31. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/mcli_rust/src/tfidf.rs +0 -0
  32. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/setup.cfg +0 -0
  33. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/app/chat_cmd.py +0 -0
  34. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/app/commands_cmd.py +0 -0
  35. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/app/completion_cmd.py +0 -0
  36. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/app/cron_test_cmd.py +0 -0
  37. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/app/main.py +0 -0
  38. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/app/model/model.py +0 -0
  39. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/app/redis_cmd.py +0 -0
  40. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/app/video/video.py +0 -0
  41. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/app/visual_cmd.py +0 -0
  42. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/chat/chat.py +0 -0
  43. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/chat/command_rag.py +0 -0
  44. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/chat/enhanced_chat.py +0 -0
  45. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/chat/system_controller.py +0 -0
  46. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/chat/system_integration.py +0 -0
  47. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/cli.py +0 -0
  48. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/config.toml +0 -0
  49. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/api/api.py +0 -0
  50. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/api/daemon_client.py +0 -0
  51. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/api/daemon_client_local.py +0 -0
  52. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/api/daemon_decorator.py +0 -0
  53. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/api/mcli_decorators.py +0 -0
  54. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/auth/auth.py +0 -0
  55. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/auth/aws_manager.py +0 -0
  56. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/auth/azure_manager.py +0 -0
  57. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/auth/credential_manager.py +0 -0
  58. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/auth/gcp_manager.py +0 -0
  59. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/auth/key_manager.py +0 -0
  60. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/auth/mcli_manager.py +0 -0
  61. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/auth/token_manager.py +0 -0
  62. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/auth/token_util.py +0 -0
  63. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/config/config.py +0 -0
  64. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/discovery/__init__.py +0 -0
  65. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/discovery/command_discovery.py +0 -0
  66. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/erd/erd.py +0 -0
  67. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/erd/generate_graph.py +0 -0
  68. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/files/files.py +0 -0
  69. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/fs/fs.py +0 -0
  70. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/lib.py +0 -0
  71. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/performance/optimizer.py +0 -0
  72. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/performance/rust_bridge.py +0 -0
  73. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/performance/uvloop_config.py +0 -0
  74. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/pickles/pickles.py +0 -0
  75. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/search/cached_vectorizer.py +0 -0
  76. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/services/data_pipeline.py +0 -0
  77. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/services/lsh_client.py +0 -0
  78. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/services/redis_service.py +0 -0
  79. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/shell/shell.py +0 -0
  80. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/toml/toml.py +0 -0
  81. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/ui/styling.py +0 -0
  82. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/ui/visual_effects.py +0 -0
  83. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/lib/watcher/watcher.py +0 -0
  84. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/app.py +0 -0
  85. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/middleware.py +0 -0
  86. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/routers/admin_router.py +0 -0
  87. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/routers/auth_router.py +0 -0
  88. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/routers/backtest_router.py +0 -0
  89. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/routers/data_router.py +0 -0
  90. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/routers/model_router.py +0 -0
  91. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/routers/monitoring_router.py +0 -0
  92. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/routers/portfolio_router.py +0 -0
  93. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/routers/prediction_router.py +0 -0
  94. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/routers/trade_router.py +0 -0
  95. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/routers/websocket_router.py +0 -0
  96. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/api/schemas.py +0 -0
  97. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/auth/auth_manager.py +0 -0
  98. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/auth/models.py +0 -0
  99. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/auth/permissions.py +0 -0
  100. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/backtesting/backtest_engine.py +0 -0
  101. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/backtesting/performance_metrics.py +0 -0
  102. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/cache.py +0 -0
  103. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/cli/main.py +0 -0
  104. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/config/settings.py +0 -0
  105. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/configs/dvc_config.py +0 -0
  106. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/configs/mlflow_config.py +0 -0
  107. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/configs/mlops_manager.py +0 -0
  108. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/dashboard/app.py +0 -0
  109. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/dashboard/app_integrated.py +0 -0
  110. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/dashboard/app_supabase.py +0 -0
  111. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/dashboard/app_training.py +0 -0
  112. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/dashboard/cli.py +0 -0
  113. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/data_ingestion/api_connectors.py +0 -0
  114. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/data_ingestion/data_pipeline.py +0 -0
  115. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/data_ingestion/stream_processor.py +0 -0
  116. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/database/migrations/env.py +0 -0
  117. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/database/models.py +0 -0
  118. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/database/session.py +0 -0
  119. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/experimentation/ab_testing.py +0 -0
  120. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/features/ensemble_features.py +0 -0
  121. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/features/political_features.py +0 -0
  122. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/features/recommendation_engine.py +0 -0
  123. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/features/stock_features.py +0 -0
  124. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/features/test_feature_engineering.py +0 -0
  125. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/logging.py +0 -0
  126. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/mlops/data_versioning.py +0 -0
  127. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/mlops/experiment_tracker.py +0 -0
  128. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/mlops/model_serving.py +0 -0
  129. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/mlops/pipeline_orchestrator.py +0 -0
  130. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/models/base_models.py +0 -0
  131. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/models/ensemble_models.py +0 -0
  132. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/models/recommendation_models.py +0 -0
  133. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/models/test_models.py +0 -0
  134. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/monitoring/drift_detection.py +0 -0
  135. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/monitoring/metrics.py +0 -0
  136. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/optimization/portfolio_optimizer.py +0 -0
  137. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/preprocessing/data_cleaners.py +0 -0
  138. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/preprocessing/feature_extractors.py +0 -0
  139. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/preprocessing/ml_pipeline.py +0 -0
  140. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/preprocessing/politician_trading_preprocessor.py +0 -0
  141. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/preprocessing/test_preprocessing.py +0 -0
  142. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/scripts/populate_sample_data.py +0 -0
  143. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/tasks.py +0 -0
  144. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/tests/test_integration.py +0 -0
  145. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/ml/tests/test_training_dashboard.py +0 -0
  146. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/public/oi/oi.py +0 -0
  147. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/public/public.py +0 -0
  148. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/daemon/api_daemon.py +0 -0
  149. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/daemon/async_command_database.py +0 -0
  150. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/daemon/async_process_manager.py +0 -0
  151. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/daemon/client.py +0 -0
  152. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/daemon/commands.py +0 -0
  153. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/daemon/daemon.py +0 -0
  154. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/daemon/daemon_api.py +0 -0
  155. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/daemon/enhanced_daemon.py +0 -0
  156. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/daemon/process_cli.py +0 -0
  157. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/daemon/process_manager.py +0 -0
  158. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/daemon/test_daemon.py +0 -0
  159. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/dashboard/dashboard_cmd.py +0 -0
  160. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/docker/docker.py +0 -0
  161. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/file/file.py +0 -0
  162. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/gcloud/config.toml +0 -0
  163. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/gcloud/gcloud.py +0 -0
  164. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/git_commit/ai_service.py +0 -0
  165. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/git_commit/commands.py +0 -0
  166. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/lsh_integration.py +0 -0
  167. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/model_service/client.py +0 -0
  168. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/model_service/download_and_run_efficient_models.py +0 -0
  169. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/model_service/lightweight_embedder.py +0 -0
  170. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/model_service/lightweight_test.py +0 -0
  171. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/model_service/model_service.py +0 -0
  172. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/model_service/ollama_efficient_runner.py +0 -0
  173. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/model_service/pdf_processor.py +0 -0
  174. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/model_service/test_efficient_runner.py +0 -0
  175. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/model_service/test_example.py +0 -0
  176. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/model_service/test_integration.py +0 -0
  177. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/model_service/test_new_features.py +0 -0
  178. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/openai/openai.py +0 -0
  179. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/commands.py +0 -0
  180. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/config.py +0 -0
  181. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/connectivity.py +0 -0
  182. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/data_sources.py +0 -0
  183. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/database.py +0 -0
  184. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/demo.py +0 -0
  185. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/models.py +0 -0
  186. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/monitoring.py +0 -0
  187. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/scrapers.py +0 -0
  188. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/scrapers_california.py +0 -0
  189. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/scrapers_eu.py +0 -0
  190. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/scrapers_uk.py +0 -0
  191. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/scrapers_us_states.py +0 -0
  192. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/supabase_functions.py +0 -0
  193. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/politician_trading/workflow.py +0 -0
  194. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/registry/registry.py +0 -0
  195. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/repo/repo.py +0 -0
  196. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/scheduler/commands.py +0 -0
  197. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/scheduler/cron_parser.py +0 -0
  198. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/scheduler/job.py +0 -0
  199. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/scheduler/monitor.py +0 -0
  200. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/scheduler/persistence.py +0 -0
  201. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/scheduler/scheduler.py +0 -0
  202. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/sync/sync_cmd.py +0 -0
  203. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/sync/test_cmd.py +0 -0
  204. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/videos/videos.py +0 -0
  205. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/wakatime/wakatime.py +0 -0
  206. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli/workflow/workflow.py +0 -0
  207. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli_framework.egg-info/dependency_links.txt +0 -0
  208. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli_framework.egg-info/entry_points.txt +0 -0
  209. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli_framework.egg-info/requires.txt +0 -0
  210. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/src/mcli_framework.egg-info/top_level.txt +0 -0
  211. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/conftest.py +0 -0
  212. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/demo_generate_graph.py +0 -0
  213. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/demo_hierarchical_transform.py +0 -0
  214. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/end_to_end_integration_test.py +0 -0
  215. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/pytest.ini +0 -0
  216. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/run_tests.py +0 -0
  217. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/simple_integration_test.py +0 -0
  218. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_agent_functionality.py +0 -0
  219. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_all_cli.py +0 -0
  220. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_auth.py +0 -0
  221. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_california_scraper.py +0 -0
  222. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_chat_client.py +0 -0
  223. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_chat_cmd.py +0 -0
  224. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_chat_system_control.py +0 -0
  225. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_command_discovery.py +0 -0
  226. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_congress_scraper.py +0 -0
  227. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_daemon.py +0 -0
  228. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_daemon_client.py +0 -0
  229. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_data_pipeline.py +0 -0
  230. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_enhanced_chat.py +0 -0
  231. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_erd.py +0 -0
  232. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_erd_import.py +0 -0
  233. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_file.py +0 -0
  234. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_fix.py +0 -0
  235. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_fixed_issues.py +0 -0
  236. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_gcloud.py +0 -0
  237. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_generate_graph.py +0 -0
  238. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_generic_erd.py +0 -0
  239. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_harness.py +0 -0
  240. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_lib.py +0 -0
  241. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_lsh_client.py +0 -0
  242. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_lsh_integration.py +0 -0
  243. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_main_app.py +0 -0
  244. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_main_app_functions.py +0 -0
  245. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_ml_auth.py +0 -0
  246. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_ml_models.py +0 -0
  247. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_ml_pipeline.py +0 -0
  248. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_oi.py +0 -0
  249. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_optional_dependencies.py +0 -0
  250. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_politician_trading_integration.py +0 -0
  251. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_preprocessing_simple.py +0 -0
  252. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_registry.py +0 -0
  253. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_repo.py +0 -0
  254. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_rich.py +0 -0
  255. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_self.py +0 -0
  256. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_uk_scraper.py +0 -0
  257. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_us_states_scraper.py +0 -0
  258. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_utility_functions.py +0 -0
  259. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_utility_functions_simple.py +0 -0
  260. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_uv_compatibility.py +0 -0
  261. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_videos.py +0 -0
  262. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_wakatime.py +0 -0
  263. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_webapp.py +0 -0
  264. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_webapp_comprehensive.py +0 -0
  265. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_workflow.py +0 -0
  266. {mcli_framework-7.0.0 → mcli_framework-7.0.4}/tests/test_workflow_integration.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcli-framework
3
- Version: 7.0.0
3
+ Version: 7.0.4
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.0.0"
3
+ version = "7.0.4"
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"
@@ -137,8 +137,12 @@ LAZY_COMMAND_COMPLETIONS = {
137
137
  "subcommands": [
138
138
  "download",
139
139
  "list",
140
- "remove",
141
- "info"
140
+ "start",
141
+ "stop",
142
+ "pull",
143
+ "delete",
144
+ "recommend",
145
+ "status"
142
146
  ]
143
147
  },
144
148
  "cron-test": {
@@ -16,6 +16,8 @@ from rich.live import Live
16
16
  from rich.panel import Panel
17
17
  from rich.text import Text
18
18
 
19
+ from mcli.lib.paths import get_logs_dir
20
+
19
21
  console = Console()
20
22
 
21
23
 
@@ -25,6 +27,24 @@ def logs_group():
25
27
  pass
26
28
 
27
29
 
30
+ @logs_group.command(name="location")
31
+ def show_location():
32
+ """Show the location of the logs directory"""
33
+ logs_dir = get_logs_dir()
34
+ console.print(f"📁 [cyan]Logs directory:[/cyan] {logs_dir}")
35
+ console.print(f" [dim]Set MCLI_HOME environment variable to change location[/dim]")
36
+
37
+ # Show if directory exists and has files
38
+ if logs_dir.exists():
39
+ log_files = list(logs_dir.glob("mcli*.log"))
40
+ if log_files:
41
+ console.print(f" [green]✓ {len(log_files)} log file(s) found[/green]")
42
+ else:
43
+ console.print(f" [yellow]⚠ Directory exists but no log files yet[/yellow]")
44
+ else:
45
+ console.print(f" [yellow]⚠ Directory will be created on first use[/yellow]")
46
+
47
+
28
48
  @logs_group.command(name="stream")
29
49
  @click.option(
30
50
  "--type",
@@ -49,13 +69,7 @@ def stream_logs(type: str, lines: int, follow: bool):
49
69
  Shows log output with syntax highlighting and real-time updates.
50
70
  Similar to 'tail -f' but with enhanced formatting for MCLI logs.
51
71
  """
52
- logs_dir = Path("logs")
53
-
54
- if not logs_dir.exists():
55
- console.print(
56
- "❌ No logs directory found. Run some MCLI commands to generate logs.", style="red"
57
- )
58
- return
72
+ logs_dir = get_logs_dir()
59
73
 
60
74
  # Get today's log files
61
75
  today = datetime.now().strftime("%Y%m%d")
@@ -98,12 +112,7 @@ def stream_logs(type: str, lines: int, follow: bool):
98
112
  @click.option("--date", "-d", help="Show logs for specific date (YYYYMMDD format)")
99
113
  def list_logs(date: Optional[str]):
100
114
  """List available log files"""
101
- logs_dir = Path("logs")
102
-
103
- if not logs_dir.exists():
104
- console.print("❌ No logs directory found", style="red")
105
- return
106
-
115
+ logs_dir = get_logs_dir()
107
116
  _list_available_logs(logs_dir, date)
108
117
 
109
118
 
@@ -113,11 +122,9 @@ def list_logs(date: Optional[str]):
113
122
  @click.option("--date", "-d", help="Date for log file (YYYYMMDD format, default: today)")
114
123
  def tail_logs(log_type: str, lines: int, date: Optional[str]):
115
124
  """Show the last N lines of a specific log file"""
116
- logs_dir = Path("logs")
125
+ logs_dir = get_logs_dir()
117
126
 
118
- if not logs_dir.exists():
119
- console.print("❌ No logs directory found", style="red")
120
- return
127
+ # Note: get_logs_dir() creates the directory automatically
121
128
 
122
129
  # Use provided date or default to today
123
130
  log_date = date or datetime.now().strftime("%Y%m%d")
@@ -168,11 +175,7 @@ def tail_logs(log_type: str, lines: int, date: Optional[str]):
168
175
  )
169
176
  def grep_logs(pattern: str, type: str, date: Optional[str], context: int):
170
177
  """Search for patterns in log files"""
171
- logs_dir = Path("logs")
172
-
173
- if not logs_dir.exists():
174
- console.print("❌ No logs directory found", style="red")
175
- return
178
+ logs_dir = get_logs_dir()
176
179
 
177
180
  # Use provided date or default to today
178
181
  log_date = date or datetime.now().strftime("%Y%m%d")
@@ -216,11 +219,7 @@ def grep_logs(pattern: str, type: str, date: Optional[str], context: int):
216
219
  @click.option("--confirm", "-y", is_flag=True, help="Skip confirmation prompt")
217
220
  def clear_logs(older_than: Optional[int], confirm: bool):
218
221
  """Clear old log files"""
219
- logs_dir = Path("logs")
220
-
221
- if not logs_dir.exists():
222
- console.print("❌ No logs directory found", style="red")
223
- return
222
+ logs_dir = get_logs_dir()
224
223
 
225
224
  # Find log files
226
225
  log_files = list(logs_dir.glob("mcli*.log"))
@@ -7,6 +7,7 @@ from pathlib import Path
7
7
  from typing import Optional
8
8
 
9
9
  import click
10
+ import psutil
10
11
 
11
12
  from mcli.lib.logger.logger import get_logger
12
13
  from mcli.workflow.model_service.lightweight_model_server import (
@@ -223,5 +224,106 @@ def status(port: int):
223
224
  click.echo(f"❌ Error checking server: {e}")
224
225
 
225
226
 
227
+ @model.command()
228
+ @click.option("--port", "-p", default=8080, help="Port where server is running")
229
+ def stop(port: int):
230
+ """Stop the lightweight model server."""
231
+ import requests
232
+ import psutil
233
+
234
+ try:
235
+ # First check if server is running
236
+ try:
237
+ response = requests.get(f"http://localhost:{port}/health", timeout=2)
238
+ if response.status_code != 200:
239
+ click.echo(f"❌ No server running on port {port}")
240
+ return
241
+ except requests.exceptions.ConnectionError:
242
+ click.echo(f"❌ No server running on port {port}")
243
+ return
244
+
245
+ # Find and kill the process using the port
246
+ for proc in psutil.process_iter(["pid", "name", "connections"]):
247
+ try:
248
+ connections = proc.info.get("connections")
249
+ if connections:
250
+ for conn in connections:
251
+ if hasattr(conn, "laddr") and conn.laddr.port == port:
252
+ click.echo(f"🛑 Stopping server (PID: {proc.pid})...")
253
+ proc.terminate()
254
+ proc.wait(timeout=5)
255
+ click.echo("✅ Server stopped successfully")
256
+ return
257
+ except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.TimeoutExpired):
258
+ continue
259
+
260
+ click.echo("⚠️ Could not find server process")
261
+
262
+ except Exception as e:
263
+ click.echo(f"❌ Error stopping server: {e}")
264
+
265
+
266
+ @model.command()
267
+ @click.argument("model_name")
268
+ def pull(model_name: str):
269
+ """Pull (download) a specific lightweight model."""
270
+ if model_name not in LIGHTWEIGHT_MODELS:
271
+ click.echo(f"❌ Model '{model_name}' not found.")
272
+ click.echo("Available models:")
273
+ for key in LIGHTWEIGHT_MODELS.keys():
274
+ click.echo(f" • {key}")
275
+ sys.exit(1)
276
+
277
+ server = LightweightModelServer()
278
+
279
+ click.echo(f"Pulling model: {model_name}")
280
+ success = server.download_and_load_model(model_name)
281
+
282
+ if success:
283
+ click.echo(f"✅ Successfully pulled {model_name}")
284
+ else:
285
+ click.echo(f"❌ Failed to pull {model_name}")
286
+ sys.exit(1)
287
+
288
+
289
+ @model.command()
290
+ @click.argument("model_name")
291
+ @click.option("--force", "-f", is_flag=True, help="Force deletion without confirmation")
292
+ def delete(model_name: str, force: bool):
293
+ """Delete a downloaded lightweight model."""
294
+ server = LightweightModelServer()
295
+ downloaded_models = server.downloader.get_downloaded_models()
296
+
297
+ if model_name not in downloaded_models:
298
+ click.echo(f"❌ Model '{model_name}' not found.")
299
+ click.echo("Downloaded models:")
300
+ if downloaded_models:
301
+ for model in downloaded_models:
302
+ click.echo(f" • {model}")
303
+ else:
304
+ click.echo(" (none)")
305
+ sys.exit(1)
306
+
307
+ # Confirm deletion unless --force is used
308
+ if not force:
309
+ model_info = LIGHTWEIGHT_MODELS.get(model_name, {})
310
+ name = model_info.get("name", model_name)
311
+ size = model_info.get("size_mb", "unknown")
312
+ click.echo(f"⚠️ About to delete:")
313
+ click.echo(f" Model: {name}")
314
+ click.echo(f" Size: {size} MB")
315
+ if not click.confirm("Are you sure you want to delete this model?"):
316
+ click.echo("❌ Deletion cancelled")
317
+ return
318
+
319
+ success = server.delete_model(model_name)
320
+
321
+ if success:
322
+ click.echo(f"✅ Successfully deleted {model_name}")
323
+ else:
324
+ click.echo(f"❌ Failed to delete {model_name}")
325
+ sys.exit(1)
326
+
327
+
226
328
  if __name__ == "__main__":
227
329
  model()
@@ -208,13 +208,11 @@ class McliLogger:
208
208
 
209
209
  # Set up file handler with path resolution
210
210
  try:
211
- # Find the project root directory (where logs dir should be)
212
- # Start with the current file and navigate up the directory structure
213
- current_file = Path(__file__)
214
- # Go up 5 levels: file -> logger -> lib -> mcli -> src -> repo_root
215
- project_root = current_file.parents[4]
216
- log_dir = project_root / "logs"
217
- log_dir.mkdir(exist_ok=True)
211
+ # Import paths utility for consistent path resolution
212
+ from mcli.lib.paths import get_logs_dir
213
+
214
+ # Get logs directory (e.g., ~/.mcli/logs)
215
+ log_dir = get_logs_dir()
218
216
 
219
217
  # Create daily log file
220
218
  timestamp = datetime.now().strftime("%Y%m%d")
@@ -0,0 +1,82 @@
1
+ """
2
+ Path resolution utilities for mcli
3
+
4
+ Provides consistent path resolution for logs, config, and data directories
5
+ that work both when running from source and when installed as a package.
6
+ """
7
+
8
+ import os
9
+ from pathlib import Path
10
+ from typing import Optional
11
+
12
+
13
+ def get_mcli_home() -> Path:
14
+ """
15
+ Get the mcli home directory for storing logs, config, and data.
16
+
17
+ Returns:
18
+ Path to ~/.mcli directory, created if it doesn't exist
19
+ """
20
+ # Check for MCLI_HOME environment variable first
21
+ mcli_home = os.getenv("MCLI_HOME")
22
+ if mcli_home:
23
+ path = Path(mcli_home)
24
+ else:
25
+ # Use XDG_DATA_HOME if set, otherwise default to ~/.mcli
26
+ xdg_data_home = os.getenv("XDG_DATA_HOME")
27
+ if xdg_data_home:
28
+ path = Path(xdg_data_home) / "mcli"
29
+ else:
30
+ path = Path.home() / ".mcli"
31
+
32
+ # Create directory if it doesn't exist
33
+ path.mkdir(parents=True, exist_ok=True)
34
+ return path
35
+
36
+
37
+ def get_logs_dir() -> Path:
38
+ """
39
+ Get the logs directory for mcli.
40
+
41
+ Returns:
42
+ Path to logs directory (e.g., ~/.mcli/logs), created if it doesn't exist
43
+ """
44
+ logs_dir = get_mcli_home() / "logs"
45
+ logs_dir.mkdir(parents=True, exist_ok=True)
46
+ return logs_dir
47
+
48
+
49
+ def get_config_dir() -> Path:
50
+ """
51
+ Get the config directory for mcli.
52
+
53
+ Returns:
54
+ Path to config directory (e.g., ~/.mcli/config), created if it doesn't exist
55
+ """
56
+ config_dir = get_mcli_home() / "config"
57
+ config_dir.mkdir(parents=True, exist_ok=True)
58
+ return config_dir
59
+
60
+
61
+ def get_data_dir() -> Path:
62
+ """
63
+ Get the data directory for mcli.
64
+
65
+ Returns:
66
+ Path to data directory (e.g., ~/.mcli/data), created if it doesn't exist
67
+ """
68
+ data_dir = get_mcli_home() / "data"
69
+ data_dir.mkdir(parents=True, exist_ok=True)
70
+ return data_dir
71
+
72
+
73
+ def get_cache_dir() -> Path:
74
+ """
75
+ Get the cache directory for mcli.
76
+
77
+ Returns:
78
+ Path to cache directory (e.g., ~/.mcli/cache), created if it doesn't exist
79
+ """
80
+ cache_dir = get_mcli_home() / "cache"
81
+ cache_dir.mkdir(parents=True, exist_ok=True)
82
+ return cache_dir
@@ -1129,11 +1129,53 @@ def dashboard(refresh: float, once: bool):
1129
1129
  console.print(f"[red]Error launching dashboard: {e}[/red]")
1130
1130
 
1131
1131
 
1132
+ def check_ci_status(version: str) -> tuple[bool, Optional[str]]:
1133
+ """
1134
+ Check GitHub Actions CI status for the main branch.
1135
+ Returns (passing, url) tuple.
1136
+ """
1137
+ try:
1138
+ import requests
1139
+
1140
+ response = requests.get(
1141
+ "https://api.github.com/repos/gwicho38/mcli/actions/runs",
1142
+ params={"per_page": 5},
1143
+ headers={
1144
+ "Accept": "application/vnd.github.v3+json",
1145
+ "User-Agent": "mcli-cli"
1146
+ },
1147
+ timeout=10
1148
+ )
1149
+
1150
+ if response.status_code == 200:
1151
+ data = response.json()
1152
+ runs = data.get("workflow_runs", [])
1153
+
1154
+ # Find the most recent completed run for main branch
1155
+ main_runs = [
1156
+ run for run in runs
1157
+ if run.get("head_branch") == "main" and run.get("status") == "completed"
1158
+ ]
1159
+
1160
+ if main_runs:
1161
+ latest_run = main_runs[0]
1162
+ passing = latest_run.get("conclusion") == "success"
1163
+ url = latest_run.get("html_url")
1164
+ return (passing, url)
1165
+
1166
+ # If we can't check CI, don't block the update
1167
+ return (True, None)
1168
+ except Exception:
1169
+ # On error, don't block the update
1170
+ return (True, None)
1171
+
1172
+
1132
1173
  @self_app.command()
1133
1174
  @click.option("--check", is_flag=True, help="Only check for updates, don't install")
1134
1175
  @click.option("--pre", is_flag=True, help="Include pre-release versions")
1135
1176
  @click.option("--yes", "-y", is_flag=True, help="Skip confirmation prompt")
1136
- def update(check: bool, pre: bool, yes: bool):
1177
+ @click.option("--skip-ci-check", is_flag=True, help="Skip CI status check and install anyway")
1178
+ def update(check: bool, pre: bool, yes: bool, skip_ci_check: bool):
1137
1179
  """🔄 Check for and install mcli updates from PyPI"""
1138
1180
  import subprocess
1139
1181
  import sys
@@ -1215,6 +1257,21 @@ def update(check: bool, pre: bool, yes: bool):
1215
1257
  console.print("[yellow]Update cancelled[/yellow]")
1216
1258
  return
1217
1259
 
1260
+ # Check CI status before installing (unless skipped)
1261
+ if not skip_ci_check:
1262
+ console.print("[cyan]🔍 Checking CI status...[/cyan]")
1263
+ ci_passing, ci_url = check_ci_status(latest_version)
1264
+
1265
+ if not ci_passing:
1266
+ console.print("[red]✗ CI build is failing for the latest version[/red]")
1267
+ if ci_url:
1268
+ console.print(f"[yellow] View CI status: {ci_url}[/yellow]")
1269
+ console.print("[yellow]⚠️ Update blocked to prevent installing a broken version[/yellow]")
1270
+ console.print("[dim] Use --skip-ci-check to install anyway (not recommended)[/dim]")
1271
+ return
1272
+ else:
1273
+ console.print("[green]✓ CI build is passing[/green]")
1274
+
1218
1275
  # Install update
1219
1276
  console.print(f"[cyan]📦 Installing mcli {latest_version}...[/cyan]")
1220
1277
 
@@ -566,6 +566,43 @@ class LightweightModelServer:
566
566
  else:
567
567
  return "distilbert-base-uncased" # Standard small model
568
568
 
569
+ def stop_server(self) -> bool:
570
+ """Stop the lightweight server"""
571
+ if not self.running:
572
+ print("⚠️ Server is not running")
573
+ return False
574
+
575
+ try:
576
+ self.running = False
577
+ print("🛑 Server stopped")
578
+ return True
579
+ except Exception as e:
580
+ print(f"❌ Error stopping server: {e}")
581
+ return False
582
+
583
+ def delete_model(self, model_key: str) -> bool:
584
+ """Delete a downloaded model"""
585
+ try:
586
+ model_dir = self.models_dir / model_key
587
+
588
+ if not model_dir.exists():
589
+ print(f"⚠️ Model '{model_key}' not found")
590
+ return False
591
+
592
+ # Remove from loaded models if present
593
+ if model_key in self.loaded_models:
594
+ del self.loaded_models[model_key]
595
+ print(f"✅ Unloaded model: {model_key}")
596
+
597
+ # Delete the model directory
598
+ shutil.rmtree(model_dir)
599
+ print(f"✅ Deleted model: {model_key}")
600
+ return True
601
+
602
+ except Exception as e:
603
+ print(f"❌ Error deleting model {model_key}: {e}")
604
+ return False
605
+
569
606
 
570
607
  def create_simple_client():
571
608
  """Create a simple client script for testing"""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcli-framework
3
- Version: 7.0.0
3
+ Version: 7.0.4
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>
@@ -39,6 +39,7 @@ src/mcli/chat/enhanced_chat.py
39
39
  src/mcli/chat/system_controller.py
40
40
  src/mcli/chat/system_integration.py
41
41
  src/mcli/lib/lib.py
42
+ src/mcli/lib/paths.py
42
43
  src/mcli/lib/api/api.py
43
44
  src/mcli/lib/api/daemon_client.py
44
45
  src/mcli/lib/api/daemon_client_local.py
@@ -242,6 +243,7 @@ tests/test_main_app_functions.py
242
243
  tests/test_ml_auth.py
243
244
  tests/test_ml_models.py
244
245
  tests/test_ml_pipeline.py
246
+ tests/test_model_cmd.py
245
247
  tests/test_oi.py
246
248
  tests/test_optional_dependencies.py
247
249
  tests/test_politician_trading_integration.py