mcli-framework 8.0.65__tar.gz → 8.0.67__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.67}/PKG-INFO +1 -1
  2. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/pyproject.toml +1 -1
  3. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/script_loader.py +67 -7
  4. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/ci/act_runner.py +32 -2
  5. {mcli_framework-8.0.65 → mcli_framework-8.0.67/src/mcli_framework.egg-info}/PKG-INFO +1 -1
  6. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/LICENSE +0 -0
  7. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/MANIFEST.in +0 -0
  8. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/README.md +0 -0
  9. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/llms-full.txt +0 -0
  10. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/llms.txt +0 -0
  11. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/mcli_rust/Cargo.toml +0 -0
  12. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/mcli_rust/src/command_parser.rs +0 -0
  13. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/mcli_rust/src/file_watcher.rs +0 -0
  14. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/mcli_rust/src/lib.rs +0 -0
  15. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/mcli_rust/src/process_manager.rs +0 -0
  16. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/mcli_rust/src/tfidf.rs +0 -0
  17. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/setup.cfg +0 -0
  18. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/__init__.py +0 -0
  19. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/__main__.py +0 -0
  20. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/app/__init__.py +0 -0
  21. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/app/completion_helpers.py +0 -0
  22. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/app/context_cmd.py +0 -0
  23. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/app/delete_cmd.py +0 -0
  24. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/app/edit_cmd.py +0 -0
  25. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/app/import_cmd.py +0 -0
  26. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/app/init_cmd.py +0 -0
  27. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/app/list_cmd.py +0 -0
  28. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/app/main.py +0 -0
  29. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/app/model/__init__.py +0 -0
  30. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/app/model/model.py +0 -0
  31. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/app/model_cmd.py +0 -0
  32. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/app/mv_cmd.py +0 -0
  33. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/app/new_cmd.py +0 -0
  34. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/app/search_cmd.py +0 -0
  35. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/app/services_cmd.py +0 -0
  36. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/app/setup_cmd.py +0 -0
  37. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/app/source_sync_cmd.py +0 -0
  38. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/app/sync_cmd.py +0 -0
  39. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/app/video/__init__.py +0 -0
  40. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/app/video/video.py +0 -0
  41. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/config.toml +0 -0
  42. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/__init__.py +0 -0
  43. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/api/__init__.py +0 -0
  44. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/api/api.py +0 -0
  45. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/api/daemon_client.py +0 -0
  46. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/api/daemon_client_local.py +0 -0
  47. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/api/daemon_decorator.py +0 -0
  48. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/api/mcli_decorators.py +0 -0
  49. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/auth/__init__.py +0 -0
  50. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/auth/auth.py +0 -0
  51. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/auth/aws_manager.py +0 -0
  52. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/auth/azure_manager.py +0 -0
  53. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/auth/credential_manager.py +0 -0
  54. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/auth/gcp_manager.py +0 -0
  55. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/auth/key_manager.py +0 -0
  56. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/auth/mcli_manager.py +0 -0
  57. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/auth/token_manager.py +0 -0
  58. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/auth/token_util.py +0 -0
  59. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/config/__init__.py +0 -0
  60. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/config/config.py +0 -0
  61. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/config/settings.py +0 -0
  62. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/constants/__init__.py +0 -0
  63. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/constants/commands.py +0 -0
  64. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/constants/defaults.py +0 -0
  65. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/constants/env.py +0 -0
  66. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/constants/messages.py +0 -0
  67. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/constants/paths.py +0 -0
  68. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/constants/scripts.py +0 -0
  69. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/constants/storage.py +0 -0
  70. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/custom_commands.py +0 -0
  71. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/discovery/__init__.py +0 -0
  72. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/discovery/command_discovery.py +0 -0
  73. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/erd/__init__.py +0 -0
  74. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/erd/erd.py +0 -0
  75. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/erd/generate_graph.py +0 -0
  76. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/errors.py +0 -0
  77. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/feature_detection.py +0 -0
  78. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/files/__init__.py +0 -0
  79. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/files/files.py +0 -0
  80. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/folder_workflows.py +0 -0
  81. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/fs/__init__.py +0 -0
  82. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/fs/fs.py +0 -0
  83. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/ipfs_sync.py +0 -0
  84. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/ipfs_utils.py +0 -0
  85. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/ipns_manager.py +0 -0
  86. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/lib.py +0 -0
  87. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/logger/__init__.py +0 -0
  88. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/logger/correlation.py +0 -0
  89. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/logger/logger.py +0 -0
  90. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/logger/structured.py +0 -0
  91. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/optional_deps.py +0 -0
  92. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/paths.py +0 -0
  93. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/performance/__init__.py +0 -0
  94. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/performance/optimizer.py +0 -0
  95. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/performance/rust_bridge.py +0 -0
  96. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/performance/uvloop_config.py +0 -0
  97. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/pickles/__init__.py +0 -0
  98. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/pickles/pickles.py +0 -0
  99. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/pyenv/__init__.py +0 -0
  100. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/pyenv/deps.py +0 -0
  101. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/pyenv/manager.py +0 -0
  102. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/pyenv/venv.py +0 -0
  103. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/script_sync.py +0 -0
  104. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/script_watcher.py +0 -0
  105. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/search/cached_vectorizer.py +0 -0
  106. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/secrets/__init__.py +0 -0
  107. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/secrets/commands.py +0 -0
  108. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/secrets/manager.py +0 -0
  109. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/secrets/repl.py +0 -0
  110. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/secrets/store.py +0 -0
  111. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/services/__init__.py +0 -0
  112. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/services/config.py +0 -0
  113. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/services/data_pipeline.py +0 -0
  114. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/services/health.py +0 -0
  115. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/services/lsh_client.py +0 -0
  116. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/services/manager.py +0 -0
  117. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/services/redis_service.py +0 -0
  118. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/services/registry.py +0 -0
  119. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/services/state.py +0 -0
  120. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/services/supervisor.py +0 -0
  121. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/shell/__init__.py +0 -0
  122. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/shell/exceptions.py +0 -0
  123. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/shell/shell.py +0 -0
  124. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/sync_key_store.py +0 -0
  125. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/templates/__init__.py +0 -0
  126. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/templates/command_templates.py +0 -0
  127. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/toml/__init__.py +0 -0
  128. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/toml/toml.py +0 -0
  129. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/types.py +0 -0
  130. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/ui/styling.py +0 -0
  131. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/ui/visual_effects.py +0 -0
  132. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/watcher/__init__.py +0 -0
  133. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/watcher/watcher.py +0 -0
  134. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/workflow_models.py +0 -0
  135. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/workflow_runtime.py +0 -0
  136. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/lib/workspace_registry.py +0 -0
  137. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/mygroup/__init__.py +0 -0
  138. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/mygroup/test_cmd.py +0 -0
  139. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/public/__init__.py +0 -0
  140. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/public/commands/__init__.py +0 -0
  141. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/public/oi/oi.py +0 -0
  142. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/public/public.py +0 -0
  143. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/self/__init__.py +0 -0
  144. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/self/completion_cmd.py +0 -0
  145. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/self/env_cmd.py +0 -0
  146. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/self/health_cmd.py +0 -0
  147. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/self/ipfs_cmd.py +0 -0
  148. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/self/logs_cmd.py +0 -0
  149. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/self/migrate_cmd.py +0 -0
  150. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/self/release_notes_cmd.py +0 -0
  151. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/self/self_cmd.py +0 -0
  152. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/self/store_cmd.py +0 -0
  153. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/self/test_cmd.py +0 -0
  154. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/self/workflows_cmd.py +0 -0
  155. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/storage/__init__.py +0 -0
  156. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/storage/backends/__init__.py +0 -0
  157. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/storage/backends/ipfs_backend.py +0 -0
  158. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/storage/base.py +0 -0
  159. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/storage/cache.py +0 -0
  160. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/storage/encryption.py +0 -0
  161. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/storage/factory.py +0 -0
  162. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/storage/registry.py +0 -0
  163. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/storage/storacha_cli.py +0 -0
  164. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/__init__.py +0 -0
  165. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/ci/__init__.py +0 -0
  166. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/ci/act_lock.py +0 -0
  167. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/ci/ci.py +0 -0
  168. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/ci/runner_status.py +0 -0
  169. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/ci/workflow_transform.py +0 -0
  170. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/daemon/__init__.py +0 -0
  171. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/daemon/async_command_database.py +0 -0
  172. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/daemon/async_process_manager.py +0 -0
  173. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/daemon/client.py +0 -0
  174. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/daemon/daemon.py +0 -0
  175. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/daemon/daemon_api.py +0 -0
  176. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/daemon/enhanced_daemon.py +0 -0
  177. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/daemon/process_cli.py +0 -0
  178. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/daemon/process_manager.py +0 -0
  179. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/daemon/test_daemon.py +0 -0
  180. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/doc_convert.py +0 -0
  181. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/docker/__init__.py +0 -0
  182. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/docker/docker.py +0 -0
  183. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/file/__init__.py +0 -0
  184. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/gcloud/__init__.py +0 -0
  185. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/gcloud/config.toml +0 -0
  186. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/gcloud/gcloud.py +0 -0
  187. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/git_commit/__init__.py +0 -0
  188. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/git_commit/ai_service.py +0 -0
  189. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/interview/__init__.py +0 -0
  190. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/lsh_integration.py +0 -0
  191. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/model_service/client.py +0 -0
  192. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/model_service/download_and_run_efficient_models.py +0 -0
  193. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/model_service/lightweight_embedder.py +0 -0
  194. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/model_service/lightweight_model_server.py +0 -0
  195. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/model_service/lightweight_test.py +0 -0
  196. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/model_service/model_service.py +0 -0
  197. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/model_service/ollama_efficient_runner.py +0 -0
  198. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/model_service/openai_adapter.py +0 -0
  199. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/model_service/pdf_processor.py +0 -0
  200. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/model_service/test_efficient_runner.py +0 -0
  201. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/model_service/test_example.py +0 -0
  202. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/model_service/test_integration.py +0 -0
  203. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/model_service/test_new_features.py +0 -0
  204. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/notebook/__init__.py +0 -0
  205. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/notebook/command_loader.py +0 -0
  206. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/notebook/converter.py +0 -0
  207. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/notebook/executor.py +0 -0
  208. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/notebook/notebook_cmd.py +0 -0
  209. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/notebook/schema.py +0 -0
  210. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/notebook/validator.py +0 -0
  211. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/openai/openai.py +0 -0
  212. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/registry/__init__.py +0 -0
  213. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/registry/registry.py +0 -0
  214. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/repo/__init__.py +0 -0
  215. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/repo/repo.py +0 -0
  216. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/scheduler/__init__.py +0 -0
  217. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/scheduler/cron_parser.py +0 -0
  218. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/scheduler/job.py +0 -0
  219. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/scheduler/models.py +0 -0
  220. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/scheduler/monitor.py +0 -0
  221. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/scheduler/persistence.py +0 -0
  222. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/scheduler/scheduler.py +0 -0
  223. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/scheduler/validation.py +0 -0
  224. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/search/__init__.py +0 -0
  225. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/secrets/__init__.py +0 -0
  226. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/secrets/secrets_cmd.py +0 -0
  227. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/storage/__init__.py +0 -0
  228. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/storage/storage_cmd.py +0 -0
  229. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/sync/__init__.py +0 -0
  230. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/sync/test_cmd.py +0 -0
  231. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/videos/__init__.py +0 -0
  232. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/wakatime/__init__.py +0 -0
  233. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/wakatime/wakatime.py +0 -0
  234. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli/workflow/workflow.py +0 -0
  235. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli_framework.egg-info/SOURCES.txt +0 -0
  236. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli_framework.egg-info/dependency_links.txt +0 -0
  237. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli_framework.egg-info/entry_points.txt +0 -0
  238. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/src/mcli_framework.egg-info/requires.txt +0 -0
  239. {mcli_framework-8.0.65 → mcli_framework-8.0.67}/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.67
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.67"
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}")
@@ -65,6 +65,36 @@ def act_available() -> bool:
65
65
  return shutil.which("act") is not None
