Let the human answer the agent from the board: tick bullets, reply to questions, mid-turn hook - #30
Conversation
The viewer selects an item with ] and [, then writes one line change back: x ticks a checklist item, 1-9/y/n/d answer an Ask: prompt, and d moves an item to Done. M turns on mouse mode for clicks. Writes locate the item by exact text and swap the file in by rename. sidecar diff names a tick or an answer so the agent reads the decision on its next turn. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A click on the status bar row no longer maps to content below the fold. The note now says what the agent does with an answer, and lists Ask: among the lines an entry may carry. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Review The design is solid overall. a. The selection follows an index, not an item, so the conflict check is bypassed after a reload
Concrete case: the user presses Fix: store the selected item's section label and b. The README says "the viewer still opens a symlinked board that already exists." Fix: resolve the link before writing, e.g. Minor
Once (a) and (b) are addressed, this looks good to me. |
d01769b to
f23e38d
Compare
ReviewThe core of this is solid. There are two real issues. a) The selection follows an index, not an item, so an agent edit can make the next keypress act on a different item. b) Nits
|
|
Overall this is well scoped. The write path is clean: it writes a temp file in the same dir, chmods, renames, and the watcher only matches the basename, so Must fix: selection is by index, so it can land on the wrong item after an agent edit
Scenario: select Fix: store the selection's identity, e.g. Should fix
Nits
|
a opens a free-text answer in the status bar for any item with an Ask: line;
an Ask: with no options is an open question. } and { jump between unanswered
questions, and the status bar counts how many are waiting.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The board keeps the plain "Ask: ✅ Done | ❌ No" line; the viewer renders each option as a shaded button, plus a [ ✎ ] button for a free-text answer, and ticks the recorded answer. In mouse mode a click on a button answers. Letter keys match an option by its letters, so an emoji option like ✅ Done still answers to d. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
ReviewOverall this is well structured. Each edit is a pure transform, the file is re-read and matched by label and exact a.
|
|
Review The core of this PR is solid. Two correctness problems should be fixed before merge: a) The selection is kept by index across reloads, so an action can hit the wrong item
It is most likely during free-text typing ( The Fix: remember the selected item's identity (section label + b) The README says the viewer still opens a symlinked board that already exists. Fix: resolve the path first: if real, err := filepath.EvalSymlinks(path); err == nil {
path = real
}Then create the temp file in Minor
Rendering style has no regressions: chips are inline code spans with the existing hex |
Every item outside Done and Shipped gets [ ✅ Done ] and [ 💬 Reply ] below it. Reply takes free text, pre-filled with the current reply, and lands as an Answer: line; an agent's narrative Ask: line shows as the question. Mouse capture is on by default (--no-mouse and M release it). A new PostToolUse hook, sidecar diff --mid-turn, hands a reply to the agent after its next tool call. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
ReviewThis is a solid feature overall. The edit path re-reads the file, matches the item by its exact text, and writes a temp file then renames it, which is the right design. The watcher ignores the a. The selection is stored by index, so a reply or Done can land on the wrong item (high)
Scenario: the human clicks Reply on item 3 and starts typing. The agent inserts a new item above it and the watcher reloads. The human presses Enter, and the Fix: when an item is selected, store its section label and b.
|
|
Review This is a well-built feature. Edits re-read the board, match the item by exact text, refuse when the item changed, and swap the file in by rename. The watcher still only reacts to the board's own filename, so the a. The button restyle can make a line wider than the pane (hard requirement) b. c. The Done button is misread when an Ask option is also "✅ Done" d. e. Stale comment Minor
Overall this is close to mergeable. Items a and b need fixing first; c and d are worth fixing in this PR too. |
Buttons rest as grey blocks and turn solid under the pointer. They are drawn after rendering, on their own line, so glamour can neither fuse a row onto an item's last line nor wrap one mid-label; a test now clicks every button at pane widths from 24 to 200. Reply is typed under its item. u, or a click on the status message, undoes the last write, and refuses if the file changed since. Every click reports its outcome in the status bar. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
ReviewThe feature holds together, and Selection is kept by index, so a reply can land on the wrong item (high)
The mouse path has the same problem: a click on another item while Fix: keep the selected item's A button row can be wider than the pane
Fix: truncate a chip's label with Viewer writes replace a symlinked board with a regular fileThe README says the viewer "still opens a symlinked board that already exists". A stray click on the status bar undoes the last replyIn
|
…ound A blank line now separates every item, buttons rest as grey text and get a background only under the pointer, and the reply line says how to send it. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
ReviewOverall this is well built. Edits are located by section label plus exact item text and swapped in by rename, and a conflicting edit is refused. The watcher is untouched: it filters on basename, so the Must fix: option buttons can exceed the pane width
Should fix
Minor
Spacing (one inserted blank, only when the next line isn't blank), hex-only colors, scroll preservation through |
…estion inline Drops the button rows, the emoji, the choice options, and every viewer-side move between sections — the agent owns the board's motion. A click on a bullet turns it into ✓ (- [x]) and back; an Ask: line shows as a ? question that opens a reply under the item; the reply shows as ↳. Whatever is clickable turns solid under the pointer, and items are spaced one blank line apart. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
ReviewScope is large but coherent. a. Undo can clobber the agent's edit (TOCTOU in
|
… move items with j/k The question and reply now draw as indented blocks that wrap with a hanging indent in one color; a click or hover on any of their lines counts. The bullet target is four cells wide and paints as such under the pointer. j and k move between items (and scroll a board with none), space ticks, enter replies, and tab returns to moving between sections. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Review
a) A reply can land on the wrong item (the worst one)The selection is stored only as
Fix: When you select an item or open a reply, capture b)
|
…ing it The viewer finds the OSC 8 link under the pointer in the rendered line, paints it on hover, shows its full address in the status bar, and opens it on a click. Only http, https, and mailto open. Clicks are held while a reply is being typed. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
ReviewThe core is solid. A few real problems. a)
|
The viewer becomes the human's channel back to the agent. The agent owns the board and every move on it; the human says "I did this" and answers questions, and a hook hands both to the agent mid-turn.
What the human does
•and it becomes✓(the file gets- [x]); click again to undo.xdoes the same on the selected item.Ask:line is drawn as? …. Click it, or pressa, and a reply line opens under the item; Enter writes it as anAnswer:line, drawn↳ …. The reply line is pre-filled with the current reply and saystype your reply… ⏎ send · esc cancelwhen empty.u, or a click on the status message, undoes the last change and refuses if the file changed since. Every click reports its outcome in the status bar.Mtoggles,--no-mousestarts without it); Shift-drag (Option in iTerm2) still selects text. Keys:]/[select,xticks,areplies,}/{jump between open questions.Delivery
sidecar diff --mid-turnruns as a PostToolUse hook and prints hook JSON only when the human replied or ticked; it stays silent for anything else, including the agent's own edits, and advances the snapshot only when it reported.sidecar initinstalls it beside the per-prompt hook, and the CLAUDE.md note teaches agents the convention.sidecar diffreportsedited 🧠: "Title" — replied "…",— ticked, or— unticked.Writes
Each action re-reads the file, finds the item by section label and exact text, applies one text transform, and swaps the file in by rename, keeping its mode. An agent edit elsewhere survives; if the item itself changed, nothing is written.
Design:
docs/superpowers/specs/2026-09-29-interactive-line-updates-design.md.Testing
go test ./...passes, including a sweep that clicks the bullet and the question at pane widths from 24 to 200. I also drove the real TUI through a PTY: hover repainted the bullet, a click ticked it anduundid it, a click on the question opened the reply under the item, Enter wrote it, andsidecar diff --mid-turnreported both.Known limits: a click on a link while capture is on may not reach the terminal's own link handling; the mid-turn report advances the snapshot whole.
🤖 Generated with Claude Code