Skip to content

feat: add apps list, orgs list, deployments list subcommands#94

Merged
crowlKats merged 2 commits into
mainfrom
feat/agent-list-commands
May 28, 2026
Merged

feat: add apps list, orgs list, deployments list subcommands#94
crowlKats merged 2 commits into
mainfrom
feat/agent-list-commands

Conversation

@crowlbot
Copy link
Copy Markdown
Contributor

Summary

Stacked on #93 (which is stacked on #92#91). Adds the three list/inspect commands an agent typically needs to navigate the resource hierarchy without having seen the dashboard.

What's in this PR

  • `deno deploy apps list [--limit N] [--cursor C]` — paginated list of applications in the current organization. JSON mode emits `{ items: [{ id, slug, createdAt, updatedAt, layers }], nextCursor, org }`. Uses the existing `apps.listByPage` tRPC procedure.
  • `deno deploy orgs list` — organizations the current token can access. JSON mode emits `[{ id, slug, name, plan }]`. Uses `orgs.list`.
  • `deno deploy deployments list [--app A] [--limit N] [--cursor C] [--status S]` — paginated list of revisions for an app. `--status` accepts `skipped|queued|building|succeeded|failed` and is forwarded to the backend filter (any other value comes back as a backend USAGE error through the global envelope). JSON mode emits `{ items: [{ id, status, prod, createdAt, updatedAt, lastStep }], nextCursor, org, app }`.

All three honor the global `--json` flag (human tables via `tablePrinter` otherwise), and the global error envelope from #91 maps any NOT_AUTHENTICATED/NOT_FOUND/NETWORK responses without per-command code.

Test plan

  • `deno fmt` clean
  • `deno lint` clean
  • `deno check main.ts` — pre-existing TS/Cliffy errors only (the same `string[]`-instead-of-`string` option typing that already affects `env.ts`, `database.ts`, `sandbox/mod.ts`, etc.).
  • `deno test -A tests/agent.test.ts tests/create.test.ts` — 23/23 pass.
  • Verified `deno deploy apps --help` and `deno deploy deployments list --help` print expected flag layout.
  • tRPC payload shapes verified against the procedures in `denoland/deployng` (`apps.listByPage`, `orgs.list`, `revisions.listByPage`).

Notes

`apps`/`orgs`/`deployments` are introduced as new top-level subcommands rather than extending the existing `switch` or `logs` patterns, because each has its own pagination/filter shape and the help surface stays cleaner that way.

🤖 Generated with Claude Code

@crowlbot crowlbot force-pushed the feat/agent-json-outputs branch from dabbbef to 3594eb9 Compare May 13, 2026 13:53
@crowlbot crowlbot force-pushed the feat/agent-list-commands branch from 3b79e96 to 83f452e Compare May 13, 2026 13:55
@crowlKats crowlKats force-pushed the feat/agent-json-outputs branch from 3594eb9 to 9494816 Compare May 28, 2026 09:33
Base automatically changed from feat/agent-json-outputs to main May 28, 2026 09:36
Make the CLI usable by AI agents and CI bots:

- Global `--json` flag emits a single JSON object/array on stdout and a
  structured `{ error: { code, message, hint, traceId } }` envelope on
  stderr. Suppresses spinners, progress bars, and ANSI color so output
  pipes cleanly into `jq`. Wired into `publish` (final result with
  revisionId, URL, status, timelines) and `create` (including
  `--dry-run`, which now emits the resolved build config as JSON).

- Global `-y, --non-interactive, --yes` flag makes `requireInteractive()`
  fail fast with a clear `NON_INTERACTIVE_REQUIRED` error instead of
  hanging on stdin, even on a TTY. Same flag on both `deploy` and
  `sandbox` roots.

- `ExitCode` enum (OK=0, GENERIC=1, USAGE=2, AUTH=3, NOT_FOUND=4,
  CONFLICT=5, NETWORK=6). `error()` accepts `{ code, errorCode, hint,
  response }` and exits with the matching numeric code. tRPC errors are
  mapped via `mapTrpcError()`: 401/403/NOT_AUTHENTICATED/TOKEN_EXPIRED →
  AUTH, 404 → NOT_FOUND, 409 → CONFLICT, 5xx → NETWORK. Invalid-token
  path emits `AUTH_INVALID_TOKEN` with an explicit hint pointing at
  `DENO_DEPLOY_TOKEN` rather than retrying through a browser.

- Move the keychain-unavailable warning from stdout to stderr so it
  doesn't pollute machine-readable output.

Adds `tests/agent.test.ts` covering JSON dry-run, non-interactive
short-circuit, `AUTH_INVALID_TOKEN` envelope, and the `-y` alias.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@crowlKats crowlKats force-pushed the feat/agent-list-commands branch 2 times, most recently from 9a106de to 141abc7 Compare May 28, 2026 09:48
Fourth slice of the agent-ergonomics series. Adds the three list/inspect
commands an agent typically needs to navigate the resource hierarchy:

- `deno deploy apps list [--limit N] [--cursor C]` — paginated apps in
  the current org. JSON: `{ items, nextCursor, org }`. Uses
  `apps.listByPage`.
- `deno deploy orgs list` — orgs reachable by the token. JSON:
  `[{ id, slug, name, plan }]`. Uses `orgs.list`.
- `deno deploy deployments list [--app A] [--limit N] [--cursor C] [--status S]`
  — paginated revisions. JSON: `{ items, nextCursor, org, app }`.
  Uses `revisions.listByPage`.

All three honor the global `--json` flag and the global error envelope
from the foundation PR.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@crowlKats crowlKats force-pushed the feat/agent-list-commands branch from 141abc7 to 26b8cd0 Compare May 28, 2026 09:54
@crowlKats crowlKats merged commit 73b65b9 into main May 28, 2026
5 of 6 checks passed
@crowlKats crowlKats deleted the feat/agent-list-commands branch May 28, 2026 10:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants