mcli-framework 8.0.54__tar.gz → 8.0.55__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 (369) hide show
  1. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/PKG-INFO +11 -3
  2. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/pyproject.toml +37 -8
  3. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/commands_cmd.py +4 -1
  4. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/create_cmd.py +4 -1
  5. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/init_cmd.py +6 -2
  6. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/sync_cmd.py +9 -1
  7. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/api/api.py +2 -2
  8. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/pickles/pickles.py +50 -0
  9. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/search/cached_vectorizer.py +4 -1
  10. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/self/release_notes_cmd.py +1 -1
  11. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/self/self_cmd.py +4 -1
  12. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/self/store_cmd.py +17 -9
  13. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/ci/act_runner.py +19 -0
  14. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/ci/ci.py +1 -1
  15. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/doc_convert.py +13 -7
  16. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli_framework.egg-info/PKG-INFO +11 -3
  17. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli_framework.egg-info/requires.txt +10 -2
  18. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/.github/dependabot.yml +0 -0
  19. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/.github/dependency-review-config.yml +0 -0
  20. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/.github/workflows/build.yml +0 -0
  21. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/.github/workflows/ci.yml +0 -0
  22. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/.github/workflows/codeql.yml +0 -0
  23. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/.github/workflows/docs-links.yml +0 -0
  24. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/.github/workflows/publish-self-hosted.yml +0 -0
  25. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/.github/workflows/publish.yml +0 -0
  26. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/.github/workflows/release.yml +0 -0
  27. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/.github/workflows/security.yml +0 -0
  28. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/.github/workflows/test.yml +0 -0
  29. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/LICENSE +0 -0
  30. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/MANIFEST.in +0 -0
  31. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/README.md +0 -0
  32. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/llms-full.txt +0 -0
  33. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/llms.txt +0 -0
  34. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/mcli_rust/Cargo.toml +0 -0
  35. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/mcli_rust/src/command_parser.rs +0 -0
  36. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/mcli_rust/src/file_watcher.rs +0 -0
  37. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/mcli_rust/src/lib.rs +0 -0
  38. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/mcli_rust/src/process_manager.rs +0 -0
  39. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/mcli_rust/src/tfidf.rs +0 -0
  40. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/setup.cfg +0 -0
  41. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/__init__.py +0 -0
  42. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/__main__.py +0 -0
  43. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/__init__.py +0 -0
  44. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/completion_helpers.py +0 -0
  45. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/context_cmd.py +0 -0
  46. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/delete_cmd.py +0 -0
  47. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/edit_cmd.py +0 -0
  48. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/import_cmd.py +0 -0
  49. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/list_cmd.py +0 -0
  50. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/main.py +0 -0
  51. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/migrate_cmd.py +0 -0
  52. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/model/__init__.py +0 -0
  53. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/model/model.py +0 -0
  54. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/model_cmd.py +0 -0
  55. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/mv_cmd.py +0 -0
  56. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/new_cmd.py +0 -0
  57. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/remove_cmd.py +0 -0
  58. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/rm_cmd.py +0 -0
  59. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/search_cmd.py +0 -0
  60. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/services_cmd.py +0 -0
  61. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/setup_cmd.py +0 -0
  62. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/source_sync_cmd.py +0 -0
  63. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/video/__init__.py +0 -0
  64. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/app/video/video.py +0 -0
  65. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/config.toml +0 -0
  66. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/__init__.py +0 -0
  67. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/api/__init__.py +0 -0
  68. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/api/daemon_client.py +0 -0
  69. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/api/daemon_client_local.py +0 -0
  70. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/api/daemon_decorator.py +0 -0
  71. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/api/mcli_decorators.py +0 -0
  72. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/auth/__init__.py +0 -0
  73. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/auth/auth.py +0 -0
  74. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/auth/aws_manager.py +0 -0
  75. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/auth/azure_manager.py +0 -0
  76. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/auth/credential_manager.py +0 -0
  77. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/auth/gcp_manager.py +0 -0
  78. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/auth/key_manager.py +0 -0
  79. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/auth/mcli_manager.py +0 -0
  80. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/auth/token_manager.py +0 -0
  81. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/auth/token_util.py +0 -0
  82. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/config/__init__.py +0 -0
  83. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/config/config.py +0 -0
  84. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/config/settings.py +0 -0
  85. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/constants/__init__.py +0 -0
  86. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/constants/commands.py +0 -0
  87. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/constants/defaults.py +0 -0
  88. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/constants/env.py +0 -0
  89. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/constants/messages.py +0 -0
  90. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/constants/paths.py +0 -0
  91. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/constants/scripts.py +0 -0
  92. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/constants/storage.py +0 -0
  93. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/custom_commands.py +0 -0
  94. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/discovery/__init__.py +0 -0
  95. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/discovery/command_discovery.py +0 -0
  96. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/erd/__init__.py +0 -0
  97. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/erd/erd.py +0 -0
  98. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/erd/generate_graph.py +0 -0
  99. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/errors.py +0 -0
  100. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/feature_detection.py +0 -0
  101. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/files/__init__.py +0 -0
  102. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/files/files.py +0 -0
  103. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/folder_workflows.py +0 -0
  104. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/fs/__init__.py +0 -0
  105. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/fs/fs.py +0 -0
  106. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/ipfs_sync.py +0 -0
  107. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/ipfs_utils.py +0 -0
  108. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/ipns_manager.py +0 -0
  109. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/lib.py +0 -0
  110. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/logger/__init__.py +0 -0
  111. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/logger/correlation.py +0 -0
  112. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/logger/logger.py +0 -0
  113. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/logger/structured.py +0 -0
  114. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/optional_deps.py +0 -0
  115. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/paths.py +0 -0
  116. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/performance/__init__.py +0 -0
  117. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/performance/optimizer.py +0 -0
  118. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/performance/rust_bridge.py +0 -0
  119. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/performance/uvloop_config.py +0 -0
  120. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/pickles/__init__.py +0 -0
  121. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/pyenv/__init__.py +0 -0
  122. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/pyenv/deps.py +0 -0
  123. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/pyenv/manager.py +0 -0
  124. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/pyenv/venv.py +0 -0
  125. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/script_loader.py +0 -0
  126. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/script_sync.py +0 -0
  127. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/script_watcher.py +0 -0
  128. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/secrets/__init__.py +0 -0
  129. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/secrets/commands.py +0 -0
  130. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/secrets/manager.py +0 -0
  131. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/secrets/repl.py +0 -0
  132. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/secrets/store.py +0 -0
  133. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/services/__init__.py +0 -0
  134. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/services/config.py +0 -0
  135. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/services/data_pipeline.py +0 -0
  136. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/services/health.py +0 -0
  137. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/services/lsh_client.py +0 -0
  138. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/services/manager.py +0 -0
  139. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/services/redis_service.py +0 -0
  140. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/services/registry.py +0 -0
  141. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/services/state.py +0 -0
  142. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/services/supervisor.py +0 -0
  143. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/shell/__init__.py +0 -0
  144. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/shell/exceptions.py +0 -0
  145. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/shell/shell.py +0 -0
  146. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/sync_key_store.py +0 -0
  147. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/templates/__init__.py +0 -0
  148. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/templates/command_templates.py +0 -0
  149. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/toml/__init__.py +0 -0
  150. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/toml/toml.py +0 -0
  151. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/types.py +0 -0
  152. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/ui/styling.py +0 -0
  153. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/ui/visual_effects.py +0 -0
  154. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/watcher/__init__.py +0 -0
  155. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/watcher/watcher.py +0 -0
  156. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/workflow_models.py +0 -0
  157. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/lib/workspace_registry.py +0 -0
  158. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/mygroup/__init__.py +0 -0
  159. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/mygroup/test_cmd.py +0 -0
  160. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/public/__init__.py +0 -0
  161. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/public/commands/__init__.py +0 -0
  162. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/public/oi/oi.py +0 -0
  163. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/public/public.py +0 -0
  164. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/self/__init__.py +0 -0
  165. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/self/completion_cmd.py +0 -0
  166. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/self/env_cmd.py +0 -0
  167. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/self/health_cmd.py +0 -0
  168. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/self/ipfs_cmd.py +0 -0
  169. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/self/logs_cmd.py +0 -0
  170. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/self/migrate_cmd.py +0 -0
  171. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/self/test_cmd.py +0 -0
  172. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/self/workflows_cmd.py +0 -0
  173. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/storage/__init__.py +0 -0
  174. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/storage/backends/__init__.py +0 -0
  175. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/storage/backends/ipfs_backend.py +0 -0
  176. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/storage/base.py +0 -0
  177. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/storage/cache.py +0 -0
  178. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/storage/encryption.py +0 -0
  179. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/storage/factory.py +0 -0
  180. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/storage/registry.py +0 -0
  181. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/storage/storacha_cli.py +0 -0
  182. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/__init__.py +0 -0
  183. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/ci/__init__.py +0 -0
  184. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/ci/runner_status.py +0 -0
  185. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/ci/workflow_transform.py +0 -0
  186. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/daemon/__init__.py +0 -0
  187. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/daemon/async_command_database.py +0 -0
  188. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/daemon/async_process_manager.py +0 -0
  189. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/daemon/client.py +0 -0
  190. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/daemon/daemon.py +0 -0
  191. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/daemon/daemon_api.py +0 -0
  192. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/daemon/enhanced_daemon.py +0 -0
  193. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/daemon/process_cli.py +0 -0
  194. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/daemon/process_manager.py +0 -0
  195. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/daemon/test_daemon.py +0 -0
  196. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/docker/__init__.py +0 -0
  197. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/docker/docker.py +0 -0
  198. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/file/__init__.py +0 -0
  199. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/gcloud/__init__.py +0 -0
  200. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/gcloud/config.toml +0 -0
  201. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/gcloud/gcloud.py +0 -0
  202. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/git_commit/__init__.py +0 -0
  203. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/git_commit/ai_service.py +0 -0
  204. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/interview/__init__.py +0 -0
  205. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/lsh_integration.py +0 -0
  206. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/client.py +0 -0
  207. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/download_and_run_efficient_models.py +0 -0
  208. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/lightweight_embedder.py +0 -0
  209. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/lightweight_model_server.py +0 -0
  210. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/lightweight_test.py +0 -0
  211. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/model_service.py +0 -0
  212. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/ollama_efficient_runner.py +0 -0
  213. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/openai_adapter.py +0 -0
  214. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/pdf_processor.py +0 -0
  215. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/test_efficient_runner.py +0 -0
  216. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/test_example.py +0 -0
  217. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/test_integration.py +0 -0
  218. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/model_service/test_new_features.py +0 -0
  219. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/notebook/__init__.py +0 -0
  220. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/notebook/command_loader.py +0 -0
  221. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/notebook/converter.py +0 -0
  222. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/notebook/executor.py +0 -0
  223. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/notebook/notebook_cmd.py +0 -0
  224. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/notebook/schema.py +0 -0
  225. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/notebook/validator.py +0 -0
  226. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/openai/openai.py +0 -0
  227. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/registry/__init__.py +0 -0
  228. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/registry/registry.py +0 -0
  229. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/repo/__init__.py +0 -0
  230. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/repo/repo.py +0 -0
  231. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/scheduler/__init__.py +0 -0
  232. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/scheduler/cron_parser.py +0 -0
  233. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/scheduler/job.py +0 -0
  234. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/scheduler/models.py +0 -0
  235. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/scheduler/monitor.py +0 -0
  236. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/scheduler/persistence.py +0 -0
  237. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/scheduler/scheduler.py +0 -0
  238. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/scheduler/validation.py +0 -0
  239. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/search/__init__.py +0 -0
  240. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/secrets/__init__.py +0 -0
  241. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/secrets/secrets_cmd.py +0 -0
  242. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/storage/__init__.py +0 -0
  243. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/storage/storage_cmd.py +0 -0
  244. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/sync/__init__.py +0 -0
  245. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/sync/test_cmd.py +0 -0
  246. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/videos/__init__.py +0 -0
  247. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/wakatime/__init__.py +0 -0
  248. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/wakatime/wakatime.py +0 -0
  249. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli/workflow/workflow.py +0 -0
  250. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli_framework.egg-info/SOURCES.txt +0 -0
  251. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli_framework.egg-info/dependency_links.txt +0 -0
  252. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli_framework.egg-info/entry_points.txt +0 -0
  253. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/src/mcli_framework.egg-info/top_level.txt +0 -0
  254. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/__init__.py +0 -0
  255. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_all_commands.py +0 -0
  256. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_app_logs_cmd.py +0 -0
  257. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_app_redis_cmd.py +0 -0
  258. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_logs_cmd.py +0 -0
  259. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_main_app.py +0 -0
  260. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_model_cmd.py +0 -0
  261. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_self_cmd.py +0 -0
  262. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_self_cmd_plugins.py +0 -0
  263. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_self_cmd_utilities.py +0 -0
  264. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_workflow_creation_commands.py +0 -0
  265. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_workflow_file.py +0 -0
  266. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_workflow_gcloud.py +0 -0
  267. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/cli/test_workflow_registry.py +0 -0
  268. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/conftest.py +0 -0
  269. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/e2e/__init__.py +0 -0
  270. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/e2e/test_complete_workflows.py +0 -0
  271. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/e2e/test_model_workflow.py +0 -0
  272. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/e2e/test_new_user_workflow.py +0 -0
  273. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/e2e/test_update_workflow.py +0 -0
  274. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/fixtures/__init__.py +0 -0
  275. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/fixtures/chat_fixtures.py +0 -0
  276. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/fixtures/cli_fixtures.py +0 -0
  277. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/fixtures/command_fixtures.py +0 -0
  278. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/fixtures/data_fixtures.py +0 -0
  279. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/fixtures/db_fixtures.py +0 -0
  280. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/fixtures/model_fixtures.py +0 -0
  281. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/__init__.py +0 -0
  282. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_all_commands_comprehensive.py +0 -0
  283. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_daemon_server.py +0 -0
  284. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_direct_file_execution.py +0 -0
  285. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_e2e_dashboard_lsh_supabase.py +0 -0
  286. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_flask_webapp.py +0 -0
  287. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_folder_workflows_integration.py +0 -0
  288. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_gcloud_services.py +0 -0
  289. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_ml_data_pipeline.py +0 -0
  290. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_module_imports.py +0 -0
  291. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_notebook_workflows.py +0 -0
  292. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_oi_service.py +0 -0
  293. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_repo_operations.py +0 -0
  294. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_scheduler_integration.py +0 -0
  295. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_service_registry.py +0 -0
  296. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_video_processing.py +0 -0
  297. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_wakatime_api.py +0 -0
  298. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_webapp_full.py +0 -0
  299. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_workflow.py +0 -0
  300. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/integration/test_workflow_commands.py +0 -0
  301. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/performance/__init__.py +0 -0
  302. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/property/__init__.py +0 -0
  303. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/__init__.py +0 -0
  304. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/storage/__init__.py +0 -0
  305. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/storage/test_cache.py +0 -0
  306. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/storage/test_encryption.py +0 -0
  307. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/storage/test_storacha_cli.py +0 -0
  308. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_api_utils.py +0 -0
  309. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_async_process_manager.py +0 -0
  310. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_auth_modules.py +0 -0
  311. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_bug_fixes.py +0 -0
  312. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_command_fixtures.py +0 -0
  313. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_config.py +0 -0
  314. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_correlation_logging.py +0 -0
  315. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_custom_commands.py +0 -0
  316. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_custom_commands_filtering.py +0 -0
  317. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_daemon_api.py +0 -0
  318. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_dependencies.py +0 -0
  319. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_doc_convert_workflow.py +0 -0
  320. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_emulator_workflow.py +0 -0
  321. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_erd_generation.py +0 -0
  322. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_erd_generic.py +0 -0
  323. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_erd_imports.py +0 -0
  324. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_folder_workflows.py +0 -0
  325. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_git_commit_workflow.py +0 -0
  326. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_health_cmd.py +0 -0
  327. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_import_cmd.py +0 -0
  328. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_init_mv_cmd.py +0 -0
  329. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_ipfs_cmd.py +0 -0
  330. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_ipfs_retry.py +0 -0
  331. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_language_suffix.py +0 -0
  332. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_lib_auth.py +0 -0
  333. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_lib_files.py +0 -0
  334. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_lib_utils.py +0 -0
  335. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_logger.py +0 -0
  336. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_new_cmd.py +0 -0
  337. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_notebook_command_loader.py +0 -0
  338. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_notebook_executor.py +0 -0
  339. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_optional_deps.py +0 -0
  340. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_paths.py +0 -0
  341. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_pdf_compress.py +0 -0
  342. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_pyenv.py +0 -0
  343. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_regression.py +0 -0
  344. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_scheduler.py +0 -0
  345. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_scheduler_cron_parser.py +0 -0
  346. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_scheduler_job.py +0 -0
  347. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_scheduler_models.py +0 -0
  348. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_scheduler_monitor.py +0 -0
  349. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_scheduler_persistence.py +0 -0
  350. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_scheduler_validation.py +0 -0
  351. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_script_loader_options.py +0 -0
  352. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_security_command_injection.py +0 -0
  353. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_self_update.py +0 -0
  354. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_service_config.py +0 -0
  355. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_service_health.py +0 -0
  356. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_service_manager.py +0 -0
  357. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_service_state.py +0 -0
  358. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_services_cmd.py +0 -0
  359. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_shell_exceptions.py +0 -0
  360. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_shell_functions.py +0 -0
  361. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_shell_security.py +0 -0
  362. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_store_cmd.py +0 -0
  363. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_sync_cmd.py +0 -0
  364. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_toml_utils.py +0 -0
  365. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_ui_rich.py +0 -0
  366. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_uv_compat.py +0 -0
  367. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_workflow_file_completion.py +0 -0
  368. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/test_workflow_models.py +0 -0
  369. {mcli_framework-8.0.54 → mcli_framework-8.0.55}/tests/unit/workflow/test_notebook.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcli-framework
