Skip to content

feat(device): add dcd device inspect, screenshot, run, logs and open - #232

Merged
riglar merged 4 commits into
feature/agent-devicesfrom
feat/device-inspect-run
Oct 19, 2026
Merged

riglar merged 4 commits into
feature/agent-devicesfrom
feat/device-inspect-run

Conversation

@riglar

@riglar riglar commented Oct 19, 2026

Copy link
Copy Markdown
Contributor

Stacked on #231. Stage 3.3 of the Agent Devices CLI (dcd docs/device-v1-plan.md).

Commands

dcd device inspect [id]
dcd device screenshot [id] [-o file]
dcd device run [id] <flow.yaml> | --yaml <flow> [--env KEY=VALUE ...]
dcd device logs [id] [--lines 200] [--follow]
dcd device open [id]
  • inspect prints the compact screen: each element with its text, id, label or hint, and its bounds. --json gives the API's object as is.
  • screenshot saves the frame to a file (default ./<session>-<time>.jpg) and reports the path. It never writes image bytes to stdout.
  • run sends one whole flow, from a file or --yaml. --env can be given more than once; the API seals the values. If the flow outlasts the API's ~110s wait, the CLI polls the command until it is done. A failed flow exits 2 and still prints the output.
  • logs prints the app's recent log lines. --follow polls every 3s and prints only new lines, until the session ends. It can't be combined with --json.
  • open opens the monitor in the browser at a terminal. In a script it only prints the URL.

Not in this PR

  • Running a directory of flows. The API's run takes flowUploadId, but no endpoint creates a flow upload on its own: the upload row is made only when a test run is submitted. That needs an API change first. Until then, run <dir> is refused with a clear message.
  • logs --since (from the original spec). The API only takes a line count.

Other changes

openBrowser moves from login.ts to src/utils/browser.ts, so device open can use it. citty keeps only the last value of a repeated flag, so --env is read from argv.

Tests

12 more tests in test/unit/device-command.test.ts: request bodies, the poll of a running flow, failed-flow exit code, saved screenshots, the log-overlap logic and the flag parsing. pnpm lint, pnpm typecheck, pnpm test:unit (384 passing) and pnpm build pass.

🤖 Generated with Claude Code

https://claude.ai/code/session_018tQfgpTsA9UhcopKoDezUA

riglar and others added 2 commits October 19, 2026 10:30
…ch and models

The first stages of the Agent Devices CLI (dcd plan 3.1 and 3.2).

- --json prints one envelope, {ok, session, data, error}, on success
  and on failure.
- Exit codes: 0 ok, 1 usage, 2 failed, 3 limit, 4 session ended or
  not found.
- The session id may be left out when exactly one session is open.
- start --app uploads a local build first; an https URL goes to the
  API's install-from-URL.
- Progress goes to stderr, with no spinner unless at a terminal.

Hidden from dcd --help until the API reaches production.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018tQfgpTsA9UhcopKoDezUA
Stage 3.3 of the Agent Devices CLI.

- inspect prints the compact screen; screenshot saves the frame to a
  file and reports its path.
- run sends one flow (a file or --yaml) with optional --env KEY=VALUE,
  and polls a flow that outlasts the API's wait. A failed flow exits 2.
- logs prints the app's recent log lines; --follow keeps printing new
  ones until the session ends.
- open opens the monitor at a terminal, and prints its URL otherwise.

Running a directory of flows needs an API change first and is refused
for now. openBrowser moves out of login.ts so device can share it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018tQfgpTsA9UhcopKoDezUA
Comment thread src/commands/device.ts Outdated
logs --follow, a long run and start --wait reused the token resolved at
the start. A dcd login access token lasts about an hour, so a poll past
that failed with an auth error. Each poll now calls refreshAuth first;
an API key is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018tQfgpTsA9UhcopKoDezUA
Base automatically changed from feat/device-commands to feature/agent-devices October 19, 2026 11:21
…/device-inspect-run

# Conflicts:
#	src/commands/device.ts
#	src/gateways/device-gateway.ts
#	src/types/domain/device-session.types.ts
#	test/unit/device-command.test.ts
@claude

claude Bot commented Oct 19, 2026

Copy link
Copy Markdown

Code review

No issues found. Checked for bugs and CLAUDE.md compliance.

@riglar
riglar merged commit 8460a74 into feature/agent-devices Oct 19, 2026
3 checks passed
@riglar
riglar deleted the feat/device-inspect-run branch October 19, 2026 11:37
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.

1 participant