CLI Reference

Project Verbs

Reference for list and clean — the verbs that take a project but no ref.

These verbs take a project and no ref:

uxd <project> <verb> [flags]

list

The project's workspaces. list is what a bare uxd <project> falls back to when there is no TTY.

uxd my-project list
SLUG        KIND    BRANCH      STATUS  PORT  AGE  LAST USED
feat-login  branch  feat/login  clean   3053  1m   0m
ColumnMeaning
SLUGThe workspace identifier — what clean and the workspace verbs accept
KINDbranch, pr, commit, or path (adopted)
BRANCHThe checked-out branch, when there is one
STATUSclean, dirty, missing — or, for PRs, the PR state plus a CI mark
PORTThe first allocated port
AGETime since the workspace was created
LAST USEDTime since a uxd command last touched it
FlagEffect
--duAdd a disk-usage column
--jsonMachine-readable array — deterministic and offline (no gh refresh)
uxd my-project list --json
[{"slug":"feat-login","ref":"feat/login","kind":"branch","branch":"feat/login","path":"~/dev/uxd/my-project/trees/feat-login","adopted":false,"ports":[3053],"createdAt":"2026-07-25T06:00:28.086Z","lastUsedAt":"2026-07-25T06:00:28.148Z","dirty":false,"missing":false}]
For PR workspaces, STATUS shows the PR state plus a CI mark ( pass, fail), refreshed from gh stale-while-revalidate and bounded to about two seconds. The table always renders, even when gh is slow or absent.

With no workspaces:

→ no workspaces for 'my-project'

clean

Removes workspaces by explicit slug or by filter. Explicit slugs and filters cannot be combined.

uxd my-project clean feat-login
uxd my-project clean --all
FilterRemoves
--allEvery workspace for the project
--mergedBranches merged into the default branch (git-only check)
--closedWorkspaces whose PR is closed or merged (prefers gh)
--older-than <dur>Workspaces idle for at least <dur> (s/m/h/d/w)

Filters intersect: --merged --older-than 7d removes only workspaces that are both.

FlagEffect
--forceRemove dirty worktrees too (discards changes)
--include-adoptedInclude workspaces adopted from a path
--prune-stateDrop state entries whose worktree is gone
--yesSkip the confirmation prompt
--dry-runPrint the plan and stop

clean always prints a plan first:

→ plan:
  feat-login (clean, 16 KB)

and then, once approved, the removed slugs and the space reclaimed:

feat-login
→ freed 16 KB

Dirty worktrees are skipped with a warning rather than removed:

warning: skipping feat-login: worktree is dirty (use --force)

Without confirmation on a non-interactive terminal:

error(E_USAGE): refusing to remove 1 workspace(s) without confirmation
hint: pass --yes for non-interactive use

See Clean up workspaces for the full workflow.