3
- Version: 8.0.54
3
+ Version: 8.0.55
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>
@@ -82,10 +82,18 @@ Requires-Dist: freezegun>=1.4.0; extra == "dev"
82
82
  Requires-Dist: pytest-html>=4.1.0; extra == "dev"
83
83
  Requires-Dist: pytest-json-report>=1.5.0; extra == "dev"
84
84
  Requires-Dist: black<26.0.0,>=25.0.0; extra == "dev"
85
- Requires-Dist: isort<6.0.0,>=5.12.0; extra == "dev"
86
- Requires-Dist: mypy<2.0.0,>=1.7.1; extra == "dev"
85
+ Requires-Dist: isort<6.0.0,>=5.13.2; extra == "dev"
86
+ Requires-Dist: mypy<2.0.0,>=1.16.1; extra == "dev"
87
87
  Requires-Dist: ruff>=0.1.0; extra == "dev"
88
+ Requires-Dist: pylint>=3.0.0; extra == "dev"
89
+ Requires-Dist: flake8>=7.0.0; extra == "dev"
90
+ Requires-Dist: flake8-docstrings>=1.7.0; extra == "dev"
91
+ Requires-Dist: flake8-bugbear>=24.1.0; extra == "dev"
92
+ Requires-Dist: flake8-comprehensions>=3.14.0; extra == "dev"
93
+ Requires-Dist: flake8-simplify>=0.21.0; extra == "dev"
88
94
  Requires-Dist: pre-commit>=4.5.1; extra == "dev"
95
+ Requires-Dist: bandit>=1.7.0; extra == "dev"
96
+ Requires-Dist: safety>=3.0.0; extra == "dev"
89
97
  Requires-Dist: build>=1.2.2.post1; extra == "dev"
90
98
  Requires-Dist: maturin>=1.9.3; extra == "dev"
91
99
  Requires-Dist: twine>=4.0.0; extra == "dev"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mcli-framework"
3
- version = "8.0.54"
3
+ version = "8.0.55"
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"
@@ -102,11 +102,21 @@ dev = [
102
102
 
103
103
  # Code quality
104
104
  "black>=25.0.0,<26.0.0", # Pin to 25.x to match lockfile, avoid 26.x formatting changes
105
- "isort>=5.12.0,<6.0.0",
106
- "mypy>=1.7.1,<2.0.0",
105
+ "isort>=5.13.2,<6.0.0",
106
+ "mypy>=1.16.1,<2.0.0",
107
107
  "ruff>=0.1.0", # Fast linter
108
+ "pylint>=3.0.0",
109
+ "flake8>=7.0.0",
110
+ "flake8-docstrings>=1.7.0",
111
+ "flake8-bugbear>=24.1.0",
112
+ "flake8-comprehensions>=3.14.0",
113
+ "flake8-simplify>=0.21.0",
108
114
  "pre-commit>=4.5.1", # Git hooks
109
115
 
116
+ # Security
117
+ "bandit>=1.7.0",
118
+ "safety>=3.0.0",
119
+
110
120
  # Build tools
111
121
  "build>=1.2.2.post1",
112
122
  "maturin>=1.9.3",
@@ -260,20 +270,39 @@ build-backend = "setuptools.build_meta"
260
270
  # NOTE: This is the primary dev dependency specification (PEP 735).
261
271
  # [project.optional-dependencies] dev is kept for pip compatibility.
262
272
  dev = [
273
+ # Testing
274
+ "pytest>=8.4.1",
275
+ "pytest-cov>=4.1.0,<5.0.0",
276
+ "pytest-mock>=3.14.1",
277
+ "pytest-asyncio>=1.1.0",
278
+ "pytest-benchmark>=4.0.0",
279
+ "pytest-timeout>=2.2.0",
280
+ "pytest-xdist>=3.5.0",
281
+ "pytest-html>=4.1.0",
282
+ "pytest-json-report>=1.5.0",
283
+ "hypothesis>=6.92.0",
284
+ "faker>=22.0.0",
285
+ "responses>=0.24.0",
286
+ "freezegun>=1.4.0",
287
+ # Linting / formatting / typing
263
288
  "black>=25.0.0,<26.0.0", # Pin to 25.x to match lockfile
264
- "isort>=5.13.2",
265
- "mypy>=1.16.1",
289
+ "isort>=5.13.2,<6.0.0",
290
+ "mypy>=1.16.1,<2.0.0",
291
+ "ruff>=0.1.0",
266
292
  "pylint>=3.0.0",
267
- "pytest>=8.4.1",
268
- "pytest-cov>=4.1.0",
269
- "pre-commit>=3.6.0",
270
293
  "flake8>=7.0.0",
271
294
  "flake8-docstrings>=1.7.0",
272
295
  "flake8-bugbear>=24.1.0",
273
296
  "flake8-comprehensions>=3.14.0",
274
297
  "flake8-simplify>=0.21.0",
298
+ # Security
275
299
  "bandit>=1.7.0",
276
300
  "safety>=3.0.0",
301
+ # Pre-commit / build / publish
302
+ "pre-commit>=4.5.1",
303
+ "build>=1.2.2.post1",
304
+ "maturin>=1.9.3",
305
+ "twine>=4.0.0",
277
306
  ]
278
307
 
279
308
  [tool.setuptools]
@@ -1135,7 +1135,10 @@ def open_editor_for_command(
1135
1135
  if not editor:
1136
1136
  # Try common editors in order of preference
1137
1137
  for common_editor in ["vim", "nano", "code", "subl", "atom", "emacs"]:
1138
- if subprocess.run(["which", common_editor], capture_output=True).returncode == 0:
1138
+ if (
1139
+ subprocess.run(["which", common_editor], capture_output=True, timeout=5).returncode
1140
+ == 0
1141
+ ):
1139
1142
  editor = common_editor
1140
1143
  break
1141
1144
 
@@ -124,7 +124,10 @@ def open_editor_for_command(
124
124
  if not editor:
125
125
  # Try common editors in order of preference
126
126
  for common_editor in ["vim", "nano", "code", "subl", "atom", "emacs"]:
127
- if subprocess.run(["which", common_editor], capture_output=True).returncode == 0:
127
+ if (
128
+ subprocess.run(["which", common_editor], capture_output=True, timeout=5).returncode
129
+ == 0
130
+ ):
128
131
  editor = common_editor
129
132
  break
130
133
 
@@ -217,11 +217,15 @@ Thumbs.db
217
217
  # Initialize git if requested
218
218
  if git and not (workflows_dir / ".git").exists():
219
219
  try:
220
- subprocess.run(["git", "init"], cwd=workflows_dir, check=True, capture_output=True)
220
+ subprocess.run(
221
+ ["git", "init"], cwd=workflows_dir, check=True, capture_output=True, timeout=30
222
+ )
221
223
  console.print("[green]✓[/green] Initialized git repository in workflows directory")
222
224
 
223
225
  # Create initial commit
224
- subprocess.run(["git", "add", "."], cwd=workflows_dir, check=True, capture_output=True)
226
+ subprocess.run(
227
+ ["git", "add", "."], cwd=workflows_dir, check=True, capture_output=True, timeout=30
228
+ )
225
229
  subprocess.run(
226
230
  ["git", "commit", "-m", "Initial commit: Initialize workflows directory"],
227
231
  cwd=workflows_dir,
@@ -135,12 +135,20 @@ def sync_init(install: bool, foreground: bool):
135
135
  else:
136
136
  info("Starting IPFS daemon in background...")
137
137
 
138
+ # Detach the daemon from this process group. start_new_session is
139
+ # POSIX-only; on Windows use CREATE_NEW_PROCESS_GROUP instead so the
140
+ # call doesn't raise (#190).
141
+ if sys.platform == "win32":
142
+ _detach_kwargs = {"creationflags": subprocess.CREATE_NEW_PROCESS_GROUP}
143
+ else:
144
+ _detach_kwargs = {"start_new_session": True}
145
+
138
146
  # Start daemon in background
139
147
  process = subprocess.Popen(
140
148
  ["ipfs", "daemon"],
141
149
  stdout=subprocess.DEVNULL,
142
150
  stderr=subprocess.DEVNULL,
143
- start_new_session=True,
151
+ **_detach_kwargs,
144
152
  )
145
153
 
146
154
  # Save PID for tracking
@@ -389,7 +389,7 @@ def ensure_api_app() -> Optional[FastAPI]:
389
389
  # Add CORS middleware
390
390
  _api_app.add_middleware(
391
391
  CORSMiddleware,
392
- allow_origins=["*"],
392
+ allow_origins=os.environ.get("MCLI_CORS_ORIGINS", "http://localhost:3000").split(","),
393
393
  allow_credentials=True,
394
394
  allow_methods=["*"],
395
395
  allow_headers=["*"],
@@ -455,7 +455,7 @@ def start_api_server(
455
455
  # Add CORS middleware
456
456
  _api_app.add_middleware(
457
457
  CORSMiddleware,
458
- allow_origins=["*"],
458
+ allow_origins=os.environ.get("MCLI_CORS_ORIGINS", "http://localhost:3000").split(","),
459
459
  allow_credentials=True,
460
460
  allow_methods=["*"],
461
461
  allow_headers=["*"],
@@ -20,6 +20,56 @@ class RestrictedUnpickler(pickle.Unpickler):
20
20
  raise pickle.UnpicklingError(f"Forbidden class: {module}.{name}")
21
21
 
22
22
 
23
+ # Allowlist of (module, qualified-name) globals that are safe to reconstruct
24
+ # from untrusted pickle data: builtin containers/scalars plus numpy array
25
+ # primitives. Anything else (callables like os.system/eval, arbitrary classes)
26
+ # is rejected, closing the pickle-RCE vector when deserializing cache data.
27
+ _SAFE_GLOBALS = {
28
+ ("builtins", "list"),
29
+ ("builtins", "dict"),
30
+ ("builtins", "tuple"),
31
+ ("builtins", "set"),
32
+ ("builtins", "frozenset"),
33
+ ("builtins", "str"),
34
+ ("builtins", "bytes"),
35
+ ("builtins", "bytearray"),
36
+ ("builtins", "int"),
37
+ ("builtins", "float"),
38
+ ("builtins", "complex"),
39
+ ("builtins", "bool"),
40
+ ("builtins", "NoneType"),
41
+ # numpy array reconstruction primitives (only used when numpy is installed)
42
+ ("numpy", "ndarray"),
43
+ ("numpy", "dtype"),
44
+ ("numpy.core.multiarray", "_reconstruct"),
45
+ ("numpy.core.multiarray", "scalar"),
46
+ ("numpy._core.multiarray", "_reconstruct"),
47
+ ("numpy._core.multiarray", "scalar"),
48
+ }
49
+
50
+
51
+ class SafeUnpickler(pickle.Unpickler):
52
+ """Unpickler restricted to an allowlist of safe builtin/numpy globals.
53
+
54
+ Use for deserializing data from untrusted or shared stores (e.g. a Redis
55
+ cache) where a poisoned entry could otherwise trigger arbitrary code
56
+ execution via pickle reduce gadgets.
57
+ """
58
+
59
+ def find_class(self, module: str, name: str) -> Type:
60
+ if (module, name) in _SAFE_GLOBALS:
61
+ return super().find_class(module, name)
62
+ raise pickle.UnpicklingError(f"Forbidden global during unpickling: {module}.{name}")
63
+
64
+
65
+ def safe_loads(data: bytes):
66
+ """Deserialize *data* allowing only safe builtin/numpy globals.
67
+
68
+ Raises ``pickle.UnpicklingError`` for anything outside the allowlist.
69
+ """
70
+ return SafeUnpickler(io.BytesIO(data)).load()
71
+
72
+
23
73
  class ObjectCache(Generic[T]):
24
74
  def __init__(self, class_type: Type[T], app_name: str, factory: Callable[[], T] = None):
25
75
  self.class_type = class_type
@@ -19,6 +19,7 @@ except ImportError:
19
19
  redis = None # type: ignore
20
20
 
21
21
  from mcli.lib.logger.logger import get_logger
22
+ from mcli.lib.pickles.pickles import safe_loads
22
23
 
23
24
  logger = get_logger(__name__)
24
25
 
@@ -315,7 +316,9 @@ class CachedTfIdfVectorizer:
315
316
  try:
316
317
  cached_data = await self.redis_client.get(cache_key)
317
318
  if cached_data:
318
- return pickle.loads(cached_data)
319
+ # Cache is shared/untrusted; restrict deserialization to a safe
320
+ # allowlist to prevent pickle-RCE from a poisoned entry (#170).
321
+ return safe_loads(cached_data)
319
322
  except Exception as e:
320
323
  logger.warning(f"Failed to get from cache: {e}")
321
324
 
@@ -87,7 +87,7 @@ class ReleaseNotes:
87
87
 
88
88
  def _run_git(args: list[str]) -> str:
89
89
  """Run a git command and return stdout."""
90
- result = subprocess.run(["git"] + args, capture_output=True, text=True, check=True)
90
+ result = subprocess.run(["git"] + args, capture_output=True, text=True, check=True, timeout=30)
91
91
  return result.stdout.strip()
92
92
 
93
93
 
@@ -343,7 +343,10 @@ def open_editor_for_command(
343
343
  if not editor:
344
344
  # Try common editors in order of preference
345
345
  for common_editor in ["vim", "nano", "code", "subl", "atom", "emacs"]:
346
- if subprocess.run(["which", common_editor], capture_output=True).returncode == 0:
346
+ if (
347
+ subprocess.run(["which", common_editor], capture_output=True, timeout=5).returncode
348
+ == 0
349
+ ):
347
350
  editor = common_editor
348
351
  break
349
352
 
@@ -40,7 +40,9 @@ def init_store(path, remote):
40
40
  # Initialize git if not already initialized
41
41
  git_dir = store_path / ".git"
42
42
  if not git_dir.exists():
43
- subprocess.run(["git", "init"], cwd=store_path, check=True, capture_output=True)
43
+ subprocess.run(
44
+ ["git", "init"], cwd=store_path, check=True, capture_output=True, timeout=30
45
+ )
44
46
  success(f"Initialized git repository at {store_path}")
45
47
 
46
48
  # Create .gitignore
@@ -132,7 +134,7 @@ def push_commands(message, all):
132
134
  success(f"Copied {copied_count} items to store")
133
135
 
134
136
  # Git add, commit, push
135
- subprocess.run(["git", "add", "."], cwd=store_path, check=True)
137
+ subprocess.run(["git", "add", "."], cwd=store_path, check=True, timeout=30)
136
138
 
137
139
  # Check if there are changes
138
140
  result = subprocess.run(
@@ -145,12 +147,14 @@ def push_commands(message, all):
145
147
 
146
148
  # Commit with message
147
149
  commit_msg = message or f"Update commands {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
148
- subprocess.run(["git", "commit", "-m", commit_msg], cwd=store_path, check=True)
150
+ subprocess.run(["git", "commit", "-m", commit_msg], cwd=store_path, check=True, timeout=30)
149
151
  success(f"Committed changes: {commit_msg}")
150
152
 
151
153
  # Push to remote if configured
152
154
  try:
153
- subprocess.run(["git", "push"], cwd=store_path, check=True, capture_output=True)
155
+ subprocess.run(
156
+ ["git", "push"], cwd=store_path, check=True, capture_output=True, timeout=60
157
+ )
154
158
  success("Pushed to remote")
155
159
  except subprocess.CalledProcessError:
156
160
  warning("No remote configured or push failed. Commands committed locally.")
@@ -169,7 +173,7 @@ def pull_commands(force):
169
173
 
170
174
  # Pull from remote
171
175
  try:
172
- subprocess.run(["git", "pull"], cwd=store_path, check=True)
176
+ subprocess.run(["git", "pull"], cwd=store_path, check=True, timeout=60)
173
177
  success("Pulled latest changes from remote")
174
178
  except subprocess.CalledProcessError:
175
179
  warning("No remote configured or pull failed. Using local store.")
@@ -218,7 +222,9 @@ def sync_commands(message):
218
222
  # First pull
219
223
  info("Pulling latest changes...")
220
224
  try:
221
- subprocess.run(["git", "pull"], cwd=store_path, check=True, capture_output=True)
225
+ subprocess.run(
226
+ ["git", "pull"], cwd=store_path, check=True, capture_output=True, timeout=60
227
+ )
222
228
  success("Pulled from remote")
223
229
  except subprocess.CalledProcessError:
224
230
  warning("No remote or pull failed")
@@ -246,12 +252,14 @@ def sync_commands(message):
246
252
  return
247
253
 
248
254
  # Commit and push
249
- subprocess.run(["git", "add", "."], cwd=store_path, check=True)
255
+ subprocess.run(["git", "add", "."], cwd=store_path, check=True, timeout=30)
250
256
  commit_msg = message or f"Sync commands {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
251
- subprocess.run(["git", "commit", "-m", commit_msg], cwd=store_path, check=True)
257
+ subprocess.run(["git", "commit", "-m", commit_msg], cwd=store_path, check=True, timeout=30)
252
258
 
253
259
  try:
254
- subprocess.run(["git", "push"], cwd=store_path, check=True, capture_output=True)
260
+ subprocess.run(
261
+ ["git", "push"], cwd=store_path, check=True, capture_output=True, timeout=60
262
+ )
255
263
  success("Synced and pushed to remote")
256
264
  except subprocess.CalledProcessError:
257
265
  success("Synced locally (no remote configured)")
@@ -18,6 +18,11 @@ _RATE_LIMIT_MARKERS = (
18
18
  "pull rate limit",
19
19
  )
20
20
 
21
+ # act emits this when no job matches the requested event (e.g. a
22
+ # workflow_dispatch-only workflow queried for pull_request). That is a no-op,
23
+ # not a failure, so the gate must treat it as PASS rather than block the push.
24
+ _NO_STAGES_MARKERS = ("could not find any stages to run",)
25
+
21
26
  # Backoff (seconds) between docker rate-limit retries; the last value repeats.
22
27
  _RETRY_BACKOFF = (15, 45)
23
28
  _MAX_RETRIES = 2
@@ -34,6 +39,11 @@ def _is_docker_rate_limited(output: str) -> bool:
34
39
  return any(marker in low for marker in _RATE_LIMIT_MARKERS)
35
40
 
36
41
 
42
+ def _has_no_stages(output: str) -> bool:
43
+ low = (output or "").lower()
44
+ return any(marker in low for marker in _NO_STAGES_MARKERS)
45
+
46
+
37
47
  def act_available() -> bool:
38
48
  return shutil.which("act") is not None
39
49
 
@@ -91,6 +101,15 @@ def run_act(
91
101
  if proc.returncode == 0:
92
102
  return PreflightResult.PASS
93
103
 
104
+ # No job matches this event (e.g. workflow_dispatch-only) — nothing to
105
+ # validate, so this is a pass, not a gate failure.
106
+ if _has_no_stages(output):
107
+ sys.stdout.write(
108
+ "ℹ️ No act stages for this event (workflow_dispatch-only?); "
109
+ "nothing to validate — treating as pass.\n"
110
+ )
111
+ return PreflightResult.PASS
112
+
94
113
  if _is_docker_rate_limited(output):
95
114
  if attempt < retries:
96
115
  delay = backoff[min(attempt, len(backoff) - 1)]
@@ -134,7 +134,7 @@ def pr():
134
134
  raise SystemExit(1)
135
135
  if slug and has_online_runner(slug):
136
136
  click.echo("act unreachable; pushing so the runner can validate.")
137
- subprocess.run(["git", "push", "-u", "origin", "HEAD"], check=False)
137
+ subprocess.run(["git", "push", "-u", "origin", "HEAD"], check=False, timeout=120)
138
138
  subprocess.run(["gh", "pr", "create", "--fill", "--base", "main"], check=False)
139
139
  return
140
140
  click.echo("act unreachable and no runner; refusing to open an unvalidated PR.")
@@ -349,7 +349,7 @@ def init():
349
349
 
350
350
  # Check if Homebrew is installed
351
351
  try:
352
- subprocess.run(["brew", "--version"], capture_output=True, check=True)
352
+ subprocess.run(["brew", "--version"], capture_output=True, check=True, timeout=10)
353
353
  success("✅ Homebrew is installed")
354
354
  except (subprocess.CalledProcessError, FileNotFoundError):
355
355
  error("❌ Homebrew is not installed. Install it from https://brew.sh")
@@ -360,11 +360,13 @@ def init():
360
360
  # Install pandoc
361
361
  info("📥 Installing pandoc...")
362
362
  try:
363
- result = subprocess.run(["brew", "install", "pandoc"], capture_output=True, text=True)
363
+ result = subprocess.run(
364
+ ["brew", "install", "pandoc"], capture_output=True, text=True, timeout=300
365
+ )
364
366
  if result.returncode == 0:
365
367
  success(" ✅ pandoc installed successfully")
366
368
  else:
367
- check = subprocess.run(["which", "pandoc"], capture_output=True)
369
+ check = subprocess.run(["which", "pandoc"], capture_output=True, timeout=10)
368
370
  if check.returncode == 0:
369
371
  info(" ℹ️ pandoc is already installed")
370
372
  else:
@@ -378,7 +380,9 @@ def init():
378
380
  info("📥 Installing Jupyter & nbconvert (for notebook conversion)...")
379
381
  try:
380
382
  # Check if already installed
381
- check = subprocess.run(["jupyter", "nbconvert", "--version"], capture_output=True)
383
+ check = subprocess.run(
384
+ ["jupyter", "nbconvert", "--version"], capture_output=True, timeout=10
385
+ )
382
386
  if check.returncode == 0:
383
387
  info(" ℹ️ jupyter nbconvert is already installed")
384
388
  else:
@@ -425,7 +429,7 @@ def init():
425
429
  info(" sudo tlmgr install collection-fontsrecommended")
426
430
  info(" sudo mktexlsr")
427
431
  else:
428
- check = subprocess.run(["which", "pdflatex"], capture_output=True)
432
+ check = subprocess.run(["which", "pdflatex"], capture_output=True, timeout=10)
429
433
  if check.returncode == 0:
430
434
  info(" ℹ️ LaTeX is already installed")
431
435
  else:
@@ -512,7 +516,7 @@ def convert(from_format, to_format, path, output_dir, pandoc_args, no_fallback):
512
516
  # Check if pandoc is installed (primary tool)
513
517
  has_pandoc = False
514
518
  try:
515
- subprocess.run(["pandoc", "--version"], capture_output=True, check=True)
519
+ subprocess.run(["pandoc", "--version"], capture_output=True, check=True, timeout=10)
516
520
  has_pandoc = True
517
521
  except (subprocess.CalledProcessError, FileNotFoundError):
518
522
  pass
@@ -520,7 +524,9 @@ def convert(from_format, to_format, path, output_dir, pandoc_args, no_fallback):
520
524
  # Check if nbconvert is available
521
525
  has_nbconvert = False
522
526
  try:
523
- subprocess.run(["jupyter", "nbconvert", "--version"], capture_output=True, check=True)
527
+ subprocess.run(
528
+ ["jupyter", "nbconvert", "--version"], capture_output=True, check=True, timeout=10
529
+ )
524
530
  has_nbconvert = True
525
531
  except (subprocess.CalledProcessError, FileNotFoundError):
526
532
  pass
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcli-framework
3
- Version: 8.0.54
3
+ Version: 8.0.55
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>
@@ -82,10 +82,18 @@ Requires-Dist: freezegun>=1.4.0; extra == "dev"
82
82
  Requires-Dist: pytest-html>=4.1.0; extra == "dev"
83
83
  Requires-Dist: pytest-json-report>=1.5.0; extra == "dev"
84
84
  Requires-Dist: black<26.0.0,>=25.0.0; extra == "dev"
85
- Requires-Dist: isort<6.0.0,>=5.12.0; extra == "dev"
86
- Requires-Dist: mypy<2.0.0,>=1.7.1; extra == "dev"
85
+ Requires-Dist: isort<6.0.0,>=5.13.2; extra == "dev"
86
+ Requires-Dist: mypy<2.0.0,>=1.16.1; extra == "dev"
87
87
  Requires-Dist: ruff>=0.1.0; extra == "dev"
88
+ Requires-Dist: pylint>=3.0.0; extra == "dev"
89
+ Requires-Dist: flake8>=7.0.0; extra == "dev"
90
+ Requires-Dist: flake8-docstrings>=1.7.0; extra == "dev"
91
+ Requires-Dist: flake8-bugbear>=24.1.0; extra == "dev"
92
+ Requires-Dist: flake8-comprehensions>=3.14.0; extra == "dev"
93
+ Requires-Dist: flake8-simplify>=0.21.0; extra == "dev"
88
94
  Requires-Dist: pre-commit>=4.5.1; extra == "dev"
95
+ Requires-Dist: bandit>=1.7.0; extra == "dev"
96
+ Requires-Dist: safety>=3.0.0; extra == "dev"
89
97
  Requires-Dist: build>=1.2.2.post1; extra == "dev"
90
98
  Requires-Dist: maturin>=1.9.3; extra == "dev"
91
99
  Requires-Dist: twine>=4.0.0; extra == "dev"
@@ -45,10 +45,18 @@ freezegun>=1.4.0
45
45
  pytest-html>=4.1.0
46
46
  pytest-json-report>=1.5.0
47
47
  black<26.0.0,>=25.0.0
48
- isort<6.0.0,>=5.12.0
49
- mypy<2.0.0,>=1.7.1
48
+ isort<6.0.0,>=5.13.2
49
+ mypy<2.0.0,>=1.16.1
50
50
  ruff>=0.1.0
51
+ pylint>=3.0.0
52
+ flake8>=7.0.0
53
+ flake8-docstrings>=1.7.0
54
+ flake8-bugbear>=24.1.0
55
+ flake8-comprehensions>=3.14.0
56
+ flake8-simplify>=0.21.0
51
57
  pre-commit>=4.5.1
58
+ bandit>=1.7.0
59
+ safety>=3.0.0
52
60
  build>=1.2.2.post1
53
61
  maturin>=1.9.3
54
62
  twine>=4.0.0
File without changes