-
released this
2026-09-17 08:11:04 +00:00 | 198 commits to main since this releaseDrag your lanes into order, name them, and read the diff
The lane strip is yours to arrange. Drag a tile onto another to move it there, or press Alt+←/→ with a tile focused — the keyboard path, since HTML5 drag-and-drop has no touch gesture and does not auto-scroll an overflowing strip. The order is a per-viewer preference, not a lane fact: it persists to
localStorage(agenthub.workspace.laneOrder) exactly like the split-view layout beside it and writes nothing server-side, soGET /api/lanesandagenthub laneskeep answering in id order. A lane the stored order has never seen lands at the end rather than wherever a stale index would put it; a stored id whose lane is gone is skipped.A lane can be renamed in place. Click its name in the detail header (a pencil appears on hover) — Enter saves, Escape and clicking away cancel, and an empty name clears the title, which puts the lane's
cwdback in its place. Renaming is display-only: a managed lane's branch name was slugified from its title once, at creation."Lane 23 ·" is gone. The word cost a third of the tile's top row and said nothing; the bare
#23stays, because that number is how the CLI addresses a lane (agenthub stage --lane 23).The uncommitted-files tooltip is now a real panel.
GET /api/lanes/:id/gitreturnsfilesas{path, status, added, deleted}records instead of raw porcelain lines, with per-file line deltas from one extragit diff --numstat HEAD(staged and unstaged together). Hover — or focus, or tap — theN modified · N untrackedtext on a lane card and you get one row per file: the status letter colour-coded, the directory truncated before the filename ever is, and each row's+N −Maligned under a total. It is portalled to the document body, so the Workspace's own scroll box cannot clip it, and it stays open while the pointer travels into it.added/deletedarenullwhere git has no delta to report — an untracked file (its content is deliberately not read off disk; a lane mid-build can have a 100 MB artifact), a binary file, a rename, or a repo with no commit to diff against.Bad input to
PATCH /api/lanes/:idis a 400, not a 500. Renaming made a lane column reachable from a text field for the first time, so the guard is column-wide rather than a special case: any non-scalar patch value (linksexcepted — it is stored as JSON) is rejected withEBADFIELD, and theSQLITE_CONSTRAINTfamily maps to 400 as well. Atitleis trimmed and capped at 200 characters, andnullclears it rather than violating the NOT NULL.Upgrade note
GET /api/lanes/:id/git'sfileschanged shape — it was an array of rawgit status --porcelainstrings and is now an array of records. Anything parsing those strings needs updating; nothing in AgentHub itself did outside the lane card.Downloads