feat(aterm): add the machine twin of --list (#1253) #1269

Merged
coilyco-ops merged 1 commit from aos/claude/mu55-list-json into main 2026-08-26 06:36:49 +00:00
Member

Closes #1253, reduced to the JSON twin alone. Completion shipped in #1243 (aterm/completion.go, completion_test.go, shell/common.sh registration), so re-implementing it would have been the trap the re-verification comment warned about.

What changed

aterm --list --json emits contract aterm.roster.v1:

{
  "format": "aterm.roster.v1",
  "roles": [
    {
      "slug": "platform",
      "display_name": "Agentic Platform Engineer",
      "purpose": "Build and land the foundational software the rest of the estate is built on.",
      "favorite_color": "#9c8b31",
      "identity": { "name": "Angie", "pronouns": "she" },
      "launchable": true,
      "seats": [ { "key": "claude", "harness": "claude", "name": "Angie", "pronouns": "she", "tier": "frontier" } ]
    }
  ]
}

It is a projection rather than a relay. agent-compose catalog roles --json already exists, and what it does not express is which catalogue seats agent-compose launch can start. listRoster filters seats to the native set and adds launchable, so platform comes back with claude and codex and not openhands. A caller scripting aterm reads one document instead of re-deriving that rule.

The human form stays the default, unchanged.

The --json flag

--json is declared once and accepted with --list and with --dry-run, so #1254 lands its half without moving the flag. On a launch it refuses:

$ aterm --json platform claude
aterm: --json applies to --list and --dry-run

A flag that silently does nothing is worse than one that says so, and the test asserts nothing spawns on that path.

Verification

  • just aterm-fmt, just aterm-lint, just aterm-test clean
  • pre-commit run clean on every touched file
  • new list_test.go: the projection drops non-native seats and keeps every role, launchable tracks the seat list, the JSON round-trips, the default --list stays human, and the CLI-level run covers both the JSON path and the guard
  • exercised against live agent-compose v2.54.0
Closes #1253, reduced to the JSON twin alone. Completion shipped in #1243 (`aterm/completion.go`, `completion_test.go`, `shell/common.sh` registration), so re-implementing it would have been the trap the re-verification comment warned about. ## What changed `aterm --list --json` emits contract `aterm.roster.v1`: ```json { "format": "aterm.roster.v1", "roles": [ { "slug": "platform", "display_name": "Agentic Platform Engineer", "purpose": "Build and land the foundational software the rest of the estate is built on.", "favorite_color": "#9c8b31", "identity": { "name": "Angie", "pronouns": "she" }, "launchable": true, "seats": [ { "key": "claude", "harness": "claude", "name": "Angie", "pronouns": "she", "tier": "frontier" } ] } ] } ``` It is a projection rather than a relay. `agent-compose catalog roles --json` already exists, and what it does not express is which catalogue seats `agent-compose launch` can start. `listRoster` filters `seats` to the native set and adds `launchable`, so `platform` comes back with claude and codex and not `openhands`. A caller scripting aterm reads one document instead of re-deriving that rule. The human form stays the default, unchanged. ## The `--json` flag `--json` is declared once and accepted with `--list` and with `--dry-run`, so #1254 lands its half without moving the flag. On a launch it refuses: ``` $ aterm --json platform claude aterm: --json applies to --list and --dry-run ``` A flag that silently does nothing is worse than one that says so, and the test asserts nothing spawns on that path. ## Verification * `just aterm-fmt`, `just aterm-lint`, `just aterm-test` clean * `pre-commit run` clean on every touched file * new `list_test.go`: the projection drops non-native seats and keeps every role, `launchable` tracks the seat list, the JSON round-trips, the default `--list` stays human, and the CLI-level run covers both the JSON path and the guard * exercised against live `agent-compose v2.54.0`
feat(aterm): add the machine twin of --list (#1253)
All checks were successful
ci / aos-eval-tests (pull_request) Successful in 7s
ci / ward-doctor (pull_request) Successful in 8s
ci / aos-cli-tests (pull_request) Successful in 32s
ci / gate (pull_request) Successful in 55s
9e584ecc31
Completion already shipped in #1243, so the remaining scope was the JSON form.

`writeRoster` was lipgloss-only, and a launcher or a dashboard had nothing to
read. `--list --json` emits `aterm.roster.v1`: every live role with its display
name, purpose, favorite color, identity, and a `launchable` flag, carrying only
the seats `agent-compose launch` can actually start. That projection is what
aterm knows and the raw catalogue does not express, so it relays nothing.

The human form stays the default. `--json` on a launch refuses rather than
doing nothing, and is already accepted with `--dry-run`, which #1254 fills in.

Closes #1253

Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Agent-Role: platform
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-flight-deck/agentic-os!1269
No description provided.