mcli-framework 7.12.2__tar.gz → 7.12.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 (330) hide show
  1. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/PKG-INFO +1 -1
  2. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/pyproject.toml +3 -1
  3. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/app/commands_cmd.py +30 -26
  4. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/app/completion_helpers.py +5 -5
  5. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/app/init_cmd.py +10 -10
  6. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/app/lock_cmd.py +29 -24
  7. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/app/main.py +2 -8
  8. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/app/model/model.py +5 -10
  9. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/app/store_cmd.py +8 -8
  10. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/app/video/video.py +1 -14
  11. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/chat/chat.py +90 -108
  12. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/chat/command_rag.py +0 -4
  13. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/chat/enhanced_chat.py +32 -41
  14. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/chat/system_controller.py +37 -37
  15. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/chat/system_integration.py +4 -5
  16. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/cli.py +2 -3
  17. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/api/api.py +4 -9
  18. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/api/daemon_client.py +19 -20
  19. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/api/daemon_client_local.py +1 -3
  20. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/api/daemon_decorator.py +6 -6
  21. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/api/mcli_decorators.py +4 -8
  22. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/auth/auth.py +4 -5
  23. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/auth/mcli_manager.py +7 -12
  24. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/auth/token_util.py +5 -5
  25. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/config/config.py +0 -1
  26. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/custom_commands.py +1 -1
  27. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/discovery/command_discovery.py +15 -15
  28. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/erd/erd.py +7 -7
  29. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/files/files.py +1 -1
  30. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/fs/fs.py +12 -13
  31. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/lib.py +0 -1
  32. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/logger/logger.py +7 -10
  33. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/performance/optimizer.py +25 -27
  34. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/performance/rust_bridge.py +22 -27
  35. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/performance/uvloop_config.py +0 -1
  36. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/pickles/pickles.py +0 -2
  37. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/secrets/commands.py +0 -2
  38. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/secrets/manager.py +0 -1
  39. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/secrets/repl.py +2 -3
  40. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/secrets/store.py +1 -2
  41. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/services/data_pipeline.py +34 -34
  42. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/services/lsh_client.py +38 -40
  43. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/shell/shell.py +2 -2
  44. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/ui/styling.py +0 -1
  45. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/ui/visual_effects.py +33 -41
  46. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/watcher/watcher.py +0 -1
  47. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/api/app.py +8 -9
  48. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/api/middleware.py +10 -10
  49. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/api/routers/admin_router.py +3 -3
  50. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/api/routers/auth_router.py +17 -18
  51. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/api/routers/backtest_router.py +2 -2
  52. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/api/routers/data_router.py +2 -2
  53. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/api/routers/model_router.py +14 -15
  54. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/api/routers/monitoring_router.py +2 -2
  55. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/api/routers/portfolio_router.py +2 -2
  56. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/api/routers/prediction_router.py +10 -9
  57. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/api/routers/trade_router.py +2 -2
  58. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/api/routers/websocket_router.py +6 -7
  59. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/api/schemas.py +2 -2
  60. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/auth/auth_manager.py +22 -23
  61. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/auth/models.py +17 -17
  62. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/auth/permissions.py +17 -17
  63. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/backtesting/backtest_engine.py +31 -35
  64. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/backtesting/performance_metrics.py +12 -14
  65. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/backtesting/run.py +1 -2
  66. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/cache.py +35 -36
  67. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/cli/main.py +21 -24
  68. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/config/settings.py +28 -29
  69. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/configs/dvc_config.py +14 -15
  70. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/configs/mlflow_config.py +12 -13
  71. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/configs/mlops_manager.py +19 -21
  72. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/dashboard/app.py +20 -30
  73. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/dashboard/app_supabase.py +16 -19
  74. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/dashboard/app_training.py +11 -14
  75. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/dashboard/cli.py +2 -2
  76. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/dashboard/common.py +2 -3
  77. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/dashboard/components/charts.py +13 -11
  78. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/dashboard/components/metrics.py +7 -7
  79. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/dashboard/components/tables.py +12 -9
  80. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/dashboard/overview.py +2 -2
  81. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/dashboard/pages/cicd.py +15 -18
  82. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/dashboard/pages/debug_dependencies.py +7 -7
  83. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/dashboard/pages/monte_carlo_predictions.py +11 -18
  84. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/dashboard/pages/predictions_enhanced.py +24 -32
  85. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/dashboard/pages/scrapers_and_logs.py +22 -24
  86. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/dashboard/pages/test_portfolio.py +3 -6
  87. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/dashboard/pages/trading.py +16 -18
  88. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/dashboard/pages/workflows.py +20 -30
  89. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/dashboard/utils.py +9 -9
  90. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/dashboard/warning_suppression.py +3 -3
  91. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/data_ingestion/api_connectors.py +41 -46
  92. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/data_ingestion/data_pipeline.py +36 -46
  93. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/data_ingestion/stream_processor.py +43 -46
  94. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/database/migrations/env.py +2 -2
  95. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/database/models.py +22 -24
  96. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/database/session.py +14 -14
  97. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/experimentation/ab_testing.py +45 -46
  98. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/features/ensemble_features.py +22 -27
  99. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/features/recommendation_engine.py +30 -30
  100. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/features/stock_features.py +29 -32
  101. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/features/test_feature_engineering.py +10 -11
  102. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/logging.py +4 -4
  103. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/mlops/data_versioning.py +29 -30
  104. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/mlops/experiment_tracker.py +24 -24
  105. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/mlops/model_serving.py +31 -34
  106. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/mlops/pipeline_orchestrator.py +27 -35
  107. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/models/base_models.py +23 -23
  108. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/models/ensemble_models.py +31 -31
  109. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/models/recommendation_models.py +18 -19
  110. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/models/test_models.py +14 -16
  111. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/monitoring/drift_detection.py +32 -36
  112. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/monitoring/metrics.py +2 -2
  113. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/optimization/optimize.py +1 -2
  114. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/optimization/portfolio_optimizer.py +30 -32
  115. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/preprocessing/data_cleaners.py +22 -23
  116. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/preprocessing/feature_extractors.py +23 -26
  117. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/preprocessing/ml_pipeline.py +23 -23
  118. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/preprocessing/test_preprocessing.py +7 -8
  119. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/scripts/populate_sample_data.py +0 -4
  120. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/serving/serve.py +1 -2
  121. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/tasks.py +17 -17
  122. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/tests/test_integration.py +29 -30
  123. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/tests/test_training_dashboard.py +21 -21
  124. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/trading/migrations.py +5 -5
  125. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/trading/models.py +21 -23
  126. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/trading/paper_trading.py +16 -13
  127. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/trading/risk_management.py +17 -18
  128. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/trading/trading_service.py +25 -28
  129. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/training/train.py +0 -1
  130. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/public/oi/oi.py +1 -2
  131. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/self/completion_cmd.py +6 -10
  132. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/self/logs_cmd.py +19 -24
  133. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/self/migrate_cmd.py +22 -20
  134. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/self/redis_cmd.py +10 -11
  135. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/self/self_cmd.py +10 -18
  136. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/self/store_cmd.py +10 -12
  137. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/self/visual_cmd.py +9 -14
  138. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/self/zsh_cmd.py +2 -4
  139. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/daemon/async_command_database.py +23 -24
  140. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/daemon/async_process_manager.py +27 -29
  141. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/daemon/client.py +27 -33
  142. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/daemon/daemon.py +32 -36
  143. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/daemon/enhanced_daemon.py +24 -33
  144. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/daemon/process_cli.py +11 -12
  145. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/daemon/process_manager.py +23 -26
  146. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/daemon/test_daemon.py +4 -5
  147. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/dashboard/dashboard_cmd.py +0 -1
  148. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/doc_convert.py +15 -17
  149. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/gcloud/gcloud.py +11 -8
  150. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/git_commit/ai_service.py +14 -15
  151. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/lsh_integration.py +9 -11
  152. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/model_service/client.py +26 -31
  153. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/model_service/download_and_run_efficient_models.py +10 -14
  154. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/model_service/lightweight_embedder.py +25 -35
  155. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/model_service/lightweight_model_server.py +26 -32
  156. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/model_service/lightweight_test.py +7 -10
  157. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/model_service/model_service.py +80 -91
  158. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/model_service/ollama_efficient_runner.py +14 -18
  159. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/model_service/openai_adapter.py +23 -23
  160. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/model_service/pdf_processor.py +21 -26
  161. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/model_service/test_efficient_runner.py +12 -16
  162. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/model_service/test_example.py +11 -13
  163. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/model_service/test_integration.py +3 -5
  164. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/model_service/test_new_features.py +7 -8
  165. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/notebook/converter.py +1 -1
  166. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/notebook/notebook_cmd.py +5 -6
  167. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/notebook/schema.py +0 -1
  168. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/notebook/validator.py +7 -3
  169. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/openai/openai.py +1 -2
  170. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/registry/registry.py +4 -1
  171. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/repo/repo.py +6 -7
  172. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/scheduler/cron_parser.py +16 -19
  173. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/scheduler/job.py +10 -10
  174. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/scheduler/monitor.py +15 -15
  175. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/scheduler/persistence.py +17 -18
  176. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/scheduler/scheduler.py +37 -38
  177. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/sync/test_cmd.py +0 -1
  178. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/wakatime/wakatime.py +1 -2
  179. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli_framework.egg-info/PKG-INFO +1 -1
  180. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli_framework.egg-info/SOURCES.txt +0 -3
  181. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/cli/test_all_commands.py +0 -1
  182. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/cli/test_app_logs_cmd.py +1 -2
  183. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/cli/test_app_redis_cmd.py +2 -3
  184. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/cli/test_logs_cmd.py +0 -1
  185. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/cli/test_main_app.py +2 -3
  186. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/cli/test_model_cmd.py +4 -4
  187. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/cli/test_self_cmd.py +1 -6
  188. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/cli/test_self_cmd_plugins.py +0 -1
  189. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/cli/test_self_cmd_utilities.py +0 -4
  190. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/cli/test_workflow_file.py +2 -2
  191. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/cli/test_workflow_gcloud.py +4 -5
  192. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/cli/test_workflow_registry.py +1 -1
  193. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/demo_generate_graph.py +1 -3
  194. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/demo_hierarchical_transform.py +0 -2
  195. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/e2e/test_complete_workflows.py +2 -3
  196. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/e2e/test_model_workflow.py +1 -1
  197. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/e2e/test_new_user_workflow.py +0 -1
  198. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/fixtures/chat_fixtures.py +1 -1
  199. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/fixtures/cli_fixtures.py +0 -2
  200. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/fixtures/data_fixtures.py +0 -2
  201. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/fixtures/db_fixtures.py +1 -2
  202. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/fixtures/model_fixtures.py +1 -1
  203. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/integration/test_agent.py +0 -1
  204. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/integration/test_chat_client.py +2 -4
  205. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/integration/test_chat_system.py +0 -2
  206. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/integration/test_daemon_server.py +2 -3
  207. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/integration/test_e2e_dashboard_lsh_supabase.py +0 -2
  208. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/integration/test_flask_webapp.py +0 -1
  209. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/integration/test_gcloud_services.py +0 -1
  210. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/integration/test_ml_models.py +2 -3
  211. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/integration/test_ml_pipeline.py +3 -4
  212. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/integration/test_module_imports.py +0 -3
  213. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/integration/test_oi_service.py +0 -1
  214. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/integration/test_repo_operations.py +1 -1
  215. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/integration/test_scheduler_integration.py +1 -5
  216. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/integration/test_service_registry.py +1 -4
  217. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/integration/test_wakatime_api.py +0 -1
  218. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/integration/test_webapp_full.py +0 -1
  219. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/integration/test_workflow.py +0 -1
  220. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/integration/test_workflow_commands.py +0 -1
  221. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/run_tests.py +0 -1
  222. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/test_harness.py +0 -1
  223. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_api_utils.py +0 -3
  224. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_async_process_manager.py +1 -0
  225. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_auth_modules.py +1 -4
  226. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_bug_fixes.py +0 -1
  227. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_config.py +1 -6
  228. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_custom_commands.py +1 -4
  229. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_custom_commands_filtering.py +0 -1
  230. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_daemon_api.py +1 -1
  231. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_dashboard_components.py +3 -4
  232. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_dashboard_pages.py +5 -5
  233. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_doc_convert_workflow.py +0 -26
  234. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_emulator_workflow.py +0 -37
  235. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_erd_generic.py +1 -1
  236. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_lib_auth.py +0 -1
  237. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_lib_utils.py +0 -1
  238. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_logger.py +0 -3
  239. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_ml_preprocessing.py +0 -2
  240. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_paths.py +1 -2
  241. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_pdf_compress.py +1 -8
  242. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_prediction_engine.py +0 -1
  243. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_regression.py +0 -1
  244. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_scheduler.py +3 -7
  245. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_scheduler_cron_parser.py +1 -2
  246. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_scheduler_job.py +1 -4
  247. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_scheduler_monitor.py +1 -4
  248. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_scheduler_persistence.py +1 -5
  249. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_self_update.py +0 -1
  250. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_store_cmd.py +20 -50
  251. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_supabase_connection.py +1 -3
  252. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_supabase_pagination.py +1 -1
  253. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_toml_utils.py +0 -1
  254. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_trading_imports.py +1 -1
  255. mcli_framework-7.12.2/tests/cli/test_self_cmd_commands.py +0 -197
  256. mcli_framework-7.12.2/tests/integration/test_lsh_client.py +0 -425
  257. mcli_framework-7.12.2/tests/integration/test_lsh_service.py +0 -316
  258. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/.github/dependabot.yml +0 -0
  259. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/.github/workflows/build.yml +0 -0
  260. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/.github/workflows/ci.yml +0 -0
  261. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/.github/workflows/codeql.yml +0 -0
  262. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/.github/workflows/main_mcli.yml +0 -0
  263. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/.github/workflows/ml-pipeline.yml +0 -0
  264. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/.github/workflows/publish-self-hosted.yml +0 -0
  265. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/.github/workflows/publish.yml +0 -0
  266. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/.github/workflows/release.yml +0 -0
  267. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/.github/workflows/security.yml +0 -0
  268. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/.github/workflows/test.yml +0 -0
  269. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/LICENSE +0 -0
  270. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/MANIFEST.in +0 -0
  271. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/README.md +0 -0
  272. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/mcli_rust/Cargo.toml +0 -0
  273. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/mcli_rust/src/command_parser.rs +0 -0
  274. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/mcli_rust/src/file_watcher.rs +0 -0
  275. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/mcli_rust/src/lib.rs +0 -0
  276. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/mcli_rust/src/process_manager.rs +0 -0
  277. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/mcli_rust/src/tfidf.rs +0 -0
  278. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/setup.cfg +0 -0
  279. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/app/model_cmd.py +0 -0
  280. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/config.toml +0 -0
  281. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/auth/aws_manager.py +0 -0
  282. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/auth/azure_manager.py +0 -0
  283. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/auth/credential_manager.py +0 -0
  284. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/auth/gcp_manager.py +0 -0
  285. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/auth/key_manager.py +0 -0
  286. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/auth/token_manager.py +0 -0
  287. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/discovery/__init__.py +0 -0
  288. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/erd/generate_graph.py +0 -0
  289. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/optional_deps.py +0 -0
  290. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/paths.py +0 -0
  291. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/search/cached_vectorizer.py +0 -0
  292. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/services/redis_service.py +0 -0
  293. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/lib/toml/toml.py +0 -0
  294. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/dashboard/app_integrated.py +0 -0
  295. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/dashboard/pages/gravity_viz.py +0 -0
  296. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/dashboard/streamlit_extras_utils.py +0 -0
  297. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/dashboard/styles.py +0 -0
  298. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/predictions/monte_carlo.py +0 -0
  299. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/predictions/prediction_engine.py +0 -0
  300. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/trading/alpaca_client.py +0 -0
  301. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/ml/training/train_model.py +0 -0
  302. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/mygroup/test_cmd.py +0 -0
  303. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/public/public.py +0 -0
  304. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/self/test_cmd.py +0 -0
  305. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/daemon/daemon_api.py +0 -0
  306. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/docker/docker.py +0 -0
  307. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/gcloud/config.toml +0 -0
  308. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/secrets/secrets_cmd.py +0 -0
  309. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli/workflow/workflow.py +0 -0
  310. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli_framework.egg-info/dependency_links.txt +0 -0
  311. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli_framework.egg-info/entry_points.txt +0 -0
  312. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli_framework.egg-info/requires.txt +0 -0
  313. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/src/mcli_framework.egg-info/top_level.txt +0 -0
  314. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/conftest.py +0 -0
  315. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/e2e/test_update_workflow.py +0 -0
  316. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/integration/test_ml_auth.py +0 -0
  317. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/integration/test_ml_data_pipeline.py +0 -0
  318. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/integration/test_supabase_live_connection.py +0 -0
  319. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/integration/test_video_processing.py +0 -0
  320. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/test_openai_adapter.py +0 -0
  321. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_dashboard_functions.py +0 -0
  322. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_dependencies.py +0 -0
  323. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_erd_generation.py +0 -0
  324. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_erd_imports.py +0 -0
  325. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_git_commit_workflow.py +0 -0
  326. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_lib_files.py +0 -0
  327. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_optional_deps.py +0 -0
  328. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_ui_rich.py +0 -0
  329. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/tests/unit/test_uv_compat.py +0 -0
  330. {mcli_framework-7.12.2 → mcli_framework-7.12.4}/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: 7.12.2
3
+ Version: 7.12.4
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 = "7.12.2"
3
+ version = "7.12.4"
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.9"
@@ -401,12 +401,14 @@ testpaths = ["tests"]
401
401
  python_files = ["test_*.py", "*_test.py"]
402
402
  python_classes = ["Test*"]
403
403
  python_functions = ["test_*"]
404
+ asyncio_mode = "auto"
404
405
  markers = [
405
406
  "slow: marks tests as slow (deselect with '-m \"not slow\"')",
406
407
  "integration: marks tests as integration tests",
407
408
  "unit: marks tests as unit tests",
408
409
  "api: marks tests as API tests",
409
410
  "cli: marks tests as CLI tests",
411
+ "asyncio: marks tests as async tests",
410
412
  ]
411
413
  filterwarnings = [
412
414
  "error",
@@ -4,7 +4,6 @@ import inspect
4
4
  import json
5
5
  import os
6
6
  import re
7
- import shutil
8
7
  import subprocess
9
8
  import tempfile
10
9
  from datetime import datetime
@@ -12,16 +11,13 @@ from pathlib import Path
12
11
  from typing import Any, Dict, List, Optional
13
12
 
14
13
  import click
15
- import tomli
16
- from rich.console import Console
17
14
  from rich.prompt import Prompt
18
- from rich.table import Table
19
15
 
20
16
  from mcli.lib.api.daemon_client import get_daemon_client
21
17
  from mcli.lib.custom_commands import get_command_manager
22
18
  from mcli.lib.discovery.command_discovery import get_command_discovery
23
19
  from mcli.lib.logger.logger import get_logger
24
- from mcli.lib.ui.styling import console, error, info, success, warning
20
+ from mcli.lib.ui.styling import console
25
21
 
26
22
  logger = get_logger(__name__)
27
23
 
@@ -78,7 +74,7 @@ def collect_commands() -> List[Dict[str, Any]]:
78
74
  streamlit_logger.setLevel(original_level)
79
75
 
80
76
  # Extract command and group objects
81
- for name, obj in inspect.getmembers(module):
77
+ for _name, obj in inspect.getmembers(module):
82
78
  # Handle Click commands and groups
83
79
  if isinstance(obj, click.Command):
84
80
  if isinstance(obj, click.Group):
@@ -118,7 +114,7 @@ def collect_commands() -> List[Dict[str, Any]]:
118
114
 
119
115
 
120
116
  def get_current_command_state():
121
- """Collect all command metadata (names, groups, etc.)"""
117
+ """Collect all command metadata (names, groups, etc.)."""
122
118
  return collect_commands()
123
119
 
124
120
 
@@ -134,7 +130,11 @@ def load_lockfile():
134
130
  """Load the command state lockfile."""
135
131
  if LOCKFILE_PATH.exists():
136
132
  with open(LOCKFILE_PATH, "r") as f:
137
- return json.load(f)
133
+ data = json.load(f)
134
+ # Handle both old format (array) and new format (object with "states" key)
135
+ if isinstance(data, dict) and "states" in data:
136
+ return data["states"]
137
+ return data if isinstance(data, list) else []
138
138
  return []
139
139
 
140
140
 
@@ -153,11 +153,19 @@ def append_lockfile(new_state):
153
153
 
154
154
 
155
155
  def find_state_by_hash(hash_value):
156
- """Find a state by its hash value."""
156
+ """Find a state by its hash value (supports partial hash matching)."""
157
157
  states = load_lockfile()
158
+ matches = []
158
159
  for state in states:
159
- if state["hash"] == hash_value:
160
- return state
160
+ # Support both full hash and partial hash (prefix) matching
161
+ if state["hash"] == hash_value or state["hash"].startswith(hash_value):
162
+ matches.append(state)
163
+
164
+ if len(matches) == 1:
165
+ return matches[0]
166
+ elif len(matches) > 1:
167
+ # Ambiguous - multiple matches
168
+ return None
161
169
  return None
162
170
 
163
171
 
@@ -175,7 +183,6 @@ def restore_command_state(hash_value):
175
183
  @click.group(name="workflow")
176
184
  def workflow():
177
185
  """Manage workflows - create, edit, import, export workflow commands."""
178
- pass
179
186
 
180
187
 
181
188
  # For backward compatibility, keep commands as an alias
@@ -397,7 +404,7 @@ def search_commands(query: str, daemon_only: bool, as_json: bool, is_global: boo
397
404
  @click.option("--json", "as_json", is_flag=True, help="Output as JSON")
398
405
  @click.option("--timeout", type=int, help="Execution timeout in seconds")
399
406
  def execute_command(command_name: str, args: tuple, as_json: bool, timeout: Optional[int]):
400
- """Execute a command by name"""
407
+ """Execute a command by name."""
401
408
  try:
402
409
  client = get_daemon_client()
403
410
  result = client.execute_command(command_name=command_name, args=list(args), timeout=timeout)
@@ -425,7 +432,7 @@ def execute_command(command_name: str, args: tuple, as_json: bool, timeout: Opti
425
432
  @click.argument("command_name")
426
433
  @click.option("--json", "as_json", is_flag=True, help="Output as JSON")
427
434
  def command_info(command_name: str, as_json: bool):
428
- """Show detailed information about a command"""
435
+ """Show detailed information about a command."""
429
436
  try:
430
437
  client = get_daemon_client()
431
438
  result = client.list_commands(all=True)
@@ -466,7 +473,7 @@ def command_info(command_name: str, as_json: bool):
466
473
  console.print(f"Last Executed: {command['last_executed']}")
467
474
 
468
475
  if command.get("code"):
469
- console.print(f"\n[bold]Code:[/bold]")
476
+ console.print("\n[bold]Code:[/bold]")
470
477
  console.print(f"```{command['language']}")
471
478
  console.print(command["code"])
472
479
  console.print("```")
@@ -703,7 +710,7 @@ logger = get_logger()
703
710
  return None
704
711
  finally:
705
712
  # Clean up temporary file
706
- try:
713
+ try: # noqa: SIM105
707
714
  os.unlink(temp_file_path)
708
715
  except OSError:
709
716
  pass
@@ -807,7 +814,7 @@ def add_command(command_name, group, description, template, language, shell, is_
807
814
  language = language.lower()
808
815
 
809
816
  # Determine shell type for shell commands
810
- if language == "shell":
817
+ if language == "shell": # noqa: SIM102
811
818
  if not shell:
812
819
  # Default to $SHELL environment variable or bash
813
820
  shell_env = os.environ.get("SHELL", "/bin/bash")
@@ -890,7 +897,7 @@ def add_command(command_name, group, description, template, language, shell, is_
890
897
  )
891
898
  else:
892
899
  console.print(
893
- f"[dim]This command is local to this git repository. Use --global/-g to create global commands.[/dim]"
900
+ "[dim]This command is local to this git repository. Use --global/-g to create global commands.[/dim]"
894
901
  )
895
902
 
896
903
  return 0
@@ -988,7 +995,7 @@ def export_commands(target, script, standalone, output, is_global):
988
995
  return 1
989
996
 
990
997
  # Add standalone wrapper if requested
991
- if standalone:
998
+ if standalone: # noqa: SIM102
992
999
  # Check if already has if __name__ == '__main__'
993
1000
  if "if __name__" not in code:
994
1001
  code += "\n\nif __name__ == '__main__':\n app()\n"
@@ -1153,7 +1160,7 @@ def import_commands(source, script, overwrite, name, group, description, interac
1153
1160
  try:
1154
1161
  tree = ast.parse(code)
1155
1162
  description = ast.get_docstring(tree) or f"Imported from {source_path.name}"
1156
- except:
1163
+ except Exception:
1157
1164
  description = f"Imported from {source_path.name}"
1158
1165
 
1159
1166
  # Save as JSON command
@@ -1199,9 +1206,9 @@ def import_commands(source, script, overwrite, name, group, description, interac
1199
1206
  f"[yellow]Skipped {failed_count} command(s) (already exist, use --overwrite to replace)[/yellow]"
1200
1207
  )
1201
1208
  console.print("Skipped commands:")
1202
- for name, success in results.items():
1203
- if not success:
1204
- console.print(f" - {name}")
1209
+ for cmd_name, cmd_success in results.items():
1210
+ if not cmd_success:
1211
+ console.print(f" - {cmd_name}")
1205
1212
 
1206
1213
  return 0
1207
1214
 
@@ -1357,9 +1364,6 @@ def extract_workflow_commands(output):
1357
1364
  }
1358
1365
 
1359
1366
  # Create a template based on command type
1360
- # Replace hyphens with underscores for valid Python function names
1361
- safe_name = cmd_name.replace("-", "_")
1362
-
1363
1367
  if isinstance(cmd_obj, click.Group):
1364
1368
  # For groups, create a template
1365
1369
  command_info[
@@ -2,7 +2,7 @@
2
2
  Completion helpers for MCLI that provide tab completion without loading heavy modules
3
3
  """
4
4
 
5
- from typing import Any, Dict, List
5
+ from typing import List
6
6
 
7
7
  import click
8
8
  from click.shell_completion import CompletionItem
@@ -103,7 +103,7 @@ LAZY_COMMAND_COMPLETIONS = {
103
103
 
104
104
 
105
105
  def get_completion_items(cmd_path: List[str], incomplete: str = "") -> List[CompletionItem]:
106
- """Get completion items for a given command path without loading modules"""
106
+ """Get completion items for a given command path without loading modules."""
107
107
  items = []
108
108
 
109
109
  # Navigate to the completion data for this path
@@ -131,7 +131,7 @@ def get_completion_items(cmd_path: List[str], incomplete: str = "") -> List[Comp
131
131
 
132
132
 
133
133
  class CompletionAwareLazyGroup(click.Group):
134
- """A Click group that provides completion without loading modules"""
134
+ """A Click group that provides completion without loading modules."""
135
135
 
136
136
  def __init__(self, name, import_path, *args, **kwargs):
137
137
  self.import_path = import_path
@@ -147,7 +147,7 @@ class CompletionAwareLazyGroup(click.Group):
147
147
  module_path, attr_name = self.import_path.rsplit(".", 1)
148
148
  module = importlib.import_module(module_path)
149
149
  self._loaded_group = getattr(module, attr_name)
150
- except Exception as e:
150
+ except Exception:
151
151
  # Return a dummy group that shows an error
152
152
  def error_callback():
153
153
  click.echo(f"Error: Command group {self.name} is not available")
@@ -201,5 +201,5 @@ class CompletionAwareLazyGroup(click.Group):
201
201
  def create_completion_aware_lazy_group(
202
202
  name: str, import_path: str, help_text: str = None
203
203
  ) -> CompletionAwareLazyGroup:
204
- """Create a completion-aware lazy group"""
204
+ """Create a completion-aware lazy group."""
205
205
  return CompletionAwareLazyGroup(name, import_path, help=help_text)
@@ -1,11 +1,11 @@
1
1
  """
2
2
  Top-level initialization and teardown commands for MCLI.
3
3
  """
4
+
4
5
  import json
5
6
  import shutil
6
7
  import subprocess
7
8
  from datetime import datetime
8
- from pathlib import Path
9
9
 
10
10
  import click
11
11
  from rich.prompt import Prompt
@@ -56,12 +56,12 @@ def init(is_global, git, force):
56
56
  lockfile_path = workflows_dir / "commands.lock.json"
57
57
 
58
58
  # Check if already initialized
59
- if workflows_dir.exists() and not force:
59
+ if workflows_dir.exists() and not force: # noqa: SIM102
60
60
  if lockfile_path.exists():
61
61
  console.print(
62
62
  f"[yellow]Workflows directory already initialized at:[/yellow] {workflows_dir}"
63
63
  )
64
- console.print(f"[dim]Use --force to reinitialize[/dim]")
64
+ console.print("[dim]Use --force to reinitialize[/dim]")
65
65
 
66
66
  should_continue = Prompt.ask("Continue anyway?", choices=["y", "n"], default="n")
67
67
  if should_continue.lower() != "y":
@@ -74,7 +74,7 @@ def init(is_global, git, force):
74
74
  # Create README.md
75
75
  readme_path = workflows_dir / "README.md"
76
76
  if not readme_path.exists() or force:
77
- scope = "local" if in_git_repo else "global"
77
+ "local" if in_git_repo else "global"
78
78
  scope_desc = f"for repository: {git_root.name}" if in_git_repo else "globally"
79
79
 
80
80
  readme_content = f"""# MCLI Custom Workflows
@@ -203,13 +203,13 @@ Thumbs.db
203
203
  .idea/
204
204
  """
205
205
  gitignore_path.write_text(gitignore_content)
206
- console.print(f"[green]✓[/green] Created .gitignore")
206
+ console.print("[green]✓[/green] Created .gitignore")
207
207
 
208
208
  # Initialize git if requested
209
209
  if git and not (workflows_dir / ".git").exists():
210
210
  try:
211
211
  subprocess.run(["git", "init"], cwd=workflows_dir, check=True, capture_output=True)
212
- console.print(f"[green]✓[/green] Initialized git repository in workflows directory")
212
+ console.print("[green]✓[/green] Initialized git repository in workflows directory")
213
213
 
214
214
  # Create initial commit
215
215
  subprocess.run(["git", "add", "."], cwd=workflows_dir, check=True, capture_output=True)
@@ -219,12 +219,12 @@ Thumbs.db
219
219
  check=True,
220
220
  capture_output=True,
221
221
  )
222
- console.print(f"[green]✓[/green] Created initial commit")
222
+ console.print("[green]✓[/green] Created initial commit")
223
223
 
224
224
  except subprocess.CalledProcessError as e:
225
225
  console.print(f"[yellow]⚠[/yellow] Git initialization failed: {e}")
226
226
  except FileNotFoundError:
227
- console.print(f"[yellow]⚠[/yellow] Git not found. Skipping git initialization.")
227
+ console.print("[yellow]⚠[/yellow] Git not found. Skipping git initialization.")
228
228
 
229
229
  # Summary
230
230
  from rich.table import Table
@@ -258,11 +258,11 @@ Thumbs.db
258
258
 
259
259
  if in_git_repo:
260
260
  console.print(
261
- f"[dim]Tip: Workflows are local to this repository. Use --global for user-wide workflows.[/dim]"
261
+ "[dim]Tip: Workflows are local to this repository. Use --global for user-wide workflows.[/dim]"
262
262
  )
263
263
  else:
264
264
  console.print(
265
- f"[dim]Tip: Use workflows in any git repository, or create local ones with 'mcli init' inside repos.[/dim]"
265
+ "[dim]Tip: Use workflows in any git repository, or create local ones with 'mcli init' inside repos.[/dim]"
266
266
  )
267
267
 
268
268
  return 0
@@ -2,6 +2,7 @@
2
2
  Top-level lock management commands for MCLI.
3
3
  Manages workflow lockfile and verification.
4
4
  """
5
+
5
6
  import hashlib
6
7
  import json
7
8
  from datetime import datetime
@@ -24,7 +25,11 @@ def load_lockfile():
24
25
  """Load the command state lockfile."""
25
26
  if LOCKFILE_PATH.exists():
26
27
  with open(LOCKFILE_PATH, "r") as f:
27
- return json.load(f)
28
+ data = json.load(f)
29
+ # Handle both old format (array) and new format (object with "states" key)
30
+ if isinstance(data, dict) and "states" in data:
31
+ return data["states"]
32
+ return data if isinstance(data, list) else []
28
33
  return []
29
34
 
30
35
 
@@ -43,11 +48,19 @@ def append_lockfile(new_state):
43
48
 
44
49
 
45
50
  def find_state_by_hash(hash_value):
46
- """Find a state by its hash value."""
51
+ """Find a state by its hash value (supports partial hash matching)."""
47
52
  states = load_lockfile()
53
+ matches = []
48
54
  for state in states:
49
- if state["hash"] == hash_value:
50
- return state
55
+ # Support both full hash and partial hash (prefix) matching
56
+ if state["hash"] == hash_value or state["hash"].startswith(hash_value):
57
+ matches.append(state)
58
+
59
+ if len(matches) == 1:
60
+ return matches[0]
61
+ elif len(matches) > 1:
62
+ # Ambiguous - multiple matches
63
+ return None
51
64
  return None
52
65
 
53
66
 
@@ -63,7 +76,7 @@ def restore_command_state(hash_value):
63
76
 
64
77
 
65
78
  def get_current_command_state():
66
- """Collect all command metadata (names, groups, etc.)"""
79
+ """Collect all command metadata (names, groups, etc.)."""
67
80
  # Import here to avoid circular imports
68
81
  import importlib
69
82
  import inspect
@@ -110,7 +123,7 @@ def get_current_command_state():
110
123
  streamlit_logger.setLevel(original_level)
111
124
 
112
125
  # Extract command and group objects
113
- for name, obj in inspect.getmembers(module):
126
+ for _name, obj in inspect.getmembers(module):
114
127
  # Handle Click commands and groups
115
128
  if isinstance(obj, click.Command):
116
129
  if isinstance(obj, click.Group):
@@ -160,7 +173,6 @@ def hash_command_state(commands):
160
173
  @click.group(name="lock")
161
174
  def lock():
162
175
  """Manage workflow lockfile and verification."""
163
- pass
164
176
 
165
177
 
166
178
  @lock.command("list")
@@ -229,9 +241,7 @@ def write_state(json_file):
229
241
  @click.option(
230
242
  "--global", "-g", "is_global", is_flag=True, help="Verify global commands instead of local"
231
243
  )
232
- @click.option(
233
- "--code", "-c", is_flag=True, help="Also validate that workflow code is executable"
234
- )
244
+ @click.option("--code", "-c", is_flag=True, help="Also validate that workflow code is executable")
235
245
  def verify_commands(is_global, code):
236
246
  """
237
247
  Verify that custom commands match the lockfile and optionally validate code.
@@ -291,20 +301,13 @@ def verify_commands(is_global, code):
291
301
  success = manager.register_command_with_click(cmd_data, temp_group)
292
302
 
293
303
  if not success or not temp_group.commands.get(cmd_name):
294
- invalid_workflows.append({
295
- "name": cmd_name,
296
- "reason": "Code does not define a valid Click command"
297
- })
304
+ invalid_workflows.append(
305
+ {"name": cmd_name, "reason": "Code does not define a valid Click command"}
306
+ )
298
307
  except SyntaxError as e:
299
- invalid_workflows.append({
300
- "name": cmd_name,
301
- "reason": f"Syntax error: {e}"
302
- })
308
+ invalid_workflows.append({"name": cmd_name, "reason": f"Syntax error: {e}"})
303
309
  except Exception as e:
304
- invalid_workflows.append({
305
- "name": cmd_name,
306
- "reason": f"Failed to load: {e}"
307
- })
310
+ invalid_workflows.append({"name": cmd_name, "reason": f"Failed to load: {e}"})
308
311
 
309
312
  if invalid_workflows:
310
313
  has_issues = True
@@ -314,8 +317,10 @@ def verify_commands(is_global, code):
314
317
  console.print(f" [red]✗[/red] {item['name']}")
315
318
  console.print(f" [dim]{item['reason']}[/dim]")
316
319
 
317
- console.print(f"\n[yellow]Fix with:[/yellow] mcli workflow edit <workflow-name>")
318
- console.print(f"[dim]Tip: Workflow code must define a Click command decorated with @click.command()[/dim]\n")
320
+ console.print("\n[yellow]Fix with:[/yellow] mcli workflow edit <workflow-name>")
321
+ console.print(
322
+ "[dim]Tip: Workflow code must define a Click command decorated with @click.command()[/dim]\n"
323
+ )
319
324
  else:
320
325
  console.print("[green]✓ All workflow code is valid[/green]\n")
321
326
 
@@ -1,19 +1,13 @@
1
- import functools
2
1
  import importlib
3
- import inspect
4
2
  import os
5
- import platform
6
- import sys
7
- from functools import lru_cache
8
- from importlib.metadata import metadata, version
9
3
  from pathlib import Path
10
4
  from typing import List, Optional
11
5
 
12
6
  import click
13
7
  import tomli
14
8
 
9
+ from mcli.lib.api.api import register_command_as_api
15
10
  from mcli.lib.logger.logger import disable_runtime_tracing, enable_runtime_tracing, get_logger
16
- from mcli.lib.ui.styling import info, success
17
11
 
18
12
  # Defer performance optimizations until needed
19
13
  _optimization_results = None
@@ -78,7 +72,7 @@ def discover_modules(base_path: Path, config_path: Optional[Path] = None) -> Lis
78
72
  logger.warning(f"Error reading config file {config_path}: {e}")
79
73
  config = {"paths": {"included_dirs": ["app", "self", "workflow", "public"]}}
80
74
  else:
81
- logger.warning(f"Config file not found, using default configuration")
75
+ logger.warning("Config file not found, using default configuration")
82
76
  config = {"paths": {"included_dirs": ["app", "self", "workflow", "public"]}}
83
77
  excluded_files = {"setup.py", "__init__.py"}
84
78
  excluded_dirs = {"resources", "models", "scripts", "private", "venv", ".venv", "__pycache__"}
@@ -2,14 +2,10 @@ import base64
2
2
  import json
3
3
  import os
4
4
  import queue
5
- import shutil
6
- import sys
7
- import tempfile
8
5
  import threading
9
6
  import time
10
7
  import uuid
11
- from pathlib import Path
12
- from typing import Any, Dict, List, Optional, Tuple
8
+ from typing import Any, Dict, List, Tuple
13
9
 
14
10
  import click
15
11
  import cv2
@@ -323,7 +319,7 @@ class ComfyUIClient:
323
319
  "subfolder": "v2v_input", # Custom subfolder for our workflow
324
320
  "type": "input",
325
321
  }
326
- response = self.session.post(f"{self.api_url}/upload/image", json=data)
322
+ self.session.post(f"{self.api_url}/upload/image", json=data)
327
323
  return filename, "v2v_input"
328
324
 
329
325
  def wait_for_prompt(self, prompt_id: str) -> Dict[str, Any]:
@@ -418,7 +414,7 @@ class ComfyUIClient:
418
414
 
419
415
  # Get the output image
420
416
  output_node = None
421
- for node_id, node_output in result["outputs"].items():
417
+ for _node_id, node_output in result["outputs"].items():
422
418
  if "images" in node_output:
423
419
  output_node = node_output
424
420
  break
@@ -678,7 +674,7 @@ class VideoToVideoGenerator:
678
674
  with click.progressbar(
679
675
  enumerate(frame_paths), length=len(frame_paths), label="Processing frames"
680
676
  ) as bar:
681
- for i, frame_path in bar:
677
+ for _i, frame_path in bar:
682
678
  processed_frame_path = self.comfyui_client.process_frame(
683
679
  frame_path=frame_path,
684
680
  prompt=prompt,
@@ -795,7 +791,6 @@ class VideoToVideoGenerator:
795
791
  @click.group(name="model")
796
792
  def model():
797
793
  """Video-to-video generation workflow using ComfyUI and Hunyuan video models."""
798
- pass
799
794
 
800
795
 
801
796
  @model.command()
@@ -1012,7 +1007,7 @@ def check_comfyui():
1012
1007
 
1013
1008
  # Check for hunyuan models
1014
1009
  hunyuan_found = False
1015
- for model_type, models in models_info.items():
1010
+ for _model_type, models in models_info.items():
1016
1011
  for model in models:
1017
1012
  if "hunyuan" in model.lower():
1018
1013
  hunyuan_found = True
@@ -2,6 +2,7 @@
2
2
  Top-level store management commands for MCLI.
3
3
  Manages command store - sync ~/.mcli/commands/ to git.
4
4
  """
5
+
5
6
  import shutil
6
7
  import subprocess
7
8
  from datetime import datetime
@@ -20,7 +21,7 @@ COMMANDS_PATH = Path.home() / ".mcli" / "commands"
20
21
 
21
22
 
22
23
  def _get_store_path() -> Path:
23
- """Get store path from config or default"""
24
+ """Get store path from config or default."""
24
25
  config_file = Path.home() / ".mcli" / "store.conf"
25
26
 
26
27
  if config_file.exists():
@@ -34,15 +35,14 @@ def _get_store_path() -> Path:
34
35
 
35
36
  @click.group(name="store")
36
37
  def store():
37
- """Manage command store - sync ~/.mcli/commands/ to git"""
38
- pass
38
+ """Manage command store - sync ~/.mcli/commands/ to git."""
39
39
 
40
40
 
41
41
  @store.command(name="init")
42
42
  @click.option("--path", "-p", type=click.Path(), help=f"Store path (default: {DEFAULT_STORE_PATH})")
43
43
  @click.option("--remote", "-r", help="Git remote URL (optional)")
44
44
  def init_store(path, remote):
45
- """Initialize command store with git"""
45
+ """Initialize command store with git."""
46
46
  store_path = Path(path) if path else DEFAULT_STORE_PATH
47
47
 
48
48
  try:
@@ -305,7 +305,7 @@ def sync_commands(message, is_global):
305
305
 
306
306
  @store.command(name="status")
307
307
  def store_status():
308
- """Show git status of command store"""
308
+ """Show git status of command store."""
309
309
  try:
310
310
  store_path = _get_store_path()
311
311
 
@@ -341,7 +341,7 @@ def store_status():
341
341
  @click.option("--remote", "-r", help="Set git remote URL")
342
342
  @click.option("--path", "-p", type=click.Path(), help="Change store path")
343
343
  def configure_store(remote, path):
344
- """Configure store settings"""
344
+ """Configure store settings."""
345
345
  try:
346
346
  store_path = _get_store_path()
347
347
 
@@ -377,7 +377,7 @@ def configure_store(remote, path):
377
377
  @store.command(name="list")
378
378
  @click.option("--store-dir", "-s", is_flag=True, help="List store instead of local")
379
379
  def list_commands(store_dir):
380
- """List all commands"""
380
+ """List all commands."""
381
381
  try:
382
382
  if store_dir:
383
383
  store_path = _get_store_path()
@@ -421,7 +421,7 @@ def list_commands(store_dir):
421
421
  @click.argument("command_name")
422
422
  @click.option("--store-dir", "-s", is_flag=True, help="Show from store instead of local")
423
423
  def show_command(command_name, store_dir):
424
- """Show command file contents"""
424
+ """Show command file contents."""
425
425
  try:
426
426
  if store_dir:
427
427
  store_path = _get_store_path()
@@ -1,23 +1,11 @@
1
- import base64
2
- import json
3
1
  import os
4
- import queue
5
- import shutil
6
- import sys
7
- import tempfile
8
- import threading
9
- import time
10
- import uuid
11
- from pathlib import Path
12
2
  from typing import Any, Dict, List, Optional, Tuple
13
3
 
14
4
  import click
15
5
  import cv2
16
6
  import numpy as np
17
- import requests
18
7
  from PIL import Image
19
- from scipy import ndimage, spatial
20
- from skimage import feature, morphology, restoration
8
+ from skimage import morphology
21
9
 
22
10
  # Add this to your existing CONFIG
23
11
  CONFIG = {"temp_dir": "./temp", "output_dir": "./output"}
@@ -1105,7 +1093,6 @@ def remove_overlay(input_video, output, fps, output_fps, context, method):
1105
1093
  @click.group()
1106
1094
  def main():
1107
1095
  """Advanced video overlay removal tool with intelligent content reconstruction."""
1108
- pass
1109
1096
 
1110
1097
 
1111
1098
  main.add_command(remove_overlay)