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.
- {roar_cli-0.3.2 → roar_cli-0.3.3}/PKG-INFO +49 -16
- {roar_cli-0.3.2 → roar_cli-0.3.3}/README.md +48 -15
- {roar_cli-0.3.2 → roar_cli-0.3.3}/pyproject.toml +1 -1
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/analyzers/experiment_trackers.py +47 -15
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/get/requests.py +1 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/get/service.py +65 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/requests.py +1 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/service.py +6 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/command_registry.py +7 -0
- roar_cli-0.3.3/roar/cli/commands/filter.py +135 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/get.py +9 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/put.py +3 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/provenance.py +2 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/schema.py +16 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/provenance/file_filter.py +36 -1
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/recording/job_recording.py +104 -12
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/coordinator.py +29 -81
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/config/loader.py +50 -3
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/config/schema.py +1 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/presenters/show_renderer.py +39 -1
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/services/proxy/src/main.rs +5 -3
- {roar_cli-0.3.2 → roar_cli-0.3.3}/LICENSE +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/__main__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/analyzers/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/analyzers/base.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/get/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/get/results.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/get/transfer.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/git.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/label_rendering.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/labels.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/lookup/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/lookup/models.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/lookup/policy.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/lookup/refs.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/lookup/remote_artifacts.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/lookup/runner.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/blake3_upgrade.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/collection.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/composite_builder.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/composites.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/datasets.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/git_remote.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/job_links.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/job_preparation.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/lineage.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/lineage_composites.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/metadata.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/put_composites.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/put_execution.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/put_preparation.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/register_execution.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/register_preparation.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/register_preview_jobs.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/register_tag_push.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/registration.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/registration_package.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/remote_job_uids.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/remote_registry.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/results.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/runtime.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/secrets.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/session.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/source_resolution.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/publish/targets.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/dag.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/diff.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/diff_engine.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/diff_graph.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/diff_refs.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/git_readiness.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/inputs.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/label.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/lineage.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/log.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/requests.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/results.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/show.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/query/status.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/reproduce/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/reproduce/environment.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/reproduce/lookup.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/reproduce/requests.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/reproduce/results.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/reproduce/service.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/run/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/run/dag_references.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/run/dirty_tree_classify.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/run/dirty_tree_error.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/run/execution.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/run/gitignore_suggest.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/run/output_followup.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/run/requests.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/run/service.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/run/verbosity.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/system_labels.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/workflow/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/workflow/requests.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/workflow/results.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/application/workflow/service.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/auth_store.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/local/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/local/plugin.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/osmo/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/osmo/config.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/osmo/export.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/osmo/host_execution.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/osmo/lineage.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/osmo/plugin.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/osmo/runtime_bundle.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/osmo/submit.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/osmo/workflow.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/_agent_names.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/collector.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/config.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/constants.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/env_contract.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/fragment.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/fragment_reconstituter.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/node_agent.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/plugin.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/proxy_fragments.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/roar_worker.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/runtime_hooks.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/s3_key_paths.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/submit.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/backends/ray/submit_context.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/_format.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/auth.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/build.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/config.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/dag.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/diff.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/env.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/export_registration_package.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/init.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/init_agents.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/inputs.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/label.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/lineage.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/log.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/login.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/logout.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/osmo.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/pop.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/projects.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/proxy.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/register.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/reproduce.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/reset.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/run.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/scope.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/show.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/status.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/telemetry.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/tracer.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/tui.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/whoami.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/commands/workflow.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/context.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/decorators.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/publish_intent.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/templates/agents/SKILL.md.tmpl +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/cli/templates/agents/agents_section.md.tmpl +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/bootstrap.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/canonical_session.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/digests.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/dto/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/dto/registration.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/exceptions.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/config.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/lineage.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/logger.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/presenter.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/provenance.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/registration.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/repositories.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/reproduction.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/run.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/services.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/telemetry.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/interfaces/vcs.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/label_constants.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/label_origins.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/logging.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/artifact.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/base.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/dag.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/dataset_identifier.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/glaas.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/job.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/lineage.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/run.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/session.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/telemetry.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/models/vcs.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/operation_metadata.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/session_hash.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/step_name.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/tracer_modes.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/core/validation.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/context.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/engine.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/hashing/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/hashing/backend.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/hashing/blake3.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/models.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/query_context.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/repositories/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/repositories/artifact.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/repositories/collection.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/repositories/composite.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/repositories/hash_cache.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/repositories/job.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/repositories/label.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/repositories/session.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/services/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/services/hashing.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/services/job_recording.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/services/lineage.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/services/session.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/db/step_priority.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/cluster/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/cluster/bridge.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/cluster/proxy.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/cluster/proxy_config.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/fragments/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/fragments/lineage.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/fragments/models.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/fragments/reconstitution.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/fragments/sessions.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/fragments/transport.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/framework/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/framework/contract.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/framework/planning.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/framework/registry.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/framework/runtime_imports.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/provenance/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/provenance/assembler.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/provenance/build_pip_collector.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/provenance/build_tool_collector.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/provenance/data_loader.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/provenance/package_collector.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/provenance/process_summarizer.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/provenance/runtime_collector.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/provenance/service.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/recording/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/recording/dataset_identifier.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/recording/dataset_metadata.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/recording/dataset_profile.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/reproduction/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/reproduction/environment_setup.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/reproduction/installers.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/reproduction/pipeline_executor.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/reproduction/pipeline_metadata.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/abi_probe.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/backup.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/driver_entrypoint.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/errors.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/host_execution.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/inject/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/inject/sitecustomize.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/inject/support.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/inject/tracker.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/lazy_install.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/proxy_resource.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/resources.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/signal_handler.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/tracer.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/tracer_backends.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/tracer_banner.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/execution/runtime/worker_bootstrap.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/filters/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/filters/files.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/filters/omit.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/glaas_auth.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/glaas_client.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/bootstrap.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/config/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/config/access.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/config/raw.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/discovery.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/download/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/download/base.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/download/gcs.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/download/get.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/download/http.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/download/noop.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/download/s3.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/git/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/git/base.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/git/context.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/git/provider.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/glaas/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/glaas/auth.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/glaas/client.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/glaas/fragment_streamer.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/glaas/registration/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/glaas/registration/_artifact_ref.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/glaas/registration/artifact.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/glaas/registration/coordinator.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/glaas/registration/job.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/glaas/registration/session.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/glaas/transport.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/registry.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/resolution.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/storage/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/storage/base.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/storage/gcs.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/storage/memory.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/storage/noop.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/storage/publish.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/storage/s3.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/telemetry/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/telemetry/base.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/integrations/telemetry/wandb.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/presenters/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/presenters/console.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/presenters/dag_data_builder.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/presenters/dag_renderer.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/presenters/diff_renderer.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/presenters/formatting.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/presenters/null.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/presenters/run_report.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/presenters/spinner.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/presenters/terminal.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/publish_auth.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/require.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/scope_config.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/telemetry/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/telemetry/_io.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/telemetry/capabilities.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/telemetry/config.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/telemetry/hooks.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/telemetry/install.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/telemetry/paths.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/telemetry/payload.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/telemetry/queue.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/telemetry/stats.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/telemetry/uploader.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/app.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/data.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/screens/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/screens/config_editor.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/screens/label_editor.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/screens/launcher.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/screens/log.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/screens/main.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/screens/search.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/screens/session_picker.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/tmux.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/widgets/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/tui/widgets/detail.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/utils/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/utils/cloud.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/roar/utils/git_url.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/Cargo.lock +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/Cargo.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/crates/artifact-hash-core/Cargo.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/crates/artifact-hash-core/src/lib.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/crates/artifact-hash-py/Cargo.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/crates/artifact-hash-py/src/lib.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/crates/tracer-fd/Cargo.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/crates/tracer-fd/src/lib.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/crates/tracer-runtime/Cargo.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/crates/tracer-runtime/src/lib.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/crates/tracer-schema/Cargo.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/crates/tracer-schema/src/lib.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/services/proxy/Cargo.lock +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/services/proxy/Cargo.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/services/proxy/src/forward.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/services/proxy/src/s3.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/common/Cargo.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/common/src/lib.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/probe/Cargo.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/probe/rust-toolchain.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/probe/src/main.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/userspace/Cargo.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/userspace/build.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/userspace/src/attach.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/userspace/src/bin/roard.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/userspace/src/client.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/userspace/src/daemon.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/userspace/src/events.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/userspace/src/ipc.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/userspace/src/lib.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/userspace/src/main.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ebpf/userspace/src/state.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/preload/Cargo.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/preload/build.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/preload/src/bin/io_fixture.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/preload/src/interpose.c +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/preload/src/ipc.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/preload/src/lib.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/preload/src/main.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/preload/tests/comprehensive.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/preload/tests/standalone.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ptrace/Cargo.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ptrace/rustfmt.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ptrace/src/arch.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ptrace/src/main.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.3}/rust/tracers/ptrace/src/seccomp.rs +0 -0
- {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.
|
|
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
|
|
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
|
|
341
|
-
|
|
|
342
|
-
| `output.track_repo_files`
|
|
343
|
-
| `output.quiet`
|
|
344
|
-
| `filters.ignore_system_reads`
|
|
345
|
-
| `filters.ignore_package_reads`
|
|
346
|
-
| `filters.ignore_torch_cache`
|
|
347
|
-
| `filters.ignore_tmp_files`
|
|
348
|
-
| `glaas.url`
|
|
349
|
-
| `glaas.web_url`
|
|
350
|
-
| `registration.public_by_default` | false
|
|
351
|
-
| `registration.omit.enabled`
|
|
352
|
-
| `hash.primary`
|
|
353
|
-
| `logging.level`
|
|
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
|
|
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
|
|
292
|
-
|
|
|
293
|
-
| `output.track_repo_files`
|
|
294
|
-
| `output.quiet`
|
|
295
|
-
| `filters.ignore_system_reads`
|
|
296
|
-
| `filters.ignore_package_reads`
|
|
297
|
-
| `filters.ignore_torch_cache`
|
|
298
|
-
| `filters.ignore_tmp_files`
|
|
299
|
-
| `glaas.url`
|
|
300
|
-
| `glaas.web_url`
|
|
301
|
-
| `registration.public_by_default` | false
|
|
302
|
-
| `registration.omit.enabled`
|
|
303
|
-
| `hash.primary`
|
|
304
|
-
| `logging.level`
|
|
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
|
|
@@ -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 =
|
|
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 =
|
|
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
|
-
#
|
|
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
|
|
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
|
-
#
|
|
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()
|
|
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
|
|
160
|
-
entity = env.get("WANDB_ENTITY", "")
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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
|
|
|
@@ -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,
|
|
@@ -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:
|