roar-cli 0.3.4__tar.gz → 0.3.6__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 (435) hide show
  1. {roar_cli-0.3.4 → roar_cli-0.3.6}/PKG-INFO +43 -77
  2. {roar_cli-0.3.4 → roar_cli-0.3.6}/README.md +42 -76
  3. {roar_cli-0.3.4 → roar_cli-0.3.6}/pyproject.toml +1 -1
  4. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/get/transfer.py +33 -4
  5. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/git.py +13 -1
  6. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/git_remote.py +6 -1
  7. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/register_execution.py +11 -1
  8. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/register_tag_push.py +16 -0
  9. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/registration_package.py +24 -0
  10. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/results.py +10 -0
  11. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/service.py +71 -26
  12. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/dag.py +16 -0
  13. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/inputs.py +122 -19
  14. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/requests.py +2 -0
  15. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/results.py +4 -0
  16. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/status.py +53 -0
  17. roar_cli-0.3.6/roar/application/reproduce/environment.py +208 -0
  18. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/reproduce/lookup.py +65 -8
  19. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/reproduce/service.py +164 -12
  20. roar_cli-0.3.6/roar/application/reproducibility/report.py +315 -0
  21. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/run/execution.py +28 -1
  22. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/run/output_followup.py +47 -0
  23. roar_cli-0.3.6/roar/cli/commands/auth.py +329 -0
  24. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/dag.py +14 -0
  25. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/init.py +8 -10
  26. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/inputs.py +16 -0
  27. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/put.py +48 -0
  28. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/register.py +115 -18
  29. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/status.py +15 -2
  30. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/publish_intent.py +47 -7
  31. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/templates/agents/SKILL.md.tmpl +21 -1
  32. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/templates/agents/agents_section.md.tmpl +2 -1
  33. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/__init__.py +2 -0
  34. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/exceptions.py +18 -0
  35. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/reproduction.py +4 -0
  36. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/provenance/file_filter.py +13 -1
  37. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/provenance/runtime_collector.py +21 -2
  38. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/provenance/service.py +49 -0
  39. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/reproduction/environment_setup.py +113 -19
  40. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/reproduction/pipeline_executor.py +5 -0
  41. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/coordinator.py +12 -1
  42. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/inject/tracker.py +9 -1
  43. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/tracer.py +45 -21
  44. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/tracer_backends.py +11 -0
  45. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/glaas/registration/artifact.py +18 -9
  46. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/presenters/run_report.py +33 -34
  47. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/telemetry/config.py +12 -2
  48. roar_cli-0.3.6/roar/tui/screens/__init__.py +0 -0
  49. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/utils/git_url.py +19 -0
  50. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/Cargo.lock +12 -14
  51. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/crates/artifact-hash-py/Cargo.toml +1 -1
  52. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/crates/artifact-hash-py/src/lib.rs +3 -3
  53. roar_cli-0.3.4/roar/application/reproduce/environment.py +0 -91
  54. roar_cli-0.3.4/roar/cli/commands/auth.py +0 -271
  55. {roar_cli-0.3.4 → roar_cli-0.3.6}/LICENSE +0 -0
  56. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/__init__.py +0 -0
  57. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/__main__.py +0 -0
  58. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/analyzers/__init__.py +0 -0
  59. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/analyzers/base.py +0 -0
  60. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/analyzers/experiment_trackers.py +0 -0
  61. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/__init__.py +0 -0
  62. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/composite/__init__.py +0 -0
  63. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/composite/canonical.py +0 -0
  64. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/composite/detect.py +0 -0
  65. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/composite/qualifying.py +0 -0
  66. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/get/__init__.py +0 -0
  67. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/get/requests.py +0 -0
  68. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/get/results.py +0 -0
  69. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/get/service.py +0 -0
  70. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/label_rendering.py +0 -0
  71. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/labels.py +0 -0
  72. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/lookup/__init__.py +0 -0
  73. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/lookup/models.py +0 -0
  74. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/lookup/policy.py +0 -0
  75. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/lookup/refs.py +0 -0
  76. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/lookup/remote_artifacts.py +0 -0
  77. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/lookup/runner.py +0 -0
  78. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/__init__.py +0 -0
  79. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/anchor_attribution.py +0 -0
  80. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/blake3_upgrade.py +0 -0
  81. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/collection.py +0 -0
  82. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/composite_builder.py +0 -0
  83. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/composites.py +0 -0
  84. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/datasets.py +0 -0
  85. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/form_composites.py +0 -0
  86. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/job_links.py +0 -0
  87. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/job_preparation.py +0 -0
  88. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/lineage.py +0 -0
  89. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/lineage_composite_formation.py +0 -0
  90. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/lineage_composites.py +0 -0
  91. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/metadata.py +0 -0
  92. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/put_composites.py +0 -0
  93. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/put_execution.py +0 -0
  94. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/put_preparation.py +0 -0
  95. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/register_preparation.py +0 -0
  96. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/register_preview_jobs.py +0 -0
  97. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/registration.py +0 -0
  98. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/remote_job_uids.py +0 -0
  99. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/remote_registry.py +0 -0
  100. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/requests.py +0 -0
  101. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/runtime.py +0 -0
  102. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/secrets.py +0 -0
  103. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/session.py +0 -0
  104. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/source_resolution.py +0 -0
  105. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/targets.py +0 -0
  106. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/view_edges.py +0 -0
  107. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/__init__.py +0 -0
  108. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/db_status.py +0 -0
  109. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/diff.py +0 -0
  110. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/diff_engine.py +0 -0
  111. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/diff_graph.py +0 -0
  112. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/diff_refs.py +0 -0
  113. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/git_readiness.py +0 -0
  114. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/label.py +0 -0
  115. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/lineage.py +0 -0
  116. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/log.py +0 -0
  117. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/show.py +0 -0
  118. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/reproduce/__init__.py +0 -0
  119. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/reproduce/requests.py +0 -0
  120. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/reproduce/results.py +0 -0
  121. {roar_cli-0.3.4/roar/tui/screens → roar_cli-0.3.6/roar/application/reproducibility}/__init__.py +0 -0
  122. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/run/__init__.py +0 -0
  123. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/run/dag_references.py +0 -0
  124. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/run/dirty_tree_classify.py +0 -0
  125. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/run/dirty_tree_error.py +0 -0
  126. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/run/gitignore_suggest.py +0 -0
  127. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/run/requests.py +0 -0
  128. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/run/service.py +0 -0
  129. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/run/verbosity.py +0 -0
  130. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/system_labels.py +0 -0
  131. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/workflow/__init__.py +0 -0
  132. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/workflow/requests.py +0 -0
  133. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/workflow/results.py +0 -0
  134. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/workflow/service.py +0 -0
  135. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/auth_store.py +0 -0
  136. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/__init__.py +0 -0
  137. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/local/__init__.py +0 -0
  138. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/local/plugin.py +0 -0
  139. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/osmo/__init__.py +0 -0
  140. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/osmo/config.py +0 -0
  141. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/osmo/export.py +0 -0
  142. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/osmo/host_execution.py +0 -0
  143. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/osmo/lineage.py +0 -0
  144. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/osmo/plugin.py +0 -0
  145. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/osmo/runtime_bundle.py +0 -0
  146. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/osmo/submit.py +0 -0
  147. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/osmo/workflow.py +0 -0
  148. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/__init__.py +0 -0
  149. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/_agent_names.py +0 -0
  150. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/collector.py +0 -0
  151. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/config.py +0 -0
  152. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/constants.py +0 -0
  153. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/env_contract.py +0 -0
  154. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/fragment.py +0 -0
  155. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/fragment_reconstituter.py +0 -0
  156. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/node_agent.py +0 -0
  157. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/plugin.py +0 -0
  158. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/proxy_fragments.py +0 -0
  159. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/roar_worker.py +0 -0
  160. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/runtime_hooks.py +0 -0
  161. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/s3_key_paths.py +0 -0
  162. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/submit.py +0 -0
  163. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/submit_context.py +0 -0
  164. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/__init__.py +0 -0
  165. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/_format.py +0 -0
  166. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/command_registry.py +0 -0
  167. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/__init__.py +0 -0
  168. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/build.py +0 -0
  169. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/config.py +0 -0
  170. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/db.py +0 -0
  171. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/diff.py +0 -0
  172. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/env.py +0 -0
  173. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/export_registration_package.py +0 -0
  174. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/filter.py +0 -0
  175. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/get.py +0 -0
  176. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/init_agents.py +0 -0
  177. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/label.py +0 -0
  178. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/lineage.py +0 -0
  179. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/log.py +0 -0
  180. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/login.py +0 -0
  181. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/logout.py +0 -0
  182. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/osmo.py +0 -0
  183. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/pop.py +0 -0
  184. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/projects.py +0 -0
  185. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/proxy.py +0 -0
  186. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/reproduce.py +0 -0
  187. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/reset.py +0 -0
  188. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/run.py +0 -0
  189. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/scope.py +0 -0
  190. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/show.py +0 -0
  191. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/telemetry.py +0 -0
  192. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/tracer.py +0 -0
  193. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/tui.py +0 -0
  194. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/whoami.py +0 -0
  195. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/workflow.py +0 -0
  196. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/context.py +0 -0
  197. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/decorators.py +0 -0
  198. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/bootstrap.py +0 -0
  199. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/canonical_session.py +0 -0
  200. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/digests.py +0 -0
  201. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/dto/__init__.py +0 -0
  202. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/dto/registration.py +0 -0
  203. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/__init__.py +0 -0
  204. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/config.py +0 -0
  205. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/lineage.py +0 -0
  206. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/logger.py +0 -0
  207. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/presenter.py +0 -0
  208. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/provenance.py +0 -0
  209. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/registration.py +0 -0
  210. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/repositories.py +0 -0
  211. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/run.py +0 -0
  212. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/services.py +0 -0
  213. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/telemetry.py +0 -0
  214. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/vcs.py +0 -0
  215. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/label_constants.py +0 -0
  216. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/label_origins.py +0 -0
  217. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/logging.py +0 -0
  218. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/__init__.py +0 -0
  219. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/artifact.py +0 -0
  220. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/base.py +0 -0
  221. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/dag.py +0 -0
  222. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/dataset_identifier.py +0 -0
  223. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/glaas.py +0 -0
  224. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/job.py +0 -0
  225. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/lineage.py +0 -0
  226. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/provenance.py +0 -0
  227. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/run.py +0 -0
  228. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/session.py +0 -0
  229. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/telemetry.py +0 -0
  230. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/vcs.py +0 -0
  231. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/operation_metadata.py +0 -0
  232. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/session_hash.py +0 -0
  233. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/step_name.py +0 -0
  234. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/tracer_modes.py +0 -0
  235. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/validation.py +0 -0
  236. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/__init__.py +0 -0
  237. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/context.py +0 -0
  238. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/engine.py +0 -0
  239. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/hashing/__init__.py +0 -0
  240. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/hashing/backend.py +0 -0
  241. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/hashing/blake3.py +0 -0
  242. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/models.py +0 -0
  243. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/query_context.py +0 -0
  244. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/repositories/__init__.py +0 -0
  245. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/repositories/artifact.py +0 -0
  246. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/repositories/collection.py +0 -0
  247. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/repositories/composite.py +0 -0
  248. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/repositories/hash_cache.py +0 -0
  249. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/repositories/job.py +0 -0
  250. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/repositories/label.py +0 -0
  251. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/repositories/session.py +0 -0
  252. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/schema.py +0 -0
  253. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/services/__init__.py +0 -0
  254. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/services/hashing.py +0 -0
  255. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/services/job_recording.py +0 -0
  256. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/services/lineage.py +0 -0
  257. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/services/session.py +0 -0
  258. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/step_priority.py +0 -0
  259. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/__init__.py +0 -0
  260. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/cluster/__init__.py +0 -0
  261. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/cluster/bridge.py +0 -0
  262. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/cluster/proxy.py +0 -0
  263. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/cluster/proxy_config.py +0 -0
  264. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/fragments/__init__.py +0 -0
  265. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/fragments/lineage.py +0 -0
  266. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/fragments/models.py +0 -0
  267. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/fragments/reconstitution.py +0 -0
  268. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/fragments/sessions.py +0 -0
  269. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/fragments/transport.py +0 -0
  270. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/framework/__init__.py +0 -0
  271. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/framework/contract.py +0 -0
  272. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/framework/planning.py +0 -0
  273. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/framework/registry.py +0 -0
  274. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/framework/runtime_imports.py +0 -0
  275. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/provenance/__init__.py +0 -0
  276. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/provenance/assembler.py +0 -0
  277. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/provenance/build_pip_collector.py +0 -0
  278. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/provenance/build_tool_collector.py +0 -0
  279. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/provenance/data_loader.py +0 -0
  280. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/provenance/package_collector.py +0 -0
  281. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/provenance/process_summarizer.py +0 -0
  282. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/recording/__init__.py +0 -0
  283. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/recording/dataset_identifier.py +0 -0
  284. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/recording/dataset_metadata.py +0 -0
  285. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/recording/dataset_profile.py +0 -0
  286. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/recording/job_recording.py +0 -0
  287. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/reproduction/__init__.py +0 -0
  288. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/reproduction/installers.py +0 -0
  289. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/reproduction/pipeline_metadata.py +0 -0
  290. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/__init__.py +0 -0
  291. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/abi_probe.py +0 -0
  292. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/backup.py +0 -0
  293. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/driver_entrypoint.py +0 -0
  294. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/errors.py +0 -0
  295. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/host_execution.py +0 -0
  296. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/inject/__init__.py +0 -0
  297. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/inject/sitecustomize.py +0 -0
  298. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/inject/support.py +0 -0
  299. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/lazy_install.py +0 -0
  300. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/proxy_resource.py +0 -0
  301. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/resources.py +0 -0
  302. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/signal_handler.py +0 -0
  303. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/tracer_banner.py +0 -0
  304. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/worker_bootstrap.py +0 -0
  305. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/filters/__init__.py +0 -0
  306. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/filters/files.py +0 -0
  307. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/filters/omit.py +0 -0
  308. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/glaas_auth.py +0 -0
  309. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/glaas_client.py +0 -0
  310. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/__init__.py +0 -0
  311. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/bootstrap.py +0 -0
  312. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/config/__init__.py +0 -0
  313. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/config/access.py +0 -0
  314. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/config/loader.py +0 -0
  315. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/config/raw.py +0 -0
  316. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/config/schema.py +0 -0
  317. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/discovery.py +0 -0
  318. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/download/__init__.py +0 -0
  319. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/download/base.py +0 -0
  320. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/download/gcs.py +0 -0
  321. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/download/get.py +0 -0
  322. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/download/hf.py +0 -0
  323. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/download/http.py +0 -0
  324. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/download/noop.py +0 -0
  325. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/download/s3.py +0 -0
  326. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/git/__init__.py +0 -0
  327. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/git/base.py +0 -0
  328. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/git/context.py +0 -0
  329. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/git/provider.py +0 -0
  330. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/glaas/__init__.py +0 -0
  331. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/glaas/auth.py +0 -0
  332. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/glaas/client.py +0 -0
  333. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/glaas/fragment_streamer.py +0 -0
  334. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/glaas/registration/__init__.py +0 -0
  335. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/glaas/registration/_artifact_ref.py +0 -0
  336. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/glaas/registration/coordinator.py +0 -0
  337. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/glaas/registration/job.py +0 -0
  338. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/glaas/registration/session.py +0 -0
  339. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/glaas/transport.py +0 -0
  340. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/registry.py +0 -0
  341. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/resolution.py +0 -0
  342. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/storage/__init__.py +0 -0
  343. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/storage/base.py +0 -0
  344. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/storage/gcs.py +0 -0
  345. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/storage/memory.py +0 -0
  346. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/storage/noop.py +0 -0
  347. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/storage/publish.py +0 -0
  348. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/storage/s3.py +0 -0
  349. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/telemetry/__init__.py +0 -0
  350. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/telemetry/base.py +0 -0
  351. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/telemetry/wandb.py +0 -0
  352. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/presenters/__init__.py +0 -0
  353. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/presenters/console.py +0 -0
  354. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/presenters/dag_data_builder.py +0 -0
  355. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/presenters/dag_renderer.py +0 -0
  356. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/presenters/diff_renderer.py +0 -0
  357. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/presenters/formatting.py +0 -0
  358. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/presenters/null.py +0 -0
  359. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/presenters/show_renderer.py +0 -0
  360. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/presenters/spinner.py +0 -0
  361. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/presenters/terminal.py +0 -0
  362. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/publish_auth.py +0 -0
  363. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/require.py +0 -0
  364. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/scope_config.py +0 -0
  365. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/telemetry/__init__.py +0 -0
  366. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/telemetry/_io.py +0 -0
  367. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/telemetry/capabilities.py +0 -0
  368. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/telemetry/hooks.py +0 -0
  369. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/telemetry/install.py +0 -0
  370. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/telemetry/paths.py +0 -0
  371. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/telemetry/payload.py +0 -0
  372. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/telemetry/queue.py +0 -0
  373. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/telemetry/stats.py +0 -0
  374. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/telemetry/uploader.py +0 -0
  375. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/__init__.py +0 -0
  376. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/app.py +0 -0
  377. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/data.py +0 -0
  378. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/screens/config_editor.py +0 -0
  379. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/screens/label_editor.py +0 -0
  380. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/screens/launcher.py +0 -0
  381. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/screens/log.py +0 -0
  382. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/screens/main.py +0 -0
  383. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/screens/search.py +0 -0
  384. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/screens/session_picker.py +0 -0
  385. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/tmux.py +0 -0
  386. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/widgets/__init__.py +0 -0
  387. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/widgets/detail.py +0 -0
  388. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/utils/__init__.py +0 -0
  389. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/utils/cloud.py +0 -0
  390. {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/version_check.py +0 -0
  391. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/Cargo.toml +0 -0
  392. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/crates/artifact-hash-core/Cargo.toml +0 -0
  393. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/crates/artifact-hash-core/src/lib.rs +0 -0
  394. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/crates/tracer-fd/Cargo.toml +0 -0
  395. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/crates/tracer-fd/src/lib.rs +0 -0
  396. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/crates/tracer-runtime/Cargo.toml +0 -0
  397. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/crates/tracer-runtime/src/lib.rs +0 -0
  398. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/crates/tracer-schema/Cargo.toml +0 -0
  399. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/crates/tracer-schema/src/lib.rs +0 -0
  400. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/services/proxy/Cargo.lock +0 -0
  401. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/services/proxy/Cargo.toml +0 -0
  402. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/services/proxy/src/forward.rs +0 -0
  403. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/services/proxy/src/main.rs +0 -0
  404. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/services/proxy/src/s3.rs +0 -0
  405. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/common/Cargo.toml +0 -0
  406. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/common/src/lib.rs +0 -0
  407. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/probe/Cargo.toml +0 -0
  408. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/probe/rust-toolchain.toml +0 -0
  409. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/probe/src/main.rs +0 -0
  410. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/userspace/Cargo.toml +0 -0
  411. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/userspace/build.rs +0 -0
  412. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/userspace/src/attach.rs +0 -0
  413. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/userspace/src/bin/roard.rs +0 -0
  414. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/userspace/src/client.rs +0 -0
  415. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/userspace/src/daemon.rs +0 -0
  416. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/userspace/src/events.rs +0 -0
  417. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/userspace/src/ipc.rs +0 -0
  418. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/userspace/src/lib.rs +0 -0
  419. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/userspace/src/main.rs +0 -0
  420. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/userspace/src/state.rs +0 -0
  421. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/preload/Cargo.toml +0 -0
  422. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/preload/build.rs +0 -0
  423. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/preload/src/bin/io_fixture.rs +0 -0
  424. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/preload/src/interpose.c +0 -0
  425. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/preload/src/ipc.rs +0 -0
  426. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/preload/src/lib.rs +0 -0
  427. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/preload/src/main.rs +0 -0
  428. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/preload/tests/comprehensive.rs +0 -0
  429. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/preload/tests/standalone.rs +0 -0
  430. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ptrace/Cargo.toml +0 -0
  431. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ptrace/rustfmt.toml +0 -0
  432. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ptrace/src/arch.rs +0 -0
  433. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ptrace/src/main.rs +0 -0
  434. {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ptrace/src/seccomp.rs +0 -0
  435. {roar_cli-0.3.4 → roar_cli-0.3.6}/scripts/sync_packaged_rust_artifacts.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: roar-cli
3
- Version: 0.3.4
3
+ Version: 0.3.6
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Intended Audience :: Science/Research
@@ -51,6 +51,14 @@ Project-URL: Repository, https://github.com/treqs/roar
51
51
 
52
52
  **Run Observation & Artifact Registration**
53
53
 
54
+ ## Quickstart
55
+
56
+ ```bash
57
+ uv tool install roar-cli # installs the `roar` command (Python 3.10+)
58
+ roar init # set up roar in your project
59
+ roar run <command> # track a run — then `roar dag` to see it
60
+ ```
61
+
54
62
  `roar` tracks data artifacts and execution steps in ML pipelines, enabling reproducibility and lineage queries. `roar` tracking happens automagically by observing your commands as they run, capturing essential context without requiring you to define a pipeline explicitly.
55
63
 
56
64
  By identifying files based on their actual content rather than their names, it ensures you can always trace a result back to the exact inputs and code that produced it. This gives you reliable reproducibility and a clear history of your artifacts, all derived naturally from your workflow.
@@ -60,12 +68,16 @@ While `roar` captures your work locally, connecting it to a GLaaS (Global Lineag
60
68
  ## Installation
61
69
 
62
70
  ```bash
63
- pip install roar-cli
64
- # or with uv
71
+ # Recommended: install the `roar` command in an isolated tool environment
72
+ uv tool install roar-cli
73
+ # or: pipx install roar-cli
74
+
75
+ # Into an existing environment (e.g. to use roar alongside Ray in the same venv)
65
76
  uv pip install roar-cli
77
+ # or: pip install roar-cli
66
78
  ```
67
79
 
68
- Requires Python 3.10+.
80
+ Requires Python 3.10+. (A single stable-ABI wheel covers every Python 3.10+.)
69
81
 
70
82
  > For the full prereqs, platform support matrix, tracer-backend setup,
71
83
  > macOS SIP notes, and sdist build steps, see the canonical
@@ -83,44 +95,17 @@ Requires Python 3.10+.
83
95
 
84
96
  PyPI wheels are published for Linux (`x86_64`, `aarch64`) and macOS (`x86_64`, `arm64`).
85
97
 
86
- If a matching wheel isn't available, `pip install` falls through to the
87
- source distribution. The sdist ships the Rust tracer source but no
88
- pre-built binaries, so it requires a C toolchain (`gcc` / `clang`), Rust
89
- (`rustup`), and a few minutes to compile the tracers on first install.
98
+ On platforms without a published wheel (e.g. musl/Alpine, Windows, or glibc
99
+ older than the manylinux baseline), `pip install` falls through to the
100
+ source distribution, which ships the Rust tracer source but no pre-built
101
+ binaries so it needs a C toolchain (`gcc` / `clang`), Rust (`rustup`),
102
+ and a few minutes to compile the tracers on first install.
90
103
 
91
104
  ### Development Installation
92
105
 
93
- ```bash
94
- # Clone the repository
95
- git clone https://github.com/treqs/roar.git
96
- cd roar
97
-
98
- # One-shot dev install: Python package + Rust tracer binaries
99
- bash scripts/install-dev.sh
100
- ```
101
-
102
- `scripts/install-dev.sh` runs `pip install -e ".[dev]"` (preferring `uv`
103
- when available) and then builds the Rust tracer binaries
104
- (`roar-tracer`, `roar-tracer-preload`, `roar-tracer-ebpf`, `roard`,
105
- `roar-proxy`) and stages them into `roar/bin/`. A bare
106
- `pip install -e .` does _not_ build the tracer binaries because they
107
- live in separate cargo crates outside the maturin manifest, so
108
- `roar run` would fail with "No tracer binary found" until the script
109
- runs. See [Building from source](#building-from-source) below for
110
- details and the manual flow.
111
-
112
- ## Quick Start
113
-
114
- ```bash
115
- # Initialize roar in your project
116
- cd my-ml-project
117
- roar init
118
-
119
- # Run commands with provenance tracking
120
- roar run python preprocess.py --input data.csv --output features.parquet
121
- roar run python train.py --data features.parquet --output model.pt
122
- roar run python evaluate.py --model model.pt --output metrics.json
123
- ```
106
+ Installing from source (editable Python package + Rust tracer binaries) is
107
+ covered under [Development → Building from source](#building-from-source).
108
+ The fast path is `bash scripts/install-dev.sh`.
124
109
 
125
110
  ## Product Telemetry
126
111
 
@@ -162,8 +147,8 @@ roar config set telemetry.enabled false
162
147
  Environment opt-outs always win over saved config:
163
148
 
164
149
  ```bash
165
- DO_NOT_TRACK=1 roar run python train.py
166
- ROAR_NO_TELEMETRY=1 roar run python train.py
150
+ DO_NOT_TRACK=1 roar run python3 train.py
151
+ ROAR_NO_TELEMETRY=1 roar run python3 train.py
167
152
  ```
168
153
 
169
154
  Telemetry is also suppressed automatically in CI, pytest, and Roar-managed
@@ -258,7 +243,7 @@ Run a command with provenance tracking. Roar captures:
258
243
  - Command arguments
259
244
 
260
245
  ```bash
261
- roar run python train.py --epochs 10 --lr 0.001
246
+ roar run python3 train.py --epochs 10 --lr 0.001
262
247
  roar run ./scripts/preprocess.sh
263
248
  roar run torchrun --nproc_per_node=4 train.py
264
249
 
@@ -611,9 +596,9 @@ Named groups of artifacts, used for downloaded datasets or upload bundles.
611
596
 
612
597
  ```bash
613
598
  # Record your pipeline
614
- roar run python preprocess.py
615
- roar run python train.py --epochs 10
616
- roar run python evaluate.py
599
+ roar run python3 preprocess.py
600
+ roar run python3 train.py --epochs 10
601
+ roar run python3 evaluate.py
617
602
 
618
603
  # Later, reproduce an artifact
619
604
  roar reproduce <model-hash> --run
@@ -639,40 +624,21 @@ Add `.roar/` to your `.gitignore` (roar offers to do this during `roar init`).
639
624
 
640
625
  ## GLaaS Server
641
626
 
642
- Roar can register sessions, jobs, steps, and artifacts with a GLaaS (Global Lineage-as-a-Service) server using the `roar register` command.
643
-
644
- ### Server Setup
645
-
646
- ```bash
647
- # Install with server dependencies
648
- uv pip install -e ".[server]"
649
- # or without uv
650
- pip install -e ".[server]"
651
-
652
- # Run the server
653
- glaas-server
654
-
655
- # Or with custom host/port
656
- GLAAS_HOST=0.0.0.0 GLAAS_PORT=8080 glaas-server
657
- ```
658
-
659
- The server provides:
660
-
661
- - REST API for artifact and job registration
662
- - Web UI at `/` with artifact and job browsers
663
- - Search and filtering by command, GPU, file type, etc.
664
-
665
- ### Client Configuration
627
+ GLaaS (Global Lineage-as-a-Service) is the shared registry roar publishes to
628
+ with `roar register` and `roar put`. It's hosted at
629
+ [glaas.ai](https://glaas.ai) (default API endpoint `https://api.glaas.ai`),
630
+ so there's nothing to run yourself — sign in and publish.
666
631
 
667
632
  ```bash
668
- # Set the GLaaS server URL
669
- roar config set glaas.url http://localhost:8000
633
+ # Sign in (browser/device flow) for attributed, private, or project publishing
634
+ roar login
670
635
 
671
- # Show your SSH key (copy to GLaaS web UI)
672
- roar auth register
636
+ # Or register an SSH key for programmatic auth
637
+ roar auth register # show your public key to paste at glaas.ai
638
+ roar auth test # verify the connection
673
639
 
674
- # Test authentication
675
- roar auth test
640
+ # Point roar at a different GLaaS deployment if needed
641
+ roar config set glaas.url https://api.glaas.ai
676
642
  ```
677
643
 
678
644
  > [!TIP]
@@ -751,13 +717,13 @@ Verify the install with `roar tracer`; every backend listed should be
751
717
  ruff check .
752
718
 
753
719
  # Format check
754
- ruff format --check
720
+ ruff format --check .
755
721
 
756
722
  # Type checking
757
723
  mypy roar
758
724
 
759
725
  # Run all checks at once
760
- ruff check . && ruff format --check && mypy roar
726
+ ruff check . && ruff format --check . && mypy roar
761
727
  ```
762
728
 
763
729
  ### Running Tests
@@ -2,6 +2,14 @@
2
2
 
3
3
  **Run Observation & Artifact Registration**
4
4
 
5
+ ## Quickstart
6
+
7
+ ```bash
8
+ uv tool install roar-cli # installs the `roar` command (Python 3.10+)
9
+ roar init # set up roar in your project
10
+ roar run <command> # track a run — then `roar dag` to see it
11
+ ```
12
+
5
13
  `roar` tracks data artifacts and execution steps in ML pipelines, enabling reproducibility and lineage queries. `roar` tracking happens automagically by observing your commands as they run, capturing essential context without requiring you to define a pipeline explicitly.
6
14
 
7
15
  By identifying files based on their actual content rather than their names, it ensures you can always trace a result back to the exact inputs and code that produced it. This gives you reliable reproducibility and a clear history of your artifacts, all derived naturally from your workflow.
@@ -11,12 +19,16 @@ While `roar` captures your work locally, connecting it to a GLaaS (Global Lineag
11
19
  ## Installation
12
20
 
13
21
  ```bash
14
- pip install roar-cli
15
- # or with uv
22
+ # Recommended: install the `roar` command in an isolated tool environment
23
+ uv tool install roar-cli
24
+ # or: pipx install roar-cli
25
+
26
+ # Into an existing environment (e.g. to use roar alongside Ray in the same venv)
16
27
  uv pip install roar-cli
28
+ # or: pip install roar-cli
17
29
  ```
18
30
 
19
- Requires Python 3.10+.
31
+ Requires Python 3.10+. (A single stable-ABI wheel covers every Python 3.10+.)
20
32
 
21
33
  > For the full prereqs, platform support matrix, tracer-backend setup,
22
34
  > macOS SIP notes, and sdist build steps, see the canonical
@@ -34,44 +46,17 @@ Requires Python 3.10+.
34
46
 
35
47
  PyPI wheels are published for Linux (`x86_64`, `aarch64`) and macOS (`x86_64`, `arm64`).
36
48
 
37
- If a matching wheel isn't available, `pip install` falls through to the
38
- source distribution. The sdist ships the Rust tracer source but no
39
- pre-built binaries, so it requires a C toolchain (`gcc` / `clang`), Rust
40
- (`rustup`), and a few minutes to compile the tracers on first install.
49
+ On platforms without a published wheel (e.g. musl/Alpine, Windows, or glibc
50
+ older than the manylinux baseline), `pip install` falls through to the
51
+ source distribution, which ships the Rust tracer source but no pre-built
52
+ binaries so it needs a C toolchain (`gcc` / `clang`), Rust (`rustup`),
53
+ and a few minutes to compile the tracers on first install.
41
54
 
42
55
  ### Development Installation
43
56
 
44
- ```bash
45
- # Clone the repository
46
- git clone https://github.com/treqs/roar.git
47
- cd roar
48
-
49
- # One-shot dev install: Python package + Rust tracer binaries
50
- bash scripts/install-dev.sh
51
- ```
52
-
53
- `scripts/install-dev.sh` runs `pip install -e ".[dev]"` (preferring `uv`
54
- when available) and then builds the Rust tracer binaries
55
- (`roar-tracer`, `roar-tracer-preload`, `roar-tracer-ebpf`, `roard`,
56
- `roar-proxy`) and stages them into `roar/bin/`. A bare
57
- `pip install -e .` does _not_ build the tracer binaries because they
58
- live in separate cargo crates outside the maturin manifest, so
59
- `roar run` would fail with "No tracer binary found" until the script
60
- runs. See [Building from source](#building-from-source) below for
61
- details and the manual flow.
62
-
63
- ## Quick Start
64
-
65
- ```bash
66
- # Initialize roar in your project
67
- cd my-ml-project
68
- roar init
69
-
70
- # Run commands with provenance tracking
71
- roar run python preprocess.py --input data.csv --output features.parquet
72
- roar run python train.py --data features.parquet --output model.pt
73
- roar run python evaluate.py --model model.pt --output metrics.json
74
- ```
57
+ Installing from source (editable Python package + Rust tracer binaries) is
58
+ covered under [Development → Building from source](#building-from-source).
59
+ The fast path is `bash scripts/install-dev.sh`.
75
60
 
76
61
  ## Product Telemetry
77
62
 
@@ -113,8 +98,8 @@ roar config set telemetry.enabled false
113
98
  Environment opt-outs always win over saved config:
114
99
 
115
100
  ```bash
116
- DO_NOT_TRACK=1 roar run python train.py
117
- ROAR_NO_TELEMETRY=1 roar run python train.py
101
+ DO_NOT_TRACK=1 roar run python3 train.py
102
+ ROAR_NO_TELEMETRY=1 roar run python3 train.py
118
103
  ```
119
104
 
120
105
  Telemetry is also suppressed automatically in CI, pytest, and Roar-managed
@@ -209,7 +194,7 @@ Run a command with provenance tracking. Roar captures:
209
194
  - Command arguments
210
195
 
211
196
  ```bash
212
- roar run python train.py --epochs 10 --lr 0.001
197
+ roar run python3 train.py --epochs 10 --lr 0.001
213
198
  roar run ./scripts/preprocess.sh
214
199
  roar run torchrun --nproc_per_node=4 train.py
215
200
 
@@ -562,9 +547,9 @@ Named groups of artifacts, used for downloaded datasets or upload bundles.
562
547
 
563
548
  ```bash
564
549
  # Record your pipeline
565
- roar run python preprocess.py
566
- roar run python train.py --epochs 10
567
- roar run python evaluate.py
550
+ roar run python3 preprocess.py
551
+ roar run python3 train.py --epochs 10
552
+ roar run python3 evaluate.py
568
553
 
569
554
  # Later, reproduce an artifact
570
555
  roar reproduce <model-hash> --run
@@ -590,40 +575,21 @@ Add `.roar/` to your `.gitignore` (roar offers to do this during `roar init`).
590
575
 
591
576
  ## GLaaS Server
592
577
 
593
- Roar can register sessions, jobs, steps, and artifacts with a GLaaS (Global Lineage-as-a-Service) server using the `roar register` command.
594
-
595
- ### Server Setup
596
-
597
- ```bash
598
- # Install with server dependencies
599
- uv pip install -e ".[server]"
600
- # or without uv
601
- pip install -e ".[server]"
602
-
603
- # Run the server
604
- glaas-server
605
-
606
- # Or with custom host/port
607
- GLAAS_HOST=0.0.0.0 GLAAS_PORT=8080 glaas-server
608
- ```
609
-
610
- The server provides:
611
-
612
- - REST API for artifact and job registration
613
- - Web UI at `/` with artifact and job browsers
614
- - Search and filtering by command, GPU, file type, etc.
615
-
616
- ### Client Configuration
578
+ GLaaS (Global Lineage-as-a-Service) is the shared registry roar publishes to
579
+ with `roar register` and `roar put`. It's hosted at
580
+ [glaas.ai](https://glaas.ai) (default API endpoint `https://api.glaas.ai`),
581
+ so there's nothing to run yourself — sign in and publish.
617
582
 
618
583
  ```bash
619
- # Set the GLaaS server URL
620
- roar config set glaas.url http://localhost:8000
584
+ # Sign in (browser/device flow) for attributed, private, or project publishing
585
+ roar login
621
586
 
622
- # Show your SSH key (copy to GLaaS web UI)
623
- roar auth register
587
+ # Or register an SSH key for programmatic auth
588
+ roar auth register # show your public key to paste at glaas.ai
589
+ roar auth test # verify the connection
624
590
 
625
- # Test authentication
626
- roar auth test
591
+ # Point roar at a different GLaaS deployment if needed
592
+ roar config set glaas.url https://api.glaas.ai
627
593
  ```
628
594
 
629
595
  > [!TIP]
@@ -702,13 +668,13 @@ Verify the install with `roar tracer`; every backend listed should be
702
668
  ruff check .
703
669
 
704
670
  # Format check
705
- ruff format --check
671
+ ruff format --check .
706
672
 
707
673
  # Type checking
708
674
  mypy roar
709
675
 
710
676
  # Run all checks at once
711
- ruff check . && ruff format --check && mypy roar
677
+ ruff check . && ruff format --check . && mypy roar
712
678
  ```
713
679
 
714
680
  ### Running Tests
@@ -5,7 +5,7 @@ build-backend = "maturin"
5
5
 
6
6
  [project]
7
7
  name = "roar-cli"
8
- version = "0.3.4"
8
+ version = "0.3.6"
9
9
  description = "Reproducibility and provenance tracker for ML training pipelines"
10
10
  authors = [
11
11
  { name="TReqs Team", email="info@treqs.ai" }
@@ -11,6 +11,8 @@ or roar register.
11
11
 
12
12
  from __future__ import annotations
13
13
 
14
+ import threading
15
+ from concurrent.futures import ThreadPoolExecutor, as_completed
14
16
  from dataclasses import dataclass, field
15
17
  from pathlib import Path
16
18
 
@@ -20,6 +22,8 @@ from ...integrations.download.base import DownloadBackend, Source
20
22
  from ...presenters.spinner import Spinner
21
23
  from .results import GetDownloadedFile, GetDryRunItem
22
24
 
25
+ _DEFAULT_DOWNLOAD_WORKERS = 8
26
+
23
27
 
24
28
  def _download_progress_message(done: int, total: int, downloaded_bytes: int) -> str:
25
29
  """Status line for the download spinner, e.g. ``Downloading 47/100 · 4.31 GB``."""
@@ -288,11 +292,36 @@ class GetService:
288
292
  # Downloads are the long pole of a get (multi-GB datasets); show a live
289
293
  # N/M + cumulative-bytes counter so the terminal isn't dead for minutes.
290
294
  downloaded_bytes = 0
295
+ workers = min(_DEFAULT_DOWNLOAD_WORKERS, total)
291
296
  with Spinner(_download_progress_message(0, total, 0)) as spin:
292
- for index, pending in enumerate(pending_downloads, start=1):
293
- self._download_to_tmp(pending)
294
- downloaded_bytes += pending.tmp_path.stat().st_size
295
- spin.update(_download_progress_message(index, total, downloaded_bytes))
297
+ if workers <= 1:
298
+ for index, pending in enumerate(pending_downloads, start=1):
299
+ self._download_to_tmp(pending)
300
+ downloaded_bytes += pending.tmp_path.stat().st_size
301
+ spin.update(_download_progress_message(index, total, downloaded_bytes))
302
+ else:
303
+ lock = threading.Lock()
304
+ done = 0
305
+ errors: list[BaseException] = []
306
+ with ThreadPoolExecutor(max_workers=workers) as executor:
307
+ futures = {
308
+ executor.submit(self._download_to_tmp, pending): pending
309
+ for pending in pending_downloads
310
+ }
311
+ for future in as_completed(futures):
312
+ exc = future.exception()
313
+ if exc is not None:
314
+ errors.append(exc)
315
+ else:
316
+ pending = futures[future]
317
+ with lock:
318
+ done += 1
319
+ downloaded_bytes += pending.tmp_path.stat().st_size
320
+ spin.update(
321
+ _download_progress_message(done, total, downloaded_bytes)
322
+ )
323
+ if errors:
324
+ raise errors[0]
296
325
 
297
326
  with Spinner(f"Hashing {total} file(s)..."):
298
327
  hashes_by_tmp_path = self._hash_files_batch(
@@ -3,12 +3,13 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import subprocess
6
- from dataclasses import dataclass
6
+ from dataclasses import dataclass, replace
7
7
  from pathlib import Path
8
8
 
9
9
  from ..core.interfaces.logger import ILogger
10
10
  from ..core.interfaces.registration import GitContext
11
11
  from ..integrations.git import GitVCSProvider, resolve_git_context
12
+ from ..utils.git_url import is_shareable_remote
12
13
 
13
14
 
14
15
  @dataclass(frozen=True)
@@ -68,6 +69,17 @@ def resolve_roar_git_context(
68
69
  """
69
70
  logger.debug("Resolving git context from %s", path)
70
71
  ctx = resolve_git_context(path, git_commit, configured_remote=configured_remote)
72
+ # A repo with no real remote records its own ``file://`` path as the URL.
73
+ # That resolves only on this machine, so publishing it both leaks the
74
+ # user's local filesystem layout to GLaaS and is useless to anyone else.
75
+ # This resolver is publish-only (register/put/package prep), so drop the
76
+ # non-shareable URL here — the publish record then honestly shows "no
77
+ # remote", matching the reproducibility checklist. (Local recording uses
78
+ # ``resolve_git_context`` directly and keeps the ``file://`` URI, which
79
+ # in-place reproduce relies on.)
80
+ if ctx.repo and not is_shareable_remote(ctx.repo):
81
+ logger.debug("Dropping non-shareable git repo URL from publish context: %s", ctx.repo)
82
+ ctx = replace(ctx, repo=None)
71
83
  logger.debug(
72
84
  "Git context resolved: repo=%s, commit=%s, branch=%s",
73
85
  ctx.repo,
@@ -60,7 +60,8 @@ def _git_check_output(repo_root: Path | str, *args: str, capture_stderr: bool) -
60
60
  )
61
61
 
62
62
 
63
- def _list_remote_names(repo_root: Path | str) -> list[str]:
63
+ def list_remote_names(repo_root: Path | str) -> list[str]:
64
+ """Return the names of git remotes configured in this repo (empty if none)."""
64
65
  try:
65
66
  raw = _git_check_output(repo_root, "remote", capture_stderr=False)
66
67
  except subprocess.CalledProcessError:
@@ -68,6 +69,10 @@ def _list_remote_names(repo_root: Path | str) -> list[str]:
68
69
  return [line.strip() for line in raw.splitlines() if line.strip()]
69
70
 
70
71
 
72
+ # Back-compat alias for internal callers.
73
+ _list_remote_names = list_remote_names
74
+
75
+
71
76
  def resolve_canonical_remote(repo_root: Path | str, configured_remote: str | None) -> str:
72
77
  """Return the name of the remote roar should push tags to.
73
78
 
@@ -469,8 +469,18 @@ class RegisterService:
469
469
 
470
470
  composite_registered = sum(1 for item in composite_registrations if item.get("registered"))
471
471
  composite_failed = sum(1 for item in composite_registrations if not item.get("registered"))
472
- total_artifacts_registered = batch_result.artifacts_registered + composite_registered
473
472
  total_artifacts_failed = batch_result.artifacts_failed + composite_failed
473
+ # Report DISTINCT artifacts, matching `register --dry-run`'s
474
+ # len(lineage.artifacts). The coordinator's running tally double-counts
475
+ # (artifacts are tallied in both the staging and the link phase, and the
476
+ # server's success count is per content-hash) — when everything
477
+ # registered, the distinct figure is simply the lineage's artifact count.
478
+ # The success gate below keys off *_failed, not this display number, so
479
+ # this is safe. On partial failure, fall back to the coordinator's tally.
480
+ if total_artifacts_failed == 0:
481
+ total_artifacts_registered = len(lineage.artifacts)
482
+ else:
483
+ total_artifacts_registered = batch_result.artifacts_registered + composite_registered
474
484
 
475
485
  success = (
476
486
  batch_result.jobs_failed == 0 and total_artifacts_failed == 0 and not finalize_failed
@@ -33,6 +33,7 @@ from ...core.interfaces.logger import ILogger
33
33
  from ..git import build_roar_git_tag_name, create_roar_git_tag
34
34
  from .git_remote import (
35
35
  GitRemoteError,
36
+ list_remote_names,
36
37
  push_roar_tags,
37
38
  resolve_canonical_remote,
38
39
  warn_if_ssh_passphrase_prompt_likely,
@@ -145,6 +146,21 @@ def ensure_roar_tags_pushed(
145
146
  push_skipped_reason="never_config",
146
147
  )
147
148
 
149
+ # No remote at all (and none configured): degrade to a local-only register
150
+ # instead of blocking. The common "does this work" loop shouldn't be gated on
151
+ # having a remote — and the dry-run never blocks, so the real run shouldn't
152
+ # contradict it. Tags exist locally; the reproducibility checklist surfaces
153
+ # that the commit isn't reachable on a remote. (An *invalid* configured
154
+ # remote or ambiguous multi-remote setup still errors below — those mean the
155
+ # user wants a push but roar can't safely pick where.)
156
+ if not configured_remote and not list_remote_names(repo_root):
157
+ logger.debug("No git remote configured — registering local-only (tags not pushed).")
158
+ return RegisterTagSummary(
159
+ session_tag=session_tag_name,
160
+ job_tags=job_tags,
161
+ push_skipped_reason="no_remote",
162
+ )
163
+
148
164
  try:
149
165
  remote = resolve_canonical_remote(repo_root, configured_remote)
150
166
  except GitRemoteError as exc:
@@ -134,6 +134,9 @@ def build_registration_package(
134
134
  git_context=git_context,
135
135
  cwd=cwd,
136
136
  )
137
+ redacted_lineage, redacted_git_context = _drop_local_remotes(
138
+ redacted_lineage, redacted_git_context
139
+ )
137
140
 
138
141
  registration_jobs = order_jobs_for_registration(
139
142
  normalize_jobs_for_registration(redacted_lineage.jobs)
@@ -263,6 +266,27 @@ def _apply_redaction(
263
266
  )
264
267
 
265
268
 
269
+ def _drop_local_remotes(
270
+ lineage: LineageData, git_context: GitContext
271
+ ) -> tuple[LineageData, GitContext]:
272
+ """Don't publish non-shareable (``file://`` / local-path) git repos to GLaaS.
273
+
274
+ A repo with no real remote records its own ``file://`` path as ``git_repo``;
275
+ publishing that leaks the local filesystem path and is useless to anyone else.
276
+ Replace such repos with "" so the GLaaS record honestly shows no remote — the
277
+ reproducibility checklist already flags this as "commit reachable on a remote".
278
+ """
279
+ from ...utils.git_url import is_shareable_remote
280
+
281
+ if git_context.repo and not is_shareable_remote(git_context.repo):
282
+ git_context = GitContext(repo="", commit=git_context.commit, branch=git_context.branch)
283
+ for job in lineage.jobs:
284
+ repo = job.get("git_repo")
285
+ if isinstance(repo, str) and repo and not is_shareable_remote(repo):
286
+ job["git_repo"] = ""
287
+ return lineage, git_context
288
+
289
+
266
290
  def _filter_git_context(
267
291
  git_context: GitContext,
268
292
  omit_filter: OmitFilter | None,
@@ -49,6 +49,11 @@ class RegisterLineageResponse:
49
49
  # the CLI surfaces a notice so the user knows it can't be reproduced from
50
50
  # source. Defaults True so existing/normal registrations are unaffected.
51
51
  reproducible: bool = True
52
+ # False when the session's steps span more than one git commit (the user
53
+ # committed between runs). Computed from the session's commit span — the
54
+ # SAME source `roar reproduce` uses — so the two checklists never disagree.
55
+ # Defaults True so single-commit/normal registrations are unaffected.
56
+ single_commit: bool = True
52
57
 
53
58
 
54
59
  @dataclass(frozen=True)
@@ -94,3 +99,8 @@ class PutResponse:
94
99
  git_tag: str | None = None
95
100
  warnings: list[str] = field(default_factory=list)
96
101
  error: str | None = None
102
+ # Reproducibility-checklist inputs, mirroring RegisterLineageResponse so
103
+ # `roar put` can render the same receipt as `roar register`.
104
+ reproducible: bool = True # the published run has a git commit
105
+ single_commit: bool = True # the session's steps share one commit
106
+ commit_on_remote: bool = False # the commit is reachable on a shareable remote