mcli-framework 7.10.0__py3-none-any.whl → 7.10.2__py3-none-any.whl

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 (42) hide show
  1. mcli/lib/custom_commands.py +10 -0
  2. mcli/lib/optional_deps.py +240 -0
  3. mcli/ml/backtesting/run.py +5 -3
  4. mcli/ml/models/ensemble_models.py +1 -0
  5. mcli/ml/models/recommendation_models.py +1 -0
  6. mcli/ml/optimization/optimize.py +6 -4
  7. mcli/ml/serving/serve.py +2 -2
  8. mcli/ml/training/train.py +14 -7
  9. mcli/self/completion_cmd.py +2 -2
  10. mcli/workflow/doc_convert.py +82 -112
  11. mcli/workflow/git_commit/ai_service.py +13 -2
  12. mcli/workflow/notebook/converter.py +375 -0
  13. mcli/workflow/notebook/notebook_cmd.py +441 -0
  14. mcli/workflow/notebook/schema.py +402 -0
  15. mcli/workflow/notebook/validator.py +313 -0
  16. mcli/workflow/workflow.py +14 -0
  17. {mcli_framework-7.10.0.dist-info → mcli_framework-7.10.2.dist-info}/METADATA +37 -3
  18. {mcli_framework-7.10.0.dist-info → mcli_framework-7.10.2.dist-info}/RECORD +22 -37
  19. mcli/ml/features/political_features.py +0 -677
  20. mcli/ml/preprocessing/politician_trading_preprocessor.py +0 -570
  21. mcli/workflow/politician_trading/config.py +0 -134
  22. mcli/workflow/politician_trading/connectivity.py +0 -492
  23. mcli/workflow/politician_trading/data_sources.py +0 -654
  24. mcli/workflow/politician_trading/database.py +0 -412
  25. mcli/workflow/politician_trading/demo.py +0 -249
  26. mcli/workflow/politician_trading/models.py +0 -327
  27. mcli/workflow/politician_trading/monitoring.py +0 -413
  28. mcli/workflow/politician_trading/scrapers.py +0 -1074
  29. mcli/workflow/politician_trading/scrapers_california.py +0 -434
  30. mcli/workflow/politician_trading/scrapers_corporate_registry.py +0 -797
  31. mcli/workflow/politician_trading/scrapers_eu.py +0 -376
  32. mcli/workflow/politician_trading/scrapers_free_sources.py +0 -509
  33. mcli/workflow/politician_trading/scrapers_third_party.py +0 -373
  34. mcli/workflow/politician_trading/scrapers_uk.py +0 -378
  35. mcli/workflow/politician_trading/scrapers_us_states.py +0 -471
  36. mcli/workflow/politician_trading/seed_database.py +0 -520
  37. mcli/workflow/politician_trading/supabase_functions.py +0 -354
  38. mcli/workflow/politician_trading/workflow.py +0 -879
  39. {mcli_framework-7.10.0.dist-info → mcli_framework-7.10.2.dist-info}/WHEEL +0 -0
  40. {mcli_framework-7.10.0.dist-info → mcli_framework-7.10.2.dist-info}/entry_points.txt +0 -0
  41. {mcli_framework-7.10.0.dist-info → mcli_framework-7.10.2.dist-info}/licenses/LICENSE +0 -0
  42. {mcli_framework-7.10.0.dist-info → mcli_framework-7.10.2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,313 @@
1
+ """
2
+ Validation utilities for workflow notebooks.
3
+
4
+ Provides validation for:
5
+ - JSON schema compliance
6
+ - Code syntax checking
7
+ - Shell script validation
8
+ - MCLI API validation
9
+ """
10
+
11
+ import ast
12
+ import subprocess
13
+ import tempfile
14
+ from pathlib import Path
15
+ from typing import Any, Dict, List, Optional
16
+
17
+ from mcli.lib.logger.logger import get_logger
18
+
19
+ from .schema import NOTEBOOK_SCHEMA, CellLanguage, CellType, WorkflowNotebook
20
+
21
+ logger = get_logger()
22
+
23
+
24
+ class NotebookValidator:
25
+ """Validator for workflow notebooks."""
26
+
27
+ def __init__(self):
28
+ self.schema_errors: List[str] = []
29
+ self.syntax_errors: List[str] = []
30
+
31
+ def validate_schema(self, notebook: WorkflowNotebook) -> bool:
32
+ """
33
+ Validate notebook against JSON schema.
34
+
35
+ Args:
36
+ notebook: WorkflowNotebook to validate
37
+
38
+ Returns:
39
+ True if valid, False otherwise
40
+ """
41
+ self.schema_errors = []
42
+
43
+ try:
44
+ import jsonschema
45
+
46
+ data = notebook.to_dict()
47
+ jsonschema.validate(instance=data, schema=NOTEBOOK_SCHEMA)
48
+ return True
49
+
50
+ except ImportError:
51
+ # jsonschema not installed, do basic validation
52
+ logger.warning("jsonschema not installed, performing basic validation")
53
+ return self._basic_schema_validation(notebook)
54
+
55
+ except Exception as e:
56
+ self.schema_errors.append(str(e))
57
+ return False
58
+
59
+ def _basic_schema_validation(self, notebook: WorkflowNotebook) -> bool:
60
+ """Basic schema validation without jsonschema library."""
61
+ valid = True
62
+
63
+ # Check required fields
64
+ if not notebook.metadata.mcli.name:
65
+ self.schema_errors.append("Missing required field: metadata.mcli.name")
66
+ valid = False
67
+
68
+ if notebook.nbformat != 4:
69
+ self.schema_errors.append(f"Invalid nbformat: {notebook.nbformat} (expected 4)")
70
+ valid = False
71
+
72
+ # Validate cells
73
+ for i, cell in enumerate(notebook.cells):
74
+ if not cell.cell_type:
75
+ self.schema_errors.append(f"Cell {i}: Missing cell_type")
76
+ valid = False
77
+
78
+ if not cell.source and not isinstance(cell.source, (str, list)):
79
+ self.schema_errors.append(f"Cell {i}: Missing or invalid source")
80
+ valid = False
81
+
82
+ return valid
83
+
84
+ def validate_syntax(self, notebook: WorkflowNotebook) -> bool:
85
+ """
86
+ Validate code syntax in all code cells.
87
+
88
+ Args:
89
+ notebook: WorkflowNotebook to validate
90
+
91
+ Returns:
92
+ True if all code is syntactically valid, False otherwise
93
+ """
94
+ self.syntax_errors = []
95
+ all_valid = True
96
+
97
+ for i, cell in enumerate(notebook.cells):
98
+ if cell.cell_type != CellType.CODE:
99
+ continue
100
+
101
+ language = cell.language
102
+ code = cell.source_text
103
+
104
+ if language == CellLanguage.PYTHON:
105
+ if not self._validate_python_syntax(code, i):
106
+ all_valid = False
107
+
108
+ elif language in (CellLanguage.SHELL, CellLanguage.BASH, CellLanguage.ZSH):
109
+ if not self._validate_shell_syntax(code, i):
110
+ all_valid = False
111
+
112
+ return all_valid
113
+
114
+ def _validate_python_syntax(self, code: str, cell_index: int) -> bool:
115
+ """Validate Python code syntax."""
116
+ try:
117
+ ast.parse(code)
118
+ return True
119
+ except SyntaxError as e:
120
+ self.syntax_errors.append(
121
+ f"Cell {cell_index} (Python): Syntax error at line {e.lineno}: {e.msg}"
122
+ )
123
+ return False
124
+ except Exception as e:
125
+ self.syntax_errors.append(f"Cell {cell_index} (Python): {str(e)}")
126
+ return False
127
+
128
+ def _validate_shell_syntax(self, code: str, cell_index: int) -> bool:
129
+ """Validate shell script syntax using bash -n."""
130
+ try:
131
+ # Create temporary file with shell script
132
+ with tempfile.NamedTemporaryFile(mode="w", suffix=".sh", delete=False) as f:
133
+ f.write(code)
134
+ temp_path = f.name
135
+
136
+ try:
137
+ # Use bash -n to check syntax without executing
138
+ result = subprocess.run(
139
+ ["bash", "-n", temp_path],
140
+ capture_output=True,
141
+ text=True,
142
+ timeout=5,
143
+ )
144
+
145
+ if result.returncode != 0:
146
+ error_msg = result.stderr.strip()
147
+ self.syntax_errors.append(f"Cell {cell_index} (Shell): {error_msg}")
148
+ return False
149
+
150
+ return True
151
+
152
+ finally:
153
+ # Clean up temp file
154
+ Path(temp_path).unlink(missing_ok=True)
155
+
156
+ except subprocess.TimeoutExpired:
157
+ self.syntax_errors.append(f"Cell {cell_index} (Shell): Validation timeout")
158
+ return False
159
+ except Exception as e:
160
+ self.syntax_errors.append(f"Cell {cell_index} (Shell): {str(e)}")
161
+ return False
162
+
163
+ def validate_mcli_apis(self, notebook: WorkflowNotebook) -> bool:
164
+ """
165
+ Validate MCLI API usage in code cells.
166
+
167
+ This checks for:
168
+ - Proper Click decorator usage
169
+ - MCLI library imports
170
+ - Common API patterns
171
+
172
+ Args:
173
+ notebook: WorkflowNotebook to validate
174
+
175
+ Returns:
176
+ True if API usage is valid, False otherwise
177
+ """
178
+ # TODO: Implement MCLI-specific API validation
179
+ # This could check for:
180
+ # - @click.command() or @click.group() decorators
181
+ # - Proper import statements
182
+ # - Common anti-patterns
183
+ return True
184
+
185
+ def get_all_errors(self) -> List[str]:
186
+ """Get all validation errors."""
187
+ return self.schema_errors + self.syntax_errors
188
+
189
+
190
+ class CodeLinter:
191
+ """Linter for workflow notebook code."""
192
+
193
+ def __init__(self):
194
+ self.issues: List[Dict[str, any]] = []
195
+
196
+ def lint_python(self, code: str) -> List[Dict[str, any]]:
197
+ """
198
+ Lint Python code using available linters.
199
+
200
+ Tries to use (in order):
201
+ 1. flake8
202
+ 2. pylint
203
+ 3. Basic AST-based checks
204
+
205
+ Returns:
206
+ List of lint issues
207
+ """
208
+ self.issues = []
209
+
210
+ # Try flake8
211
+ try:
212
+ import flake8.api.legacy as flake8_api
213
+
214
+ style_guide = flake8_api.get_style_guide()
215
+ with tempfile.NamedTemporaryFile(mode="w", suffix=".py", delete=False) as f:
216
+ f.write(code)
217
+ temp_path = f.name
218
+
219
+ try:
220
+ report = style_guide.check_files([temp_path])
221
+ # Convert flake8 results to our format
222
+ # (this is simplified - actual implementation would parse flake8 output)
223
+ if report.total_errors > 0:
224
+ self.issues.append(
225
+ {
226
+ "severity": "warning",
227
+ "message": f"Found {report.total_errors} style issues",
228
+ "line": 0,
229
+ }
230
+ )
231
+ finally:
232
+ Path(temp_path).unlink(missing_ok=True)
233
+
234
+ except ImportError:
235
+ # flake8 not available, try basic checks
236
+ self._basic_python_lint(code)
237
+
238
+ return self.issues
239
+
240
+ def _basic_python_lint(self, code: str):
241
+ """Basic Python linting using AST."""
242
+ try:
243
+ tree = ast.parse(code)
244
+
245
+ # Check for common issues
246
+ for node in ast.walk(tree):
247
+ # Check for unused imports (simplified)
248
+ if isinstance(node, ast.Import):
249
+ # TODO: Check if imports are actually used
250
+ pass
251
+
252
+ # Check for bare except
253
+ if isinstance(node, ast.ExceptHandler) and node.type is None:
254
+ self.issues.append(
255
+ {
256
+ "severity": "warning",
257
+ "message": "Bare except clause - consider specifying exception type",
258
+ "line": node.lineno,
259
+ }
260
+ )
261
+
262
+ except SyntaxError:
263
+ # Already caught by syntax validation
264
+ pass
265
+
266
+ def lint_shell(self, code: str) -> List[Dict[str, any]]:
267
+ """
268
+ Lint shell script using shellcheck if available.
269
+
270
+ Returns:
271
+ List of lint issues
272
+ """
273
+ self.issues = []
274
+
275
+ try:
276
+ # Create temporary file
277
+ with tempfile.NamedTemporaryFile(mode="w", suffix=".sh", delete=False) as f:
278
+ f.write(code)
279
+ temp_path = f.name
280
+
281
+ try:
282
+ # Try to use shellcheck
283
+ result = subprocess.run(
284
+ ["shellcheck", "-f", "json", temp_path],
285
+ capture_output=True,
286
+ text=True,
287
+ timeout=10,
288
+ )
289
+
290
+ if result.stdout:
291
+ import json
292
+
293
+ issues = json.loads(result.stdout)
294
+ self.issues = [
295
+ {
296
+ "severity": issue.get("level", "warning"),
297
+ "message": issue.get("message", ""),
298
+ "line": issue.get("line", 0),
299
+ "code": issue.get("code", ""),
300
+ }
301
+ for issue in issues
302
+ ]
303
+
304
+ finally:
305
+ Path(temp_path).unlink(missing_ok=True)
306
+
307
+ except FileNotFoundError:
308
+ # shellcheck not installed
309
+ logger.debug("shellcheck not found, skipping shell linting")
310
+ except Exception as e:
311
+ logger.warning(f"Shell linting failed: {e}")
312
+
313
+ return self.issues
mcli/workflow/workflow.py CHANGED
@@ -14,5 +14,19 @@ def workflow():
14
14
  pass
15
15
 
16
16
 
17
+ # Add notebook subcommand
18
+ try:
19
+ from mcli.workflow.notebook.notebook_cmd import notebook
20
+
21
+ workflow.add_command(notebook)
22
+ except ImportError as e:
23
+ # Notebook commands not available
24
+ import sys
25
+ from mcli.lib.logger.logger import get_logger
26
+
27
+ logger = get_logger()
28
+ logger.debug(f"Notebook commands not available: {e}")
29
+
30
+
17
31
  if __name__ == "__main__":
18
32
  workflow()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcli-framework
3
- Version: 7.10.0
3
+ Version: 7.10.2
4
4
  Summary: Portable workflow framework - transform any script into a versioned, schedulable command. Store in ~/.mcli/commands/, 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>
@@ -160,6 +160,11 @@ Dynamic: license-file
160
160
 
161
161
  # MCLI - Portable Workflow Framework
162
162
 
163
+ [![codecov](https://codecov.io/gh/gwicho38/mcli/branch/main/graph/badge.svg)](https://codecov.io/gh/gwicho38/mcli)
164
+ [![Tests](https://github.com/gwicho38/mcli/workflows/CI%2FCD%20Pipeline/badge.svg)](https://github.com/gwicho38/mcli/actions)
165
+ [![Python Version](https://img.shields.io/badge/python-3.9%20%7C%203.10%20%7C%203.11%20%7C%203.12-blue)](https://www.python.org/downloads/)
166
+ [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
167
+
163
168
  **Transform any script into a versioned, portable, schedulable workflow command.**
164
169
 
165
170
  MCLI is a modular CLI framework that lets you write scripts once and run them anywhere - as interactive commands, scheduled jobs, or background daemons. Your workflows live in `~/.mcli/commands/`, are versioned via lockfile, and completely decoupled from the engine source code.
@@ -170,6 +175,35 @@ Write a script. Store it. Version it. Run it anywhere. Schedule it. Share it.
170
175
 
171
176
  No coupling to the engine. No vendor lock-in. Just portable workflows that work.
172
177
 
178
+ ## 🚀 Visual Workflow Editing
179
+
180
+ Edit your workflow JSON files like Jupyter notebooks with our VSCode extension!
181
+
182
+ [![VSCode Extension](https://img.shields.io/badge/VSCode-Extension-blue?logo=visualstudiocode)](vscode-extension/)
183
+ [![Visual Editing](https://img.shields.io/badge/workflows-visual%20editing-brightgreen)](vscode-extension/)
184
+
185
+ **Features:**
186
+ - 📝 Cell-based editing (Jupyter-like interface)
187
+ - ⚡ Live code execution (Python, Shell, Bash, Zsh, Fish)
188
+ - 🎯 Monaco editor with IntelliSense
189
+ - 📊 Rich markdown documentation cells
190
+ - 💾 Files stay as `.json` (git-friendly)
191
+
192
+ **Quick Install:**
193
+ ```bash
194
+ # From VSCode Marketplace (pending publication)
195
+ code --install-extension gwicho38.mcli-framework
196
+
197
+ # Or install from VSIX
198
+ code --install-extension vscode-extension/mcli-framework-1.0.0.vsix
199
+ ```
200
+
201
+ **Learn More:**
202
+ - [Extension README](vscode-extension/README.md) - Features and usage
203
+ - [Visual Editing Guide](README-VISUAL-EDITING.md) - Quick start
204
+ - [Installation Guide](vscode-extension/INSTALL.md) - Detailed setup
205
+ - [Workflow Notebooks Docs](docs/workflow-notebooks.md) - Complete guide
206
+
173
207
  ## ⚡ Quick Start
174
208
 
175
209
  ### Installation
@@ -450,7 +484,7 @@ Available workflows:
450
484
  - **redis** - Redis cache management
451
485
  - **videos** - Video processing and overlay removal
452
486
  - **sync** - Multi-cloud synchronization
453
- - **politician-trading** - Financial data collection (specialized)
487
+ - **politician-trading** - Now available as standalone package: [politician-trading-tracker](https://github.com/gwicho38/politician-trading-tracker)
454
488
 
455
489
  ## 💡 Why MCLI?
456
490
 
@@ -478,7 +512,7 @@ You write scripts. They work. Then:
478
512
 
479
513
  ```bash
480
514
  # Install completion for your shell
481
- mcli completion install
515
+ mcli self completion install
482
516
 
483
517
  # Now use tab completion
484
518
  mcli workflow <TAB> # Shows all workflows
@@ -11,8 +11,9 @@ mcli/chat/command_rag.py,sha256=Ee8usPyRDRYDWpQ79dI7xbxM8Ljxsy_ym_MnL37nPAo,1936
11
11
  mcli/chat/enhanced_chat.py,sha256=e3odh5klewDHIjfNOyvifLzCdHrysDc2IvNVHzTPIh4,27072
12
12
  mcli/chat/system_controller.py,sha256=SuGvnIh2QObvM1DMicF3gGyeBkbz_xXS-hOOHjWx5j4,39114
13
13
  mcli/chat/system_integration.py,sha256=xQ11thOUswPg8r1HZkId6U3bTCOtMYngt0-mUYYXpt4,40196
14
- mcli/lib/custom_commands.py,sha256=FcM-Ng05AB1qLaNltw0bRv2qFDUMUV5jzrmbo6dWeII,19591
14
+ mcli/lib/custom_commands.py,sha256=HQ-6Ja7r2j8n5WZRFr0am4-sLSewDUlSrDHEVnQNV8s,20074
15
15
  mcli/lib/lib.py,sha256=-CFUfmcubYBxt3LDBY0uj9DF232pz8MPDu-Qg0Ocy8M,850
16
+ mcli/lib/optional_deps.py,sha256=z6jPjU9mjK2ipMf8gzdc_izYSyqefQRzUZWgj_CumtM,7568
16
17
  mcli/lib/paths.py,sha256=k6sDwvD8QRzBkBOllvXkokameumpTjpJ7pQrP7z1en0,2455
17
18
  mcli/lib/api/api.py,sha256=sPgAIYC8Z7AWV2TCBssNSKotbRggBqNLsbfzbjkhmUY,18558
18
19
  mcli/lib/api/daemon_client.py,sha256=Nq8sVvNKyIGvWp9G_O3NEFo9JDqA1TEx5FOB7iqslB4,7415
@@ -74,7 +75,7 @@ mcli/ml/auth/models.py,sha256=Ww6lMLVGxtH6Biru5z4efSULCudQFXgmUWgVPTfUCwo,4398
74
75
  mcli/ml/auth/permissions.py,sha256=9N8Q6zQ-0-WcErVxviVzHELpzurBAby02wI3C1YziF0,8400
75
76
  mcli/ml/backtesting/backtest_engine.py,sha256=bmgHd1MBHQT4ddgWMdOQH8cFw8M_iiLqde6Yga2Q2ys,19016
76
77
  mcli/ml/backtesting/performance_metrics.py,sha256=M4qe9QYYserwuCSMMMKwsT6-GEJbH4rHDl66NO31IC0,14674
77
- mcli/ml/backtesting/run.py,sha256=j_a5-ZOywbUKehERwtRsn_0hBLHQI4dsaPcMTYblGIs,1804
78
+ mcli/ml/backtesting/run.py,sha256=SuVhgxHmFXZaLao_MHh_ezVuw_xPS7-aCyKluftJZNc,1807
78
79
  mcli/ml/cli/main.py,sha256=9U_cgB4M0AtWCghB5H0388v41sZ-qvJwcMdSKh2_SO0,15664
79
80
  mcli/ml/config/settings.py,sha256=mdq16Q9guy0nWn2INCgXPfUwqKK76Dl-7agoIsN2a-8,14216
80
81
  mcli/ml/configs/dvc_config.py,sha256=LWOg4di1MpZED18YJznhYJwWsQ5i5k73RMxZT7-poHw,7663
@@ -111,7 +112,6 @@ mcli/ml/database/session.py,sha256=_pZPtbOs0VEgXaz8OEyUARncXq56fbU4Xl5Jj9L6udo,1
111
112
  mcli/ml/database/migrations/env.py,sha256=4_etswi4KhEhnSWMLuEHRBovb5URDmeIP0IjhHD7pj8,2432
112
113
  mcli/ml/experimentation/ab_testing.py,sha256=VMuwxsuyMmEwTKL69uUhlVZHvmF1wxEhRPZAOAKa0CI,32062
113
114
  mcli/ml/features/ensemble_features.py,sha256=tZlQjzccjbBVxBSAL6B9KXARAxkY3ZnEci_IzFecOC4,22942
114
- mcli/ml/features/political_features.py,sha256=et_KBjqlAzsuDYp6XQWCzqsMIsp4r07L3S1-dNCELN4,24889
115
115
  mcli/ml/features/recommendation_engine.py,sha256=MZhaJgEeR9N8eqJU-GgxnE861ttOsyKaNaz9Omu5k6I,30982
116
116
  mcli/ml/features/stock_features.py,sha256=VFww_bguT2uZn07AMuj3PiFA9E0k7riLOyGu6qHs5FI,21979
117
117
  mcli/ml/features/test_feature_engineering.py,sha256=BH-Gaj3m-phbvBBWvKnCnG3mZzlbd1C5i9LIkk_vdc0,12008
@@ -120,22 +120,21 @@ mcli/ml/mlops/experiment_tracker.py,sha256=_5EUNuTsiHtGLA_S6xPcS78wOVktu3Bkl2k9B
120
120
  mcli/ml/mlops/model_serving.py,sha256=GCN53jZiz62vlH-ST8RLbZ2ZFBqvAAXUW33fJgdpFvk,16929
121
121
  mcli/ml/mlops/pipeline_orchestrator.py,sha256=2JU2ORNjLjRRLIXN7UzR5_Hq1vmie89H4ZXKq8kIoJU,23514
122
122
  mcli/ml/models/base_models.py,sha256=eYSf1EQo5w0zInyypl9Qt_2St8mw1rCvS_gVLAsQyYI,10344
123
- mcli/ml/models/ensemble_models.py,sha256=qyddEf3Pl2ESNE-BFCu-WvMmpgkpPh2ur1pH-YQvmrE,22712
124
- mcli/ml/models/recommendation_models.py,sha256=ZStqlSHICKzHMYcEuudc0iHA2GrcxuyScuQtan-LwPg,17137
123
+ mcli/ml/models/ensemble_models.py,sha256=RR85792gFqD4MX7oWaL7aLibqRK5t9TEaRaL9wGzp8A,22713
124
+ mcli/ml/models/recommendation_models.py,sha256=7r79zBXwOCFJPz2bKcF1lR6sCrJqyvPBrMX8jcL5sXM,17138
125
125
  mcli/ml/models/test_models.py,sha256=_amqLeqFF1X8dCBSgIx8Jt4h4XdLqcPZNW2uq4Hd_Ow,15762
126
126
  mcli/ml/monitoring/drift_detection.py,sha256=MlRWvqDqUYddXsCzFS4bPdMNC2xKkwA1Ghrdf1z0LRE,26112
127
127
  mcli/ml/monitoring/metrics.py,sha256=lC1npD1TzmhTz47WzAH6-jgCrFSvkPiMbo9TacsP0tI,1028
128
- mcli/ml/optimization/optimize.py,sha256=fknlTSVKnLT15bdkIswk9Wp8xhU23N1qAp7u4tSG3w8,1946
128
+ mcli/ml/optimization/optimize.py,sha256=7H5X4ATKys010d-ZiOCZUxFwQqXmRy7dUbykqMvv_LM,1945
129
129
  mcli/ml/optimization/portfolio_optimizer.py,sha256=QxkLegU9T7Yv52ZBFtXdeRbS7ybxmKA6uK5d7yJkyNA,31298
130
130
  mcli/ml/predictions/monte_carlo.py,sha256=33kqyqYzMAmXXDdq5q3LLSTqqKjAoJdFYuiD3J8ApmU,13630
131
131
  mcli/ml/predictions/prediction_engine.py,sha256=E_0BZH73syKUimYOaHiSI1RSzFQohx_CPOmzbdR4V-A,8680
132
132
  mcli/ml/preprocessing/data_cleaners.py,sha256=vFa7aZIg_4MANjM1Ww06qj6YcrdD6u5srFqXWYOf6z8,17283
133
133
  mcli/ml/preprocessing/feature_extractors.py,sha256=xduPETE0L-0bw6uaXFdR4zsqJbUW_LkJckbNBMyoFPw,17307
134
134
  mcli/ml/preprocessing/ml_pipeline.py,sha256=XButx7aHIywgfpwfGOMpZLRk-bg5WRYDfeOsxE5WlPs,14203
135
- mcli/ml/preprocessing/politician_trading_preprocessor.py,sha256=woyZGaV6jD4cK9Xk71hWk7Lmay9v-MbO_dzHlkwGSMc,21901
136
135
  mcli/ml/preprocessing/test_preprocessing.py,sha256=4BJFTTB5D62hdP3HzjO0-Sc7eq5JzATcXvYk2uw7MBc,9576
137
136
  mcli/ml/scripts/populate_sample_data.py,sha256=TBiTQpiUWeNkT2X5H5IEd-v4lM507JMXw3nAD0Iq62g,7811
138
- mcli/ml/serving/serve.py,sha256=tZFQg87bvGjHyAXnXstMbREpMTkuve_FwFRdeIxnek8,1404
137
+ mcli/ml/serving/serve.py,sha256=bMpUJoCjKLP0WFr65cRC9auu72KkewZMFKw4B4lszTo,1401
139
138
  mcli/ml/tests/test_integration.py,sha256=c5XhNIn-3vQsN_k5tAYCEb-VpZc58kPSJPhsokmvUgo,15956
140
139
  mcli/ml/tests/test_training_dashboard.py,sha256=fCNyNdVQzARE6LYdZwQJAFr3dO8GAG-u0dJhW-sFpLU,14013
141
140
  mcli/ml/trading/alpaca_client.py,sha256=WPPyrAbeWRIpRG-XLLgiBYJun9J7wlwTIJoeY5qkNiI,14694
@@ -144,12 +143,12 @@ mcli/ml/trading/models.py,sha256=qzGOYJTXL2m6lqWTdODwn0fOAECihIt8zTpaQqTwn00,143
144
143
  mcli/ml/trading/paper_trading.py,sha256=7faoabOOv3BdIDmrzPkLF_zTmWwZspq588sU9_m_ja8,13862
145
144
  mcli/ml/trading/risk_management.py,sha256=7eygbQaC1sfJlFvyInOc4MQtwxmU5lDnj28UcrfkBCk,15572
146
145
  mcli/ml/trading/trading_service.py,sha256=TguV7E_P5E8oGyGHOU2wEemh0iVepqitL4zjulm6NBE,20896
147
- mcli/ml/training/train.py,sha256=_lZLAPQvdQ1_vKyrokR1mm4ZRNXx57lNea-8cD0CmlY,2718
146
+ mcli/ml/training/train.py,sha256=6sh83Sr6HiIfIMYuOQZpgHzviiFIyVIOrBynTAg36GY,2718
148
147
  mcli/ml/training/train_model.py,sha256=_brE4ud0R9xfT5x3IpxgMhmakvbLbxqN82Ix4ycxSSo,16861
149
148
  mcli/mygroup/test_cmd.py,sha256=WjzgoH1WFa79wc8A7O6UMuJfookLfgciUNcCMbKHAQQ,21
150
149
  mcli/public/public.py,sha256=t9BkO1XV7s3YcoH0bbIpyjZ05UX_vBjaKtKkuDX7wZ0,114
151
150
  mcli/public/oi/oi.py,sha256=SQabQWQ1pE67pWYEHwIDc3R93DARJfB6VHk7qxWx9xo,308
152
- mcli/self/completion_cmd.py,sha256=FKNVc_4ikWTGbDHybiNZGdxrggvt6A6q1rnzuyFVzVM,7754
151
+ mcli/self/completion_cmd.py,sha256=JXJ70p_yyfC8KlC5QifkQWLNeS2hgUFmNw8xdiix5O8,7764
153
152
  mcli/self/logs_cmd.py,sha256=SCzZ4VZs6p42hksun_w4WN33xIZgmq7RjdWX8P2WcT4,15056
154
153
  mcli/self/redis_cmd.py,sha256=Cl0LQ3Mqt27gLeb542_xw6bJBbIE-CBmWyMmaUTSk8c,9426
155
154
  mcli/self/self_cmd.py,sha256=531_8jfX6neSifSl_u3mCG_EcSkQJ9yXcFxklvMFea0,37760
@@ -157,9 +156,9 @@ mcli/self/store_cmd.py,sha256=O6arjRr4qWQKh1QyVWtzyXq5R7yZEBL87FSI59Db7IY,13320
157
156
  mcli/self/test_cmd.py,sha256=WjzgoH1WFa79wc8A7O6UMuJfookLfgciUNcCMbKHAQQ,21
158
157
  mcli/self/visual_cmd.py,sha256=jXighahHxeM9HANQ2Brk6nKFgi2ZuQBOBH7PE5xhebk,9428
159
158
  mcli/self/zsh_cmd.py,sha256=63jKmfjhJp2zxJL2c37OdtdzDrnOreXXfyARN7TyfzU,8294
160
- mcli/workflow/doc_convert.py,sha256=0_js7NbY8V9zWzcJiLB5Y5ZuX5LZubJmLWMp7DAC9mU,26381
159
+ mcli/workflow/doc_convert.py,sha256=X7ZCYbGCBZLv6WkxAgHfVOkD-6k-euo6qIaPgaKiwhA,25972
161
160
  mcli/workflow/lsh_integration.py,sha256=jop80DUjdOSxmqPb-gX_OBep5f1twViv-pXmkcFqBPY,13314
162
- mcli/workflow/workflow.py,sha256=P_W5LOB3lowvvlfEp3mGwS3eNq4tpbiUY-poFulAF9E,393
161
+ mcli/workflow/workflow.py,sha256=A6VPasry8tfSaSp_vdINJJS29GQu1cJJRyziFtsuZ1g,736
163
162
  mcli/workflow/daemon/async_command_database.py,sha256=pvfKYjt0Jg1EPwJ1p2C0M3bsBWvjEs4Ok-Y6-jY0qVI,24873
164
163
  mcli/workflow/daemon/async_process_manager.py,sha256=hDehiYuWnBOv8LbMLTDEi4DVyrwm8YrrYF8Ca5P66A4,21374
165
164
  mcli/workflow/daemon/client.py,sha256=W2uuat08b75m2SNRybWJ0xiNt0NfU43HorqziYzaxvQ,16849
@@ -173,7 +172,7 @@ mcli/workflow/dashboard/dashboard_cmd.py,sha256=AwgECXyE9W9l1JSWLziXXeAzKTa6KLx0
173
172
  mcli/workflow/docker/docker.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
174
173
  mcli/workflow/gcloud/config.toml,sha256=4_bImtrmmYxIFguQ4xRMgziMr_HVO80piWcyflXgWkU,697
175
174
  mcli/workflow/gcloud/gcloud.py,sha256=haTm4klifiSdYhQzDvtojkOCfsmFcB-zy2g8ZRkzBCk,1568
176
- mcli/workflow/git_commit/ai_service.py,sha256=IMmMKH7x8aWt-PTpYksNmslb7DdPZIiCbaCao7rItdI,12189
175
+ mcli/workflow/git_commit/ai_service.py,sha256=yh2j7oWiB10Il6OechI6wSUw-vedMsoKd__csGhzpxo,12756
177
176
  mcli/workflow/model_service/client.py,sha256=wWYde_zR6_o6SP6oePwkHKmEVBtELrP8uKyZNTBWwVc,20888
178
177
  mcli/workflow/model_service/download_and_run_efficient_models.py,sha256=UlKs_Oq_1Vn5qFP28ALCF6CVMTqcRT8hG5quHeGHLIc,9898
179
178
  mcli/workflow/model_service/lightweight_embedder.py,sha256=82B0tYOYVTB3rdC-7XYEMnkw4Q_K0-p3LeyvdaP6ro8,14165
@@ -187,25 +186,11 @@ mcli/workflow/model_service/test_efficient_runner.py,sha256=whu93oXrM0Z8HEzcKCc1
187
186
  mcli/workflow/model_service/test_example.py,sha256=aMSNRyjz5ian6cmHQt_sE5-q10V82iYJDjeAV1rsfJs,9515
188
187
  mcli/workflow/model_service/test_integration.py,sha256=PMylaOOab-mzkx_Si-gNwRzc_3tTs-9eMD8SOQUiJwM,4553
189
188
  mcli/workflow/model_service/test_new_features.py,sha256=5mMluJX5qjVC6HHtppGw1HemcDws9kKA5J1Xmrou8jU,4297
189
+ mcli/workflow/notebook/converter.py,sha256=65CjadkUMv1HDtC1EO7qoGHHaZtrprSbp6jU_vesZQM,12640
190
+ mcli/workflow/notebook/notebook_cmd.py,sha256=L0c3zOQli1JFoCm_OrHvUkxJD9hDOTsY6eNbra99xZo,12907
191
+ mcli/workflow/notebook/schema.py,sha256=SXSKHfk9aErsIJX2y1Cm3wrq6qA4CVqak3jMd3Vx4Pc,13184
192
+ mcli/workflow/notebook/validator.py,sha256=tK00MTpzPkfygdwo5vW6qJn98O2_95sbCUaY6Gmmmec,9925
190
193
  mcli/workflow/openai/openai.py,sha256=Zv7nsFUQqLeg5jJaYKp6wsXZsb7b5pzjF8HQLpJkIaI,2769
191
- mcli/workflow/politician_trading/config.py,sha256=8lI--VX9EK1VdjllnkpoQKJwzBR8YPtnBgPHu33P6Jc,4398
192
- mcli/workflow/politician_trading/connectivity.py,sha256=jJGWpqetAto7_LGYkCUAJWo5ETl_3Gx4jX8eO4Ah3JI,18945
193
- mcli/workflow/politician_trading/data_sources.py,sha256=Ol-I35pXn5GEulQ8UWDw4N9kdk--4bWLSEbWL1ZkEdQ,30992
194
- mcli/workflow/politician_trading/database.py,sha256=-sXIJ45DQRBH3s9xu_MvXN5QWpe9LVxVVXfI1J-qHRg,16917
195
- mcli/workflow/politician_trading/demo.py,sha256=A2ihvhq6g7TuiD9nxKBYpp4a129Xz1PUfgIOLz9EYrs,9725
196
- mcli/workflow/politician_trading/models.py,sha256=8fcMLmnfJDkk6o-P2GMDGm0YhzfPkINdPl66HJEAD3E,10163
197
- mcli/workflow/politician_trading/monitoring.py,sha256=WYgE97SJ16cw1MCIMrvYCVbE1NMo0WJLBLRXRZibtic,15308
198
- mcli/workflow/politician_trading/scrapers.py,sha256=G9twuSJWwpmDF5cECFTZGPDCT48F4Cc5B29oQnYO8oU,47790
199
- mcli/workflow/politician_trading/scrapers_california.py,sha256=kIetMAw2A6S9A-tWy1dk-XswsE__J26YQ2Nw_KDse3o,18199
200
- mcli/workflow/politician_trading/scrapers_corporate_registry.py,sha256=breNdaD9MVr2AcWJbAXOg027F2qZ0KGARRkIFs0xdX4,25815
201
- mcli/workflow/politician_trading/scrapers_eu.py,sha256=VOwORJ50i2LgziLVR5vfOr3uqsTAl7QPS9HahLXkN98,14735
202
- mcli/workflow/politician_trading/scrapers_free_sources.py,sha256=WVachLUdXDCapXE_xOdb5d6PCVp0uJHa-DsGschfOzg,17185
203
- mcli/workflow/politician_trading/scrapers_third_party.py,sha256=8BXjdJkhkIZ7SV0TC_3FlrZCJiw1nUPooDvnEZzO6X8,12966
204
- mcli/workflow/politician_trading/scrapers_uk.py,sha256=t_ee6R5P9UM5ll2hV6jujx4MepN9x907qfmvAevWXjk,14604
205
- mcli/workflow/politician_trading/scrapers_us_states.py,sha256=iMpEs7HjfhXI0MwXTnHVSnlqLjtrPZkCWUnovBsBs0U,18269
206
- mcli/workflow/politician_trading/seed_database.py,sha256=C0UybjVJkay9KSTwWorynXBHWW25eLrLqQrBJZC05AQ,17332
207
- mcli/workflow/politician_trading/supabase_functions.py,sha256=7RXZuFsbc82-nwv54XdO19gkrI1sWJsuNn4LRKLw3T0,10089
208
- mcli/workflow/politician_trading/workflow.py,sha256=LxWKLnim5ttFtPTYgPtt4qlBpeAFoj7TUH-0tl15IDk,36262
209
194
  mcli/workflow/registry/registry.py,sha256=MbiabMfrvbFvD8K1c9ucmXCSdfqZa1PUBedwStz9UgA,5249
210
195
  mcli/workflow/repo/repo.py,sha256=sk-hOzAa1IL1YSTSetgq-k-x0XRpGVGksSa095Q0JkM,8055
211
196
  mcli/workflow/scheduler/cron_parser.py,sha256=pG9b7emjbBQ_-xNjauTUaeFoKZV_X-oCN5mpq18HyTs,7548
@@ -215,9 +200,9 @@ mcli/workflow/scheduler/persistence.py,sha256=SU8-F5wTpTercZvTeAXKlGI7gwHyfmYDhX
215
200
  mcli/workflow/scheduler/scheduler.py,sha256=1Ujq9VgL1rSTCAtshuLA2_sodW6HOj0MEZem7Ga-kic,23351
216
201
  mcli/workflow/sync/test_cmd.py,sha256=neVgs9zEnKSxlvzDpFkuCGucqnzjrShm2OvJtHibslg,10009
217
202
  mcli/workflow/wakatime/wakatime.py,sha256=sEjsUKa3-XyE8Ni6sAb_D3GAY5jDcA30KknW9YTbLTA,142
218
- mcli_framework-7.10.0.dist-info/licenses/LICENSE,sha256=sahwAMfrJv2-V66HNPTp7A9UmMjxtyejwTZZoWQvEcI,1075
219
- mcli_framework-7.10.0.dist-info/METADATA,sha256=c8JMqCuG8rD8u-1eMM4iElNqE-xRy9dA1sHskxI6trY,16419
220
- mcli_framework-7.10.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
221
- mcli_framework-7.10.0.dist-info/entry_points.txt,sha256=dYrZbDIm-KUPsl1wfv600Kx_8sMy89phMkCihbDRgP8,261
222
- mcli_framework-7.10.0.dist-info/top_level.txt,sha256=_bnO8J2EUkliWivey_1le0UrnocFKmyVMQjbQ8iVXjc,5
223
- mcli_framework-7.10.0.dist-info/RECORD,,
203
+ mcli_framework-7.10.2.dist-info/licenses/LICENSE,sha256=sahwAMfrJv2-V66HNPTp7A9UmMjxtyejwTZZoWQvEcI,1075
204
+ mcli_framework-7.10.2.dist-info/METADATA,sha256=sOSFFIo0iRfTkM32WjrzRXorLay_FadVhKOVq0Xbr7M,18064
205
+ mcli_framework-7.10.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
206
+ mcli_framework-7.10.2.dist-info/entry_points.txt,sha256=dYrZbDIm-KUPsl1wfv600Kx_8sMy89phMkCihbDRgP8,261
207
+ mcli_framework-7.10.2.dist-info/top_level.txt,sha256=_bnO8J2EUkliWivey_1le0UrnocFKmyVMQjbQ8iVXjc,5
208
+ mcli_framework-7.10.2.dist-info/RECORD,,