mcli-framework 8.0.46__tar.gz → 8.0.48__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 (236) hide show
  1. {mcli_framework-8.0.46/src/mcli_framework.egg-info → mcli_framework-8.0.48}/PKG-INFO +1 -1
  2. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/pyproject.toml +1 -1
  3. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/sync_cmd.py +119 -9
  4. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/ipfs_sync.py +23 -17
  5. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/ipns_manager.py +17 -2
  6. mcli_framework-8.0.48/src/mcli/lib/sync_key_store.py +69 -0
  7. {mcli_framework-8.0.46 → mcli_framework-8.0.48/src/mcli_framework.egg-info}/PKG-INFO +1 -1
  8. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli_framework.egg-info/SOURCES.txt +1 -0
  9. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/LICENSE +0 -0
  10. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/MANIFEST.in +0 -0
  11. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/README.md +0 -0
  12. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/llms-full.txt +0 -0
  13. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/llms.txt +0 -0
  14. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/mcli_rust/Cargo.toml +0 -0
  15. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/mcli_rust/src/command_parser.rs +0 -0
  16. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/mcli_rust/src/file_watcher.rs +0 -0
  17. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/mcli_rust/src/lib.rs +0 -0
  18. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/mcli_rust/src/process_manager.rs +0 -0
  19. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/mcli_rust/src/tfidf.rs +0 -0
  20. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/setup.cfg +0 -0
  21. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/__init__.py +0 -0
  22. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/__init__.py +0 -0
  23. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/commands_cmd.py +0 -0
  24. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/completion_helpers.py +0 -0
  25. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/context_cmd.py +0 -0
  26. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/create_cmd.py +0 -0
  27. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/delete_cmd.py +0 -0
  28. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/edit_cmd.py +0 -0
  29. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/import_cmd.py +0 -0
  30. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/init_cmd.py +0 -0
  31. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/list_cmd.py +0 -0
  32. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/main.py +0 -0
  33. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/migrate_cmd.py +0 -0
  34. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/model/__init__.py +0 -0
  35. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/model/model.py +0 -0
  36. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/model_cmd.py +0 -0
  37. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/mv_cmd.py +0 -0
  38. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/new_cmd.py +0 -0
  39. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/remove_cmd.py +0 -0
  40. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/rm_cmd.py +0 -0
  41. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/search_cmd.py +0 -0
  42. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/services_cmd.py +0 -0
  43. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/setup_cmd.py +0 -0
  44. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/source_sync_cmd.py +0 -0
  45. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/video/__init__.py +0 -0
  46. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/video/video.py +0 -0
  47. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/config.toml +0 -0
  48. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/__init__.py +0 -0
  49. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/api/__init__.py +0 -0
  50. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/api/api.py +0 -0
  51. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/api/daemon_client.py +0 -0
  52. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/api/daemon_client_local.py +0 -0
  53. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/api/daemon_decorator.py +0 -0
  54. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/api/mcli_decorators.py +0 -0
  55. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/auth/__init__.py +0 -0
  56. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/auth/auth.py +0 -0
  57. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/auth/aws_manager.py +0 -0
  58. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/auth/azure_manager.py +0 -0
  59. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/auth/credential_manager.py +0 -0
  60. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/auth/gcp_manager.py +0 -0
  61. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/auth/key_manager.py +0 -0
  62. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/auth/mcli_manager.py +0 -0
  63. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/auth/token_manager.py +0 -0
  64. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/auth/token_util.py +0 -0
  65. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/config/__init__.py +0 -0
  66. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/config/config.py +0 -0
  67. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/config/settings.py +0 -0
  68. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/constants/__init__.py +0 -0
  69. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/constants/commands.py +0 -0
  70. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/constants/defaults.py +0 -0
  71. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/constants/env.py +0 -0
  72. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/constants/messages.py +0 -0
  73. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/constants/paths.py +0 -0
  74. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/constants/scripts.py +0 -0
  75. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/constants/storage.py +0 -0
  76. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/custom_commands.py +0 -0
  77. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/discovery/__init__.py +0 -0
  78. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/discovery/command_discovery.py +0 -0
  79. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/erd/__init__.py +0 -0
  80. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/erd/erd.py +0 -0
  81. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/erd/generate_graph.py +0 -0
  82. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/errors.py +0 -0
  83. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/feature_detection.py +0 -0
  84. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/files/__init__.py +0 -0
  85. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/files/files.py +0 -0
  86. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/folder_workflows.py +0 -0
  87. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/fs/__init__.py +0 -0
  88. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/fs/fs.py +0 -0
  89. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/ipfs_utils.py +0 -0
  90. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/lib.py +0 -0
  91. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/logger/__init__.py +0 -0
  92. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/logger/correlation.py +0 -0
  93. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/logger/logger.py +0 -0
  94. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/logger/structured.py +0 -0
  95. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/optional_deps.py +0 -0
  96. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/paths.py +0 -0
  97. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/performance/__init__.py +0 -0
  98. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/performance/optimizer.py +0 -0
  99. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/performance/rust_bridge.py +0 -0
  100. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/performance/uvloop_config.py +0 -0
  101. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/pickles/__init__.py +0 -0
  102. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/pickles/pickles.py +0 -0
  103. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/pyenv/__init__.py +0 -0
  104. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/pyenv/deps.py +0 -0
  105. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/pyenv/manager.py +0 -0
  106. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/pyenv/venv.py +0 -0
  107. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/script_loader.py +0 -0
  108. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/script_sync.py +0 -0
  109. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/script_watcher.py +0 -0
  110. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/search/cached_vectorizer.py +0 -0
  111. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/secrets/__init__.py +0 -0
  112. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/secrets/commands.py +0 -0
  113. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/secrets/manager.py +0 -0
  114. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/secrets/repl.py +0 -0
  115. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/secrets/store.py +0 -0
  116. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/services/__init__.py +0 -0
  117. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/services/config.py +0 -0
  118. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/services/data_pipeline.py +0 -0
  119. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/services/health.py +0 -0
  120. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/services/lsh_client.py +0 -0
  121. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/services/manager.py +0 -0
  122. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/services/redis_service.py +0 -0
  123. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/services/registry.py +0 -0
  124. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/services/state.py +0 -0
  125. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/services/supervisor.py +0 -0
  126. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/shell/__init__.py +0 -0
  127. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/shell/exceptions.py +0 -0
  128. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/shell/shell.py +0 -0
  129. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/templates/__init__.py +0 -0
  130. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/templates/command_templates.py +0 -0
  131. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/toml/__init__.py +0 -0
  132. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/toml/toml.py +0 -0
  133. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/types.py +0 -0
  134. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/ui/styling.py +0 -0
  135. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/ui/visual_effects.py +0 -0
  136. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/watcher/__init__.py +0 -0
  137. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/watcher/watcher.py +0 -0
  138. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/workflow_models.py +0 -0
  139. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/workspace_registry.py +0 -0
  140. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/mygroup/__init__.py +0 -0
  141. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/mygroup/test_cmd.py +0 -0
  142. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/public/__init__.py +0 -0
  143. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/public/commands/__init__.py +0 -0
  144. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/public/oi/oi.py +0 -0
  145. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/public/public.py +0 -0
  146. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/self/__init__.py +0 -0
  147. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/self/completion_cmd.py +0 -0
  148. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/self/env_cmd.py +0 -0
  149. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/self/health_cmd.py +0 -0
  150. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/self/ipfs_cmd.py +0 -0
  151. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/self/logs_cmd.py +0 -0
  152. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/self/migrate_cmd.py +0 -0
  153. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/self/release_notes_cmd.py +0 -0
  154. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/self/self_cmd.py +0 -0
  155. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/self/store_cmd.py +0 -0
  156. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/self/test_cmd.py +0 -0
  157. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/self/workflows_cmd.py +0 -0
  158. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/storage/__init__.py +0 -0
  159. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/storage/backends/__init__.py +0 -0
  160. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/storage/backends/ipfs_backend.py +0 -0
  161. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/storage/base.py +0 -0
  162. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/storage/cache.py +0 -0
  163. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/storage/encryption.py +0 -0
  164. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/storage/factory.py +0 -0
  165. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/storage/registry.py +0 -0
  166. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/storage/storacha_cli.py +0 -0
  167. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/__init__.py +0 -0
  168. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/daemon/__init__.py +0 -0
  169. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/daemon/async_command_database.py +0 -0
  170. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/daemon/async_process_manager.py +0 -0
  171. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/daemon/client.py +0 -0
  172. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/daemon/daemon.py +0 -0
  173. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/daemon/daemon_api.py +0 -0
  174. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/daemon/enhanced_daemon.py +0 -0
  175. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/daemon/process_cli.py +0 -0
  176. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/daemon/process_manager.py +0 -0
  177. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/daemon/test_daemon.py +0 -0
  178. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/doc_convert.py +0 -0
  179. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/docker/__init__.py +0 -0
  180. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/docker/docker.py +0 -0
  181. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/file/__init__.py +0 -0
  182. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/gcloud/__init__.py +0 -0
  183. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/gcloud/config.toml +0 -0
  184. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/gcloud/gcloud.py +0 -0
  185. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/git_commit/__init__.py +0 -0
  186. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/git_commit/ai_service.py +0 -0
  187. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/interview/__init__.py +0 -0
  188. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/lsh_integration.py +0 -0
  189. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/client.py +0 -0
  190. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/download_and_run_efficient_models.py +0 -0
  191. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/lightweight_embedder.py +0 -0
  192. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/lightweight_model_server.py +0 -0
  193. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/lightweight_test.py +0 -0
  194. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/model_service.py +0 -0
  195. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/ollama_efficient_runner.py +0 -0
  196. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/openai_adapter.py +0 -0
  197. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/pdf_processor.py +0 -0
  198. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/test_efficient_runner.py +0 -0
  199. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/test_example.py +0 -0
  200. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/test_integration.py +0 -0
  201. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/test_new_features.py +0 -0
  202. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/notebook/__init__.py +0 -0
  203. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/notebook/command_loader.py +0 -0
  204. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/notebook/converter.py +0 -0
  205. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/notebook/executor.py +0 -0
  206. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/notebook/notebook_cmd.py +0 -0
  207. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/notebook/schema.py +0 -0
  208. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/notebook/validator.py +0 -0
  209. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/openai/openai.py +0 -0
  210. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/registry/__init__.py +0 -0
  211. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/registry/registry.py +0 -0
  212. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/repo/__init__.py +0 -0
  213. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/repo/repo.py +0 -0
  214. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/scheduler/__init__.py +0 -0
  215. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/scheduler/cron_parser.py +0 -0
  216. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/scheduler/job.py +0 -0
  217. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/scheduler/models.py +0 -0
  218. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/scheduler/monitor.py +0 -0
  219. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/scheduler/persistence.py +0 -0
  220. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/scheduler/scheduler.py +0 -0
  221. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/scheduler/validation.py +0 -0
  222. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/search/__init__.py +0 -0
  223. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/secrets/__init__.py +0 -0
  224. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/secrets/secrets_cmd.py +0 -0
  225. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/storage/__init__.py +0 -0
  226. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/storage/storage_cmd.py +0 -0
  227. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/sync/__init__.py +0 -0
  228. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/sync/test_cmd.py +0 -0
  229. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/videos/__init__.py +0 -0
  230. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/wakatime/__init__.py +0 -0
  231. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/wakatime/wakatime.py +0 -0
  232. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/workflow.py +0 -0
  233. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli_framework.egg-info/dependency_links.txt +0 -0
  234. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli_framework.egg-info/entry_points.txt +0 -0
  235. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli_framework.egg-info/requires.txt +0 -0
  236. {mcli_framework-8.0.46 → mcli_framework-8.0.48}/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.46
3
+ Version: 8.0.48
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.46"
3
+ version = "8.0.48"
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"
@@ -7,6 +7,7 @@ Provides:
7
7
  """
8
8
 
9
9
  import json
10
+ import os
10
11
  import shutil
11
12
  import subprocess
12
13
  import sys
@@ -494,20 +495,17 @@ def sync_pull_command(
494
495
 
495
496
  ipfs = IPFSSync()
496
497
 
497
- if cid:
498
- # Explicit CID — just retrieve it
499
- info(SyncMessages.RETRIEVING_FROM_IPFS.format(cid=cid))
500
- data = ipfs.pull(cid, verify=not no_verify)
501
- else:
502
- # No CID — resolve via IPNS
498
+ if not cid:
499
+ # No CID — resolve via IPNS, then fall through to the explicit-CID flow
500
+ # so that --workflows-dir extraction also works for IPNS-resolved pulls.
503
501
  if not ensure_daemon_running():
504
502
  error(SyncMessages.DAEMON_START_FAILED)
505
503
  return
506
504
 
507
505
  info(SyncMessages.IPNS_RESOLVING)
508
- data = ipfs.pull_latest(scope="global", repo_name=repo)
506
+ cid = ipfs.resolve_latest_cid(scope="global", repo_name=repo)
509
507
 
510
- if data is None:
508
+ if not cid:
511
509
  from mcli.lib.ipns_manager import get_sync_key
512
510
 
513
511
  if not get_sync_key():
@@ -519,6 +517,10 @@ def sync_pull_command(
519
517
  console.print(SyncMessages.IPNS_PULL_HINT)
520
518
  return
521
519
 
520
+ # Explicit or just-resolved CID — retrieve it
521
+ info(SyncMessages.RETRIEVING_FROM_IPFS.format(cid=cid))
522
+ data = ipfs.pull(cid, verify=not no_verify)
523
+
522
524
  if data:
523
525
  success(SyncMessages.RETRIEVED_FROM_IPFS)
524
526
 
@@ -542,7 +544,7 @@ def sync_pull_command(
542
544
  console.print(SyncMessages.VERSION_LABEL.format(version=data["version"]))
543
545
 
544
546
  # Optional: reconstruct script files from per-script CIDs
545
- if workflows_dir and cid:
547
+ if workflows_dir:
546
548
  try:
547
549
  written = ipfs.pull_workflows(cid, workflows_dir, verify=not no_verify)
548
550
  except ValueError as exc:
@@ -832,3 +834,111 @@ def sync_info(is_global: bool):
832
834
  else:
833
835
  console.print(" Installed: No")
834
836
  console.print(" [dim]Install with: brew install ipfs[/dim]")
837
+
838
+
839
+ @sync_group.group(name="key")
840
+ def sync_key_group():
841
+ """🔑 Manage the persistent IPNS sync key.
842
+
843
+ Generates / shows / sets / clears the shared secret used to derive
844
+ a deterministic IPNS name for cross-host workflow sync. The
845
+ ``MCLI_SYNC_KEY`` environment variable, if set, always wins over
846
+ the on-disk value.
847
+ """
848
+
849
+
850
+ def _mask_key(key: str) -> str:
851
+ if len(key) <= 12:
852
+ return "*" * len(key)
853
+ return f"{key[:4]}...{key[-4:]}"
854
+
855
+
856
+ @sync_key_group.command(name="gen")
857
+ @click.option("--force", "-f", is_flag=True, help="Overwrite an existing key")
858
+ @click.option("--show", is_flag=True, help="Print the full key (default masks it)")
859
+ def sync_key_gen(force: bool, show: bool):
860
+ """Generate and persist a new 64-char hex sync key.
861
+
862
+ Examples:
863
+ mcli sync key gen
864
+ mcli sync key gen --show
865
+ mcli sync key gen --force --show
866
+ """
867
+ from mcli.lib.sync_key_store import SyncKeyStore
868
+
869
+ store = SyncKeyStore()
870
+ try:
871
+ key = store.generate(force=force)
872
+ except FileExistsError:
873
+ error("A sync key is already configured.")
874
+ info("Use --force to overwrite, or 'mcli sync key show' to view it.")
875
+ return 1
876
+
877
+ success(f"Generated sync key at {store.path}")
878
+ if show:
879
+ console.print(f"[bold cyan]{key}[/bold cyan]")
880
+ else:
881
+ console.print(f"[dim]Key: {_mask_key(key)} (use --show to print full)[/dim]")
882
+ console.print(
883
+ "[dim]Share this key with teammates / your other hosts. "
884
+ "Then run `mcli sync key set <key>` on each peer.[/dim]"
885
+ )
886
+ return 0
887
+
888
+
889
+ @sync_key_group.command(name="set")
890
+ @click.argument("key")
891
+ def sync_key_set(key: str):
892
+ """Persist an existing 64-char hex sync key.
893
+
894
+ Use this on a second host after copying the key generated on the
895
+ first.
896
+ """
897
+ from mcli.lib.sync_key_store import SyncKeyStore
898
+
899
+ try:
900
+ SyncKeyStore().set(key.strip())
901
+ except ValueError as exc:
902
+ error(str(exc))
903
+ return 1
904
+ success("Sync key stored.")
905
+ return 0
906
+
907
+
908
+ @sync_key_group.command(name="show")
909
+ @click.option("--reveal", is_flag=True, help="Print the full key (default masks it)")
910
+ def sync_key_show(reveal: bool):
911
+ """Show the currently configured sync key (masked unless --reveal)."""
912
+ from mcli.lib.sync_key_store import SyncKeyStore
913
+
914
+ env_value = os.environ.get("MCLI_SYNC_KEY")
915
+ stored = SyncKeyStore().get()
916
+
917
+ if not env_value and not stored:
918
+ info("No sync key configured.")
919
+ console.print("[dim]Generate one with: mcli sync key gen[/dim]")
920
+ return 1
921
+
922
+ if env_value:
923
+ label = "MCLI_SYNC_KEY env var (overrides on-disk value)"
924
+ value = env_value
925
+ else:
926
+ label = "stored at " + str(SyncKeyStore().path)
927
+ value = stored
928
+
929
+ console.print(f"[bold]Source:[/bold] {label}")
930
+ console.print(f"[bold]Key:[/bold] [cyan]{value if reveal else _mask_key(value)}[/cyan]")
931
+ if not reveal:
932
+ console.print("[dim]Use --reveal to print the full key.[/dim]")
933
+ return 0
934
+
935
+
936
+ @sync_key_group.command(name="clear")
937
+ @click.confirmation_option(prompt="Remove the stored sync key?")
938
+ def sync_key_clear():
939
+ """Delete the persisted sync key (env var, if set, is untouched)."""
940
+ from mcli.lib.sync_key_store import SyncKeyStore
941
+
942
+ SyncKeyStore().clear()
943
+ success("Stored sync key removed.")
944
+ return 0
@@ -541,45 +541,51 @@ class IPFSSync:
541
541
 
542
542
  return written
543
543
 
544
- def pull_latest(
544
+ def resolve_latest_cid(
545
545
  self,
546
546
  scope: str = "global",
547
547
  repo_name: Optional[str] = None,
548
- verify: bool = True,
549
- ) -> Optional[dict]:
550
- """Pull the latest workflow state by resolving via IPNS.
551
-
552
- Requires MCLI_SYNC_KEY to be set. Uses deterministic IPNS key
553
- derivation to find the latest CID without explicit CID sharing.
548
+ ) -> Optional[str]:
549
+ """Resolve the deterministic IPNS name to a current CID.
554
550
 
555
- Args:
556
- scope: Sync scope (e.g. "global" or "local")
557
- repo_name: Override auto-detected repo name (for cross-repo pull)
558
- verify: Whether to verify hash integrity
559
-
560
- Returns:
561
- Command data if successful, None otherwise
551
+ Returns the CID string on success, ``None`` if the sync key is
552
+ unset, the key cannot be imported into Kubo, or IPNS resolution
553
+ fails. Surfaces the CID so CLI callers can hand it to
554
+ ``pull_workflows`` for script extraction.
562
555
  """
563
556
  sync_key = get_sync_key()
564
557
  if not sync_key:
565
- logger.warning("MCLI_SYNC_KEY not set — cannot resolve via IPNS")
558
+ logger.warning("Sync key not configured — cannot resolve via IPNS")
566
559
  return None
567
560
 
568
561
  repo = repo_name or get_repo_name()
569
562
  key_info = derive_key_info(sync_key, repo, scope)
570
563
 
571
- # Ensure key is in Kubo so we can resolve
572
564
  ipns_name = ensure_key_imported(key_info)
573
565
  if not ipns_name:
574
566
  logger.error("Failed to import IPNS key into Kubo")
575
567
  return None
576
568
 
577
- # Resolve IPNS to CID
578
569
  cid = resolve_ipns(ipns_name)
579
570
  if not cid:
580
571
  logger.error("IPNS resolution failed — no workflows published yet?")
581
572
  return None
573
+ return cid
574
+
575
+ def pull_latest(
576
+ self,
577
+ scope: str = "global",
578
+ repo_name: Optional[str] = None,
579
+ verify: bool = True,
580
+ ) -> Optional[dict]:
581
+ """Pull the latest workflow state by resolving via IPNS.
582
582
 
583
+ Requires the sync key to be configured (env var or store).
584
+ Returns the command data dict on success, ``None`` otherwise.
585
+ """
586
+ cid = self.resolve_latest_cid(scope=scope, repo_name=repo_name)
587
+ if not cid:
588
+ return None
583
589
  return self.pull(cid, verify=verify)
