Skip to content

Releases: rock3r/atc

v3.3.0

Choose a tag to compare

@github-actions github-actions released this 20 Oct 11:25

What's Changed

  • feat(ops): typed isolated Bazel query profile by @rock3r in #28

Full Changelog: v3.2.0...v3.3.0

v3.2.0

Choose a tag to compare

@github-actions github-actions released this 20 Oct 09:31

What's Changed

  • feat(ops): typed Bazel query and cquery by @rock3r in #27

Full Changelog: v3.1.0...v3.2.0

v3.1.0

Choose a tag to compare

@github-actions github-actions released this 17 Oct 14:13
23934b3

ATC 3.1.0

  • Custom Gradle and Bazel executables (--executable): gradle.tasks and all bazel.* operations (build, test, coverage, run, series, clean) now accept an explicit executable path or command name — including polyglot wrappers without #! shebangs on macOS/Linux such as intellij-community's ./bazel.cmd. (#15, #16)
  • Force-like accountability on custom executables: Specifying executable acts as an override in and by itself (no --force required), carrying the same responsibility notice, overridden reporting, state.forcedRuns / atc-audit.jsonl audit entry, and workspace failure attribution as --force. (#16)
  • Separated leading-dash passthrough arguments: atc exec bazel run (--run-arg) and atc exec ios launch (--launch-arg) now accept separated leading-dash values (--run-arg --verbose, --launch-arg --uitesting) in addition to inline --run-arg=--verbose. (#12, #17)
  • Windows lock and heartbeat hardening: Removed hardware fsync barriers on ephemeral lock files (owner.json, breaker.*.json), added break-claim release retries in releaseLock, and raised the background boot-heartbeat worker lock timeout to eliminate transient lock timeouts on Windows VMs. (#12, #17)

Full changelog: v3.0.0...v3.1.0

v3.0.0

Choose a tag to compare

@github-actions github-actions released this 16 Oct 16:34
ef6e313

ATC 3.0.0

  • No more shell commands. atc exec -- ./gradlew … is gone. You now write atc exec gradle tasks assembleDebug, and ATC builds and runs the real command itself.
  • 34 built-in operations for Gradle, Bazel, Xcode, adb, simctl and emulator snapshots, available from the CLI and as MCP tools.
  • Bad input is rejected before anything runs (exit code 7), with a fix suggested for each problem.
  • Batch plans hold a device only for the steps that need it, and later steps can reuse it.
  • Build coordination is always on: one build per workspace, shared build slots, RAM checks.
  • Built-in --brief output replaces build-brief.
  • Breaking: 2.x exec commands, atc guard, command-array batch plans and coordinateBuilds no longer work. See Upgrading.
Agent sends a request to ATC; ATC validates it, then either runs the real command under the build slot, workspace lock and device lease, or rejects it with exit code 7.

Upgrading

  1. npm install -g @rock3r/atc@3
  2. Update the ATC plugin/hooks in your agent (Claude Code, Codex, Copilot, Cursor, Antigravity, Gemini CLI, Pi). The 2.x hook will keep blocking adb/gradle/xcodebuild calls until you do.
  3. Replace atc exec -- … in prompts, skills and scripts with the new syntax below. Multi-step sequences go in atc batch plans.
  4. Drop atc guard calls and the coordinateBuilds setting.

The migration guide covers every changed command.

Note

Hooks from 2.x may be causing issues until you fully upgrade to 3.x following the steps above.

Batch plans

Steps are now typed operations instead of command arrays, so 2.x plans won't load. Each step can have dependsOn, cwd, env and a claim, and a step can borrow an earlier step's device with "claim": { "reuse": "<step>" }. The device is held only for the steps that use it.

atc batch --file plan.json --validate prints the exact command for each step without running anything.

Three-step batch: assemble runs with no device, install claims a phone, launch reuses it, and the phone is released after launch.

Validation and --force

Bad input is rejected up front, with every problem listed at once:

$ atc exec gradle tasks "bad;name" -x
[atc] Request rejected (2 problems):
  /tasks/0: "bad;name" is not a Gradle task name or path (e.g. assembleDebug, :app:test).
      → If this value is legitimate, re-run with --force --reason "<why>" …
  /tasks/1: "-x" is not a Gradle task name or path (e.g. assembleDebug, :app:test).
      → This value cannot be overridden. Request support at https://github.com/rock3r/atc/issues …

If a Gradle task, Bazel label or Xcode name is legit but unusual, pass --force --reason "<why>". Forced runs show up in atc status --forced. --force can't add new operations, pass values starting with -, or skip claims, locks or RAM checks.

Other changes

  • Exit codes: 7 means ATC rejected the request and ran nothing (2.x used 2 for this; 2 now only means busy). 124 means the operation hit its timeoutSec.
  • --brief on build operations replaces build-brief: full log goes to <stateDir>/logs/, you get a short summary.
  • Build coordination is always on: one build per workspace, a shared pool of build slots, RAM checks. --build, --phase and coordinateBuilds are removed.
  • Hooks now only track the agent session and free its leases when it ends. They no longer inspect shell commands, so a raw adb or ./gradlew call from an agent runs uncoordinated.

atc claim, free, renew, status, snapshot, gc, config and guide are unchanged.

New atc exec syntax

2.x 3.0
atc exec --build -- ./gradlew assembleDebug atc exec gradle tasks assembleDebug
atc exec --claim "--type phone" -- ./gradlew connectedDebugAndroidTest atc exec gradle tasks connectedDebugAndroidTest --claim --type phone
atc exec -- bazel test //app:tests --config=ci atc exec bazel test //app:tests --config ci
atc exec -- xcodebuild -scheme App test atc exec xcode test --scheme App
atc exec -- adb install -r app.apk atc exec android install app.apk --replace
atc exec -- xcrun simctl launch booted com.ex.App atc exec ios launch com.ex.App

There are 34 operations across Gradle, Bazel, Xcode, Android, iOS and emulator snapshots; atc exec --help lists them. MCP clients get the same set as atc_gradle, atc_bazel, atc_xcode, atc_android, atc_ios, atc_snapshot and atc_batch.

Need something that isn't covered? Take a lease with atc claim and run the tool yourself against the leased serial/UDID. ATC just won't coordinate that call.

Full changelog: v2.1.0...v3.0.0

v2.1.0

Choose a tag to compare

@github-actions github-actions released this 12 Oct 22:08

ATC 2.1.0 adds host integrations and fixes device policy and snapshot handling.

Host integrations and command guards

  • Support GitHub Copilot CLI and app plugin hooks and MCP. Thanks to @prof18 in #5.
  • Add Antigravity plugin support. See #7.
  • Apply fail-closed command guards only to standalone tool words. Thanks to @prof18 in #6.

Device policy and snapshots

  • Enforce allowPhysicalDevices and allowedPhysicalSerials during atc claim for Android and iOS. The policy defaults to "never"; it also accepts "explicit" and "always". Disallowed claims return exit code 6 (EPHYSICAL_FORBIDDEN) with guidance. atc config set validates policy values.
  • Prefer offline Android Virtual Devices whose system image exists on disk over candidates with missing images.
  • Detect KO: errors on stdout from adb emu avd snapshot, even when adb exits with code 0.
  • Exclude TCC-protected Simulator caches (Library/Spotlight and Library/Caches/locationd) during APFS snapshot save and load on macOS Sequoia. This lets atc snapshot run in terminals without Full Disk Access.

Contributors

  • @prof18 made their first contribution in #5.

Full changelog

v2.0.0 — Agent Traffic Control (Android + iOS)

Choose a tag to compare

@github-actions github-actions released this 11 Oct 16:15
c649cf5

Highlights in 2.0.0

  • Cross-Platform Android & iOS Leasing: Coordinate Android Virtual Devices (avd:<name>), iOS Simulators (sim:<udid>), and physical Android/Apple devices (serial:<id>) under a single daemonless coordinator (--ios, --android, --platform, --udid, --os, --bundle-id).
  • KMP Dual-Lease Sessions: Hold 1 Android + 1 iOS lease simultaneously in the same agent session with automatic tool-based routing (adb/gradlew vs. xcrun simctl/devicectl/xcodebuild) and --android/--ios disambiguation on renew, free, snapshot, and exec.
  • QEMU & APFS Copy-on-Write Snapshots: Instant APFS (cp -cR) Simulator directory clones alongside QEMU AVD snapshots (atc snapshot list|save|load|delete, --snapshot-load, --snapshot-save, and restoreSnapshotOnFree).
  • Virtual Crash Recovery vs. Physical Fail-Fast: Reserves crashed emulators/simulators for 45 s so the owner can reboot in-place via atc claim without extending the original expiresAtMs, while physical disconnects fail fast (exit 1) after a 15 s USB jitter window.
  • Canonical watch / wear Form-Factor Normalization: Normalizes --type watch and --type wear across Wear OS and watchOS targets.
  • Documentation & Spec Refresh: Illustrated User Guide, Architecture Reference, built-in atc guide topics, and 2.0 Design Spec.

Full Changelog: v1.1.0...v2.0.0

v1.1.0

Choose a tag to compare

@github-actions github-actions released this 11 Oct 00:03

What's Changed

  • feat: post-MVP hardening (Windows descendant persistence, stale AVD dead-PID locks, compound loop rewrites) by @rock3r in #4

Full Changelog: v1.0.0...v1.1.0

v1.0.0

Choose a tag to compare

@rock3r rock3r released this 10 Oct 19:22
c85a5d0

ATC 1.0.0 coordinates Android device leases for agents.

Changes

  • Claim and release Android emulators with exclusive leases. See #1.
  • Improve concurrent claims, rollback after failures, and emulator shutdown on Windows. See #2.

Contributors

  • @rock3r made their first contribution in #1.

Full changelog