Skip to content

Project tags, color picker, and command palette polish#63

Merged
Ron537 merged 1 commit into
mainfrom
project-grouping
May 13, 2026
Merged

Project tags, color picker, and command palette polish#63
Ron537 merged 1 commit into
mainfrom
project-grouping

Conversation

@Ron537
Copy link
Copy Markdown
Owner

@Ron537 Ron537 commented May 13, 2026

Adds free-form project tags so a large project list can be grouped by relationship (clients, infra, OSS, etc.), with a color picker, dynamic-fit row rendering, and a polish pass on the command palette so tags are first-class there too.

What's new

Tagging

  • New tags?: string[] field on Project, persisted through the existing settings round-trip.
  • Right-click a project → Tags… opens a multi-select picker that suggests existing tags from across the workspace and creates new ones inline (typing #infra and infra both normalize to the same canonical tag).
  • Tag filter strip at the top of the projects sidebar — single-select, auto-hides when no project has any tag, self-heals when the active tag disappears.

Color picker

  • Each tag carries a globally-shared color users can pick from an 8-swatch theme-safe palette (TAG_PALETTE). Same palette on both light and dark themes.
  • The Create row in the picker shows a stable-color preview that doesn't shimmer as the user types; existing tags can be recolored from a per-row swatch strip.
  • Defaults to a deterministic hash of the tag name, so first-time tags already have a consistent look.

Dynamic-fit rendering

  • New InlineTagList measures pill widths via ResizeObserver against container width and shows as many tags as actually fit. Overflow surfaces as a +N chip whose tooltip lists the hidden tags — nothing is silently clipped.
  • Long tag names truncate with ellipsis instead of pushing siblings off-screen.

Worktree-with-parent filtering

  • Filtering by tag (or any other filter) keeps a matched parent's worktree subtree visible underneath it; matching parents are force-expanded without touching the user's persisted expand/collapse state.

Command palette (⌘P)

  • Project results render with the project avatar and tag pills inline, so users can see at a glance why a result matched.
  • Tag keywords are emitted both bare (infra) and prefixed (#infra) so #infra filters projects directly.
  • Placeholder hints (try #tag).

Discoverability

  • Status bar gets a persistent Search ⌘P button.
  • Settings → Shortcuts entry for ⌘P now reads "Global search — projects, sessions, tabs, settings (try #tag)".

Tests

11 new unit tests for tag normalization, the store actions, color resolution, and dedupe — total suite now 352 passing.

Review

Ran the dual review policy (claude-opus-4.7 + gpt-5.5). All findings from both rounds addressed:

  • Anchor for the tag picker is the row div (not the whole expanded wrapper)
  • Stale tag filter self-heals when the active tag is removed
  • #-prefixed typing in the picker still matches existing tags
  • Enter on an existing tag no longer overwrites its global color
  • Collapsed matched parents force-expand in filter mode
  • All lint rules pass

Version

Bumped to 0.16.0 (MINOR — new user-visible features). CHANGELOG updated.

Add free-form project tags so a large project list can be grouped by
relationship (e.g. all client-X projects, all infra, all OSS):

- New tags?: string[] field on Project, persisted through the
  existing settings round-trip. Right-click a project -> Tags... opens
  a multi-select picker that suggests tags from across all projects
  and can create new ones inline.
- Tag filter strip at the top of the projects sidebar, single-select,
  auto-hides when no project has any tag and self-heals when the
  active tag disappears.
- Each tag carries a globally-shared color the user can pick from an
  8-swatch theme-safe palette; defaults to a deterministic hash of
  the tag name so first-time tags already have a stable look.
- Dynamic-fit tag rendering on project rows (InlineTagList) measures
  pill widths via ResizeObserver and shows as many tags as actually
  fit, then surfaces overflow as a +N chip whose tooltip lists the
  hidden tags. Single very long tag names truncate with ellipsis
  instead of pushing siblings off-screen.
- Filtering by tag keeps a matched parent's worktree subtree visible
  underneath it (full subtree, even worktrees without the tag),
  forcing the expanded body open without touching the user's
  persisted expand/collapse state.

Command palette (CMD+P) improvements that ride along:

- Project results show the project avatar and tag pills inline so the
  user can see why a result matched and skim by visual identity.
- Tag keywords are emitted both bare (infra) and prefixed (#infra),
  so '#infra' filters projects directly.
- Status bar gets a persistent 'Search CMD+P' button; the shortcut
  is also surfaced in Settings -> Shortcuts.

Includes unit tests for normalization, the store actions, and color
resolution. Version bumped to 0.16.0 with a customer-facing changelog
entry.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Ron537 Ron537 merged commit 69ce9cf into main May 13, 2026
5 checks passed
@Ron537 Ron537 deleted the project-grouping branch May 13, 2026 17:45
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