b818c427c8
Every CodingStatusRow mounted its own WorktreeDialog and subscribed to the same global `$newWorktreeRequest` token, so a single ⌘⇧B with two composers on screen opened two stacked dialogs — dismissing the front one revealed an identical empty dialog behind it, which read as the dialog "staying open" after creating a worktree. Mount it exactly once in the sidebar (beside ProjectDialog) and drive it from a `$worktreeDialog` atom, mirroring how the project dialog already works. One mount cannot double-open. Every entry point (⌘⇧B, the rail's kebab, the sidebar's + button) now publishes intent instead of rendering its own copy; the rail and the button pin their own repo so a tile's kebab still targets that tile's worktree. The target is resolved at open time by `resolveWorktreeRepoPath`, which walks the focused surface's cwd then the entered project's root, validating each candidate against the repo-status probe cache — a project's root folder is not necessarily a git repo, so existence alone isn't proof. That makes the resolver the sole authority, so the hotkey no longer pre-gates on `$repoStatus` and now works from a detached session that sits inside a project. When nothing in reach is a repo it is a silent no-op: a worktree only exists inside a repo, so there is nothing to report. Also adds a project picker to the dialog so the repo can be retargeted before naming the branch. E2E: extends worktree-branch-status.spec.ts with a 10-branch repo, visual snapshots of the base-branch picker and the convert-branch view, a geometry assertion that the picker isn't clipped by the dialog (fails headlessly on regression rather than waiting for a human to compare diff images), and a two-composer test asserting one keypress opens exactly one dialog. Tests 1 and 4 fail against the previous code and pass now.