fix(coding-agent): anchored todo HUD with borders and progress header#3215
Open
roboomp wants to merge 2 commits into
Open
fix(coding-agent): anchored todo HUD with borders and progress header#3215roboomp wants to merge 2 commits into
roboomp wants to merge 2 commits into
Conversation
The sticky panel above the editor rendered as ambient text: Todos └ I. Foundation └ ☐ ... so users perceived the bordered tool-result block in chat as the only todo display. Once that result scrolled into history they concluded the list 'isn't anchored'. Bracket the panel with dim horizontal rules (matching BtwPanel / OmfgPanel) and inline progress + active-phase pointer in the header (`Todos · 2/7 done · I/III Foundation`) so the persistent HUD reads as a real panel and stays self-describing without scrolling back. Fixes #3213
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Repro
Create a multi-phase todo list with the
todotool. Watch the bordered tool-result block scroll into history as the agent keeps working. The small sticky panel above the editor (#renderTodoList) renders as plain bold text — no border, no separator — and is easy to miss next to the editor and status line. Users perceive the bordered chat block as the only todo display and conclude the list "isn't anchored".Cause
InteractiveMode.#renderTodoList(packages/coding-agent/src/modes/interactive-mode.ts:1628) emits a singleTextnode with only a leading blank line and a bold "Todos" header above the task tree. The container is in the right position (betweenstatusContainerand the editor), but the rendering has no visual chrome that says "persistent HUD". In a busy transcript that small block blends into surrounding UI and gets visually lost, so users reach for the bordered tool-result block inside the chat (which scrolls into scrollback).Fix
DynamicBorderlines (sametheme.fg("dim", …)color the existingBtwPanel/OmfgPaneluse). The HUD now reads as a real anchored panel rather than ambient status text.Todos · 2/7 done · I/III Foundation(collapsed multi-phase) orTodos · 0/2 done · Tasks(single phase) orTodos · 2/7 done(expanded). The header is self-describing so users no longer need to scroll back to the bordered tool-result block to check status.After:
Verification
Added three regression tests in
packages/coding-agent/test/interactive-mode-todo-clear.test.tsthat pin the new contract:brackets the panel with horizontal rules and a progress header— asserts top/bottom rows are full-width─rules and the header contains progress (1/4 done) and active-phase pointer (I/II Foundation).renders nothing when there are no todos— asserts the container collapses to zero lines when there are no phases.omits the phase pointer in the header for a single-phase list— asserts single-phase mode shows the phase name but noI/Ipointer.bun test test/tools/todo.test.ts test/interactive-mode-todo-clear.test.ts test/acp-builtins.test.ts test/modes/controllers/todo-command-controller.test.ts→ 124 pass, 0 fail.lsp diagnosticson the edited source + test file → clean.Fixes #3213