mcli-framework 8.0.50__tar.gz → 8.0.52__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 (243) hide show
  1. {mcli_framework-8.0.50/src/mcli_framework.egg-info → mcli_framework-8.0.52}/PKG-INFO +1 -1
  2. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/pyproject.toml +1 -1
  3. mcli_framework-8.0.52/src/mcli/__main__.py +14 -0
  4. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/sync_cmd.py +11 -5
  5. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/constants/messages.py +1 -0
  6. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/ipfs_sync.py +7 -2
  7. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/paths.py +3 -3
  8. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/script_loader.py +15 -2
  9. mcli_framework-8.0.52/src/mcli/workflow/ci/act_runner.py +121 -0
  10. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/ci/ci.py +12 -1
  11. {mcli_framework-8.0.50 → mcli_framework-8.0.52/src/mcli_framework.egg-info}/PKG-INFO +1 -1
  12. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli_framework.egg-info/SOURCES.txt +1 -0
  13. mcli_framework-8.0.50/src/mcli/workflow/ci/act_runner.py +0 -61
  14. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/LICENSE +0 -0
  15. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/MANIFEST.in +0 -0
  16. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/README.md +0 -0
  17. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/llms-full.txt +0 -0
  18. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/llms.txt +0 -0
  19. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/mcli_rust/Cargo.toml +0 -0
  20. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/mcli_rust/src/command_parser.rs +0 -0
  21. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/mcli_rust/src/file_watcher.rs +0 -0
  22. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/mcli_rust/src/lib.rs +0 -0
  23. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/mcli_rust/src/process_manager.rs +0 -0
  24. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/mcli_rust/src/tfidf.rs +0 -0
  25. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/setup.cfg +0 -0
  26. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/__init__.py +0 -0
  27. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/__init__.py +0 -0
  28. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/commands_cmd.py +0 -0
  29. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/completion_helpers.py +0 -0
  30. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/context_cmd.py +0 -0
  31. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/create_cmd.py +0 -0
  32. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/delete_cmd.py +0 -0
  33. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/edit_cmd.py +0 -0
  34. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/import_cmd.py +0 -0
  35. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/init_cmd.py +0 -0
  36. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/list_cmd.py +0 -0
  37. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/main.py +0 -0
  38. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/migrate_cmd.py +0 -0
  39. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/model/__init__.py +0 -0
  40. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/model/model.py +0 -0
  41. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/model_cmd.py +0 -0
  42. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/mv_cmd.py +0 -0
  43. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/new_cmd.py +0 -0
  44. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/remove_cmd.py +0 -0
  45. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/rm_cmd.py +0 -0
  46. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/search_cmd.py +0 -0
  47. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/services_cmd.py +0 -0
  48. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/setup_cmd.py +0 -0
  49. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/source_sync_cmd.py +0 -0
  50. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/video/__init__.py +0 -0
  51. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/app/video/video.py +0 -0
  52. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/config.toml +0 -0
  53. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/__init__.py +0 -0
  54. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/api/__init__.py +0 -0
  55. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/api/api.py +0 -0
  56. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/api/daemon_client.py +0 -0
  57. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/api/daemon_client_local.py +0 -0
  58. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/api/daemon_decorator.py +0 -0
  59. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/api/mcli_decorators.py +0 -0
  60. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/auth/__init__.py +0 -0
  61. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/auth/auth.py +0 -0
  62. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/auth/aws_manager.py +0 -0
  63. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/auth/azure_manager.py +0 -0
  64. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/auth/credential_manager.py +0 -0
  65. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/auth/gcp_manager.py +0 -0
  66. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/auth/key_manager.py +0 -0
  67. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/auth/mcli_manager.py +0 -0
  68. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/auth/token_manager.py +0 -0
  69. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/auth/token_util.py +0 -0
  70. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/config/__init__.py +0 -0
  71. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/config/config.py +0 -0
  72. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/config/settings.py +0 -0
  73. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/constants/__init__.py +0 -0
  74. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/constants/commands.py +0 -0
  75. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/constants/defaults.py +0 -0
  76. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/constants/env.py +0 -0
  77. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/constants/paths.py +0 -0
  78. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/constants/scripts.py +0 -0
  79. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/constants/storage.py +0 -0
  80. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/custom_commands.py +0 -0
  81. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/discovery/__init__.py +0 -0
  82. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/discovery/command_discovery.py +0 -0
  83. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/erd/__init__.py +0 -0
  84. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/erd/erd.py +0 -0
  85. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/erd/generate_graph.py +0 -0
  86. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/errors.py +0 -0
  87. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/feature_detection.py +0 -0
  88. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/files/__init__.py +0 -0
  89. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/files/files.py +0 -0
  90. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/folder_workflows.py +0 -0
  91. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/fs/__init__.py +0 -0
  92. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/fs/fs.py +0 -0
  93. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/ipfs_utils.py +0 -0
  94. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/ipns_manager.py +0 -0
  95. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/lib.py +0 -0
  96. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/logger/__init__.py +0 -0
  97. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/logger/correlation.py +0 -0
  98. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/logger/logger.py +0 -0
  99. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/logger/structured.py +0 -0
  100. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/optional_deps.py +0 -0
  101. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/performance/__init__.py +0 -0
  102. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/performance/optimizer.py +0 -0
  103. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/performance/rust_bridge.py +0 -0
  104. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/performance/uvloop_config.py +0 -0
  105. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/pickles/__init__.py +0 -0
  106. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/pickles/pickles.py +0 -0
  107. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/pyenv/__init__.py +0 -0
  108. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/pyenv/deps.py +0 -0
  109. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/pyenv/manager.py +0 -0
  110. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/pyenv/venv.py +0 -0
  111. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/script_sync.py +0 -0
  112. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/script_watcher.py +0 -0
  113. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/search/cached_vectorizer.py +0 -0
  114. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/secrets/__init__.py +0 -0
  115. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/secrets/commands.py +0 -0
  116. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/secrets/manager.py +0 -0
  117. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/secrets/repl.py +0 -0
  118. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/secrets/store.py +0 -0
  119. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/services/__init__.py +0 -0
  120. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/services/config.py +0 -0
  121. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/services/data_pipeline.py +0 -0
  122. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/services/health.py +0 -0
  123. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/services/lsh_client.py +0 -0
  124. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/services/manager.py +0 -0
  125. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/services/redis_service.py +0 -0
  126. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/services/registry.py +0 -0
  127. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/services/state.py +0 -0
  128. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/services/supervisor.py +0 -0
  129. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/shell/__init__.py +0 -0
  130. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/shell/exceptions.py +0 -0
  131. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/shell/shell.py +0 -0
  132. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/sync_key_store.py +0 -0
  133. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/templates/__init__.py +0 -0
  134. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/templates/command_templates.py +0 -0
  135. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/toml/__init__.py +0 -0
  136. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/toml/toml.py +0 -0
  137. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/types.py +0 -0
  138. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/ui/styling.py +0 -0
  139. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/ui/visual_effects.py +0 -0
  140. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/watcher/__init__.py +0 -0
  141. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/watcher/watcher.py +0 -0
  142. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/workflow_models.py +0 -0
  143. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/lib/workspace_registry.py +0 -0
  144. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/mygroup/__init__.py +0 -0
  145. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/mygroup/test_cmd.py +0 -0
  146. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/public/__init__.py +0 -0
  147. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/public/commands/__init__.py +0 -0
  148. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/public/oi/oi.py +0 -0
  149. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/public/public.py +0 -0
  150. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/self/__init__.py +0 -0
  151. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/self/completion_cmd.py +0 -0
  152. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/self/env_cmd.py +0 -0
  153. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/self/health_cmd.py +0 -0
  154. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/self/ipfs_cmd.py +0 -0
  155. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/self/logs_cmd.py +0 -0
  156. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/self/migrate_cmd.py +0 -0
  157. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/self/release_notes_cmd.py +0 -0
  158. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/self/self_cmd.py +0 -0
  159. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/self/store_cmd.py +0 -0
  160. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/self/test_cmd.py +0 -0
  161. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/self/workflows_cmd.py +0 -0
  162. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/storage/__init__.py +0 -0
  163. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/storage/backends/__init__.py +0 -0
  164. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/storage/backends/ipfs_backend.py +0 -0
  165. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/storage/base.py +0 -0
  166. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/storage/cache.py +0 -0
  167. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/storage/encryption.py +0 -0
  168. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/storage/factory.py +0 -0
  169. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/storage/registry.py +0 -0
  170. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/storage/storacha_cli.py +0 -0
  171. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/__init__.py +0 -0
  172. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/ci/__init__.py +0 -0
  173. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/ci/runner_status.py +0 -0
  174. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/ci/workflow_transform.py +0 -0
  175. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/daemon/__init__.py +0 -0
  176. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/daemon/async_command_database.py +0 -0
  177. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/daemon/async_process_manager.py +0 -0
  178. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/daemon/client.py +0 -0
  179. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/daemon/daemon.py +0 -0
  180. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/daemon/daemon_api.py +0 -0
  181. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/daemon/enhanced_daemon.py +0 -0
  182. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/daemon/process_cli.py +0 -0
  183. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/daemon/process_manager.py +0 -0
  184. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/daemon/test_daemon.py +0 -0
  185. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/doc_convert.py +0 -0
  186. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/docker/__init__.py +0 -0
  187. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/docker/docker.py +0 -0
  188. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/file/__init__.py +0 -0
  189. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/gcloud/__init__.py +0 -0
  190. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/gcloud/config.toml +0 -0
  191. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/gcloud/gcloud.py +0 -0
  192. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/git_commit/__init__.py +0 -0
  193. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/git_commit/ai_service.py +0 -0
  194. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/interview/__init__.py +0 -0
  195. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/lsh_integration.py +0 -0
  196. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/model_service/client.py +0 -0
  197. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/model_service/download_and_run_efficient_models.py +0 -0
  198. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/model_service/lightweight_embedder.py +0 -0
  199. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/model_service/lightweight_model_server.py +0 -0
  200. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/model_service/lightweight_test.py +0 -0
  201. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/model_service/model_service.py +0 -0
  202. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/model_service/ollama_efficient_runner.py +0 -0
  203. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/model_service/openai_adapter.py +0 -0
  204. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/model_service/pdf_processor.py +0 -0
  205. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/model_service/test_efficient_runner.py +0 -0
  206. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/model_service/test_example.py +0 -0
  207. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/model_service/test_integration.py +0 -0
  208. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/model_service/test_new_features.py +0 -0
  209. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/notebook/__init__.py +0 -0
  210. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/notebook/command_loader.py +0 -0
  211. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/notebook/converter.py +0 -0
  212. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/notebook/executor.py +0 -0
  213. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/notebook/notebook_cmd.py +0 -0
  214. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/notebook/schema.py +0 -0
  215. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/notebook/validator.py +0 -0
  216. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/openai/openai.py +0 -0
  217. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/registry/__init__.py +0 -0
  218. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/registry/registry.py +0 -0
  219. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/repo/__init__.py +0 -0
  220. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/repo/repo.py +0 -0
  221. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/scheduler/__init__.py +0 -0
  222. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/scheduler/cron_parser.py +0 -0
  223. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/scheduler/job.py +0 -0
  224. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/scheduler/models.py +0 -0
  225. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/scheduler/monitor.py +0 -0
  226. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/scheduler/persistence.py +0 -0
  227. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/scheduler/scheduler.py +0 -0
  228. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/scheduler/validation.py +0 -0
  229. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/search/__init__.py +0 -0
  230. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/secrets/__init__.py +0 -0
  231. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/secrets/secrets_cmd.py +0 -0
  232. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/storage/__init__.py +0 -0
  233. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/storage/storage_cmd.py +0 -0
  234. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/sync/__init__.py +0 -0
  235. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/sync/test_cmd.py +0 -0
  236. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/videos/__init__.py +0 -0
  237. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/wakatime/__init__.py +0 -0
  238. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/wakatime/wakatime.py +0 -0
  239. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli/workflow/workflow.py +0 -0
  240. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli_framework.egg-info/dependency_links.txt +0 -0
  241. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli_framework.egg-info/entry_points.txt +0 -0
  242. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/src/mcli_framework.egg-info/requires.txt +0 -0
  243. {mcli_framework-8.0.50 → mcli_framework-8.0.52}/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.50
3
+ Version: 8.0.52
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.50"
3
+ version = "8.0.52"
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"
@@ -0,0 +1,14 @@
1
+ # logger.info("I am in mcli.__init__.py")
2
+
3
+ try:
4
+ from mcli.app.main import main as main_func
5
+
6
+ # from mcli.public import *
7
+ # from mcli.private import *
8
+ except ImportError:
9
+ from .app.main import main as main_func
10
+
11
+ __all__ = ["main_func"]
12
+
13
+ if __name__ == "__main__":
14
+ main_func()
@@ -17,7 +17,7 @@ from typing import Optional
17
17
  import click
18
18
  from rich.table import Table
19
19
 
20
- from mcli.lib.constants import IpfsMessages, SyncMessages
20
+ from mcli.lib.constants import FileNames, IpfsMessages, SyncMessages
21
21
  from mcli.lib.ipfs_utils import ipfs_daemon_running as _ipfs_daemon_running
22
22
  from mcli.lib.ipfs_utils import ipfs_initialized as _ipfs_initialized
23
23
  from mcli.lib.ipfs_utils import ipfs_installed as _ipfs_installed
@@ -423,7 +423,7 @@ def sync_push_command(global_mode: bool, description: str):
423
423
  from mcli.lib.ipns_manager import get_sync_key
424
424
 
425
425
  workflows_dir = get_custom_commands_dir(global_mode=global_mode)
426
- lockfile_path = workflows_dir / "commands.lock.json"
426
+ lockfile_path = workflows_dir / FileNames.COMMANDS_LOCK_JSON
427
427
 
428
428
  if not lockfile_path.exists():
429
429
  error(SyncMessages.LOCKFILE_NOT_FOUND.format(path=lockfile_path))
@@ -448,10 +448,16 @@ def sync_push_command(global_mode: bool, description: str):
448
448
  console.print(SyncMessages.VIEW_BROWSER_HINT)
449
449
  console.print(SyncMessages.IPFS_GATEWAY_URL.format(cid=cid))
450
450
 
451
- # Show IPNS info if published
451
+ # Report IPNS status honestly: only claim teammates can auto-resolve
452
+ # when the publish actually succeeded.
452
453
  if get_sync_key():
453
454
  console.print()
454
- info("Teammates can pull latest with: mcli sync pull")
455
+ if ipfs.last_ipns_name:
456
+ success(SyncMessages.IPNS_PUBLISHED.format(name=ipfs.last_ipns_name))
457
+ info(SyncMessages.IPNS_TEAMMATE_PULL_HINT)
458
+ else:
459
+ warning(SyncMessages.IPNS_PUBLISH_FAILED)
460
+ info(SyncMessages.RETRIEVE_COMMAND.format(cid=cid))
455
461
  else:
456
462
  error(SyncMessages.FAILED_PUSH_IPFS)
457
463
 
@@ -798,7 +804,7 @@ def sync_info(is_global: bool):
798
804
  workflows_dir = get_custom_commands_dir(global_mode=is_global)
799
805
  console.print(f" Workflows directory: {workflows_dir}")
800
806
 
801
- lockfile = workflows_dir / "commands.lock.json"
807
+ lockfile = workflows_dir / FileNames.COMMANDS_LOCK_JSON
802
808
  console.print(f" Lockfile: {lockfile} ({'exists' if lockfile.exists() else 'missing'})")
803
809
  console.print()
804
810
 
@@ -946,6 +946,7 @@ class SyncMessages:
946
946
  IPNS_RESOLVING = "Resolving latest via IPNS..."
947
947
  IPNS_RESOLVED = "Resolved IPNS to CID: {cid}"
948
948
  IPNS_RESOLVE_FAILED = "Could not resolve via IPNS"
949
+ IPNS_TEAMMATE_PULL_HINT = "Teammates can pull latest with: mcli sync pull"
949
950
  IPNS_NO_SYNC_KEY = "MCLI_SYNC_KEY not set — cannot use IPNS auto-resolve"
950
951
  IPNS_SYNC_KEY_HINT = (
951
952
  "[dim]Set MCLI_SYNC_KEY to enable IPNS. Share same key with teammates.[/dim]"
@@ -77,6 +77,8 @@ class IPFSSync:
77
77
  self.sync_history_path = self.data_dir / FileNames.IPFS_SYNC_HISTORY_JSON
78
78
  self.sync_history = self._load_sync_history()
79
79
  self._local_ipfs_available: Optional[bool] = None
80
+ # Set by push() to the IPNS name if (and only if) publish succeeded.
81
+ self.last_ipns_name: Optional[str] = None
80
82
 
81
83
  def _load_sync_history(self) -> list[dict]:
82
84
  """Load sync history from local storage."""
@@ -427,14 +429,17 @@ class IPFSSync:
427
429
  self.sync_history = self.sync_history[-MAX_HISTORY:]
428
430
  self._save_sync_history()
429
431
 
430
- # Publish to IPNS if sync key is configured
432
+ # Publish to IPNS if sync key is configured. Record whether the
433
+ # publish actually succeeded so callers can report honestly
434
+ # instead of implying IPNS resolution works when it does not.
435
+ self.last_ipns_name = None
431
436
  sync_key = get_sync_key()
432
437
  if sync_key:
433
438
  repo = get_repo_name()
434
439
  key_info = derive_key_info(sync_key, repo, "global")
435
440
  ipns_name = ensure_key_imported(key_info)
436
441
  if ipns_name:
437
- publish_to_ipns(cid, key_info.key_name)
442
+ self.last_ipns_name = publish_to_ipns(cid, key_info.key_name)
438
443
 
439
444
  return cid
440
445
 
@@ -9,7 +9,7 @@ import os
9
9
  from pathlib import Path
10
10
  from typing import Optional
11
11
 
12
- from mcli.lib.constants.paths import DirNames
12
+ from mcli.lib.constants.paths import DirNames, FileNames
13
13
 
14
14
 
15
15
  def get_mcli_home() -> Path:
@@ -248,8 +248,8 @@ def get_lockfile_path(global_mode: bool = False) -> Path:
248
248
  Path to the lockfile
249
249
  """
250
250
  workflows_dir = get_custom_commands_dir(global_mode=global_mode)
251
- # Keep the old lockfile name for compatibility
252
- return workflows_dir / "commands.lock.json"
251
+ # Canonical lockfile name, shared with ScriptLoader and the IPFS sync path.
252
+ return workflows_dir / FileNames.COMMANDS_LOCK_JSON
253
253
 
254
254
 
255
255
  def resolve_workspace(workspace_path: str) -> Optional[Path]:
@@ -28,6 +28,7 @@ from typing import Any, Optional
28
28
 
29
29
  import click
30
30
 
31
+ from mcli.lib.constants import FileNames
31
32
  from mcli.lib.logger.logger import get_logger, register_subprocess
32
33
  from mcli.lib.pyenv import PyEnvManager
33
34
 
@@ -140,7 +141,10 @@ class ScriptLoader:
140
141
  workflows_dir: Directory containing workflow scripts
141
142
  """
142
143
  self.workflows_dir = Path(workflows_dir).expanduser()
143
- self.lockfile_path = self.workflows_dir / "workflows.lock.json"
144
+ # Canonical lockfile name shared with the IPFS sync path (push/pull) and
145
+ # the rest of the codebase. Must match FileNames.COMMANDS_LOCK_JSON,
146
+ # otherwise `sync update` writes a lockfile `sync push` cannot find.
147
+ self.lockfile_path = self.workflows_dir / FileNames.COMMANDS_LOCK_JSON
144
148
  self.loaded_commands: dict[str, click.Command] = {}
145
149
 
146
150
  def discover_scripts(self) -> list[Path]:
@@ -383,8 +387,17 @@ class ScriptLoader:
383
387
  except Exception:
384
388
  mtime = datetime.utcnow().isoformat() + "Z"
385
389
 
390
+ # Record the path relative to the workflows dir (POSIX, forward slashes)
391
+ # so the IPFS sync path can locate and reconstruct scripts living in
392
+ # group subdirectories. Falls back to the bare name if the script is
393
+ # somehow outside the workflows dir.
394
+ try:
395
+ relative_file = script_path.relative_to(self.workflows_dir).as_posix()
396
+ except ValueError:
397
+ relative_file = script_path.name
398
+
386
399
  return {
387
- "file": script_path.name,
400
+ "file": relative_file,
388
401
  "language": language,
389
402
  "content_hash": content_hash,
390
403
  "version": metadata.get("version", "1.0.0"),
@@ -0,0 +1,121 @@
1
+ """Run `act` locally and classify the outcome for the PR gate."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import shutil
6
+ import subprocess
7
+ import sys
8
+ import time
9
+ from enum import Enum
10
+ from pathlib import Path
11
+
12
+ # Docker Hub returns these when the unauthenticated image-pull rate limit is hit.
13
+ # act surfaces them while pulling the runner image — this is an environment
14
+ # problem, NOT a test failure, so it must not hard-block a push.
15
+ _RATE_LIMIT_MARKERS = (
16
+ "toomanyrequests",
17
+ "you have reached your unauthenticated pull rate limit",
18
+ "pull rate limit",
19
+ )
20
+
21
+ # Backoff (seconds) between docker rate-limit retries; the last value repeats.
22
+ _RETRY_BACKOFF = (15, 45)
23
+ _MAX_RETRIES = 2
24
+
25
+
26
+ class PreflightResult(Enum):
27
+ PASS = "pass"
28
+ FAIL = "fail"
29
+ UNREACHABLE = "unreachable"
30
+
31
+
32
+ def _is_docker_rate_limited(output: str) -> bool:
33
+ low = (output or "").lower()
34
+ return any(marker in low for marker in _RATE_LIMIT_MARKERS)
35
+
36
+
37
+ def act_available() -> bool:
38
+ return shutil.which("act") is not None
39
+
40
+
41
+ def docker_running() -> bool:
42
+ try:
43
+ proc = subprocess.run(["docker", "info"], capture_output=True, timeout=30)
44
+ return proc.returncode == 0
45
+ except (FileNotFoundError, subprocess.TimeoutExpired):
46
+ return False
47
+
48
+
49
+ def probe() -> bool:
50
+ """Can act actually run here? Needs the binary, a live docker daemon, and `act -l`."""
51
+ if not act_available() or not docker_running():
52
+ return False
53
+ try:
54
+ proc = subprocess.run(["act", "-l"], capture_output=True, text=True, timeout=60)
55
+ except (FileNotFoundError, subprocess.TimeoutExpired):
56
+ return False
57
+ return proc.returncode == 0
58
+
59
+
60
+ def build_act_command(event: str) -> list[str]:
61
+ cmd = ["act", event]
62
+ if Path(".secrets").exists():
63
+ cmd += ["--secret-file", ".secrets"]
64
+ return cmd
65
+
66
+
67
+ def run_act(
68
+ event: str = "pull_request",
69
+ retries: int = _MAX_RETRIES,
70
+ backoff: tuple[int, ...] = _RETRY_BACKOFF,
71
+ ) -> PreflightResult:
72
+ """Run act for `event` and classify the outcome.
73
+
74
+ - exit 0 -> PASS.
75
+ - non-zero whose output shows a Docker Hub pull rate limit
76
+ (``toomanyrequests``) -> retry up to ``retries`` times with backoff;
77
+ if still rate-limited, return UNREACHABLE (cannot validate — an
78
+ environment problem, not a test failure, so the gate must not block).
79
+ - any other non-zero exit -> FAIL.
80
+
81
+ Output is captured (to detect the rate limit) and echoed so the user still
82
+ sees act's progress.
83
+ """
84
+ attempt = 0
85
+ while True:
86
+ proc = subprocess.run(build_act_command(event), capture_output=True, text=True)
87
+ output = (proc.stdout or "") + (proc.stderr or "")
88
+ if output:
89
+ sys.stdout.write(output if output.endswith("\n") else output + "\n")
90
+
91
+ if proc.returncode == 0:
92
+ return PreflightResult.PASS
93
+
94
+ if _is_docker_rate_limited(output):
95
+ if attempt < retries:
96
+ delay = backoff[min(attempt, len(backoff) - 1)]
97
+ sys.stdout.write(
98
+ f"⚠️ Docker Hub rate limit (toomanyrequests); retrying in {delay}s "
99
+ f"(attempt {attempt + 1}/{retries})…\n"
100
+ )
101
+ time.sleep(delay)
102
+ attempt += 1
103
+ continue
104
+ sys.stdout.write(
105
+ "⚠️ Docker Hub still rate-limited after retries — cannot validate "
106
+ "locally; allowing push (run `mcli ci preflight` again later).\n"
107
+ )
108
+ return PreflightResult.UNREACHABLE
109
+
110
+ return PreflightResult.FAIL
111
+
112
+
113
+ def preflight(repo_slug: str, event: str = "pull_request") -> PreflightResult:
114
+ """Primary gate. PASS/FAIL if act can run; UNREACHABLE if act can't start here.
115
+
116
+ `repo_slug` is accepted for symmetry and future use; the runner fallback is
117
+ orchestrated by the CLI layer based on runner_status.has_online_runner.
118
+ """
119
+ if not probe():
120
+ return PreflightResult.UNREACHABLE
121
+ return run_act(event)
@@ -143,7 +143,18 @@ def pr():
143
143
 
144
144
  PRE_PUSH_HOOK = """#!/usr/bin/env bash
145
145
  # mcli-ci pre-push gate: validate with act before pushing.
146
- exec mcli ci preflight
146
+ # Blocks ONLY on a real act failure (exit 1). When act cannot validate locally
147
+ # — e.g. Docker Hub rate-limit (toomanyrequests, retried first), no docker, or
148
+ # an online runner will validate instead (exit 2/3) — the push is allowed so an
149
+ # environment hiccup never wedges your workflow. Override a real failure with:
150
+ # git push --no-verify
151
+ mcli ci preflight
152
+ code=$?
153
+ if [ "$code" -eq 1 ]; then
154
+ echo "mcli-ci: act reported failures — push blocked. Override: git push --no-verify" >&2
155
+ exit 1
156
+ fi
157
+ exit 0
147
158
  """
148
159
 
149
160
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcli-framework
3
- Version: 8.0.50
3
+ Version: 8.0.52
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>
@@ -12,6 +12,7 @@ mcli_rust/src/lib.rs
12
12
  mcli_rust/src/process_manager.rs
13
13
  mcli_rust/src/tfidf.rs
14
14
  src/mcli/__init__.py
15
+ src/mcli/__main__.py
15
16
  src/mcli/config.toml
16
17
  src/mcli/app/__init__.py
17
18
  src/mcli/app/commands_cmd.py
@@ -1,61 +0,0 @@
1
- """Run `act` locally and classify the outcome for the PR gate."""
2
-
3
- from __future__ import annotations
4
-
5
- import shutil
6
- import subprocess
7
- from enum import Enum
8
- from pathlib import Path
9
-
10
-
11
- class PreflightResult(Enum):
12
- PASS = "pass"
13
- FAIL = "fail"
14
- UNREACHABLE = "unreachable"
15
-
16
-
17
- def act_available() -> bool:
18
- return shutil.which("act") is not None
19
-
20
-
21
- def docker_running() -> bool:
22
- try:
23
- proc = subprocess.run(["docker", "info"], capture_output=True, timeout=30)
24
- return proc.returncode == 0
25
- except (FileNotFoundError, subprocess.TimeoutExpired):
26
- return False
27
-
28
-
29
- def probe() -> bool:
30
- """Can act actually run here? Needs the binary, a live docker daemon, and `act -l`."""
31
- if not act_available() or not docker_running():
32
- return False
33
- try:
34
- proc = subprocess.run(["act", "-l"], capture_output=True, text=True, timeout=60)
35
- except (FileNotFoundError, subprocess.TimeoutExpired):
36
- return False
37
- return proc.returncode == 0
38
-
39
-
40
- def build_act_command(event: str) -> list[str]:
41
- cmd = ["act", event]
42
- if Path(".secrets").exists():
43
- cmd += ["--secret-file", ".secrets"]
44
- return cmd
45
-
46
-
47
- def run_act(event: str = "pull_request") -> PreflightResult:
48
- """Run act for `event`. PASS on exit 0, else FAIL. (Probe gates UNREACHABLE upstream.)"""
49
- proc = subprocess.run(build_act_command(event))
50
- return PreflightResult.PASS if proc.returncode == 0 else PreflightResult.FAIL
51
-
52
-
53
- def preflight(repo_slug: str, event: str = "pull_request") -> PreflightResult:
54
- """Primary gate. PASS/FAIL if act can run; UNREACHABLE if act can't start here.
55
-
56
- `repo_slug` is accepted for symmetry and future use; the runner fallback is
57
- orchestrated by the CLI layer based on runner_status.has_online_runner.
58
- """
59
- if not probe():
60
- return PreflightResult.UNREACHABLE
61
- return run_act(event)
File without changes