hud sync pushes those tasks to the platform. This makes them available for team members, leaderboards, and QA pipelines.
Typical workflow
hud sync tasks
| Argument | Default | Description |
|---|---|---|
taskset | From .hud/config.json | Taskset name or ID |
source | . (current directory) | Python file, directory, or JSON/JSONL |
| Flag | Description |
|---|---|
--task <slug> | Only sync one task |
--exclude <slug> | Exclude a task (repeatable) |
--yes / -y | Skip confirmation (CI mode) |
--dry-run | Show plan without uploading |
--force | Upload all tasks, skip diff |
--id <uuid> | Taskset UUID directly (skip name resolution) |
.hud/config.json. Subsequent hud sync tasks (without a name) re-syncs to the same taskset. Passing a different name switches the target and updates the stored ID.
How tasks are discovered
When pointing at a.py file, the CLI imports it and finds all Task instances. For .json or .jsonl files, it loads task dicts directly.
When pointing at a directory (the default), the CLI scans in this order:
tasks.pyortask.pyin the root*/task.pyin immediate subdirectories (one task file per subdirectory)- Any other
.pyfile in the root (skippingenv.py,conftest.py,setup.py,__init__.py,__main__.py)
What happens during sync
- Collects
Taskobjects from your source - Validates slugs, scenarios, and checks for duplicates
- Verifies your
Environment("...")name matches the deployed environment - Fetches the remote taskset and computes a diff
- Shows a plan (create / update / unchanged) and asks for confirmation
- Uploads changes
Diff behavior
Tasks are matched by slug. The CLI computes a signature from each task’s scenario name, args, validation, and agent_config. Only tasks whose signature changed are uploaded. Renaming your environment (the prefix before: in scenario names) does not trigger updates. If you rename a slug, the CLI detects possible renames by matching signatures and suggests them.
Tasks that exist on the platform but not locally are left alone.
hud sync env
Link a local directory to an existing platform environment. Use this when the environment was deployed separately (e.g., via GitHub integration) and you want to sync tasks against it.
| Argument | Default | Description |
|---|---|---|
name | Interactive picker | Environment name or ID |
directory | . | Local directory to link |
.hud/config.json, lists its registered scenarios, and checks that local Environment("...") references match the deployed name.
If you deploy with hud deploy, you don’t need hud sync env — the registry ID is stored automatically.
hud sync (shorthand)
Running hud sync without a subcommand re-syncs tasks using the stored configuration:
hud sync tasks <name> to have stored a taskset ID.
Configuration
hud sync stores IDs in .hud/config.json:
registryId— set byhud deployorhud sync envtasksetId— set byhud sync tasksafter first successful sync
Environment name reconciliation
When syncing tasks, the CLI checks that your localEnvironment("...") name matches the deployed environment. If they differ, it offers to update your source files: