mcli-framework 8.0.45__tar.gz → 8.0.46__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. {mcli_framework-8.0.45/src/mcli_framework.egg-info → mcli_framework-8.0.46}/PKG-INFO +1 -1
  2. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/pyproject.toml +1 -1
  3. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/sync_cmd.py +34 -5
  4. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/ipfs_sync.py +165 -0
  5. {mcli_framework-8.0.45 → mcli_framework-8.0.46/src/mcli_framework.egg-info}/PKG-INFO +1 -1
  6. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/LICENSE +0 -0
  7. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/MANIFEST.in +0 -0
  8. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/README.md +0 -0
  9. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/llms-full.txt +0 -0
  10. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/llms.txt +0 -0
  11. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/mcli_rust/Cargo.toml +0 -0
  12. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/mcli_rust/src/command_parser.rs +0 -0
  13. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/mcli_rust/src/file_watcher.rs +0 -0
  14. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/mcli_rust/src/lib.rs +0 -0
  15. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/mcli_rust/src/process_manager.rs +0 -0
  16. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/mcli_rust/src/tfidf.rs +0 -0
  17. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/setup.cfg +0 -0
  18. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/__init__.py +0 -0
  19. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/__init__.py +0 -0
  20. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/commands_cmd.py +0 -0
  21. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/completion_helpers.py +0 -0
  22. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/context_cmd.py +0 -0
  23. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/create_cmd.py +0 -0
  24. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/delete_cmd.py +0 -0
  25. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/edit_cmd.py +0 -0
  26. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/import_cmd.py +0 -0
  27. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/init_cmd.py +0 -0
  28. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/list_cmd.py +0 -0
  29. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/main.py +0 -0
  30. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/migrate_cmd.py +0 -0
  31. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/model/__init__.py +0 -0
  32. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/model/model.py +0 -0
  33. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/model_cmd.py +0 -0
  34. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/mv_cmd.py +0 -0
  35. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/new_cmd.py +0 -0
  36. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/remove_cmd.py +0 -0
  37. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/rm_cmd.py +0 -0
  38. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/search_cmd.py +0 -0
  39. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/services_cmd.py +0 -0
  40. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/setup_cmd.py +0 -0
  41. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/source_sync_cmd.py +0 -0
  42. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/video/__init__.py +0 -0
  43. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/app/video/video.py +0 -0
  44. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/config.toml +0 -0
  45. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/__init__.py +0 -0
  46. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/api/__init__.py +0 -0
  47. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/api/api.py +0 -0
  48. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/api/daemon_client.py +0 -0
  49. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/api/daemon_client_local.py +0 -0
  50. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/api/daemon_decorator.py +0 -0
  51. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/api/mcli_decorators.py +0 -0
  52. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/auth/__init__.py +0 -0
  53. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/auth/auth.py +0 -0
  54. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/auth/aws_manager.py +0 -0
  55. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/auth/azure_manager.py +0 -0
  56. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/auth/credential_manager.py +0 -0
  57. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/auth/gcp_manager.py +0 -0
  58. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/auth/key_manager.py +0 -0
  59. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/auth/mcli_manager.py +0 -0
  60. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/auth/token_manager.py +0 -0
  61. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/auth/token_util.py +0 -0
  62. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/config/__init__.py +0 -0
  63. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/config/config.py +0 -0
  64. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/config/settings.py +0 -0
  65. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/constants/__init__.py +0 -0
  66. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/constants/commands.py +0 -0
  67. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/constants/defaults.py +0 -0
  68. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/constants/env.py +0 -0
  69. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/constants/messages.py +0 -0
  70. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/constants/paths.py +0 -0
  71. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/constants/scripts.py +0 -0
  72. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/constants/storage.py +0 -0
  73. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/custom_commands.py +0 -0
  74. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/discovery/__init__.py +0 -0
  75. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/discovery/command_discovery.py +0 -0
  76. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/erd/__init__.py +0 -0
  77. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/erd/erd.py +0 -0
  78. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/erd/generate_graph.py +0 -0
  79. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/errors.py +0 -0
  80. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/feature_detection.py +0 -0
  81. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/files/__init__.py +0 -0
  82. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/files/files.py +0 -0
  83. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/folder_workflows.py +0 -0
  84. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/fs/__init__.py +0 -0
  85. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/fs/fs.py +0 -0
  86. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/ipfs_utils.py +0 -0
  87. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/ipns_manager.py +0 -0
  88. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/lib.py +0 -0
  89. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/logger/__init__.py +0 -0
  90. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/logger/correlation.py +0 -0
  91. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/logger/logger.py +0 -0
  92. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/logger/structured.py +0 -0
  93. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/optional_deps.py +0 -0
  94. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/paths.py +0 -0
  95. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/performance/__init__.py +0 -0
  96. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/performance/optimizer.py +0 -0
  97. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/performance/rust_bridge.py +0 -0
  98. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/performance/uvloop_config.py +0 -0
  99. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/pickles/__init__.py +0 -0
  100. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/pickles/pickles.py +0 -0
  101. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/pyenv/__init__.py +0 -0
  102. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/pyenv/deps.py +0 -0
  103. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/pyenv/manager.py +0 -0
  104. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/pyenv/venv.py +0 -0
  105. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/script_loader.py +0 -0
  106. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/script_sync.py +0 -0
  107. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/script_watcher.py +0 -0
  108. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/search/cached_vectorizer.py +0 -0
  109. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/secrets/__init__.py +0 -0
  110. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/secrets/commands.py +0 -0
  111. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/secrets/manager.py +0 -0
  112. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/secrets/repl.py +0 -0
  113. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/secrets/store.py +0 -0
  114. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/services/__init__.py +0 -0
  115. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/services/config.py +0 -0
  116. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/services/data_pipeline.py +0 -0
  117. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/services/health.py +0 -0
  118. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/services/lsh_client.py +0 -0
  119. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/services/manager.py +0 -0
  120. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/services/redis_service.py +0 -0
  121. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/services/registry.py +0 -0
  122. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/services/state.py +0 -0
  123. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/services/supervisor.py +0 -0
  124. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/shell/__init__.py +0 -0
  125. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/shell/exceptions.py +0 -0
  126. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/shell/shell.py +0 -0
  127. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/templates/__init__.py +0 -0
  128. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/templates/command_templates.py +0 -0
  129. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/toml/__init__.py +0 -0
  130. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/toml/toml.py +0 -0
  131. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/types.py +0 -0
  132. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/ui/styling.py +0 -0
  133. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/ui/visual_effects.py +0 -0
  134. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/watcher/__init__.py +0 -0
  135. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/watcher/watcher.py +0 -0
  136. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/workflow_models.py +0 -0
  137. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/lib/workspace_registry.py +0 -0
  138. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/mygroup/__init__.py +0 -0
  139. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/mygroup/test_cmd.py +0 -0
  140. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/public/__init__.py +0 -0
  141. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/public/commands/__init__.py +0 -0
  142. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/public/oi/oi.py +0 -0
  143. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/public/public.py +0 -0
  144. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/self/__init__.py +0 -0
  145. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/self/completion_cmd.py +0 -0
  146. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/self/env_cmd.py +0 -0
  147. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/self/health_cmd.py +0 -0
  148. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/self/ipfs_cmd.py +0 -0
  149. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/self/logs_cmd.py +0 -0
  150. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/self/migrate_cmd.py +0 -0
  151. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/self/release_notes_cmd.py +0 -0
  152. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/self/self_cmd.py +0 -0
  153. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/self/store_cmd.py +0 -0
  154. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/self/test_cmd.py +0 -0
  155. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/self/workflows_cmd.py +0 -0
  156. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/storage/__init__.py +0 -0
  157. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/storage/backends/__init__.py +0 -0
  158. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/storage/backends/ipfs_backend.py +0 -0
  159. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/storage/base.py +0 -0
  160. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/storage/cache.py +0 -0
  161. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/storage/encryption.py +0 -0
  162. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/storage/factory.py +0 -0
  163. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/storage/registry.py +0 -0
  164. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/storage/storacha_cli.py +0 -0
  165. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/__init__.py +0 -0
  166. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/daemon/__init__.py +0 -0
  167. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/daemon/async_command_database.py +0 -0
  168. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/daemon/async_process_manager.py +0 -0
  169. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/daemon/client.py +0 -0
  170. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/daemon/daemon.py +0 -0
  171. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/daemon/daemon_api.py +0 -0
  172. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/daemon/enhanced_daemon.py +0 -0
  173. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/daemon/process_cli.py +0 -0
  174. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/daemon/process_manager.py +0 -0
  175. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/daemon/test_daemon.py +0 -0
  176. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/doc_convert.py +0 -0
  177. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/docker/__init__.py +0 -0
  178. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/docker/docker.py +0 -0
  179. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/file/__init__.py +0 -0
  180. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/gcloud/__init__.py +0 -0
  181. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/gcloud/config.toml +0 -0
  182. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/gcloud/gcloud.py +0 -0
  183. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/git_commit/__init__.py +0 -0
  184. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/git_commit/ai_service.py +0 -0
  185. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/interview/__init__.py +0 -0
  186. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/lsh_integration.py +0 -0
  187. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/model_service/client.py +0 -0
  188. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/model_service/download_and_run_efficient_models.py +0 -0
  189. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/model_service/lightweight_embedder.py +0 -0
  190. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/model_service/lightweight_model_server.py +0 -0
  191. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/model_service/lightweight_test.py +0 -0
  192. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/model_service/model_service.py +0 -0
  193. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/model_service/ollama_efficient_runner.py +0 -0
  194. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/model_service/openai_adapter.py +0 -0
  195. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/model_service/pdf_processor.py +0 -0
  196. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/model_service/test_efficient_runner.py +0 -0
  197. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/model_service/test_example.py +0 -0
  198. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/model_service/test_integration.py +0 -0
  199. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/model_service/test_new_features.py +0 -0
  200. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/notebook/__init__.py +0 -0
  201. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/notebook/command_loader.py +0 -0
  202. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/notebook/converter.py +0 -0
  203. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/notebook/executor.py +0 -0
  204. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/notebook/notebook_cmd.py +0 -0
  205. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/notebook/schema.py +0 -0
  206. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/notebook/validator.py +0 -0
  207. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/openai/openai.py +0 -0
  208. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/registry/__init__.py +0 -0
  209. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/registry/registry.py +0 -0
  210. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/repo/__init__.py +0 -0
  211. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/repo/repo.py +0 -0
  212. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/scheduler/__init__.py +0 -0
  213. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/scheduler/cron_parser.py +0 -0
  214. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/scheduler/job.py +0 -0
  215. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/scheduler/models.py +0 -0
  216. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/scheduler/monitor.py +0 -0
  217. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/scheduler/persistence.py +0 -0
  218. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/scheduler/scheduler.py +0 -0
  219. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/scheduler/validation.py +0 -0
  220. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/search/__init__.py +0 -0
  221. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/secrets/__init__.py +0 -0
  222. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/secrets/secrets_cmd.py +0 -0
  223. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/storage/__init__.py +0 -0
  224. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/storage/storage_cmd.py +0 -0
  225. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/sync/__init__.py +0 -0
  226. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/sync/test_cmd.py +0 -0
  227. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/videos/__init__.py +0 -0
  228. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/wakatime/__init__.py +0 -0
  229. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/wakatime/wakatime.py +0 -0
  230. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli/workflow/workflow.py +0 -0
  231. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli_framework.egg-info/SOURCES.txt +0 -0
  232. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli_framework.egg-info/dependency_links.txt +0 -0
  233. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli_framework.egg-info/entry_points.txt +0 -0
  234. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli_framework.egg-info/requires.txt +0 -0
  235. {mcli_framework-8.0.45 → mcli_framework-8.0.46}/src/mcli_framework.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcli-framework
3
- Version: 8.0.45
3
+ Version: 8.0.46
4
4
  Summary: Portable workflow framework - transform any script into a versioned, schedulable command. Store in ~/.mcli/workflows/, version with lockfile, run as daemon or cron job.
5
5
  Author-email: Luis Fernandez de la Vara <luis@lefv.io>
6
6
  Maintainer-email: Luis Fernandez de la Vara <luis@lefv.io>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mcli-framework"
3
- version = "8.0.45"
3
+ version = "8.0.46"
4
4
  description = "Portable workflow framework - transform any script into a versioned, schedulable command. Store in ~/.mcli/workflows/, version with lockfile, run as daemon or cron job."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -460,19 +460,32 @@ def sync_push_command(global_mode: bool, description: str):
460
460
  @click.option("--output", "-o", type=click.Path(path_type=Path), help="Output file path")
461
461
  @click.option("--no-verify", is_flag=True, help="Skip hash verification")
462
462
  @click.option("--repo", "-r", help="Override repo name for IPNS resolution (cross-repo pull)")
463
+ @click.option(
464
+ "--workflows-dir",
465
+ "-w",
466
+ type=click.Path(path_type=Path, file_okay=False),
467
+ help="Reconstruct script files into this directory (per-script CIDs in manifest)",
468
+ )
463
469
  def sync_pull_command(
464
- cid: Optional[str], output: Optional[Path], no_verify: bool, repo: Optional[str]
470
+ cid: Optional[str],
471
+ output: Optional[Path],
472
+ no_verify: bool,
473
+ repo: Optional[str],
474
+ workflows_dir: Optional[Path],
465
475
  ):
466
476
  """⬇️ Pull workflow state from IPFS.
467
477
 
468
478
  If CID is provided, retrieves that exact version. If CID is omitted and
469
- MCLI_SYNC_KEY is set, automatically resolves the latest via IPNS.
479
+ MCLI_SYNC_KEY is set, automatically resolves the latest via IPNS. With
480
+ --workflows-dir, also reconstructs each command's script file from its
481
+ per-script CID embedded in the manifest.
470
482
 
471
483
  Examples:
472
- mcli sync pull # Auto-resolve via IPNS
473
- mcli sync pull QmXyZ123... # Pull specific CID
474
- mcli sync pull --repo other-project # Pull from different repo
484
+ mcli sync pull # Auto-resolve via IPNS
485
+ mcli sync pull QmXyZ123... # Pull specific CID
486
+ mcli sync pull --repo other-project # Pull from different repo
475
487
  mcli sync pull QmXyZ123... -o my-cmds.json
488
+ mcli sync pull QmXyZ123... -w ./.mcli/workflows
476
489
  """
477
490
  import json
478
491
 
@@ -527,6 +540,22 @@ def sync_pull_command(
527
540
 
528
541
  if "version" in data:
529
542
  console.print(SyncMessages.VERSION_LABEL.format(version=data["version"]))
543
+
544
+ # Optional: reconstruct script files from per-script CIDs
545
+ if workflows_dir and cid:
546
+ try:
547
+ written = ipfs.pull_workflows(cid, workflows_dir, verify=not no_verify)
548
+ except ValueError as exc:
549
+ error(f"Hash verification failed: {exc}")
550
+ return
551
+ if written:
552
+ success(f"Restored {len(written)} script file(s) to {workflows_dir}")
553
+ for path in written:
554
+ console.print(f" [dim]{path}[/dim]")
555
+ else:
556
+ console.print(
557
+ "[dim]No script files restored — manifest predates per-script CIDs.[/dim]"
558
+ )
530
559
  else:
531
560
  error(SyncMessages.FAILED_RETRIEVE_IPFS)
532
561
  info(SyncMessages.CID_INVALID_OR_NOT_PROPAGATED)
@@ -58,6 +58,7 @@ class IPFSSync:
58
58
 
59
59
  # Local IPFS daemon endpoint (default port)
60
60
  LOCAL_IPFS_API = "http://127.0.0.1:5001/api/v0/add"
61
+ LOCAL_IPFS_CAT = "http://127.0.0.1:5001/api/v0/cat"
61
62
 
62
63
  # Public IPFS gateways for retrieval
63
64
  RETRIEVE_GATEWAY = "https://ipfs.io/ipfs/{cid}"
@@ -280,6 +281,96 @@ class IPFSSync:
280
281
  logger.error(f"Failed to retrieve from all gateways: {cid}")
281
282
  return None
282
283
 
284
+ def add_file_to_ipfs(self, file_path: Path, max_retries: int = 3) -> Optional[str]:
285
+ """Add a single file to the local IPFS daemon and return its CID.
286
+
287
+ Used by push() to upload each workflow script body alongside the
288
+ manifest, so consumers can reconstruct the full workflows directory
289
+ on pull.
290
+ """
291
+ if not self._check_local_ipfs():
292
+ logger.error("Cannot add file to IPFS: local daemon unavailable")
293
+ return None
294
+
295
+ path = Path(file_path)
296
+ if not path.is_file():
297
+ logger.warning(f"Skipping IPFS add — file does not exist: {path}")
298
+ return None
299
+
300
+ def attempt_upload():
301
+ with open(path, "rb") as fh:
302
+ files = {"file": (path.name, fh.read())}
303
+ response = requests.post(self.LOCAL_IPFS_API, files=files, timeout=30)
304
+ if response.status_code == 200:
305
+ cid = response.json().get("Hash")
306
+ logger.info(f"Added {path.name} to IPFS: {cid}")
307
+ return (True, cid)
308
+ logger.warning(f"IPFS add failed for {path.name}: {response.status_code}")
309
+ return (False, None)
310
+
311
+ return self._retry_with_backoff(attempt_upload, max_retries=max_retries)
312
+
313
+ def fetch_file_from_ipfs(self, cid: str, timeout: int = 30) -> Optional[bytes]:
314
+ """Fetch raw bytes for a CID via the local daemon, falling back to gateways.
315
+
316
+ Used by pull_workflows() to reconstruct script files referenced by
317
+ per-script CIDs in the manifest.
318
+ """
319
+ # Local daemon first
320
+ if self._check_local_ipfs():
321
+ try:
322
+ response = requests.post(
323
+ self.LOCAL_IPFS_CAT,
324
+ params={"arg": cid},
325
+ timeout=timeout,
326
+ )
327
+ if response.status_code == 200:
328
+ return response.content
329
+ logger.warning(f"Local daemon cat failed for {cid}: {response.status_code}")
330
+ except Exception as e:
331
+ logger.warning(f"Local daemon cat error for {cid}: {e}")
332
+
333
+ # Public gateway fallback
334
+ for gateway_template in [self.RETRIEVE_GATEWAY] + self.ALT_GATEWAYS:
335
+ url = gateway_template.format(cid=cid)
336
+ try:
337
+ response = requests.get(url, timeout=timeout)
338
+ if response.status_code == 200:
339
+ return response.content
340
+ logger.warning(
341
+ f"Gateway {gateway_template} returned {response.status_code} for {cid}"
342
+ )
343
+ except Exception as e:
344
+ logger.warning(f"Gateway {gateway_template} error for {cid}: {e}")
345
+ return None
346
+
347
+ def _embed_script_cids(self, command_data: dict, workflows_dir: Path) -> dict:
348
+ """Augment a lockfile dict in-memory with per-script IPFS CIDs.
349
+
350
+ Reads each command's ``file`` from ``workflows_dir``, adds it to IPFS,
351
+ and stores the resulting CID as ``script_cid`` on the entry. Bumps
352
+ the manifest version to "2.1" to signal that script bodies are
353
+ retrievable.
354
+ """
355
+ commands = command_data.get("commands", {})
356
+ any_uploaded = False
357
+ for name, entry in commands.items():
358
+ script_filename = entry.get("file")
359
+ if not script_filename:
360
+ continue
361
+ script_path = workflows_dir / script_filename
362
+ if not script_path.is_file():
363
+ logger.warning(f"Skipping '{name}' — script file missing: {script_path}")
364
+ continue
365
+ cid = self.add_file_to_ipfs(script_path)
366
+ if cid:
367
+ entry["script_cid"] = cid
368
+ any_uploaded = True
369
+
370
+ if any_uploaded:
371
+ command_data["version"] = "2.1"
372
+ return command_data
373
+
283
374
  def push(self, command_lock_path: Path, description: str = "") -> Optional[str]:
284
375
  """
285
376
  Push command state to IPFS.
@@ -296,6 +387,12 @@ class IPFSSync:
296
387
  with open(command_lock_path) as f:
297
388
  command_data = json.load(f)
298
389
 
390
+ # Add each workflow script to IPFS so consumers can reconstruct
391
+ # the full workflows directory on pull. Operates on the in-memory
392
+ # copy so the on-disk lockfile stays untouched.
393
+ workflows_dir = Path(command_lock_path).parent
394
+ command_data = self._embed_script_cids(command_data, workflows_dir)
395
+
299
396
  # Add sync metadata
300
397
  sync_data = {
301
398
  "version": "1.0",
@@ -376,6 +473,74 @@ class IPFSSync:
376
473
 
377
474
  return data.get("commands", {})
378
475
 
476
+ def pull_workflows(
477
+ self,
478
+ cid: str,
479
+ workflows_dir: Path,
480
+ verify: bool = True,
481
+ ) -> list[Path]:
482
+ """Pull a manifest and reconstruct the workflow script files on disk.
483
+
484
+ Walks each command entry in the retrieved manifest, fetches its
485
+ ``script_cid`` (if present) from IPFS, verifies the recorded
486
+ ``content_hash``, and writes the file to ``workflows_dir``.
487
+
488
+ Returns the list of files written. If the manifest predates per-script
489
+ CIDs (lockfile schema < 2.1), the manifest is still pulled but no
490
+ files are written and a warning is logged.
491
+
492
+ Raises:
493
+ ValueError: when a fetched script's SHA-256 does not match the
494
+ ``content_hash`` recorded in the lockfile.
495
+ """
496
+ manifest = self.pull(cid, verify=verify)
497
+ if not manifest:
498
+ return []
499
+
500
+ commands = manifest.get("commands", {})
501
+ # `pull()` strips the outer envelope, so commands maps directly.
502
+ # Some callers still get the v2.x nested shape — handle both.
503
+ if (
504
+ isinstance(commands, dict)
505
+ and "commands" in commands
506
+ and isinstance(commands["commands"], dict)
507
+ ):
508
+ commands = commands["commands"]
509
+
510
+ if not commands:
511
+ return []
512
+
513
+ workflows_dir = Path(workflows_dir)
514
+ workflows_dir.mkdir(parents=True, exist_ok=True)
515
+
516
+ written: list[Path] = []
517
+ for name, entry in commands.items():
518
+ script_filename = entry.get("file")
519
+ script_cid = entry.get("script_cid")
520
+ if not script_filename or not script_cid:
521
+ logger.warning(f"Skipping '{name}': manifest predates per-script CID sync")
522
+ continue
523
+
524
+ payload = self.fetch_file_from_ipfs(script_cid)
525
+ if payload is None:
526
+ logger.error(f"Failed to fetch script for '{name}' (cid={script_cid})")
527
+ continue
528
+
529
+ expected_hash = entry.get("content_hash")
530
+ if expected_hash:
531
+ expected_value = expected_hash.split(":", 1)[-1]
532
+ actual = hashlib.sha256(payload).hexdigest()
533
+ if actual != expected_value:
534
+ raise ValueError(
535
+ f"hash mismatch for '{name}': expected {expected_value}, got {actual}"
536
+ )
537
+
538
+ target = workflows_dir / script_filename
539
+ target.write_bytes(payload)
540
+ written.append(target)
541
+
542
+ return written
543
+
379
544
  def pull_latest(
380
545
  self,
381
546
  scope: str = "global",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcli-framework
3
- Version: 8.0.45
3
+ Version: 8.0.46
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>
File without changes