Conversation
There was a problem hiding this comment.
5 issues found across 7 files
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="internal/tui/workspace/views/campfire.go">
<violation number="1" location="internal/tui/workspace/views/campfire.go:633">
P2: "1 boosts" is grammatically incorrect when `Count == 1`. Handle singular/plural (this applies to both the header and the grouped-message inline occurrence at line 643).</violation>
</file>
<file name="internal/tui/workspace/views/detail.go">
<violation number="1" location="internal/tui/workspace/views/detail.go:1310">
P2: Pluralization bug: when there is exactly 1 boost, this renders "1 boosts". Handle the singular case.</violation>
</file>
<file name="internal/tui/workspace/widget/list.go">
<violation number="1" location="internal/tui/workspace/widget/list.go:522">
P2: Pluralization bug: when `Boosts == 1` this renders "1 boosts". Use singular "boost" for a count of one.</violation>
</file>
<file name="internal/tui/workspace/widget/kanban.go">
<violation number="1" location="internal/tui/workspace/widget/kanban.go:524">
P2: "1 boosts" is grammatically incorrect. Handle the singular form when `card.Boosts == 1`.</violation>
<violation number="2" location="internal/tui/workspace/widget/kanban.go:559">
P2: Same singular/plural issue here: "1 boosts" when `card.Boosts == 1`.</violation>
</file>
Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.
There was a problem hiding this comment.
Pull request overview
This PR updates how boosts/reactions are displayed and described across the TUI and CLI help, with the goal of improving alignment/copy and showing richer boost detail in the recording detail view.
Changes:
- Replace the prior
[♥ N]boost indicator with muted"N boosts"text in list/kanban/campfire displays. - Enhance the detail view to optionally fetch and display per-boost content (emoji/text) plus booster name.
- Update boost picker and CLI help copy to better match Basecamp’s wording and include TUI keyboard tips.
Reviewed changes
Copilot reviewed 7 out of 7 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| internal/tui/workspace/widget/list_test.go | Adds a regression test ensuring boost+extra columns don’t overflow list width. |
| internal/tui/workspace/widget/list.go | Updates list boost rendering and width calculations to use "N boosts" in muted style. |
| internal/tui/workspace/widget/kanban.go | Updates kanban boost strings in compact cards and detail line to "N boosts". |
| internal/tui/workspace/views/detail.go | Adds optional per-boost fetching via Boosts().ListRecording() and displays detailed boost info in the preview fields. |
| internal/tui/workspace/views/campfire.go | Changes campfire boost display to muted "N boosts" instead of [♥ N]. |
| internal/tui/workspace/boostpicker.go | Updates boost picker title/placeholder/instructions to the new phrasing. |
| internal/commands/boost.go | Refreshes boost/react help text and adds a TUI tip about pressing b. |
Comments suppressed due to low confidence (1)
internal/tui/workspace/widget/kanban.go:533
- PR description says boost counts should render in muted style across list/kanban/campfire, but in the kanban unfocused card rendering the boost suffix is not styled separately (it inherits the card's normal foreground). Consider rendering the boost suffix with theme.Muted (without muting the title) to match the intended UI change.
func (k *Kanban) renderUnfocusedCard(card KanbanCard, width int, theme tui.Theme) string {
boostStr := ""
if card.Boosts > 0 {
boostStr = fmt.Sprintf(" %d boosts", card.Boosts)
}
availWidth := width - 2 - lipgloss.Width(boostStr) // 2 for " " prefix
title := Truncate(card.Title, availWidth)
style := lipgloss.NewStyle().Width(width)
if card.Completed {
style = style.Foreground(theme.Muted).Strikethrough(true)
}
return style.Render(" " + title + boostStr)
}
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
1 issue found across 5 files (changes from recent commits).
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="internal/tui/workspace/views/detail.go">
<violation number="1" location="internal/tui/workspace/views/detail.go:1325">
P2: The "+N more" count uses `len(boostDetails)` instead of the authoritative `v.data.boosts`. If the API returns fewer boosts than the total count, the overflow label will undercount. Use `v.data.boosts - limit` for accuracy.</violation>
</file>
Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 9 out of 9 changed files in this pull request and generated 3 comments.
Comments suppressed due to low confidence (1)
internal/tui/workspace/widget/kanban.go:533
- In kanban unfocused cards, the boost label is appended as plain text and inherits the card’s normal style, so it won’t appear “muted” like boosts in the list and campfire views. To match the intended UI and reduce visual noise, render the boost portion with a muted style (while keeping the width math consistent).
func (k *Kanban) renderUnfocusedCard(card KanbanCard, width int, theme tui.Theme) string {
boostStr := ""
if card.Boosts > 0 {
boostStr = " " + boostLabel(card.Boosts)
}
availWidth := width - 2 - lipgloss.Width(boostStr) // 2 for " " prefix
title := Truncate(card.Title, availWidth)
style := lipgloss.NewStyle().Width(width)
if card.Completed {
style = style.Foreground(theme.Muted).Strikethrough(true)
}
return style.Render(" " + title + boostStr)
}
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
♥ (U+2665) has ambiguous terminal width, causing alignment issues. Replace [♥ N] with "N boosts" in muted style across list, kanban, and campfire views. Use descStyle instead of Success foreground for consistent metadata appearance.
Fetch actual boost data via Boosts().ListRecording() when a recording has boosts, matching the existing comments fetch pattern. Display individual emoji + booster name in preview fields instead of just a count.
Match Basecamp's framing: "Give a Boost!" label, "A short note or emoji…" placeholder, "Or write a short note (16 chars max):" body.
Reframe boost Long description using BC3's language (tiny messages of support). Add TUI 'b' key and react shortcut mentions. Update agent_notes with the same framing.
Handle singular "1 boost" vs plural "N boosts" across all display sites via boostLabel() helpers. Cap boost detail preview field at 3 entries with "+N more" to prevent header overflow. Change help text example placeholder from "emoji" to "content".
Test singular/plural boostLabel, kanban boost rendering, and boost picker copy alignment with BC3 framing.
The "+N more" suffix should use v.data.boosts (the API's total count) rather than len(boostDetails) which may be fewer if the API paginates.
Update remaining "emoji" references in breadcrumbs, create/react Short/Long to say "short note or emoji". Move boostLabel() to boosts.go for shared use by campfire and detail views.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 10 out of 10 changed files in this pull request and generated 2 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Summary
[♥ N]with plain text "N boosts" in muted style across list, kanban, and campfire views — eliminates Unicode ambiguous-width alignment issuesBoosts().ListRecording(), showing emoji + booster name instead of just a countbkey andreactshortcut mentionsTest plan
TestList_BoostWithExtra_Alignmentverifies no line overflow with boost + extra columnsTestList_BoostSingularPlural,TestKanban_BoostDisplaysyncPreviewrendersboostDetailswith emoji+name, capped at 3TestBoostPicker_ViewCopy,TestBoostPicker_Placeholderbasecamp boost -handbasecamp react -hshow TUI tip — verified via CLI output