66
66
 
67
67
 
68
+ # Git exports these to every hook (`git rev-parse --local-env-vars`). They point
69
+ # at the repo being pushed, so a tool inside the gate that runs git on its own
70
+ # checkout reads the wrong repo: Flutter computes its SDK version with
71
+ # `git describe` and reports the pushed commit, which then fails any
72
+ # `environment: flutter:` constraint. The gate runs from the repo root, so
73
+ # git finds the right repo without them.
74
+ _GIT_HOOK_ENV = (
75
+ "GIT_ALTERNATE_OBJECT_DIRECTORIES",
76
+ "GIT_CONFIG",
77
+ "GIT_CONFIG_PARAMETERS",
78
+ "GIT_CONFIG_COUNT",
79
+ "GIT_OBJECT_DIRECTORY",
80
+ "GIT_DIR",
81
+ "GIT_WORK_TREE",
82
+ "GIT_IMPLICIT_WORK_TREE",
83
+ "GIT_GRAFT_FILE",
84
+ "GIT_INDEX_FILE",
85
+ "GIT_NO_REPLACE_OBJECTS",
86
+ "GIT_REPLACE_REF_BASE",
87
+ "GIT_PREFIX",
88
+ "GIT_SHALLOW_FILE",
89
+ "GIT_COMMON_DIR",
90
+ )
91
+
92
+
93
+ def _gate_env() -> dict[str, str]:
94
+ """The current environment without the repo-local variables git sets for hooks."""
95
+ return {k: v for k, v in os.environ.items() if k not in _GIT_HOOK_ENV}
96
+
97
+
68
98
  # Preferred over act when present: a repo-defined `make ci-native` target runs
69
99
  # the same gates directly on the host toolchain. On Apple-silicon (and any host
70
100
  # without nested-virt) act's amd64 emulation under podman is flaky for heavy
@@ -88,7 +118,7 @@ def run_native() -> PreflightResult:
88
118
  """Run the repo's native gate (`make ci-native`) on the host. PASS on exit 0,
89
119
  FAIL otherwise. Output streams straight to the terminal (these runs are long;
90
120
  no need to buffer)."""
91
- proc = subprocess.run(["make", _NATIVE_GATE])
121
+ proc = subprocess.run(["make", _NATIVE_GATE], env=_gate_env())
92
122
  return PreflightResult.PASS if proc.returncode == 0 else PreflightResult.FAIL
93
123
 
94
124
 
@@ -220,7 +250,7 @@ def _run_with_retries(
220
250
  'no stages' no-op and decide whether to fall back)."""
221
251
  attempt = 0
222
252
  while True:
223
- proc = subprocess.run(cmd, capture_output=True, text=True)
253
+ proc = subprocess.run(cmd, capture_output=True, text=True, env=_gate_env())
224
254
  output = (proc.stdout or "") + (proc.stderr or "")
225
255
  if output:
226
256
  sys.stdout.write(output if output.endswith("\n") else output + "\n")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcli-framework
3
- Version: 8.0.65
3
+ Version: 8.0.67
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