584
590
 
585
591
  def get_history(self, limit: int = 10) -> list[dict]:
@@ -174,8 +174,23 @@ def resolve_ipns(ipns_name: str) -> Optional[str]:
174
174
 
175
175
 
176
176
  def get_sync_key() -> Optional[str]:
177
- """Return the MCLI_SYNC_KEY environment variable, or None if unset."""
178
- return os.environ.get(EnvVars.MCLI_SYNC_KEY) or None
177
+ """Return the active sync key.
178
+
179
+ Resolution order:
180
+ 1. ``MCLI_SYNC_KEY`` environment variable (lets users override per-shell).
181
+ 2. The persistent on-disk store at ``$MCLI_HOME/sync_key.json``.
182
+
183
+ Returns ``None`` when neither source has a value.
184
+ """
185
+ env_key = os.environ.get(EnvVars.MCLI_SYNC_KEY)
186
+ if env_key:
187
+ return env_key
188
+
189
+ # Lazy import to avoid a hard dependency cycle if the store module is
190
+ # ever extended to read IPNS state.
191
+ from mcli.lib.sync_key_store import SyncKeyStore
192
+
193
+ return SyncKeyStore().get()
179
194
 
180
195
 
181
196
  def get_repo_name() -> str:
@@ -0,0 +1,69 @@
1
+ """Persistent storage for the shared workflow sync key.
2
+
3
+ The store keeps a 64-character hex secret on disk so users do not have
4
+ to ``export MCLI_SYNC_KEY=...`` in every shell. The env var still wins
5
+ when set — see :func:`mcli.lib.ipns_manager.get_sync_key`.
6
+
7
+ File: ``$MCLI_HOME/sync_key.json`` (default ``~/.mcli/sync_key.json``)
8
+ mode 0600. JSON shape: ``{"key": "<64 hex chars>"}``.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import json
14
+ import os
15
+ import re
16
+ import secrets
17
+ from pathlib import Path
18
+ from typing import Optional
19
+
20
+ from mcli.lib.paths import get_mcli_home
21
+
22
+ _FILENAME = "sync_key.json"
23
+ _HEX64 = re.compile(r"^[0-9a-fA-F]{64}$")
24
+
25
+
26
+ class SyncKeyStore:
27
+ """Read/write the persistent sync key on disk."""
28
+
29
+ @property
30
+ def path(self) -> Path:
31
+ return get_mcli_home() / _FILENAME
32
+
33
+ def get(self) -> Optional[str]:
34
+ path = self.path
35
+ if not path.is_file():
36
+ return None
37
+ try:
38
+ data = json.loads(path.read_text())
39
+ except (json.JSONDecodeError, OSError):
40
+ return None
41
+ key = data.get("key")
42
+ return key if isinstance(key, str) and _HEX64.match(key) else None
43
+
44
+ def set(self, key: str) -> None:
45
+ if not isinstance(key, str) or not _HEX64.match(key):
46
+ raise ValueError("sync key must be a 64-char hex string")
47
+ self._write(key)
48
+
49
+ def generate(self, force: bool = False) -> str:
50
+ if self.path.exists() and not force:
51
+ raise FileExistsError(
52
+ f"sync key already exists at {self.path}; use force=True to overwrite"
53
+ )
54
+ key = secrets.token_hex(32)
55
+ self._write(key)
56
+ return key
57
+
58
+ def clear(self) -> None:
59
+ try:
60
+ self.path.unlink()
61
+ except FileNotFoundError:
62
+ pass
63
+
64
+ def _write(self, key: str) -> None:
65
+ path = self.path
66
+ path.parent.mkdir(parents=True, exist_ok=True)
67
+ # Write then chmod so the secret is never world-readable.
68
+ path.write_text(json.dumps({"key": key}))
69
+ os.chmod(path, 0o600)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcli-framework
3
- Version: 8.0.46
3
+ Version: 8.0.48
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>
@@ -53,6 +53,7 @@ src/mcli/lib/paths.py
53
53
  src/mcli/lib/script_loader.py
54
54
  src/mcli/lib/script_sync.py
55
55
  src/mcli/lib/script_watcher.py
56
+ src/mcli/lib/sync_key_store.py
56
57
  src/mcli/lib/types.py
57
58
  src/mcli/lib/workflow_models.py
58
59
  src/mcli/lib/workspace_registry.py
File without changes