Skip to content

Polish boost display and copy#262

Merged
jeremy merged 8 commits intomainfrom
boost-polish
Mar 11, 2026
Merged

Polish boost display and copy#262
jeremy merged 8 commits intomainfrom
boost-polish

Conversation

@jeremy
Copy link
Copy Markdown
Member

@jeremy jeremy commented Mar 11, 2026

Summary

  • Replace [♥ N] with plain text "N boosts" in muted style across list, kanban, and campfire views — eliminates Unicode ambiguous-width alignment issues
  • Fetch individual boost content in detail view via Boosts().ListRecording(), showing emoji + booster name instead of just a count
  • Align boost picker copy with BC3's framing ("Give a Boost!", "A short note or emoji…")
  • Improve boost/react help text with TUI b key and react shortcut mentions

Test plan

  • TestList_BoostWithExtra_Alignment verifies no line overflow with boost + extra columns
  • TUI: boosted items in list/kanban show "N boosts" in muted text — verified via TestList_BoostSingularPlural, TestKanban_BoostDisplay
  • TUI: detail view of boosted item shows individual emoji + booster names — verified via code inspection: syncPreview renders boostDetails with emoji+name, capped at 3
  • TUI: boost picker shows updated labels and placeholder — verified via TestBoostPicker_ViewCopy, TestBoostPicker_Placeholder
  • basecamp boost -h and basecamp react -h show TUI tip — verified via CLI output

@jeremy jeremy requested a review from a team as a code owner March 11, 2026 05:11
Copilot AI review requested due to automatic review settings March 11, 2026 05:11
@github-actions github-actions bot added commands CLI command implementations tui Terminal UI tests Tests (unit and e2e) labels Mar 11, 2026
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@github-actions github-actions bot added the enhancement New feature or request label Mar 11, 2026
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copilot AI review requested due to automatic review settings March 11, 2026 06:40
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

jeremy added 7 commits March 10, 2026 23:50
♥ (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.
Copilot AI review requested due to automatic review settings March 11, 2026 06:54
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@jeremy jeremy merged commit 378c984 into main Mar 11, 2026
30 checks passed
@jeremy jeremy deleted the boost-polish branch March 11, 2026 08:07
jeremy added a commit that referenced this pull request Mar 11, 2026
* origin/main:
  Polish boost display and copy (#262)
  Reject whitespace-only content in mutation commands (#238)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

commands CLI command implementations enhancement New feature or request tests Tests (unit and e2e) tui Terminal UI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants