roar-cli 0.3.2__tar.gz → 0.3.3__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 (419) hide show
  1. {roar_cli-0.3.2 → roar_cli-0.3.3}/PKG-INFO +49 -16
  2. {roar_cli-0.3.2 → roar_cli-0.3.3}/README.md +48 -15
  3. {roar_cli-0.3.2 → roar_cli-0.3.3}/pyproject.toml +1 -1
  4. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/analyzers/experiment_trackers.py +47 -15
  5. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/get/requests.py +1 -0
  6. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/get/service.py +65 -0
  7. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/requests.py +1 -0
  8. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/service.py +6 -0
  9. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/command_registry.py +7 -0
  10. roar_cli-0.3.3/roar/cli/commands/filter.py +135 -0
  11. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/get.py +9 -0
  12. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/put.py +3 -0
  13. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/provenance.py +2 -0
  14. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/schema.py +16 -0
  15. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/provenance/file_filter.py +36 -1
  16. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/recording/job_recording.py +104 -12
  17. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/coordinator.py +29 -81
  18. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/config/loader.py +50 -3
  19. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/config/schema.py +1 -0
  20. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/presenters/show_renderer.py +39 -1
  21. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/services/proxy/src/main.rs +5 -3
  22. {roar_cli-0.3.2 → roar_cli-0.3.3}/LICENSE +0 -0
  23. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/__init__.py +0 -0
  24. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/__main__.py +0 -0
  25. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/analyzers/__init__.py +0 -0
  26. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/analyzers/base.py +0 -0
  27. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/__init__.py +0 -0
  28. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/get/__init__.py +0 -0
  29. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/get/results.py +0 -0
  30. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/get/transfer.py +0 -0
  31. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/git.py +0 -0
  32. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/label_rendering.py +0 -0
  33. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/labels.py +0 -0
  34. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/lookup/__init__.py +0 -0
  35. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/lookup/models.py +0 -0
  36. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/lookup/policy.py +0 -0
  37. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/lookup/refs.py +0 -0
  38. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/lookup/remote_artifacts.py +0 -0
  39. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/lookup/runner.py +0 -0
  40. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/__init__.py +0 -0
  41. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/blake3_upgrade.py +0 -0
  42. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/collection.py +0 -0
  43. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/composite_builder.py +0 -0
  44. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/composites.py +0 -0
  45. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/datasets.py +0 -0
  46. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/git_remote.py +0 -0
  47. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/job_links.py +0 -0
  48. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/job_preparation.py +0 -0
  49. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/lineage.py +0 -0
  50. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/lineage_composites.py +0 -0
  51. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/metadata.py +0 -0
  52. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/put_composites.py +0 -0
  53. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/put_execution.py +0 -0
  54. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/put_preparation.py +0 -0
  55. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/register_execution.py +0 -0
  56. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/register_preparation.py +0 -0
  57. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/register_preview_jobs.py +0 -0
  58. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/register_tag_push.py +0 -0
  59. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/registration.py +0 -0
  60. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/registration_package.py +0 -0
  61. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/remote_job_uids.py +0 -0
  62. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/remote_registry.py +0 -0
  63. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/results.py +0 -0
  64. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/runtime.py +0 -0
  65. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/secrets.py +0 -0
  66. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/session.py +0 -0
  67. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/source_resolution.py +0 -0
  68. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/targets.py +0 -0
  69. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/__init__.py +0 -0
  70. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/dag.py +0 -0
  71. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/diff.py +0 -0
  72. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/diff_engine.py +0 -0
  73. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/diff_graph.py +0 -0
  74. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/diff_refs.py +0 -0
  75. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/git_readiness.py +0 -0
  76. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/inputs.py +0 -0
  77. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/label.py +0 -0
  78. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/lineage.py +0 -0
  79. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/log.py +0 -0
  80. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/requests.py +0 -0
  81. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/results.py +0 -0
  82. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/show.py +0 -0
  83. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/status.py +0 -0
  84. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/reproduce/__init__.py +0 -0
  85. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/reproduce/environment.py +0 -0
  86. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/reproduce/lookup.py +0 -0
  87. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/reproduce/requests.py +0 -0
  88. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/reproduce/results.py +0 -0
  89. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/reproduce/service.py +0 -0
  90. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/run/__init__.py +0 -0
  91. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/run/dag_references.py +0 -0
  92. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/run/dirty_tree_classify.py +0 -0
  93. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/run/dirty_tree_error.py +0 -0
  94. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/run/execution.py +0 -0
  95. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/run/gitignore_suggest.py +0 -0
  96. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/run/output_followup.py +0 -0
  97. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/run/requests.py +0 -0
  98. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/run/service.py +0 -0
  99. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/run/verbosity.py +0 -0
  100. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/system_labels.py +0 -0
  101. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/workflow/__init__.py +0 -0
  102. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/workflow/requests.py +0 -0
  103. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/workflow/results.py +0 -0
  104. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/workflow/service.py +0 -0
  105. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/auth_store.py +0 -0
  106. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/__init__.py +0 -0
  107. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/local/__init__.py +0 -0
  108. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/local/plugin.py +0 -0
  109. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/osmo/__init__.py +0 -0
  110. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/osmo/config.py +0 -0
  111. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/osmo/export.py +0 -0
  112. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/osmo/host_execution.py +0 -0
  113. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/osmo/lineage.py +0 -0
  114. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/osmo/plugin.py +0 -0
  115. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/osmo/runtime_bundle.py +0 -0
  116. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/osmo/submit.py +0 -0
  117. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/osmo/workflow.py +0 -0
  118. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/__init__.py +0 -0
  119. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/_agent_names.py +0 -0
  120. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/collector.py +0 -0
  121. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/config.py +0 -0
  122. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/constants.py +0 -0
  123. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/env_contract.py +0 -0
  124. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/fragment.py +0 -0
  125. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/fragment_reconstituter.py +0 -0
  126. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/node_agent.py +0 -0
  127. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/plugin.py +0 -0
  128. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/proxy_fragments.py +0 -0
  129. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/roar_worker.py +0 -0
  130. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/runtime_hooks.py +0 -0
  131. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/s3_key_paths.py +0 -0
  132. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/submit.py +0 -0
  133. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/submit_context.py +0 -0
  134. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/__init__.py +0 -0
  135. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/_format.py +0 -0
  136. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/__init__.py +0 -0
  137. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/auth.py +0 -0
  138. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/build.py +0 -0
  139. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/config.py +0 -0
  140. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/dag.py +0 -0
  141. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/diff.py +0 -0
  142. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/env.py +0 -0
  143. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/export_registration_package.py +0 -0
  144. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/init.py +0 -0
  145. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/init_agents.py +0 -0
  146. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/inputs.py +0 -0
  147. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/label.py +0 -0
  148. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/lineage.py +0 -0
  149. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/log.py +0 -0
  150. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/login.py +0 -0
  151. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/logout.py +0 -0
  152. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/osmo.py +0 -0
  153. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/pop.py +0 -0
  154. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/projects.py +0 -0
  155. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/proxy.py +0 -0
  156. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/register.py +0 -0
  157. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/reproduce.py +0 -0
  158. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/reset.py +0 -0
  159. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/run.py +0 -0
  160. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/scope.py +0 -0
  161. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/show.py +0 -0
  162. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/status.py +0 -0
  163. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/telemetry.py +0 -0
  164. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/tracer.py +0 -0
  165. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/tui.py +0 -0
  166. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/whoami.py +0 -0
  167. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/workflow.py +0 -0
  168. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/context.py +0 -0
  169. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/decorators.py +0 -0
  170. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/publish_intent.py +0 -0
  171. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/templates/agents/SKILL.md.tmpl +0 -0
  172. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/templates/agents/agents_section.md.tmpl +0 -0
  173. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/__init__.py +0 -0
  174. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/bootstrap.py +0 -0
  175. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/canonical_session.py +0 -0
  176. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/digests.py +0 -0
  177. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/dto/__init__.py +0 -0
  178. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/dto/registration.py +0 -0
  179. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/exceptions.py +0 -0
  180. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/__init__.py +0 -0
  181. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/config.py +0 -0
  182. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/lineage.py +0 -0
  183. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/logger.py +0 -0
  184. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/presenter.py +0 -0
  185. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/provenance.py +0 -0
  186. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/registration.py +0 -0
  187. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/repositories.py +0 -0
  188. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/reproduction.py +0 -0
  189. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/run.py +0 -0
  190. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/services.py +0 -0
  191. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/telemetry.py +0 -0
  192. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/vcs.py +0 -0
  193. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/label_constants.py +0 -0
  194. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/label_origins.py +0 -0
  195. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/logging.py +0 -0
  196. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/__init__.py +0 -0
  197. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/artifact.py +0 -0
  198. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/base.py +0 -0
  199. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/dag.py +0 -0
  200. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/dataset_identifier.py +0 -0
  201. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/glaas.py +0 -0
  202. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/job.py +0 -0
  203. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/lineage.py +0 -0
  204. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/run.py +0 -0
  205. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/session.py +0 -0
  206. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/telemetry.py +0 -0
  207. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/vcs.py +0 -0
  208. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/operation_metadata.py +0 -0
  209. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/session_hash.py +0 -0
  210. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/step_name.py +0 -0
  211. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/tracer_modes.py +0 -0
  212. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/validation.py +0 -0
  213. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/__init__.py +0 -0
  214. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/context.py +0 -0
  215. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/engine.py +0 -0
  216. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/hashing/__init__.py +0 -0
  217. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/hashing/backend.py +0 -0
  218. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/hashing/blake3.py +0 -0
  219. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/models.py +0 -0
  220. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/query_context.py +0 -0
  221. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/repositories/__init__.py +0 -0
  222. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/repositories/artifact.py +0 -0
  223. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/repositories/collection.py +0 -0
  224. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/repositories/composite.py +0 -0
  225. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/repositories/hash_cache.py +0 -0
  226. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/repositories/job.py +0 -0
  227. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/repositories/label.py +0 -0
  228. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/repositories/session.py +0 -0
  229. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/services/__init__.py +0 -0
  230. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/services/hashing.py +0 -0
  231. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/services/job_recording.py +0 -0
  232. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/services/lineage.py +0 -0
  233. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/services/session.py +0 -0
  234. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/step_priority.py +0 -0
  235. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/__init__.py +0 -0
  236. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/cluster/__init__.py +0 -0
  237. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/cluster/bridge.py +0 -0
  238. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/cluster/proxy.py +0 -0
  239. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/cluster/proxy_config.py +0 -0
  240. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/fragments/__init__.py +0 -0
  241. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/fragments/lineage.py +0 -0
  242. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/fragments/models.py +0 -0
  243. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/fragments/reconstitution.py +0 -0
  244. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/fragments/sessions.py +0 -0
  245. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/fragments/transport.py +0 -0
  246. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/framework/__init__.py +0 -0
  247. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/framework/contract.py +0 -0
  248. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/framework/planning.py +0 -0
  249. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/framework/registry.py +0 -0
  250. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/framework/runtime_imports.py +0 -0
  251. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/provenance/__init__.py +0 -0
  252. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/provenance/assembler.py +0 -0
  253. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/provenance/build_pip_collector.py +0 -0
  254. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/provenance/build_tool_collector.py +0 -0
  255. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/provenance/data_loader.py +0 -0
  256. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/provenance/package_collector.py +0 -0
  257. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/provenance/process_summarizer.py +0 -0
  258. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/provenance/runtime_collector.py +0 -0
  259. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/provenance/service.py +0 -0
  260. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/recording/__init__.py +0 -0
  261. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/recording/dataset_identifier.py +0 -0
  262. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/recording/dataset_metadata.py +0 -0
  263. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/recording/dataset_profile.py +0 -0
  264. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/reproduction/__init__.py +0 -0
  265. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/reproduction/environment_setup.py +0 -0
  266. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/reproduction/installers.py +0 -0
  267. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/reproduction/pipeline_executor.py +0 -0
  268. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/reproduction/pipeline_metadata.py +0 -0
  269. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/__init__.py +0 -0
  270. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/abi_probe.py +0 -0
  271. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/backup.py +0 -0
  272. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/driver_entrypoint.py +0 -0
  273. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/errors.py +0 -0
  274. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/host_execution.py +0 -0
  275. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/inject/__init__.py +0 -0
  276. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/inject/sitecustomize.py +0 -0
  277. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/inject/support.py +0 -0
  278. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/inject/tracker.py +0 -0
  279. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/lazy_install.py +0 -0
  280. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/proxy_resource.py +0 -0
  281. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/resources.py +0 -0
  282. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/signal_handler.py +0 -0
  283. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/tracer.py +0 -0
  284. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/tracer_backends.py +0 -0
  285. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/tracer_banner.py +0 -0
  286. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/worker_bootstrap.py +0 -0
  287. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/filters/__init__.py +0 -0
  288. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/filters/files.py +0 -0
  289. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/filters/omit.py +0 -0
  290. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/glaas_auth.py +0 -0
  291. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/glaas_client.py +0 -0
  292. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/__init__.py +0 -0
  293. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/bootstrap.py +0 -0
  294. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/config/__init__.py +0 -0
  295. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/config/access.py +0 -0
  296. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/config/raw.py +0 -0
  297. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/discovery.py +0 -0
  298. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/download/__init__.py +0 -0
  299. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/download/base.py +0 -0
  300. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/download/gcs.py +0 -0
  301. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/download/get.py +0 -0
  302. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/download/http.py +0 -0
  303. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/download/noop.py +0 -0
  304. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/download/s3.py +0 -0
  305. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/git/__init__.py +0 -0
  306. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/git/base.py +0 -0
  307. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/git/context.py +0 -0
  308. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/git/provider.py +0 -0
  309. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/glaas/__init__.py +0 -0
  310. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/glaas/auth.py +0 -0
  311. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/glaas/client.py +0 -0
  312. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/glaas/fragment_streamer.py +0 -0
  313. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/glaas/registration/__init__.py +0 -0
  314. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/glaas/registration/_artifact_ref.py +0 -0
  315. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/glaas/registration/artifact.py +0 -0
  316. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/glaas/registration/coordinator.py +0 -0
  317. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/glaas/registration/job.py +0 -0
  318. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/glaas/registration/session.py +0 -0
  319. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/glaas/transport.py +0 -0
  320. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/registry.py +0 -0
  321. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/resolution.py +0 -0
  322. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/storage/__init__.py +0 -0
  323. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/storage/base.py +0 -0
  324. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/storage/gcs.py +0 -0
  325. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/storage/memory.py +0 -0
  326. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/storage/noop.py +0 -0
  327. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/storage/publish.py +0 -0
  328. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/storage/s3.py +0 -0
  329. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/telemetry/__init__.py +0 -0
  330. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/telemetry/base.py +0 -0
  331. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/telemetry/wandb.py +0 -0
  332. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/presenters/__init__.py +0 -0
  333. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/presenters/console.py +0 -0
  334. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/presenters/dag_data_builder.py +0 -0
  335. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/presenters/dag_renderer.py +0 -0
  336. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/presenters/diff_renderer.py +0 -0
  337. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/presenters/formatting.py +0 -0
  338. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/presenters/null.py +0 -0
  339. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/presenters/run_report.py +0 -0
  340. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/presenters/spinner.py +0 -0
  341. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/presenters/terminal.py +0 -0
  342. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/publish_auth.py +0 -0
  343. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/require.py +0 -0
  344. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/scope_config.py +0 -0
  345. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/telemetry/__init__.py +0 -0
  346. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/telemetry/_io.py +0 -0
  347. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/telemetry/capabilities.py +0 -0
  348. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/telemetry/config.py +0 -0
  349. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/telemetry/hooks.py +0 -0
  350. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/telemetry/install.py +0 -0
  351. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/telemetry/paths.py +0 -0
  352. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/telemetry/payload.py +0 -0
  353. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/telemetry/queue.py +0 -0
  354. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/telemetry/stats.py +0 -0
  355. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/telemetry/uploader.py +0 -0
  356. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/__init__.py +0 -0
  357. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/app.py +0 -0
  358. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/data.py +0 -0
  359. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/screens/__init__.py +0 -0
  360. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/screens/config_editor.py +0 -0
  361. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/screens/label_editor.py +0 -0
  362. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/screens/launcher.py +0 -0
  363. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/screens/log.py +0 -0
  364. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/screens/main.py +0 -0
  365. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/screens/search.py +0 -0
  366. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/screens/session_picker.py +0 -0
  367. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/tmux.py +0 -0
  368. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/widgets/__init__.py +0 -0
  369. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/widgets/detail.py +0 -0
  370. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/utils/__init__.py +0 -0
  371. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/utils/cloud.py +0 -0
  372. {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/utils/git_url.py +0 -0
  373. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/Cargo.lock +0 -0
  374. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/Cargo.toml +0 -0
  375. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/crates/artifact-hash-core/Cargo.toml +0 -0
  376. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/crates/artifact-hash-core/src/lib.rs +0 -0
  377. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/crates/artifact-hash-py/Cargo.toml +0 -0
  378. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/crates/artifact-hash-py/src/lib.rs +0 -0
  379. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/crates/tracer-fd/Cargo.toml +0 -0
  380. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/crates/tracer-fd/src/lib.rs +0 -0
  381. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/crates/tracer-runtime/Cargo.toml +0 -0
  382. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/crates/tracer-runtime/src/lib.rs +0 -0
  383. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/crates/tracer-schema/Cargo.toml +0 -0
  384. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/crates/tracer-schema/src/lib.rs +0 -0
  385. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/services/proxy/Cargo.lock +0 -0
  386. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/services/proxy/Cargo.toml +0 -0
  387. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/services/proxy/src/forward.rs +0 -0
  388. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/services/proxy/src/s3.rs +0 -0
  389. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/common/Cargo.toml +0 -0
  390. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/common/src/lib.rs +0 -0
  391. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/probe/Cargo.toml +0 -0
  392. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/probe/rust-toolchain.toml +0 -0
  393. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/probe/src/main.rs +0 -0
  394. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/userspace/Cargo.toml +0 -0
  395. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/userspace/build.rs +0 -0
  396. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/userspace/src/attach.rs +0 -0
  397. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/userspace/src/bin/roard.rs +0 -0
  398. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/userspace/src/client.rs +0 -0
  399. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/userspace/src/daemon.rs +0 -0
  400. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/userspace/src/events.rs +0 -0
  401. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/userspace/src/ipc.rs +0 -0
  402. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/userspace/src/lib.rs +0 -0
  403. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/userspace/src/main.rs +0 -0
  404. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/userspace/src/state.rs +0 -0
  405. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/preload/Cargo.toml +0 -0
  406. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/preload/build.rs +0 -0
  407. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/preload/src/bin/io_fixture.rs +0 -0
  408. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/preload/src/interpose.c +0 -0
  409. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/preload/src/ipc.rs +0 -0
  410. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/preload/src/lib.rs +0 -0
  411. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/preload/src/main.rs +0 -0
  412. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/preload/tests/comprehensive.rs +0 -0
  413. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/preload/tests/standalone.rs +0 -0
  414. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ptrace/Cargo.toml +0 -0
  415. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ptrace/rustfmt.toml +0 -0
  416. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ptrace/src/arch.rs +0 -0
  417. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ptrace/src/main.rs +0 -0
  418. {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ptrace/src/seccomp.rs +0 -0
  419. {roar_cli-0.3.2 → roar_cli-0.3.3}/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.2
3
+ Version: 0.3.3
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Intended Audience :: Science/Research
@@ -103,7 +103,7 @@ bash scripts/install-dev.sh
103
103
  when available) and then builds the Rust tracer binaries
104
104
  (`roar-tracer`, `roar-tracer-preload`, `roar-tracer-ebpf`, `roard`,
105
105
  `roar-proxy`) and stages them into `roar/bin/`. A bare
106
- `pip install -e .` does *not* build the tracer binaries because they
106
+ `pip install -e .` does _not_ build the tracer binaries because they
107
107
  live in separate cargo crates outside the maturin manifest, so
108
108
  `roar run` would fail with "No tracer binary found" until the script
109
109
  runs. See [Building from source](#building-from-source) below for
@@ -325,6 +325,16 @@ To register SSH auth with GLaaS:
325
325
  2. Sign up at <https://glaas.ai> where you can paste your public key
326
326
  3. Run `roar auth test` to verify
327
327
 
328
+ ### `roar login`
329
+
330
+ Authenticate with GLaaS and store your global login state for attributed publishing and project access. By default, `roar login` starts a browser/device login flow and can then unlock private or project-scoped publication in repositories that use `roar scope`.
331
+
332
+ ```bash
333
+ roar login
334
+ roar login --force
335
+ roar login --token-file ~/.config/roar/auth.json
336
+ ```
337
+
328
338
  ### `roar config`
329
339
 
330
340
  View or set configuration options.
@@ -337,20 +347,20 @@ roar config set <key> <value>
337
347
 
338
348
  Run `roar config list` to see all available options with descriptions. Common options:
339
349
 
340
- | Key | Default | Description |
341
- | ------------------------------ | ---------------------- | --------------------------------------- |
342
- | `output.track_repo_files` | false | Include repo files in provenance |
343
- | `output.quiet` | false | Suppress written files report |
344
- | `filters.ignore_system_reads` | true | Ignore /sys, /etc, /sbin reads |
345
- | `filters.ignore_package_reads` | true | Ignore installed package reads |
346
- | `filters.ignore_torch_cache` | true | Ignore torch/triton cache |
347
- | `filters.ignore_tmp_files` | true | Ignore /tmp files |
348
- | `glaas.url` | <https://api.glaas.ai> | GLaaS server URL |
349
- | `glaas.web_url` | <https://glaas.ai> | GLaaS web UI URL |
350
- | `registration.public_by_default` | false | Default `register`/`put` visibility |
351
- | `registration.omit.enabled` | true | Enable secret filtering |
352
- | `hash.primary` | blake3 | Primary hash algorithm |
353
- | `logging.level` | warning | Log level (debug, info, warning, error) |
350
+ | Key | Default | Description |
351
+ | -------------------------------- | ---------------------- | --------------------------------------- |
352
+ | `output.track_repo_files` | false | Include repo files in provenance |
353
+ | `output.quiet` | false | Suppress written files report |
354
+ | `filters.ignore_system_reads` | true | Ignore /sys, /etc, /sbin reads |
355
+ | `filters.ignore_package_reads` | true | Ignore installed package reads |
356
+ | `filters.ignore_torch_cache` | true | Ignore torch/triton cache |
357
+ | `filters.ignore_tmp_files` | true | Ignore /tmp files |
358
+ | `glaas.url` | <https://api.glaas.ai> | GLaaS server URL |
359
+ | `glaas.web_url` | <https://glaas.ai> | GLaaS web UI URL |
360
+ | `registration.public_by_default` | false | Default `register`/`put` visibility |
361
+ | `registration.omit.enabled` | true | Enable secret filtering |
362
+ | `hash.primary` | blake3 | Primary hash algorithm |
363
+ | `logging.level` | warning | Log level (debug, info, warning, error) |
354
364
 
355
365
  ### `roar dag`
356
366
 
@@ -382,6 +392,18 @@ Display recent job execution history.
382
392
  roar log # Show recent job history
383
393
  ```
384
394
 
395
+ ### `roar scope`
396
+
397
+ Show or change the default publication scope for the current repo. Scopes connect lineage from this repo to your personal space or to a specific org/project so later `roar register` and `roar put` commands publish in the right place.
398
+
399
+ ```bash
400
+ roar scope status
401
+ roar scope list
402
+ roar scope use private
403
+ roar scope use acme/foundation-models
404
+ roar scope clear
405
+ ```
406
+
385
407
  ### `roar label`
386
408
 
387
409
  Manage local labels for DAGs (sessions), jobs, and artifacts.
@@ -413,6 +435,17 @@ roar label sync job @2
413
435
  roar label sync artifact ./outputs/model.pt --dry-run
414
436
  ```
415
437
 
438
+ ### `roar diff <ref-a> <ref-b>`
439
+
440
+ Compare the lineage of two artifacts, jobs, steps, or sessions to see what changed in their inputs, parameters, code, environment, or pipeline structure. Use it to identify the likely root cause when two outputs differ.
441
+
442
+ ```bash
443
+ roar diff ./model.pkl ./model-v2.pkl
444
+ roar diff @5 @7 --format dag
445
+ roar diff session:current session:<hash>
446
+ roar diff @5 @7 --json
447
+ ```
448
+
416
449
  **Entity targets:**
417
450
 
418
451
  - `dag`: `current` or a session hash prefix
@@ -54,7 +54,7 @@ bash scripts/install-dev.sh
54
54
  when available) and then builds the Rust tracer binaries
55
55
  (`roar-tracer`, `roar-tracer-preload`, `roar-tracer-ebpf`, `roard`,
56
56
  `roar-proxy`) and stages them into `roar/bin/`. A bare
57
- `pip install -e .` does *not* build the tracer binaries because they
57
+ `pip install -e .` does _not_ build the tracer binaries because they
58
58
  live in separate cargo crates outside the maturin manifest, so
59
59
  `roar run` would fail with "No tracer binary found" until the script
60
60
  runs. See [Building from source](#building-from-source) below for
@@ -276,6 +276,16 @@ To register SSH auth with GLaaS:
276
276
  2. Sign up at <https://glaas.ai> where you can paste your public key
277
277
  3. Run `roar auth test` to verify
278
278
 
279
+ ### `roar login`
280
+
281
+ Authenticate with GLaaS and store your global login state for attributed publishing and project access. By default, `roar login` starts a browser/device login flow and can then unlock private or project-scoped publication in repositories that use `roar scope`.
282
+
283
+ ```bash
284
+ roar login
285
+ roar login --force
286
+ roar login --token-file ~/.config/roar/auth.json
287
+ ```
288
+
279
289
  ### `roar config`
280
290
 
281
291
  View or set configuration options.
@@ -288,20 +298,20 @@ roar config set <key> <value>
288
298
 
289
299
  Run `roar config list` to see all available options with descriptions. Common options:
290
300
 
291
- | Key | Default | Description |
292
- | ------------------------------ | ---------------------- | --------------------------------------- |
293
- | `output.track_repo_files` | false | Include repo files in provenance |
294
- | `output.quiet` | false | Suppress written files report |
295
- | `filters.ignore_system_reads` | true | Ignore /sys, /etc, /sbin reads |
296
- | `filters.ignore_package_reads` | true | Ignore installed package reads |
297
- | `filters.ignore_torch_cache` | true | Ignore torch/triton cache |
298
- | `filters.ignore_tmp_files` | true | Ignore /tmp files |
299
- | `glaas.url` | <https://api.glaas.ai> | GLaaS server URL |
300
- | `glaas.web_url` | <https://glaas.ai> | GLaaS web UI URL |
301
- | `registration.public_by_default` | false | Default `register`/`put` visibility |
302
- | `registration.omit.enabled` | true | Enable secret filtering |
303
- | `hash.primary` | blake3 | Primary hash algorithm |
304
- | `logging.level` | warning | Log level (debug, info, warning, error) |
301
+ | Key | Default | Description |
302
+ | -------------------------------- | ---------------------- | --------------------------------------- |
303
+ | `output.track_repo_files` | false | Include repo files in provenance |
304
+ | `output.quiet` | false | Suppress written files report |
305
+ | `filters.ignore_system_reads` | true | Ignore /sys, /etc, /sbin reads |
306
+ | `filters.ignore_package_reads` | true | Ignore installed package reads |
307
+ | `filters.ignore_torch_cache` | true | Ignore torch/triton cache |
308
+ | `filters.ignore_tmp_files` | true | Ignore /tmp files |
309
+ | `glaas.url` | <https://api.glaas.ai> | GLaaS server URL |
310
+ | `glaas.web_url` | <https://glaas.ai> | GLaaS web UI URL |
311
+ | `registration.public_by_default` | false | Default `register`/`put` visibility |
312
+ | `registration.omit.enabled` | true | Enable secret filtering |
313
+ | `hash.primary` | blake3 | Primary hash algorithm |
314
+ | `logging.level` | warning | Log level (debug, info, warning, error) |
305
315
 
306
316
  ### `roar dag`
307
317
 
@@ -333,6 +343,18 @@ Display recent job execution history.
333
343
  roar log # Show recent job history
334
344
  ```
335
345
 
346
+ ### `roar scope`
347
+
348
+ Show or change the default publication scope for the current repo. Scopes connect lineage from this repo to your personal space or to a specific org/project so later `roar register` and `roar put` commands publish in the right place.
349
+
350
+ ```bash
351
+ roar scope status
352
+ roar scope list
353
+ roar scope use private
354
+ roar scope use acme/foundation-models
355
+ roar scope clear
356
+ ```
357
+
336
358
  ### `roar label`
337
359
 
338
360
  Manage local labels for DAGs (sessions), jobs, and artifacts.
@@ -364,6 +386,17 @@ roar label sync job @2
364
386
  roar label sync artifact ./outputs/model.pt --dry-run
365
387
  ```
366
388
 
389
+ ### `roar diff <ref-a> <ref-b>`
390
+
391
+ Compare the lineage of two artifacts, jobs, steps, or sessions to see what changed in their inputs, parameters, code, environment, or pipeline structure. Use it to identify the likely root cause when two outputs differ.
392
+
393
+ ```bash
394
+ roar diff ./model.pkl ./model-v2.pkl
395
+ roar diff @5 @7 --format dag
396
+ roar diff session:current session:<hash>
397
+ roar diff @5 @7 --json
398
+ ```
399
+
367
400
  **Entity targets:**
368
401
 
369
402
  - `dag`: `current` or a session hash prefix
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "roar-cli"
7
- version = "0.3.2"
7
+ version = "0.3.3"
8
8
  description = "Reproducibility and provenance tracker for ML training pipelines"
9
9
  authors = [
10
10
  { name="TReqs Team", email="info@treqs.ai" }
@@ -30,9 +30,19 @@ class ExperimentTrackerAnalyzer(Analyzer):
30
30
  ".neptune/*",
31
31
  ]
32
32
 
33
+ @staticmethod
34
+ def _all_written_files(context: dict) -> list:
35
+ """Return unfiltered written files so tracker detection works even
36
+ when tracker directories are in ignore_paths."""
37
+ tracer_data = context.get("tracer_data", {})
38
+ unfiltered = tracer_data.get("written_files", [])
39
+ if unfiltered:
40
+ return unfiltered
41
+ return context.get("written_files", [])
42
+
33
43
  def relevant(self, context: dict) -> bool:
34
44
  """Check if any tracker directories were written to."""
35
- written = context.get("written_files", [])
45
+ written = self._all_written_files(context)
36
46
  for path in written:
37
47
  for _tracker, patterns in self.TRACKER_PATTERNS.items():
38
48
  if any(p in path for p in patterns):
@@ -40,7 +50,7 @@ class ExperimentTrackerAnalyzer(Analyzer):
40
50
  return False
41
51
 
42
52
  def analyze(self, context: dict) -> dict | None:
43
- written = context.get("written_files", [])
53
+ written = self._all_written_files(context)
44
54
  env = context.get("env", {})
45
55
 
46
56
  results: dict[str, Any] = {
@@ -126,7 +136,12 @@ class ExperimentTrackerAnalyzer(Analyzer):
126
136
  run_dir = None
127
137
 
128
138
  if run_dir and run_dir.exists():
129
- # Try to read run metadata
139
+ # Extract run_id from directory name: run-YYYYMMDD_HHMMSS-<run_id>
140
+ dir_match = re.match(r"run-\d{8}_\d{6}-(.+)$", run_dir.name)
141
+ if dir_match:
142
+ info["run_id"] = dir_match.group(1)
143
+
144
+ # Try to read run metadata for additional fields
130
145
  run_metadata = run_dir / "files" / "wandb-metadata.json"
131
146
  if run_metadata.exists():
132
147
  try:
@@ -135,34 +150,51 @@ class ExperimentTrackerAnalyzer(Analyzer):
135
150
  info["run_id"] = metadata.get("run_id")
136
151
  info["project"] = metadata.get("project")
137
152
  info["entity"] = metadata.get("entity")
138
- if all(k in info for k in ["entity", "project", "run_id"]):
153
+ if info.get("entity") and info.get("project") and info.get("run_id"):
139
154
  info["url"] = (
140
155
  f"https://wandb.ai/{info['entity']}/{info['project']}/runs/{info['run_id']}"
141
156
  )
142
157
  except (OSError, json.JSONDecodeError):
143
158
  pass
144
159
 
145
- # Also check wandb-summary.json for run info
160
+ # Parse entity/project/run_id from debug.log.
161
+ # wandb writes "finishing run <entity>/<project>/<run_id>"
162
+ # to this file on every online run.
163
+ debug_log = run_dir / "logs" / "debug.log"
164
+ if debug_log.exists():
165
+ try:
166
+ text = debug_log.read_text(errors="replace")
167
+ finish_match = re.search(r"finishing run (\S+)/(\S+)/(\S+)", text)
168
+ if finish_match:
169
+ info["entity"] = finish_match.group(1)
170
+ info["project"] = finish_match.group(2)
171
+ info["run_id"] = finish_match.group(3)
172
+ except OSError:
173
+ pass
174
+
175
+ # Check wandb-summary.json for runtime
146
176
  summary_file = run_dir / "files" / "wandb-summary.json"
147
- if summary_file.exists() and "run_id" not in info:
177
+ if summary_file.exists():
148
178
  try:
149
179
  with open(summary_file) as f:
150
180
  summary = json.load(f)
151
- # Summary might have _wandb key with run info
152
181
  wandb_info = summary.get("_wandb", {})
153
182
  if "runtime" in wandb_info:
154
183
  info["runtime_seconds"] = wandb_info["runtime"]
155
184
  except (OSError, json.JSONDecodeError):
156
185
  pass
157
186
 
158
- # Fall back to env vars
159
- if "url" not in info:
160
- entity = env.get("WANDB_ENTITY", "")
161
- project = env.get("WANDB_PROJECT", "")
162
- if entity and project:
163
- info["entity"] = entity
164
- info["project"] = project
165
- # Can't get run_id from env alone
187
+ # Fall back to env vars if entity/project still missing
188
+ if not info.get("entity"):
189
+ info["entity"] = env.get("WANDB_ENTITY", "")
190
+ if not info.get("project"):
191
+ info["project"] = env.get("WANDB_PROJECT", "")
192
+
193
+ # Build URL if we have all three components
194
+ if info.get("entity") and info.get("project") and info.get("run_id"):
195
+ info["url"] = (
196
+ f"https://wandb.ai/{info['entity']}/{info['project']}/runs/{info['run_id']}"
197
+ )
166
198
 
167
199
  return info if len(info) > 1 else None
168
200
 
@@ -20,3 +20,4 @@ class GetRequest:
20
20
  dry_run: bool = False
21
21
  force: bool = False
22
22
  tag: bool = False
23
+ step_name: str | None = None
@@ -27,12 +27,64 @@ def get_artifacts(request: GetRequest) -> GetResponse:
27
27
  is_prefix = request.source.rstrip("/") != request.source or parsed_source.is_prefix
28
28
 
29
29
  git_commit = None
30
+ git_branch = None
31
+ git_repo_url = None
30
32
  if not request.dry_run:
31
33
  try:
32
34
  git_commit = resolve_git_state(repo_root).commit
33
35
  logger.debug("Git commit: %s", git_commit)
34
36
  except Exception as exc:
35
37
  logger.debug("Git operation failed (non-fatal for get): %s", exc)
38
+ try:
39
+ import subprocess
40
+
41
+ git_branch = (
42
+ subprocess.check_output(
43
+ ["git", "rev-parse", "--abbrev-ref", "HEAD"],
44
+ cwd=str(repo_root),
45
+ stderr=subprocess.DEVNULL,
46
+ text=True,
47
+ ).strip()
48
+ or None
49
+ )
50
+ git_repo_url = (
51
+ subprocess.check_output(
52
+ ["git", "remote", "get-url", "origin"],
53
+ cwd=str(repo_root),
54
+ stderr=subprocess.DEVNULL,
55
+ text=True,
56
+ ).strip()
57
+ or None
58
+ )
59
+ except Exception:
60
+ pass
61
+
62
+ git_branch = None
63
+ git_repo_url = None
64
+ if not request.dry_run:
65
+ try:
66
+ import subprocess
67
+
68
+ git_branch = (
69
+ subprocess.check_output(
70
+ ["git", "rev-parse", "--abbrev-ref", "HEAD"],
71
+ cwd=str(repo_root),
72
+ stderr=subprocess.DEVNULL,
73
+ text=True,
74
+ ).strip()
75
+ or None
76
+ )
77
+ git_repo_url = (
78
+ subprocess.check_output(
79
+ ["git", "remote", "get-url", "origin"],
80
+ cwd=str(repo_root),
81
+ stderr=subprocess.DEVNULL,
82
+ text=True,
83
+ ).strip()
84
+ or None
85
+ )
86
+ except Exception:
87
+ pass
36
88
 
37
89
  with create_database_context(request.roar_dir) as db_ctx:
38
90
  service = GetService(
@@ -40,6 +92,7 @@ def get_artifacts(request: GetRequest) -> GetResponse:
40
92
  source=parsed_source,
41
93
  repo_root=repo_root,
42
94
  )
95
+ t0 = time.time()
43
96
  transfer_result = service.get(
44
97
  destination=request.destination,
45
98
  expected_hash=request.expected_hash,
@@ -47,6 +100,7 @@ def get_artifacts(request: GetRequest) -> GetResponse:
47
100
  force=request.force,
48
101
  is_prefix=is_prefix,
49
102
  )
103
+ download_duration = time.time() - t0
50
104
 
51
105
  result = _materialize_get_result(
52
106
  db_ctx=db_ctx,
@@ -54,6 +108,9 @@ def get_artifacts(request: GetRequest) -> GetResponse:
54
108
  parsed_source=parsed_source,
55
109
  transfer_result=transfer_result,
56
110
  git_commit=git_commit,
111
+ git_branch=git_branch,
112
+ git_repo=git_repo_url,
113
+ duration_seconds=download_duration,
57
114
  )
58
115
 
59
116
  git_tag_name = None
@@ -91,6 +148,9 @@ def _materialize_get_result(
91
148
  parsed_source,
92
149
  transfer_result: GetTransferResult,
93
150
  git_commit: str | None,
151
+ git_branch: str | None = None,
152
+ git_repo: str | None = None,
153
+ duration_seconds: float = 0.0,
94
154
  ) -> GetResponse:
95
155
  if transfer_result.dry_run or not transfer_result.success:
96
156
  return GetResponse(
@@ -127,6 +187,11 @@ def _materialize_get_result(
127
187
  job_type="get",
128
188
  output_artifacts=output_artifacts,
129
189
  exit_code=0,
190
+ git_commit=git_commit,
191
+ git_branch=git_branch,
192
+ git_repo=git_repo,
193
+ duration_seconds=duration_seconds,
194
+ step_name=request.step_name,
130
195
  )
131
196
  return GetResponse(
132
197
  success=True,
@@ -36,3 +36,4 @@ class PutRequest:
36
36
  public: bool = False
37
37
  anonymous: bool = False
38
38
  no_tag: bool = False
39
+ step_name: str | None = None
@@ -2,6 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import contextlib
5
6
  import subprocess
6
7
  from dataclasses import dataclass, field
7
8
  from pathlib import Path
@@ -650,6 +651,11 @@ def put_artifacts(request: PutRequest) -> PutResponse:
650
651
  git_tag=expected_tag,
651
652
  )
652
653
 
654
+ # Apply step name label if provided.
655
+ if request.step_name and result.success and result.job_id:
656
+ with contextlib.suppress(Exception):
657
+ db_ctx.job_recording._record_step_name_label(result.job_id, request.step_name)
658
+
653
659
  if request.dry_run:
654
660
  created_git_tag = None
655
661
  else:
@@ -157,6 +157,13 @@ _COMMAND_SPECS: tuple[CommandSpec, ...] = (
157
157
  "View or set configuration",
158
158
  "Setup and Admin",
159
159
  ),
160
+ CommandSpec(
161
+ "filter",
162
+ "roar.cli.commands.filter",
163
+ "filter_group",
164
+ "Manage project-level path filters (.roarconfig)",
165
+ "Setup and Admin",
166
+ ),
160
167
  CommandSpec(
161
168
  "env",
162
169
  "roar.cli.commands.env",
@@ -0,0 +1,135 @@
1
+ """
2
+ roar filter — manage project-level path filters in .roarconfig.
3
+
4
+ Usage:
5
+ roar filter list # show current ignore_paths
6
+ roar filter add <pattern> ... # add patterns
7
+ roar filter remove <pattern> ... # remove patterns
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import sys
13
+ from pathlib import Path
14
+
15
+ import click
16
+
17
+ try:
18
+ import tomllib
19
+ except ModuleNotFoundError:
20
+ import tomli as tomllib # type: ignore[no-redef]
21
+
22
+
23
+ def _roarconfig_path() -> Path:
24
+ """Return .roarconfig in the current working directory."""
25
+ return Path.cwd() / ".roarconfig"
26
+
27
+
28
+ def _load_roarconfig(path: Path) -> dict:
29
+ if not path.exists():
30
+ return {}
31
+ with open(path, "rb") as f:
32
+ return tomllib.load(f)
33
+
34
+
35
+ def _get_ignore_paths(data: dict) -> list[str]:
36
+ return list(data.get("filters", {}).get("ignore_paths", []))
37
+
38
+
39
+ def _write_roarconfig(path: Path, data: dict) -> None:
40
+ """Write .roarconfig as TOML.
41
+
42
+ We only support the [filters] section for now, so the writer is simple.
43
+ """
44
+ lines: list[str] = []
45
+ filters = data.get("filters", {})
46
+ ignore_paths = filters.get("ignore_paths", [])
47
+
48
+ # Preserve any non-filters top-level sections by round-tripping.
49
+ # For now, only [filters].ignore_paths is managed; other sections
50
+ # are dropped on write (acceptable for the initial implementation).
51
+ if ignore_paths:
52
+ lines.append("[filters]")
53
+ lines.append("ignore_paths = [")
54
+ for pattern in ignore_paths:
55
+ lines.append(f' "{pattern}",')
56
+ lines.append("]")
57
+ lines.append("")
58
+
59
+ path.write_text("\n".join(lines))
60
+
61
+
62
+ @click.group("filter")
63
+ def filter_group() -> None:
64
+ """Manage project-level path filters (.roarconfig).
65
+
66
+ Patterns in ignore_paths are matched against file paths observed
67
+ by the tracer. Absolute patterns (starting with /) match as
68
+ prefixes; relative patterns match as substrings anywhere in the
69
+ path. A trailing / means "this directory and everything under it".
70
+
71
+ \b
72
+ Examples:
73
+ roar filter add wandb/ .cache/wandb/ /run/udev/
74
+ roar filter remove wandb/
75
+ roar filter list
76
+ """
77
+
78
+
79
+ @filter_group.command("list")
80
+ def filter_list() -> None:
81
+ """Show current ignore_paths from .roarconfig."""
82
+ path = _roarconfig_path()
83
+ data = _load_roarconfig(path)
84
+ patterns = _get_ignore_paths(data)
85
+ if not patterns:
86
+ click.echo("No ignore_paths configured.")
87
+ click.echo("Add patterns with: roar filter add <pattern>")
88
+ return
89
+ click.echo(f".roarconfig ({path}):")
90
+ for pattern in patterns:
91
+ click.echo(f" {pattern}")
92
+
93
+
94
+ @filter_group.command("add")
95
+ @click.argument("patterns", nargs=-1, required=True)
96
+ def filter_add(patterns: tuple[str, ...]) -> None:
97
+ """Add patterns to ignore_paths in .roarconfig."""
98
+ path = _roarconfig_path()
99
+ data = _load_roarconfig(path)
100
+ current = _get_ignore_paths(data)
101
+ added = []
102
+ for pattern in patterns:
103
+ if pattern not in current:
104
+ current.append(pattern)
105
+ added.append(pattern)
106
+ if not added:
107
+ click.echo("All patterns already present.")
108
+ return
109
+ data.setdefault("filters", {})["ignore_paths"] = current
110
+ _write_roarconfig(path, data)
111
+ for pattern in added:
112
+ click.echo(f" + {pattern}")
113
+ click.echo(f"Updated {path}")
114
+
115
+
116
+ @filter_group.command("remove")
117
+ @click.argument("patterns", nargs=-1, required=True)
118
+ def filter_remove(patterns: tuple[str, ...]) -> None:
119
+ """Remove patterns from ignore_paths in .roarconfig."""
120
+ path = _roarconfig_path()
121
+ data = _load_roarconfig(path)
122
+ current = _get_ignore_paths(data)
123
+ removed = []
124
+ for pattern in patterns:
125
+ if pattern in current:
126
+ current.remove(pattern)
127
+ removed.append(pattern)
128
+ if not removed:
129
+ click.echo("None of the specified patterns were found.")
130
+ sys.exit(1)
131
+ data.setdefault("filters", {})["ignore_paths"] = current
132
+ _write_roarconfig(path, data)
133
+ for pattern in removed:
134
+ click.echo(f" - {pattern}")
135
+ click.echo(f"Updated {path}")
@@ -55,6 +55,13 @@ from ..decorators import require_init
55
55
  is_flag=True,
56
56
  help="Show what would be downloaded without doing it.",
57
57
  )
58
+ @click.option(
59
+ "-n",
60
+ "--name",
61
+ "step_name",
62
+ default=None,
63
+ help="Set the name label for this step.",
64
+ )
58
65
  @click.pass_obj
59
66
  @require_init
60
67
  def get(
@@ -67,6 +74,7 @@ def get(
67
74
  tag: bool,
68
75
  force: bool,
69
76
  dry_run: bool,
77
+ step_name: str | None,
70
78
  ) -> None:
71
79
  """Download artifacts from cloud storage and record in the local DAG.
72
80
 
@@ -128,6 +136,7 @@ def get(
128
136
  dry_run=dry_run,
129
137
  force=force,
130
138
  tag=tag,
139
+ step_name=step_name,
131
140
  )
132
141
  )
133
142
  except FileExistsError as e:
@@ -75,6 +75,7 @@ def _resolve_glaas_web_url() -> str:
75
75
  is_flag=True,
76
76
  help="Skip confirmation prompt for anonymous public publishing.",
77
77
  )
78
+ @click.option("-n", "--name", "step_name", help="Set the name label for this step.")
78
79
  @click.pass_obj
79
80
  @require_init
80
81
  def put(
@@ -86,6 +87,7 @@ def put(
86
87
  public: bool | None,
87
88
  anonymous: bool,
88
89
  yes: bool,
90
+ step_name: str | None,
89
91
  ) -> None:
90
92
  """Publish artifacts to cloud storage and register with GLaaS.
91
93
 
@@ -175,6 +177,7 @@ def put(
175
177
  public=publish_intent.public,
176
178
  anonymous=publish_intent.anonymous,
177
179
  no_tag=no_tag,
180
+ step_name=step_name,
178
181
  )
179
182
  )
180
183
  except (FileNotFoundError, ValueError, ImportError) as e: