mcli-framework 8.0.65__tar.gz → 8.0.66__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 (239) hide show
  1. {mcli_framework-8.0.65/src/mcli_framework.egg-info → mcli_framework-8.0.66}/PKG-INFO +1 -1
  2. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/pyproject.toml +1 -1
  3. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/script_loader.py +67 -7
  4. {mcli_framework-8.0.65 → mcli_framework-8.0.66/src/mcli_framework.egg-info}/PKG-INFO +1 -1
  5. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/LICENSE +0 -0
  6. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/MANIFEST.in +0 -0
  7. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/README.md +0 -0
  8. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/llms-full.txt +0 -0
  9. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/llms.txt +0 -0
  10. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/mcli_rust/Cargo.toml +0 -0
  11. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/mcli_rust/src/command_parser.rs +0 -0
  12. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/mcli_rust/src/file_watcher.rs +0 -0
  13. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/mcli_rust/src/lib.rs +0 -0
  14. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/mcli_rust/src/process_manager.rs +0 -0
  15. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/mcli_rust/src/tfidf.rs +0 -0
  16. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/setup.cfg +0 -0
  17. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/__init__.py +0 -0
  18. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/__main__.py +0 -0
  19. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/app/__init__.py +0 -0
  20. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/app/completion_helpers.py +0 -0
  21. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/app/context_cmd.py +0 -0
  22. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/app/delete_cmd.py +0 -0
  23. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/app/edit_cmd.py +0 -0
  24. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/app/import_cmd.py +0 -0
  25. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/app/init_cmd.py +0 -0
  26. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/app/list_cmd.py +0 -0
  27. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/app/main.py +0 -0
  28. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/app/model/__init__.py +0 -0
  29. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/app/model/model.py +0 -0
  30. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/app/model_cmd.py +0 -0
  31. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/app/mv_cmd.py +0 -0
  32. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/app/new_cmd.py +0 -0
  33. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/app/search_cmd.py +0 -0
  34. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/app/services_cmd.py +0 -0
  35. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/app/setup_cmd.py +0 -0
  36. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/app/source_sync_cmd.py +0 -0
  37. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/app/sync_cmd.py +0 -0
  38. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/app/video/__init__.py +0 -0
  39. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/app/video/video.py +0 -0
  40. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/config.toml +0 -0
  41. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/__init__.py +0 -0
  42. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/api/__init__.py +0 -0
  43. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/api/api.py +0 -0
  44. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/api/daemon_client.py +0 -0
  45. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/api/daemon_client_local.py +0 -0
  46. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/api/daemon_decorator.py +0 -0
  47. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/api/mcli_decorators.py +0 -0
  48. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/auth/__init__.py +0 -0
  49. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/auth/auth.py +0 -0
  50. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/auth/aws_manager.py +0 -0
  51. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/auth/azure_manager.py +0 -0
  52. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/auth/credential_manager.py +0 -0
  53. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/auth/gcp_manager.py +0 -0
  54. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/auth/key_manager.py +0 -0
  55. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/auth/mcli_manager.py +0 -0
  56. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/auth/token_manager.py +0 -0
  57. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/auth/token_util.py +0 -0
  58. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/config/__init__.py +0 -0
  59. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/config/config.py +0 -0
  60. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/config/settings.py +0 -0
  61. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/constants/__init__.py +0 -0
  62. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/constants/commands.py +0 -0
  63. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/constants/defaults.py +0 -0
  64. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/constants/env.py +0 -0
  65. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/constants/messages.py +0 -0
  66. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/constants/paths.py +0 -0
  67. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/constants/scripts.py +0 -0
  68. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/constants/storage.py +0 -0
  69. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/custom_commands.py +0 -0
  70. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/discovery/__init__.py +0 -0
  71. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/discovery/command_discovery.py +0 -0
  72. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/erd/__init__.py +0 -0
  73. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/erd/erd.py +0 -0
  74. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/erd/generate_graph.py +0 -0
  75. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/errors.py +0 -0
  76. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/feature_detection.py +0 -0
  77. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/files/__init__.py +0 -0
  78. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/files/files.py +0 -0
  79. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/folder_workflows.py +0 -0
  80. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/fs/__init__.py +0 -0
  81. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/fs/fs.py +0 -0
  82. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/ipfs_sync.py +0 -0
  83. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/ipfs_utils.py +0 -0
  84. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/ipns_manager.py +0 -0
  85. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/lib.py +0 -0
  86. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/logger/__init__.py +0 -0
  87. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/logger/correlation.py +0 -0
  88. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/logger/logger.py +0 -0
  89. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/logger/structured.py +0 -0
  90. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/optional_deps.py +0 -0
  91. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/paths.py +0 -0
  92. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/performance/__init__.py +0 -0
  93. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/performance/optimizer.py +0 -0
  94. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/performance/rust_bridge.py +0 -0
  95. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/performance/uvloop_config.py +0 -0
  96. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/pickles/__init__.py +0 -0
  97. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/pickles/pickles.py +0 -0
  98. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/pyenv/__init__.py +0 -0
  99. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/pyenv/deps.py +0 -0
  100. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/pyenv/manager.py +0 -0
  101. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/pyenv/venv.py +0 -0
  102. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/script_sync.py +0 -0
  103. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/script_watcher.py +0 -0
  104. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/search/cached_vectorizer.py +0 -0
  105. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/secrets/__init__.py +0 -0
  106. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/secrets/commands.py +0 -0
  107. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/secrets/manager.py +0 -0
  108. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/secrets/repl.py +0 -0
  109. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/secrets/store.py +0 -0
  110. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/services/__init__.py +0 -0
  111. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/services/config.py +0 -0
  112. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/services/data_pipeline.py +0 -0
  113. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/services/health.py +0 -0
  114. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/services/lsh_client.py +0 -0
  115. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/services/manager.py +0 -0
  116. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/services/redis_service.py +0 -0
  117. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/services/registry.py +0 -0
  118. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/services/state.py +0 -0
  119. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/services/supervisor.py +0 -0
  120. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/shell/__init__.py +0 -0
  121. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/shell/exceptions.py +0 -0
  122. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/shell/shell.py +0 -0
  123. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/sync_key_store.py +0 -0
  124. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/templates/__init__.py +0 -0
  125. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/templates/command_templates.py +0 -0
  126. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/toml/__init__.py +0 -0
  127. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/toml/toml.py +0 -0
  128. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/types.py +0 -0
  129. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/ui/styling.py +0 -0
  130. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/ui/visual_effects.py +0 -0
  131. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/watcher/__init__.py +0 -0
  132. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/watcher/watcher.py +0 -0
  133. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/workflow_models.py +0 -0
  134. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/workflow_runtime.py +0 -0
  135. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/lib/workspace_registry.py +0 -0
  136. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/mygroup/__init__.py +0 -0
  137. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/mygroup/test_cmd.py +0 -0
  138. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/public/__init__.py +0 -0
  139. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/public/commands/__init__.py +0 -0
  140. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/public/oi/oi.py +0 -0
  141. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/public/public.py +0 -0
  142. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/self/__init__.py +0 -0
  143. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/self/completion_cmd.py +0 -0
  144. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/self/env_cmd.py +0 -0
  145. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/self/health_cmd.py +0 -0
  146. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/self/ipfs_cmd.py +0 -0
  147. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/self/logs_cmd.py +0 -0
  148. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/self/migrate_cmd.py +0 -0
  149. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/self/release_notes_cmd.py +0 -0
  150. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/self/self_cmd.py +0 -0
  151. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/self/store_cmd.py +0 -0
  152. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/self/test_cmd.py +0 -0
  153. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/self/workflows_cmd.py +0 -0
  154. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/storage/__init__.py +0 -0
  155. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/storage/backends/__init__.py +0 -0
  156. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/storage/backends/ipfs_backend.py +0 -0
  157. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/storage/base.py +0 -0
  158. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/storage/cache.py +0 -0
  159. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/storage/encryption.py +0 -0
  160. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/storage/factory.py +0 -0
  161. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/storage/registry.py +0 -0
  162. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/storage/storacha_cli.py +0 -0
  163. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/__init__.py +0 -0
  164. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/ci/__init__.py +0 -0
  165. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/ci/act_lock.py +0 -0
  166. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/ci/act_runner.py +0 -0
  167. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/ci/ci.py +0 -0
  168. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/ci/runner_status.py +0 -0
  169. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/ci/workflow_transform.py +0 -0
  170. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/daemon/__init__.py +0 -0
  171. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/daemon/async_command_database.py +0 -0
  172. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/daemon/async_process_manager.py +0 -0
  173. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/daemon/client.py +0 -0
  174. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/daemon/daemon.py +0 -0
  175. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/daemon/daemon_api.py +0 -0
  176. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/daemon/enhanced_daemon.py +0 -0
  177. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/daemon/process_cli.py +0 -0
  178. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/daemon/process_manager.py +0 -0
  179. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/daemon/test_daemon.py +0 -0
  180. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/doc_convert.py +0 -0
  181. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/docker/__init__.py +0 -0
  182. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/docker/docker.py +0 -0
  183. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/file/__init__.py +0 -0
  184. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/gcloud/__init__.py +0 -0
  185. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/gcloud/config.toml +0 -0
  186. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/gcloud/gcloud.py +0 -0
  187. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/git_commit/__init__.py +0 -0
  188. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/git_commit/ai_service.py +0 -0
  189. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/interview/__init__.py +0 -0
  190. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/lsh_integration.py +0 -0
  191. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/model_service/client.py +0 -0
  192. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/model_service/download_and_run_efficient_models.py +0 -0
  193. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/model_service/lightweight_embedder.py +0 -0
  194. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/model_service/lightweight_model_server.py +0 -0
  195. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/model_service/lightweight_test.py +0 -0
  196. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/model_service/model_service.py +0 -0
  197. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/model_service/ollama_efficient_runner.py +0 -0
  198. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/model_service/openai_adapter.py +0 -0
  199. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/model_service/pdf_processor.py +0 -0
  200. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/model_service/test_efficient_runner.py +0 -0
  201. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/model_service/test_example.py +0 -0
  202. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/model_service/test_integration.py +0 -0
  203. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/model_service/test_new_features.py +0 -0
  204. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/notebook/__init__.py +0 -0
  205. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/notebook/command_loader.py +0 -0
  206. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/notebook/converter.py +0 -0
  207. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/notebook/executor.py +0 -0
  208. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/notebook/notebook_cmd.py +0 -0
  209. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/notebook/schema.py +0 -0
  210. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/notebook/validator.py +0 -0
  211. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/openai/openai.py +0 -0
  212. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/registry/__init__.py +0 -0
  213. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/registry/registry.py +0 -0
  214. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/repo/__init__.py +0 -0
  215. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/repo/repo.py +0 -0
  216. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/scheduler/__init__.py +0 -0
  217. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/scheduler/cron_parser.py +0 -0
  218. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/scheduler/job.py +0 -0
  219. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/scheduler/models.py +0 -0
  220. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/scheduler/monitor.py +0 -0
  221. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/scheduler/persistence.py +0 -0
  222. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/scheduler/scheduler.py +0 -0
  223. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/scheduler/validation.py +0 -0
  224. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/search/__init__.py +0 -0
  225. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/secrets/__init__.py +0 -0
  226. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/secrets/secrets_cmd.py +0 -0
  227. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/storage/__init__.py +0 -0
  228. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/storage/storage_cmd.py +0 -0
  229. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/sync/__init__.py +0 -0
  230. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/sync/test_cmd.py +0 -0
  231. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/videos/__init__.py +0 -0
  232. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/wakatime/__init__.py +0 -0
  233. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/wakatime/wakatime.py +0 -0
  234. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli/workflow/workflow.py +0 -0
  235. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli_framework.egg-info/SOURCES.txt +0 -0
  236. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli_framework.egg-info/dependency_links.txt +0 -0
  237. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli_framework.egg-info/entry_points.txt +0 -0
  238. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/src/mcli_framework.egg-info/requires.txt +0 -0
  239. {mcli_framework-8.0.65 → mcli_framework-8.0.66}/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.65
