Files
orca/src/main/ipc/worktree-folder-rename-target.test.ts
T
Trevin ChowandJinjing 7361bff698 feat: rename worktree folder to match branch on first work (#4743)
* feat: rename worktree folder to match branch on first work

When the first agent message auto-renames a freshly created creature branch to a
short, work-derived name, also align the on-disk worktree folder and the sidebar
display name with it. Re-key every worktree-scoped slice of state — renderer
store maps plus the persisted main-process state — through the resulting id
change so the live worktree survives the rename instead of being treated as a
deletion (its tabs, terminals, browser panes, and git status all follow).

The rename is best-effort and local-only: a skip or failure (remote runtime,
Windows lock, destination taken) leaves the folder as-is and never undoes the
branch/display rename that already landed.

Squashed from the original PR #4743 commits, rebased onto upstream/main to drop
accumulated merge commits and i18n formatting churn so the branch carries only
the feature diff:
- Rename worktree folder to match branch on first work
- migrate renamed worktree session ids
- keep the live worktree alive through a folder rename
- address PR review feedback

* Address PR review feedback (#4743)

- orca-runtime: emit in-process worktreesChanged client event on folder rename, mirroring notifyBranchRenamed so onClientEvent listeners aren't left stale
- worktrees: re-key rightSidebarExplorerViewByWorktree and activeWorkspaceKey through a worktree-identity rename (both were worktree-scoped but missed by buildWorktreeRenameState)
- branch-name-from-work: treat prefix-only model output as an empty slug so the caller skips the rename instead of producing a doubled prefix
- worktree-folder-rename-target: document why posix.dirname is safe (Windows filtered out earlier)
- tests for each of the above

* Extract branch rename test helpers to a separate harness file

Move git responders, mock builders, and test event fixtures out of
first-work-branch-rename.test.ts into a new test harness file. This
reduces file length and removes the max-lines ESLint disable directive,
complying with project style guidelines.

* Wrap entire OnboardingFlow in TooltipProvider

Enable the use of tooltips anywhere within the onboarding flow, rather
than restricting them to the step indicators.

---------

Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
2026-06-15 19:58:55 -07:00

69 lines
1.7 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import { planWorktreeFolderRename } from './worktree-folder-rename-target'
describe('planWorktreeFolderRename', () => {
const base = {
repoId: 'repo1',
repoPath: '/repos/orca',
settings: { nestWorkspaces: false, workspaceDir: '/ws' },
platform: 'darwin' as NodeJS.Platform,
isRemote: false
}
it('plans a same-parent rename to the new branch leaf', () => {
expect(
planWorktreeFolderRename({
...base,
oldWorktreePath: '/ws/cunner',
newLeaf: 'worktree-creation-spinner'
})
).toEqual({
oldPath: '/ws/cunner',
newPath: '/ws/worktree-creation-spinner',
newWorktreeId: 'repo1::/ws/worktree-creation-spinner'
})
})
it('skips remote worktrees (SSH folder moves are not mirrored)', () => {
expect(
planWorktreeFolderRename({
...base,
isRemote: true,
oldWorktreePath: '/ws/cunner',
newLeaf: 'fix-auth'
})
).toBeNull()
})
it('skips on Windows (the OS locks the running agent cwd)', () => {
expect(
planWorktreeFolderRename({
...base,
platform: 'win32',
oldWorktreePath: '/ws/cunner',
newLeaf: 'fix-auth'
})
).toBeNull()
})
it('skips when the folder name already matches the leaf', () => {
expect(
planWorktreeFolderRename({
...base,
oldWorktreePath: '/ws/fix-auth',
newLeaf: 'fix-auth'
})
).toBeNull()
})
it('skips when settings would relocate to a different parent (not a rename)', () => {
expect(
planWorktreeFolderRename({
...base,
oldWorktreePath: '/somewhere/else/cunner',
newLeaf: 'fix-auth'
})
).toBeNull()
})
})