Skip to main content
Every boot mints a node with a generated id (sh-a3f9c21d). --name lets you name it instead — a handle that works everywhere an id does (exec, ls, cd, rm, --worktree) and reads back in the NODE column. It turns a session of boxes and worktrees into something you address by intent, not by hash.
Screens verified by walkthroughs/test_names.py.

Name what you cut

Name a worktree and the branch is cut after it — dabs/<name>, not a random id:
Name a box the same way. --name sets the id the boot line prints:

Reach it by name

The name is a handle everywhere an id is — reach into the box with it:
And the whole session reads as what you called it — names in the NODE column:

cd into a node

dabs cd <node> prints a node’s working place as a bare path, resolved per kind: a project to its source repo, a worktree to its checkout, a box to its own node dir. For a project and a worktree that is the path INFO shows above; for a box it is not — a box has no working directory, so its INFO cell carries the dabs exec … bash line that shells into it, while cd gives you the node dir on the host. A child process cannot move its parent’s shell, so you wrap it:
A prefix resolves the same way every handle does (dabs cd de → the same path), and an ambiguous one is refused rather than guessed. A box’s node dir holds its three spaces as subdirectories — volume/, held/, tmp/ (see Spaces); dabs cd login-fix lands in the worktree’s checkout instead, which is that node’s own held/worktree.

A name is claimed while its work is live

A name held by active work refuses a new claim — it is never silently reused:
Reap the holder first (dabs rm login-fix) and the name frees up; a name left by an inactive node is reclaimed on the fly. Winding a session down reads as plainly as it named it: