Skip to content

Commit 05ecd19

Browse files
committed
Merge remote-tracking branch 'origin/main' into feat/oneshot-and-on-merge-action
# Conflicts: # frontend/src/lib/WorktreeList.svelte
2 parents d75c216 + 63130ac commit 05ecd19

2 files changed

Lines changed: 89 additions & 42 deletions

File tree

frontend/src/lib/WorktreeList.svelte

Lines changed: 50 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@
8888
{@const isArchived = wt.archived}
8989
{@const isBusy = isRemoving || isInitializing}
9090
{@const hasLabel = !!wt.label}
91+
{@const hasBadgeRow = isArchived || isCreating || isInitializing || isClosed || wt.prs.length > 0 || !!wt.linearIssue || wt.source === "oneshot"}
9192
<li class="mb-0.5 group relative {isBusy ? 'opacity-40 pointer-events-none' : ''}">
9293
<button
9394
type="button"
@@ -101,52 +102,59 @@
101102
onselect(wt.branch);
102103
}}
103104
>
104-
<span class="flex items-center gap-1.5 pr-5 flex-wrap">
105-
<div class="flex items-center gap-2 max-w-[90%] min-w-0">
106-
{#if row.depth > 0}
107-
<span class="shrink-0 text-muted/60">↳</span>
108-
{/if}
109-
<span class="min-w-0 flex flex-col">
110-
<span class="font-medium truncate">{wt.label ?? wt.branch}</span>
111-
{#if hasLabel}
112-
<span class="text-[10px] leading-tight text-muted truncate">{wt.branch}</span>
105+
<span class="flex min-w-0 items-start gap-2 pr-5">
106+
{#if row.depth > 0}
107+
<span class="shrink-0 text-muted/60">↳</span>
108+
{/if}
109+
<span class="min-w-0 flex flex-1 flex-col gap-1">
110+
<span class="flex min-w-0 items-center gap-1.5" data-worktree-name-row>
111+
<span class="min-w-0 flex flex-1 flex-col">
112+
<span class="font-medium truncate">{wt.label ?? wt.branch}</span>
113+
{#if hasLabel}
114+
<span class="text-[10px] leading-tight text-muted truncate">{wt.branch}</span>
115+
{/if}
116+
</span>
117+
{#if !isCreating && !isInitializing && !isClosed}
118+
<span class="shrink-0"><AgentStatusIcon status={wt.agent} size={14} /></span>
119+
{/if}
120+
{#if notifiedBranches.has(wt.branch)}
121+
<span class="shrink-0 w-2 h-2 rounded-full bg-accent"></span>
113122
{/if}
114123
</span>
115-
{#if wt.source === "oneshot"}
116-
<span
117-
class="shrink-0 text-[10px] px-1.5 py-0.5 rounded border border-edge text-muted"
118-
title="Created by the oneshot CLI"
119-
>
120-
oneshot
121-
</span>
122-
{/if}
123-
{#if isArchived}
124-
<span class="shrink-0 text-[10px] px-1.5 py-0.5 rounded border border-edge text-muted">
125-
archived
124+
{#if hasBadgeRow}
125+
<span class="flex min-w-0 flex-wrap items-center gap-1.5" data-worktree-badge-row>
126+
{#if wt.source === "oneshot"}
127+
<span
128+
class="shrink-0 text-[10px] px-1.5 py-0.5 rounded border border-edge text-muted"
129+
title="Created by the oneshot CLI"
130+
>
131+
oneshot
132+
</span>
133+
{/if}
134+
{#if isArchived}
135+
<span class="shrink-0 text-[10px] px-1.5 py-0.5 rounded border border-edge text-muted">
136+
archived
137+
</span>
138+
{/if}
139+
{#if isCreating}
140+
<span class="shrink-0 inline-flex items-center gap-1 text-[10px] text-muted">
141+
<span class="spinner"></span>
142+
{worktreeCreationPhaseLabel(wt.creationPhase)}...
143+
</span>
144+
{:else if isInitializing}
145+
<span class="shrink-0 text-[10px] text-muted">opening...</span>
146+
{:else if isClosed}
147+
<span class="shrink-0 text-[10px] text-muted">closed</span>
148+
{/if}
149+
{#each wt.prs as pr (pr.repo)}
150+
<PrBadge {pr} />
151+
{/each}
152+
{#if wt.linearIssue}
153+
<LinearBadge issue={wt.linearIssue} clickable={false} />
154+
{/if}
126155
</span>
127156
{/if}
128-
{#if isCreating}
129-
<span class="shrink-0 inline-flex items-center gap-1 text-[10px] text-muted">
130-
<span class="spinner"></span>
131-
{worktreeCreationPhaseLabel(wt.creationPhase)}...
132-
</span>
133-
{:else if isInitializing}
134-
<span class="shrink-0 text-[10px] text-muted">opening...</span>
135-
{:else if isClosed}
136-
<span class="shrink-0 text-[10px] text-muted">closed</span>
137-
{:else}
138-
<span class="shrink-0"><AgentStatusIcon status={wt.agent} size={14} /></span>
139-
{/if}
140-
{#if notifiedBranches.has(wt.branch)}
141-
<span class="shrink-0 w-2 h-2 rounded-full bg-accent"></span>
142-
{/if}
143-
</div>
144-
{#each wt.prs as pr (pr.repo)}
145-
<PrBadge {pr} />
146-
{/each}
147-
{#if wt.linearIssue}
148-
<LinearBadge issue={wt.linearIssue} clickable={false} />
149-
{/if}
157+
</span>
150158
</span>
151159
<span class="flex gap-2 text-[11px] text-muted items-center flex-wrap">
152160
{#if wt.agentLabel ?? wt.agentName}

frontend/src/lib/WorktreeList.test.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,45 @@ describe("WorktreeList", () => {
145145
expect(screen.getByText("feature/random-fallback")).toBeInTheDocument();
146146
});
147147

148+
it("places archived and closed row badges below the worktree name", () => {
149+
render(WorktreeList, {
150+
props: {
151+
rows: [
152+
createRow({
153+
...createWorktree("feature/very-long-archived-closed-name"),
154+
archived: true,
155+
mux: "",
156+
}),
157+
],
158+
selected: null,
159+
removing: new Set<string>(),
160+
initializing: new Set<string>(),
161+
archiving: new Set<string>(),
162+
postingLinear: new Set<string>(),
163+
notifiedBranches: new Set<string>(),
164+
onselect: vi.fn(),
165+
onclose: vi.fn(),
166+
onarchive: vi.fn(),
167+
onmerge: vi.fn(),
168+
onremove: vi.fn(),
169+
},
170+
});
171+
172+
const name = screen.getByText("feature/very-long-archived-closed-name");
173+
const archived = screen.getByText("archived");
174+
const closed = screen.getByText("closed");
175+
const nameRow = name.closest("[data-worktree-name-row]");
176+
const badgeRow = archived.closest("[data-worktree-badge-row]");
177+
178+
if (!nameRow || !badgeRow) {
179+
throw new Error("Expected separate name and badge rows");
180+
}
181+
182+
expect(nameRow).not.toContainElement(archived);
183+
expect(badgeRow).toContainElement(archived);
184+
expect(badgeRow).toContainElement(closed);
185+
});
186+
148187
it("disables the archive action while the row is archiving", async () => {
149188
render(WorktreeList, {
150189
props: {

0 commit comments

Comments
 (0)