3
+ Version: 8.0.66
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.65"
3
+ version = "8.0.66"
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"
@@ -22,7 +22,7 @@ import stat
22
22
  import subprocess
23
23
  import sys
24
24
  import tempfile
25
- from datetime import datetime
25
+ from datetime import datetime, timedelta
26
26
  from pathlib import Path
27
27
  from typing import Any, Optional
28
28
 
@@ -68,6 +68,9 @@ LANGUAGE_TO_SUFFIX: dict[str, str] = {
68
68
  "ipynb": "ipynb",
69
69
  }
70
70
 
71
+ VOLATILE_COMMAND_FIELDS = frozenset({"last_modified"})
72
+ LOCKFILE_SCHEMA_VERSION = "2.0"
73
+
71
74
 
72
75
  def parse_command_name(cmd_name: str) -> tuple[str, Optional[str]]:
73
76
  """Parse 'name:suffix' into (base_name, language_or_None).
@@ -187,7 +190,7 @@ class ScriptLoader:
187
190
 
188
191
  scripts.append(script_path)
189
192
 
190
- return sorted(scripts, key=lambda p: p.stem)
193
+ return sorted(scripts, key=lambda path: path.relative_to(self.workflows_dir).as_posix())
191
194
 
192
195
  def find_scripts_by_stem(self, stem: str) -> list[Path]:
193
196
  """Return all discovered scripts whose stem matches the given name.
@@ -853,20 +856,70 @@ class ScriptLoader:
853
856
  Dictionary containing lockfile data with v2 schema
854
857
  """
855
858
  scripts = self.discover_scripts()
859
+ existing_lockfile = self.load_lockfile()
860
+ existing_commands_value = existing_lockfile.get("commands", {}) if existing_lockfile else {}
861
+ existing_commands = (
862
+ existing_commands_value if isinstance(existing_commands_value, dict) else {}
863
+ )
864
+ commands: dict[str, Any] = {}
865
+ can_reuse_entries = bool(
866
+ existing_lockfile
867
+ and existing_lockfile.get("version") == LOCKFILE_SCHEMA_VERSION
868
+ and isinstance(existing_commands_value, dict)
869
+ )
856
870
 
857
- lockfile_data = {
858
- "version": "2.0",
871
+ lockfile_data: dict[str, Any] = {
872
+ "version": LOCKFILE_SCHEMA_VERSION,
859
873
  "generated_at": datetime.utcnow().isoformat() + "Z",
860
- "commands": {},
874
+ "commands": commands,
861
875
  }
862
876
 
863
877
  keys = self._assign_command_keys(scripts)
864
878
  for script_path in scripts:
865
879
  info = self.get_script_info(script_path)
866
- lockfile_data["commands"][keys[script_path]] = info
880
+ command_key = keys[script_path]
881
+ existing_info = existing_commands.get(command_key)
882
+ if (
883
+ can_reuse_entries
884
+ and isinstance(existing_info, dict)
885
+ and self._is_valid_utc_timestamp(existing_info.get("last_modified"))
886
+ and self._semantic_command_info(existing_info) == self._semantic_command_info(info)
887
+ ):
888
+ commands[command_key] = existing_info
889
+ else:
890
+ commands[command_key] = info
891
+
892
+ if (
893
+ existing_lockfile
894
+ and existing_lockfile.get("version") == lockfile_data["version"]
895
+ and existing_commands == commands
896
+ and self._is_valid_utc_timestamp(existing_lockfile.get("generated_at"))
897
+ ):
898
+ lockfile_data["generated_at"] = existing_lockfile["generated_at"]
867
899
 
868
900
  return lockfile_data
869
901
 
902
+ @staticmethod
903
+ def _semantic_command_info(command_info: Any) -> Any:
904
+ """Return command metadata without filesystem-derived volatile fields."""
905
+ if not isinstance(command_info, dict):
906
+ return command_info
907
+ return {
908
+ key: value for key, value in command_info.items() if key not in VOLATILE_COMMAND_FIELDS
909
+ }
910
+
911
+ @staticmethod
912
+ def _is_valid_utc_timestamp(value: Any) -> bool:
913
+ """Return whether a value is an ISO timestamp with an explicit UTC offset."""
914
+ if not isinstance(value, str):
915
+ return False
916
+ try:
917
+ normalized = f"{value[:-1]}+00:00" if value.endswith("Z") else value
918
+ timestamp = datetime.fromisoformat(normalized)
919
+ except ValueError:
920
+ return False
921
+ return timestamp.tzinfo is not None and timestamp.utcoffset() == timedelta(0)
922
+
870
923
  def _assign_command_keys(self, scripts: list[Path]) -> dict[Path, str]:
871
924
  """Assign a unique lockfile/command key to every discovered script.
872
925
 
@@ -934,10 +987,17 @@ class ScriptLoader:
934
987
  """
935
988
  try:
936
989
  lockfile_data = self.generate_lockfile()
990
+ serialized_lockfile = json.dumps(lockfile_data, indent=2)
991
+ if (
992
+ self.lockfile_path.exists()
993
+ and self.lockfile_path.read_text() == serialized_lockfile
994
+ ):
995
+ logger.debug(f"Lockfile unchanged: {self.lockfile_path}")
996
+ return True
937
997
  with open(self.lockfile_path, "w") as f:
938
998
  fcntl.flock(f, fcntl.LOCK_EX)
939
999
  try:
940
- json.dump(lockfile_data, f, indent=2)
1000
+ f.write(serialized_lockfile)
941
1001
  finally:
942
1002
  fcntl.flock(f, fcntl.LOCK_UN)
943
1003
  logger.info(f"Saved lockfile: {self.lockfile_path}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcli-framework
3
- Version: 8.0.65
3
+ Version: 8.0.66
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