Skip to content

feat(agents): show the task board as kanban columns - #1548

Open
Gaurav-Gosain wants to merge 1 commit into
mainfrom
feat/task-kanban-board
Open

Gaurav-Gosain wants to merge 1 commit into
mainfrom
feat/task-kanban-board

Conversation

@Gaurav-Gosain

Copy link
Copy Markdown
Owner

The task board in the agents view (b) now shows one column per stage, side by side, like a classic kanban board. The list it showed before is still there behind B.

What it does

  • One column per stage that [tasks] stages shows, in stage order, with the count in each head. A column with no card, and a folded column, take only the width of their head, so the columns with cards get the room.
  • A card shows its title (two lines at most), its holder's state mark and name, or Blocked and why, or free, and its id and age on the right.
  • The cursor's card carries the accent bar and the cursor ground, through the same RowState and 16-colour mark the list uses. All colours come from the cockpit look, so there are no literals.
  • Done starts folded, as in the list. F or a click on the head opens it, and open it lists the newest card first.
  • When the columns do not fit, the board shows the run of columns round the cursor, and the head row counts the hidden ones on each side (3›). Each column scrolls on its own and keeps the cursor's card in view. Under 80 columns the board falls back to the list.

Keys and mouse

  • h l and the arrows go between columns. j k go between cards.
  • H L, or shift+left shift+right, move the card to the stage before or after, through set-task-stage. They work in the list too.
  • enter goes to the holder's pane. On a free card it opens the New agent sheet on the card, which is what n on a card did in the list.
  • n adds a card to the column under the cursor, in the session you are attached to, through add-task.
  • t takes a card, as before. B switches between columns and list, and tuios keeps the choice in the state file.
  • A click selects a card, a double click goes to the pane, and a drag onto another column moves the card there. During the drag the target column lights up and the card's title follows the pointer.

I made the columns the default, because they read well at 100 columns and wider. The list stays one key away.

Proof

I extended TestTaskBoardGroupsCardsByStage and did not add a new test. It now checks the following:

  • The board opens as columns in stage order, and B switches to the list and back.
  • L then H move t4 to review and back. h with shift+right and shift+left move t2. A drag moves t6 onto the empty Review column and back onto Todo.
  • Each move is read back from tuios task ls --json.
  • Under 80 columns the board is the list.
  • With [tasks] stages set, only the stages it names have columns.

The negative controls are in NEGATIVE_CONTROLS.md. With kanbanStep cut, L leaves t4 in verify. With the drop not calling set-task-stage, the drag leaves t6 in todo. Both fail the test, and the fixed build passes.

Idle cost: no timer. Every redraw comes from a key, a click, a pointer move during a drag, or a task event. The frame cache key is the same as before, and a drag or the new-card line marks the frame transient only while it is open.

Binary size, linux/amd64, release flags: 46,919,840 on main, 46,997,664 here, so +77,824 bytes. That leaves 2,336 bytes under the 47,000,000 ceiling. darwin/arm64 is 43,774,002. I replaced a generic stable sort with slices.Reverse to get under, but the room left is small.

just check --changed passes. fix and deadcode only report.

Frames

Columns at 200x55, after a key move, and during a drag:

Columns at 200x55
After L moved t4 to Review
A card dragged onto Review

At 160x45 and 100x30, dark, light and 16 colours:

160x45 dark
160x45 light
160x45 16 colours
100x30 dark
100x30 light
100x30 16 colours

task-board-columns-100x30-16

task-board-columns-100x30-dark

task-board-columns-100x30-light

task-board-columns-160x45-16

task-board-columns-160x45-dark

task-board-columns-160x45-light

task-board-columns-200x55

task-board-columns-drag-200x55

task-board-columns-moved-200x55

The board in the agents view now shows one column per stage, side by
side, with a count in each head. Cards show the title, the holder's
mark and name or why they are blocked, and the id and age.

h and l move between columns, j and k between cards. H and L (or
shift with the arrows) move the card a stage through set-task-stage,
in the list too. enter goes to the holder's pane, or starts an agent
on a free card. n adds a card to the column with add-task. A card
dragged onto another column moves to that stage.

Empty and folded columns take only the width of their head. Done
starts folded and lists the newest first. When the columns do not fit,
the board shows the columns round the cursor and counts the rest.
Under 80 columns, and after B, the board is the list as before. The
choice of list or columns is kept in the state file.

TestTaskBoardGroupsCardsByStage covers the columns, the key moves and
the drag, and saves frames at 160x45 and 100x30, dark, light and at
16 colours.
@github-actions

github-actions Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

Binary size

target this change main change room under the ceiling
darwin/arm64 43790642 bytes 43707250 bytes +83392 bytes (+81.4 KiB) 3209358 bytes
linux/amd64 46997664 bytes 46919840 bytes +77824 bytes (+76.0 KiB) 2336 bytes

The ceiling is 47000000 bytes for each target. Main's size is from main at f75ac39 (https://github.com/Gaurav-Gosain/tuios/actions/runs/41796786838).

State the size cost in the pull request body. CI fails only above the ceiling.

@Gaurav-Gosain
Gaurav-Gosain marked this pull request as ready for review November 4, 2026 09:02
Gaurav-Gosain added a commit that referenced this pull request Nov 4, 2026
…kpit

The cockpit's tabs beside the thread:

- Changes: the agent's worktree diff (review-diff) by file, highlighted,
  with its review notes; Add a note writes one (review-note) and Send
  notes to the agent hands them over (send-review).
- Checkpoints: the agent's turns (list-checkpoints), newest first, with
  the diff of the one chosen (checkpoint-diff); Restore takes a second
  click and runs restore-checkpoint.
- Mail: the mail to and from the agent (read-agent-messages, peeked, so
  nothing is marked read), its text as Markdown, Reply as you, and mail
  to the agent as the person (send-agent-message). Held mail passes on
  from the row's menu or with p (release-agent-message).
- Board: the session's task cards as kanban columns, one per stage, as
  tuios PR #1548 draws them in the TUI. Done starts folded. A card shows
  its title, its holder's state and name, Blocked, or free, and its id
  and age. h l j k move, H L or Shift with the arrows move the card a
  stage (set-task-stage), Enter goes to the holder, n adds a card
  (add-task), t gives the card to the selected agent (claim-task). A
  click selects a card and the selected card drags to another column.

Each tab reads the daemon when it opens and on the daemon's mail and task
events, never on a timer. m, b and v open Mail, Board and Changes.

Menu builders no longer change state: MyGo runs them to collect
shortcuts too, which moved the selection. A click or key that changes
state on a plain element asks for another build, which showed the change
a frame late before.
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