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.
- {roar_cli-0.3.4 → roar_cli-0.3.6}/PKG-INFO +43 -77
- {roar_cli-0.3.4 → roar_cli-0.3.6}/README.md +42 -76
- {roar_cli-0.3.4 → roar_cli-0.3.6}/pyproject.toml +1 -1
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/get/transfer.py +33 -4
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/git.py +13 -1
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/git_remote.py +6 -1
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/register_execution.py +11 -1
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/register_tag_push.py +16 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/registration_package.py +24 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/results.py +10 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/service.py +71 -26
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/dag.py +16 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/inputs.py +122 -19
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/requests.py +2 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/results.py +4 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/status.py +53 -0
- roar_cli-0.3.6/roar/application/reproduce/environment.py +208 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/reproduce/lookup.py +65 -8
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/reproduce/service.py +164 -12
- roar_cli-0.3.6/roar/application/reproducibility/report.py +315 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/run/execution.py +28 -1
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/run/output_followup.py +47 -0
- roar_cli-0.3.6/roar/cli/commands/auth.py +329 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/dag.py +14 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/init.py +8 -10
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/inputs.py +16 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/put.py +48 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/register.py +115 -18
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/status.py +15 -2
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/publish_intent.py +47 -7
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/templates/agents/SKILL.md.tmpl +21 -1
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/templates/agents/agents_section.md.tmpl +2 -1
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/__init__.py +2 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/exceptions.py +18 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/reproduction.py +4 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/provenance/file_filter.py +13 -1
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/provenance/runtime_collector.py +21 -2
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/provenance/service.py +49 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/reproduction/environment_setup.py +113 -19
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/reproduction/pipeline_executor.py +5 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/coordinator.py +12 -1
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/inject/tracker.py +9 -1
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/tracer.py +45 -21
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/tracer_backends.py +11 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/glaas/registration/artifact.py +18 -9
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/presenters/run_report.py +33 -34
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/telemetry/config.py +12 -2
- roar_cli-0.3.6/roar/tui/screens/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/utils/git_url.py +19 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/Cargo.lock +12 -14
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/crates/artifact-hash-py/Cargo.toml +1 -1
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/crates/artifact-hash-py/src/lib.rs +3 -3
- roar_cli-0.3.4/roar/application/reproduce/environment.py +0 -91
- roar_cli-0.3.4/roar/cli/commands/auth.py +0 -271
- {roar_cli-0.3.4 → roar_cli-0.3.6}/LICENSE +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/__main__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/analyzers/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/analyzers/base.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/analyzers/experiment_trackers.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/composite/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/composite/canonical.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/composite/detect.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/composite/qualifying.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/get/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/get/requests.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/get/results.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/get/service.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/label_rendering.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/labels.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/lookup/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/lookup/models.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/lookup/policy.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/lookup/refs.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/lookup/remote_artifacts.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/lookup/runner.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/anchor_attribution.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/blake3_upgrade.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/collection.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/composite_builder.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/composites.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/datasets.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/form_composites.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/job_links.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/job_preparation.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/lineage.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/lineage_composite_formation.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/lineage_composites.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/metadata.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/put_composites.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/put_execution.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/put_preparation.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/register_preparation.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/register_preview_jobs.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/registration.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/remote_job_uids.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/remote_registry.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/requests.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/runtime.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/secrets.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/session.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/source_resolution.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/targets.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/publish/view_edges.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/db_status.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/diff.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/diff_engine.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/diff_graph.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/diff_refs.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/git_readiness.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/label.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/lineage.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/log.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/query/show.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/reproduce/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/reproduce/requests.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/reproduce/results.py +0 -0
- {roar_cli-0.3.4/roar/tui/screens → roar_cli-0.3.6/roar/application/reproducibility}/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/run/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/run/dag_references.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/run/dirty_tree_classify.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/run/dirty_tree_error.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/run/gitignore_suggest.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/run/requests.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/run/service.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/run/verbosity.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/system_labels.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/workflow/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/workflow/requests.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/workflow/results.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/application/workflow/service.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/auth_store.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/local/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/local/plugin.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/osmo/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/osmo/config.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/osmo/export.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/osmo/host_execution.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/osmo/lineage.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/osmo/plugin.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/osmo/runtime_bundle.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/osmo/submit.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/osmo/workflow.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/_agent_names.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/collector.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/config.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/constants.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/env_contract.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/fragment.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/fragment_reconstituter.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/node_agent.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/plugin.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/proxy_fragments.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/roar_worker.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/runtime_hooks.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/s3_key_paths.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/submit.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/backends/ray/submit_context.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/_format.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/command_registry.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/build.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/config.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/db.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/diff.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/env.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/export_registration_package.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/filter.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/get.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/init_agents.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/label.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/lineage.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/log.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/login.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/logout.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/osmo.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/pop.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/projects.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/proxy.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/reproduce.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/reset.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/run.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/scope.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/show.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/telemetry.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/tracer.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/tui.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/whoami.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/commands/workflow.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/context.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/cli/decorators.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/bootstrap.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/canonical_session.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/digests.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/dto/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/dto/registration.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/config.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/lineage.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/logger.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/presenter.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/provenance.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/registration.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/repositories.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/run.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/services.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/telemetry.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/interfaces/vcs.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/label_constants.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/label_origins.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/logging.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/artifact.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/base.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/dag.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/dataset_identifier.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/glaas.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/job.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/lineage.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/provenance.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/run.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/session.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/telemetry.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/models/vcs.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/operation_metadata.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/session_hash.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/step_name.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/tracer_modes.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/core/validation.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/context.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/engine.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/hashing/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/hashing/backend.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/hashing/blake3.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/models.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/query_context.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/repositories/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/repositories/artifact.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/repositories/collection.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/repositories/composite.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/repositories/hash_cache.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/repositories/job.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/repositories/label.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/repositories/session.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/schema.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/services/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/services/hashing.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/services/job_recording.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/services/lineage.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/services/session.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/db/step_priority.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/cluster/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/cluster/bridge.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/cluster/proxy.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/cluster/proxy_config.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/fragments/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/fragments/lineage.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/fragments/models.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/fragments/reconstitution.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/fragments/sessions.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/fragments/transport.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/framework/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/framework/contract.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/framework/planning.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/framework/registry.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/framework/runtime_imports.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/provenance/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/provenance/assembler.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/provenance/build_pip_collector.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/provenance/build_tool_collector.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/provenance/data_loader.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/provenance/package_collector.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/provenance/process_summarizer.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/recording/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/recording/dataset_identifier.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/recording/dataset_metadata.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/recording/dataset_profile.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/recording/job_recording.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/reproduction/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/reproduction/installers.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/reproduction/pipeline_metadata.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/abi_probe.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/backup.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/driver_entrypoint.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/errors.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/host_execution.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/inject/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/inject/sitecustomize.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/inject/support.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/lazy_install.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/proxy_resource.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/resources.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/signal_handler.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/tracer_banner.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/execution/runtime/worker_bootstrap.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/filters/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/filters/files.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/filters/omit.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/glaas_auth.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/glaas_client.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/bootstrap.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/config/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/config/access.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/config/loader.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/config/raw.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/config/schema.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/discovery.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/download/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/download/base.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/download/gcs.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/download/get.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/download/hf.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/download/http.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/download/noop.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/download/s3.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/git/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/git/base.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/git/context.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/git/provider.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/glaas/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/glaas/auth.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/glaas/client.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/glaas/fragment_streamer.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/glaas/registration/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/glaas/registration/_artifact_ref.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/glaas/registration/coordinator.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/glaas/registration/job.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/glaas/registration/session.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/glaas/transport.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/registry.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/resolution.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/storage/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/storage/base.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/storage/gcs.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/storage/memory.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/storage/noop.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/storage/publish.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/storage/s3.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/telemetry/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/telemetry/base.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/integrations/telemetry/wandb.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/presenters/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/presenters/console.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/presenters/dag_data_builder.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/presenters/dag_renderer.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/presenters/diff_renderer.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/presenters/formatting.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/presenters/null.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/presenters/show_renderer.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/presenters/spinner.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/presenters/terminal.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/publish_auth.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/require.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/scope_config.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/telemetry/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/telemetry/_io.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/telemetry/capabilities.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/telemetry/hooks.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/telemetry/install.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/telemetry/paths.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/telemetry/payload.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/telemetry/queue.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/telemetry/stats.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/telemetry/uploader.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/app.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/data.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/screens/config_editor.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/screens/label_editor.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/screens/launcher.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/screens/log.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/screens/main.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/screens/search.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/screens/session_picker.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/tmux.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/widgets/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/tui/widgets/detail.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/utils/__init__.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/utils/cloud.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/roar/version_check.py +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/Cargo.toml +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/crates/artifact-hash-core/Cargo.toml +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/crates/artifact-hash-core/src/lib.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/crates/tracer-fd/Cargo.toml +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/crates/tracer-fd/src/lib.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/crates/tracer-runtime/Cargo.toml +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/crates/tracer-runtime/src/lib.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/crates/tracer-schema/Cargo.toml +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/crates/tracer-schema/src/lib.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/services/proxy/Cargo.lock +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/services/proxy/Cargo.toml +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/services/proxy/src/forward.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/services/proxy/src/main.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/services/proxy/src/s3.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/common/Cargo.toml +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/common/src/lib.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/probe/Cargo.toml +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/probe/rust-toolchain.toml +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/probe/src/main.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/userspace/Cargo.toml +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/userspace/build.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/userspace/src/attach.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/userspace/src/bin/roard.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/userspace/src/client.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/userspace/src/daemon.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/userspace/src/events.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/userspace/src/ipc.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/userspace/src/lib.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/userspace/src/main.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ebpf/userspace/src/state.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/preload/Cargo.toml +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/preload/build.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/preload/src/bin/io_fixture.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/preload/src/interpose.c +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/preload/src/ipc.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/preload/src/lib.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/preload/src/main.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/preload/tests/comprehensive.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/preload/tests/standalone.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ptrace/Cargo.toml +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ptrace/rustfmt.toml +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ptrace/src/arch.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ptrace/src/main.rs +0 -0
- {roar_cli-0.3.4 → roar_cli-0.3.6}/rust/tracers/ptrace/src/seccomp.rs +0 -0
- {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.
|
|
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
|
-
|
|
64
|
-
|
|
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
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
|
166
|
-
ROAR_NO_TELEMETRY=1 roar run
|
|
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
|
|
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
|
|
615
|
-
roar run
|
|
616
|
-
roar run
|
|
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
|
-
|
|
643
|
-
|
|
644
|
-
|
|
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
|
-
#
|
|
669
|
-
roar
|
|
633
|
+
# Sign in (browser/device flow) for attributed, private, or project publishing
|
|
634
|
+
roar login
|
|
670
635
|
|
|
671
|
-
#
|
|
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
|
-
#
|
|
675
|
-
roar
|
|
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
|
-
|
|
15
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
|
117
|
-
ROAR_NO_TELEMETRY=1 roar run
|
|
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
|
|
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
|
|
566
|
-
roar run
|
|
567
|
-
roar run
|
|
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
|
-
|
|
594
|
-
|
|
595
|
-
|
|
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
|
-
#
|
|
620
|
-
roar
|
|
584
|
+
# Sign in (browser/device flow) for attributed, private, or project publishing
|
|
585
|
+
roar login
|
|
621
586
|
|
|
622
|
-
#
|
|
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
|
-
#
|
|
626
|
-
roar
|
|
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
|
|
@@ -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
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
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
|
|
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
|