roar-cli 0.2.3__tar.gz → 0.2.7__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 (244) hide show
  1. {roar_cli-0.2.3 → roar_cli-0.2.7}/PKG-INFO +91 -29
  2. roar_cli-0.2.3/roar_cli.egg-info/PKG-INFO → roar_cli-0.2.7/README.md +66 -51
  3. {roar_cli-0.2.3 → roar_cli-0.2.7}/pyproject.toml +21 -12
  4. roar_cli-0.2.7/roar/bin/libroar_tracer_preload.so +0 -0
  5. roar_cli-0.2.7/roar/bin/roar-proxy +0 -0
  6. roar_cli-0.2.7/roar/bin/roar-tracer +0 -0
  7. roar_cli-0.2.7/roar/bin/roar-tracer-ebpf +0 -0
  8. roar_cli-0.2.7/roar/bin/roar-tracer-preload +0 -0
  9. roar_cli-0.2.7/roar/bin/roard +0 -0
  10. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/cli/__init__.py +2 -0
  11. roar_cli-0.2.7/roar/cli/commands/__init__.py +70 -0
  12. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/cli/commands/_execution.py +62 -40
  13. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/cli/commands/build.py +23 -2
  14. roar_cli-0.2.7/roar/cli/commands/dag.py +175 -0
  15. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/cli/commands/get.py +27 -22
  16. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/cli/commands/init.py +65 -6
  17. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/cli/commands/lineage.py +2 -20
  18. roar_cli-0.2.7/roar/cli/commands/proxy.py +130 -0
  19. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/cli/commands/put.py +61 -25
  20. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/cli/commands/register.py +12 -2
  21. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/cli/commands/reproduce.py +2 -1
  22. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/cli/commands/run.py +28 -6
  23. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/cli/commands/show.py +63 -220
  24. roar_cli-0.2.7/roar/cli/commands/tracer.py +304 -0
  25. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/cli/context.py +46 -35
  26. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/config.py +168 -211
  27. roar_cli-0.2.7/roar/core/__init__.py +86 -0
  28. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/container.py +75 -22
  29. roar_cli-0.2.7/roar/core/digests.py +56 -0
  30. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/dto/registration.py +12 -4
  31. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/interfaces/registration.py +12 -3
  32. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/interfaces/repositories.py +19 -0
  33. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/interfaces/reproduction.py +11 -0
  34. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/interfaces/services.py +8 -0
  35. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/models/__init__.py +8 -0
  36. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/models/artifact.py +28 -14
  37. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/models/base.py +2 -0
  38. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/models/config.py +42 -0
  39. roar_cli-0.2.7/roar/core/models/dataset_identifier.py +68 -0
  40. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/models/glaas.py +3 -1
  41. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/models/job.py +48 -20
  42. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/models/provenance.py +4 -0
  43. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/models/run.py +4 -0
  44. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/models/session.py +26 -11
  45. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/settings.py +63 -1
  46. roar_cli-0.2.7/roar/core/tracer_modes.py +18 -0
  47. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/db/__init__.py +4 -0
  48. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/db/context.py +49 -8
  49. roar_cli-0.2.7/roar/db/hashing/__init__.py +17 -0
  50. roar_cli-0.2.7/roar/db/hashing/backend.py +181 -0
  51. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/db/models.py +83 -0
  52. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/db/repositories/__init__.py +2 -0
  53. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/db/repositories/artifact.py +3 -0
  54. roar_cli-0.2.7/roar/db/repositories/composite.py +149 -0
  55. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/db/repositories/job.py +154 -18
  56. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/db/repositories/session.py +15 -0
  57. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/db/schema.py +115 -0
  58. roar_cli-0.2.7/roar/db/services/hashing.py +179 -0
  59. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/db/services/job_recording.py +74 -31
  60. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/db/services/lineage.py +38 -26
  61. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/filters/__init__.py +13 -0
  62. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/filters/files.py +19 -6
  63. roar_cli-0.2.7/roar/glaas/__init__.py +24 -0
  64. roar_cli-0.2.7/roar/glaas/auth.py +221 -0
  65. roar_cli-0.2.7/roar/glaas/transport.py +127 -0
  66. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/glaas_client.py +93 -370
  67. roar_cli-0.2.7/roar/presenters/__init__.py +14 -0
  68. roar_cli-0.2.7/roar/presenters/dag_data_builder.py +359 -0
  69. roar_cli-0.2.7/roar/presenters/null.py +36 -0
  70. roar_cli-0.2.7/roar/presenters/show_renderer.py +358 -0
  71. roar_cli-0.2.7/roar/presenters/spinner.py +60 -0
  72. roar_cli-0.2.7/roar/ray/__init__.py +6 -0
  73. roar_cli-0.2.7/roar/ray/_agent_names.py +7 -0
  74. roar_cli-0.2.7/roar/ray/actor.py +22 -0
  75. roar_cli-0.2.7/roar/ray/collector.py +999 -0
  76. roar_cli-0.2.7/roar/ray/fragment.py +50 -0
  77. roar_cli-0.2.7/roar/ray/node_agent.py +139 -0
  78. roar_cli-0.2.7/roar/ray/roar_worker.py +607 -0
  79. roar_cli-0.2.7/roar/ray/worker.py +550 -0
  80. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/execution/__init__.py +2 -0
  81. roar_cli-0.2.7/roar/services/execution/backup.py +71 -0
  82. roar_cli-0.2.7/roar/services/execution/coordinator.py +329 -0
  83. roar_cli-0.2.7/roar/services/execution/dataset_identifier.py +485 -0
  84. roar_cli-0.2.7/roar/services/execution/inject/sitecustomize.py +833 -0
  85. roar_cli-0.2.7/roar/services/execution/job_recording.py +711 -0
  86. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/execution/provenance/assembler.py +28 -5
  87. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/execution/provenance/build_tool_collector.py +5 -0
  88. roar_cli-0.2.7/roar/services/execution/provenance/data_loader.py +197 -0
  89. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/execution/provenance/file_filter.py +101 -5
  90. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/execution/provenance/package_collector.py +148 -60
  91. roar_cli-0.2.7/roar/services/execution/provenance/runtime_collector.py +498 -0
  92. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/execution/provenance/service.py +12 -4
  93. roar_cli-0.2.7/roar/services/execution/proxy.py +324 -0
  94. roar_cli-0.2.7/roar/services/execution/tracer.py +385 -0
  95. roar_cli-0.2.7/roar/services/execution/tracer_backends.py +276 -0
  96. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/get/service.py +54 -63
  97. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/lookup/entity_lookup.py +17 -11
  98. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/put/__init__.py +2 -0
  99. roar_cli-0.2.7/roar/services/put/composite_builder.py +321 -0
  100. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/put/resolver.py +53 -3
  101. roar_cli-0.2.7/roar/services/put/service.py +1563 -0
  102. roar_cli-0.2.7/roar/services/registration/_artifact_ref.py +110 -0
  103. roar_cli-0.2.7/roar/services/registration/_dataset_label.py +52 -0
  104. roar_cli-0.2.7/roar/services/registration/_dataset_profile.py +309 -0
  105. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/registration/artifact.py +23 -0
  106. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/registration/coordinator.py +99 -38
  107. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/registration/job.py +176 -18
  108. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/registration/register_service.py +287 -40
  109. roar_cli-0.2.7/roar/services/reproduction/environment_setup.py +580 -0
  110. roar_cli-0.2.7/roar/services/reproduction/installers.py +351 -0
  111. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/reproduction/pipeline_executor.py +9 -20
  112. roar_cli-0.2.7/roar/services/reproduction/pipeline_metadata.py +91 -0
  113. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/reproduction/service.py +62 -58
  114. roar_cli-0.2.7/roar/services/transfer/__init__.py +18 -0
  115. roar_cli-0.2.7/roar/services/transfer/backend_resolution.py +32 -0
  116. roar_cli-0.2.7/roar/services/transfer/common.py +83 -0
  117. roar_cli-0.2.7/roar/services/upload/lineage_collector.py +330 -0
  118. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/vcs/git_access.py +1 -1
  119. roar_cli-0.2.7/rust/Cargo.lock +3260 -0
  120. roar_cli-0.2.7/rust/Cargo.toml +19 -0
  121. roar_cli-0.2.7/rust/crates/artifact-hash-core/Cargo.toml +20 -0
  122. roar_cli-0.2.7/rust/crates/artifact-hash-core/src/lib.rs +345 -0
  123. roar_cli-0.2.7/rust/crates/artifact-hash-py/Cargo.toml +22 -0
  124. roar_cli-0.2.7/rust/crates/artifact-hash-py/src/lib.rs +67 -0
  125. roar_cli-0.2.3/README.md +0 -423
  126. roar_cli-0.2.3/roar/bin/roar-tracer +0 -0
  127. roar_cli-0.2.3/roar/cli/commands/__init__.py +0 -71
  128. roar_cli-0.2.3/roar/cli/commands/dag.py +0 -449
  129. roar_cli-0.2.3/roar/core/__init__.py +0 -62
  130. roar_cli-0.2.3/roar/db/hashing/__init__.py +0 -25
  131. roar_cli-0.2.3/roar/db/hashing/registry.py +0 -121
  132. roar_cli-0.2.3/roar/db/hashing/strategies.py +0 -94
  133. roar_cli-0.2.3/roar/db/services/hashing.py +0 -187
  134. roar_cli-0.2.3/roar/db/storage.py +0 -143
  135. roar_cli-0.2.3/roar/presenters/__init__.py +0 -11
  136. roar_cli-0.2.3/roar/services/execution/coordinator.py +0 -423
  137. roar_cli-0.2.3/roar/services/execution/inject/sitecustomize.py +0 -203
  138. roar_cli-0.2.3/roar/services/execution/provenance/data_loader.py +0 -97
  139. roar_cli-0.2.3/roar/services/execution/provenance/runtime_collector.py +0 -311
  140. roar_cli-0.2.3/roar/services/execution/tracer.py +0 -190
  141. roar_cli-0.2.3/roar/services/put/service.py +0 -511
  142. roar_cli-0.2.3/roar/services/reproduction/environment_setup.py +0 -967
  143. roar_cli-0.2.3/roar/services/upload/lineage_collector.py +0 -200
  144. roar_cli-0.2.3/roar_cli.egg-info/SOURCES.txt +0 -180
  145. roar_cli-0.2.3/roar_cli.egg-info/dependency_links.txt +0 -1
  146. roar_cli-0.2.3/roar_cli.egg-info/entry_points.txt +0 -2
  147. roar_cli-0.2.3/roar_cli.egg-info/requires.txt +0 -21
  148. roar_cli-0.2.3/roar_cli.egg-info/top_level.txt +0 -1
  149. roar_cli-0.2.3/setup.cfg +0 -4
  150. roar_cli-0.2.3/setup.py +0 -90
  151. roar_cli-0.2.3/tests/test_config.py +0 -362
  152. {roar_cli-0.2.3 → roar_cli-0.2.7}/LICENSE +0 -0
  153. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/__init__.py +0 -0
  154. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/__main__.py +0 -0
  155. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/analyzers/__init__.py +0 -0
  156. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/analyzers/base.py +0 -0
  157. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/analyzers/experiment_trackers.py +0 -0
  158. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/cli/commands/auth.py +0 -0
  159. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/cli/commands/config.py +0 -0
  160. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/cli/commands/env.py +0 -0
  161. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/cli/commands/log.py +0 -0
  162. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/cli/commands/pop.py +0 -0
  163. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/cli/commands/reset.py +0 -0
  164. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/cli/commands/status.py +0 -0
  165. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/cli/decorators.py +0 -0
  166. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/bootstrap.py +0 -0
  167. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/di.py +0 -0
  168. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/dto/__init__.py +0 -0
  169. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/exceptions.py +0 -0
  170. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/interfaces/__init__.py +0 -0
  171. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/interfaces/cloud.py +0 -0
  172. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/interfaces/command.py +0 -0
  173. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/interfaces/config.py +0 -0
  174. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/interfaces/logger.py +0 -0
  175. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/interfaces/presenter.py +0 -0
  176. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/interfaces/provenance.py +0 -0
  177. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/interfaces/run.py +0 -0
  178. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/interfaces/telemetry.py +0 -0
  179. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/interfaces/upload.py +0 -0
  180. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/interfaces/vcs.py +0 -0
  181. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/logging.py +0 -0
  182. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/models/command.py +0 -0
  183. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/models/dag.py +0 -0
  184. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/models/lineage.py +0 -0
  185. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/models/telemetry.py +0 -0
  186. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/models/vcs.py +0 -0
  187. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/registry.py +0 -0
  188. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/core/validation.py +0 -0
  189. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/db/engine.py +0 -0
  190. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/db/repositories/collection.py +0 -0
  191. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/db/repositories/hash_cache.py +0 -0
  192. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/db/services/__init__.py +0 -0
  193. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/db/services/session.py +0 -0
  194. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/filters/omit.py +0 -0
  195. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/plugins/__init__.py +0 -0
  196. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/plugins/cloud/__init__.py +0 -0
  197. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/plugins/cloud/base.py +0 -0
  198. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/plugins/telemetry/__init__.py +0 -0
  199. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/plugins/telemetry/base.py +0 -0
  200. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/plugins/telemetry/wandb.py +0 -0
  201. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/plugins/vcs/__init__.py +0 -0
  202. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/plugins/vcs/base.py +0 -0
  203. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/plugins/vcs/git.py +0 -0
  204. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/presenters/console.py +0 -0
  205. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/presenters/dag_renderer.py +0 -0
  206. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/presenters/formatting.py +0 -0
  207. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/presenters/run_report.py +0 -0
  208. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/__init__.py +0 -0
  209. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/execution/args.py +0 -0
  210. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/execution/dag_resolver.py +0 -0
  211. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/execution/execution_service.py +0 -0
  212. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/execution/inject/__init__.py +0 -0
  213. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/execution/provenance/__init__.py +0 -0
  214. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/execution/provenance/build_pip_collector.py +0 -0
  215. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/execution/provenance/process_summarizer.py +0 -0
  216. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/execution/signal_handler.py +0 -0
  217. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/get/__init__.py +0 -0
  218. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/get/backends/__init__.py +0 -0
  219. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/get/backends/base.py +0 -0
  220. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/get/backends/gcs.py +0 -0
  221. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/get/backends/http.py +0 -0
  222. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/get/backends/noop.py +0 -0
  223. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/get/backends/s3.py +0 -0
  224. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/logging.py +0 -0
  225. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/lookup/__init__.py +0 -0
  226. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/lookup/step_parser.py +0 -0
  227. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/put/backends/__init__.py +0 -0
  228. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/put/backends/base.py +0 -0
  229. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/put/backends/gcs.py +0 -0
  230. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/put/backends/memory.py +0 -0
  231. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/put/backends/noop.py +0 -0
  232. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/put/backends/s3.py +0 -0
  233. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/put/git.py +0 -0
  234. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/registration/__init__.py +0 -0
  235. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/registration/session.py +0 -0
  236. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/reproduction/__init__.py +0 -0
  237. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/secrets/__init__.py +0 -0
  238. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/secrets/filter_service.py +0 -0
  239. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/upload/__init__.py +0 -0
  240. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/upload/service.py +0 -0
  241. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/services/vcs/__init__.py +0 -0
  242. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/utils/__init__.py +0 -0
  243. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/utils/cloud.py +0 -0
  244. {roar_cli-0.2.3 → roar_cli-0.2.7}/roar/utils/git_url.py +0 -0
@@ -1,14 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: roar-cli
3
- Version: 0.2.3
4
- Summary: Reproducibility and provenance tracker for ML training pipelines
5
- Author-email: TReqs Team <info@treqs.ai>
6
- License-Expression: Apache-2.0
7
- Project-URL: Homepage, https://github.com/treqs/roar
8
- Project-URL: Repository, https://github.com/treqs/roar
9
- Project-URL: Documentation, https://github.com/treqs/roar#readme
10
- Project-URL: Issues, https://github.com/treqs/roar/issues
11
- Keywords: machine-learning,reproducibility,lineage,provenance,mlops,data-versioning,artifact-tracking
3
+ Version: 0.2.7
12
4
  Classifier: Development Status :: 3 - Alpha
13
5
  Classifier: Intended Audience :: Developers
14
6
  Classifier: Intended Audience :: Science/Research
@@ -21,28 +13,36 @@ Classifier: Programming Language :: Python :: 3.13
21
13
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
22
14
  Classifier: Topic :: Software Development :: Version Control
23
15
  Classifier: Typing :: Typed
24
- Requires-Python: >=3.10
25
- Description-Content-Type: text/markdown
26
- License-File: LICENSE
27
16
  Requires-Dist: blake3>=0.3.0
28
17
  Requires-Dist: click>=8.1.0
29
18
  Requires-Dist: dependency-injector>=4.40.0
19
+ Requires-Dist: msgpack>=1.0.0
30
20
  Requires-Dist: sqlalchemy>=2.0.0
31
- Requires-Dist: pysqlite3-binary>=0.5.0
21
+ Requires-Dist: pysqlite3-binary>=0.5.0 ; platform_machine == 'x86_64' and sys_platform == 'linux'
32
22
  Requires-Dist: pydantic>=2.0.0
33
23
  Requires-Dist: pydantic-settings>=2.0.0
34
- Requires-Dist: tomli>=2.0.0; python_version < "3.11"
24
+ Requires-Dist: tomli>=2.0.0 ; python_full_version < '3.11'
25
+ Requires-Dist: pytest>=7.0.0 ; extra == 'dev'
26
+ Requires-Dist: pytest-timeout>=2.0.0 ; extra == 'dev'
27
+ Requires-Dist: pytest-mock>=3.10.0 ; extra == 'dev'
28
+ Requires-Dist: pytest-cov>=4.0.0 ; extra == 'dev'
29
+ Requires-Dist: pytest-xdist>=3.5.0 ; extra == 'dev'
30
+ Requires-Dist: ruff>=0.8.0 ; extra == 'dev'
31
+ Requires-Dist: mypy>=1.13.0 ; extra == 'dev'
32
+ Requires-Dist: boto3>=1.28.0 ; extra == 'dev'
33
+ Requires-Dist: google-cloud-storage>=2.10.0 ; extra == 'dev'
35
34
  Provides-Extra: dev
36
- Requires-Dist: pytest>=7.0.0; extra == "dev"
37
- Requires-Dist: pytest-timeout>=2.0.0; extra == "dev"
38
- Requires-Dist: pytest-mock>=3.10.0; extra == "dev"
39
- Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
40
- Requires-Dist: pytest-xdist>=3.5.0; extra == "dev"
41
- Requires-Dist: ruff>=0.8.0; extra == "dev"
42
- Requires-Dist: mypy>=1.13.0; extra == "dev"
43
- Requires-Dist: boto3>=1.28.0; extra == "dev"
44
- Requires-Dist: google-cloud-storage>=2.10.0; extra == "dev"
45
- Dynamic: license-file
35
+ License-File: LICENSE
36
+ Summary: Reproducibility and provenance tracker for ML training pipelines
37
+ Keywords: machine-learning,reproducibility,lineage,provenance,mlops,data-versioning,artifact-tracking
38
+ Author-email: TReqs Team <info@treqs.ai>
39
+ License-Expression: Apache-2.0
40
+ Requires-Python: >=3.10
41
+ Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
42
+ Project-URL: Documentation, https://github.com/treqs/roar#readme
43
+ Project-URL: Homepage, https://github.com/treqs/roar
44
+ Project-URL: Issues, https://github.com/treqs/roar/issues
45
+ Project-URL: Repository, https://github.com/treqs/roar
46
46
 
47
47
  # roar
48
48
 
@@ -62,7 +62,7 @@ pip install roar-cli
62
62
  uv pip install roar-cli
63
63
  ```
64
64
 
65
- Requires Python 3.10+ and Linux (x86_64 or aarch64).
65
+ Requires Python 3.10+.
66
66
 
67
67
  ### Platform Support
68
68
 
@@ -70,10 +70,10 @@ Requires Python 3.10+ and Linux (x86_64 or aarch64).
70
70
  | ------------- | -------------- |
71
71
  | Linux x86_64 | ✅ Full support |
72
72
  | Linux aarch64 | ✅ Full support |
73
- | macOS | Coming soon |
73
+ | macOS | 🚧 Experimental ([limitations](#macos-tracing-limitations)) |
74
74
  | Windows | Coming soon |
75
75
 
76
- macOS and Windows support are planned for future releases.
76
+ PyPI wheels are published for Linux and macOS (`x86_64` and `arm64`).
77
77
 
78
78
  ### Development Installation
79
79
 
@@ -82,7 +82,7 @@ macOS and Windows support are planned for future releases.
82
82
  git clone https://github.com/treqs/roar.git
83
83
  cd roar
84
84
 
85
- # Install in development mode (automatically builds tracer if Rust is installed)
85
+ # Install in development mode
86
86
  uv pip install -e ".[dev]"
87
87
  # or without uv
88
88
  pip install -e ".[dev]"
@@ -101,6 +101,67 @@ roar run python train.py --data features.parquet --output model.pt
101
101
  roar run python evaluate.py --model model.pt --output metrics.json
102
102
  ```
103
103
 
104
+ ## Tracer Backends
105
+
106
+ `roar run` relies on a Rust "tracer" binary to observe file I/O. If you see an error like "No tracer binary found", build one of the backends below.
107
+
108
+ ### Backends
109
+
110
+ | Backend | Binary | Platforms | Notes |
111
+ | --- | --- | --- | --- |
112
+ | eBPF | `roar-tracer-ebpf` | Linux | Fastest, but requires permissions and kernel support. |
113
+ | preload | `roar-tracer-preload` + `libroar_tracer_preload` | macOS, Linux | Uses `DYLD_INSERT_LIBRARIES` (macOS) or `LD_PRELOAD` (Linux). Not compatible with processes that ignore preload env vars (e.g., SIP/hardened runtime on macOS), or fully-static binaries (common with Go). |
114
+ | ptrace | `roar-tracer` | Linux | Slowest, broadest compatibility on Linux. |
115
+
116
+ ### Building
117
+
118
+ ```bash
119
+ cd rust
120
+
121
+ # eBPF (Linux)
122
+ cargo build --release -p roar-tracer-ebpf
123
+
124
+ # preload (macOS & Linux)
125
+ cargo build --release -p roar-tracer-preload
126
+
127
+ # ptrace (Linux)
128
+ cargo build --release -p roar-tracer
129
+ ```
130
+
131
+ ### Selecting A Backend
132
+
133
+ By default, `roar` uses `auto` mode: prefer eBPF, then preload, then ptrace.
134
+
135
+ ```bash
136
+ # Show what roar can currently find and whether it looks usable
137
+ roar tracer status
138
+
139
+ # Set a default backend (auto|ebpf|preload|ptrace)
140
+ roar tracer set-default preload
141
+ ```
142
+
143
+ ### macOS Tracing Limitations
144
+
145
+ On macOS, `roar` uses the `preload` backend (`DYLD_INSERT_LIBRARIES`). macOS System Integrity Protection (SIP) silently blocks library injection for Apple-signed platform binaries — anything under `/usr/bin/`, `/bin/`, `/sbin/`, or `/System/`. When this happens, `roar run` will complete successfully but capture no file I/O events.
146
+
147
+ **Affected:** `/usr/bin/python3`, `/bin/sh`, `/usr/bin/ruby`, and all other Apple-shipped binaries.
148
+
149
+ **Workaround:** Use non-Apple builds of your tools:
150
+
151
+ ```bash
152
+ # Homebrew
153
+ brew install python3
154
+ roar run python3 train.py # Uses /opt/homebrew/bin/python3 — works
155
+
156
+ # conda / pyenv / nix also work
157
+ roar run ~/.pyenv/shims/python train.py
158
+
159
+ # This will NOT capture file events (SIP blocks it):
160
+ roar run /usr/bin/python3 train.py
161
+ ```
162
+
163
+ `roar` prints a warning when it detects no events were captured from a SIP-protected binary.
164
+
104
165
  ## Commands
105
166
 
106
167
  ### `roar init`
@@ -428,7 +489,7 @@ roar auth test
428
489
  ### Setup
429
490
 
430
491
  ```bash
431
- # Install dev dependencies (automatically builds tracer if Rust is installed)
492
+ # Install dev dependencies
432
493
  uv pip install -e ".[dev]"
433
494
  ```
434
495
 
@@ -467,3 +528,4 @@ pytest tests/ -v -m "not integration and not e2e and not glaas and not live_glaa
467
528
  ## License
468
529
 
469
530
  Apache 2.0
531
+
@@ -1,49 +1,3 @@
1
- Metadata-Version: 2.4
2
- Name: roar-cli
3
- Version: 0.2.3
4
- Summary: Reproducibility and provenance tracker for ML training pipelines
5
- Author-email: TReqs Team <info@treqs.ai>
6
- License-Expression: Apache-2.0
7
- Project-URL: Homepage, https://github.com/treqs/roar
8
- Project-URL: Repository, https://github.com/treqs/roar
9
- Project-URL: Documentation, https://github.com/treqs/roar#readme
10
- Project-URL: Issues, https://github.com/treqs/roar/issues
11
- Keywords: machine-learning,reproducibility,lineage,provenance,mlops,data-versioning,artifact-tracking
12
- Classifier: Development Status :: 3 - Alpha
13
- Classifier: Intended Audience :: Developers
14
- Classifier: Intended Audience :: Science/Research
15
- Classifier: Operating System :: OS Independent
16
- Classifier: Programming Language :: Python :: 3
17
- Classifier: Programming Language :: Python :: 3.10
18
- Classifier: Programming Language :: Python :: 3.11
19
- Classifier: Programming Language :: Python :: 3.12
20
- Classifier: Programming Language :: Python :: 3.13
21
- Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
22
- Classifier: Topic :: Software Development :: Version Control
23
- Classifier: Typing :: Typed
24
- Requires-Python: >=3.10
25
- Description-Content-Type: text/markdown
26
- License-File: LICENSE
27
- Requires-Dist: blake3>=0.3.0
28
- Requires-Dist: click>=8.1.0
29
- Requires-Dist: dependency-injector>=4.40.0
30
- Requires-Dist: sqlalchemy>=2.0.0
31
- Requires-Dist: pysqlite3-binary>=0.5.0
32
- Requires-Dist: pydantic>=2.0.0
33
- Requires-Dist: pydantic-settings>=2.0.0
34
- Requires-Dist: tomli>=2.0.0; python_version < "3.11"
35
- Provides-Extra: dev
36
- Requires-Dist: pytest>=7.0.0; extra == "dev"
37
- Requires-Dist: pytest-timeout>=2.0.0; extra == "dev"
38
- Requires-Dist: pytest-mock>=3.10.0; extra == "dev"
39
- Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
40
- Requires-Dist: pytest-xdist>=3.5.0; extra == "dev"
41
- Requires-Dist: ruff>=0.8.0; extra == "dev"
42
- Requires-Dist: mypy>=1.13.0; extra == "dev"
43
- Requires-Dist: boto3>=1.28.0; extra == "dev"
44
- Requires-Dist: google-cloud-storage>=2.10.0; extra == "dev"
45
- Dynamic: license-file
46
-
47
1
  # roar
48
2
 
49
3
  **Run Observation & Artifact Registration**
@@ -62,7 +16,7 @@ pip install roar-cli
62
16
  uv pip install roar-cli
63
17
  ```
64
18
 
65
- Requires Python 3.10+ and Linux (x86_64 or aarch64).
19
+ Requires Python 3.10+.
66
20
 
67
21
  ### Platform Support
68
22
 
@@ -70,10 +24,10 @@ Requires Python 3.10+ and Linux (x86_64 or aarch64).
70
24
  | ------------- | -------------- |
71
25
  | Linux x86_64 | ✅ Full support |
72
26
  | Linux aarch64 | ✅ Full support |
73
- | macOS | Coming soon |
27
+ | macOS | 🚧 Experimental ([limitations](#macos-tracing-limitations)) |
74
28
  | Windows | Coming soon |
75
29
 
76
- macOS and Windows support are planned for future releases.
30
+ PyPI wheels are published for Linux and macOS (`x86_64` and `arm64`).
77
31
 
78
32
  ### Development Installation
79
33
 
@@ -82,7 +36,7 @@ macOS and Windows support are planned for future releases.
82
36
  git clone https://github.com/treqs/roar.git
83
37
  cd roar
84
38
 
85
- # Install in development mode (automatically builds tracer if Rust is installed)
39
+ # Install in development mode
86
40
  uv pip install -e ".[dev]"
87
41
  # or without uv
88
42
  pip install -e ".[dev]"
@@ -101,6 +55,67 @@ roar run python train.py --data features.parquet --output model.pt
101
55
  roar run python evaluate.py --model model.pt --output metrics.json
102
56
  ```
103
57
 
