claude-remote-cli 2.6.0 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- .pin-gate.svelte-1qp96yb{display:flex;align-items:center;justify-content:center;height:100vh;background:var(--bg);padding:1rem}.pin-container.svelte-1qp96yb{display:flex;flex-direction:column;align-items:center;gap:1rem;width:100%;max-width:320px;text-align:center}.pin-container.svelte-1qp96yb h1:where(.svelte-1qp96yb){font-size:1.5rem;color:var(--text)}.pin-container.svelte-1qp96yb p:where(.svelte-1qp96yb){color:var(--text-muted);font-size:.95rem}input.svelte-1qp96yb{width:100%;padding:14px 16px;background:var(--surface);border:1px solid var(--border);border-radius:8px;color:var(--text);font-size:1.2rem;text-align:center;outline:none;-webkit-appearance:none}input.svelte-1qp96yb:focus{border-color:var(--accent)}button.svelte-1qp96yb{width:100%;padding:14px;background:var(--accent);color:#fff;border:none;border-radius:8px;font-size:1rem;font-weight:600;cursor:pointer;touch-action:manipulation}button.svelte-1qp96yb:active{opacity:.8}.error.svelte-1qp96yb{color:var(--accent);font-size:.9rem}li.svelte-ix4pl2{position:relative;display:flex;align-items:flex-start;padding:8px 10px;cursor:pointer;border-radius:6px;margin:2px 6px;font-size:.8rem;color:var(--text-muted);touch-action:manipulation;transition:background .15s,border-color .15s}li.active-session.svelte-ix4pl2{background:var(--bg)}li.active-session.svelte-ix4pl2:hover,li.active-session.svelte-ix4pl2.longpress{background:var(--border)}li.active-session.selected.svelte-ix4pl2{background:var(--accent);color:#fff}li.active-session.selected.svelte-ix4pl2 .session-sub:where(.svelte-ix4pl2),li.active-session.selected.svelte-ix4pl2 .session-time:where(.svelte-ix4pl2){color:#ffffffb3}li.inactive-worktree.svelte-ix4pl2{background:transparent;border:1px solid var(--border);color:var(--text-muted);opacity:.7}li.inactive-worktree.svelte-ix4pl2:hover,li.inactive-worktree.svelte-ix4pl2.longpress{opacity:1;border-color:var(--accent)}.session-info.svelte-ix4pl2{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.session-row-1.svelte-ix4pl2{display:flex;align-items:center;min-width:0}.status-dot.svelte-ix4pl2{display:inline-block;width:8px;height:8px;border-radius:50%;flex-shrink:0;margin-right:8px}.status-dot--running.svelte-ix4pl2{background:#4ade80}.status-dot--idle.svelte-ix4pl2{background:#60a5fa}.status-dot--attention.svelte-ix4pl2{background:#f59e0b;box-shadow:0 0 6px 2px #f59e0b80;animation:svelte-ix4pl2-attention-glow 2s ease-in-out infinite}.status-dot--inactive.svelte-ix4pl2{background:#6b7280}@keyframes svelte-ix4pl2-attention-glow{0%,to{box-shadow:0 0 4px 1px #f59e0b4d}50%{box-shadow:0 0 8px 3px #f59e0b99}}.session-name.svelte-ix4pl2{flex:1;min-width:0;overflow:hidden;white-space:nowrap;font-weight:500;color:var(--text)}.session-name-text.svelte-ix4pl2{display:inline-block;white-space:nowrap;will-change:transform}.session-name.has-overflow.svelte-ix4pl2{mask-image:linear-gradient(to right,black calc(100% - 32px),transparent);-webkit-mask-image:linear-gradient(to right,black calc(100% - 32px),transparent)}li.svelte-ix4pl2:hover .session-name.has-overflow:where(.svelte-ix4pl2),li.svelte-ix4pl2.longpress .session-name.has-overflow:where(.svelte-ix4pl2){mask-image:none;-webkit-mask-image:none}li.active-session.selected.svelte-ix4pl2 .session-name:where(.svelte-ix4pl2){color:#fff}li.active-session.selected.svelte-ix4pl2 .session-name.has-overflow:where(.svelte-ix4pl2){mask-image:linear-gradient(to right,white calc(100% - 32px),transparent);-webkit-mask-image:linear-gradient(to right,white calc(100% - 32px),transparent)}li.active-session.selected.svelte-ix4pl2:hover .session-name.has-overflow:where(.svelte-ix4pl2),li.active-session.selected.svelte-ix4pl2.longpress .session-name.has-overflow:where(.svelte-ix4pl2){mask-image:none;-webkit-mask-image:none}.action-pill.svelte-ix4pl2{background:var(--border);border:none;color:var(--text);font-size:.75rem;cursor:pointer;padding:2px 8px;border-radius:12px;touch-action:manipulation;flex-shrink:0;min-height:24px;display:inline-flex;align-items:center;transition:background .15s,color .15s;line-height:1}.action-pill.svelte-ix4pl2:hover{background:#505050}.action-pill--mono.svelte-ix4pl2{font-family:monospace;font-size:.65rem;letter-spacing:.02em}.action-pill--danger.svelte-ix4pl2:hover{background:#4a2020;color:#e74c3c}li.active-session.selected.svelte-ix4pl2 .action-pill:where(.svelte-ix4pl2){background:#b35a3a;color:#fff}li.active-session.selected.svelte-ix4pl2 .action-pill:where(.svelte-ix4pl2):hover{background:#9a4d32}li.active-session.selected.svelte-ix4pl2 .action-pill--danger:where(.svelte-ix4pl2):hover{background:#8b2020;color:#fca5a5}.session-actions.svelte-ix4pl2{position:absolute;right:10px;top:50%;transform:translateY(-50%);display:flex;align-items:center;gap:4px;opacity:0;visibility:hidden;transition:opacity .15s .1s,visibility .15s .1s}li.svelte-ix4pl2:hover .session-actions:where(.svelte-ix4pl2),li.svelte-ix4pl2:focus-within .session-actions:where(.svelte-ix4pl2),li.svelte-ix4pl2.longpress .session-actions:where(.svelte-ix4pl2){opacity:1;visibility:visible}.session-row-2.svelte-ix4pl2{display:flex;align-items:center;gap:4px;min-width:0;padding-left:16px}.pr-icon.svelte-ix4pl2{font-size:.65rem;flex-shrink:0}.pr-open.svelte-ix4pl2{color:#4ade80}.pr-merged.svelte-ix4pl2{color:#a78bfa}.pr-closed.svelte-ix4pl2{color:#f87171}.session-sub.svelte-ix4pl2{font-size:.7rem;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.session-row-3.svelte-ix4pl2{display:flex;align-items:center;gap:6px;min-width:0;padding-left:16px}.session-time.svelte-ix4pl2{font-size:.65rem;color:var(--text-muted);opacity:.6}.git-diff.svelte-ix4pl2{display:flex;gap:4px;font-size:.65rem;font-family:monospace}.diff-add.svelte-ix4pl2{color:#4ade80}.diff-del.svelte-ix4pl2{color:#f87171}.sidebar-filters.svelte-1o5d4l8{display:flex;flex-direction:column;gap:4px;padding:6px 8px;flex-shrink:0}select.svelte-1o5d4l8{padding:6px 8px;background:var(--bg);border:1px solid var(--border);border-radius:6px;color:var(--text);font-size:.75rem;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%23aaa' fill='none' stroke-width='1.5'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 8px center;cursor:pointer;transition:border-color .15s,box-shadow .3s}select.svelte-1o5d4l8:focus{border-color:var(--accent)}input.svelte-1o5d4l8{padding:6px 8px;background:var(--bg);border:1px solid var(--border);border-radius:6px;color:var(--text);font-size:.75rem;outline:none;-webkit-appearance:none}input.svelte-1o5d4l8:focus{border-color:var(--accent)}.role-filter.svelte-1o5d4l8{display:flex;gap:0;border:1px solid var(--border);border-radius:6px;overflow:hidden}.role-btn.svelte-1o5d4l8{flex:1;padding:5px 8px;background:var(--bg);border:none;border-right:1px solid var(--border);color:var(--text-muted);font-size:.7rem;cursor:pointer;transition:background .15s,color .15s}.role-btn.svelte-1o5d4l8:last-child{border-right:none}.role-btn.svelte-1o5d4l8:hover{color:var(--text)}.role-btn.active.svelte-1o5d4l8{background:var(--accent);color:#fff}li.pr-item.svelte-jhsg4e{position:relative;display:flex;align-items:flex-start;padding:8px 10px;cursor:pointer;border-radius:6px;margin:2px 6px;font-size:.8rem;color:var(--text-muted);touch-action:manipulation;transition:background .15s,border-color .15s;background:transparent;border:1px solid var(--border);opacity:.8}li.pr-item.svelte-jhsg4e:hover,li.pr-item.svelte-jhsg4e.longpress{opacity:1;border-color:var(--accent)}li.pr-item.active-session.svelte-jhsg4e{background:var(--bg);border-color:var(--accent);opacity:1}li.pr-item.selected.svelte-jhsg4e{background:var(--accent);border-color:var(--accent);color:#fff;opacity:1}li.pr-item.selected.svelte-jhsg4e .pr-title:where(.svelte-jhsg4e){color:#fff}li.pr-item.selected.svelte-jhsg4e .pr-meta:where(.svelte-jhsg4e),li.pr-item.selected.svelte-jhsg4e .pr-time:where(.svelte-jhsg4e){color:#ffffffb3}li.pr-item.selected.svelte-jhsg4e .role-badge:where(.svelte-jhsg4e){background:#fff3;color:#fff}.pr-info.svelte-jhsg4e{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.pr-row-1.svelte-jhsg4e{display:flex;align-items:center;min-width:0}.pr-state{font-size:.65rem;flex-shrink:0;width:16px;text-align:center;margin-right:4px}.pr-open{color:#4ade80}.pr-merged{color:#a78bfa}.pr-closed{color:#f87171}.pr-title.svelte-jhsg4e{flex:1;min-width:0;overflow:hidden;white-space:nowrap;font-weight:500;color:var(--text)}.pr-title-text.svelte-jhsg4e{display:inline-block;white-space:nowrap;will-change:transform}.pr-title.has-overflow.svelte-jhsg4e{mask-image:linear-gradient(to right,black calc(100% - 32px),transparent);-webkit-mask-image:linear-gradient(to right,black calc(100% - 32px),transparent)}li.svelte-jhsg4e:hover .pr-title.has-overflow:where(.svelte-jhsg4e),li.svelte-jhsg4e.longpress .pr-title.has-overflow:where(.svelte-jhsg4e){mask-image:none;-webkit-mask-image:none}.pr-actions.svelte-jhsg4e{position:absolute;right:10px;top:50%;transform:translateY(-50%);display:flex;align-items:center;gap:2px;opacity:0;visibility:hidden;transition:opacity .15s .1s,visibility .15s .1s}li.svelte-jhsg4e:hover .pr-actions:where(.svelte-jhsg4e),li.svelte-jhsg4e:focus-within .pr-actions:where(.svelte-jhsg4e),li.svelte-jhsg4e.longpress .pr-actions:where(.svelte-jhsg4e){opacity:1;visibility:visible}.action-pill.svelte-jhsg4e{background:var(--border);border:none;color:var(--text);font-size:.75rem;cursor:pointer;padding:2px 8px;border-radius:12px;touch-action:manipulation;flex-shrink:0;min-height:24px;display:inline-flex;align-items:center;transition:background .15s,color .15s;line-height:1}.action-pill.svelte-jhsg4e:hover{background:#505050}.action-pill--mono.svelte-jhsg4e{font-family:monospace;font-size:.65rem;letter-spacing:.02em}li.pr-item.selected.svelte-jhsg4e .action-pill:where(.svelte-jhsg4e){background:#b35a3a;color:#fff}li.pr-item.selected.svelte-jhsg4e .action-pill:where(.svelte-jhsg4e):hover{background:#9a4d32}.external-link-btn.svelte-jhsg4e{background:none;border:none;color:var(--text-muted);cursor:pointer;padding:2px 4px;border-radius:4px;touch-action:manipulation;flex-shrink:0;display:inline-flex;align-items:center;transition:color .15s,transform .15s}.external-link-btn.svelte-jhsg4e:hover{color:var(--accent);transform:scale(1.1)}li.pr-item.selected.svelte-jhsg4e .external-link-btn:where(.svelte-jhsg4e){color:#ffffffb3}li.pr-item.selected.svelte-jhsg4e .external-link-btn:where(.svelte-jhsg4e):hover{color:#fff}.review-badge.svelte-jhsg4e{font-size:.7rem;padding:0 3px}.review-approved.svelte-jhsg4e{color:#4ade80}.review-changes.svelte-jhsg4e{color:#f87171}.review-pending.svelte-jhsg4e{color:#f59e0b}.pr-row-2.svelte-jhsg4e{display:flex;align-items:center;gap:4px;min-width:0;padding-left:20px}.pr-meta.svelte-jhsg4e{font-size:.7rem;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.role-badge.svelte-jhsg4e{font-size:.6rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;padding:1px 5px;border-radius:3px;flex-shrink:0}.role-author.svelte-jhsg4e{background:#60a5fa26;color:#60a5fa}.role-reviewer.svelte-jhsg4e{background:#a78bfa26;color:#a78bfa}.pr-row-3.svelte-jhsg4e{display:flex;align-items:center;gap:6px;min-width:0;padding-left:20px}.pr-time.svelte-jhsg4e{font-size:.65rem;color:var(--text-muted);opacity:.6}.git-diff.svelte-jhsg4e{display:flex;gap:4px;font-size:.65rem;font-family:monospace}.diff-add.svelte-jhsg4e{color:#4ade80}.diff-del.svelte-jhsg4e{color:#f87171}.repo-group-refresh.svelte-1ekl114{background:none;border:none;color:var(--text-muted);font-size:.75rem;cursor:pointer;padding:0 4px;flex-shrink:0;transition:color .15s}.repo-group-refresh.svelte-1ekl114:hover{color:var(--accent)}.repo-group-refresh.svelte-1ekl114:disabled{opacity:.5;cursor:not-allowed}.spinning.svelte-1ekl114{display:inline-block;animation:svelte-1ekl114-spin 1s linear infinite}@keyframes svelte-1ekl114-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.session-list-tabs.svelte-ynafm7{display:flex;padding:0 8px;border-bottom:1px solid var(--border)}.sidebar-tab.svelte-ynafm7{flex:1;background:none;border:none;border-bottom:2px solid transparent;color:var(--text-muted);font-size:.7rem;padding:6px 4px;cursor:pointer;transition:color .15s,border-color .15s;text-align:center}.sidebar-tab.svelte-ynafm7:hover{color:var(--text)}.sidebar-tab.active.svelte-ynafm7{color:var(--accent);border-bottom-color:var(--accent)}.tab-count.svelte-ynafm7{opacity:.7}.session-list.svelte-ynafm7{list-style:none;flex:1;overflow-y:auto;padding:8px 0}.session-divider{font-size:.65rem;font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;padding:8px 12px 4px;opacity:.6;list-style:none}.repo-group-header{display:flex;align-items:center;gap:4px;padding:6px 10px;cursor:pointer;list-style:none;transition:background .15s;border-radius:4px;margin:2px 6px}.repo-group-header:hover{background:var(--border)}.chevron{display:inline-block;font-size:.55rem;transition:transform .15s;color:var(--text-muted);flex-shrink:0}.chevron.expanded{transform:rotate(90deg)}.repo-group-name{font-size:.7rem;font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.repo-group-root{font-size:.6rem;color:var(--text-muted);opacity:.6;flex-shrink:0}.repo-group-count{font-size:.6rem;color:var(--text-muted);opacity:.5;margin-left:auto;flex-shrink:0}.repo-group-add{background:none;border:none;color:var(--text-muted);font-size:.8rem;font-weight:600;cursor:pointer;padding:0 4px;flex-shrink:0;line-height:1;transition:color .15s;opacity:0}.repo-group-header:hover .repo-group-add{opacity:1}.repo-group-add:hover,.repo-group-add:focus-visible{color:var(--accent);opacity:1}.pr-hint{font-size:.75rem;color:var(--text-muted);text-align:center;padding:20px 12px;opacity:.6;list-style:none}.pr-hint-sub{font-size:.65rem;opacity:.8;display:block;margin-top:4px}.pr-hint code{background:var(--bg);padding:1px 4px;border-radius:3px;font-size:.65rem}.sidebar.svelte-owj5vn{position:relative;display:flex;flex-direction:column;background:var(--surface);border-right:1px solid var(--border);overflow:hidden;transition:transform .25s ease,width .2s ease,min-width .2s ease;z-index:100}.resize-handle.svelte-owj5vn{position:absolute;top:0;right:0;width:4px;height:100%;cursor:col-resize;z-index:10;transition:background .15s}.resize-handle.svelte-owj5vn:hover{background:var(--accent)}.sidebar-header.svelte-owj5vn{display:flex;align-items:center;justify-content:space-between;padding:12px 10px;border-bottom:1px solid var(--border);flex-shrink:0}.sidebar-label.svelte-owj5vn{flex:1;font-size:.85rem;font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em}.collapse-btn.svelte-owj5vn{background:none;border:none;color:var(--text-muted);font-size:1.1rem;cursor:pointer;padding:4px 8px;border-radius:4px;flex-shrink:0;line-height:1}.collapse-btn.svelte-owj5vn:hover{color:var(--text);background:var(--border)}.sidebar.collapsed.svelte-owj5vn .sidebar-header:where(.svelte-owj5vn){justify-content:center;padding:12px 4px}.icon-btn.svelte-owj5vn{background:none;border:none;color:var(--text);font-size:1.2rem;cursor:pointer;padding:4px 6px;border-radius:4px;touch-action:manipulation;display:none}.icon-btn.svelte-owj5vn:active{background:var(--border)}.new-session-btn.svelte-owj5vn{margin:8px;padding:10px 12px;background:none;border:1px solid var(--border);border-radius:6px;color:var(--text);font-size:.875rem;cursor:pointer;touch-action:manipulation;text-align:center;flex-shrink:0}.new-session-btn.svelte-owj5vn:active{background:var(--border)}.settings-btn.svelte-owj5vn{margin:0 8px 8px;padding:10px 12px;background:none;border:1px solid var(--border);border-radius:6px;color:var(--text-muted);font-size:.8rem;cursor:pointer;touch-action:manipulation;text-align:center;flex-shrink:0}.settings-btn.svelte-owj5vn:active{background:var(--border)}@media(max-width:600px){.sidebar.svelte-owj5vn{position:fixed;top:0;left:0;height:100%;transform:translate(-100%);box-shadow:2px 0 12px #00000080;transition:transform .25s ease}.sidebar.open.svelte-owj5vn{transform:translate(0)}.collapse-btn.svelte-owj5vn{display:none}.icon-btn.svelte-owj5vn{display:block;font-size:1.4rem;padding:4px 8px}.resize-handle.svelte-owj5vn{display:none}}/**
1
+ .pin-gate.svelte-1qp96yb{display:flex;align-items:center;justify-content:center;height:100vh;background:var(--bg);padding:1rem}.pin-container.svelte-1qp96yb{display:flex;flex-direction:column;align-items:center;gap:1rem;width:100%;max-width:320px;text-align:center}.pin-container.svelte-1qp96yb h1:where(.svelte-1qp96yb){font-size:1.5rem;color:var(--text)}.pin-container.svelte-1qp96yb p:where(.svelte-1qp96yb){color:var(--text-muted);font-size:.95rem}input.svelte-1qp96yb{width:100%;padding:14px 16px;background:var(--surface);border:1px solid var(--border);border-radius:8px;color:var(--text);font-size:1.2rem;text-align:center;outline:none;-webkit-appearance:none}input.svelte-1qp96yb:focus{border-color:var(--accent)}button.svelte-1qp96yb{width:100%;padding:14px;background:var(--accent);color:#fff;border:none;border-radius:8px;font-size:1rem;font-weight:600;cursor:pointer;touch-action:manipulation}button.svelte-1qp96yb:active{opacity:.8}.error.svelte-1qp96yb{color:var(--accent);font-size:.9rem}li.svelte-ix4pl2{position:relative;display:flex;align-items:flex-start;padding:8px 10px;cursor:pointer;border-radius:6px;margin:2px 6px;font-size:.8rem;color:var(--text-muted);touch-action:manipulation;transition:background .15s,border-color .15s}li.active-session.svelte-ix4pl2{background:var(--bg)}li.active-session.svelte-ix4pl2:hover,li.active-session.svelte-ix4pl2.longpress{background:var(--border)}li.active-session.selected.svelte-ix4pl2{background:var(--accent);color:#fff}li.active-session.selected.svelte-ix4pl2 .session-sub:where(.svelte-ix4pl2),li.active-session.selected.svelte-ix4pl2 .session-time:where(.svelte-ix4pl2){color:#ffffffb3}li.inactive-worktree.svelte-ix4pl2{background:transparent;border:1px solid var(--border);color:var(--text-muted);opacity:.7}li.inactive-worktree.svelte-ix4pl2:hover,li.inactive-worktree.svelte-ix4pl2.longpress{opacity:1;border-color:var(--accent)}li.loading.svelte-ix4pl2{pointer-events:none;opacity:.5}li.loading.svelte-ix4pl2:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;background:linear-gradient(90deg,transparent 0%,rgba(255,255,255,.04) 50%,transparent 100%);background-size:200% 100%;animation:svelte-ix4pl2-shimmer 1.5s ease-in-out infinite;pointer-events:none}@media(prefers-reduced-motion:reduce){li.loading.svelte-ix4pl2:after{animation:none}}@keyframes svelte-ix4pl2-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.session-info.svelte-ix4pl2{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.session-row-1.svelte-ix4pl2{display:flex;align-items:center;min-width:0}.status-dot.svelte-ix4pl2{display:inline-block;width:8px;height:8px;border-radius:50%;flex-shrink:0;margin-right:8px}.status-dot--running.svelte-ix4pl2{background:#4ade80}.status-dot--idle.svelte-ix4pl2{background:#60a5fa}.status-dot--attention.svelte-ix4pl2{background:#f59e0b;box-shadow:0 0 6px 2px #f59e0b80;animation:svelte-ix4pl2-attention-glow 2s ease-in-out infinite}.status-dot--inactive.svelte-ix4pl2{background:#6b7280}@keyframes svelte-ix4pl2-attention-glow{0%,to{box-shadow:0 0 4px 1px #f59e0b4d}50%{box-shadow:0 0 8px 3px #f59e0b99}}.session-name.svelte-ix4pl2{flex:1;min-width:0;overflow:hidden;white-space:nowrap;font-weight:500;color:var(--text)}.session-name-text.svelte-ix4pl2{display:inline-block;white-space:nowrap;will-change:transform}.session-name.has-overflow.svelte-ix4pl2{mask-image:linear-gradient(to right,black calc(100% - 32px),transparent);-webkit-mask-image:linear-gradient(to right,black calc(100% - 32px),transparent)}li.svelte-ix4pl2:hover .session-name.has-overflow:where(.svelte-ix4pl2),li.svelte-ix4pl2.longpress .session-name.has-overflow:where(.svelte-ix4pl2){mask-image:none;-webkit-mask-image:none}li.active-session.selected.svelte-ix4pl2 .session-name:where(.svelte-ix4pl2){color:#fff}li.active-session.selected.svelte-ix4pl2 .session-name.has-overflow:where(.svelte-ix4pl2){mask-image:linear-gradient(to right,white calc(100% - 32px),transparent);-webkit-mask-image:linear-gradient(to right,white calc(100% - 32px),transparent)}li.active-session.selected.svelte-ix4pl2:hover .session-name.has-overflow:where(.svelte-ix4pl2),li.active-session.selected.svelte-ix4pl2.longpress .session-name.has-overflow:where(.svelte-ix4pl2){mask-image:none;-webkit-mask-image:none}.action-pill.svelte-ix4pl2{background:var(--border);border:none;color:var(--text);font-size:.75rem;cursor:pointer;padding:2px 8px;border-radius:12px;touch-action:manipulation;flex-shrink:0;min-height:24px;display:inline-flex;align-items:center;transition:background .15s,color .15s;line-height:1}.action-pill.svelte-ix4pl2:hover{background:#505050}.action-pill--mono.svelte-ix4pl2{font-family:monospace;font-size:.65rem;letter-spacing:.02em}.action-pill--danger.svelte-ix4pl2:hover{background:#4a2020;color:#e74c3c}li.active-session.selected.svelte-ix4pl2 .action-pill:where(.svelte-ix4pl2){background:#b35a3a;color:#fff}li.active-session.selected.svelte-ix4pl2 .action-pill:where(.svelte-ix4pl2):hover{background:#9a4d32}li.active-session.selected.svelte-ix4pl2 .action-pill--danger:where(.svelte-ix4pl2):hover{background:#8b2020;color:#fca5a5}.session-actions.svelte-ix4pl2{position:absolute;right:10px;top:50%;transform:translateY(-50%);display:flex;align-items:center;gap:4px;opacity:0;visibility:hidden;transition:opacity .15s .1s,visibility .15s .1s}li.svelte-ix4pl2:hover .session-actions:where(.svelte-ix4pl2),li.svelte-ix4pl2:focus-within .session-actions:where(.svelte-ix4pl2),li.svelte-ix4pl2.longpress .session-actions:where(.svelte-ix4pl2){opacity:1;visibility:visible}.session-row-2.svelte-ix4pl2{display:flex;align-items:center;gap:4px;min-width:0;padding-left:16px}.pr-icon.svelte-ix4pl2{font-size:.65rem;flex-shrink:0}.pr-open.svelte-ix4pl2{color:#4ade80}.pr-merged.svelte-ix4pl2{color:#a78bfa}.pr-closed.svelte-ix4pl2{color:#f87171}.session-sub.svelte-ix4pl2{font-size:.7rem;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.session-row-3.svelte-ix4pl2{display:flex;align-items:center;gap:6px;min-width:0;padding-left:16px}.session-time.svelte-ix4pl2{font-size:.65rem;color:var(--text-muted);opacity:.6}.git-diff.svelte-ix4pl2{display:flex;gap:4px;font-size:.65rem;font-family:monospace}.diff-add.svelte-ix4pl2{color:#4ade80}.diff-del.svelte-ix4pl2{color:#f87171}.sidebar-filters.svelte-1o5d4l8{display:flex;flex-direction:column;gap:4px;padding:6px 8px;flex-shrink:0}select.svelte-1o5d4l8{padding:6px 8px;background:var(--bg);border:1px solid var(--border);border-radius:6px;color:var(--text);font-size:.75rem;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%23aaa' fill='none' stroke-width='1.5'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 8px center;cursor:pointer;transition:border-color .15s,box-shadow .3s}select.svelte-1o5d4l8:focus{border-color:var(--accent)}input.svelte-1o5d4l8{padding:6px 8px;background:var(--bg);border:1px solid var(--border);border-radius:6px;color:var(--text);font-size:.75rem;outline:none;-webkit-appearance:none}input.svelte-1o5d4l8:focus{border-color:var(--accent)}.role-filter.svelte-1o5d4l8{display:flex;gap:0;border:1px solid var(--border);border-radius:6px;overflow:hidden}.role-btn.svelte-1o5d4l8{flex:1;padding:5px 8px;background:var(--bg);border:none;border-right:1px solid var(--border);color:var(--text-muted);font-size:.7rem;cursor:pointer;transition:background .15s,color .15s}.role-btn.svelte-1o5d4l8:last-child{border-right:none}.role-btn.svelte-1o5d4l8:hover{color:var(--text)}.role-btn.active.svelte-1o5d4l8{background:var(--accent);color:#fff}li.pr-item.svelte-jhsg4e{position:relative;display:flex;align-items:flex-start;padding:8px 10px;cursor:pointer;border-radius:6px;margin:2px 6px;font-size:.8rem;color:var(--text-muted);touch-action:manipulation;transition:background .15s,border-color .15s;background:transparent;border:1px solid var(--border);opacity:.8}li.pr-item.svelte-jhsg4e:hover,li.pr-item.svelte-jhsg4e.longpress{opacity:1;border-color:var(--accent)}li.pr-item.active-session.svelte-jhsg4e{background:var(--bg);border-color:var(--accent);opacity:1}li.pr-item.selected.svelte-jhsg4e{background:var(--accent);border-color:var(--accent);color:#fff;opacity:1}li.pr-item.selected.svelte-jhsg4e .pr-title:where(.svelte-jhsg4e){color:#fff}li.pr-item.selected.svelte-jhsg4e .pr-meta:where(.svelte-jhsg4e),li.pr-item.selected.svelte-jhsg4e .pr-time:where(.svelte-jhsg4e){color:#ffffffb3}li.pr-item.selected.svelte-jhsg4e .role-badge:where(.svelte-jhsg4e){background:#fff3;color:#fff}.pr-info.svelte-jhsg4e{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.pr-row-1.svelte-jhsg4e{display:flex;align-items:center;min-width:0}.pr-state{font-size:.65rem;flex-shrink:0;width:16px;text-align:center;margin-right:4px}.pr-open{color:#4ade80}.pr-merged{color:#a78bfa}.pr-closed{color:#f87171}.pr-title.svelte-jhsg4e{flex:1;min-width:0;overflow:hidden;white-space:nowrap;font-weight:500;color:var(--text)}.pr-title-text.svelte-jhsg4e{display:inline-block;white-space:nowrap;will-change:transform}.pr-title.has-overflow.svelte-jhsg4e{mask-image:linear-gradient(to right,black calc(100% - 32px),transparent);-webkit-mask-image:linear-gradient(to right,black calc(100% - 32px),transparent)}li.svelte-jhsg4e:hover .pr-title.has-overflow:where(.svelte-jhsg4e),li.svelte-jhsg4e.longpress .pr-title.has-overflow:where(.svelte-jhsg4e){mask-image:none;-webkit-mask-image:none}.pr-actions.svelte-jhsg4e{position:absolute;right:10px;top:50%;transform:translateY(-50%);display:flex;align-items:center;gap:2px;opacity:0;visibility:hidden;transition:opacity .15s .1s,visibility .15s .1s}li.svelte-jhsg4e:hover .pr-actions:where(.svelte-jhsg4e),li.svelte-jhsg4e:focus-within .pr-actions:where(.svelte-jhsg4e),li.svelte-jhsg4e.longpress .pr-actions:where(.svelte-jhsg4e){opacity:1;visibility:visible}.action-pill.svelte-jhsg4e{background:var(--border);border:none;color:var(--text);font-size:.75rem;cursor:pointer;padding:2px 8px;border-radius:12px;touch-action:manipulation;flex-shrink:0;min-height:24px;display:inline-flex;align-items:center;transition:background .15s,color .15s;line-height:1}.action-pill.svelte-jhsg4e:hover{background:#505050}.action-pill--mono.svelte-jhsg4e{font-family:monospace;font-size:.65rem;letter-spacing:.02em}li.pr-item.selected.svelte-jhsg4e .action-pill:where(.svelte-jhsg4e){background:#b35a3a;color:#fff}li.pr-item.selected.svelte-jhsg4e .action-pill:where(.svelte-jhsg4e):hover{background:#9a4d32}.external-link-btn.svelte-jhsg4e{background:none;border:none;color:var(--text-muted);cursor:pointer;padding:2px 4px;border-radius:4px;touch-action:manipulation;flex-shrink:0;display:inline-flex;align-items:center;transition:color .15s,transform .15s}.external-link-btn.svelte-jhsg4e:hover{color:var(--accent);transform:scale(1.1)}li.pr-item.selected.svelte-jhsg4e .external-link-btn:where(.svelte-jhsg4e){color:#ffffffb3}li.pr-item.selected.svelte-jhsg4e .external-link-btn:where(.svelte-jhsg4e):hover{color:#fff}.review-badge.svelte-jhsg4e{font-size:.7rem;padding:0 3px}.review-approved.svelte-jhsg4e{color:#4ade80}.review-changes.svelte-jhsg4e{color:#f87171}.review-pending.svelte-jhsg4e{color:#f59e0b}.pr-row-2.svelte-jhsg4e{display:flex;align-items:center;gap:4px;min-width:0;padding-left:20px}.pr-meta.svelte-jhsg4e{font-size:.7rem;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.role-badge.svelte-jhsg4e{font-size:.6rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;padding:1px 5px;border-radius:3px;flex-shrink:0}.role-author.svelte-jhsg4e{background:#60a5fa26;color:#60a5fa}.role-reviewer.svelte-jhsg4e{background:#a78bfa26;color:#a78bfa}.pr-row-3.svelte-jhsg4e{display:flex;align-items:center;gap:6px;min-width:0;padding-left:20px}.pr-time.svelte-jhsg4e{font-size:.65rem;color:var(--text-muted);opacity:.6}.git-diff.svelte-jhsg4e{display:flex;gap:4px;font-size:.65rem;font-family:monospace}.diff-add.svelte-jhsg4e{color:#4ade80}.diff-del.svelte-jhsg4e{color:#f87171}.repo-group-refresh.svelte-1ekl114{background:none;border:none;color:var(--text-muted);font-size:.75rem;cursor:pointer;padding:0 4px;flex-shrink:0;transition:color .15s}.repo-group-refresh.svelte-1ekl114:hover{color:var(--accent)}.repo-group-refresh.svelte-1ekl114:disabled{opacity:.5;cursor:not-allowed}.spinning.svelte-1ekl114{display:inline-block;animation:svelte-1ekl114-spin 1s linear infinite}@keyframes svelte-1ekl114-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.session-list-tabs.svelte-ynafm7{display:flex;padding:0 8px;border-bottom:1px solid var(--border)}.sidebar-tab.svelte-ynafm7{flex:1;background:none;border:none;border-bottom:2px solid transparent;color:var(--text-muted);font-size:.7rem;padding:6px 4px;cursor:pointer;transition:color .15s,border-color .15s;text-align:center}.sidebar-tab.svelte-ynafm7:hover{color:var(--text)}.sidebar-tab.active.svelte-ynafm7{color:var(--accent);border-bottom-color:var(--accent)}.tab-count.svelte-ynafm7{opacity:.7}.session-list.svelte-ynafm7{list-style:none;flex:1;overflow-y:auto;padding:8px 0}.session-divider{font-size:.65rem;font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;padding:8px 12px 4px;opacity:.6;list-style:none}.repo-group-header{display:flex;align-items:center;gap:4px;padding:6px 10px;cursor:pointer;list-style:none;transition:background .15s;border-radius:4px;margin:2px 6px}.repo-group-header:hover{background:var(--border)}.chevron{display:inline-block;font-size:.55rem;transition:transform .15s;color:var(--text-muted);flex-shrink:0}.chevron.expanded{transform:rotate(90deg)}.repo-group-name{font-size:.7rem;font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.repo-group-root{font-size:.6rem;color:var(--text-muted);opacity:.6;flex-shrink:0}.repo-group-count{font-size:.6rem;color:var(--text-muted);opacity:.5;margin-left:auto;flex-shrink:0}.repo-group-add{background:none;border:none;color:var(--text-muted);font-size:.8rem;font-weight:600;cursor:pointer;padding:0 4px;flex-shrink:0;line-height:1;transition:color .15s;opacity:0}.repo-group-header:hover .repo-group-add{opacity:1}.repo-group-add:hover,.repo-group-add:focus-visible{color:var(--accent);opacity:1}.pr-hint{font-size:.75rem;color:var(--text-muted);text-align:center;padding:20px 12px;opacity:.6;list-style:none}.pr-hint-sub{font-size:.65rem;opacity:.8;display:block;margin-top:4px}.pr-hint code{background:var(--bg);padding:1px 4px;border-radius:3px;font-size:.65rem}.sidebar.svelte-owj5vn{position:relative;display:flex;flex-direction:column;background:var(--surface);border-right:1px solid var(--border);overflow:hidden;transition:transform .25s ease,width .2s ease,min-width .2s ease;z-index:100}.resize-handle.svelte-owj5vn{position:absolute;top:0;right:0;width:4px;height:100%;cursor:col-resize;z-index:10;transition:background .15s}.resize-handle.svelte-owj5vn:hover{background:var(--accent)}.sidebar-header.svelte-owj5vn{display:flex;align-items:center;justify-content:space-between;padding:12px 10px;border-bottom:1px solid var(--border);flex-shrink:0}.sidebar-label.svelte-owj5vn{flex:1;font-size:.85rem;font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em}.collapse-btn.svelte-owj5vn{background:none;border:none;color:var(--text-muted);font-size:1.1rem;cursor:pointer;padding:4px 8px;border-radius:4px;flex-shrink:0;line-height:1}.collapse-btn.svelte-owj5vn:hover{color:var(--text);background:var(--border)}.sidebar.collapsed.svelte-owj5vn .sidebar-header:where(.svelte-owj5vn){justify-content:center;padding:12px 4px}.icon-btn.svelte-owj5vn{background:none;border:none;color:var(--text);font-size:1.2rem;cursor:pointer;padding:4px 6px;border-radius:4px;touch-action:manipulation;display:none}.icon-btn.svelte-owj5vn:active{background:var(--border)}.new-session-btn.svelte-owj5vn{margin:8px;padding:10px 12px;background:none;border:1px solid var(--border);border-radius:6px;color:var(--text);font-size:.875rem;cursor:pointer;touch-action:manipulation;text-align:center;flex-shrink:0}.new-session-btn.svelte-owj5vn:active{background:var(--border)}.settings-btn.svelte-owj5vn{margin:0 8px 8px;padding:10px 12px;background:none;border:1px solid var(--border);border-radius:6px;color:var(--text-muted);font-size:.8rem;cursor:pointer;touch-action:manipulation;text-align:center;flex-shrink:0}.settings-btn.svelte-owj5vn:active{background:var(--border)}@media(max-width:600px){.sidebar.svelte-owj5vn{position:fixed;top:0;left:0;height:100%;transform:translate(-100%);box-shadow:2px 0 12px #00000080;transition:transform .25s ease}.sidebar.open.svelte-owj5vn{transform:translate(0)}.collapse-btn.svelte-owj5vn{display:none}.icon-btn.svelte-owj5vn{display:block;font-size:1.4rem;padding:4px 8px}.resize-handle.svelte-owj5vn{display:none}}/**
2
2
  * Copyright (c) 2014 The xterm.js authors. All rights reserved.
3
3
  * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
4
4
  * https://github.com/chjj/term.js
@@ -11,8 +11,8 @@
11
11
  <meta name="apple-mobile-web-app-capable" content="yes" />
12
12
  <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
13
13
  <meta name="theme-color" content="#1a1a1a" />
14
- <script type="module" crossorigin src="/assets/index-wbWuk3tu.js"></script>
15
- <link rel="stylesheet" crossorigin href="/assets/index-CZb-cqkh.css">
14
+ <script type="module" crossorigin src="/assets/index-CUkDx_1l.js"></script>
15
+ <link rel="stylesheet" crossorigin href="/assets/index-Not5cXLa.css">
16
16
  </head>
17
17
  <body>
18
18
  <div id="app"></div>
@@ -12,7 +12,7 @@ import { loadConfig, saveConfig, DEFAULTS, readMeta, writeMeta, deleteMeta, ensu
12
12
  import * as auth from './auth.js';
13
13
  import * as sessions from './sessions.js';
14
14
  import { setupWebSocket } from './ws.js';
15
- import { WorktreeWatcher, WORKTREE_DIRS, isValidWorktreePath, parseWorktreeListPorcelain } from './watcher.js';
15
+ import { WorktreeWatcher, WORKTREE_DIRS, isValidWorktreePath, parseWorktreeListPorcelain, parseAllWorktrees } from './watcher.js';
16
16
  import { isInstalled as serviceIsInstalled } from './service.js';
17
17
  import { extensionForMime, setClipboardImage } from './clipboard.js';
18
18
  const __filename = fileURLToPath(import.meta.url);
@@ -507,9 +507,22 @@ async function main() {
507
507
  res.status(400).json({ error: 'worktreePath and repoPath are required' });
508
508
  return;
509
509
  }
510
- if (!isValidWorktreePath(worktreePath)) {
511
- res.status(400).json({ error: 'Path is not inside a worktree directory' });
512
- return;
510
+ // Validate the path is a real git worktree (not the main worktree)
511
+ try {
512
+ const { stdout: wtListOut } = await execFileAsync('git', ['worktree', 'list', '--porcelain'], { cwd: repoPath });
513
+ const allWorktrees = parseAllWorktrees(wtListOut, repoPath);
514
+ const isKnownWorktree = allWorktrees.some(wt => wt.path === path.resolve(worktreePath) && !wt.isMain);
515
+ if (!isKnownWorktree) {
516
+ res.status(400).json({ error: 'Path is not a recognized git worktree' });
517
+ return;
518
+ }
519
+ }
520
+ catch {
521
+ // If git worktree list fails, fall back to the directory-name check
522
+ if (!isValidWorktreePath(worktreePath)) {
523
+ res.status(400).json({ error: 'Path is not inside a worktree directory' });
524
+ return;
525
+ }
513
526
  }
514
527
  // Check no active session is using this worktree
515
528
  const activeSessions = sessions.list();
@@ -620,6 +633,62 @@ async function main() {
620
633
  }
621
634
  }
622
635
  if (branchName && branchExists) {
636
+ // Check if branch is already checked out in an existing worktree
637
+ const { stdout: wtListOut } = await execFileAsync('git', ['worktree', 'list', '--porcelain'], { cwd: repoPath });
638
+ const allWorktrees = parseAllWorktrees(wtListOut, repoPath);
639
+ const existingWt = allWorktrees.find(wt => wt.branch === branchName);
640
+ if (existingWt) {
641
+ // Branch already checked out — redirect to the existing worktree
642
+ if (existingWt.isMain) {
643
+ // Main worktree → create a repo session
644
+ const existingRepoSession = sessions.findRepoSession(repoPath);
645
+ if (existingRepoSession) {
646
+ res.status(409).json({ error: 'A session already exists for this repo', sessionId: existingRepoSession.id });
647
+ return;
648
+ }
649
+ const repoSession = sessions.create({
650
+ type: 'repo',
651
+ repoName: name,
652
+ repoPath,
653
+ cwd: repoPath,
654
+ root,
655
+ displayName: name,
656
+ command: config.claudeCommand,
657
+ args: baseArgs,
658
+ });
659
+ res.status(201).json(repoSession);
660
+ return;
661
+ }
662
+ else {
663
+ // Another worktree → create a worktree session with --continue
664
+ cwd = existingWt.path;
665
+ sessionRepoPath = existingWt.path;
666
+ worktreeName = existingWt.path.split('/').pop() || '';
667
+ args = ['--continue', ...baseArgs];
668
+ const displayNameVal = branchName || worktreeName;
669
+ const session = sessions.create({
670
+ type: 'worktree',
671
+ repoName: name,
672
+ repoPath: sessionRepoPath,
673
+ cwd,
674
+ root,
675
+ worktreeName,
676
+ branchName: branchName || worktreeName,
677
+ displayName: displayNameVal,
678
+ command: config.claudeCommand,
679
+ args,
680
+ configPath: CONFIG_PATH,
681
+ });
682
+ writeMeta(CONFIG_PATH, {
683
+ worktreePath: sessionRepoPath,
684
+ displayName: displayNameVal,
685
+ lastActivity: new Date().toISOString(),
686
+ branchName: branchName || worktreeName,
687
+ });
688
+ res.status(201).json(session);
689
+ return;
690
+ }
691
+ }
623
692
  await execFileAsync('git', ['worktree', 'add', targetDir, resolvedBranch], { cwd: repoPath });
624
693
  }
625
694
  else if (branchName) {
@@ -8,6 +8,32 @@ export function isValidWorktreePath(worktreePath) {
8
8
  return resolved.includes(path.sep + dir + path.sep);
9
9
  });
10
10
  }
11
+ /**
12
+ * Parse `git worktree list --porcelain` output into ALL entries (including main worktree).
13
+ * Skips bare entries. Detached HEAD entries get empty branch string.
14
+ */
15
+ export function parseAllWorktrees(stdout, repoPath) {
16
+ const results = [];
17
+ const blocks = stdout.split('\n\n').filter(Boolean);
18
+ for (const block of blocks) {
19
+ const lines = block.split('\n');
20
+ let wtPath = '';
21
+ let branch = '';
22
+ let bare = false;
23
+ for (const line of lines) {
24
+ if (line.startsWith('worktree '))
25
+ wtPath = line.slice(9);
26
+ if (line.startsWith('branch refs/heads/'))
27
+ branch = line.slice(18);
28
+ if (line === 'bare')
29
+ bare = true;
30
+ }
31
+ if (!wtPath || bare)
32
+ continue;
33
+ results.push({ path: wtPath, branch, isMain: wtPath === repoPath });
34
+ }
35
+ return results;
36
+ }
11
37
  /**
12
38
  * Parse `git worktree list --porcelain` output into structured entries.
13
39
  * Skips the main worktree (matching repoPath) and bare/detached entries.
@@ -1,6 +1,6 @@
1
1
  import { describe, it } from 'node:test';
2
2
  import assert from 'node:assert/strict';
3
- import { WORKTREE_DIRS, isValidWorktreePath, parseWorktreeListPorcelain } from '../server/watcher.js';
3
+ import { WORKTREE_DIRS, isValidWorktreePath, parseWorktreeListPorcelain, parseAllWorktrees } from '../server/watcher.js';
4
4
  describe('worktree directories constant', () => {
5
5
  it('should include both .worktrees and .claude/worktrees', () => {
6
6
  assert.deepEqual(WORKTREE_DIRS, ['.worktrees', '.claude/worktrees']);
@@ -146,6 +146,91 @@ describe('parseWorktreeListPorcelain', () => {
146
146
  assert.equal(result[0].branch, 'dy/feat/deep/nesting/here');
147
147
  });
148
148
  });
149
+ describe('parseAllWorktrees', () => {
150
+ const repoPath = '/Users/me/code/my-repo';
151
+ it('should include the main worktree with isMain=true', () => {
152
+ const stdout = [
153
+ `worktree ${repoPath}`,
154
+ 'HEAD abc123',
155
+ 'branch refs/heads/main',
156
+ '',
157
+ ].join('\n');
158
+ const result = parseAllWorktrees(stdout, repoPath);
159
+ assert.equal(result.length, 1);
160
+ assert.equal(result[0].path, repoPath);
161
+ assert.equal(result[0].branch, 'main');
162
+ assert.equal(result[0].isMain, true);
163
+ });
164
+ it('should mark non-main worktrees with isMain=false', () => {
165
+ const stdout = [
166
+ `worktree ${repoPath}`,
167
+ 'HEAD abc123',
168
+ 'branch refs/heads/main',
169
+ '',
170
+ 'worktree /Users/me/code/my-repo/.worktrees/feat-branch',
171
+ 'HEAD def456',
172
+ 'branch refs/heads/feat/branch',
173
+ '',
174
+ ].join('\n');
175
+ const result = parseAllWorktrees(stdout, repoPath);
176
+ assert.equal(result.length, 2);
177
+ assert.equal(result[0].isMain, true);
178
+ assert.equal(result[1].isMain, false);
179
+ assert.equal(result[1].path, '/Users/me/code/my-repo/.worktrees/feat-branch');
180
+ assert.equal(result[1].branch, 'feat/branch');
181
+ });
182
+ it('should still skip bare entries', () => {
183
+ const stdout = [
184
+ `worktree ${repoPath}`,
185
+ 'HEAD abc123',
186
+ 'branch refs/heads/main',
187
+ '',
188
+ 'worktree /some/bare/repo',
189
+ 'HEAD def456',
190
+ 'bare',
191
+ '',
192
+ ].join('\n');
193
+ const result = parseAllWorktrees(stdout, repoPath);
194
+ assert.equal(result.length, 1);
195
+ assert.equal(result[0].isMain, true);
196
+ });
197
+ it('should include detached HEAD entries with empty branch', () => {
198
+ const stdout = [
199
+ `worktree ${repoPath}`,
200
+ 'HEAD abc123',
201
+ 'branch refs/heads/main',
202
+ '',
203
+ 'worktree /Users/me/code/my-repo/.worktrees/detached',
204
+ 'HEAD def456',
205
+ 'detached',
206
+ '',
207
+ ].join('\n');
208
+ const result = parseAllWorktrees(stdout, repoPath);
209
+ assert.equal(result.length, 2);
210
+ assert.equal(result[1].branch, '');
211
+ });
212
+ it('should handle empty output', () => {
213
+ const result = parseAllWorktrees('', repoPath);
214
+ assert.equal(result.length, 0);
215
+ });
216
+ it('should find worktree by branch name', () => {
217
+ const stdout = [
218
+ `worktree ${repoPath}`,
219
+ 'HEAD abc123',
220
+ 'branch refs/heads/dy/feat/worktree-isolation',
221
+ '',
222
+ 'worktree /Users/me/code/my-repo/.worktrees/feat-a',
223
+ 'HEAD def456',
224
+ 'branch refs/heads/feat/a',
225
+ '',
226
+ ].join('\n');
227
+ const result = parseAllWorktrees(stdout, repoPath);
228
+ const match = result.find(wt => wt.branch === 'dy/feat/worktree-isolation');
229
+ assert.ok(match);
230
+ assert.equal(match.path, repoPath);
231
+ assert.equal(match.isMain, true);
232
+ });
233
+ });
149
234
  describe('CLI worktree arg parsing', () => {
150
235
  it('should extract --yolo and leave other args intact', () => {
151
236
  const args = ['add', './.worktrees/my-feature', '-b', 'my-feature', '--yolo'];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-remote-cli",
3
- "version": "2.6.0",
3
+ "version": "2.8.0",
4
4
  "description": "Remote web interface for Claude Code CLI sessions",
5
5
  "type": "module",
6
6
  "main": "dist/server/index.js",