From 60406ca8fb684dfc5056e5353bfc5a0fa2d78101 Mon Sep 17 00:00:00 2001 From: Shantur Rathore Date: Sat, 7 Feb 2026 16:15:16 +0000 Subject: [PATCH] feat(ui): show worktree badge in session list Render a worktree pill on parent sessions using the session status chip styling, with a distinct icon and selection-aware colors. --- packages/ui/src/components/session-list.tsx | 22 +++++++++++++++++++- packages/ui/src/styles/panels.css | 23 +++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/packages/ui/src/components/session-list.tsx b/packages/ui/src/components/session-list.tsx index 5d1eca0f..ee64a52a 100644 --- a/packages/ui/src/components/session-list.tsx +++ b/packages/ui/src/components/session-list.tsx @@ -2,7 +2,7 @@ import { Component, For, Show, createSignal, createMemo, createEffect, JSX, onCl import type { SessionStatus } from "../types/session" import type { SessionThread } from "../stores/session-state" import { getSessionStatus } from "../stores/session-status" -import { Bot, User, Copy, Trash2, Pencil, ShieldAlert, ChevronDown, Search, Square, CheckSquare, MinusSquare } from "lucide-solid" +import { Bot, User, Copy, Trash2, Pencil, ShieldAlert, ChevronDown, Search, Square, CheckSquare, MinusSquare, Split } from "lucide-solid" import KeyboardHint from "./keyboard-hint" import SessionRenameDialog from "./session-rename-dialog" import { keyboardRegistry } from "../lib/keyboard-registry" @@ -20,6 +20,7 @@ import { setActiveSessionFromList, toggleSessionParentExpanded, } from "../stores/sessions" +import { getGitRepoStatus, getWorktreeSlugForParentSession } from "../stores/worktrees" import { getLogger } from "../lib/logger" import { copyToClipboard } from "../lib/clipboard" const log = getLogger("session") @@ -353,6 +354,19 @@ const SessionList: Component = (props) => { if (!session()) { return <> } + + const worktreeSlug = createMemo(() => { + if (rowProps.isChild) return "root" + return getWorktreeSlugForParentSession(props.instanceId, rowProps.sessionId) + }) + + const showWorktreeBadge = createMemo(() => { + if (rowProps.isChild) return false + if (getGitRepoStatus(props.instanceId) === false) return false + const slug = worktreeSlug() + return Boolean(slug) && slug !== "root" + }) + const isActive = () => props.activeSessionId === rowProps.sessionId const title = () => session()?.title || t("sessionList.session.untitled") const status = () => getSessionStatus(props.instanceId, rowProps.sessionId) @@ -459,6 +473,12 @@ const SessionList: Component = (props) => { {needsInput() ?