58
+ ## Tracer Backends
59
+
60
+ `roar run` relies on a Rust "tracer" binary to observe file I/O. If you see an error like "No tracer binary found", build one of the backends below.
61
+
62
+ ### Backends
63
+
64
+ | Backend | Binary | Platforms | Notes |
65
+ | --- | --- | --- | --- |
66
+ | eBPF | `roar-tracer-ebpf` | Linux | Fastest, but requires permissions and kernel support. |
67
+ | preload | `roar-tracer-preload` + `libroar_tracer_preload` | macOS, Linux | Uses `DYLD_INSERT_LIBRARIES` (macOS) or `LD_PRELOAD` (Linux). Not compatible with processes that ignore preload env vars (e.g., SIP/hardened runtime on macOS), or fully-static binaries (common with Go). |
68
+ | ptrace | `roar-tracer` | Linux | Slowest, broadest compatibility on Linux. |
69
+
70
+ ### Building
71
+
72
+ ```bash
73
+ cd rust
74
+
75
+ # eBPF (Linux)
76
+ cargo build --release -p roar-tracer-ebpf
77
+
78
+ # preload (macOS & Linux)
79
+ cargo build --release -p roar-tracer-preload
80
+
81
+ # ptrace (Linux)
82
+ cargo build --release -p roar-tracer
83
+ ```
84
+
85
+ ### Selecting A Backend
86
+
87
+ By default, `roar` uses `auto` mode: prefer eBPF, then preload, then ptrace.
88
+
89
+ ```bash
90
+ # Show what roar can currently find and whether it looks usable
91
+ roar tracer status
92
+
93
+ # Set a default backend (auto|ebpf|preload|ptrace)
94
+ roar tracer set-default preload
95
+ ```
96
+
97
+ ### macOS Tracing Limitations
98
+
99
+ On macOS, `roar` uses the `preload` backend (`DYLD_INSERT_LIBRARIES`). macOS System Integrity Protection (SIP) silently blocks library injection for Apple-signed platform binaries — anything under `/usr/bin/`, `/bin/`, `/sbin/`, or `/System/`. When this happens, `roar run` will complete successfully but capture no file I/O events.
100
+
101
+ **Affected:** `/usr/bin/python3`, `/bin/sh`, `/usr/bin/ruby`, and all other Apple-shipped binaries.
102
+
103
+ **Workaround:** Use non-Apple builds of your tools:
104
+
105
+ ```bash
106
+ # Homebrew
107
+ brew install python3
108
+ roar run python3 train.py # Uses /opt/homebrew/bin/python3 — works
109
+
110
+ # conda / pyenv / nix also work
111
+ roar run ~/.pyenv/shims/python train.py
112
+
113
+ # This will NOT capture file events (SIP blocks it):
114
+ roar run /usr/bin/python3 train.py
115
+ ```
116
+
117
+ `roar` prints a warning when it detects no events were captured from a SIP-protected binary.
118
+
104
119
  ## Commands
105
120
 
106
121
  ### `roar init`
@@ -428,7 +443,7 @@ roar auth test
428
443
  ### Setup
429
444
 
430
445
  ```bash
431
- # Install dev dependencies (automatically builds tracer if Rust is installed)
446
+ # Install dev dependencies
432
447
  uv pip install -e ".[dev]"
433
448
  ```
434
449
 
@@ -1,10 +1,10 @@
1
1
  [build-system]
2
- requires = ["setuptools>=61.0"]
3
- build-backend = "setuptools.build_meta"
2
+ requires = ["maturin>=1.11.5,<2.0"]
3
+ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "roar-cli"
7
- version = "0.2.3"
7
+ version = "0.2.7"
8
8
  description = "Reproducibility and provenance tracker for ML training pipelines"
9
9
  authors = [
10
10
  { name="TReqs Team", email="info@treqs.ai" }
@@ -39,8 +39,9 @@ dependencies = [
39
39
  "blake3>=0.3.0",
40
40
  "click>=8.1.0",
41
41
  "dependency-injector>=4.40.0",
42
+ "msgpack>=1.0.0",
42
43
  "sqlalchemy>=2.0.0",
43
- "pysqlite3-binary>=0.5.0", # Fallback when stdlib sqlite3 unavailable
44
+ "pysqlite3-binary>=0.5.0; sys_platform == 'linux' and platform_machine == 'x86_64'", # Fallback when stdlib sqlite3 unavailable
44
45
  "pydantic>=2.0.0",
45
46
  "pydantic-settings>=2.0.0",
46
47
  "tomli>=2.0.0; python_version < '3.11'",
@@ -68,28 +69,36 @@ dev = [
68
69
  [project.scripts]
69
70
  # This registers `roar` on PATH after pip install
70
71
  roar = "roar.__main__:main"
72
+ roar-worker = "roar.ray.roar_worker:main"
71
73
 
72
- [tool.setuptools.packages.find]
73
- where = ["."]
74
- include = ["roar", "roar.*"]
75
-
76
- [tool.setuptools.package-data]
77
- roar = ["bin/*"]
74
+ [tool.maturin]
75
+ manifest-path = "rust/crates/artifact-hash-py/Cargo.toml"
76
+ python-source = "."
77
+ module-name = "roar._hash_native"
78
+ bindings = "pyo3"
79
+ include = [
80
+ { path = "LICENSE", format = "sdist" },
81
+ { path = "LICENSE", format = "wheel" },
82
+ { path = "roar/bin/*", format = "sdist" },
83
+ { path = "roar/bin/*", format = "wheel" },
84
+ ]
78
85
 
79
86
  [tool.pytest.ini_options]
80
87
  # Parallel execution enabled by default with pytest-xdist
81
88
  # - Uses --dist loadfile to keep same-file tests in same worker (avoids cwd race conditions)
82
- # - live_glaas tests must be run separately with --dist no (sequential)
89
+ # - Default profile excludes tests requiring root/eBPF and live GLaaS dependencies
83
90
  testpaths = ["tests"]
84
91
  markers = [
85
92
  "integration: Integration tests (uses fixtures)",
86
93
  "e2e: End-to-end tests (full workflows)",
87
94
  "glaas: Tests requiring GLaaS server",
88
95
  "live_glaas: Tests requiring live GLaaS API running locally",
96
+ "ebpf: Tests requiring eBPF daemon/root privileges",
89
97
  "cloud: Tests for cloud storage operations",
90
98
  "happy_path: Happy path tests for core functionality",
99
+ "ray_e2e: Ray end-to-end tests requiring a running Docker cluster",
91
100
  ]
92
- addopts = "-v --strict-markers -n auto --dist loadfile"
101
+ addopts = "-v --strict-markers -n auto --dist loadfile --ignore=tests/ebpf --ignore=tests/live_glaas --ignore=tests/benchmarks --ignore=tests/integration --ignore=tests/e2e"
93
102
  timeout = 60
94
103
  filterwarnings = [
95
104
  "ignore::DeprecationWarning",
Binary file
Binary file
Binary file
Binary file
@@ -38,6 +38,7 @@ LAZY_COMMANDS: dict[str, tuple[str, str, str]] = {
38
38
  "lineage": ("roar.cli.commands.lineage", "lineage", "Show lineage for an artifact"),
39
39
  "log": ("roar.cli.commands.log", "log", "Show execution log"),
40
40
  "pop": ("roar.cli.commands.pop", "pop", "Pop the last step from the session"),
41
+ "proxy": ("roar.cli.commands.proxy", "proxy", "Manage S3 proxy for lineage tracking"),
41
42
  "put": ("roar.cli.commands.put", "put", "Publish artifacts to cloud storage"),
42
43
  "register": ("roar.cli.commands.register", "register", "Register artifacts or jobs"),
43
44
  "reproduce": ("roar.cli.commands.reproduce", "reproduce", "Reproduce an artifact"),
@@ -45,6 +46,7 @@ LAZY_COMMANDS: dict[str, tuple[str, str, str]] = {
45
46
  "run": ("roar.cli.commands.run", "run", "Run a command with provenance tracking"),
46
47
  "show": ("roar.cli.commands.show", "show", "Show details of a job or artifact"),
47
48
  "status": ("roar.cli.commands.status", "status", "Show current session status"),
49
+ "tracer": ("roar.cli.commands.tracer", "tracer", "Manage tracer backend defaults"),
48
50
  }
49
51
 
50
52
 
@@ -0,0 +1,70 @@
1
+ """
2
+ Click command implementations for roar CLI.
3
+
4
+ This package contains the Click-based command implementations that
5
+ replace the legacy command classes. Each module corresponds to a
6
+ roar command (e.g., run.py implements 'roar run').
7
+
8
+ Commands are lazily imported via the LazyCommand mechanism in roar.cli.
9
+ This __init__ defers all imports to avoid loading every command module
10
+ when only one command is invoked.
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ from typing import TYPE_CHECKING
16
+
17
+ if TYPE_CHECKING:
18
+ import click
19
+
20
+ _COMMAND_MODULES: dict[str, tuple[str, str]] = {
21
+ "auth": (".auth", "auth"),
22
+ "build": (".build", "build"),
23
+ "config": (".config", "config"),
24
+ "dag": (".dag", "dag"),
25
+ "env": (".env", "env"),
26
+ "get": (".get", "get"),
27
+ "init": (".init", "init"),
28
+ "lineage": (".lineage", "lineage"),
29
+ "log": (".log", "log"),
30
+ "pop": (".pop", "pop"),
31
+ "put": (".put", "put"),
32
+ "register": (".register", "register"),
33
+ "reproduce": (".reproduce", "reproduce"),
34
+ "reset": (".reset", "reset"),
35
+ "run": (".run", "run"),
36
+ "show": (".show", "show"),
37
+ "status": (".status", "status"),
38
+ "tracer": (".tracer", "tracer"),
39
+ }
40
+
41
+
42
+ def get_migrated_commands() -> list[click.Command]:
43
+ """Import and return all command objects (used by legacy registration paths)."""
44
+ import importlib
45
+
46
+ commands = []
47
+ for module_path, attr_name in _COMMAND_MODULES.values():
48
+ mod = importlib.import_module(module_path, __name__)
49
+ commands.append(getattr(mod, attr_name))
50
+ return commands
51
+
52
+
53
+ def __getattr__(name: str):
54
+ if name == "MIGRATED_COMMANDS":
55
+ return get_migrated_commands()
56
+ if name in _COMMAND_MODULES:
57
+ import importlib
58
+
59
+ module_path, attr_name = _COMMAND_MODULES[name]
60
+ mod = importlib.import_module(module_path, __name__)
61
+ value = getattr(mod, attr_name)
62
+ globals()[name] = value
63
+ return value
64
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
65
+
66
+
67
+ __all__ = [
68
+ "MIGRATED_COMMANDS",
69
+ *_COMMAND_MODULES.keys(),
70
+ ]
@@ -19,39 +19,47 @@ if TYPE_CHECKING:
19
19
  from ..context import RoarContext
20
20
 
21
21
 
22
- def validate_git_clean() -> tuple[str, dict]:
22
+ def validate_git_clean() -> str:
23
23
  """
24
- Validate git repository is clean and return git info.
24
+ Validate git repository is clean and return repo root.
25
25
 
26
- This function checks:
27
- 1. We're inside a git repository
28
- 2. The working tree has no uncommitted changes
26
+ Lightweight pre-fork check using git subprocesses directly, avoiding
27
+ the heavy bootstrap/import cascade. Git info (commit, branch, etc.)
28
+ is collected by the ProvenanceService after the fork.
29
29
 
30
30
  Returns:
31
- Tuple of (repo_root, git_info) where git_info contains:
32
- - commit: Current commit hash
33
- - branch: Current branch name
34
- - remote_url: Remote origin URL
31
+ Repository root path
35
32
 
36
33
  Raises:
37
34
  click.ClickException: If not in a git repo or has uncommitted changes
38
35
  """
39
- from ...core.bootstrap import bootstrap
40
- from ...core.container import get_container
41
-
42
- # Bootstrap container to ensure VCS provider is registered
43
- bootstrap()
44
-
45
- vcs = get_container().get_vcs_provider("git")
46
- repo_root = vcs.get_repo_root()
47
-
48
- if not repo_root:
36
+ import subprocess
37
+
38
+ # Find repo root (no bootstrap needed)
39
+ try:
40
+ repo_root = subprocess.check_output(
41
+ ["git", "rev-parse", "--show-toplevel"],
42
+ stderr=subprocess.DEVNULL,
43
+ text=True,
44
+ ).strip()
45
+ except (subprocess.CalledProcessError, FileNotFoundError):
49
46
  raise click.ClickException(
50
47
  "roar requires the working directory to be inside a git repository."
51
- )
52
-
53
- clean, changes = vcs.get_status(repo_root)
54
- if not clean:
48
+ ) from None
49
+
50
+ # Check dirty status
51
+ try:
52
+ status_output = subprocess.check_output(
53
+ ["git", "status", "--porcelain"],
54
+ stderr=subprocess.DEVNULL,
55
+ text=True,
56
+ cwd=repo_root,
57
+ ).strip()
58
+ except (subprocess.CalledProcessError, FileNotFoundError):
59
+ status_output = ""
60
+
61
+ if status_output:
62
+ changes = status_output.split("\n")
55
63
  lines = ["Git repo has uncommitted changes:"]
56
64
  for change in changes[:5]:
57
65
  lines.append(f" {change}")
@@ -61,15 +69,7 @@ def validate_git_clean() -> tuple[str, dict]:
61
69
  lines.append("Commit your changes before running this command.")
62
70
  raise click.ClickException("\n".join(lines))
63
71
 
64
- # Get git info
65
- vcs_info = vcs.get_info(repo_root)
66
- git_info = {
67
- "commit": vcs_info.commit if vcs_info else None,
68
- "branch": vcs_info.branch if vcs_info else None,
69
- "remote_url": vcs_info.remote_url if vcs_info else None,
70
- }
71
-
72
- return repo_root, git_info
72
+ return repo_root
73
73
 
74
74
 
75
75
  def get_quiet_setting(quiet_flag: bool | None, repo_root: str | Path) -> bool:
@@ -99,10 +99,12 @@ def execute_and_report(
99
99
  ctx: "RoarContext",
100
100
  command: list[str],
101
101
  job_type: str | None,
102
+ step_name: str | None,
102
103
  quiet: bool,
103
104
  hash_algorithms: list[str],
104
- git_info: dict,
105
105
  repo_root: str,
106
+ tracer_mode: str | None = None,
107
+ tracer_fallback: bool | None = None,
106
108
  ) -> int:
107
109
  """
108
110
  Execute command via coordinator and show report.
@@ -118,9 +120,9 @@ def execute_and_report(
118
120
  ctx: RoarContext with roar_dir and other context
119
121
  command: Command to execute as list of strings
120
122
  job_type: Job type - None for run, "build" for build
123
+ step_name: Optional user-defined step label
121
124
  quiet: Whether to suppress output
122
125
  hash_algorithms: List of hash algorithms to use
123
- git_info: Git info dict with commit, branch, remote_url
124
126
  repo_root: Git repository root path
125
127
 
126
128
  Returns:
@@ -128,9 +130,28 @@ def execute_and_report(
128
130
  """
129
131
  from typing import Literal, cast
130
132
 
133
+ from ...config import config_get
134
+ from ...core.bootstrap import bootstrap
131
135
  from ...core.interfaces.run import RunContext
132
- from ...presenters.run_report import RunReportPresenter
133
- from ...services.execution import RunCoordinator
136
+ from ...services.execution.coordinator import RunCoordinator
137
+
138
+ # Ensure plugin/provider registries (including VCS=git) are populated.
139
+ bootstrap(ctx.roar_dir)
140
+
141
+ # Check if S3 proxy is enabled
142
+ proxy_service = None
143
+ if config_get("proxy.enabled"):
144
+ from ...services.execution.proxy import ProxyService
145
+
146
+ proxy_service = ProxyService()
147
+ if not proxy_service.find_proxy():
148
+ click.echo(
149
+ "Error: S3 proxy is enabled but roar-proxy binary not found.\n"
150
+ "Build it with: cargo build --release --manifest-path rust/Cargo.toml -p roar-proxy\n"
151
+ "Or disable: roar proxy disable",
152
+ err=True,
153
+ )
154
+ return 1
134
155
 
135
156
  # Create run context
136
157
  hash_algos = cast(list[Literal["blake3", "sha256", "sha512", "md5"]], hash_algorithms)
@@ -140,19 +161,20 @@ def execute_and_report(
140
161
  repo_root=repo_root,
141
162
  command=command,
142
163
  job_type=job_type_literal,
164
+ step_name=step_name,
143
165
  quiet=quiet,
144
166
  hash_algorithms=hash_algos,
145
- git_commit=git_info.get("commit"),
146
- git_branch=git_info.get("branch"),
147
- git_repo=git_info.get("remote_url"),
167
+ tracer_mode=tracer_mode, # type: ignore[arg-type]
168
+ tracer_fallback=tracer_fallback,
148
169
  )
149
170
 
150
171
  # Execute via coordinator
151
- coordinator = RunCoordinator()
172
+ coordinator = RunCoordinator(proxy_service=proxy_service)
152
173
  result = coordinator.execute(run_ctx)
153
174
 
154
175
  # Present report
155
176
  from ...presenters.console import ConsolePresenter
177
+ from ...presenters.run_report import RunReportPresenter
156
178
 
157
179
  presenter = ConsolePresenter()
158
180
  report = RunReportPresenter(presenter)