mirror of
https://github.com/stablyai/orca.git
synced 2026-10-30 08:37:49 +00:00
* 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>
69 lines
1.7 KiB
TypeScript
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()
|
|
})
|
|
})
|