vde-worktree 0.0.20 → 0.0.21

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 +1 @@
1
- {"version":3,"file":"index.mjs","names":["fsConstants","isPathInsideOrEqual","fsConstants","fsConstants","lockFilePath","fsConstants","fsConstants","writeJsonAtomically","fsConstants","fsConstants","fsConstants","selectPathWithFzf","defaultSelectPathWithFzf","collectWorktreeSnapshot","collectWorktreeSnapshotBase"],"sources":["../src/core/constants.ts","../src/core/errors.ts","../src/config/git-boundary.ts","../src/config/types.ts","../src/config/loader.ts","../src/git/exec.ts","../src/core/paths.ts","../src/core/hooks.ts","../src/core/init.ts","../src/core/repo-lock.ts","../src/core/worktree-merge-lifecycle.ts","../src/core/worktree-lock.ts","../src/integrations/gh.ts","../src/git/worktree.ts","../src/core/worktree-state.ts","../src/integrations/fzf.ts","../src/utils/logger.ts","../src/cli/package-version.ts","../src/cli/index.ts","../src/index.ts"],"sourcesContent":["export const SCHEMA_VERSION = 1\n\nexport const EXIT_CODE = {\n OK: 0,\n NOT_GIT_REPOSITORY: 2,\n INVALID_ARGUMENT: 3,\n SAFETY_REJECTED: 4,\n DEPENDENCY_MISSING: 5,\n LOCK_FAILED: 6,\n HOOK_FAILED: 10,\n GIT_COMMAND_FAILED: 20,\n CHILD_PROCESS_FAILED: 21,\n INTERNAL_ERROR: 30,\n} as const\n\nexport const DEFAULT_HOOK_TIMEOUT_MS = 30_000\nexport const DEFAULT_LOCK_TIMEOUT_MS = 15_000\nexport const DEFAULT_STALE_LOCK_TTL_SECONDS = 1_800\n\nexport const COMMAND_NAMES = {\n INIT: \"init\",\n LIST: \"list\",\n STATUS: \"status\",\n PATH: \"path\",\n SWITCH: \"switch\",\n NEW: \"new\",\n MV: \"mv\",\n DEL: \"del\",\n GONE: \"gone\",\n GET: \"get\",\n EXTRACT: \"extract\",\n ABSORB: \"absorb\",\n UNABSORB: \"unabsorb\",\n USE: \"use\",\n EXEC: \"exec\",\n INVOKE: \"invoke\",\n COPY: \"copy\",\n LINK: \"link\",\n LOCK: \"lock\",\n UNLOCK: \"unlock\",\n CD: \"cd\",\n COMPLETION: \"completion\",\n} as const\n\nexport const WRITE_COMMANDS = new Set<string>([\n COMMAND_NAMES.INIT,\n COMMAND_NAMES.SWITCH,\n COMMAND_NAMES.NEW,\n COMMAND_NAMES.MV,\n COMMAND_NAMES.DEL,\n COMMAND_NAMES.GONE,\n COMMAND_NAMES.GET,\n COMMAND_NAMES.EXTRACT,\n COMMAND_NAMES.ABSORB,\n COMMAND_NAMES.UNABSORB,\n COMMAND_NAMES.USE,\n COMMAND_NAMES.LOCK,\n COMMAND_NAMES.UNLOCK,\n])\n","import { EXIT_CODE } from \"./constants\"\n\nexport type ErrorCode =\n | \"NOT_GIT_REPOSITORY\"\n | \"INVALID_ARGUMENT\"\n | \"INVALID_CONFIG\"\n | \"UNKNOWN_COMMAND\"\n | \"UNSAFE_FLAG_REQUIRED\"\n | \"NOT_INITIALIZED\"\n | \"WORKTREE_NOT_FOUND\"\n | \"BRANCH_ALREADY_ATTACHED\"\n | \"BRANCH_ALREADY_EXISTS\"\n | \"BRANCH_IN_USE\"\n | \"TARGET_PATH_NOT_EMPTY\"\n | \"PATH_OUTSIDE_REPO\"\n | \"ABSOLUTE_PATH_NOT_ALLOWED\"\n | \"LOCK_CONFLICT\"\n | \"DETACHED_HEAD\"\n | \"DIRTY_WORKTREE\"\n | \"UNMERGED_WORKTREE\"\n | \"UNPUSHED_WORKTREE\"\n | \"LOCKED_WORKTREE\"\n | \"STASH_APPLY_FAILED\"\n | \"REMOTE_NOT_FOUND\"\n | \"REMOTE_BRANCH_NOT_FOUND\"\n | \"INVALID_REMOTE_BRANCH_FORMAT\"\n | \"HOOK_NOT_FOUND\"\n | \"DEPENDENCY_MISSING\"\n | \"REPO_LOCK_TIMEOUT\"\n | \"REPO_LOCK_STALE_RECOVERY_FAILED\"\n | \"HOOK_NOT_EXECUTABLE\"\n | \"HOOK_TIMEOUT\"\n | \"HOOK_FAILED\"\n | \"GIT_COMMAND_FAILED\"\n | \"INTERNAL_ERROR\"\n\nconst ERROR_CODE_TO_EXIT_CODE: Record<ErrorCode, number> = {\n NOT_GIT_REPOSITORY: EXIT_CODE.NOT_GIT_REPOSITORY,\n INVALID_ARGUMENT: EXIT_CODE.INVALID_ARGUMENT,\n INVALID_CONFIG: EXIT_CODE.INVALID_ARGUMENT,\n UNKNOWN_COMMAND: EXIT_CODE.INVALID_ARGUMENT,\n UNSAFE_FLAG_REQUIRED: EXIT_CODE.SAFETY_REJECTED,\n NOT_INITIALIZED: EXIT_CODE.SAFETY_REJECTED,\n WORKTREE_NOT_FOUND: EXIT_CODE.SAFETY_REJECTED,\n BRANCH_ALREADY_ATTACHED: EXIT_CODE.SAFETY_REJECTED,\n BRANCH_ALREADY_EXISTS: EXIT_CODE.SAFETY_REJECTED,\n BRANCH_IN_USE: EXIT_CODE.SAFETY_REJECTED,\n TARGET_PATH_NOT_EMPTY: EXIT_CODE.SAFETY_REJECTED,\n PATH_OUTSIDE_REPO: EXIT_CODE.SAFETY_REJECTED,\n ABSOLUTE_PATH_NOT_ALLOWED: EXIT_CODE.SAFETY_REJECTED,\n LOCK_CONFLICT: EXIT_CODE.SAFETY_REJECTED,\n DETACHED_HEAD: EXIT_CODE.SAFETY_REJECTED,\n DIRTY_WORKTREE: EXIT_CODE.SAFETY_REJECTED,\n UNMERGED_WORKTREE: EXIT_CODE.SAFETY_REJECTED,\n UNPUSHED_WORKTREE: EXIT_CODE.SAFETY_REJECTED,\n LOCKED_WORKTREE: EXIT_CODE.SAFETY_REJECTED,\n STASH_APPLY_FAILED: EXIT_CODE.SAFETY_REJECTED,\n REMOTE_NOT_FOUND: EXIT_CODE.SAFETY_REJECTED,\n REMOTE_BRANCH_NOT_FOUND: EXIT_CODE.SAFETY_REJECTED,\n INVALID_REMOTE_BRANCH_FORMAT: EXIT_CODE.INVALID_ARGUMENT,\n HOOK_NOT_FOUND: EXIT_CODE.SAFETY_REJECTED,\n DEPENDENCY_MISSING: EXIT_CODE.DEPENDENCY_MISSING,\n REPO_LOCK_TIMEOUT: EXIT_CODE.LOCK_FAILED,\n REPO_LOCK_STALE_RECOVERY_FAILED: EXIT_CODE.LOCK_FAILED,\n HOOK_NOT_EXECUTABLE: EXIT_CODE.HOOK_FAILED,\n HOOK_TIMEOUT: EXIT_CODE.HOOK_FAILED,\n HOOK_FAILED: EXIT_CODE.HOOK_FAILED,\n GIT_COMMAND_FAILED: EXIT_CODE.GIT_COMMAND_FAILED,\n INTERNAL_ERROR: EXIT_CODE.INTERNAL_ERROR,\n}\n\nexport type CliErrorOptions = {\n readonly message: string\n readonly details?: Record<string, unknown>\n readonly cause?: unknown\n}\n\nexport class CliError extends Error {\n readonly code: ErrorCode\n readonly exitCode: number\n readonly details: Record<string, unknown>\n\n constructor(code: ErrorCode, options: CliErrorOptions) {\n super(options.message, { cause: options.cause })\n this.code = code\n this.exitCode = ERROR_CODE_TO_EXIT_CODE[code]\n this.details = options.details ?? {}\n }\n}\n\nexport const createCliError = (code: ErrorCode, options: CliErrorOptions): CliError => {\n return new CliError(code, options)\n}\n\nexport const ensureCliError = (error: unknown): CliError => {\n if (error instanceof CliError) {\n return error\n }\n\n if (error instanceof Error) {\n return createCliError(\"INTERNAL_ERROR\", { message: error.message, cause: error })\n }\n\n return createCliError(\"INTERNAL_ERROR\", {\n message: \"An unexpected error occurred\",\n details: { value: String(error) },\n })\n}\n","import { lstat } from \"node:fs/promises\"\nimport { dirname, join, resolve } from \"node:path\"\n\nconst hasGitMarker = async (directory: string): Promise<boolean> => {\n try {\n const stat = await lstat(join(directory, \".git\"))\n return stat.isDirectory() || stat.isFile()\n } catch {\n return false\n }\n}\n\nexport const findGitBoundaryDirectory = async (cwd: string): Promise<string | null> => {\n let current = resolve(cwd)\n while (true) {\n if (await hasGitMarker(current)) {\n return current\n }\n const parent = dirname(current)\n if (parent === current) {\n return null\n }\n current = parent\n }\n}\n\nexport const collectConfigSearchDirectories = async (cwd: string): Promise<readonly string[]> => {\n const absoluteCwd = resolve(cwd)\n const boundary = await findGitBoundaryDirectory(absoluteCwd)\n if (boundary === null) {\n return [absoluteCwd]\n }\n\n const directories: string[] = []\n let current = absoluteCwd\n while (true) {\n directories.push(current)\n if (current === boundary) {\n break\n }\n const parent = dirname(current)\n if (parent === current) {\n break\n }\n current = parent\n }\n\n return directories.reverse()\n}\n","import { DEFAULT_HOOK_TIMEOUT_MS, DEFAULT_LOCK_TIMEOUT_MS, DEFAULT_STALE_LOCK_TTL_SECONDS } from \"../core/constants\"\n\nexport const LIST_TABLE_COLUMNS = [\"branch\", \"dirty\", \"merged\", \"pr\", \"locked\", \"ahead\", \"behind\", \"path\"] as const\n\nexport const LIST_PATH_TRUNCATE_VALUES = [\"auto\", \"never\"] as const\nexport const SELECTOR_CD_SURFACE_VALUES = [\"auto\", \"inline\", \"tmux-popup\"] as const\n\nexport type ListTableColumn = (typeof LIST_TABLE_COLUMNS)[number]\nexport type ListPathTruncate = (typeof LIST_PATH_TRUNCATE_VALUES)[number]\nexport type SelectorCdSurface = (typeof SELECTOR_CD_SURFACE_VALUES)[number]\n\nexport type ResolvedConfig = {\n readonly paths: {\n readonly worktreeRoot: string\n }\n readonly git: {\n readonly baseBranch: string | null\n readonly baseRemote: string\n }\n readonly github: {\n readonly enabled: boolean\n }\n readonly hooks: {\n readonly enabled: boolean\n readonly timeoutMs: number\n }\n readonly locks: {\n readonly timeoutMs: number\n readonly staleLockTTLSeconds: number\n }\n readonly list: {\n readonly table: {\n readonly columns: ReadonlyArray<ListTableColumn>\n readonly path: {\n readonly truncate: ListPathTruncate\n readonly minWidth: number\n }\n }\n }\n readonly selector: {\n readonly cd: {\n readonly prompt: string\n readonly surface: SelectorCdSurface\n readonly tmuxPopupOpts: string\n readonly fzf: {\n readonly extraArgs: ReadonlyArray<string>\n }\n }\n }\n}\n\nexport type DeepPartial<T> = {\n -readonly [K in keyof T]?: T[K] extends ReadonlyArray<infer U>\n ? ReadonlyArray<U>\n : T[K] extends object\n ? DeepPartial<T[K]>\n : T[K]\n}\n\nexport type PartialConfig = DeepPartial<ResolvedConfig>\n\nexport const DEFAULT_CONFIG: ResolvedConfig = {\n paths: {\n worktreeRoot: \".worktree\",\n },\n git: {\n baseBranch: null,\n baseRemote: \"origin\",\n },\n github: {\n enabled: true,\n },\n hooks: {\n enabled: true,\n timeoutMs: DEFAULT_HOOK_TIMEOUT_MS,\n },\n locks: {\n timeoutMs: DEFAULT_LOCK_TIMEOUT_MS,\n staleLockTTLSeconds: DEFAULT_STALE_LOCK_TTL_SECONDS,\n },\n list: {\n table: {\n columns: [...LIST_TABLE_COLUMNS],\n path: {\n truncate: \"auto\",\n minWidth: 12,\n },\n },\n },\n selector: {\n cd: {\n prompt: \"worktree> \",\n surface: \"auto\",\n tmuxPopupOpts: \"80%,70%\",\n fzf: {\n extraArgs: [],\n },\n },\n },\n}\n","import { constants as fsConstants } from \"node:fs\"\nimport { access, lstat, readFile, realpath } from \"node:fs/promises\"\nimport { homedir } from \"node:os\"\nimport { isAbsolute, join, relative, resolve, sep } from \"node:path\"\nimport { parse } from \"yaml\"\nimport { createCliError } from \"../core/errors\"\nimport { collectConfigSearchDirectories } from \"./git-boundary\"\nimport {\n DEFAULT_CONFIG,\n LIST_PATH_TRUNCATE_VALUES,\n LIST_TABLE_COLUMNS,\n SELECTOR_CD_SURFACE_VALUES,\n type ListPathTruncate,\n type ListTableColumn,\n type PartialConfig,\n type ResolvedConfig,\n} from \"./types\"\n\nconst CONFIG_FILE_BASENAME = \"config.yml\"\nconst LOCAL_CONFIG_PATH_SEGMENTS = [\".vde\", \"worktree\", CONFIG_FILE_BASENAME] as const\nconst GLOBAL_CONFIG_PATH_SEGMENTS = [\"vde\", \"worktree\", CONFIG_FILE_BASENAME] as const\n\ntype ValidationContext = {\n readonly file: string\n}\n\ntype LoadResolvedConfigInput = {\n readonly cwd: string\n readonly repoRoot: string\n}\n\nexport type LoadResolvedConfigResult = {\n readonly config: ResolvedConfig\n readonly loadedFiles: ReadonlyArray<string>\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return value !== null && typeof value === \"object\" && Array.isArray(value) !== true\n}\n\nconst toKeyPath = (segments: readonly string[]): string => {\n if (segments.length === 0) {\n return \"<root>\"\n }\n return segments.join(\".\")\n}\n\nconst throwInvalidConfig = ({\n file,\n keyPath,\n reason,\n}: {\n readonly file: string\n readonly keyPath: string\n readonly reason: string\n}): never => {\n throw createCliError(\"INVALID_CONFIG\", {\n message: `Invalid config: ${file} (${keyPath}: ${reason})`,\n details: {\n file,\n keyPath,\n reason,\n },\n })\n}\n\nconst expectRecord = ({\n value,\n ctx,\n keyPath,\n}: {\n readonly value: unknown\n readonly ctx: ValidationContext\n readonly keyPath: readonly string[]\n}): Record<string, unknown> => {\n if (isRecord(value)) {\n return value\n }\n return throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath(keyPath),\n reason: \"must be an object\",\n })\n}\n\nconst ensureNoUnknownKeys = ({\n record,\n allowedKeys,\n ctx,\n keyPath,\n}: {\n readonly record: Record<string, unknown>\n readonly allowedKeys: ReadonlyArray<string>\n readonly ctx: ValidationContext\n readonly keyPath: readonly string[]\n}): void => {\n const allowed = new Set(allowedKeys)\n for (const key of Object.keys(record)) {\n if (allowed.has(key)) {\n continue\n }\n const path = [...keyPath, key]\n throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath(path),\n reason: \"unknown key\",\n })\n }\n}\n\nconst parseBoolean = ({\n value,\n ctx,\n keyPath,\n}: {\n readonly value: unknown\n readonly ctx: ValidationContext\n readonly keyPath: readonly string[]\n}): boolean => {\n if (typeof value === \"boolean\") {\n return value\n }\n return throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath(keyPath),\n reason: \"must be boolean\",\n })\n}\n\nconst parseNonEmptyString = ({\n value,\n ctx,\n keyPath,\n}: {\n readonly value: unknown\n readonly ctx: ValidationContext\n readonly keyPath: readonly string[]\n}): string => {\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value\n }\n return throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath(keyPath),\n reason: \"must be a non-empty string\",\n })\n}\n\nconst parsePositiveInteger = ({\n value,\n ctx,\n keyPath,\n}: {\n readonly value: unknown\n readonly ctx: ValidationContext\n readonly keyPath: readonly string[]\n}): number => {\n if (typeof value === \"number\" && Number.isInteger(value) && value > 0) {\n return value\n }\n return throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath(keyPath),\n reason: \"must be a positive integer\",\n })\n}\n\nconst parseStringArray = ({\n value,\n ctx,\n keyPath,\n}: {\n readonly value: unknown\n readonly ctx: ValidationContext\n readonly keyPath: readonly string[]\n}): string[] => {\n if (Array.isArray(value) !== true) {\n return throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath(keyPath),\n reason: \"must be an array\",\n })\n }\n const values = value\n const result: string[] = []\n for (const [index, item] of values.entries()) {\n if (typeof item !== \"string\" || item.length === 0) {\n throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath([...keyPath, String(index)]),\n reason: \"must be a non-empty string\",\n })\n }\n result.push(item)\n }\n return result\n}\n\nconst parseColumns = ({\n value,\n ctx,\n keyPath,\n}: {\n readonly value: unknown\n readonly ctx: ValidationContext\n readonly keyPath: readonly string[]\n}): ReadonlyArray<ListTableColumn> => {\n if (Array.isArray(value) !== true) {\n return throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath(keyPath),\n reason: \"must be an array\",\n })\n }\n const values = value\n if (values.length === 0) {\n return throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath(keyPath),\n reason: \"must not be empty\",\n })\n }\n\n const allowed = new Set(LIST_TABLE_COLUMNS)\n const seen = new Set<string>()\n const parsed: ListTableColumn[] = []\n for (const [index, item] of values.entries()) {\n if (typeof item !== \"string\") {\n throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath([...keyPath, String(index)]),\n reason: \"must be a string\",\n })\n }\n if (allowed.has(item as ListTableColumn) !== true) {\n throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath([...keyPath, String(index)]),\n reason: `unsupported column: ${item}`,\n })\n }\n if (seen.has(item)) {\n throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath([...keyPath, String(index)]),\n reason: `duplicate column: ${item}`,\n })\n }\n seen.add(item)\n parsed.push(item as ListTableColumn)\n }\n return parsed\n}\n\nconst parseListPathTruncate = ({\n value,\n ctx,\n keyPath,\n}: {\n readonly value: unknown\n readonly ctx: ValidationContext\n readonly keyPath: readonly string[]\n}): ListPathTruncate => {\n if (typeof value !== \"string\" || (LIST_PATH_TRUNCATE_VALUES as readonly string[]).includes(value) !== true) {\n throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath(keyPath),\n reason: `must be one of: ${LIST_PATH_TRUNCATE_VALUES.join(\", \")}`,\n })\n }\n return value as ListPathTruncate\n}\n\nconst parseSelectorSurface = ({\n value,\n ctx,\n keyPath,\n}: {\n readonly value: unknown\n readonly ctx: ValidationContext\n readonly keyPath: readonly string[]\n}): ResolvedConfig[\"selector\"][\"cd\"][\"surface\"] => {\n if (typeof value !== \"string\" || (SELECTOR_CD_SURFACE_VALUES as readonly string[]).includes(value) !== true) {\n throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath(keyPath),\n reason: `must be one of: ${SELECTOR_CD_SURFACE_VALUES.join(\", \")}`,\n })\n }\n return value as ResolvedConfig[\"selector\"][\"cd\"][\"surface\"]\n}\n\nconst validatePartialConfig = ({\n rawConfig,\n ctx,\n}: {\n readonly rawConfig: unknown\n readonly ctx: ValidationContext\n}): PartialConfig => {\n if (rawConfig === null || rawConfig === undefined) {\n return {}\n }\n const root = expectRecord({\n value: rawConfig,\n ctx,\n keyPath: [],\n })\n\n ensureNoUnknownKeys({\n record: root,\n allowedKeys: [\"paths\", \"git\", \"github\", \"hooks\", \"locks\", \"list\", \"selector\"],\n ctx,\n keyPath: [],\n })\n\n const partial: PartialConfig = {}\n\n if (root.paths !== undefined) {\n const paths = expectRecord({\n value: root.paths,\n ctx,\n keyPath: [\"paths\"],\n })\n ensureNoUnknownKeys({\n record: paths,\n allowedKeys: [\"worktreeRoot\"],\n ctx,\n keyPath: [\"paths\"],\n })\n partial.paths = {}\n if (paths.worktreeRoot !== undefined) {\n partial.paths.worktreeRoot = parseNonEmptyString({\n value: paths.worktreeRoot,\n ctx,\n keyPath: [\"paths\", \"worktreeRoot\"],\n })\n }\n }\n\n if (root.git !== undefined) {\n const git = expectRecord({\n value: root.git,\n ctx,\n keyPath: [\"git\"],\n })\n ensureNoUnknownKeys({\n record: git,\n allowedKeys: [\"baseBranch\", \"baseRemote\"],\n ctx,\n keyPath: [\"git\"],\n })\n partial.git = {}\n if (git.baseBranch !== undefined) {\n if (git.baseBranch !== null && typeof git.baseBranch !== \"string\") {\n throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath([\"git\", \"baseBranch\"]),\n reason: \"must be a string or null\",\n })\n }\n partial.git.baseBranch =\n git.baseBranch === null\n ? null\n : parseNonEmptyString({\n value: git.baseBranch,\n ctx,\n keyPath: [\"git\", \"baseBranch\"],\n })\n }\n if (git.baseRemote !== undefined) {\n partial.git.baseRemote = parseNonEmptyString({\n value: git.baseRemote,\n ctx,\n keyPath: [\"git\", \"baseRemote\"],\n })\n }\n }\n\n if (root.github !== undefined) {\n const github = expectRecord({\n value: root.github,\n ctx,\n keyPath: [\"github\"],\n })\n ensureNoUnknownKeys({\n record: github,\n allowedKeys: [\"enabled\"],\n ctx,\n keyPath: [\"github\"],\n })\n partial.github = {}\n if (github.enabled !== undefined) {\n partial.github.enabled = parseBoolean({\n value: github.enabled,\n ctx,\n keyPath: [\"github\", \"enabled\"],\n })\n }\n }\n\n if (root.hooks !== undefined) {\n const hooks = expectRecord({\n value: root.hooks,\n ctx,\n keyPath: [\"hooks\"],\n })\n ensureNoUnknownKeys({\n record: hooks,\n allowedKeys: [\"enabled\", \"timeoutMs\"],\n ctx,\n keyPath: [\"hooks\"],\n })\n partial.hooks = {}\n if (hooks.enabled !== undefined) {\n partial.hooks.enabled = parseBoolean({\n value: hooks.enabled,\n ctx,\n keyPath: [\"hooks\", \"enabled\"],\n })\n }\n if (hooks.timeoutMs !== undefined) {\n partial.hooks.timeoutMs = parsePositiveInteger({\n value: hooks.timeoutMs,\n ctx,\n keyPath: [\"hooks\", \"timeoutMs\"],\n })\n }\n }\n\n if (root.locks !== undefined) {\n const locks = expectRecord({\n value: root.locks,\n ctx,\n keyPath: [\"locks\"],\n })\n ensureNoUnknownKeys({\n record: locks,\n allowedKeys: [\"timeoutMs\", \"staleLockTTLSeconds\"],\n ctx,\n keyPath: [\"locks\"],\n })\n partial.locks = {}\n if (locks.timeoutMs !== undefined) {\n partial.locks.timeoutMs = parsePositiveInteger({\n value: locks.timeoutMs,\n ctx,\n keyPath: [\"locks\", \"timeoutMs\"],\n })\n }\n if (locks.staleLockTTLSeconds !== undefined) {\n partial.locks.staleLockTTLSeconds = parsePositiveInteger({\n value: locks.staleLockTTLSeconds,\n ctx,\n keyPath: [\"locks\", \"staleLockTTLSeconds\"],\n })\n }\n }\n\n if (root.list !== undefined) {\n const list = expectRecord({\n value: root.list,\n ctx,\n keyPath: [\"list\"],\n })\n ensureNoUnknownKeys({\n record: list,\n allowedKeys: [\"table\"],\n ctx,\n keyPath: [\"list\"],\n })\n partial.list = {}\n if (list.table !== undefined) {\n const table = expectRecord({\n value: list.table,\n ctx,\n keyPath: [\"list\", \"table\"],\n })\n ensureNoUnknownKeys({\n record: table,\n allowedKeys: [\"columns\", \"path\"],\n ctx,\n keyPath: [\"list\", \"table\"],\n })\n partial.list.table = {}\n if (table.columns !== undefined) {\n partial.list.table.columns = parseColumns({\n value: table.columns,\n ctx,\n keyPath: [\"list\", \"table\", \"columns\"],\n })\n }\n if (table.path !== undefined) {\n const pathConfig = expectRecord({\n value: table.path,\n ctx,\n keyPath: [\"list\", \"table\", \"path\"],\n })\n ensureNoUnknownKeys({\n record: pathConfig,\n allowedKeys: [\"truncate\", \"minWidth\"],\n ctx,\n keyPath: [\"list\", \"table\", \"path\"],\n })\n partial.list.table.path = {}\n if (pathConfig.truncate !== undefined) {\n partial.list.table.path.truncate = parseListPathTruncate({\n value: pathConfig.truncate,\n ctx,\n keyPath: [\"list\", \"table\", \"path\", \"truncate\"],\n })\n }\n if (pathConfig.minWidth !== undefined) {\n const minWidth = parsePositiveInteger({\n value: pathConfig.minWidth,\n ctx,\n keyPath: [\"list\", \"table\", \"path\", \"minWidth\"],\n })\n if (minWidth < 8 || minWidth > 200) {\n throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath([\"list\", \"table\", \"path\", \"minWidth\"]),\n reason: \"must be in range 8..200\",\n })\n }\n partial.list.table.path.minWidth = minWidth\n }\n }\n }\n }\n\n if (root.selector !== undefined) {\n const selector = expectRecord({\n value: root.selector,\n ctx,\n keyPath: [\"selector\"],\n })\n ensureNoUnknownKeys({\n record: selector,\n allowedKeys: [\"cd\"],\n ctx,\n keyPath: [\"selector\"],\n })\n partial.selector = {}\n if (selector.cd !== undefined) {\n const cd = expectRecord({\n value: selector.cd,\n ctx,\n keyPath: [\"selector\", \"cd\"],\n })\n ensureNoUnknownKeys({\n record: cd,\n allowedKeys: [\"prompt\", \"surface\", \"tmuxPopupOpts\", \"fzf\"],\n ctx,\n keyPath: [\"selector\", \"cd\"],\n })\n partial.selector.cd = {}\n if (cd.prompt !== undefined) {\n partial.selector.cd.prompt = parseNonEmptyString({\n value: cd.prompt,\n ctx,\n keyPath: [\"selector\", \"cd\", \"prompt\"],\n })\n }\n if (cd.surface !== undefined) {\n partial.selector.cd.surface = parseSelectorSurface({\n value: cd.surface,\n ctx,\n keyPath: [\"selector\", \"cd\", \"surface\"],\n })\n }\n if (cd.tmuxPopupOpts !== undefined) {\n partial.selector.cd.tmuxPopupOpts = parseNonEmptyString({\n value: cd.tmuxPopupOpts,\n ctx,\n keyPath: [\"selector\", \"cd\", \"tmuxPopupOpts\"],\n })\n }\n if (cd.fzf !== undefined) {\n const fzf = expectRecord({\n value: cd.fzf,\n ctx,\n keyPath: [\"selector\", \"cd\", \"fzf\"],\n })\n ensureNoUnknownKeys({\n record: fzf,\n allowedKeys: [\"extraArgs\"],\n ctx,\n keyPath: [\"selector\", \"cd\", \"fzf\"],\n })\n partial.selector.cd.fzf = {}\n if (fzf.extraArgs !== undefined) {\n partial.selector.cd.fzf.extraArgs = parseStringArray({\n value: fzf.extraArgs,\n ctx,\n keyPath: [\"selector\", \"cd\", \"fzf\", \"extraArgs\"],\n })\n }\n }\n }\n }\n\n return partial\n}\n\nconst mergeConfig = (base: ResolvedConfig, partial: PartialConfig): ResolvedConfig => {\n return {\n paths: {\n worktreeRoot: partial.paths?.worktreeRoot ?? base.paths.worktreeRoot,\n },\n git: {\n baseBranch: partial.git?.baseBranch === undefined ? base.git.baseBranch : partial.git.baseBranch,\n baseRemote: partial.git?.baseRemote ?? base.git.baseRemote,\n },\n github: {\n enabled: partial.github?.enabled ?? base.github.enabled,\n },\n hooks: {\n enabled: partial.hooks?.enabled ?? base.hooks.enabled,\n timeoutMs: partial.hooks?.timeoutMs ?? base.hooks.timeoutMs,\n },\n locks: {\n timeoutMs: partial.locks?.timeoutMs ?? base.locks.timeoutMs,\n staleLockTTLSeconds: partial.locks?.staleLockTTLSeconds ?? base.locks.staleLockTTLSeconds,\n },\n list: {\n table: {\n columns: partial.list?.table?.columns ? [...partial.list.table.columns] : [...base.list.table.columns],\n path: {\n truncate: partial.list?.table?.path?.truncate ?? base.list.table.path.truncate,\n minWidth: partial.list?.table?.path?.minWidth ?? base.list.table.path.minWidth,\n },\n },\n },\n selector: {\n cd: {\n prompt: partial.selector?.cd?.prompt ?? base.selector.cd.prompt,\n surface: partial.selector?.cd?.surface ?? base.selector.cd.surface,\n tmuxPopupOpts: partial.selector?.cd?.tmuxPopupOpts ?? base.selector.cd.tmuxPopupOpts,\n fzf: {\n extraArgs: partial.selector?.cd?.fzf?.extraArgs\n ? [...partial.selector.cd.fzf.extraArgs]\n : [...base.selector.cd.fzf.extraArgs],\n },\n },\n },\n }\n}\n\nconst configPathExists = async (filePath: string): Promise<boolean> => {\n try {\n await access(filePath, fsConstants.F_OK)\n return true\n } catch {\n return false\n }\n}\n\nconst resolveLocalConfigPath = (directory: string): string => {\n return join(directory, ...LOCAL_CONFIG_PATH_SEGMENTS)\n}\n\nconst resolveGlobalConfigPath = (): string => {\n const xdgConfigHome = process.env.XDG_CONFIG_HOME\n if (typeof xdgConfigHome === \"string\" && xdgConfigHome.length > 0) {\n return join(resolve(xdgConfigHome), ...GLOBAL_CONFIG_PATH_SEGMENTS)\n }\n return join(homedir(), \".config\", ...GLOBAL_CONFIG_PATH_SEGMENTS)\n}\n\nconst resolveExistingConfigFiles = async ({\n cwd,\n repoRoot,\n}: {\n readonly cwd: string\n readonly repoRoot: string\n}): Promise<ReadonlyArray<string>> => {\n const searchDirectories = await collectConfigSearchDirectories(cwd)\n const localCandidates = searchDirectories.map((directory) => resolveLocalConfigPath(directory))\n const repoRootCandidate = resolveLocalConfigPath(repoRoot)\n const globalCandidate = resolveGlobalConfigPath()\n const lowToHighCandidates = [globalCandidate, repoRootCandidate, ...localCandidates]\n\n const deduped = new Map<string, { path: string; order: number }>()\n for (const [order, candidate] of lowToHighCandidates.entries()) {\n if ((await configPathExists(candidate)) !== true) {\n continue\n }\n const canonical = await realpath(candidate).catch(() => resolve(candidate))\n deduped.set(canonical, {\n path: candidate,\n order,\n })\n }\n\n return [...deduped.values()].sort((a, b) => a.order - b.order).map((entry) => entry.path)\n}\n\nconst isPathInsideOrEqual = ({\n parentPath,\n childPath,\n}: {\n readonly parentPath: string\n readonly childPath: string\n}): boolean => {\n const rel = relative(parentPath, childPath)\n if (rel.length === 0) {\n return true\n }\n return rel !== \"..\" && rel.startsWith(`..${sep}`) !== true\n}\n\nconst validateWorktreeRoot = async ({\n repoRoot,\n config,\n}: {\n readonly repoRoot: string\n readonly config: ResolvedConfig\n}): Promise<void> => {\n const rawWorktreeRoot = config.paths.worktreeRoot\n const resolvedWorktreeRoot = isAbsolute(rawWorktreeRoot)\n ? resolve(rawWorktreeRoot)\n : resolve(repoRoot, rawWorktreeRoot)\n\n const gitDirPath = resolve(repoRoot, \".git\")\n if (\n isPathInsideOrEqual({\n parentPath: gitDirPath,\n childPath: resolvedWorktreeRoot,\n })\n ) {\n throwInvalidConfig({\n file: \"<resolved>\",\n keyPath: \"paths.worktreeRoot\",\n reason: \"must not point inside .git\",\n })\n }\n\n try {\n const stat = await lstat(resolvedWorktreeRoot)\n if (stat.isDirectory() !== true) {\n throwInvalidConfig({\n file: \"<resolved>\",\n keyPath: \"paths.worktreeRoot\",\n reason: \"must not point to an existing file\",\n })\n }\n } catch (error) {\n const nodeError = error as NodeJS.ErrnoException\n if (nodeError.code === \"ENOENT\") {\n return\n }\n throw error\n }\n}\n\nconst parseConfigFile = async (file: string): Promise<PartialConfig> => {\n const rawContent = await readFile(file, \"utf8\")\n let parsed: unknown\n try {\n parsed = parse(rawContent)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throwInvalidConfig({\n file,\n keyPath: \"<root>\",\n reason: message,\n })\n }\n return validatePartialConfig({\n rawConfig: parsed,\n ctx: { file },\n })\n}\n\nconst cloneDefaultConfig = (): ResolvedConfig => {\n return mergeConfig(DEFAULT_CONFIG, {})\n}\n\nexport const loadResolvedConfig = async ({\n cwd,\n repoRoot,\n}: LoadResolvedConfigInput): Promise<LoadResolvedConfigResult> => {\n const files = await resolveExistingConfigFiles({ cwd, repoRoot })\n let config = cloneDefaultConfig()\n for (const file of files) {\n const partial = await parseConfigFile(file)\n config = mergeConfig(config, partial)\n }\n\n await validateWorktreeRoot({\n repoRoot,\n config,\n })\n\n return {\n config,\n loadedFiles: files,\n }\n}\n","import { execa } from \"execa\"\nimport { createCliError } from \"../core/errors\"\n\ntype ExecaFailure = Error & {\n readonly stderr?: string\n readonly stdout?: string\n readonly shortMessage?: string\n readonly exitCode?: number\n}\n\nexport type RunGitCommandInput = {\n readonly cwd: string\n readonly args: readonly string[]\n readonly reject?: boolean\n}\n\nexport type RunGitCommandOutput = {\n readonly stdout: string\n readonly stderr: string\n readonly exitCode: number\n}\n\nexport const runGitCommand = async ({ cwd, args, reject = true }: RunGitCommandInput): Promise<RunGitCommandOutput> => {\n try {\n const result = await execa(\"git\", [...args], {\n cwd,\n reject,\n })\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode ?? 0,\n }\n } catch (error) {\n const execaError = error as ExecaFailure\n throw createCliError(\"GIT_COMMAND_FAILED\", {\n message: \"git command failed\",\n details: {\n command: [\"git\", ...args],\n cwd,\n exitCode: execaError.exitCode,\n stdout: execaError.stdout ?? \"\",\n stderr: execaError.stderr ?? \"\",\n shortMessage: execaError.shortMessage ?? execaError.message,\n },\n cause: error,\n })\n }\n}\n\nexport const doesGitRefExist = async (cwd: string, ref: string): Promise<boolean> => {\n const result = await runGitCommand({\n cwd,\n args: [\"show-ref\", \"--verify\", \"--quiet\", ref],\n reject: false,\n })\n return result.exitCode === 0\n}\n","import { createHash } from \"node:crypto\"\nimport { dirname, isAbsolute, join, normalize, relative, resolve, sep } from \"node:path\"\nimport { runGitCommand } from \"../git/exec\"\nimport { createCliError } from \"./errors\"\n\nexport type RepoContext = {\n readonly repoRoot: string\n readonly currentWorktreeRoot: string\n readonly gitCommonDir: string\n}\n\nconst GIT_DIR_NAME = \".git\"\nconst DEFAULT_WORKTREE_ROOT = \".worktree\"\nconst WORKTREE_ID_HASH_LENGTH = 12\nconst WORKTREE_ID_SLUG_MAX_LENGTH = 48\n\nconst resolveRepoRootFromCommonDir = ({\n currentWorktreeRoot,\n gitCommonDir,\n}: {\n readonly currentWorktreeRoot: string\n readonly gitCommonDir: string\n}): string => {\n if (gitCommonDir.endsWith(`/${GIT_DIR_NAME}`)) {\n return dirname(gitCommonDir)\n }\n\n if (gitCommonDir.endsWith(`\\\\${GIT_DIR_NAME}`)) {\n return dirname(gitCommonDir)\n }\n\n return currentWorktreeRoot\n}\n\nexport const resolveRepoContext = async (cwd: string): Promise<RepoContext> => {\n const toplevelResult = await runGitCommand({\n cwd,\n args: [\"rev-parse\", \"--show-toplevel\"],\n reject: false,\n })\n\n if (toplevelResult.exitCode !== 0) {\n throw createCliError(\"NOT_GIT_REPOSITORY\", {\n message: \"Current directory is not inside a Git repository\",\n details: { cwd },\n })\n }\n\n const currentWorktreeRoot = toplevelResult.stdout.trim()\n const commonDirResult = await runGitCommand({\n cwd,\n args: [\"rev-parse\", \"--path-format=absolute\", \"--git-common-dir\"],\n reject: false,\n })\n const gitCommonDir =\n commonDirResult.exitCode === 0 ? commonDirResult.stdout.trim() : join(currentWorktreeRoot, GIT_DIR_NAME)\n\n return {\n repoRoot: resolveRepoRootFromCommonDir({ currentWorktreeRoot, gitCommonDir }),\n currentWorktreeRoot,\n gitCommonDir,\n }\n}\n\nexport const getWorktreeRootPath = (\n repoRoot: string,\n configuredWorktreeRoot: string = DEFAULT_WORKTREE_ROOT,\n): string => {\n if (isAbsolute(configuredWorktreeRoot)) {\n return resolve(configuredWorktreeRoot)\n }\n return resolve(repoRoot, configuredWorktreeRoot)\n}\n\nexport const getWorktreeMetaRootPath = (repoRoot: string): string => {\n return join(repoRoot, \".vde\", \"worktree\")\n}\n\nexport const getHooksDirectoryPath = (repoRoot: string): string => {\n return join(getWorktreeMetaRootPath(repoRoot), \"hooks\")\n}\n\nexport const getLogsDirectoryPath = (repoRoot: string): string => {\n return join(getWorktreeMetaRootPath(repoRoot), \"logs\")\n}\n\nexport const getLocksDirectoryPath = (repoRoot: string): string => {\n return join(getWorktreeMetaRootPath(repoRoot), \"locks\")\n}\n\nexport const getStateDirectoryPath = (repoRoot: string): string => {\n return join(getWorktreeMetaRootPath(repoRoot), \"state\")\n}\n\nexport const branchToWorktreeId = (branch: string): string => {\n const slug =\n branch\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, WORKTREE_ID_SLUG_MAX_LENGTH) || \"branch\"\n const hash = createHash(\"sha256\").update(branch).digest(\"hex\").slice(0, WORKTREE_ID_HASH_LENGTH)\n return `${slug}--${hash}`\n}\n\nexport const branchToWorktreePath = (\n repoRoot: string,\n branch: string,\n configuredWorktreeRoot: string = DEFAULT_WORKTREE_ROOT,\n): string => {\n const worktreeRoot = getWorktreeRootPath(repoRoot, configuredWorktreeRoot)\n const targetPath = join(worktreeRoot, ...branch.split(\"/\"))\n return ensurePathInsideRoot({\n rootPath: worktreeRoot,\n path: targetPath,\n message: \"Path is outside managed worktree root\",\n })\n}\n\nexport const ensurePathInsideRoot = ({\n rootPath,\n path,\n message = \"Path is outside allowed root\",\n}: {\n readonly rootPath: string\n readonly path: string\n readonly message?: string\n}): string => {\n const rel = relative(rootPath, path)\n if (rel === \"\") {\n return path\n }\n if (rel === \"..\" || rel.startsWith(`..${sep}`)) {\n throw createCliError(\"PATH_OUTSIDE_REPO\", {\n message,\n details: { rootPath, path },\n })\n }\n return path\n}\n\nexport const ensurePathInsideRepo = ({\n repoRoot,\n path,\n}: {\n readonly repoRoot: string\n readonly path: string\n}): string => {\n return ensurePathInsideRoot({\n rootPath: repoRoot,\n path,\n message: \"Path is outside repository root\",\n })\n}\n\nexport const resolveRepoRelativePath = ({\n repoRoot,\n relativePath,\n}: {\n readonly repoRoot: string\n readonly relativePath: string\n}): string => {\n if (isAbsolute(relativePath)) {\n throw createCliError(\"ABSOLUTE_PATH_NOT_ALLOWED\", {\n message: \"Absolute path is not allowed\",\n details: { path: relativePath },\n })\n }\n const normalizedRelative = normalize(relativePath)\n const resolved = resolve(repoRoot, normalizedRelative)\n return ensurePathInsideRepo({\n repoRoot,\n path: resolved,\n })\n}\n\nexport const resolvePathFromCwd = ({ cwd, path }: { readonly cwd: string; readonly path: string }): string => {\n if (isAbsolute(path)) {\n return path\n }\n return resolve(cwd, path)\n}\n\nexport const isManagedWorktreePath = ({\n worktreePath,\n managedWorktreeRoot,\n}: {\n readonly worktreePath: string\n readonly managedWorktreeRoot: string\n}): boolean => {\n const rel = relative(managedWorktreeRoot, worktreePath)\n if (rel === \"\" || rel === \".\" || rel === \"..\") {\n return false\n }\n return rel.startsWith(`..${sep}`) !== true\n}\n","import { constants as fsConstants } from \"node:fs\"\nimport { access, appendFile, mkdir } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport { execa } from \"execa\"\nimport { DEFAULT_HOOK_TIMEOUT_MS } from \"./constants\"\nimport { CliError, createCliError } from \"./errors\"\nimport { getHooksDirectoryPath, getLogsDirectoryPath } from \"./paths\"\n\ntype HookPhase = \"pre\" | \"post\"\n\nexport type HookExecutionContext = {\n readonly repoRoot: string\n readonly action: string\n readonly branch?: string | null\n readonly worktreePath?: string\n readonly timeoutMs?: number\n readonly enabled: boolean\n readonly stderr: (line: string) => void\n readonly strictPostHooks?: boolean\n readonly extraEnv?: Record<string, string>\n}\n\ntype HookExecutionError = Error & {\n readonly exitCode?: number\n readonly stderr?: string\n readonly code?: string\n}\n\nconst nowTimestamp = (): string => {\n return new Date().toISOString().replace(/[^\\d]/g, \"\").slice(0, 14)\n}\n\nconst toLogFileName = ({ action, branch }: { readonly action: string; readonly branch?: string | null }): string => {\n const safeBranch = typeof branch === \"string\" && branch.length > 0 ? branch.replace(/[^\\w.-]/g, \"_\") : \"none\"\n return `${nowTimestamp()}_${action}_${safeBranch}.log`\n}\n\nconst hookPath = (repoRoot: string, hookName: string): string => {\n return join(getHooksDirectoryPath(repoRoot), hookName)\n}\n\nconst appendHookLog = async ({\n repoRoot,\n action,\n branch,\n content,\n}: {\n readonly repoRoot: string\n readonly action: string\n readonly branch?: string | null\n readonly content: string\n}): Promise<void> => {\n const logsDir = getLogsDirectoryPath(repoRoot)\n await mkdir(logsDir, { recursive: true })\n const logPath = join(logsDir, toLogFileName({ action, branch }))\n await appendFile(logPath, content, \"utf8\")\n}\n\nconst runHook = async ({\n phase,\n hookName,\n args,\n context,\n requireExists = false,\n}: {\n readonly phase: HookPhase\n readonly hookName: string\n readonly args: readonly string[]\n readonly context: HookExecutionContext\n readonly requireExists?: boolean\n}): Promise<void> => {\n if (context.enabled !== true) {\n return\n }\n\n const path = hookPath(context.repoRoot, hookName)\n try {\n await access(path, fsConstants.F_OK)\n } catch {\n if (requireExists) {\n throw createCliError(\"HOOK_NOT_FOUND\", {\n message: `Hook not found: ${hookName}`,\n details: { hook: hookName, path },\n })\n }\n return\n }\n\n try {\n await access(path, fsConstants.X_OK)\n } catch {\n throw createCliError(\"HOOK_NOT_EXECUTABLE\", {\n message: `Hook is not executable: ${hookName}`,\n details: { hook: hookName, path },\n })\n }\n\n const startedAt = new Date().toISOString()\n try {\n const result = await execa(path, [...args], {\n cwd: context.worktreePath ?? context.repoRoot,\n env: {\n ...process.env,\n WT_REPO_ROOT: context.repoRoot,\n WT_ACTION: context.action,\n WT_BRANCH: context.branch ?? \"\",\n WT_WORKTREE_PATH: context.worktreePath ?? \"\",\n WT_IS_TTY: process.stdout.isTTY === true ? \"1\" : \"0\",\n WT_TOOL: \"vde-worktree\",\n ...(context.extraEnv ?? {}),\n },\n timeout: context.timeoutMs ?? DEFAULT_HOOK_TIMEOUT_MS,\n reject: false,\n })\n\n const endedAt = new Date().toISOString()\n const logContent = [\n `hook=${hookName}`,\n `phase=${phase}`,\n `start=${startedAt}`,\n `end=${endedAt}`,\n `exitCode=${String(result.exitCode ?? 0)}`,\n `stderr=${result.stderr ?? \"\"}`,\n \"\",\n ].join(\"\\n\")\n await appendHookLog({\n repoRoot: context.repoRoot,\n action: context.action,\n branch: context.branch,\n content: logContent,\n })\n\n if ((result.exitCode ?? 0) === 0) {\n return\n }\n\n const message = `Hook failed: ${hookName} (exitCode=${String(result.exitCode ?? 1)})`\n if (phase === \"post\" && context.strictPostHooks !== true) {\n context.stderr(message)\n return\n }\n\n throw createCliError(\"HOOK_FAILED\", {\n message,\n details: {\n hook: hookName,\n exitCode: result.exitCode,\n stderr: result.stderr,\n },\n })\n } catch (error) {\n if (error instanceof CliError) {\n throw error\n }\n\n const hookError = error as HookExecutionError\n if (hookError.code === \"ETIMEDOUT\" || hookError.code === \"ERR_EXECA_TIMEOUT\") {\n throw createCliError(\"HOOK_TIMEOUT\", {\n message: `Hook timed out: ${hookName}`,\n details: {\n hook: hookName,\n timeoutMs: context.timeoutMs ?? DEFAULT_HOOK_TIMEOUT_MS,\n stderr: hookError.stderr ?? \"\",\n },\n cause: error,\n })\n }\n\n if (phase === \"post\" && context.strictPostHooks !== true) {\n context.stderr(`Hook failed: ${hookName}`)\n return\n }\n\n throw createCliError(\"HOOK_FAILED\", {\n message: `Hook failed: ${hookName}`,\n details: {\n hook: hookName,\n stderr: hookError.stderr ?? hookError.message,\n },\n cause: error,\n })\n }\n}\n\nexport const runPreHook = async ({\n name,\n context,\n}: {\n readonly name: string\n readonly context: HookExecutionContext\n}): Promise<void> => {\n await runHook({\n phase: \"pre\",\n hookName: `pre-${name}`,\n args: [],\n context,\n })\n}\n\nexport const runPostHook = async ({\n name,\n context,\n}: {\n readonly name: string\n readonly context: HookExecutionContext\n}): Promise<void> => {\n await runHook({\n phase: \"post\",\n hookName: `post-${name}`,\n args: [],\n context,\n })\n}\n\nexport const invokeHook = async ({\n hookName,\n args,\n context,\n}: {\n readonly hookName: string\n readonly args: readonly string[]\n readonly context: HookExecutionContext\n}): Promise<void> => {\n await runHook({\n phase: hookName.startsWith(\"pre-\") ? \"pre\" : \"post\",\n hookName,\n args,\n context,\n requireExists: true,\n })\n}\n","import { access, chmod, mkdir, readFile, writeFile } from \"node:fs/promises\"\nimport { constants as fsConstants } from \"node:fs\"\nimport { join, relative, sep } from \"node:path\"\nimport {\n getHooksDirectoryPath,\n getLocksDirectoryPath,\n getLogsDirectoryPath,\n getStateDirectoryPath,\n getWorktreeMetaRootPath,\n} from \"./paths\"\n\nconst EXCLUDE_MARKER = \"# vde-worktree (managed)\"\n\nconst DEFAULT_HOOKS: ReadonlyArray<{ name: string; lines: string[] }> = [\n {\n name: \"post-new\",\n lines: [\n \"#!/usr/bin/env bash\",\n \"set -eu\",\n \"\",\n \"# example:\",\n \"# vde-worktree copy .envrc .claude/settings.local.json\",\n \"\",\n \"exit 0\",\n ],\n },\n {\n name: \"post-switch\",\n lines: [\"#!/usr/bin/env bash\", \"set -eu\", \"\", \"# example:\", \"# vde-worktree link .envrc\", \"\", \"exit 0\"],\n },\n] as const\n\nexport type InitResult = {\n readonly alreadyInitialized: boolean\n}\n\nconst createHookTemplate = async (hooksDir: string, name: string, lines: readonly string[]): Promise<void> => {\n const targetPath = join(hooksDir, name)\n try {\n await access(targetPath, fsConstants.F_OK)\n return\n } catch {\n await writeFile(targetPath, `${lines.join(\"\\n\")}\\n`, \"utf8\")\n await chmod(targetPath, 0o755)\n }\n}\n\nconst isPathInsideOrEqual = ({\n rootPath,\n candidatePath,\n}: {\n readonly rootPath: string\n readonly candidatePath: string\n}): boolean => {\n const rel = relative(rootPath, candidatePath)\n if (rel.length === 0) {\n return true\n }\n return rel !== \"..\" && rel.startsWith(`..${sep}`) !== true\n}\n\nconst toExcludeEntry = ({\n repoRoot,\n managedWorktreeRoot,\n}: {\n readonly repoRoot: string\n readonly managedWorktreeRoot: string\n}): string | null => {\n if (\n isPathInsideOrEqual({\n rootPath: repoRoot,\n candidatePath: managedWorktreeRoot,\n }) !== true\n ) {\n return null\n }\n\n const rel = relative(repoRoot, managedWorktreeRoot).split(sep).join(\"/\")\n const normalized = rel.length === 0 ? \".\" : rel\n return normalized.endsWith(\"/\") ? normalized : `${normalized}/`\n}\n\nconst ensureExcludeBlock = async ({\n repoRoot,\n managedWorktreeRoot,\n}: {\n readonly repoRoot: string\n readonly managedWorktreeRoot: string\n}): Promise<void> => {\n const managedEntry = toExcludeEntry({ repoRoot, managedWorktreeRoot })\n if (managedEntry === null) {\n return\n }\n\n const managedExcludeBlock = `${EXCLUDE_MARKER}\\n${managedEntry}\\n.vde/worktree/\\n`\n const excludePath = join(repoRoot, \".git\", \"info\", \"exclude\")\n let current = \"\"\n try {\n current = await readFile(excludePath, \"utf8\")\n } catch {\n current = \"\"\n }\n\n if (current.includes(managedExcludeBlock)) {\n return\n }\n\n const normalizedCurrent = current.endsWith(\"\\n\") || current.length === 0 ? current : `${current}\\n`\n await writeFile(excludePath, `${normalizedCurrent}${managedExcludeBlock}`, \"utf8\")\n}\n\nexport const isInitialized = async (repoRoot: string): Promise<boolean> => {\n try {\n await access(getWorktreeMetaRootPath(repoRoot), fsConstants.F_OK)\n return true\n } catch {\n return false\n }\n}\n\nexport const initializeRepository = async ({\n repoRoot,\n managedWorktreeRoot,\n}: {\n readonly repoRoot: string\n readonly managedWorktreeRoot: string\n}): Promise<InitResult> => {\n const wasInitialized = await isInitialized(repoRoot)\n await mkdir(managedWorktreeRoot, { recursive: true })\n await mkdir(getHooksDirectoryPath(repoRoot), { recursive: true })\n await mkdir(getLogsDirectoryPath(repoRoot), { recursive: true })\n await mkdir(getLocksDirectoryPath(repoRoot), { recursive: true })\n await mkdir(getStateDirectoryPath(repoRoot), { recursive: true })\n await ensureExcludeBlock({ repoRoot, managedWorktreeRoot })\n\n for (const hook of DEFAULT_HOOKS) {\n await createHookTemplate(getHooksDirectoryPath(repoRoot), hook.name, hook.lines)\n }\n\n return {\n alreadyInitialized: wasInitialized,\n }\n}\n","import { constants as fsConstants } from \"node:fs\"\nimport { access, open, readFile, rm } from \"node:fs/promises\"\nimport { hostname } from \"node:os\"\nimport { join } from \"node:path\"\nimport { DEFAULT_LOCK_TIMEOUT_MS, DEFAULT_STALE_LOCK_TTL_SECONDS } from \"./constants\"\nimport { createCliError } from \"./errors\"\nimport { getStateDirectoryPath } from \"./paths\"\n\ntype RepoLockFileSchema = {\n readonly schemaVersion: 1\n readonly owner: string\n readonly command: string\n readonly pid: number\n readonly host: string\n readonly startedAt: string\n}\n\ntype AcquireRepoLockOptions = {\n readonly repoRoot: string\n readonly command: string\n readonly timeoutMs?: number\n readonly staleLockTTLSeconds?: number\n}\n\ntype RepoLockHandle = {\n release: () => Promise<void>\n}\n\nconst sleep = async (ms: number): Promise<void> => {\n await new Promise<void>((resolve) => {\n setTimeout(resolve, ms)\n })\n}\n\nconst isProcessAlive = (pid: number): boolean => {\n if (pid <= 0 || Number.isFinite(pid) !== true) {\n return false\n }\n\n try {\n process.kill(pid, 0)\n return true\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code\n if (code === \"ESRCH\") {\n return false\n }\n return true\n }\n}\n\nconst safeParseLockFile = (content: string): RepoLockFileSchema | null => {\n try {\n const parsed = JSON.parse(content) as Partial<RepoLockFileSchema>\n if (parsed.schemaVersion !== 1) {\n return null\n }\n if (typeof parsed.command !== \"string\" || typeof parsed.owner !== \"string\") {\n return null\n }\n if (typeof parsed.pid !== \"number\" || typeof parsed.host !== \"string\" || typeof parsed.startedAt !== \"string\") {\n return null\n }\n return parsed as RepoLockFileSchema\n } catch {\n return null\n }\n}\n\nconst lockFilePath = async (repoRoot: string): Promise<string> => {\n const stateDir = getStateDirectoryPath(repoRoot)\n try {\n await access(stateDir, fsConstants.F_OK)\n return join(stateDir, \"repo.lock\")\n } catch {\n return join(repoRoot, \".git\", \"vde-worktree.init.lock\")\n }\n}\n\nconst buildLockPayload = (command: string): RepoLockFileSchema => {\n return {\n schemaVersion: 1,\n owner: \"vde-worktree\",\n command,\n pid: process.pid,\n host: hostname(),\n startedAt: new Date().toISOString(),\n }\n}\n\nconst canRecoverStaleLock = ({\n lock,\n staleLockTTLSeconds,\n}: {\n readonly lock: RepoLockFileSchema | null\n readonly staleLockTTLSeconds: number\n}): boolean => {\n if (lock === null) {\n return true\n }\n\n const startedAtMs = Date.parse(lock.startedAt)\n if (Number.isFinite(startedAtMs) !== true) {\n return true\n }\n\n const staleAtMs = startedAtMs + staleLockTTLSeconds * 1000\n if (staleAtMs > Date.now()) {\n return false\n }\n\n if (lock.host === hostname() && isProcessAlive(lock.pid)) {\n return false\n }\n\n return true\n}\n\nconst writeNewLockFile = async (path: string, payload: RepoLockFileSchema): Promise<boolean> => {\n try {\n const handle = await open(path, \"wx\")\n await handle.writeFile(`${JSON.stringify(payload)}\\n`, \"utf8\")\n await handle.close()\n return true\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code\n if (code === \"EEXIST\") {\n return false\n }\n throw error\n }\n}\n\nexport const acquireRepoLock = async ({\n repoRoot,\n command,\n timeoutMs = DEFAULT_LOCK_TIMEOUT_MS,\n staleLockTTLSeconds = DEFAULT_STALE_LOCK_TTL_SECONDS,\n}: AcquireRepoLockOptions): Promise<RepoLockHandle> => {\n const path = await lockFilePath(repoRoot)\n const startAt = Date.now()\n const payload = buildLockPayload(command)\n\n while (Date.now() - startAt <= timeoutMs) {\n const created = await writeNewLockFile(path, payload)\n if (created) {\n return {\n release: async (): Promise<void> => {\n try {\n await rm(path, { force: true })\n } catch {\n return\n }\n },\n }\n }\n\n let lockContent = \"\"\n try {\n lockContent = await readFile(path, \"utf8\")\n } catch {\n await sleep(100)\n continue\n }\n\n const parsed = safeParseLockFile(lockContent)\n if (canRecoverStaleLock({ lock: parsed, staleLockTTLSeconds })) {\n try {\n await rm(path, { force: true })\n } catch {\n throw createCliError(\"REPO_LOCK_STALE_RECOVERY_FAILED\", {\n message: \"Failed to recover stale repo lock\",\n details: { path },\n })\n }\n continue\n }\n\n await sleep(100)\n }\n\n throw createCliError(\"REPO_LOCK_TIMEOUT\", {\n message: \"Timed out while acquiring repo lock\",\n details: { path, timeoutMs },\n })\n}\n\nexport const withRepoLock = async <T>(options: AcquireRepoLockOptions, task: () => Promise<T>): Promise<T> => {\n const handle = await acquireRepoLock(options)\n try {\n return await task()\n } finally {\n await handle.release()\n }\n}\n\nexport const readNumberFromEnvOrDefault = ({\n rawValue,\n defaultValue,\n}: {\n readonly rawValue: unknown\n readonly defaultValue: number\n}): number => {\n if (typeof rawValue !== \"number\" || Number.isFinite(rawValue) !== true) {\n return defaultValue\n }\n return rawValue\n}\n","import { constants as fsConstants } from \"node:fs\"\nimport { access, mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\"\nimport { dirname, join } from \"node:path\"\nimport { branchToWorktreeId, getStateDirectoryPath } from \"./paths\"\n\nexport type WorktreeMergeLifecycleRecord = {\n readonly schemaVersion: 2\n readonly branch: string\n readonly worktreeId: string\n readonly baseBranch: string\n readonly everDiverged: boolean\n readonly lastDivergedHead: string | null\n readonly createdAt: string\n readonly updatedAt: string\n}\n\ntype ParsedLifecycle = {\n readonly valid: boolean\n readonly record: WorktreeMergeLifecycleRecord | null\n}\n\nconst lifecycleFilePath = (repoRoot: string, branch: string): string => {\n return join(getStateDirectoryPath(repoRoot), \"branches\", `${branchToWorktreeId(branch)}.json`)\n}\n\nconst hasStateDirectory = async (repoRoot: string): Promise<boolean> => {\n try {\n await access(getStateDirectoryPath(repoRoot), fsConstants.F_OK)\n return true\n } catch {\n return false\n }\n}\n\nconst parseLifecycle = (content: string): ParsedLifecycle => {\n try {\n const parsed = JSON.parse(content) as Partial<WorktreeMergeLifecycleRecord>\n const isLastDivergedHeadValid =\n parsed.lastDivergedHead === null ||\n (typeof parsed.lastDivergedHead === \"string\" && parsed.lastDivergedHead.length > 0)\n\n if (\n parsed.schemaVersion !== 2 ||\n typeof parsed.branch !== \"string\" ||\n typeof parsed.worktreeId !== \"string\" ||\n typeof parsed.baseBranch !== \"string\" ||\n typeof parsed.everDiverged !== \"boolean\" ||\n isLastDivergedHeadValid !== true ||\n typeof parsed.createdAt !== \"string\" ||\n typeof parsed.updatedAt !== \"string\"\n ) {\n return {\n valid: false,\n record: null,\n }\n }\n\n return {\n valid: true,\n record: parsed as WorktreeMergeLifecycleRecord,\n }\n } catch {\n return {\n valid: false,\n record: null,\n }\n }\n}\n\nconst writeJsonAtomically = async ({\n filePath,\n payload,\n}: {\n readonly filePath: string\n readonly payload: Record<string, unknown>\n}): Promise<void> => {\n await mkdir(dirname(filePath), { recursive: true })\n const tmpPath = `${filePath}.tmp-${String(process.pid)}-${String(Date.now())}`\n await writeFile(tmpPath, `${JSON.stringify(payload)}\\n`, \"utf8\")\n await rename(tmpPath, filePath)\n}\n\nexport const readWorktreeMergeLifecycle = async ({\n repoRoot,\n branch,\n}: {\n readonly repoRoot: string\n readonly branch: string\n}): Promise<ParsedLifecycle & { path: string; exists: boolean }> => {\n const path = lifecycleFilePath(repoRoot, branch)\n try {\n await access(path, fsConstants.F_OK)\n } catch {\n return {\n path,\n exists: false,\n valid: true,\n record: null,\n }\n }\n\n try {\n const content = await readFile(path, \"utf8\")\n const parsed = parseLifecycle(content)\n return {\n path,\n exists: true,\n ...parsed,\n }\n } catch {\n return {\n path,\n exists: true,\n valid: false,\n record: null,\n }\n }\n}\n\nexport const upsertWorktreeMergeLifecycle = async ({\n repoRoot,\n branch,\n baseBranch,\n observedDivergedHead,\n}: {\n readonly repoRoot: string\n readonly branch: string\n readonly baseBranch: string\n readonly observedDivergedHead: string | null\n}): Promise<WorktreeMergeLifecycleRecord> => {\n const normalizedObservedHead =\n typeof observedDivergedHead === \"string\" && observedDivergedHead.length > 0 ? observedDivergedHead : null\n\n if ((await hasStateDirectory(repoRoot)) !== true) {\n const now = new Date().toISOString()\n return {\n schemaVersion: 2,\n branch,\n worktreeId: branchToWorktreeId(branch),\n baseBranch,\n everDiverged: normalizedObservedHead !== null,\n lastDivergedHead: normalizedObservedHead,\n createdAt: now,\n updatedAt: now,\n }\n }\n\n const current = await readWorktreeMergeLifecycle({ repoRoot, branch })\n if (\n current.valid &&\n current.record !== null &&\n current.record.baseBranch === baseBranch &&\n normalizedObservedHead === null\n ) {\n return current.record\n }\n\n const now = new Date().toISOString()\n const everDiverged = current.record?.everDiverged === true || normalizedObservedHead !== null\n const lastDivergedHead = normalizedObservedHead ?? current.record?.lastDivergedHead ?? null\n const next: WorktreeMergeLifecycleRecord = {\n schemaVersion: 2,\n branch,\n worktreeId: branchToWorktreeId(branch),\n baseBranch,\n everDiverged,\n lastDivergedHead,\n createdAt: current.record?.createdAt ?? now,\n updatedAt: now,\n }\n await writeJsonAtomically({\n filePath: current.path,\n payload: next,\n })\n return next\n}\n\nexport const moveWorktreeMergeLifecycle = async ({\n repoRoot,\n fromBranch,\n toBranch,\n baseBranch,\n observedDivergedHead,\n}: {\n readonly repoRoot: string\n readonly fromBranch: string\n readonly toBranch: string\n readonly baseBranch: string\n readonly observedDivergedHead: string | null\n}): Promise<WorktreeMergeLifecycleRecord> => {\n const normalizedObservedHead =\n typeof observedDivergedHead === \"string\" && observedDivergedHead.length > 0 ? observedDivergedHead : null\n\n if ((await hasStateDirectory(repoRoot)) !== true) {\n const now = new Date().toISOString()\n return {\n schemaVersion: 2,\n branch: toBranch,\n worktreeId: branchToWorktreeId(toBranch),\n baseBranch,\n everDiverged: normalizedObservedHead !== null,\n lastDivergedHead: normalizedObservedHead,\n createdAt: now,\n updatedAt: now,\n }\n }\n\n const source = await readWorktreeMergeLifecycle({ repoRoot, branch: fromBranch })\n const targetPath = lifecycleFilePath(repoRoot, toBranch)\n const now = new Date().toISOString()\n const everDiverged = source.record?.everDiverged === true || normalizedObservedHead !== null\n const lastDivergedHead = normalizedObservedHead ?? source.record?.lastDivergedHead ?? null\n const next: WorktreeMergeLifecycleRecord = {\n schemaVersion: 2,\n branch: toBranch,\n worktreeId: branchToWorktreeId(toBranch),\n baseBranch,\n everDiverged,\n lastDivergedHead,\n createdAt: source.record?.createdAt ?? now,\n updatedAt: now,\n }\n\n await writeJsonAtomically({\n filePath: targetPath,\n payload: next,\n })\n\n if (source.path !== targetPath) {\n await rm(source.path, { force: true })\n }\n return next\n}\n\nexport const deleteWorktreeMergeLifecycle = async ({\n repoRoot,\n branch,\n}: {\n readonly repoRoot: string\n readonly branch: string\n}): Promise<void> => {\n const path = lifecycleFilePath(repoRoot, branch)\n await rm(path, { force: true })\n}\n","import { constants as fsConstants } from \"node:fs\"\nimport { access, readFile, rename, rm, writeFile } from \"node:fs/promises\"\nimport { hostname } from \"node:os\"\nimport { join } from \"node:path\"\nimport { branchToWorktreeId, getLocksDirectoryPath } from \"./paths\"\n\nexport type WorktreeLockRecord = {\n readonly schemaVersion: 1\n readonly branch: string\n readonly worktreeId: string\n readonly reason: string\n readonly owner: string\n readonly host: string\n readonly pid: number\n readonly createdAt: string\n readonly updatedAt: string\n}\n\ntype ParsedLock = {\n readonly valid: boolean\n readonly record: WorktreeLockRecord | null\n}\n\nconst parseLock = (content: string): ParsedLock => {\n try {\n const parsed = JSON.parse(content) as Partial<WorktreeLockRecord>\n if (\n parsed.schemaVersion !== 1 ||\n typeof parsed.branch !== \"string\" ||\n typeof parsed.worktreeId !== \"string\" ||\n typeof parsed.reason !== \"string\" ||\n typeof parsed.owner !== \"string\" ||\n typeof parsed.host !== \"string\" ||\n typeof parsed.pid !== \"number\" ||\n typeof parsed.createdAt !== \"string\" ||\n typeof parsed.updatedAt !== \"string\"\n ) {\n return {\n valid: false,\n record: null,\n }\n }\n\n return {\n valid: true,\n record: parsed as WorktreeLockRecord,\n }\n } catch {\n return {\n valid: false,\n record: null,\n }\n }\n}\n\nconst writeJsonAtomically = async ({\n filePath,\n payload,\n}: {\n readonly filePath: string\n readonly payload: Record<string, unknown>\n}): Promise<void> => {\n const tmpPath = `${filePath}.tmp-${String(process.pid)}-${String(Date.now())}`\n await writeFile(tmpPath, `${JSON.stringify(payload)}\\n`, \"utf8\")\n await rename(tmpPath, filePath)\n}\n\nconst lockFilePath = (repoRoot: string, branch: string): string => {\n return join(getLocksDirectoryPath(repoRoot), `${branchToWorktreeId(branch)}.json`)\n}\n\nexport const readWorktreeLock = async ({\n repoRoot,\n branch,\n}: {\n readonly repoRoot: string\n readonly branch: string\n}): Promise<ParsedLock & { path: string; exists: boolean }> => {\n const path = lockFilePath(repoRoot, branch)\n try {\n await access(path, fsConstants.F_OK)\n } catch {\n return {\n path,\n exists: false,\n valid: true,\n record: null,\n }\n }\n\n try {\n const content = await readFile(path, \"utf8\")\n const parsed = parseLock(content)\n return {\n path,\n exists: true,\n ...parsed,\n }\n } catch {\n return {\n path,\n exists: true,\n valid: false,\n record: null,\n }\n }\n}\n\nexport const upsertWorktreeLock = async ({\n repoRoot,\n branch,\n reason,\n owner,\n}: {\n readonly repoRoot: string\n readonly branch: string\n readonly reason: string\n readonly owner: string\n}): Promise<WorktreeLockRecord> => {\n const { path, record } = await readWorktreeLock({ repoRoot, branch })\n const now = new Date().toISOString()\n const next: WorktreeLockRecord = {\n schemaVersion: 1,\n branch,\n worktreeId: branchToWorktreeId(branch),\n reason,\n owner,\n host: hostname(),\n pid: process.pid,\n createdAt: record?.createdAt ?? now,\n updatedAt: now,\n }\n await writeJsonAtomically({\n filePath: path,\n payload: next,\n })\n return next\n}\n\nexport const deleteWorktreeLock = async ({\n repoRoot,\n branch,\n}: {\n readonly repoRoot: string\n readonly branch: string\n}): Promise<void> => {\n const path = lockFilePath(repoRoot, branch)\n await rm(path, { force: true })\n}\n","import { execa } from \"execa\"\n\ntype GhCommandRunnerInput = {\n readonly cwd: string\n readonly args: readonly string[]\n}\n\ntype GhCommandRunnerOutput = {\n readonly exitCode: number\n readonly stdout: string\n readonly stderr: string\n}\n\ntype GhCommandRunner = (input: GhCommandRunnerInput) => Promise<GhCommandRunnerOutput>\n\ntype ExecaLikeError = Error & {\n readonly code?: string\n}\n\ntype ResolvePrByBranchBatchInput = {\n readonly repoRoot: string\n readonly baseBranch: string | null\n readonly branches: readonly (string | null)[]\n readonly enabled?: boolean\n readonly runGh?: GhCommandRunner\n}\n\nexport type PrStatus = \"none\" | \"open\" | \"merged\" | \"closed_unmerged\" | \"unknown\"\nexport type PrState = {\n readonly status: PrStatus\n readonly url: string | null\n}\n\ntype PrSummary = {\n readonly headRefName?: string | null\n readonly state?: string | null\n readonly mergedAt?: string | null\n readonly updatedAt?: string | null\n readonly url?: string | null\n}\n\nconst defaultRunGh: GhCommandRunner = async ({ cwd, args }) => {\n const result = await execa(\"gh\", [...args], {\n cwd,\n reject: false,\n })\n return {\n exitCode: result.exitCode ?? 0,\n stdout: result.stdout,\n stderr: result.stderr,\n }\n}\n\nconst toTargetBranches = ({\n branches,\n baseBranch,\n}: {\n readonly branches: readonly (string | null)[]\n readonly baseBranch: string\n}): string[] => {\n const uniqueBranches = new Set<string>()\n for (const branch of branches) {\n if (typeof branch !== \"string\" || branch.length === 0) {\n continue\n }\n if (branch === baseBranch) {\n continue\n }\n uniqueBranches.add(branch)\n }\n return [...uniqueBranches]\n}\n\nconst buildUnknownPrStateMap = (branches: readonly string[]): Map<string, PrState> => {\n return new Map(\n branches.map((branch) => [\n branch,\n {\n status: \"unknown\",\n url: null,\n },\n ]),\n )\n}\n\nconst parseUpdatedAtMillis = (value: unknown): number => {\n if (typeof value !== \"string\" || value.length === 0) {\n return Number.NEGATIVE_INFINITY\n }\n const parsed = Date.parse(value)\n if (Number.isNaN(parsed)) {\n return Number.NEGATIVE_INFINITY\n }\n return parsed\n}\n\nconst toPrStatus = (record: PrSummary): PrStatus => {\n if (typeof record.mergedAt === \"string\" && record.mergedAt.length > 0) {\n return \"merged\"\n }\n const state = typeof record.state === \"string\" ? record.state.toUpperCase() : \"\"\n if (state === \"MERGED\") {\n return \"merged\"\n }\n if (state === \"OPEN\") {\n return \"open\"\n }\n if (state === \"CLOSED\") {\n return \"closed_unmerged\"\n }\n return \"unknown\"\n}\n\nconst toPrUrl = (record: PrSummary): string | null => {\n if (typeof record.url === \"string\" && record.url.length > 0) {\n return record.url\n }\n return null\n}\n\nconst parsePrStateByBranch = ({\n raw,\n targetBranches,\n}: {\n readonly raw: string\n readonly targetBranches: readonly string[]\n}): Map<string, PrState> | null => {\n try {\n const parsed = JSON.parse(raw) as unknown\n if (Array.isArray(parsed) !== true) {\n return null\n }\n const targetBranchSet = new Set(targetBranches)\n const records = parsed as PrSummary[]\n const latestByBranch = new Map<\n string,\n { updatedAtMillis: number; index: number; status: PrStatus; url: string | null }\n >()\n\n for (const [index, record] of records.entries()) {\n if (typeof record?.headRefName !== \"string\" || record.headRefName.length === 0) {\n continue\n }\n if (targetBranchSet.has(record.headRefName) !== true) {\n continue\n }\n const updatedAtMillis = parseUpdatedAtMillis(record.updatedAt)\n const status = toPrStatus(record)\n const url = toPrUrl(record)\n const current = latestByBranch.get(record.headRefName)\n if (\n current === undefined ||\n updatedAtMillis > current.updatedAtMillis ||\n (updatedAtMillis === current.updatedAtMillis && index > current.index)\n ) {\n latestByBranch.set(record.headRefName, {\n updatedAtMillis,\n index,\n status,\n url,\n })\n }\n }\n\n const result = new Map<string, PrState>()\n for (const branch of targetBranches) {\n const latest = latestByBranch.get(branch)\n if (latest === undefined) {\n result.set(branch, {\n status: \"none\",\n url: null,\n })\n continue\n }\n result.set(branch, {\n status: latest.status,\n url: latest.url,\n })\n }\n return result\n } catch {\n return null\n }\n}\n\nexport const resolvePrStateByBranchBatch = async ({\n repoRoot,\n baseBranch,\n branches,\n enabled = true,\n runGh = defaultRunGh,\n}: ResolvePrByBranchBatchInput): Promise<ReadonlyMap<string, PrState>> => {\n if (baseBranch === null) {\n return new Map()\n }\n\n const targetBranches = toTargetBranches({ branches, baseBranch })\n if (targetBranches.length === 0) {\n return new Map()\n }\n if (enabled !== true) {\n return buildUnknownPrStateMap(targetBranches)\n }\n\n try {\n const searchQuery = targetBranches.map((branch) => `head:${branch}`).join(\" OR \")\n const result = await runGh({\n cwd: repoRoot,\n args: [\n \"pr\",\n \"list\",\n \"--state\",\n \"all\",\n \"--base\",\n baseBranch,\n \"--search\",\n searchQuery,\n \"--limit\",\n \"1000\",\n \"--json\",\n \"headRefName,state,mergedAt,updatedAt,url\",\n ],\n })\n if (result.exitCode !== 0) {\n return buildUnknownPrStateMap(targetBranches)\n }\n\n const prStatusByBranch = parsePrStateByBranch({\n raw: result.stdout,\n targetBranches,\n })\n if (prStatusByBranch === null) {\n return buildUnknownPrStateMap(targetBranches)\n }\n\n return prStatusByBranch\n } catch (error) {\n const execaError = error as ExecaLikeError\n if (execaError.code === \"ENOENT\") {\n return buildUnknownPrStateMap(targetBranches)\n }\n return buildUnknownPrStateMap(targetBranches)\n }\n}\n\nexport const resolvePrStatusByBranchBatch = async (\n input: ResolvePrByBranchBatchInput,\n): Promise<ReadonlyMap<string, PrStatus>> => {\n const prStateByBranch = await resolvePrStateByBranchBatch(input)\n return new Map([...prStateByBranch.entries()].map(([branch, prState]) => [branch, prState.status]))\n}\n\nexport const resolveMergedByPrBatch = async (\n input: ResolvePrByBranchBatchInput,\n): Promise<ReadonlyMap<string, boolean | null>> => {\n const prStateByBranch = await resolvePrStateByBranchBatch(input)\n return new Map(\n [...prStateByBranch.entries()].map(([branch, prState]) => {\n const status = prState.status\n if (status === \"merged\") {\n return [branch, true]\n }\n if (status === \"unknown\") {\n return [branch, null]\n }\n return [branch, false]\n }),\n )\n}\n","import { runGitCommand } from \"./exec\"\n\nexport type GitWorktree = {\n readonly path: string\n readonly head: string\n readonly branch: string | null\n}\n\nconst BRANCH_PREFIX = \"refs/heads/\"\n\nconst parseBranchName = (rawRef: string): string | null => {\n if (rawRef.startsWith(BRANCH_PREFIX)) {\n return rawRef.slice(BRANCH_PREFIX.length)\n }\n return rawRef.length > 0 ? rawRef : null\n}\n\nexport const parseWorktreePorcelain = (raw: string): GitWorktree[] => {\n const tokens = raw.split(\"\\0\")\n const worktrees: GitWorktree[] = []\n\n let currentPath = \"\"\n let currentHead = \"\"\n let currentBranch: string | null = null\n\n const flush = (): void => {\n if (currentPath.length === 0) {\n return\n }\n\n worktrees.push({\n path: currentPath,\n head: currentHead,\n branch: currentBranch,\n })\n currentPath = \"\"\n currentHead = \"\"\n currentBranch = null\n }\n\n for (const token of tokens) {\n if (token.length === 0) {\n flush()\n continue\n }\n\n if (token.startsWith(\"worktree \")) {\n flush()\n currentPath = token.slice(\"worktree \".length)\n continue\n }\n\n if (token.startsWith(\"HEAD \")) {\n currentHead = token.slice(\"HEAD \".length)\n continue\n }\n\n if (token.startsWith(\"branch \")) {\n currentBranch = parseBranchName(token.slice(\"branch \".length))\n continue\n }\n\n if (token === \"detached\") {\n currentBranch = null\n }\n }\n\n flush()\n return worktrees\n}\n\nexport const listGitWorktrees = async (repoRoot: string): Promise<GitWorktree[]> => {\n const result = await runGitCommand({\n cwd: repoRoot,\n args: [\"worktree\", \"list\", \"--porcelain\", \"-z\"],\n })\n return parseWorktreePorcelain(result.stdout)\n}\n","import { constants as fsConstants } from \"node:fs\"\nimport { access, readFile } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport { runGitCommand } from \"../git/exec\"\nimport { resolvePrStateByBranchBatch, type PrState, type PrStatus } from \"../integrations/gh\"\nimport { type GitWorktree, listGitWorktrees } from \"../git/worktree\"\nimport { branchToWorktreeId, getLocksDirectoryPath } from \"./paths\"\nimport { upsertWorktreeMergeLifecycle } from \"./worktree-merge-lifecycle\"\n\ntype LockPayload = {\n readonly schemaVersion: 1\n readonly branch: string\n readonly worktreeId: string\n readonly reason: string\n readonly owner?: string\n}\n\nexport type WorktreeLockState = {\n readonly value: boolean\n readonly reason: string | null\n readonly owner: string | null\n}\n\nexport type WorktreeMergedState = {\n readonly byAncestry: boolean | null\n readonly byPR: boolean | null\n readonly overall: boolean | null\n}\n\nexport type WorktreePrState = {\n readonly status: PrStatus | null\n readonly url: string | null\n}\n\nexport type WorktreeUpstreamState = {\n readonly ahead: number | null\n readonly behind: number | null\n readonly remote: string | null\n}\n\nexport type WorktreeStatus = {\n readonly branch: string | null\n readonly path: string\n readonly head: string\n readonly dirty: boolean\n readonly locked: WorktreeLockState\n readonly merged: WorktreeMergedState\n readonly pr: WorktreePrState\n readonly upstream: WorktreeUpstreamState\n}\n\nconst resolveDirty = async (worktreePath: string): Promise<boolean> => {\n const status = await runGitCommand({\n cwd: worktreePath,\n args: [\"status\", \"--porcelain\"],\n reject: false,\n })\n return status.stdout.trim().length > 0\n}\n\nconst parseLockPayload = (content: string): LockPayload | null => {\n try {\n const parsed = JSON.parse(content) as Partial<LockPayload>\n if (parsed.schemaVersion !== 1) {\n return null\n }\n if (\n typeof parsed.branch !== \"string\" ||\n typeof parsed.worktreeId !== \"string\" ||\n typeof parsed.reason !== \"string\" ||\n parsed.reason.length === 0\n ) {\n return null\n }\n return parsed as LockPayload\n } catch {\n return null\n }\n}\n\nconst resolveLockState = async ({\n repoRoot,\n branch,\n}: {\n readonly repoRoot: string\n readonly branch: string | null\n}): Promise<WorktreeLockState> => {\n if (branch === null) {\n return { value: false, reason: null, owner: null }\n }\n\n const id = branchToWorktreeId(branch)\n const lockPath = join(getLocksDirectoryPath(repoRoot), `${id}.json`)\n try {\n await access(lockPath, fsConstants.F_OK)\n } catch {\n return { value: false, reason: null, owner: null }\n }\n\n try {\n const content = await readFile(lockPath, \"utf8\")\n const lock = parseLockPayload(content)\n if (lock === null) {\n return {\n value: true,\n reason: \"invalid lock metadata\",\n owner: null,\n }\n }\n return {\n value: true,\n reason: lock.reason,\n owner: typeof lock.owner === \"string\" && lock.owner.length > 0 ? lock.owner : null,\n }\n } catch {\n return {\n value: true,\n reason: \"invalid lock metadata\",\n owner: null,\n }\n }\n}\n\nconst WORK_REFLOG_MESSAGE_PATTERN = /^(commit(?: \\([^)]*\\))?|cherry-pick|revert|rebase \\(pick\\)|merge):/\n\nconst resolveLifecycleFromReflog = async ({\n repoRoot,\n branch,\n baseBranch,\n}: {\n readonly repoRoot: string\n readonly branch: string\n readonly baseBranch: string\n}): Promise<{ merged: boolean | null; divergedHead: string | null }> => {\n const reflog = await runGitCommand({\n cwd: repoRoot,\n args: [\"reflog\", \"show\", \"--format=%H%x09%gs\", branch],\n reject: false,\n })\n if (reflog.exitCode !== 0) {\n return {\n merged: null,\n divergedHead: null,\n }\n }\n\n let latestWorkHead: string | null = null\n for (const line of reflog.stdout.split(\"\\n\")) {\n const trimmed = line.trim()\n if (trimmed.length === 0) {\n continue\n }\n\n const separatorIndex = trimmed.indexOf(\"\\t\")\n if (separatorIndex <= 0) {\n continue\n }\n\n const head = trimmed.slice(0, separatorIndex).trim()\n const message = trimmed.slice(separatorIndex + 1).trim()\n if (head.length === 0 || WORK_REFLOG_MESSAGE_PATTERN.test(message) !== true) {\n continue\n }\n if (latestWorkHead === null) {\n latestWorkHead = head\n }\n\n const result = await runGitCommand({\n cwd: repoRoot,\n args: [\"merge-base\", \"--is-ancestor\", head, baseBranch],\n reject: false,\n })\n if (result.exitCode === 0) {\n return {\n merged: true,\n divergedHead: head,\n }\n }\n if (result.exitCode !== 1) {\n return {\n merged: null,\n divergedHead: latestWorkHead,\n }\n }\n }\n\n return {\n merged: false,\n divergedHead: latestWorkHead,\n }\n}\n\nconst resolveMergedState = async ({\n repoRoot,\n branch,\n head,\n baseBranch,\n prStateByBranch,\n}: {\n readonly repoRoot: string\n readonly branch: string | null\n readonly head: string\n readonly baseBranch: string | null\n readonly prStateByBranch: ReadonlyMap<string, PrState>\n}): Promise<WorktreeMergedState> => {\n if (branch === null) {\n return { byAncestry: null, byPR: null, overall: null }\n }\n\n let byAncestry: boolean | null = null\n if (baseBranch !== null) {\n const result = await runGitCommand({\n cwd: repoRoot,\n args: [\"merge-base\", \"--is-ancestor\", branch, baseBranch],\n reject: false,\n })\n\n if (result.exitCode === 0) {\n byAncestry = true\n } else if (result.exitCode === 1) {\n byAncestry = false\n }\n }\n\n const prStatus = branch === baseBranch ? null : (prStateByBranch.get(branch)?.status ?? null)\n let byPR: boolean | null = null\n if (prStatus === \"merged\") {\n byPR = true\n } else if (prStatus === \"none\" || prStatus === \"open\" || prStatus === \"closed_unmerged\") {\n byPR = false\n }\n\n let byLifecycle: boolean | null = null\n if (baseBranch !== null) {\n const lifecycle = await upsertWorktreeMergeLifecycle({\n repoRoot,\n branch,\n baseBranch,\n observedDivergedHead: byAncestry === false ? head : null,\n })\n if (byAncestry === false) {\n byLifecycle = false\n } else if (byAncestry === true) {\n if (lifecycle.everDiverged !== true || lifecycle.lastDivergedHead === null) {\n if (byPR === true) {\n byLifecycle = null\n } else {\n const probe = await resolveLifecycleFromReflog({\n repoRoot,\n branch,\n baseBranch,\n })\n byLifecycle = probe.merged\n if (probe.divergedHead !== null) {\n await upsertWorktreeMergeLifecycle({\n repoRoot,\n branch,\n baseBranch,\n observedDivergedHead: probe.divergedHead,\n })\n }\n }\n } else {\n const lifecycleResult = await runGitCommand({\n cwd: repoRoot,\n args: [\"merge-base\", \"--is-ancestor\", lifecycle.lastDivergedHead, baseBranch],\n reject: false,\n })\n if (lifecycleResult.exitCode === 0) {\n byLifecycle = true\n } else if (lifecycleResult.exitCode === 1) {\n byLifecycle = false\n } else {\n byLifecycle = null\n }\n }\n }\n }\n\n return {\n byAncestry,\n byPR,\n overall: resolveMergedOverall({\n byAncestry,\n byPR,\n byLifecycle,\n }),\n }\n}\n\nconst resolveWorktreePrState = ({\n branch,\n baseBranch,\n prStateByBranch,\n}: {\n readonly branch: string | null\n readonly baseBranch: string | null\n readonly prStateByBranch: ReadonlyMap<string, PrState>\n}): WorktreePrState => {\n if (branch === null || branch === baseBranch) {\n return { status: null, url: null }\n }\n const prState = prStateByBranch.get(branch)\n return {\n status: prState?.status ?? null,\n url: prState?.url ?? null,\n }\n}\n\nexport const resolveMergedOverall = ({\n byAncestry,\n byPR,\n byLifecycle,\n}: {\n readonly byAncestry: boolean | null\n readonly byPR: boolean | null\n readonly byLifecycle: boolean | null\n}): boolean | null => {\n if (byPR === true || byLifecycle === true) {\n return true\n }\n if (byAncestry === false) {\n return false\n }\n if (byPR === false || byLifecycle === false) {\n return false\n }\n return null\n}\n\nconst resolveUpstreamState = async (worktreePath: string): Promise<WorktreeUpstreamState> => {\n const upstreamRef = await runGitCommand({\n cwd: worktreePath,\n args: [\"rev-parse\", \"--abbrev-ref\", \"--symbolic-full-name\", \"@{upstream}\"],\n reject: false,\n })\n if (upstreamRef.exitCode !== 0) {\n return {\n ahead: null,\n behind: null,\n remote: null,\n }\n }\n\n const distance = await runGitCommand({\n cwd: worktreePath,\n args: [\"rev-list\", \"--left-right\", \"--count\", \"@{upstream}...HEAD\"],\n reject: false,\n })\n\n if (distance.exitCode !== 0) {\n return {\n ahead: null,\n behind: null,\n remote: upstreamRef.stdout.trim(),\n }\n }\n\n const [behindRaw, aheadRaw] = distance.stdout.trim().split(/\\s+/)\n const behind = Number.parseInt(behindRaw ?? \"\", 10)\n const ahead = Number.parseInt(aheadRaw ?? \"\", 10)\n return {\n ahead: Number.isNaN(ahead) ? null : ahead,\n behind: Number.isNaN(behind) ? null : behind,\n remote: upstreamRef.stdout.trim(),\n }\n}\n\nconst enrichWorktree = async ({\n repoRoot,\n worktree,\n baseBranch,\n prStateByBranch,\n}: {\n readonly repoRoot: string\n readonly worktree: GitWorktree\n readonly baseBranch: string | null\n readonly prStateByBranch: ReadonlyMap<string, PrState>\n}): Promise<WorktreeStatus> => {\n const [dirty, locked, merged, upstream] = await Promise.all([\n resolveDirty(worktree.path),\n resolveLockState({ repoRoot, branch: worktree.branch }),\n resolveMergedState({ repoRoot, branch: worktree.branch, head: worktree.head, baseBranch, prStateByBranch }),\n resolveUpstreamState(worktree.path),\n ])\n const pr = resolveWorktreePrState({\n branch: worktree.branch,\n baseBranch,\n prStateByBranch,\n })\n\n return {\n branch: worktree.branch,\n path: worktree.path,\n head: worktree.head,\n dirty,\n locked,\n merged,\n pr,\n upstream,\n }\n}\n\nexport type WorktreeSnapshot = {\n readonly repoRoot: string\n readonly baseBranch: string | null\n readonly worktrees: WorktreeStatus[]\n}\n\ntype CollectWorktreeSnapshotOptions = {\n readonly baseBranch?: string | null\n readonly ghEnabled?: boolean\n readonly noGh?: boolean\n}\n\nexport const collectWorktreeSnapshot = async (\n repoRoot: string,\n { baseBranch = null, ghEnabled = true, noGh = false }: CollectWorktreeSnapshotOptions = {},\n): Promise<WorktreeSnapshot> => {\n const worktrees = await listGitWorktrees(repoRoot)\n const prStateByBranch = await resolvePrStateByBranchBatch({\n repoRoot,\n baseBranch,\n branches: worktrees.map((worktree) => worktree.branch),\n enabled: ghEnabled && noGh !== true,\n })\n const enriched = await Promise.all(\n worktrees.map(async (worktree) => {\n return enrichWorktree({ repoRoot, worktree, baseBranch, prStateByBranch })\n }),\n )\n\n return {\n repoRoot,\n baseBranch,\n worktrees: enriched,\n }\n}\n","import { execa } from \"execa\"\n\nconst FZF_BINARY = \"fzf\"\nconst FZF_CHECK_TIMEOUT_MS = 5_000\nconst RESERVED_FZF_ARGS = new Set([\"prompt\", \"layout\", \"height\", \"border\", \"tmux\"])\nconst ANSI_ESCAPE_SEQUENCE_PATTERN = String.raw`\\u001B\\[[0-?]*[ -/]*[@-~]`\nconst ANSI_ESCAPE_SEQUENCE_REGEX = new RegExp(ANSI_ESCAPE_SEQUENCE_PATTERN, \"g\")\n\ntype ExecaLikeError = Error & {\n readonly code?: string\n readonly exitCode?: number\n readonly timedOut?: boolean\n}\n\ntype RunFzfInput = {\n readonly args: string[]\n readonly input: string\n readonly cwd: string\n readonly env: NodeJS.ProcessEnv\n}\n\ntype RunFzfResult = {\n readonly stdout: string\n}\n\nexport type SelectPathWithFzfResult =\n | {\n readonly status: \"selected\"\n readonly path: string\n }\n | {\n readonly status: \"cancelled\"\n }\n\nexport type SelectPathWithFzfInput = {\n readonly candidates: ReadonlyArray<string>\n readonly prompt?: string\n readonly surface?: \"auto\" | \"inline\" | \"tmux-popup\"\n readonly tmuxPopupOpts?: string\n readonly fzfExtraArgs?: ReadonlyArray<string>\n readonly cwd?: string\n readonly env?: NodeJS.ProcessEnv\n readonly isInteractive?: () => boolean\n readonly checkFzfAvailability?: () => Promise<boolean>\n readonly checkFzfTmuxSupport?: () => Promise<boolean>\n readonly runFzf?: (input: RunFzfInput) => Promise<RunFzfResult>\n}\n\nconst sanitizeCandidate = (value: string): string => value.replace(/[\\r\\n]+/g, \" \").trim()\nconst stripAnsi = (value: string): string => value.replace(ANSI_ESCAPE_SEQUENCE_REGEX, \"\")\nconst stripTrailingNewlines = (value: string): string => value.replace(/[\\r\\n]+$/g, \"\")\n\nconst buildFzfInput = (candidates: ReadonlyArray<string>): string => {\n return candidates\n .map((candidate) => sanitizeCandidate(candidate))\n .filter((candidate) => candidate.length > 0)\n .join(\"\\n\")\n}\n\nconst validateExtraFzfArgs = (fzfExtraArgs: ReadonlyArray<string>): void => {\n for (const arg of fzfExtraArgs) {\n if (typeof arg !== \"string\" || arg.length === 0) {\n throw new Error(\"Empty value is not allowed for --fzf-arg\")\n }\n\n if (!arg.startsWith(\"--\")) {\n continue\n }\n\n const withoutPrefix = arg.slice(2)\n if (withoutPrefix.length === 0) {\n continue\n }\n\n const optionName = withoutPrefix.split(\"=\")[0]\n if (optionName !== undefined && RESERVED_FZF_ARGS.has(optionName)) {\n throw new Error(`--fzf-arg cannot override reserved fzf option: --${optionName}`)\n }\n }\n}\n\nconst buildFzfArgs = ({\n prompt,\n fzfExtraArgs,\n}: {\n readonly prompt: string\n readonly fzfExtraArgs: ReadonlyArray<string>\n}): string[] => {\n validateExtraFzfArgs(fzfExtraArgs)\n\n return [`--prompt=${prompt}`, \"--layout=reverse\", \"--height=80%\", \"--border\", ...fzfExtraArgs]\n}\n\nconst defaultCheckFzfAvailability = async (): Promise<boolean> => {\n try {\n await execa(FZF_BINARY, [\"--version\"], {\n timeout: FZF_CHECK_TIMEOUT_MS,\n })\n return true\n } catch (error) {\n const execaError = error as ExecaLikeError\n if (\n execaError.code === \"ENOENT\" ||\n execaError.code === \"ETIMEDOUT\" ||\n execaError.code === \"ERR_EXECA_TIMEOUT\" ||\n execaError.timedOut === true\n ) {\n return false\n }\n throw error\n }\n}\n\nconst defaultCheckFzfTmuxSupport = async (): Promise<boolean> => {\n try {\n const result = await execa(FZF_BINARY, [\"--help\"], {\n timeout: FZF_CHECK_TIMEOUT_MS,\n })\n return result.stdout.includes(\"--tmux\")\n } catch {\n return false\n }\n}\n\nconst defaultRunFzf = async ({ args, input, cwd, env }: RunFzfInput): Promise<RunFzfResult> => {\n const result = await execa(FZF_BINARY, args, {\n input,\n cwd,\n env,\n stderr: \"inherit\",\n })\n return { stdout: result.stdout }\n}\n\nconst ensureFzfAvailable = async (checkFzfAvailability: () => Promise<boolean>): Promise<void> => {\n const available = await checkFzfAvailability()\n if (available) {\n return\n }\n\n throw new Error(\"fzf is required for interactive selection\")\n}\n\nconst shouldTryTmuxPopup = async ({\n surface,\n env,\n checkFzfTmuxSupport,\n}: {\n readonly surface: \"auto\" | \"inline\" | \"tmux-popup\"\n readonly env: NodeJS.ProcessEnv\n readonly checkFzfTmuxSupport: () => Promise<boolean>\n}): Promise<boolean> => {\n if (surface === \"inline\") {\n return false\n }\n if (surface === \"tmux-popup\") {\n return true\n }\n if (typeof env.TMUX !== \"string\" || env.TMUX.length === 0) {\n return false\n }\n try {\n return await checkFzfTmuxSupport()\n } catch {\n return false\n }\n}\n\nconst isTmuxUnknownOptionError = (error: unknown): boolean => {\n const execaError = error as ExecaLikeError & {\n readonly stderr?: string\n readonly stdout?: string\n readonly shortMessage?: string\n }\n const text = [execaError.message, execaError.shortMessage, execaError.stderr, execaError.stdout]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n .join(\"\\n\")\n return /unknown option.*--tmux|--tmux.*unknown option/i.test(text)\n}\n\nexport const selectPathWithFzf = async ({\n candidates,\n prompt = \"worktree> \",\n surface = \"inline\",\n tmuxPopupOpts = \"80%,70%\",\n fzfExtraArgs = [],\n cwd = process.cwd(),\n env = process.env,\n isInteractive = (): boolean => process.stdout.isTTY === true && process.stderr.isTTY === true,\n checkFzfAvailability = defaultCheckFzfAvailability,\n checkFzfTmuxSupport = defaultCheckFzfTmuxSupport,\n runFzf = defaultRunFzf,\n}: SelectPathWithFzfInput): Promise<SelectPathWithFzfResult> => {\n if (candidates.length === 0) {\n throw new Error(\"No candidates provided for fzf selection\")\n }\n\n if (isInteractive() !== true) {\n throw new Error(\"fzf selection requires an interactive terminal\")\n }\n\n await ensureFzfAvailable(checkFzfAvailability)\n const baseArgs = buildFzfArgs({ prompt, fzfExtraArgs })\n const tryTmuxPopup = await shouldTryTmuxPopup({\n surface,\n env,\n checkFzfTmuxSupport,\n })\n const args = tryTmuxPopup ? [...baseArgs, `--tmux=${tmuxPopupOpts}`] : baseArgs\n const input = buildFzfInput(candidates)\n if (input.length === 0) {\n throw new Error(\"All candidates are empty after sanitization\")\n }\n\n const candidateSet = new Set(input.split(\"\\n\").map((candidate) => stripAnsi(candidate)))\n\n const runWithValidation = async (fzfArgs: string[]): Promise<SelectPathWithFzfResult> => {\n const result = await runFzf({\n args: fzfArgs,\n input,\n cwd,\n env,\n })\n\n const selectedPath = stripAnsi(stripTrailingNewlines(result.stdout))\n if (selectedPath.length === 0) {\n return { status: \"cancelled\" }\n }\n\n if (!candidateSet.has(selectedPath)) {\n throw new Error(\"fzf returned a value that is not in the candidate list\")\n }\n\n return {\n status: \"selected\",\n path: selectedPath,\n }\n }\n\n try {\n return await runWithValidation(args)\n } catch (error) {\n if (tryTmuxPopup && isTmuxUnknownOptionError(error)) {\n try {\n return await runWithValidation(baseArgs)\n } catch (fallbackError) {\n const fallbackExecaError = fallbackError as ExecaLikeError\n if (fallbackExecaError.exitCode === 130) {\n return { status: \"cancelled\" }\n }\n throw fallbackError\n }\n }\n const execaError = error as ExecaLikeError\n if (execaError.exitCode === 130) {\n return { status: \"cancelled\" }\n }\n throw error\n }\n}\n","import chalk from \"chalk\"\n\nexport enum LogLevel {\n ERROR = 0,\n WARN = 1,\n INFO = 2,\n DEBUG = 3,\n}\n\ntype LoggerOptions = {\n readonly level?: LogLevel\n readonly prefix?: string\n}\n\nexport type Logger = {\n readonly level: LogLevel\n readonly prefix: string\n error: (message: string, error?: Error) => void\n warn: (message: string) => void\n info: (message: string) => void\n debug: (message: string) => void\n success: (message: string) => void\n createChild: (suffix: string) => Logger\n}\n\nconst resolveDefaultLogLevel = (): LogLevel => {\n if (process.env.VDE_WORKTREE_DEBUG === \"true\" || process.env.VDE_DEBUG === \"true\") {\n return LogLevel.DEBUG\n }\n if (process.env.VDE_WORKTREE_VERBOSE === \"true\" || process.env.VDE_VERBOSE === \"true\") {\n return LogLevel.INFO\n }\n return LogLevel.WARN\n}\n\nconst formatMessage = (prefix: string, message: string): string => {\n return prefix ? `${prefix} ${message}` : message\n}\n\nexport const createLogger = (options: LoggerOptions = {}): Logger => {\n const level = options.level ?? resolveDefaultLogLevel()\n const prefix = options.prefix ?? \"\"\n\n const build = (nextPrefix: string, nextLevel: LogLevel): Logger => {\n const resolvedPrefix = nextPrefix\n\n return {\n level: nextLevel,\n prefix: resolvedPrefix,\n error(message: string, error?: Error): void {\n if (nextLevel >= LogLevel.ERROR) {\n console.error(chalk.red(formatMessage(resolvedPrefix, `Error: ${message}`)))\n if (error && (process.env.VDE_WORKTREE_DEBUG === \"true\" || process.env.VDE_DEBUG === \"true\")) {\n console.error(chalk.gray(error.stack))\n }\n }\n },\n warn(message: string): void {\n if (nextLevel >= LogLevel.WARN) {\n console.warn(chalk.yellow(formatMessage(resolvedPrefix, message)))\n }\n },\n info(message: string): void {\n if (nextLevel >= LogLevel.INFO) {\n console.log(formatMessage(resolvedPrefix, message))\n }\n },\n debug(message: string): void {\n if (nextLevel >= LogLevel.DEBUG) {\n console.log(chalk.gray(formatMessage(resolvedPrefix, `[DEBUG] ${message}`)))\n }\n },\n success(message: string): void {\n console.log(chalk.green(formatMessage(resolvedPrefix, message)))\n },\n createChild(suffix: string): Logger {\n const childPrefix = resolvedPrefix ? `${resolvedPrefix} ${suffix}` : suffix\n return build(childPrefix, nextLevel)\n },\n }\n }\n\n return build(prefix, level)\n}\n","import type { createRequire } from \"node:module\"\n\ntype RequireLike = ReturnType<typeof createRequire>\ntype PackageJsonModule = {\n readonly version: string\n}\ntype ModuleLoadError = Error & {\n readonly code?: string\n}\n\nconst CANDIDATE_PATHS = [\"../package.json\", \"../../package.json\"] as const\n\nconst isModuleNotFoundError = (error: unknown): error is ModuleLoadError => {\n return error instanceof Error && (error as ModuleLoadError).code === \"MODULE_NOT_FOUND\"\n}\n\nexport const loadPackageVersion = (requireFn: RequireLike): string => {\n let lastNotFound: ModuleLoadError | undefined\n\n for (const candidatePath of CANDIDATE_PATHS) {\n try {\n return (requireFn(candidatePath) as PackageJsonModule).version\n } catch (error) {\n if (isModuleNotFoundError(error)) {\n lastNotFound = error\n continue\n }\n\n throw error\n }\n }\n\n throw lastNotFound ?? new Error(`Unable to resolve package version from candidates: ${CANDIDATE_PATHS.join(\", \")}`)\n}\n","import { constants as fsConstants } from \"node:fs\"\nimport { access, cp, mkdir, readFile, readdir, rm, symlink, writeFile } from \"node:fs/promises\"\nimport { createRequire } from \"node:module\"\nimport { homedir } from \"node:os\"\nimport { dirname, join, relative, resolve, sep } from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { Chalk } from \"chalk\"\nimport { parseArgs } from \"citty\"\nimport type { ArgsDef } from \"citty\"\nimport { execa } from \"execa\"\nimport stringWidth from \"string-width\"\nimport { getBorderCharacters, table } from \"table\"\nimport { loadResolvedConfig } from \"../config/loader\"\nimport { LIST_TABLE_COLUMNS, type ListTableColumn, type ResolvedConfig, type SelectorCdSurface } from \"../config/types\"\nimport {\n DEFAULT_HOOK_TIMEOUT_MS,\n DEFAULT_LOCK_TIMEOUT_MS,\n DEFAULT_STALE_LOCK_TTL_SECONDS,\n EXIT_CODE,\n SCHEMA_VERSION,\n WRITE_COMMANDS,\n} from \"../core/constants\"\nimport { createCliError, ensureCliError, type CliError } from \"../core/errors\"\nimport { invokeHook, runPostHook, runPreHook, type HookExecutionContext } from \"../core/hooks\"\nimport { initializeRepository, isInitialized } from \"../core/init\"\nimport {\n branchToWorktreePath,\n ensurePathInsideRoot,\n ensurePathInsideRepo,\n getWorktreeRootPath,\n isManagedWorktreePath,\n resolvePathFromCwd,\n resolveRepoContext,\n resolveRepoRelativePath,\n} from \"../core/paths\"\nimport { readNumberFromEnvOrDefault, withRepoLock } from \"../core/repo-lock\"\nimport {\n deleteWorktreeMergeLifecycle,\n moveWorktreeMergeLifecycle,\n upsertWorktreeMergeLifecycle,\n} from \"../core/worktree-merge-lifecycle\"\nimport { deleteWorktreeLock, readWorktreeLock, upsertWorktreeLock } from \"../core/worktree-lock\"\nimport {\n collectWorktreeSnapshot as collectWorktreeSnapshotBase,\n type WorktreeSnapshot,\n type WorktreeStatus,\n} from \"../core/worktree-state\"\nimport { doesGitRefExist, runGitCommand } from \"../git/exec\"\nimport { selectPathWithFzf as defaultSelectPathWithFzf } from \"../integrations/fzf\"\nimport type { SelectPathWithFzfInput, SelectPathWithFzfResult } from \"../integrations/fzf\"\nimport { createLogger, LogLevel, type Logger } from \"../utils/logger\"\nimport { loadPackageVersion } from \"./package-version\"\n\nexport type CLI = {\n run(args?: string[]): Promise<number>\n}\n\ntype CLIOptions = {\n readonly version?: string\n readonly cwd?: string\n readonly stdout?: (line: string) => void\n readonly stderr?: (line: string) => void\n readonly selectPathWithFzf?: (input: SelectPathWithFzfInput) => Promise<SelectPathWithFzfResult>\n readonly isInteractive?: () => boolean\n}\n\ntype OptionValueKind = \"boolean\" | \"value\"\n\ntype OptionSpec = {\n readonly kind: OptionValueKind\n readonly allowOptionLikeValue: boolean\n}\n\ntype OptionSpecs = {\n readonly longOptions: Map<string, OptionSpec>\n readonly shortOptions: Map<string, OptionSpec>\n}\n\ntype CommonRuntime = {\n readonly command: string\n readonly json: boolean\n readonly hooksEnabled: boolean\n readonly ghEnabled: boolean\n readonly strictPostHooks: boolean\n readonly hookTimeoutMs: number\n readonly lockTimeoutMs: number\n readonly allowUnsafe: boolean\n readonly isInteractive: boolean\n}\n\ntype JsonSuccessStatus = \"ok\" | \"created\" | \"existing\" | \"deleted\"\n\ntype JsonSuccess = {\n readonly schemaVersion: number\n readonly command: string\n readonly status: JsonSuccessStatus\n readonly repoRoot: string | null\n readonly [key: string]: unknown\n}\n\ntype ParsedForceFlags = {\n readonly forceDirty: boolean\n readonly allowUnpushed: boolean\n readonly forceUnmerged: boolean\n readonly forceLocked: boolean\n}\n\ntype CompletionShell = \"zsh\" | \"fish\"\n\ntype CommandHelp = {\n readonly name: string\n readonly usage: string\n readonly summary: string\n readonly details: readonly string[]\n readonly options?: readonly string[]\n readonly examples?: readonly string[]\n}\n\ntype CatppuccinTheme = {\n readonly header: (value: string) => string\n readonly branch: (value: string) => string\n readonly branchCurrent: (value: string) => string\n readonly branchDetached: (value: string) => string\n readonly dirty: (value: string) => string\n readonly clean: (value: string) => string\n readonly merged: (value: string) => string\n readonly unmerged: (value: string) => string\n readonly unknown: (value: string) => string\n readonly base: (value: string) => string\n readonly locked: (value: string) => string\n readonly path: (value: string) => string\n readonly muted: (value: string) => string\n readonly value: (value: string) => string\n readonly previewLabel: (value: string) => string\n readonly previewSection: (value: string) => string\n}\n\nconst EXIT_CODE_CANCELLED = 130\n\nconst optionNamesAllowOptionLikeValue = new Set([\"fzfArg\", \"fzf-arg\"])\nconst CD_FZF_EXTRA_ARGS = [\n \"--delimiter=\\t\",\n \"--with-nth=1\",\n \"--preview=printf '%b' {3}\",\n \"--preview-window=right,60%,wrap\",\n \"--ansi\",\n] as const\nconst DEFAULT_LIST_TABLE_COLUMNS = [...LIST_TABLE_COLUMNS]\nconst LIST_TABLE_CELL_HORIZONTAL_PADDING = 2\nconst COMPLETION_SHELLS: readonly CompletionShell[] = [\"zsh\", \"fish\"] as const\nconst COMPLETION_FILE_BY_SHELL: Readonly<Record<CompletionShell, string>> = {\n zsh: \"zsh/_vw\",\n fish: \"fish/vw.fish\",\n}\n\nconst CATPPUCCIN_MOCHA = {\n rosewater: \"#f5e0dc\",\n mauve: \"#cba6f7\",\n red: \"#f38ba8\",\n peach: \"#fab387\",\n yellow: \"#f9e2af\",\n green: \"#a6e3a1\",\n blue: \"#89b4fa\",\n lavender: \"#b4befe\",\n sapphire: \"#74c7ec\",\n text: \"#cdd6f4\",\n subtext0: \"#a6adc8\",\n overlay0: \"#6c7086\",\n} as const\n\nconst identityColor = (value: string): string => value\n\nconst hasDefaultListColumnOrder = (columns: ReadonlyArray<ListTableColumn>): boolean => {\n if (columns.length !== DEFAULT_LIST_TABLE_COLUMNS.length) {\n return false\n }\n return columns.every((column, index) => column === DEFAULT_LIST_TABLE_COLUMNS[index])\n}\n\nconst createCatppuccinTheme = ({ enabled }: { readonly enabled: boolean }): CatppuccinTheme => {\n if (enabled !== true) {\n return {\n header: identityColor,\n branch: identityColor,\n branchCurrent: identityColor,\n branchDetached: identityColor,\n dirty: identityColor,\n clean: identityColor,\n merged: identityColor,\n unmerged: identityColor,\n unknown: identityColor,\n base: identityColor,\n locked: identityColor,\n path: identityColor,\n muted: identityColor,\n value: identityColor,\n previewLabel: identityColor,\n previewSection: identityColor,\n }\n }\n\n const chalk = new Chalk({ level: 3 })\n const color =\n (hex: string) =>\n (value: string): string =>\n chalk.hex(hex)(value)\n\n return {\n header: color(CATPPUCCIN_MOCHA.rosewater),\n branch: color(CATPPUCCIN_MOCHA.lavender),\n branchCurrent: color(CATPPUCCIN_MOCHA.mauve),\n branchDetached: color(CATPPUCCIN_MOCHA.peach),\n dirty: color(CATPPUCCIN_MOCHA.peach),\n clean: color(CATPPUCCIN_MOCHA.green),\n merged: color(CATPPUCCIN_MOCHA.green),\n unmerged: color(CATPPUCCIN_MOCHA.red),\n unknown: color(CATPPUCCIN_MOCHA.yellow),\n base: color(CATPPUCCIN_MOCHA.blue),\n locked: color(CATPPUCCIN_MOCHA.red),\n path: color(CATPPUCCIN_MOCHA.sapphire),\n muted: color(CATPPUCCIN_MOCHA.overlay0),\n value: color(CATPPUCCIN_MOCHA.text),\n previewLabel: color(CATPPUCCIN_MOCHA.mauve),\n previewSection: color(CATPPUCCIN_MOCHA.rosewater),\n }\n}\n\nconst shouldUseAnsiColors = ({ interactive }: { readonly interactive: boolean }): boolean => {\n return interactive === true\n}\n\nconst colorizeCellContent = ({\n cell,\n color,\n}: {\n readonly cell: string\n readonly color: (value: string) => string\n}): string => {\n const matched = /^(\\s*)(.*?)(\\s*)$/.exec(cell)\n if (matched === null) {\n return cell\n }\n const leftPadding = matched[1] ?? \"\"\n const content = matched[2] ?? \"\"\n const rightPadding = matched[3] ?? \"\"\n if (content.length === 0) {\n return cell\n }\n return `${leftPadding}${color(content)}${rightPadding}`\n}\n\nconst colorizeListTableLine = ({ line, theme }: { readonly line: string; readonly theme: CatppuccinTheme }): string => {\n if (line.startsWith(\"┌\") || line.startsWith(\"├\") || line.startsWith(\"└\")) {\n return theme.muted(line)\n }\n if (line.startsWith(\"│\") !== true) {\n return line\n }\n\n const segments = line.split(\"│\")\n if (segments.length < 3) {\n return line\n }\n\n const cells = segments.slice(1, -1)\n if (cells.length !== 8) {\n return line\n }\n\n const headers = cells.map((cell) => cell.trim())\n const isHeaderRow =\n headers[0] === \"branch\" &&\n headers[1] === \"dirty\" &&\n headers[2] === \"merged\" &&\n headers[3] === \"pr\" &&\n headers[4] === \"locked\" &&\n headers[5] === \"ahead\" &&\n headers[6] === \"behind\" &&\n headers[7] === \"path\"\n\n if (isHeaderRow) {\n const nextCells = cells.map((cell) => colorizeCellContent({ cell, color: theme.header }))\n return [segments[0], ...nextCells, segments.at(-1) ?? \"\"].join(\"│\")\n }\n\n const branchCell = cells[0] as string\n const dirtyCell = cells[1] as string\n const mergedCell = cells[2] as string\n const prCell = cells[3] as string\n const lockedCell = cells[4] as string\n const aheadCell = cells[5] as string\n const behindCell = cells[6] as string\n const pathCell = cells[7] as string\n\n const branchColor =\n branchCell.includes(\"(detached)\") === true\n ? theme.branchDetached\n : branchCell.trimStart().startsWith(\"*\")\n ? theme.branchCurrent\n : theme.branch\n const dirtyTrimmed = dirtyCell.trim()\n const dirtyColor = dirtyTrimmed === \"dirty\" ? theme.dirty : dirtyTrimmed === \"clean\" ? theme.clean : theme.value\n const mergedTrimmed = mergedCell.trim()\n const mergedColor =\n mergedTrimmed === \"merged\"\n ? theme.merged\n : mergedTrimmed === \"unmerged\"\n ? theme.unmerged\n : mergedTrimmed === \"-\"\n ? theme.base\n : theme.unknown\n const prTrimmed = prCell.trim()\n const prColor =\n prTrimmed === \"merged\"\n ? theme.merged\n : prTrimmed === \"open\"\n ? theme.value\n : prTrimmed === \"closed_unmerged\"\n ? theme.unmerged\n : prTrimmed === \"none\"\n ? theme.muted\n : prTrimmed === \"-\"\n ? theme.base\n : theme.unknown\n const lockedTrimmed = lockedCell.trim()\n const lockedColor = lockedTrimmed === \"locked\" ? theme.locked : theme.muted\n const aheadTrimmed = aheadCell.trim()\n const aheadValue = Number.parseInt(aheadTrimmed, 10)\n const aheadColor =\n aheadTrimmed === \"-\"\n ? theme.muted\n : Number.isNaN(aheadValue)\n ? theme.value\n : aheadValue > 0\n ? theme.unmerged\n : aheadValue === 0\n ? theme.merged\n : theme.unknown\n const behindTrimmed = behindCell.trim()\n const behindValue = Number.parseInt(behindTrimmed, 10)\n const behindColor =\n behindTrimmed === \"-\"\n ? theme.muted\n : Number.isNaN(behindValue)\n ? theme.value\n : behindValue > 0\n ? theme.unknown\n : behindValue === 0\n ? theme.merged\n : theme.unknown\n\n const nextCells = [\n colorizeCellContent({ cell: branchCell, color: branchColor }),\n colorizeCellContent({ cell: dirtyCell, color: dirtyColor }),\n colorizeCellContent({ cell: mergedCell, color: mergedColor }),\n colorizeCellContent({ cell: prCell, color: prColor }),\n colorizeCellContent({ cell: lockedCell, color: lockedColor }),\n colorizeCellContent({ cell: aheadCell, color: aheadColor }),\n colorizeCellContent({ cell: behindCell, color: behindColor }),\n colorizeCellContent({ cell: pathCell, color: theme.path }),\n ]\n\n return [segments[0], ...nextCells, segments.at(-1) ?? \"\"].join(\"│\")\n}\n\nconst colorizeListTable = ({\n rendered,\n theme,\n}: {\n readonly rendered: string\n readonly theme: CatppuccinTheme\n}): string => {\n return rendered\n .trimEnd()\n .split(\"\\n\")\n .map((line) => colorizeListTableLine({ line, theme }))\n .join(\"\\n\")\n}\n\nconst commandHelpEntries: readonly CommandHelp[] = [\n {\n name: \"init\",\n usage: \"vw init\",\n summary: \"Initialize directories, hooks, and managed exclude entries.\",\n details: [\n \"Creates .worktree and .vde/worktree directories.\",\n \"Appends managed entries to .git/info/exclude (idempotent).\",\n ],\n },\n {\n name: \"list\",\n usage: \"vw list [--json] [--full-path]\",\n summary: \"List worktrees with status metadata.\",\n details: [\n \"Table output includes branch, path, dirty, lock, merged, PR state, and ahead/behind vs base branch.\",\n \"By default, long path values are truncated to fit terminal width.\",\n \"JSON output includes PR status/url and upstream metadata fields.\",\n ],\n options: [\"--full-path\"],\n },\n {\n name: \"status\",\n usage: \"vw status [branch] [--json]\",\n summary: \"Show a single worktree status.\",\n details: [\"Without branch, resolves from current working directory.\"],\n },\n {\n name: \"path\",\n usage: \"vw path <branch> [--json]\",\n summary: \"Print absolute worktree path for the branch.\",\n details: [],\n },\n {\n name: \"new\",\n usage: \"vw new [branch]\",\n summary: \"Create branch + worktree under .worktree.\",\n details: [\"Without branch, generates wip-xxxxxx.\"],\n },\n {\n name: \"switch\",\n usage: \"vw switch <branch>\",\n summary: \"Idempotent branch entrypoint.\",\n details: [\"Reuses existing worktree when present, otherwise creates one.\"],\n },\n {\n name: \"mv\",\n usage: \"vw mv <new-branch>\",\n summary: \"Rename current non-primary worktree branch and move its directory.\",\n details: [\"Requires branch checkout (detached HEAD is rejected).\"],\n },\n {\n name: \"del\",\n usage: \"vw del [branch] [flags]\",\n summary: \"Delete worktree + branch with safety checks.\",\n details: [\n \"Default rejects dirty, locked, unmerged/unknown, or unpushed/unknown states.\",\n \"For non-TTY force usage, --allow-unsafe is required.\",\n ],\n options: [\"--force-dirty\", \"--allow-unpushed\", \"--force-unmerged\", \"--force-locked\", \"--force\", \"--allow-unsafe\"],\n },\n {\n name: \"gone\",\n usage: \"vw gone [--json] [--apply|--dry-run]\",\n summary: \"Bulk cleanup by safety-filtered candidate selection.\",\n details: [\"Default mode is dry-run. Use --apply to delete candidates.\"],\n },\n {\n name: \"get\",\n usage: \"vw get <remote/branch>\",\n summary: \"Fetch remote branch, create tracking local branch if needed, then attach worktree.\",\n details: [\"Example target format: origin/feature/foo.\"],\n },\n {\n name: \"extract\",\n usage: \"vw extract --current [--stash]\",\n summary: \"Extract current primary branch into .worktree and switch primary back to base.\",\n details: [\"Current implementation targets primary worktree extraction flow.\"],\n options: [\"--current\", \"--stash\", \"--from <path>\"],\n },\n {\n name: \"absorb\",\n usage: \"vw absorb <branch> [--from <worktree-name>] [--keep-stash] [--allow-agent --allow-unsafe]\",\n summary: \"Bring non-primary worktree changes (including uncommitted) into primary worktree.\",\n details: [\n \"Stashes source worktree changes, checks out target branch in primary, then applies stash.\",\n \"Non-TTY execution requires --allow-agent and --allow-unsafe.\",\n ],\n options: [\"--from <worktree-name>\", \"--keep-stash\", \"--allow-agent\", \"--allow-unsafe\"],\n },\n {\n name: \"unabsorb\",\n usage: \"vw unabsorb <branch> [--to <worktree-name>] [--keep-stash] [--allow-agent --allow-unsafe]\",\n summary: \"Push primary worktree changes (including uncommitted) into non-primary worktree.\",\n details: [\n \"Stashes primary worktree changes, applies them in target non-primary worktree, then optionally drops stash.\",\n \"Non-TTY execution requires --allow-agent and --allow-unsafe.\",\n ],\n options: [\"--to <worktree-name>\", \"--keep-stash\", \"--allow-agent\", \"--allow-unsafe\"],\n },\n {\n name: \"use\",\n usage: \"vw use <branch> [--allow-shared] [--allow-agent --allow-unsafe]\",\n summary: \"Checkout target branch in primary worktree.\",\n details: [\n \"If target branch is attached by another worktree, --allow-shared is required.\",\n \"Non-TTY execution requires --allow-agent and --allow-unsafe.\",\n ],\n options: [\"--allow-shared\", \"--allow-agent\", \"--allow-unsafe\"],\n },\n {\n name: \"exec\",\n usage: \"vw exec <branch> -- <cmd...>\",\n summary: \"Run command in target branch worktree.\",\n details: [\"Returns exit code 21 when child process exits non-zero.\"],\n },\n {\n name: \"invoke\",\n usage: \"vw invoke <pre-*/post-*> [-- <args...>]\",\n summary: \"Manually run hook script for debugging/operations.\",\n details: [],\n },\n {\n name: \"copy\",\n usage: \"vw copy <repo-relative-path...>\",\n summary: \"Copy repo-root files/dirs to target worktree (typically WT_WORKTREE_PATH).\",\n details: [],\n },\n {\n name: \"link\",\n usage: \"vw link <repo-relative-path...> [--no-fallback]\",\n summary: \"Create symlink from target worktree to repo-root file.\",\n details: [\"On Windows, fallback copy is used unless --no-fallback is set.\"],\n },\n {\n name: \"lock\",\n usage: \"vw lock <branch> [--owner <name>] [--reason <text>]\",\n summary: \"Create/update lock metadata to protect worktree from cleanup/deletion.\",\n details: [],\n },\n {\n name: \"unlock\",\n usage: \"vw unlock <branch> [--owner <name>] [--force]\",\n summary: \"Remove lock metadata with owner/force checks.\",\n details: [],\n },\n {\n name: \"cd\",\n usage: \"vw cd\",\n summary: \"Interactive fzf picker that prints selected worktree absolute path.\",\n details: ['Use with shell: cd \"$(vw cd)\"'],\n options: [\"--prompt <text>\", \"--fzf-arg <arg>\"],\n },\n {\n name: \"completion\",\n usage: \"vw completion <zsh|fish> [--install] [--path <file>]\",\n summary: \"Print or install shell completion scripts.\",\n details: [\n \"Without --install, prints completion script to stdout.\",\n \"With --install, writes completion file to default shell path or --path.\",\n ],\n options: [\"--install\", \"--path <file>\"],\n },\n] as const\n\nconst splitRawArgsByDoubleDash = (\n args: readonly string[],\n): {\n readonly beforeDoubleDash: string[]\n readonly afterDoubleDash: string[]\n} => {\n const separatorIndex = args.indexOf(\"--\")\n if (separatorIndex < 0) {\n return {\n beforeDoubleDash: [...args],\n afterDoubleDash: [],\n }\n }\n return {\n beforeDoubleDash: args.slice(0, separatorIndex),\n afterDoubleDash: args.slice(separatorIndex + 1),\n }\n}\n\nconst toKebabCase = (value: string): string => {\n return value.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`)\n}\n\nconst toOptionSpec = (kind: OptionValueKind, optionName: string): OptionSpec => {\n return {\n kind,\n allowOptionLikeValue: optionNamesAllowOptionLikeValue.has(optionName),\n }\n}\n\nconst buildOptionSpecs = (argsDef: Readonly<ArgsDef>): OptionSpecs => {\n const longOptions = new Map<string, OptionSpec>()\n const shortOptions = new Map<string, OptionSpec>()\n\n for (const [argName, arg] of Object.entries(argsDef)) {\n if (arg.type === \"positional\") {\n continue\n }\n\n const valueKind: OptionValueKind = arg.type === \"boolean\" ? \"boolean\" : \"value\"\n const kebabName = toKebabCase(argName)\n longOptions.set(argName, toOptionSpec(valueKind, argName))\n longOptions.set(kebabName, toOptionSpec(valueKind, kebabName))\n\n const aliases =\n \"alias\" in arg ? (Array.isArray(arg.alias) ? arg.alias : typeof arg.alias === \"string\" ? [arg.alias] : []) : []\n\n for (const alias of aliases) {\n if (alias.length === 1) {\n shortOptions.set(alias, toOptionSpec(valueKind, alias))\n continue\n }\n\n longOptions.set(alias, toOptionSpec(valueKind, alias))\n const kebabAlias = toKebabCase(alias)\n longOptions.set(kebabAlias, toOptionSpec(valueKind, kebabAlias))\n }\n }\n\n return { longOptions, shortOptions }\n}\n\nconst validateRawOptions = (args: readonly string[], optionSpecs: OptionSpecs): void => {\n for (let index = 0; index < args.length; index += 1) {\n const token = args[index]\n if (typeof token !== \"string\") {\n continue\n }\n\n if (token === \"--\") {\n break\n }\n\n if (!token.startsWith(\"-\") || token === \"-\") {\n continue\n }\n\n if (token.startsWith(\"--\")) {\n const value = token.slice(2)\n if (value.length === 0) {\n continue\n }\n\n const separatorIndex = value.indexOf(\"=\")\n const rawOptionName = separatorIndex >= 0 ? value.slice(0, separatorIndex) : value\n const directOptionSpec = optionSpecs.longOptions.get(rawOptionName)\n const optionNameForNegation = rawOptionName.startsWith(\"no-\") ? rawOptionName.slice(3) : rawOptionName\n const optionSpec = directOptionSpec ?? optionSpecs.longOptions.get(optionNameForNegation)\n if (optionSpec === undefined) {\n throw createCliError(\"INVALID_ARGUMENT\", { message: `Unknown option: --${rawOptionName}` })\n }\n const kind = optionSpec.kind\n\n if (kind === \"value\") {\n if (separatorIndex >= 0) {\n const inlineValue = value.slice(separatorIndex + 1)\n if (inlineValue.length === 0) {\n throw createCliError(\"INVALID_ARGUMENT\", { message: `Missing value for option: --${rawOptionName}` })\n }\n } else {\n const nextToken = args[index + 1]\n if (typeof nextToken !== \"string\" || nextToken.length === 0) {\n throw createCliError(\"INVALID_ARGUMENT\", { message: `Missing value for option: --${rawOptionName}` })\n }\n if (nextToken.startsWith(\"-\") && optionSpec.allowOptionLikeValue !== true) {\n throw createCliError(\"INVALID_ARGUMENT\", { message: `Missing value for option: --${rawOptionName}` })\n }\n index += 1\n }\n }\n continue\n }\n\n const shortFlags = token.slice(1)\n for (let flagIndex = 0; flagIndex < shortFlags.length; flagIndex += 1) {\n const option = shortFlags[flagIndex]\n if (typeof option !== \"string\" || option.length === 0) {\n continue\n }\n\n const optionSpec = optionSpecs.shortOptions.get(option)\n if (optionSpec === undefined) {\n throw createCliError(\"INVALID_ARGUMENT\", { message: `Unknown option: -${option}` })\n }\n const kind = optionSpec.kind\n\n if (kind === \"value\") {\n if (flagIndex < shortFlags.length - 1) {\n break\n }\n\n const nextToken = args[index + 1]\n if (typeof nextToken !== \"string\" || nextToken.length === 0) {\n throw createCliError(\"INVALID_ARGUMENT\", { message: `Missing value for option: -${option}` })\n }\n if (nextToken.startsWith(\"-\") && optionSpec.allowOptionLikeValue !== true) {\n throw createCliError(\"INVALID_ARGUMENT\", { message: `Missing value for option: -${option}` })\n }\n index += 1\n break\n }\n }\n }\n}\n\nconst getPositionals = (args: { readonly _: unknown[] }): string[] => {\n return args._.filter((value): value is string => typeof value === \"string\")\n}\n\nconst collectOptionValues = ({\n args,\n optionNames,\n}: {\n readonly args: readonly string[]\n readonly optionNames: ReadonlyArray<string>\n}): string[] => {\n const values: string[] = []\n const optionNameSet = new Set(optionNames)\n\n for (let index = 0; index < args.length; index += 1) {\n const token = args[index]\n if (typeof token !== \"string\") {\n continue\n }\n\n if (token === \"--\") {\n break\n }\n\n if (!token.startsWith(\"--\")) {\n continue\n }\n\n const eqIndex = token.indexOf(\"=\")\n const rawName = eqIndex >= 0 ? token.slice(2, eqIndex) : token.slice(2)\n if (optionNameSet.has(rawName) !== true) {\n continue\n }\n\n if (eqIndex >= 0) {\n values.push(token.slice(eqIndex + 1))\n continue\n }\n\n const nextToken = args[index + 1]\n if (typeof nextToken === \"string\") {\n values.push(nextToken)\n index += 1\n }\n }\n\n return values\n}\n\nconst mergeFzfArgs = ({\n defaults,\n extras,\n}: {\n readonly defaults: ReadonlyArray<string>\n readonly extras: ReadonlyArray<string>\n}): string[] => {\n const merged = [...defaults]\n for (const arg of extras) {\n if (merged.includes(arg) !== true) {\n merged.push(arg)\n }\n }\n return merged\n}\n\nconst toNumberOption = ({\n value,\n optionName,\n}: {\n readonly value: unknown\n readonly optionName: string\n}): number | undefined => {\n if (value === undefined) {\n return undefined\n }\n if (typeof value !== \"string\") {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: `${optionName} must be a number`,\n })\n }\n\n const parsed = Number.parseInt(value, 10)\n if (Number.isFinite(parsed) !== true || parsed <= 0) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: `${optionName} must be a positive integer`,\n })\n }\n return parsed\n}\n\nconst ensureArgumentCount = ({\n command,\n args,\n min,\n max,\n}: {\n readonly command: string\n readonly args: readonly string[]\n readonly min: number\n readonly max: number\n}): void => {\n if (args.length < min || args.length > max) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: `${command} expects ${String(min)}-${String(max)} positional argument(s), received ${String(args.length)}`,\n details: { command, args },\n })\n }\n}\n\nconst ensureHasCommandAfterDoubleDash = ({\n command,\n argsAfterDoubleDash,\n}: {\n readonly command: string\n readonly argsAfterDoubleDash: readonly string[]\n}): void => {\n if (argsAfterDoubleDash.length === 0) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: `${command} requires arguments after --`,\n })\n }\n}\n\nconst resolveBaseBranch = async ({\n repoRoot,\n config,\n}: {\n readonly repoRoot: string\n readonly config: ResolvedConfig\n}): Promise<string> => {\n if (typeof config.git.baseBranch === \"string\" && config.git.baseBranch.length > 0) {\n return config.git.baseBranch\n }\n\n const remote = config.git.baseRemote\n const resolved = await runGitCommand({\n cwd: repoRoot,\n args: [\"symbolic-ref\", \"--quiet\", \"--short\", `refs/remotes/${remote}/HEAD`],\n reject: false,\n })\n if (resolved.exitCode === 0) {\n const raw = resolved.stdout.trim()\n const prefix = `${remote}/`\n if (raw.startsWith(prefix)) {\n return raw.slice(prefix.length)\n }\n }\n\n for (const candidate of [\"main\", \"master\"]) {\n if (await doesGitRefExist(repoRoot, `refs/heads/${candidate}`)) {\n return candidate\n }\n }\n\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: \"Unable to resolve base branch from config.yml (baseRemote/HEAD -> main/master).\",\n details: {\n remote,\n },\n })\n}\n\nconst ensureTargetPathWritable = async (targetPath: string): Promise<void> => {\n try {\n await access(targetPath, fsConstants.F_OK)\n } catch {\n await mkdir(dirname(targetPath), { recursive: true })\n return\n }\n\n const entries = await readdir(targetPath)\n if (entries.length > 0) {\n throw createCliError(\"TARGET_PATH_NOT_EMPTY\", {\n message: `Target path is not empty: ${targetPath}`,\n details: { path: targetPath },\n })\n }\n}\n\nconst buildJsonSuccess = ({\n command,\n status,\n repoRoot,\n details,\n}: {\n readonly command: string\n readonly status: JsonSuccessStatus\n readonly repoRoot: string | null\n readonly details?: Record<string, unknown>\n}): JsonSuccess => {\n return {\n schemaVersion: SCHEMA_VERSION,\n command,\n status,\n repoRoot,\n ...(details ?? {}),\n }\n}\n\nconst buildJsonError = ({\n command,\n repoRoot,\n error,\n}: {\n readonly command: string\n readonly repoRoot: string | null\n readonly error: CliError\n}): Record<string, unknown> => {\n return {\n schemaVersion: SCHEMA_VERSION,\n command,\n status: \"error\",\n repoRoot,\n code: error.code,\n message: error.message,\n details: error.details,\n }\n}\n\nconst resolveTargetWorktreeByBranch = ({\n branch,\n worktrees,\n}: {\n readonly branch: string\n readonly worktrees: readonly WorktreeStatus[]\n}): WorktreeStatus => {\n const found = worktrees.find((worktree) => worktree.branch === branch)\n if (found !== undefined) {\n return found\n }\n throw createCliError(\"WORKTREE_NOT_FOUND\", {\n message: `Worktree not found for branch: ${branch}`,\n details: { branch },\n })\n}\n\nconst resolveCurrentWorktree = ({\n snapshot,\n currentWorktreeRoot,\n}: {\n readonly snapshot: WorktreeSnapshot\n readonly currentWorktreeRoot: string\n}): WorktreeStatus => {\n const directMatch = snapshot.worktrees.find((worktree) => worktree.path === currentWorktreeRoot)\n if (directMatch !== undefined) {\n return directMatch\n }\n const containing = snapshot.worktrees.find((worktree) => {\n return currentWorktreeRoot.startsWith(`${worktree.path}${sep}`)\n })\n if (containing !== undefined) {\n return containing\n }\n throw createCliError(\"WORKTREE_NOT_FOUND\", {\n message: \"No worktree found for current location\",\n details: { currentWorktreeRoot },\n })\n}\n\nconst validateInitializedForWrite = async (repoRoot: string): Promise<void> => {\n if (await isInitialized(repoRoot)) {\n return\n }\n throw createCliError(\"NOT_INITIALIZED\", {\n message: \"Repository is not initialized. Run `vde-worktree init` first.\",\n details: { repoRoot },\n })\n}\n\nconst randomWipBranchName = (): string => {\n const random = Math.floor(Math.random() * 1_000_000)\n return `wip-${String(random).padStart(6, \"0\")}`\n}\n\nconst parseForceFlags = (parsedArgs: Record<string, unknown>): ParsedForceFlags => {\n const globalForce = parsedArgs.force === true\n return {\n forceDirty: globalForce || parsedArgs.forceDirty === true,\n allowUnpushed: globalForce || parsedArgs.allowUnpushed === true,\n forceUnmerged: globalForce || parsedArgs.forceUnmerged === true,\n forceLocked: globalForce || parsedArgs.forceLocked === true,\n }\n}\n\nconst hasAnyForceFlag = (flags: ParsedForceFlags): boolean => {\n return flags.forceDirty || flags.allowUnpushed || flags.forceUnmerged || flags.forceLocked\n}\n\nconst ensureUnsafeForNonTty = ({\n runtime,\n reason,\n}: {\n readonly runtime: CommonRuntime\n readonly reason: string\n}): void => {\n if (runtime.isInteractive || runtime.allowUnsafe) {\n return\n }\n throw createCliError(\"UNSAFE_FLAG_REQUIRED\", {\n message: `UNSAFE_FLAG_REQUIRED: ${reason}`,\n })\n}\n\nconst resolveRemoteAndBranch = (\n remoteBranch: string,\n): {\n readonly remote: string\n readonly branch: string\n} => {\n const separatorIndex = remoteBranch.indexOf(\"/\")\n if (separatorIndex <= 0 || separatorIndex >= remoteBranch.length - 1) {\n throw createCliError(\"INVALID_REMOTE_BRANCH_FORMAT\", {\n message: `Invalid remote branch format: ${remoteBranch}`,\n details: { value: remoteBranch },\n })\n }\n return {\n remote: remoteBranch.slice(0, separatorIndex),\n branch: remoteBranch.slice(separatorIndex + 1),\n }\n}\n\nconst resolveCompletionShell = (value: string): CompletionShell => {\n if (COMPLETION_SHELLS.includes(value as CompletionShell)) {\n return value as CompletionShell\n }\n\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: `Unsupported shell for completion: ${value}`,\n details: {\n value,\n supported: COMPLETION_SHELLS,\n },\n })\n}\n\nconst resolveCompletionSourceCandidates = (shell: CompletionShell): string[] => {\n const relativeCompletionFile = COMPLETION_FILE_BY_SHELL[shell]\n const moduleDirectory = dirname(fileURLToPath(import.meta.url))\n return [\n resolve(moduleDirectory, \"..\", \"..\", \"completions\", relativeCompletionFile),\n resolve(moduleDirectory, \"..\", \"completions\", relativeCompletionFile),\n resolve(process.cwd(), \"completions\", relativeCompletionFile),\n ]\n}\n\nconst loadCompletionScript = async (shell: CompletionShell): Promise<string> => {\n const candidates = resolveCompletionSourceCandidates(shell)\n for (const candidate of candidates) {\n try {\n return await readFile(candidate, \"utf8\")\n } catch {\n continue\n }\n }\n\n throw createCliError(\"INTERNAL_ERROR\", {\n message: `Completion template not found for shell: ${shell}`,\n details: {\n shell,\n candidates,\n },\n })\n}\n\nconst resolveDefaultCompletionInstallPath = (shell: CompletionShell): string => {\n const homeDirectory = homedir()\n if (homeDirectory.length === 0) {\n throw createCliError(\"INTERNAL_ERROR\", {\n message: \"Unable to resolve home directory for completion installation\",\n details: {\n shell,\n },\n })\n }\n\n if (shell === \"zsh\") {\n return join(homeDirectory, \".zsh\", \"completions\", \"_vw\")\n }\n return join(homeDirectory, \".config\", \"fish\", \"completions\", \"vw.fish\")\n}\n\nconst resolveCompletionInstallPath = ({\n shell,\n requestedPath,\n}: {\n readonly shell: CompletionShell\n readonly requestedPath?: string\n}): string => {\n if (typeof requestedPath === \"string\" && requestedPath.trim().length > 0) {\n return resolve(requestedPath)\n }\n return resolveDefaultCompletionInstallPath(shell)\n}\n\nconst installCompletionScript = async ({\n content,\n destinationPath,\n}: {\n readonly content: string\n readonly destinationPath: string\n}): Promise<void> => {\n await mkdir(dirname(destinationPath), { recursive: true })\n await writeFile(destinationPath, content, \"utf8\")\n}\n\nconst normalizeHookName = (value: string): string => {\n if (/^(pre|post)-[a-z0-9][a-z0-9-]*$/.test(value) !== true) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: \"hookName must be pre-* or post-*\",\n details: { hookName: value },\n })\n }\n return value\n}\n\nconst defaultOwner = (): string => {\n return process.env.USER ?? process.env.USERNAME ?? \"unknown\"\n}\n\nconst resolveBranchDeleteMode = (forceFlags: ParsedForceFlags): \"-d\" | \"-D\" => {\n if (forceFlags.forceDirty || forceFlags.forceUnmerged || forceFlags.allowUnpushed || forceFlags.forceLocked) {\n return \"-D\"\n }\n return \"-d\"\n}\n\nconst validateDeleteSafety = ({\n target,\n forceFlags,\n}: {\n readonly target: WorktreeStatus\n readonly forceFlags: ParsedForceFlags\n}): void => {\n if (target.dirty && forceFlags.forceDirty !== true) {\n throw createCliError(\"DIRTY_WORKTREE\", {\n message: \"Worktree has uncommitted changes\",\n details: { branch: target.branch, path: target.path },\n })\n }\n if (target.locked.value && forceFlags.forceLocked !== true) {\n throw createCliError(\"LOCKED_WORKTREE\", {\n message: \"Worktree is locked\",\n details: { branch: target.branch, path: target.path, reason: target.locked.reason },\n })\n }\n if (target.merged.overall !== true && forceFlags.forceUnmerged !== true) {\n throw createCliError(\"UNMERGED_WORKTREE\", {\n message: \"Worktree is not merged (or merge state is unknown)\",\n details: { branch: target.branch, path: target.path, merged: target.merged },\n })\n }\n if ((target.upstream.ahead === null || target.upstream.ahead > 0) && forceFlags.allowUnpushed !== true) {\n throw createCliError(\"UNPUSHED_WORKTREE\", {\n message: \"Worktree has unpushed commits (or push state is unknown)\",\n details: { branch: target.branch, path: target.path, upstream: target.upstream },\n })\n }\n}\n\nconst resolveLinkTargetPath = ({\n sourcePath,\n destinationPath,\n}: {\n readonly sourcePath: string\n readonly destinationPath: string\n}): string => {\n return relative(dirname(destinationPath), sourcePath)\n}\n\nconst resolveFileCopyTargets = ({\n repoRoot,\n targetWorktreeRoot,\n relativePath,\n}: {\n readonly repoRoot: string\n readonly targetWorktreeRoot: string\n readonly relativePath: string\n}): {\n readonly sourcePath: string\n readonly destinationPath: string\n readonly relativeFromRoot: string\n} => {\n const sourcePath = resolveRepoRelativePath({\n repoRoot,\n relativePath,\n })\n const relativeFromRoot = relative(repoRoot, sourcePath)\n const destinationPath = ensurePathInsideRoot({\n rootPath: targetWorktreeRoot,\n path: resolve(targetWorktreeRoot, relativeFromRoot),\n message: \"Path is outside target worktree root\",\n })\n return { sourcePath, destinationPath, relativeFromRoot }\n}\n\nconst resolveTargetWorktreeRootForCopyLink = ({\n repoContext,\n snapshot,\n}: {\n readonly repoContext: { currentWorktreeRoot: string }\n readonly snapshot: WorktreeSnapshot\n}): string => {\n const rawTarget = process.env.WT_WORKTREE_PATH ?? repoContext.currentWorktreeRoot\n const resolvedTarget = resolvePathFromCwd({\n cwd: repoContext.currentWorktreeRoot,\n path: rawTarget,\n })\n\n const matched = snapshot.worktrees\n .filter((worktree) => {\n return worktree.path === resolvedTarget || resolvedTarget.startsWith(`${worktree.path}${sep}`)\n })\n .sort((a, b) => b.path.length - a.path.length)[0]\n\n if (matched === undefined) {\n throw createCliError(\"WORKTREE_NOT_FOUND\", {\n message: \"copy/link target worktree not found\",\n details: {\n rawTarget,\n resolvedTarget,\n },\n })\n }\n\n return matched.path\n}\n\nconst ensureBranchIsNotPrimary = ({\n branch,\n baseBranch,\n}: {\n readonly branch: string\n readonly baseBranch: string\n}): void => {\n if (branch !== baseBranch) {\n return\n }\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: \"extract cannot target the base branch\",\n details: { branch, baseBranch },\n })\n}\n\nconst toManagedWorktreeName = ({\n managedWorktreeRoot,\n worktreePath,\n}: {\n readonly managedWorktreeRoot: string\n readonly worktreePath: string\n}): string | null => {\n if (\n isManagedWorktreePath({\n worktreePath,\n managedWorktreeRoot,\n }) !== true\n ) {\n return null\n }\n const relativePath = relative(managedWorktreeRoot, worktreePath)\n return relativePath.split(sep).join(\"/\")\n}\n\nconst resolveManagedWorktreePathFromName = ({\n managedWorktreeRoot,\n optionName,\n worktreeName,\n}: {\n readonly managedWorktreeRoot: string\n readonly optionName: \"--from\" | \"--to\"\n readonly worktreeName: string\n}): string => {\n const normalized = worktreeName.trim()\n if (normalized.length === 0) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: `${optionName} requires non-empty worktree name`,\n details: { optionName, worktreeName },\n })\n }\n\n let resolvedPath: string\n try {\n resolvedPath = resolveRepoRelativePath({\n repoRoot: managedWorktreeRoot,\n relativePath: normalized,\n })\n } catch (error) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: `${optionName} expects vw-managed worktree name`,\n details: { optionName, worktreeName },\n cause: error,\n })\n }\n\n if (resolvedPath === managedWorktreeRoot) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: `${optionName} expects vw-managed worktree name`,\n details: { optionName, worktreeName },\n })\n }\n\n return resolvedPath\n}\n\nconst resolveManagedNonPrimaryWorktreeByBranch = ({\n repoRoot,\n managedWorktreeRoot,\n branch,\n worktrees,\n optionName,\n worktreeName,\n role,\n}: {\n readonly repoRoot: string\n readonly managedWorktreeRoot: string\n readonly branch: string\n readonly worktrees: readonly WorktreeStatus[]\n readonly optionName: \"--from\" | \"--to\"\n readonly worktreeName?: string\n readonly role: \"source\" | \"target\"\n}): WorktreeStatus => {\n const managedCandidates = worktrees.filter((worktree) => {\n return (\n worktree.branch === branch &&\n worktree.path !== repoRoot &&\n toManagedWorktreeName({ managedWorktreeRoot, worktreePath: worktree.path }) !== null\n )\n })\n\n if (typeof worktreeName === \"string\") {\n const resolvedPath = resolveManagedWorktreePathFromName({\n managedWorktreeRoot,\n optionName,\n worktreeName,\n })\n const selected = managedCandidates.find((worktree) => worktree.path === resolvedPath)\n if (selected === undefined) {\n throw createCliError(\"WORKTREE_NOT_FOUND\", {\n message: `${role} worktree not found for branch '${branch}' and name '${worktreeName}'`,\n details: { branch, worktreeName, optionName, role },\n })\n }\n return selected\n }\n\n if (managedCandidates.length === 0) {\n throw createCliError(\"WORKTREE_NOT_FOUND\", {\n message: `No managed ${role} worktree found for branch: ${branch}`,\n details: { branch, role },\n })\n }\n if (managedCandidates.length > 1) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: `Multiple managed ${role} worktrees found; use ${optionName} <worktree-name>`,\n details: {\n branch,\n role,\n optionName,\n candidates: managedCandidates.map((worktree) => {\n return toManagedWorktreeName({ managedWorktreeRoot, worktreePath: worktree.path }) ?? worktree.path\n }),\n },\n })\n }\n return managedCandidates[0]!\n}\n\nconst createStashEntry = async ({\n cwd,\n message,\n}: {\n readonly cwd: string\n readonly message: string\n}): Promise<string> => {\n await runGitCommand({\n cwd,\n args: [\"stash\", \"push\", \"-u\", \"-m\", message],\n })\n const stashTop = await runGitCommand({\n cwd,\n args: [\"rev-parse\", \"--verify\", \"-q\", \"stash@{0}\"],\n reject: false,\n })\n const stashOid = stashTop.stdout.trim()\n if (stashTop.exitCode === 0 && stashOid.length > 0) {\n return stashOid\n }\n throw createCliError(\"INTERNAL_ERROR\", {\n message: \"Failed to resolve created stash entry\",\n details: { cwd, message },\n })\n}\n\nconst restoreStashedChanges = async ({\n cwd,\n stashOid,\n}: {\n readonly cwd: string\n readonly stashOid: string\n}): Promise<void> => {\n const applyResult = await runGitCommand({\n cwd,\n args: [\"stash\", \"apply\", stashOid],\n reject: false,\n })\n if (applyResult.exitCode !== 0) {\n throw createCliError(\"STASH_APPLY_FAILED\", {\n message: \"Failed to auto-restore stashed changes after pre-hook failure\",\n details: { cwd, stashOid },\n })\n }\n await dropStashByOid({ cwd, stashOid })\n}\n\nconst runPreHookWithAutoRestore = async ({\n name,\n context,\n restore,\n}: {\n readonly name: string\n readonly context: HookExecutionContext\n readonly restore?: (() => Promise<void>) | undefined\n}): Promise<void> => {\n try {\n await runPreHook({ name, context })\n } catch (error) {\n if (restore !== undefined) {\n try {\n await restore()\n } catch (restoreError) {\n const hookError = ensureCliError(error)\n const restoreCliError = ensureCliError(restoreError)\n throw createCliError(hookError.code, {\n message: `${hookError.message} (auto-restore failed)`,\n details: {\n ...hookError.details,\n autoRestoreFailed: true,\n autoRestoreError: {\n code: restoreCliError.code,\n message: restoreCliError.message,\n details: restoreCliError.details,\n },\n },\n cause: error,\n })\n }\n }\n throw error\n }\n}\n\nconst resolveStashRefByOid = async ({\n cwd,\n stashOid,\n}: {\n readonly cwd: string\n readonly stashOid: string\n}): Promise<string | null> => {\n const stashList = await runGitCommand({\n cwd,\n args: [\"stash\", \"list\", \"--format=%gd%x09%H\"],\n })\n const lines = stashList.stdout\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n for (const line of lines) {\n const [ref, oid] = line.split(\"\\t\")\n if (typeof ref === \"string\" && typeof oid === \"string\" && ref.length > 0 && oid === stashOid) {\n return ref\n }\n }\n return null\n}\n\nconst dropStashByOid = async ({\n cwd,\n stashOid,\n}: {\n readonly cwd: string\n readonly stashOid: string\n}): Promise<void> => {\n const stashRef = await resolveStashRefByOid({ cwd, stashOid })\n if (stashRef === null) {\n return\n }\n await runGitCommand({\n cwd,\n args: [\"stash\", \"drop\", stashRef],\n })\n}\n\nconst formatDisplayPath = (absolutePath: string): string => {\n const homeDirectory = homedir()\n if (homeDirectory.length === 0) {\n return absolutePath\n }\n if (absolutePath === homeDirectory) {\n return \"~\"\n }\n if (absolutePath.startsWith(`${homeDirectory}${sep}`)) {\n return `~${absolutePath.slice(homeDirectory.length)}`\n }\n return absolutePath\n}\n\nconst encodeCdPreviewField = (value: string): string => {\n return value\n .replace(/\\\\/g, \"\\\\\\\\\")\n .split(\"\\u001b\")\n .join(\"\\\\033\")\n .replace(/\\t/g, \" \")\n .replace(/\\r\\n?/g, \"\\n\")\n .replace(/\\n/g, \"\\\\n\")\n}\n\nconst formatMergedDisplayState = ({\n mergedOverall,\n isBaseBranch,\n baseLabel = \"base\",\n}: {\n readonly mergedOverall: boolean | null\n readonly isBaseBranch: boolean\n readonly baseLabel?: string\n}): string => {\n if (isBaseBranch) {\n return baseLabel\n }\n if (mergedOverall === true) {\n return \"merged\"\n }\n if (mergedOverall === false) {\n return \"unmerged\"\n }\n return \"unknown\"\n}\n\nconst formatMergedColor = ({\n mergedState,\n theme,\n}: {\n readonly mergedState: string\n readonly theme: CatppuccinTheme\n}): string => {\n const normalized = mergedState.toLowerCase()\n if (normalized === \"merged\") {\n return theme.merged(mergedState)\n }\n if (normalized === \"unmerged\") {\n return theme.unmerged(mergedState)\n }\n if (normalized === \"base\") {\n return theme.base(mergedState)\n }\n return theme.unknown(mergedState)\n}\n\nconst formatPrDisplayState = ({\n prStatus,\n isBaseBranch,\n}: {\n readonly prStatus: WorktreeStatus[\"pr\"][\"status\"]\n readonly isBaseBranch: boolean\n}): string => {\n if (isBaseBranch || prStatus === null) {\n return \"-\"\n }\n if (\n prStatus === \"none\" ||\n prStatus === \"open\" ||\n prStatus === \"merged\" ||\n prStatus === \"closed_unmerged\" ||\n prStatus === \"unknown\"\n ) {\n return prStatus\n }\n return \"unknown\"\n}\n\nconst formatListUpstreamCount = (value: number | null): string => {\n if (value === null) {\n return \"-\"\n }\n return String(value)\n}\n\nconst resolveListColumnContentWidth = ({\n rows,\n columnIndex,\n}: {\n readonly rows: readonly (readonly string[])[]\n readonly columnIndex: number\n}): number => {\n return rows.reduce((width, row) => {\n const cell = row[columnIndex] ?? \"\"\n return Math.max(width, stringWidth(cell))\n }, 0)\n}\n\nconst resolveListPathColumnWidth = ({\n rows,\n columns,\n truncateMode,\n fullPath,\n minWidth,\n}: {\n readonly rows: readonly (readonly string[])[]\n readonly columns: ReadonlyArray<ListTableColumn>\n readonly truncateMode: \"auto\" | \"never\"\n readonly fullPath: boolean\n readonly minWidth: number\n}): number | null => {\n const pathColumnIndex = columns.indexOf(\"path\")\n if (pathColumnIndex < 0) {\n return null\n }\n if (fullPath || truncateMode === \"never\") {\n return null\n }\n if (process.stdout.isTTY !== true) {\n return null\n }\n const terminalColumns = process.stdout.columns\n if (typeof terminalColumns !== \"number\" || Number.isFinite(terminalColumns) !== true || terminalColumns <= 0) {\n return null\n }\n\n const measuredNonPathWidth = columns\n .map((_, index) => {\n if (index === pathColumnIndex) {\n return 0\n }\n return resolveListColumnContentWidth({ rows, columnIndex: index })\n })\n .reduce((sum, width) => sum + width, 0)\n const borderWidth = columns.length + 1\n const paddingWidth = columns.length * LIST_TABLE_CELL_HORIZONTAL_PADDING\n const availablePathWidth = Math.floor(terminalColumns) - borderWidth - paddingWidth - measuredNonPathWidth\n\n return Math.max(minWidth, availablePathWidth)\n}\n\nconst resolveAheadBehindAgainstBaseBranch = async ({\n repoRoot,\n baseBranch,\n worktree,\n}: {\n readonly repoRoot: string\n readonly baseBranch: string | null\n readonly worktree: WorktreeStatus\n}): Promise<{\n readonly ahead: number | null\n readonly behind: number | null\n}> => {\n if (baseBranch === null) {\n return { ahead: null, behind: null }\n }\n\n const targetRef = worktree.branch ?? worktree.head\n const distance = await runGitCommand({\n cwd: repoRoot,\n args: [\"rev-list\", \"--left-right\", \"--count\", `${baseBranch}...${targetRef}`],\n reject: false,\n })\n\n if (distance.exitCode !== 0) {\n return { ahead: null, behind: null }\n }\n\n const [behindRaw, aheadRaw] = distance.stdout.trim().split(/\\s+/)\n const behind = Number.parseInt(behindRaw ?? \"\", 10)\n const ahead = Number.parseInt(aheadRaw ?? \"\", 10)\n\n return {\n ahead: Number.isNaN(ahead) ? null : ahead,\n behind: Number.isNaN(behind) ? null : behind,\n }\n}\n\nconst padToDisplayWidth = ({ value, width }: { readonly value: string; readonly width: number }): string => {\n const visibleLength = stringWidth(value)\n if (visibleLength >= width) {\n return value\n }\n return `${value}${\" \".repeat(width - visibleLength)}`\n}\n\nconst buildCdBranchLabel = ({\n worktree,\n currentWorktreeRoot,\n}: {\n readonly worktree: WorktreeStatus\n readonly currentWorktreeRoot: string\n}): string => {\n const isCurrent = worktree.path === currentWorktreeRoot\n return `${isCurrent ? \"*\" : \" \"} ${worktree.branch ?? \"(detached)\"}`\n}\n\nconst buildCdStateSummary = ({\n worktree,\n isBaseBranch,\n theme,\n}: {\n readonly worktree: WorktreeStatus\n readonly isBaseBranch: boolean\n readonly theme: CatppuccinTheme\n}): string => {\n const dirtyLabel = worktree.dirty ? \"DIRTY\" : \"CLEAN\"\n const mergedLabel = formatMergedDisplayState({\n mergedOverall: worktree.merged.overall,\n isBaseBranch,\n }).toUpperCase()\n const lockLabel = worktree.locked.value ? \"LOCK\" : \"OPEN\"\n\n const dirtyBadge = (worktree.dirty ? theme.unmerged : theme.clean)(\n padToDisplayWidth({\n value: dirtyLabel,\n width: 5,\n }),\n )\n const mergedBadge = formatMergedColor({\n mergedState: padToDisplayWidth({\n value: mergedLabel,\n width: 8,\n }),\n theme,\n })\n const lockBadge = (worktree.locked.value ? theme.locked : theme.muted)(\n padToDisplayWidth({\n value: lockLabel,\n width: 4,\n }),\n )\n\n return `${dirtyBadge} ${theme.muted(\"|\")} ${mergedBadge} ${theme.muted(\"|\")} ${lockBadge}`\n}\n\nconst buildCdPreviewText = ({\n worktree,\n baseBranch,\n theme,\n}: {\n readonly worktree: WorktreeStatus\n readonly baseBranch: string | null\n readonly theme: CatppuccinTheme\n}): string => {\n const isBaseBranch = typeof worktree.branch === \"string\" && baseBranch !== null && worktree.branch === baseBranch\n const branchLabel =\n worktree.branch === null\n ? theme.branchDetached(\"(detached)\")\n : isBaseBranch\n ? theme.base(worktree.branch)\n : theme.branch(worktree.branch)\n const pathLabel = theme.path(formatDisplayPath(worktree.path))\n const dirtyValue = worktree.dirty ? theme.unmerged(\"[DIRTY]\") : theme.merged(\"[CLEAN]\")\n const lockedValue = worktree.locked.value ? theme.locked(\"[LOCKED]\") : theme.clean(\"[OPEN]\")\n const mergedState = formatMergedDisplayState({\n mergedOverall: worktree.merged.overall,\n isBaseBranch,\n })\n const mergedValue = formatMergedColor({\n mergedState: mergedState.toUpperCase(),\n theme,\n })\n const remoteValue =\n worktree.upstream.remote === null ? theme.muted(\"none\") : theme.value(worktree.upstream.remote ?? \"none\")\n const aheadValue =\n worktree.upstream.ahead === null\n ? theme.unknown(\"UNKNOWN\")\n : worktree.upstream.ahead > 0\n ? theme.unmerged(String(worktree.upstream.ahead))\n : theme.merged(\"0\")\n const behindValue =\n worktree.upstream.behind === null\n ? theme.unknown(\"UNKNOWN\")\n : worktree.upstream.behind > 0\n ? theme.unknown(String(worktree.upstream.behind))\n : theme.merged(\"0\")\n const divider = theme.muted(\"----------------------------------------\")\n const lines = [\n theme.previewSection(\"WORKTREE\"),\n divider,\n ` ${theme.previewLabel(\"Branch \")}: ${branchLabel}`,\n ` ${theme.previewLabel(\"Path \")}: ${pathLabel}`,\n \"\",\n theme.previewSection(\"STATUS\"),\n divider,\n ` ${theme.previewLabel(\"Dirty \")}: ${dirtyValue}`,\n ` ${theme.previewLabel(\"Locked \")}: ${lockedValue}`,\n ` ${theme.previewLabel(\"Merged \")}: ${mergedValue}`,\n ` ${theme.previewLabel(\"Remote \")}: ${remoteValue}`,\n ` ${theme.previewLabel(\"Ahead \")}: ${aheadValue}`,\n ` ${theme.previewLabel(\"Behind \")}: ${behindValue}`,\n ]\n\n if (worktree.locked.value) {\n lines.push(\"\")\n lines.push(theme.previewSection(\"LOCK\"))\n lines.push(divider)\n if (typeof worktree.locked.reason === \"string\" && worktree.locked.reason.length > 0) {\n lines.push(` ${theme.previewLabel(\"Reason \")}: ${theme.value(worktree.locked.reason)}`)\n }\n if (typeof worktree.locked.owner === \"string\" && worktree.locked.owner.length > 0) {\n lines.push(` ${theme.previewLabel(\"Owner \")}: ${theme.value(worktree.locked.owner)}`)\n }\n }\n\n return lines.join(\"\\n\")\n}\n\nconst buildCdCandidateLine = ({\n worktree,\n baseBranch,\n theme,\n currentWorktreeRoot,\n branchColumnWidth,\n}: {\n readonly worktree: WorktreeStatus\n readonly baseBranch: string | null\n readonly theme: CatppuccinTheme\n readonly currentWorktreeRoot: string\n readonly branchColumnWidth: number\n}): string => {\n const isBaseBranch = typeof worktree.branch === \"string\" && baseBranch !== null && worktree.branch === baseBranch\n const branchLabel = buildCdBranchLabel({\n worktree,\n currentWorktreeRoot,\n })\n const branchLabelPadded = padToDisplayWidth({\n value: branchLabel,\n width: branchColumnWidth,\n })\n const isCurrent = worktree.path === currentWorktreeRoot\n const branchDisplay =\n worktree.branch === null\n ? theme.branchDetached(branchLabelPadded)\n : isCurrent\n ? theme.branchCurrent(branchLabelPadded)\n : isBaseBranch\n ? theme.base(branchLabelPadded)\n : theme.branch(branchLabelPadded)\n const stateSummary = buildCdStateSummary({\n worktree,\n isBaseBranch,\n theme,\n })\n\n return [\n `${branchDisplay} ${stateSummary}`,\n worktree.path,\n encodeCdPreviewField(\n buildCdPreviewText({\n worktree,\n baseBranch,\n theme,\n }),\n ),\n ].join(\"\\t\")\n}\n\nconst resolveCdSelectionPath = (selectedLine: string): string => {\n const parts = selectedLine.split(\"\\t\")\n const rawPath = parts[1]\n if (typeof rawPath === \"string\" && rawPath.length > 0) {\n return rawPath\n }\n return selectedLine\n}\n\nconst containsBranch = ({\n branch,\n worktrees,\n}: {\n readonly branch: string\n readonly worktrees: readonly WorktreeStatus[]\n}): boolean => {\n return worktrees.some((worktree) => worktree.branch === branch)\n}\n\nconst readStringOption = (parsedArgsRecord: Record<string, unknown>, key: string): string | undefined => {\n const value = parsedArgsRecord[key]\n if (typeof value === \"string\") {\n return value\n }\n return undefined\n}\n\nconst findCommandHelp = (commandName: string): CommandHelp | undefined => {\n return commandHelpEntries.find((entry) => entry.name === commandName)\n}\n\nconst renderGeneralHelpText = ({ version }: { readonly version: string }): string => {\n const commandList = commandHelpEntries.map((entry) => ` ${entry.name.padEnd(8)} ${entry.summary}`).join(\"\\n\")\n return [\n \"vde-worktree\",\n \"\",\n \"Usage:\",\n \" vw <command> [options]\",\n \" vde-worktree <command> [options]\",\n \"\",\n `Version: ${version}`,\n \"\",\n \"Commands:\",\n commandList,\n \"\",\n \"Global options:\",\n \" --json Output machine-readable JSON.\",\n \" --verbose Enable verbose logs.\",\n \" --no-hooks Disable hooks for this run (requires --allow-unsafe).\",\n \" --no-gh Disable GitHub CLI based PR status checks for this run.\",\n \" --full-path Disable list table path truncation.\",\n \" --allow-unsafe Explicitly allow unsafe behavior in non-TTY mode.\",\n \" --hook-timeout-ms <ms> Override hook timeout.\",\n \" --lock-timeout-ms <ms> Override repository lock timeout.\",\n \" -h, --help Show help.\",\n \" -v, --version Show version.\",\n \"\",\n \"Help commands:\",\n \" vw help\",\n \" vw help <command>\",\n \" vw <command> --help\",\n \"\",\n \"Examples:\",\n \" vw switch feature/foo\",\n ' cd \"$(vw cd)\"',\n \" vw completion zsh --install\",\n \" vw del feature/foo --force-unmerged --allow-unpushed --allow-unsafe\",\n ].join(\"\\n\")\n}\n\nconst renderCommandHelpText = ({ entry }: { readonly entry: CommandHelp }): string => {\n const lines = [`Command: ${entry.name}`, \"\", \"Usage:\", ` ${entry.usage}`, \"\", \"Summary:\", ` ${entry.summary}`]\n\n if (entry.details.length > 0) {\n lines.push(\"\", \"Details:\")\n for (const detail of entry.details) {\n lines.push(` - ${detail}`)\n }\n }\n\n if (entry.options !== undefined && entry.options.length > 0) {\n lines.push(\"\", \"Options:\")\n for (const option of entry.options) {\n lines.push(` - ${option}`)\n }\n }\n\n if (entry.examples !== undefined && entry.examples.length > 0) {\n lines.push(\"\", \"Examples:\")\n for (const example of entry.examples) {\n lines.push(` ${example}`)\n }\n }\n\n lines.push(\"\", \"Show all commands: vw help\")\n return lines.join(\"\\n\")\n}\n\nconst createHookContext = ({\n runtime,\n repoRoot,\n action,\n branch,\n worktreePath,\n stderr,\n extraEnv,\n}: {\n readonly runtime: CommonRuntime\n readonly repoRoot: string\n readonly action: string\n readonly branch?: string | null\n readonly worktreePath?: string\n readonly stderr: (line: string) => void\n readonly extraEnv?: Record<string, string>\n}): HookExecutionContext => {\n return {\n repoRoot,\n action,\n branch,\n worktreePath,\n timeoutMs: runtime.hookTimeoutMs,\n enabled: runtime.hooksEnabled,\n strictPostHooks: runtime.strictPostHooks,\n stderr,\n extraEnv,\n }\n}\n\nexport const createCli = (options: CLIOptions = {}): CLI => {\n const require = createRequire(import.meta.url)\n const version =\n options.version ??\n ((): string => {\n try {\n return loadPackageVersion(require)\n } catch {\n return \"0.0.0\"\n }\n })()\n\n const runtimeCwd = options.cwd ?? process.cwd()\n const stdout = options.stdout ?? ((line: string): void => console.log(line))\n const stderr = options.stderr ?? ((line: string): void => console.error(line))\n const selectPathWithFzf = options.selectPathWithFzf ?? defaultSelectPathWithFzf\n const isInteractiveFn =\n options.isInteractive ?? ((): boolean => process.stdout.isTTY === true && process.stderr.isTTY === true)\n\n let logger: Logger = createLogger()\n\n const rootArgsDef = {\n command: {\n type: \"positional\",\n description: \"Command name\",\n required: false,\n },\n prompt: {\n type: \"string\",\n valueHint: \"text\",\n description: \"Custom fzf prompt for cd command\",\n },\n fzfArg: {\n type: \"string\",\n valueHint: \"arg\",\n description: \"Additional argument passed to fzf (repeatable)\",\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON on stdout\",\n },\n verbose: {\n type: \"boolean\",\n description: \"Show detailed logs\",\n },\n hooks: {\n type: \"boolean\",\n description: \"Enable hooks (disable with --no-hooks)\",\n default: true,\n },\n gh: {\n type: \"boolean\",\n description: \"Enable GitHub CLI based PR status checks (disable with --no-gh)\",\n default: true,\n },\n fullPath: {\n type: \"boolean\",\n description: \"Disable list table path truncation\",\n },\n allowUnsafe: {\n type: \"boolean\",\n description: \"Allow unsafe operations\",\n },\n strictPostHooks: {\n type: \"boolean\",\n description: \"Fail when post hooks fail\",\n },\n hookTimeoutMs: {\n type: \"string\",\n valueHint: \"ms\",\n description: \"Override hook timeout (ms)\",\n },\n lockTimeoutMs: {\n type: \"string\",\n valueHint: \"ms\",\n description: \"Override lock timeout (ms)\",\n },\n allowAgent: {\n type: \"boolean\",\n description: \"Allow non-TTY execution for use command\",\n },\n allowShared: {\n type: \"boolean\",\n description: \"Allow use checkout when target branch is attached by another worktree\",\n },\n reason: {\n type: \"string\",\n valueHint: \"text\",\n description: \"Reason text for lock command\",\n },\n owner: {\n type: \"string\",\n valueHint: \"owner\",\n description: \"Owner for lock/unlock commands\",\n },\n force: {\n type: \"boolean\",\n description: \"Force operation\",\n },\n forceDirty: {\n type: \"boolean\",\n description: \"Allow dirty worktree for del\",\n },\n allowUnpushed: {\n type: \"boolean\",\n description: \"Allow unpushed commits for del\",\n },\n forceUnmerged: {\n type: \"boolean\",\n description: \"Allow unmerged worktree for del\",\n },\n forceLocked: {\n type: \"boolean\",\n description: \"Allow deleting locked worktree\",\n },\n apply: {\n type: \"boolean\",\n description: \"Apply changes\",\n },\n dryRun: {\n type: \"boolean\",\n description: \"Dry-run mode\",\n },\n current: {\n type: \"boolean\",\n description: \"Use current worktree for extract\",\n },\n from: {\n type: \"string\",\n valueHint: \"value\",\n description: \"For extract: filesystem path. For absorb: managed worktree name.\",\n },\n to: {\n type: \"string\",\n valueHint: \"worktree-name\",\n description: \"Worktree name used by unabsorb --to\",\n },\n stash: {\n type: \"boolean\",\n description: \"Allow stash for extract\",\n },\n keepStash: {\n type: \"boolean\",\n description: \"Keep stash entry after absorb/unabsorb\",\n },\n fallback: {\n type: \"boolean\",\n description: \"Enable fallback behavior (disable with --no-fallback)\",\n default: true,\n },\n install: {\n type: \"boolean\",\n description: \"Install generated artifacts to default location (used by completion command)\",\n },\n path: {\n type: \"string\",\n valueHint: \"path\",\n description: \"Custom file path (used by completion command install)\",\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n },\n version: {\n type: \"boolean\",\n alias: \"v\",\n description: \"Show version\",\n },\n } satisfies ArgsDef\n\n const optionSpecs = buildOptionSpecs(rootArgsDef)\n\n const run = async (rawArgs: string[] = process.argv.slice(2)): Promise<number> => {\n logger = createLogger()\n let command = \"unknown\"\n let jsonEnabled = false\n let repoRootForJson: string | null = null\n\n try {\n const { beforeDoubleDash, afterDoubleDash } = splitRawArgsByDoubleDash(rawArgs)\n validateRawOptions(beforeDoubleDash, optionSpecs)\n const parsedArgs = parseArgs(beforeDoubleDash, rootArgsDef)\n const parsedArgsRecord = parsedArgs as Record<string, unknown>\n const positionals = getPositionals(parsedArgs)\n command = positionals[0] ?? \"unknown\"\n jsonEnabled = parsedArgs.json === true\n\n if (parsedArgs.help === true) {\n const commandHelpTarget =\n typeof command === \"string\" && command !== \"unknown\" && command !== \"help\" ? command : null\n if (commandHelpTarget !== null) {\n const entry = findCommandHelp(commandHelpTarget)\n if (entry !== undefined) {\n stdout(`${renderCommandHelpText({ entry })}\\n`)\n return EXIT_CODE.OK\n }\n }\n stdout(`${renderGeneralHelpText({ version })}\\n`)\n return EXIT_CODE.OK\n }\n\n if (parsedArgs.version === true) {\n stdout(version)\n return EXIT_CODE.OK\n }\n\n logger = parsedArgs.verbose === true ? createLogger({ level: LogLevel.INFO }) : createLogger()\n\n if (positionals.length === 0) {\n stdout(`${renderGeneralHelpText({ version })}\\n`)\n return EXIT_CODE.OK\n }\n\n if (command === \"help\") {\n const helpTarget = positionals[1]\n if (typeof helpTarget !== \"string\" || helpTarget.length === 0) {\n stdout(`${renderGeneralHelpText({ version })}\\n`)\n return EXIT_CODE.OK\n }\n\n const entry = findCommandHelp(helpTarget)\n if (entry === undefined) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: `Unknown command for help: ${helpTarget}`,\n details: {\n requested: helpTarget,\n availableCommands: commandHelpEntries.map((item) => item.name),\n },\n })\n }\n\n stdout(`${renderCommandHelpText({ entry })}\\n`)\n return EXIT_CODE.OK\n }\n\n const commandArgs = positionals.slice(1)\n if (command === \"completion\") {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n const shell = resolveCompletionShell(commandArgs[0] as string)\n const script = await loadCompletionScript(shell)\n\n if (parsedArgs.install === true) {\n const destinationPath = resolveCompletionInstallPath({\n shell,\n requestedPath: readStringOption(parsedArgsRecord, \"path\"),\n })\n await installCompletionScript({\n content: script,\n destinationPath,\n })\n\n if (jsonEnabled) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot: null,\n details: {\n shell,\n installed: true,\n path: destinationPath,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n stdout(`installed completion: ${destinationPath}`)\n if (shell === \"zsh\") {\n stdout(\"zsh note: ensure completion path is in fpath, then run: autoload -Uz compinit && compinit\")\n }\n return EXIT_CODE.OK\n }\n\n if (jsonEnabled) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot: null,\n details: {\n shell,\n installed: false,\n script,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n stdout(script)\n return EXIT_CODE.OK\n }\n\n const allowUnsafe = parsedArgs.allowUnsafe === true\n if (parsedArgs.hooks === false && allowUnsafe !== true) {\n throw createCliError(\"UNSAFE_FLAG_REQUIRED\", {\n message: \"UNSAFE_FLAG_REQUIRED: --no-hooks requires --allow-unsafe\",\n })\n }\n\n const repoContext = await resolveRepoContext(runtimeCwd)\n const repoRoot = repoContext.repoRoot\n repoRootForJson = repoRoot\n const { config: resolvedConfig } = await loadResolvedConfig({\n cwd: runtimeCwd,\n repoRoot,\n })\n const managedWorktreeRoot = getWorktreeRootPath(repoRoot, resolvedConfig.paths.worktreeRoot)\n\n const runtime: CommonRuntime = {\n command,\n json: jsonEnabled,\n hooksEnabled: parsedArgs.hooks !== false && resolvedConfig.hooks.enabled,\n ghEnabled: parsedArgs.gh !== false && resolvedConfig.github.enabled,\n strictPostHooks: parsedArgs.strictPostHooks === true,\n hookTimeoutMs: readNumberFromEnvOrDefault({\n rawValue:\n toNumberOption({ value: parsedArgs.hookTimeoutMs, optionName: \"--hook-timeout-ms\" }) ??\n resolvedConfig.hooks.timeoutMs,\n defaultValue: DEFAULT_HOOK_TIMEOUT_MS,\n }),\n lockTimeoutMs: readNumberFromEnvOrDefault({\n rawValue:\n toNumberOption({ value: parsedArgs.lockTimeoutMs, optionName: \"--lock-timeout-ms\" }) ??\n resolvedConfig.locks.timeoutMs,\n defaultValue: DEFAULT_LOCK_TIMEOUT_MS,\n }),\n allowUnsafe,\n isInteractive: isInteractiveFn(),\n }\n\n const staleLockTTLSeconds = readNumberFromEnvOrDefault({\n rawValue: resolvedConfig.locks.staleLockTTLSeconds,\n defaultValue: DEFAULT_STALE_LOCK_TTL_SECONDS,\n })\n\n const collectWorktreeSnapshot = async (_ignoredRepoRoot: string): Promise<WorktreeSnapshot> => {\n const baseBranch = await resolveBaseBranch({\n repoRoot,\n config: resolvedConfig,\n })\n return collectWorktreeSnapshotBase(repoRoot, {\n baseBranch,\n ghEnabled: runtime.ghEnabled,\n noGh: runtime.ghEnabled !== true,\n })\n }\n\n const runWriteOperation = async <T>(task: () => Promise<T>): Promise<T> => {\n if (WRITE_COMMANDS.has(command) !== true) {\n return task()\n }\n if (command !== \"init\") {\n await validateInitializedForWrite(repoRoot)\n }\n return withRepoLock(\n {\n repoRoot,\n command,\n timeoutMs: runtime.lockTimeoutMs,\n staleLockTTLSeconds,\n },\n task,\n )\n }\n\n if (command === \"init\") {\n ensureArgumentCount({ command, args: commandArgs, min: 0, max: 0 })\n const result = await runWriteOperation(async () => {\n const hookContext = createHookContext({\n runtime,\n repoRoot,\n action: \"init\",\n branch: null,\n worktreePath: repoRoot,\n stderr,\n })\n await runPreHook({ name: \"init\", context: hookContext })\n const initialized = await initializeRepository({\n repoRoot,\n managedWorktreeRoot,\n })\n await runPostHook({ name: \"init\", context: hookContext })\n return initialized\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n initialized: true,\n alreadyInitialized: result.alreadyInitialized,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n return EXIT_CODE.OK\n }\n\n if (command === \"list\") {\n ensureArgumentCount({ command, args: commandArgs, min: 0, max: 0 })\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n baseBranch: snapshot.baseBranch,\n managedWorktreeRoot,\n worktrees: snapshot.worktrees,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n const theme = createCatppuccinTheme({\n enabled: shouldUseAnsiColors({ interactive: runtime.isInteractive }),\n })\n const columns = resolvedConfig.list.table.columns\n const rows: string[][] = [\n [...columns],\n ...(await Promise.all(\n snapshot.worktrees.map(async (worktree) => {\n const distanceFromBase = await resolveAheadBehindAgainstBaseBranch({\n repoRoot,\n baseBranch: snapshot.baseBranch,\n worktree,\n })\n const isBaseBranch =\n worktree.branch !== null && snapshot.baseBranch !== null && worktree.branch === snapshot.baseBranch\n const mergedState =\n isBaseBranch === true\n ? \"-\"\n : worktree.merged.overall === true\n ? \"merged\"\n : worktree.merged.overall === false\n ? \"unmerged\"\n : \"unknown\"\n const prState = formatPrDisplayState({\n prStatus: worktree.pr.status,\n isBaseBranch,\n })\n const isCurrent = worktree.path === repoContext.currentWorktreeRoot\n const valuesByColumn: Record<ListTableColumn, string> = {\n branch: `${isCurrent ? \"*\" : \" \"} ${worktree.branch ?? \"(detached)\"}`,\n dirty: worktree.dirty ? \"dirty\" : \"clean\",\n merged: mergedState,\n pr: prState,\n locked: worktree.locked.value ? \"locked\" : \"-\",\n ahead: formatListUpstreamCount(distanceFromBase.ahead),\n behind: formatListUpstreamCount(distanceFromBase.behind),\n path: formatDisplayPath(worktree.path),\n }\n return columns.map((column) => valuesByColumn[column])\n }),\n )),\n ]\n\n const pathColumnWidth = resolveListPathColumnWidth({\n rows,\n columns,\n truncateMode: resolvedConfig.list.table.path.truncate,\n fullPath: parsedArgs.fullPath === true,\n minWidth: resolvedConfig.list.table.path.minWidth,\n })\n const pathColumnIndex = columns.indexOf(\"path\")\n const columnsConfig =\n pathColumnWidth === null || pathColumnIndex < 0\n ? undefined\n : {\n [pathColumnIndex]: {\n width: pathColumnWidth,\n truncate: pathColumnWidth,\n },\n }\n const rendered = table(rows, {\n border: getBorderCharacters(\"norc\"),\n drawHorizontalLine: (lineIndex, rowCount) => {\n return lineIndex === 0 || lineIndex === 1 || lineIndex === rowCount\n },\n columns: columnsConfig,\n })\n const colorized = hasDefaultListColumnOrder(columns)\n ? colorizeListTable({\n rendered,\n theme,\n })\n : rendered.trimEnd()\n\n for (const line of colorized.split(\"\\n\")) {\n stdout(line)\n }\n return EXIT_CODE.OK\n }\n\n if (command === \"status\") {\n ensureArgumentCount({ command, args: commandArgs, min: 0, max: 1 })\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const targetBranch = commandArgs[0]\n const targetWorktree =\n typeof targetBranch === \"string\" && targetBranch.length > 0\n ? resolveTargetWorktreeByBranch({ branch: targetBranch, worktrees: snapshot.worktrees })\n : resolveCurrentWorktree({\n snapshot,\n currentWorktreeRoot: repoContext.currentWorktreeRoot,\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n worktree: targetWorktree,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n stdout(`branch: ${targetWorktree.branch ?? \"(detached)\"}`)\n stdout(`path: ${formatDisplayPath(targetWorktree.path)}`)\n stdout(`dirty: ${targetWorktree.dirty ? \"true\" : \"false\"}`)\n stdout(`locked: ${targetWorktree.locked.value ? \"true\" : \"false\"}`)\n return EXIT_CODE.OK\n }\n\n if (command === \"path\") {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n const branch = commandArgs[0] as string\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const target = resolveTargetWorktreeByBranch({ branch, worktrees: snapshot.worktrees })\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n branch,\n path: target.path,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n stdout(target.path)\n return EXIT_CODE.OK\n }\n\n if (command === \"new\") {\n ensureArgumentCount({ command, args: commandArgs, min: 0, max: 1 })\n const branch = commandArgs[0] ?? randomWipBranchName()\n const result = await runWriteOperation(async () => {\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n if (containsBranch({ branch, worktrees: snapshot.worktrees })) {\n throw createCliError(\"BRANCH_ALREADY_ATTACHED\", {\n message: `Branch is already attached to a worktree: ${branch}`,\n details: { branch },\n })\n }\n\n if (await doesGitRefExist(repoRoot, `refs/heads/${branch}`)) {\n throw createCliError(\"BRANCH_ALREADY_EXISTS\", {\n message: `Branch already exists locally: ${branch}`,\n details: { branch },\n })\n }\n\n const targetPath = branchToWorktreePath(repoRoot, branch, resolvedConfig.paths.worktreeRoot)\n await ensureTargetPathWritable(targetPath)\n const baseBranch = await resolveBaseBranch({\n repoRoot,\n config: resolvedConfig,\n })\n\n const hookContext = createHookContext({\n runtime,\n repoRoot,\n action: \"new\",\n branch,\n worktreePath: targetPath,\n stderr,\n })\n await runPreHook({ name: \"new\", context: hookContext })\n await runGitCommand({\n cwd: repoRoot,\n args: [\"worktree\", \"add\", \"-b\", branch, targetPath, baseBranch],\n })\n await upsertWorktreeMergeLifecycle({\n repoRoot,\n branch,\n baseBranch,\n observedDivergedHead: null,\n })\n await runPostHook({ name: \"new\", context: hookContext })\n\n return { branch, path: targetPath }\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"created\",\n repoRoot,\n details: result,\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n stdout(result.path)\n return EXIT_CODE.OK\n }\n\n if (command === \"switch\") {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n const branch = commandArgs[0] as string\n const result = await runWriteOperation(async () => {\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const existing = snapshot.worktrees.find((worktree) => worktree.branch === branch)\n if (existing !== undefined) {\n if (snapshot.baseBranch !== null) {\n await upsertWorktreeMergeLifecycle({\n repoRoot,\n branch,\n baseBranch: snapshot.baseBranch,\n observedDivergedHead: null,\n })\n }\n return { status: \"existing\" as const, branch, path: existing.path }\n }\n\n const targetPath = branchToWorktreePath(repoRoot, branch, resolvedConfig.paths.worktreeRoot)\n await ensureTargetPathWritable(targetPath)\n const hookContext = createHookContext({\n runtime,\n repoRoot,\n action: \"switch\",\n branch,\n worktreePath: targetPath,\n stderr,\n })\n await runPreHook({ name: \"switch\", context: hookContext })\n\n let lifecycleBaseBranch: string | null = snapshot.baseBranch\n if (await doesGitRefExist(repoRoot, `refs/heads/${branch}`)) {\n await runGitCommand({\n cwd: repoRoot,\n args: [\"worktree\", \"add\", targetPath, branch],\n })\n } else {\n const baseBranch = await resolveBaseBranch({\n repoRoot,\n config: resolvedConfig,\n })\n lifecycleBaseBranch = baseBranch\n await runGitCommand({\n cwd: repoRoot,\n args: [\"worktree\", \"add\", \"-b\", branch, targetPath, baseBranch],\n })\n }\n\n if (lifecycleBaseBranch !== null) {\n await upsertWorktreeMergeLifecycle({\n repoRoot,\n branch,\n baseBranch: lifecycleBaseBranch,\n observedDivergedHead: null,\n })\n }\n await runPostHook({ name: \"switch\", context: hookContext })\n return { status: \"created\" as const, branch, path: targetPath }\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: result.status,\n repoRoot,\n details: {\n branch: result.branch,\n path: result.path,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n stdout(result.path)\n return EXIT_CODE.OK\n }\n\n if (command === \"mv\") {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n const newBranch = commandArgs[0] as string\n const result = await runWriteOperation(async () => {\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const current = resolveCurrentWorktree({ snapshot, currentWorktreeRoot: repoContext.currentWorktreeRoot })\n const oldBranch = current.branch\n if (oldBranch === null) {\n throw createCliError(\"DETACHED_HEAD\", {\n message: \"mv requires a branch checkout (detached HEAD is not supported)\",\n details: { path: current.path },\n })\n }\n if (current.path === repoRoot) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: \"mv cannot move the primary worktree\",\n details: { path: current.path },\n })\n }\n if (oldBranch === newBranch) {\n return {\n branch: newBranch,\n path: current.path,\n }\n }\n if (containsBranch({ branch: newBranch, worktrees: snapshot.worktrees })) {\n throw createCliError(\"BRANCH_ALREADY_ATTACHED\", {\n message: `Branch is already attached to another worktree: ${newBranch}`,\n details: { branch: newBranch },\n })\n }\n if (await doesGitRefExist(repoRoot, `refs/heads/${newBranch}`)) {\n throw createCliError(\"BRANCH_ALREADY_EXISTS\", {\n message: `Branch already exists locally: ${newBranch}`,\n details: { branch: newBranch },\n })\n }\n\n const newPath = branchToWorktreePath(repoRoot, newBranch, resolvedConfig.paths.worktreeRoot)\n await ensureTargetPathWritable(newPath)\n const hookContext = createHookContext({\n runtime,\n repoRoot,\n action: \"mv\",\n branch: newBranch,\n worktreePath: newPath,\n stderr,\n extraEnv: {\n WT_OLD_BRANCH: oldBranch,\n WT_NEW_BRANCH: newBranch,\n },\n })\n await runPreHook({ name: \"mv\", context: hookContext })\n await runGitCommand({\n cwd: current.path,\n args: [\"branch\", \"-m\", oldBranch, newBranch],\n })\n await runGitCommand({\n cwd: repoRoot,\n args: [\"worktree\", \"move\", current.path, newPath],\n })\n if (snapshot.baseBranch !== null) {\n await moveWorktreeMergeLifecycle({\n repoRoot,\n fromBranch: oldBranch,\n toBranch: newBranch,\n baseBranch: snapshot.baseBranch,\n observedDivergedHead: null,\n })\n }\n await runPostHook({ name: \"mv\", context: hookContext })\n return {\n branch: newBranch,\n path: newPath,\n }\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: result,\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n stdout(result.path)\n return EXIT_CODE.OK\n }\n\n if (command === \"del\") {\n ensureArgumentCount({ command, args: commandArgs, min: 0, max: 1 })\n const forceFlags = parseForceFlags(parsedArgsRecord)\n if (hasAnyForceFlag(forceFlags)) {\n ensureUnsafeForNonTty({\n runtime,\n reason: \"force flags in non-TTY mode require --allow-unsafe\",\n })\n }\n const branchArg = commandArgs[0]\n\n const result = await runWriteOperation(async () => {\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const target =\n typeof branchArg === \"string\" && branchArg.length > 0\n ? resolveTargetWorktreeByBranch({ branch: branchArg, worktrees: snapshot.worktrees })\n : resolveCurrentWorktree({\n snapshot,\n currentWorktreeRoot: repoContext.currentWorktreeRoot,\n })\n\n if (target.branch === null) {\n throw createCliError(\"DETACHED_HEAD\", {\n message: \"Cannot delete detached worktree without branch\",\n details: { path: target.path },\n })\n }\n if (target.path === repoRoot) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: \"Cannot delete the primary worktree\",\n details: { path: target.path },\n })\n }\n if (\n isManagedWorktreePath({\n worktreePath: target.path,\n managedWorktreeRoot,\n }) !== true\n ) {\n throw createCliError(\"WORKTREE_NOT_FOUND\", {\n message: \"Target branch is not in managed worktree root\",\n details: {\n branch: target.branch,\n path: target.path,\n managedWorktreeRoot,\n },\n })\n }\n\n validateDeleteSafety({\n target,\n forceFlags,\n })\n\n const hookContext = createHookContext({\n runtime,\n repoRoot,\n action: \"del\",\n branch: target.branch,\n worktreePath: target.path,\n stderr,\n })\n await runPreHook({ name: \"del\", context: hookContext })\n\n const removeArgs = [\"worktree\", \"remove\", target.path]\n if (forceFlags.forceDirty) {\n removeArgs.push(\"--force\")\n }\n await runGitCommand({\n cwd: repoRoot,\n args: removeArgs,\n })\n await runGitCommand({\n cwd: repoRoot,\n args: [\"branch\", resolveBranchDeleteMode(forceFlags), target.branch],\n })\n await deleteWorktreeLock({ repoRoot, branch: target.branch })\n await deleteWorktreeMergeLifecycle({ repoRoot, branch: target.branch })\n\n await runPostHook({ name: \"del\", context: hookContext })\n return {\n branch: target.branch,\n path: target.path,\n }\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"deleted\",\n repoRoot,\n details: result,\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n stdout(result.path)\n return EXIT_CODE.OK\n }\n\n if (command === \"gone\") {\n ensureArgumentCount({ command, args: commandArgs, min: 0, max: 0 })\n if (parsedArgs.apply === true && parsedArgs.dryRun === true) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: \"Cannot use --apply and --dry-run together\",\n })\n }\n\n const dryRun = parsedArgs.apply !== true\n const execute = async (): Promise<{ deleted: string[]; candidates: string[]; dryRun: boolean }> => {\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const candidates = snapshot.worktrees\n .filter((worktree) => worktree.branch !== null)\n .filter((worktree) => worktree.path !== repoRoot)\n .filter((worktree) =>\n isManagedWorktreePath({\n worktreePath: worktree.path,\n managedWorktreeRoot,\n }),\n )\n .filter((worktree) => worktree.dirty === false)\n .filter((worktree) => worktree.locked.value === false)\n .filter((worktree) => worktree.merged.overall === true)\n .map((worktree) => worktree.branch as string)\n\n if (dryRun) {\n return {\n deleted: [],\n candidates,\n dryRun: true,\n }\n }\n\n const hookContext = createHookContext({\n runtime,\n repoRoot,\n action: \"gone\",\n branch: null,\n worktreePath: repoRoot,\n stderr,\n })\n await runPreHook({ name: \"gone\", context: hookContext })\n\n const deleted: string[] = []\n for (const branch of candidates) {\n const latestSnapshot = await collectWorktreeSnapshot(repoRoot)\n const target = resolveTargetWorktreeByBranch({\n branch,\n worktrees: latestSnapshot.worktrees,\n })\n await runGitCommand({\n cwd: repoRoot,\n args: [\"worktree\", \"remove\", target.path],\n })\n await runGitCommand({\n cwd: repoRoot,\n args: [\"branch\", \"-d\", branch],\n })\n await deleteWorktreeLock({ repoRoot, branch })\n await deleteWorktreeMergeLifecycle({ repoRoot, branch })\n deleted.push(branch)\n }\n\n await runPostHook({ name: \"gone\", context: hookContext })\n return {\n deleted,\n candidates,\n dryRun: false,\n }\n }\n\n const result = await runWriteOperation(execute)\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n dryRun: result.dryRun,\n candidates: result.candidates,\n deleted: result.deleted,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n const label = result.dryRun ? \"candidates\" : \"deleted\"\n const branches = result.dryRun ? result.candidates : result.deleted\n for (const branch of branches) {\n stdout(`${label}: ${branch}`)\n }\n return EXIT_CODE.OK\n }\n\n if (command === \"get\") {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n const remoteBranchArg = commandArgs[0] as string\n const { remote, branch } = resolveRemoteAndBranch(remoteBranchArg)\n\n const result = await runWriteOperation(async () => {\n const remoteCheck = await runGitCommand({\n cwd: repoRoot,\n args: [\"remote\", \"get-url\", remote],\n reject: false,\n })\n if (remoteCheck.exitCode !== 0) {\n throw createCliError(\"REMOTE_NOT_FOUND\", {\n message: `Remote not found: ${remote}`,\n details: { remote },\n })\n }\n\n const hookContext = createHookContext({\n runtime,\n repoRoot,\n action: \"get\",\n branch,\n worktreePath: branchToWorktreePath(repoRoot, branch, resolvedConfig.paths.worktreeRoot),\n stderr,\n })\n await runPreHook({ name: \"get\", context: hookContext })\n\n const fetchResult = await runGitCommand({\n cwd: repoRoot,\n args: [\"fetch\", remote, branch],\n reject: false,\n })\n if (fetchResult.exitCode !== 0) {\n throw createCliError(\"REMOTE_BRANCH_NOT_FOUND\", {\n message: `Remote branch not found: ${remote}/${branch}`,\n details: { remote, branch },\n })\n }\n\n if ((await doesGitRefExist(repoRoot, `refs/heads/${branch}`)) !== true) {\n await runGitCommand({\n cwd: repoRoot,\n args: [\"branch\", \"--track\", branch, `${remote}/${branch}`],\n })\n }\n\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const lifecycleBaseBranch = snapshot.baseBranch\n const existing = snapshot.worktrees.find((worktree) => worktree.branch === branch)\n if (existing !== undefined) {\n if (lifecycleBaseBranch !== null) {\n await upsertWorktreeMergeLifecycle({\n repoRoot,\n branch,\n baseBranch: lifecycleBaseBranch,\n observedDivergedHead: null,\n })\n }\n await runPostHook({ name: \"get\", context: hookContext })\n return {\n status: \"existing\" as const,\n branch,\n path: existing.path,\n }\n }\n\n const targetPath = branchToWorktreePath(repoRoot, branch, resolvedConfig.paths.worktreeRoot)\n await ensureTargetPathWritable(targetPath)\n await runGitCommand({\n cwd: repoRoot,\n args: [\"worktree\", \"add\", targetPath, branch],\n })\n if (lifecycleBaseBranch !== null) {\n await upsertWorktreeMergeLifecycle({\n repoRoot,\n branch,\n baseBranch: lifecycleBaseBranch,\n observedDivergedHead: null,\n })\n }\n await runPostHook({ name: \"get\", context: hookContext })\n return {\n status: \"created\" as const,\n branch,\n path: targetPath,\n }\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: result.status,\n repoRoot,\n details: {\n branch: result.branch,\n path: result.path,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n stdout(result.path)\n return EXIT_CODE.OK\n }\n\n if (command === \"extract\") {\n ensureArgumentCount({ command, args: commandArgs, min: 0, max: 0 })\n const fromPath = typeof parsedArgs.from === \"string\" ? parsedArgs.from : undefined\n if (fromPath !== undefined && parsedArgs.current === true) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: \"extract cannot use --current and --from together\",\n })\n }\n\n const result = await runWriteOperation(async () => {\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const resolvedSourcePathRaw =\n fromPath !== undefined\n ? resolvePathFromCwd({\n cwd: runtimeCwd,\n path: fromPath,\n })\n : repoContext.currentWorktreeRoot\n const resolvedSourcePath = ensurePathInsideRepo({\n repoRoot,\n path: resolvedSourcePathRaw,\n })\n const sourceWorktree =\n snapshot.worktrees.find((worktree) => worktree.path === resolvedSourcePath) ??\n snapshot.worktrees.find((worktree) => resolvedSourcePath.startsWith(`${worktree.path}${sep}`))\n\n if (sourceWorktree === undefined) {\n throw createCliError(\"WORKTREE_NOT_FOUND\", {\n message: \"extract source worktree not found\",\n details: { path: resolvedSourcePath },\n })\n }\n if (sourceWorktree.path !== repoRoot) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: \"extract currently supports only the primary worktree\",\n details: { sourcePath: sourceWorktree.path },\n })\n }\n if (sourceWorktree.branch === null) {\n throw createCliError(\"DETACHED_HEAD\", {\n message: \"extract requires current branch checkout\",\n details: { path: sourceWorktree.path },\n })\n }\n\n const branch = sourceWorktree.branch\n const baseBranch = await resolveBaseBranch({\n repoRoot,\n config: resolvedConfig,\n })\n ensureBranchIsNotPrimary({ branch, baseBranch })\n const targetPath = branchToWorktreePath(repoRoot, branch, resolvedConfig.paths.worktreeRoot)\n await ensureTargetPathWritable(targetPath)\n\n const status = await runGitCommand({\n cwd: repoRoot,\n args: [\"status\", \"--porcelain\"],\n reject: false,\n })\n const dirty = status.stdout.trim().length > 0\n if (dirty && parsedArgs.stash !== true) {\n throw createCliError(\"DIRTY_WORKTREE\", {\n message: \"extract requires clean worktree unless --stash is specified\",\n })\n }\n\n let stashOid: string | null = null\n if (dirty && parsedArgs.stash === true) {\n stashOid = await createStashEntry({\n cwd: repoRoot,\n message: `vde-worktree extract ${branch}`,\n })\n }\n\n const hookContext = createHookContext({\n runtime,\n repoRoot,\n action: \"extract\",\n branch,\n worktreePath: targetPath,\n stderr,\n })\n await runPreHookWithAutoRestore({\n name: \"extract\",\n context: hookContext,\n restore:\n stashOid !== null\n ? async (): Promise<void> => {\n await restoreStashedChanges({\n cwd: repoRoot,\n stashOid,\n })\n }\n : undefined,\n })\n await runGitCommand({\n cwd: repoRoot,\n args: [\"checkout\", baseBranch],\n })\n await runGitCommand({\n cwd: repoRoot,\n args: [\"worktree\", \"add\", targetPath, branch],\n })\n await upsertWorktreeMergeLifecycle({\n repoRoot,\n branch,\n baseBranch,\n observedDivergedHead: null,\n })\n\n if (stashOid !== null) {\n const applyResult = await runGitCommand({\n cwd: targetPath,\n args: [\"stash\", \"apply\", stashOid],\n reject: false,\n })\n if (applyResult.exitCode !== 0) {\n throw createCliError(\"STASH_APPLY_FAILED\", {\n message: \"Failed to apply stash to extracted worktree\",\n details: { stashOid, branch, path: targetPath },\n })\n }\n await dropStashByOid({\n cwd: repoRoot,\n stashOid,\n })\n }\n\n await runPostHook({ name: \"extract\", context: hookContext })\n return {\n branch,\n path: targetPath,\n }\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"created\",\n repoRoot,\n details: result,\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n stdout(result.path)\n return EXIT_CODE.OK\n }\n\n if (command === \"absorb\") {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n const branch = commandArgs[0] as string\n const fromWorktreeName = typeof parsedArgs.from === \"string\" ? parsedArgs.from : undefined\n const keepStash = parsedArgs.keepStash === true\n if (runtime.isInteractive !== true) {\n if (parsedArgs.allowAgent !== true) {\n throw createCliError(\"UNSAFE_FLAG_REQUIRED\", {\n message: \"UNSAFE_FLAG_REQUIRED: absorb in non-TTY requires --allow-agent\",\n })\n }\n ensureUnsafeForNonTty({\n runtime,\n reason: \"absorb in non-TTY mode requires --allow-unsafe\",\n })\n }\n\n const result = await runWriteOperation(async () => {\n const primaryStatus = await runGitCommand({\n cwd: repoRoot,\n args: [\"status\", \"--porcelain\"],\n reject: false,\n })\n if (primaryStatus.stdout.trim().length > 0) {\n throw createCliError(\"DIRTY_WORKTREE\", {\n message: \"absorb requires clean primary worktree\",\n details: { repoRoot },\n })\n }\n\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const sourceWorktree = resolveManagedNonPrimaryWorktreeByBranch({\n repoRoot,\n managedWorktreeRoot,\n branch,\n worktrees: snapshot.worktrees,\n optionName: \"--from\",\n worktreeName: fromWorktreeName,\n role: \"source\",\n })\n\n const sourceStatus = await runGitCommand({\n cwd: sourceWorktree.path,\n args: [\"status\", \"--porcelain\"],\n reject: false,\n })\n const sourceDirty = sourceStatus.stdout.trim().length > 0\n let stashOid: string | null = null\n if (sourceDirty) {\n stashOid = await createStashEntry({\n cwd: sourceWorktree.path,\n message: `vde-worktree absorb ${branch}`,\n })\n }\n\n const hookContext = createHookContext({\n runtime,\n repoRoot,\n action: \"absorb\",\n branch,\n worktreePath: repoRoot,\n stderr,\n extraEnv: {\n WT_SOURCE_WORKTREE_PATH: sourceWorktree.path,\n },\n })\n await runPreHookWithAutoRestore({\n name: \"absorb\",\n context: hookContext,\n restore:\n stashOid !== null\n ? async (): Promise<void> => {\n await restoreStashedChanges({\n cwd: sourceWorktree.path,\n stashOid,\n })\n }\n : undefined,\n })\n await runGitCommand({\n cwd: repoRoot,\n args: [\"checkout\", \"--ignore-other-worktrees\", branch],\n })\n\n if (stashOid !== null) {\n const applyResult = await runGitCommand({\n cwd: repoRoot,\n args: [\"stash\", \"apply\", stashOid],\n reject: false,\n })\n if (applyResult.exitCode !== 0) {\n throw createCliError(\"STASH_APPLY_FAILED\", {\n message: \"Failed to apply stash to primary worktree\",\n details: { stashOid, branch, sourcePath: sourceWorktree.path, path: repoRoot },\n })\n }\n if (!keepStash) {\n await dropStashByOid({\n cwd: repoRoot,\n stashOid,\n })\n }\n }\n\n await runPostHook({ name: \"absorb\", context: hookContext })\n const stashOutputRef =\n keepStash && stashOid !== null\n ? ((await resolveStashRefByOid({ cwd: repoRoot, stashOid })) ?? stashOid)\n : null\n return {\n branch,\n path: repoRoot,\n sourcePath: sourceWorktree.path,\n stashed: sourceDirty,\n stashRef: stashOutputRef,\n }\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: result,\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n stdout(result.path)\n return EXIT_CODE.OK\n }\n\n if (command === \"unabsorb\") {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n const branch = commandArgs[0] as string\n const targetWorktreeName = typeof parsedArgs.to === \"string\" ? parsedArgs.to : undefined\n const keepStash = parsedArgs.keepStash === true\n if (runtime.isInteractive !== true) {\n if (parsedArgs.allowAgent !== true) {\n throw createCliError(\"UNSAFE_FLAG_REQUIRED\", {\n message: \"UNSAFE_FLAG_REQUIRED: unabsorb in non-TTY requires --allow-agent\",\n })\n }\n ensureUnsafeForNonTty({\n runtime,\n reason: \"unabsorb in non-TTY mode requires --allow-unsafe\",\n })\n }\n\n const result = await runWriteOperation(async () => {\n const currentBranchResult = await runGitCommand({\n cwd: repoRoot,\n args: [\"branch\", \"--show-current\"],\n reject: false,\n })\n const currentBranch = currentBranchResult.stdout.trim()\n if (currentBranch !== branch) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: \"unabsorb requires primary worktree to be on the target branch\",\n details: { branch, currentBranch },\n })\n }\n\n const primaryStatus = await runGitCommand({\n cwd: repoRoot,\n args: [\"status\", \"--porcelain\"],\n reject: false,\n })\n if (primaryStatus.stdout.trim().length === 0) {\n throw createCliError(\"DIRTY_WORKTREE\", {\n message: \"unabsorb requires dirty primary worktree\",\n details: { repoRoot },\n })\n }\n\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const targetWorktree = resolveManagedNonPrimaryWorktreeByBranch({\n repoRoot,\n managedWorktreeRoot,\n branch,\n worktrees: snapshot.worktrees,\n optionName: \"--to\",\n worktreeName: targetWorktreeName,\n role: \"target\",\n })\n const targetStatus = await runGitCommand({\n cwd: targetWorktree.path,\n args: [\"status\", \"--porcelain\"],\n reject: false,\n })\n if (targetStatus.stdout.trim().length > 0) {\n throw createCliError(\"DIRTY_WORKTREE\", {\n message: \"unabsorb requires clean target worktree\",\n details: { branch, path: targetWorktree.path },\n })\n }\n\n const stashOid = await createStashEntry({\n cwd: repoRoot,\n message: `vde-worktree unabsorb ${branch}`,\n })\n\n const hookContext = createHookContext({\n runtime,\n repoRoot,\n action: \"unabsorb\",\n branch,\n worktreePath: targetWorktree.path,\n stderr,\n extraEnv: {\n WT_SOURCE_WORKTREE_PATH: repoRoot,\n WT_TARGET_WORKTREE_PATH: targetWorktree.path,\n },\n })\n await runPreHookWithAutoRestore({\n name: \"unabsorb\",\n context: hookContext,\n restore: async (): Promise<void> => {\n await restoreStashedChanges({\n cwd: repoRoot,\n stashOid,\n })\n },\n })\n\n const applyResult = await runGitCommand({\n cwd: targetWorktree.path,\n args: [\"stash\", \"apply\", stashOid],\n reject: false,\n })\n if (applyResult.exitCode !== 0) {\n throw createCliError(\"STASH_APPLY_FAILED\", {\n message: \"Failed to apply stash to target worktree\",\n details: { stashOid, branch, sourcePath: repoRoot, targetPath: targetWorktree.path },\n })\n }\n if (!keepStash) {\n await dropStashByOid({\n cwd: repoRoot,\n stashOid,\n })\n }\n\n await runPostHook({ name: \"unabsorb\", context: hookContext })\n const stashOutputRef = keepStash\n ? ((await resolveStashRefByOid({ cwd: repoRoot, stashOid })) ?? stashOid)\n : null\n return {\n branch,\n path: targetWorktree.path,\n sourcePath: repoRoot,\n stashed: true,\n stashRef: stashOutputRef,\n }\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: result,\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n stdout(result.path)\n return EXIT_CODE.OK\n }\n\n if (command === \"use\") {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n const branch = commandArgs[0] as string\n const allowShared = parsedArgs.allowShared === true\n if (runtime.isInteractive !== true) {\n if (parsedArgs.allowAgent !== true) {\n throw createCliError(\"UNSAFE_FLAG_REQUIRED\", {\n message: \"UNSAFE_FLAG_REQUIRED: use in non-TTY requires --allow-agent\",\n })\n }\n ensureUnsafeForNonTty({\n runtime,\n reason: \"use in non-TTY mode requires --allow-unsafe\",\n })\n }\n\n const result = await runWriteOperation(async () => {\n const status = await runGitCommand({\n cwd: repoRoot,\n args: [\"status\", \"--porcelain\"],\n reject: false,\n })\n if (status.stdout.trim().length > 0) {\n throw createCliError(\"DIRTY_WORKTREE\", {\n message: \"use requires clean primary worktree\",\n details: { repoRoot },\n })\n }\n\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const branchCheckedOutInOtherWorktree = snapshot.worktrees.find((worktree) => {\n return worktree.branch === branch && worktree.path !== repoRoot\n })\n if (branchCheckedOutInOtherWorktree !== undefined && allowShared !== true) {\n throw createCliError(\"BRANCH_IN_USE\", {\n message: [\n `branch '${branch}' is already checked out in another worktree.`,\n ` path: ${branchCheckedOutInOtherWorktree.path}`,\n \"\",\n \"To continue (unsafe), re-run with:\",\n ` vw use ${branch} --allow-shared`,\n \"\",\n \"Risk:\",\n \" multiple worktrees will share the same branch.\",\n ].join(\"\\n\"),\n details: {\n branch,\n path: branchCheckedOutInOtherWorktree.path,\n hint: \"re-run with --allow-shared to continue\",\n risk: \"unsafe: multiple worktrees will share the same branch\",\n },\n })\n }\n if (branchCheckedOutInOtherWorktree !== undefined && allowShared === true) {\n stderr(\n [\n \"warning: --allow-shared enabled.\",\n ` branch: ${branch}`,\n ` path: ${branchCheckedOutInOtherWorktree.path}`,\n \" risk (unsafe): multiple worktrees will share the same branch.\",\n ].join(\"\\n\"),\n )\n }\n const checkoutArgs = branchCheckedOutInOtherWorktree\n ? [\"checkout\", \"--ignore-other-worktrees\", branch]\n : [\"checkout\", branch]\n\n const hookContext = createHookContext({\n runtime,\n repoRoot,\n action: \"use\",\n branch,\n worktreePath: repoRoot,\n stderr,\n })\n await runPreHook({ name: \"use\", context: hookContext })\n await runGitCommand({\n cwd: repoRoot,\n args: checkoutArgs,\n })\n await runPostHook({ name: \"use\", context: hookContext })\n return {\n branch,\n path: repoRoot,\n }\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: result,\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n stdout(result.path)\n return EXIT_CODE.OK\n }\n\n if (command === \"exec\") {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n ensureHasCommandAfterDoubleDash({\n command,\n argsAfterDoubleDash: afterDoubleDash,\n })\n const branch = commandArgs[0] as string\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const target = resolveTargetWorktreeByBranch({ branch, worktrees: snapshot.worktrees })\n const executable = afterDoubleDash[0]\n if (typeof executable !== \"string\" || executable.length === 0) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: \"exec requires executable after --\",\n })\n }\n\n const child = await execa(executable, afterDoubleDash.slice(1), {\n cwd: target.path,\n stdin: \"inherit\",\n stdout: \"inherit\",\n stderr: \"inherit\",\n reject: false,\n })\n const childExitCode = child.exitCode ?? 0\n if (runtime.json) {\n if (childExitCode === 0) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n branch,\n path: target.path,\n childExitCode,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n stdout(\n JSON.stringify({\n schemaVersion: SCHEMA_VERSION,\n command,\n status: \"error\",\n repoRoot,\n code: \"CHILD_PROCESS_FAILED\",\n message: \"target command exited with non-zero status\",\n details: {\n branch,\n path: target.path,\n childExitCode,\n },\n }),\n )\n return EXIT_CODE.CHILD_PROCESS_FAILED\n }\n return childExitCode === 0 ? EXIT_CODE.OK : EXIT_CODE.CHILD_PROCESS_FAILED\n }\n\n if (command === \"invoke\") {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n const hookName = normalizeHookName(commandArgs[0] as string)\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const current = resolveCurrentWorktree({\n snapshot,\n currentWorktreeRoot: repoContext.currentWorktreeRoot,\n })\n const hookContext = createHookContext({\n runtime,\n repoRoot,\n action: `invoke:${hookName}`,\n branch: current.branch,\n worktreePath: current.path,\n stderr,\n })\n await invokeHook({\n hookName,\n args: afterDoubleDash,\n context: hookContext,\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n hook: hookName,\n exitCode: 0,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n return EXIT_CODE.OK\n }\n\n if (command === \"copy\") {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: Number.MAX_SAFE_INTEGER })\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const targetWorktreeRoot = resolveTargetWorktreeRootForCopyLink({\n repoContext,\n snapshot,\n })\n\n for (const relativePath of commandArgs) {\n const { sourcePath, destinationPath } = resolveFileCopyTargets({\n repoRoot,\n targetWorktreeRoot,\n relativePath,\n })\n await access(sourcePath, fsConstants.F_OK)\n await mkdir(dirname(destinationPath), { recursive: true })\n await cp(sourcePath, destinationPath, {\n recursive: true,\n force: true,\n errorOnExist: false,\n dereference: false,\n })\n }\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n copied: commandArgs,\n worktreePath: targetWorktreeRoot,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n return EXIT_CODE.OK\n }\n\n if (command === \"link\") {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: Number.MAX_SAFE_INTEGER })\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const targetWorktreeRoot = resolveTargetWorktreeRootForCopyLink({\n repoContext,\n snapshot,\n })\n const fallbackEnabled = parsedArgs.fallback !== false\n\n for (const relativePath of commandArgs) {\n const { sourcePath, destinationPath } = resolveFileCopyTargets({\n repoRoot,\n targetWorktreeRoot,\n relativePath,\n })\n await access(sourcePath, fsConstants.F_OK)\n await rm(destinationPath, { recursive: true, force: true })\n await mkdir(dirname(destinationPath), { recursive: true })\n\n try {\n await symlink(resolveLinkTargetPath({ sourcePath, destinationPath }), destinationPath)\n } catch (error) {\n if (process.platform === \"win32\" && fallbackEnabled) {\n stderr(`symlink failed for ${relativePath}; fallback to copy`)\n await cp(sourcePath, destinationPath, {\n recursive: true,\n force: true,\n errorOnExist: false,\n dereference: false,\n })\n continue\n }\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: `Failed to create symlink for ${relativePath}`,\n cause: error,\n })\n }\n }\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n linked: commandArgs,\n worktreePath: targetWorktreeRoot,\n fallback: fallbackEnabled,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n return EXIT_CODE.OK\n }\n\n if (command === \"lock\") {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n const branch = commandArgs[0] as string\n const ownerOption = readStringOption(parsedArgsRecord, \"owner\")\n const reasonOption = readStringOption(parsedArgsRecord, \"reason\")\n const owner = typeof ownerOption === \"string\" && ownerOption.length > 0 ? ownerOption : defaultOwner()\n const reason = typeof reasonOption === \"string\" && reasonOption.length > 0 ? reasonOption : \"locked\"\n\n const result = await runWriteOperation(async () => {\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n resolveTargetWorktreeByBranch({ branch, worktrees: snapshot.worktrees })\n const existing = await readWorktreeLock({ repoRoot, branch })\n if (existing.exists && existing.valid !== true) {\n throw createCliError(\"LOCK_CONFLICT\", {\n message: \"Cannot update lock with invalid metadata; fix or remove lock file first\",\n details: { branch, path: existing.path },\n })\n }\n if (existing.record !== null && existing.record.owner !== owner) {\n throw createCliError(\"LOCK_CONFLICT\", {\n message: \"Lock is owned by another owner\",\n details: { branch, owner: existing.record.owner },\n })\n }\n const lock = await upsertWorktreeLock({\n repoRoot,\n branch,\n reason,\n owner,\n })\n return lock\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n branch,\n locked: {\n value: true,\n reason: result.reason,\n owner: result.owner,\n },\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n return EXIT_CODE.OK\n }\n\n if (command === \"unlock\") {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n const branch = commandArgs[0] as string\n const ownerOption = readStringOption(parsedArgsRecord, \"owner\")\n const owner = typeof ownerOption === \"string\" && ownerOption.length > 0 ? ownerOption : defaultOwner()\n const force = parsedArgs.force === true\n\n await runWriteOperation(async () => {\n const existing = await readWorktreeLock({ repoRoot, branch })\n if (existing.exists !== true) {\n return\n }\n if (existing.valid !== true) {\n if (force) {\n await deleteWorktreeLock({ repoRoot, branch })\n return\n }\n throw createCliError(\"LOCK_CONFLICT\", {\n message: \"Lock metadata is invalid; use --force to unlock\",\n details: { branch, path: existing.path },\n })\n }\n if (existing.record !== null && existing.record.owner !== owner && force !== true) {\n throw createCliError(\"LOCK_CONFLICT\", {\n message: \"Lock is owned by another owner. Use --force to unlock.\",\n details: { branch, owner: existing.record.owner },\n })\n }\n await deleteWorktreeLock({ repoRoot, branch })\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n branch,\n locked: {\n value: false,\n reason: null,\n },\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n return EXIT_CODE.OK\n }\n\n if (command === \"cd\") {\n ensureArgumentCount({ command, args: commandArgs, min: 0, max: 0 })\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const theme = createCatppuccinTheme({\n enabled: shouldUseAnsiColors({ interactive: runtime.isInteractive || process.stderr.isTTY === true }),\n })\n const branchColumnWidth = snapshot.worktrees.reduce((maxWidth, worktree) => {\n const label = buildCdBranchLabel({\n worktree,\n currentWorktreeRoot: repoContext.currentWorktreeRoot,\n })\n return Math.max(maxWidth, stringWidth(label))\n }, 0)\n const candidates = snapshot.worktrees.map((worktree) =>\n buildCdCandidateLine({\n worktree,\n baseBranch: snapshot.baseBranch,\n theme,\n currentWorktreeRoot: repoContext.currentWorktreeRoot,\n branchColumnWidth,\n }),\n )\n if (candidates.length === 0) {\n throw createCliError(\"WORKTREE_NOT_FOUND\", {\n message: \"No worktree candidates found\",\n })\n }\n\n const promptValue = readStringOption(parsedArgsRecord, \"prompt\")\n const prompt =\n typeof promptValue === \"string\" && promptValue.length > 0 ? promptValue : resolvedConfig.selector.cd.prompt\n const cliFzfExtraArgs = collectOptionValues({\n args: beforeDoubleDash,\n optionNames: [\"fzfArg\", \"fzf-arg\"],\n })\n const mergedConfigFzfArgs = mergeFzfArgs({\n defaults: resolvedConfig.selector.cd.fzf.extraArgs,\n extras: cliFzfExtraArgs,\n })\n const surface: SelectorCdSurface = resolvedConfig.selector.cd.surface\n\n const selection = await selectPathWithFzf({\n candidates,\n prompt,\n fzfExtraArgs: mergeFzfArgs({\n defaults: CD_FZF_EXTRA_ARGS,\n extras: mergedConfigFzfArgs,\n }),\n surface,\n tmuxPopupOpts: resolvedConfig.selector.cd.tmuxPopupOpts,\n cwd: repoRoot,\n isInteractive: () => runtime.isInteractive || process.stderr.isTTY === true,\n }).catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error)\n if (message.includes(\"interactive terminal\") || message.includes(\"fzf is required\")) {\n throw createCliError(\"DEPENDENCY_MISSING\", {\n message: `DEPENDENCY_MISSING: ${message}`,\n })\n }\n throw error\n })\n\n if (selection.status === \"cancelled\") {\n return EXIT_CODE_CANCELLED\n }\n const selectedPath = resolveCdSelectionPath(selection.path)\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n path: selectedPath,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n stdout(selectedPath)\n return EXIT_CODE.OK\n }\n\n throw createCliError(\"UNKNOWN_COMMAND\", {\n message: `Unknown command: ${command}`,\n })\n } catch (error) {\n const cliError = ensureCliError(error)\n if (jsonEnabled) {\n stdout(\n JSON.stringify(\n buildJsonError({\n command,\n repoRoot: repoRootForJson,\n error: cliError,\n }),\n ),\n )\n } else {\n stderr(`[${cliError.code}] ${cliError.message}`)\n logger.debug(JSON.stringify(cliError.details))\n }\n return cliError.exitCode\n }\n }\n\n return { run }\n}\n","#!/usr/bin/env node\nimport { createCli } from \"./cli/index\"\n\nconst main = async (): Promise<void> => {\n const cli = createCli()\n try {\n const exitCode = await cli.run(process.argv.slice(2))\n if (typeof exitCode === \"number\" && exitCode !== 0) {\n process.exit(exitCode)\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(\"Error:\", error.message)\n if (process.env.VDE_WORKTREE_DEBUG === \"true\" || process.env.VDE_DEBUG === \"true\") {\n console.error(error.stack)\n }\n } else {\n console.error(\"An unexpected error occurred:\", String(error))\n }\n\n process.exit(1)\n }\n}\n\nvoid main()\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["fsConstants","fsConstants","fsConstants","lockFilePath","fsConstants","fsConstants","fsConstants","selectPathWithFzf","defaultSelectPathWithFzf","collectWorktreeSnapshot","collectWorktreeSnapshotBase"],"sources":["../src/core/constants.ts","../src/core/errors.ts","../src/config/git-boundary.ts","../src/config/types.ts","../src/config/loader.ts","../src/git/exec.ts","../src/core/paths.ts","../src/core/hooks.ts","../src/core/init.ts","../src/core/json-storage.ts","../src/core/repo-lock.ts","../src/core/worktree-merge-lifecycle.ts","../src/core/worktree-lock.ts","../src/integrations/gh.ts","../src/git/worktree.ts","../src/core/worktree-state.ts","../src/integrations/fzf.ts","../src/utils/logger.ts","../src/cli/commands/handler-groups.ts","../src/cli/commands/read/dispatcher.ts","../src/cli/package-version.ts","../src/cli/index.ts","../src/index.ts"],"sourcesContent":["export const SCHEMA_VERSION = 1\n\nexport const EXIT_CODE = {\n OK: 0,\n NOT_GIT_REPOSITORY: 2,\n INVALID_ARGUMENT: 3,\n SAFETY_REJECTED: 4,\n DEPENDENCY_MISSING: 5,\n LOCK_FAILED: 6,\n HOOK_FAILED: 10,\n GIT_COMMAND_FAILED: 20,\n CHILD_PROCESS_FAILED: 21,\n INTERNAL_ERROR: 30,\n} as const\n\nexport const DEFAULT_HOOK_TIMEOUT_MS = 30_000\nexport const DEFAULT_LOCK_TIMEOUT_MS = 15_000\nexport const DEFAULT_STALE_LOCK_TTL_SECONDS = 1_800\n\nexport const COMMAND_NAMES = {\n INIT: \"init\",\n LIST: \"list\",\n STATUS: \"status\",\n PATH: \"path\",\n SWITCH: \"switch\",\n NEW: \"new\",\n MV: \"mv\",\n DEL: \"del\",\n GONE: \"gone\",\n GET: \"get\",\n EXTRACT: \"extract\",\n ABSORB: \"absorb\",\n UNABSORB: \"unabsorb\",\n USE: \"use\",\n EXEC: \"exec\",\n INVOKE: \"invoke\",\n COPY: \"copy\",\n LINK: \"link\",\n LOCK: \"lock\",\n UNLOCK: \"unlock\",\n CD: \"cd\",\n COMPLETION: \"completion\",\n} as const\n\nexport const WRITE_COMMANDS = new Set<string>([\n COMMAND_NAMES.INIT,\n COMMAND_NAMES.SWITCH,\n COMMAND_NAMES.NEW,\n COMMAND_NAMES.MV,\n COMMAND_NAMES.DEL,\n COMMAND_NAMES.GONE,\n COMMAND_NAMES.GET,\n COMMAND_NAMES.EXTRACT,\n COMMAND_NAMES.ABSORB,\n COMMAND_NAMES.UNABSORB,\n COMMAND_NAMES.USE,\n COMMAND_NAMES.LOCK,\n COMMAND_NAMES.UNLOCK,\n])\n","import { EXIT_CODE } from \"./constants\"\n\nexport type ErrorCode =\n | \"NOT_GIT_REPOSITORY\"\n | \"INVALID_ARGUMENT\"\n | \"INVALID_CONFIG\"\n | \"UNKNOWN_COMMAND\"\n | \"UNSAFE_FLAG_REQUIRED\"\n | \"NOT_INITIALIZED\"\n | \"WORKTREE_NOT_FOUND\"\n | \"BRANCH_ALREADY_ATTACHED\"\n | \"BRANCH_ALREADY_EXISTS\"\n | \"BRANCH_IN_USE\"\n | \"TARGET_PATH_NOT_EMPTY\"\n | \"PATH_OUTSIDE_REPO\"\n | \"ABSOLUTE_PATH_NOT_ALLOWED\"\n | \"LOCK_CONFLICT\"\n | \"DETACHED_HEAD\"\n | \"DIRTY_WORKTREE\"\n | \"UNMERGED_WORKTREE\"\n | \"UNPUSHED_WORKTREE\"\n | \"LOCKED_WORKTREE\"\n | \"STASH_APPLY_FAILED\"\n | \"REMOTE_NOT_FOUND\"\n | \"REMOTE_BRANCH_NOT_FOUND\"\n | \"INVALID_REMOTE_BRANCH_FORMAT\"\n | \"HOOK_NOT_FOUND\"\n | \"DEPENDENCY_MISSING\"\n | \"REPO_LOCK_TIMEOUT\"\n | \"REPO_LOCK_STALE_RECOVERY_FAILED\"\n | \"HOOK_NOT_EXECUTABLE\"\n | \"HOOK_TIMEOUT\"\n | \"HOOK_FAILED\"\n | \"GIT_COMMAND_FAILED\"\n | \"INTERNAL_ERROR\"\n\nconst ERROR_CODE_TO_EXIT_CODE: Record<ErrorCode, number> = {\n NOT_GIT_REPOSITORY: EXIT_CODE.NOT_GIT_REPOSITORY,\n INVALID_ARGUMENT: EXIT_CODE.INVALID_ARGUMENT,\n INVALID_CONFIG: EXIT_CODE.INVALID_ARGUMENT,\n UNKNOWN_COMMAND: EXIT_CODE.INVALID_ARGUMENT,\n UNSAFE_FLAG_REQUIRED: EXIT_CODE.SAFETY_REJECTED,\n NOT_INITIALIZED: EXIT_CODE.SAFETY_REJECTED,\n WORKTREE_NOT_FOUND: EXIT_CODE.SAFETY_REJECTED,\n BRANCH_ALREADY_ATTACHED: EXIT_CODE.SAFETY_REJECTED,\n BRANCH_ALREADY_EXISTS: EXIT_CODE.SAFETY_REJECTED,\n BRANCH_IN_USE: EXIT_CODE.SAFETY_REJECTED,\n TARGET_PATH_NOT_EMPTY: EXIT_CODE.SAFETY_REJECTED,\n PATH_OUTSIDE_REPO: EXIT_CODE.SAFETY_REJECTED,\n ABSOLUTE_PATH_NOT_ALLOWED: EXIT_CODE.SAFETY_REJECTED,\n LOCK_CONFLICT: EXIT_CODE.SAFETY_REJECTED,\n DETACHED_HEAD: EXIT_CODE.SAFETY_REJECTED,\n DIRTY_WORKTREE: EXIT_CODE.SAFETY_REJECTED,\n UNMERGED_WORKTREE: EXIT_CODE.SAFETY_REJECTED,\n UNPUSHED_WORKTREE: EXIT_CODE.SAFETY_REJECTED,\n LOCKED_WORKTREE: EXIT_CODE.SAFETY_REJECTED,\n STASH_APPLY_FAILED: EXIT_CODE.SAFETY_REJECTED,\n REMOTE_NOT_FOUND: EXIT_CODE.SAFETY_REJECTED,\n REMOTE_BRANCH_NOT_FOUND: EXIT_CODE.SAFETY_REJECTED,\n INVALID_REMOTE_BRANCH_FORMAT: EXIT_CODE.INVALID_ARGUMENT,\n HOOK_NOT_FOUND: EXIT_CODE.SAFETY_REJECTED,\n DEPENDENCY_MISSING: EXIT_CODE.DEPENDENCY_MISSING,\n REPO_LOCK_TIMEOUT: EXIT_CODE.LOCK_FAILED,\n REPO_LOCK_STALE_RECOVERY_FAILED: EXIT_CODE.LOCK_FAILED,\n HOOK_NOT_EXECUTABLE: EXIT_CODE.HOOK_FAILED,\n HOOK_TIMEOUT: EXIT_CODE.HOOK_FAILED,\n HOOK_FAILED: EXIT_CODE.HOOK_FAILED,\n GIT_COMMAND_FAILED: EXIT_CODE.GIT_COMMAND_FAILED,\n INTERNAL_ERROR: EXIT_CODE.INTERNAL_ERROR,\n}\n\nexport type CliErrorOptions = {\n readonly message: string\n readonly details?: Record<string, unknown>\n readonly cause?: unknown\n}\n\nexport class CliError extends Error {\n readonly code: ErrorCode\n readonly exitCode: number\n readonly details: Record<string, unknown>\n\n constructor(code: ErrorCode, options: CliErrorOptions) {\n super(options.message, { cause: options.cause })\n this.code = code\n this.exitCode = ERROR_CODE_TO_EXIT_CODE[code]\n this.details = options.details ?? {}\n }\n}\n\nexport const createCliError = (code: ErrorCode, options: CliErrorOptions): CliError => {\n return new CliError(code, options)\n}\n\nexport const ensureCliError = (error: unknown): CliError => {\n if (error instanceof CliError) {\n return error\n }\n\n if (error instanceof Error) {\n return createCliError(\"INTERNAL_ERROR\", { message: error.message, cause: error })\n }\n\n return createCliError(\"INTERNAL_ERROR\", {\n message: \"An unexpected error occurred\",\n details: { value: String(error) },\n })\n}\n","import { lstat } from \"node:fs/promises\"\nimport { dirname, join, resolve } from \"node:path\"\n\nconst hasGitMarker = async (directory: string): Promise<boolean> => {\n try {\n const stat = await lstat(join(directory, \".git\"))\n return stat.isDirectory() || stat.isFile()\n } catch {\n return false\n }\n}\n\nexport const findGitBoundaryDirectory = async (cwd: string): Promise<string | null> => {\n let current = resolve(cwd)\n while (true) {\n if (await hasGitMarker(current)) {\n return current\n }\n const parent = dirname(current)\n if (parent === current) {\n return null\n }\n current = parent\n }\n}\n\nexport const collectConfigSearchDirectories = async (cwd: string): Promise<readonly string[]> => {\n const absoluteCwd = resolve(cwd)\n const boundary = await findGitBoundaryDirectory(absoluteCwd)\n if (boundary === null) {\n return [absoluteCwd]\n }\n\n const directories: string[] = []\n let current = absoluteCwd\n while (true) {\n directories.push(current)\n if (current === boundary) {\n break\n }\n const parent = dirname(current)\n if (parent === current) {\n break\n }\n current = parent\n }\n\n return directories.reverse()\n}\n","import { DEFAULT_HOOK_TIMEOUT_MS, DEFAULT_LOCK_TIMEOUT_MS, DEFAULT_STALE_LOCK_TTL_SECONDS } from \"../core/constants\"\n\nexport const LIST_TABLE_COLUMNS = [\"branch\", \"dirty\", \"merged\", \"pr\", \"locked\", \"ahead\", \"behind\", \"path\"] as const\n\nexport const LIST_PATH_TRUNCATE_VALUES = [\"auto\", \"never\"] as const\nexport const SELECTOR_CD_SURFACE_VALUES = [\"auto\", \"inline\", \"tmux-popup\"] as const\n\nexport type ListTableColumn = (typeof LIST_TABLE_COLUMNS)[number]\nexport type ListPathTruncate = (typeof LIST_PATH_TRUNCATE_VALUES)[number]\nexport type SelectorCdSurface = (typeof SELECTOR_CD_SURFACE_VALUES)[number]\n\nexport type ResolvedConfig = {\n readonly paths: {\n readonly worktreeRoot: string\n }\n readonly git: {\n readonly baseBranch: string | null\n readonly baseRemote: string\n }\n readonly github: {\n readonly enabled: boolean\n }\n readonly hooks: {\n readonly enabled: boolean\n readonly timeoutMs: number\n }\n readonly locks: {\n readonly timeoutMs: number\n readonly staleLockTTLSeconds: number\n }\n readonly list: {\n readonly table: {\n readonly columns: ReadonlyArray<ListTableColumn>\n readonly path: {\n readonly truncate: ListPathTruncate\n readonly minWidth: number\n }\n }\n }\n readonly selector: {\n readonly cd: {\n readonly prompt: string\n readonly surface: SelectorCdSurface\n readonly tmuxPopupOpts: string\n readonly fzf: {\n readonly extraArgs: ReadonlyArray<string>\n }\n }\n }\n}\n\nexport type DeepPartial<T> = {\n -readonly [K in keyof T]?: T[K] extends ReadonlyArray<infer U>\n ? ReadonlyArray<U>\n : T[K] extends object\n ? DeepPartial<T[K]>\n : T[K]\n}\n\nexport type PartialConfig = DeepPartial<ResolvedConfig>\n\nexport const DEFAULT_CONFIG: ResolvedConfig = {\n paths: {\n worktreeRoot: \".worktree\",\n },\n git: {\n baseBranch: null,\n baseRemote: \"origin\",\n },\n github: {\n enabled: true,\n },\n hooks: {\n enabled: true,\n timeoutMs: DEFAULT_HOOK_TIMEOUT_MS,\n },\n locks: {\n timeoutMs: DEFAULT_LOCK_TIMEOUT_MS,\n staleLockTTLSeconds: DEFAULT_STALE_LOCK_TTL_SECONDS,\n },\n list: {\n table: {\n columns: [...LIST_TABLE_COLUMNS],\n path: {\n truncate: \"auto\",\n minWidth: 12,\n },\n },\n },\n selector: {\n cd: {\n prompt: \"worktree> \",\n surface: \"auto\",\n tmuxPopupOpts: \"80%,70%\",\n fzf: {\n extraArgs: [],\n },\n },\n },\n}\n","import { constants as fsConstants } from \"node:fs\"\nimport { access, lstat, readFile, realpath } from \"node:fs/promises\"\nimport { homedir } from \"node:os\"\nimport { isAbsolute, join, resolve } from \"node:path\"\nimport { parse } from \"yaml\"\nimport { createCliError } from \"../core/errors\"\nimport { collectConfigSearchDirectories } from \"./git-boundary\"\nimport {\n DEFAULT_CONFIG,\n LIST_PATH_TRUNCATE_VALUES,\n LIST_TABLE_COLUMNS,\n SELECTOR_CD_SURFACE_VALUES,\n type ListPathTruncate,\n type ListTableColumn,\n type PartialConfig,\n type ResolvedConfig,\n} from \"./types\"\n\nconst CONFIG_FILE_BASENAME = \"config.yml\"\nconst LOCAL_CONFIG_PATH_SEGMENTS = [\".vde\", \"worktree\", CONFIG_FILE_BASENAME] as const\nconst GLOBAL_CONFIG_PATH_SEGMENTS = [\"vde\", \"worktree\", CONFIG_FILE_BASENAME] as const\n\ntype ValidationContext = {\n readonly file: string\n}\n\ntype LoadResolvedConfigInput = {\n readonly cwd: string\n readonly repoRoot: string\n}\n\nexport type LoadResolvedConfigResult = {\n readonly config: ResolvedConfig\n readonly loadedFiles: ReadonlyArray<string>\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return value !== null && typeof value === \"object\" && Array.isArray(value) !== true\n}\n\nconst toKeyPath = (segments: readonly string[]): string => {\n if (segments.length === 0) {\n return \"<root>\"\n }\n return segments.join(\".\")\n}\n\nconst throwInvalidConfig = ({\n file,\n keyPath,\n reason,\n}: {\n readonly file: string\n readonly keyPath: string\n readonly reason: string\n}): never => {\n throw createCliError(\"INVALID_CONFIG\", {\n message: `Invalid config: ${file} (${keyPath}: ${reason})`,\n details: {\n file,\n keyPath,\n reason,\n },\n })\n}\n\nconst expectRecord = ({\n value,\n ctx,\n keyPath,\n}: {\n readonly value: unknown\n readonly ctx: ValidationContext\n readonly keyPath: readonly string[]\n}): Record<string, unknown> => {\n if (isRecord(value)) {\n return value\n }\n return throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath(keyPath),\n reason: \"must be an object\",\n })\n}\n\nconst ensureNoUnknownKeys = ({\n record,\n allowedKeys,\n ctx,\n keyPath,\n}: {\n readonly record: Record<string, unknown>\n readonly allowedKeys: ReadonlyArray<string>\n readonly ctx: ValidationContext\n readonly keyPath: readonly string[]\n}): void => {\n const allowed = new Set(allowedKeys)\n for (const key of Object.keys(record)) {\n if (allowed.has(key)) {\n continue\n }\n const path = [...keyPath, key]\n throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath(path),\n reason: \"unknown key\",\n })\n }\n}\n\nconst parseBoolean = ({\n value,\n ctx,\n keyPath,\n}: {\n readonly value: unknown\n readonly ctx: ValidationContext\n readonly keyPath: readonly string[]\n}): boolean => {\n if (typeof value === \"boolean\") {\n return value\n }\n return throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath(keyPath),\n reason: \"must be boolean\",\n })\n}\n\nconst parseNonEmptyString = ({\n value,\n ctx,\n keyPath,\n}: {\n readonly value: unknown\n readonly ctx: ValidationContext\n readonly keyPath: readonly string[]\n}): string => {\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value\n }\n return throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath(keyPath),\n reason: \"must be a non-empty string\",\n })\n}\n\nconst parsePositiveInteger = ({\n value,\n ctx,\n keyPath,\n}: {\n readonly value: unknown\n readonly ctx: ValidationContext\n readonly keyPath: readonly string[]\n}): number => {\n if (typeof value === \"number\" && Number.isInteger(value) && value > 0) {\n return value\n }\n return throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath(keyPath),\n reason: \"must be a positive integer\",\n })\n}\n\nconst parseStringArray = ({\n value,\n ctx,\n keyPath,\n}: {\n readonly value: unknown\n readonly ctx: ValidationContext\n readonly keyPath: readonly string[]\n}): string[] => {\n if (Array.isArray(value) !== true) {\n return throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath(keyPath),\n reason: \"must be an array\",\n })\n }\n const values = value\n const result: string[] = []\n for (const [index, item] of values.entries()) {\n if (typeof item !== \"string\" || item.length === 0) {\n throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath([...keyPath, String(index)]),\n reason: \"must be a non-empty string\",\n })\n }\n result.push(item)\n }\n return result\n}\n\nconst parseColumns = ({\n value,\n ctx,\n keyPath,\n}: {\n readonly value: unknown\n readonly ctx: ValidationContext\n readonly keyPath: readonly string[]\n}): ReadonlyArray<ListTableColumn> => {\n if (Array.isArray(value) !== true) {\n return throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath(keyPath),\n reason: \"must be an array\",\n })\n }\n const values = value\n if (values.length === 0) {\n return throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath(keyPath),\n reason: \"must not be empty\",\n })\n }\n\n const allowed = new Set(LIST_TABLE_COLUMNS)\n const seen = new Set<string>()\n const parsed: ListTableColumn[] = []\n for (const [index, item] of values.entries()) {\n if (typeof item !== \"string\") {\n throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath([...keyPath, String(index)]),\n reason: \"must be a string\",\n })\n }\n if (allowed.has(item as ListTableColumn) !== true) {\n throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath([...keyPath, String(index)]),\n reason: `unsupported column: ${item}`,\n })\n }\n if (seen.has(item)) {\n throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath([...keyPath, String(index)]),\n reason: `duplicate column: ${item}`,\n })\n }\n seen.add(item)\n parsed.push(item as ListTableColumn)\n }\n return parsed\n}\n\nconst parseListPathTruncate = ({\n value,\n ctx,\n keyPath,\n}: {\n readonly value: unknown\n readonly ctx: ValidationContext\n readonly keyPath: readonly string[]\n}): ListPathTruncate => {\n if (typeof value !== \"string\" || (LIST_PATH_TRUNCATE_VALUES as readonly string[]).includes(value) !== true) {\n throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath(keyPath),\n reason: `must be one of: ${LIST_PATH_TRUNCATE_VALUES.join(\", \")}`,\n })\n }\n return value as ListPathTruncate\n}\n\nconst parseSelectorSurface = ({\n value,\n ctx,\n keyPath,\n}: {\n readonly value: unknown\n readonly ctx: ValidationContext\n readonly keyPath: readonly string[]\n}): ResolvedConfig[\"selector\"][\"cd\"][\"surface\"] => {\n if (typeof value !== \"string\" || (SELECTOR_CD_SURFACE_VALUES as readonly string[]).includes(value) !== true) {\n throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath(keyPath),\n reason: `must be one of: ${SELECTOR_CD_SURFACE_VALUES.join(\", \")}`,\n })\n }\n return value as ResolvedConfig[\"selector\"][\"cd\"][\"surface\"]\n}\n\nconst validatePartialConfig = ({\n rawConfig,\n ctx,\n}: {\n readonly rawConfig: unknown\n readonly ctx: ValidationContext\n}): PartialConfig => {\n if (rawConfig === null || rawConfig === undefined) {\n return {}\n }\n const root = expectRecord({\n value: rawConfig,\n ctx,\n keyPath: [],\n })\n\n ensureNoUnknownKeys({\n record: root,\n allowedKeys: [\"paths\", \"git\", \"github\", \"hooks\", \"locks\", \"list\", \"selector\"],\n ctx,\n keyPath: [],\n })\n\n const partial: PartialConfig = {}\n\n if (root.paths !== undefined) {\n const paths = expectRecord({\n value: root.paths,\n ctx,\n keyPath: [\"paths\"],\n })\n ensureNoUnknownKeys({\n record: paths,\n allowedKeys: [\"worktreeRoot\"],\n ctx,\n keyPath: [\"paths\"],\n })\n partial.paths = {}\n if (paths.worktreeRoot !== undefined) {\n partial.paths.worktreeRoot = parseNonEmptyString({\n value: paths.worktreeRoot,\n ctx,\n keyPath: [\"paths\", \"worktreeRoot\"],\n })\n }\n }\n\n if (root.git !== undefined) {\n const git = expectRecord({\n value: root.git,\n ctx,\n keyPath: [\"git\"],\n })\n ensureNoUnknownKeys({\n record: git,\n allowedKeys: [\"baseBranch\", \"baseRemote\"],\n ctx,\n keyPath: [\"git\"],\n })\n partial.git = {}\n if (git.baseBranch !== undefined) {\n if (git.baseBranch !== null && typeof git.baseBranch !== \"string\") {\n throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath([\"git\", \"baseBranch\"]),\n reason: \"must be a string or null\",\n })\n }\n partial.git.baseBranch =\n git.baseBranch === null\n ? null\n : parseNonEmptyString({\n value: git.baseBranch,\n ctx,\n keyPath: [\"git\", \"baseBranch\"],\n })\n }\n if (git.baseRemote !== undefined) {\n partial.git.baseRemote = parseNonEmptyString({\n value: git.baseRemote,\n ctx,\n keyPath: [\"git\", \"baseRemote\"],\n })\n }\n }\n\n if (root.github !== undefined) {\n const github = expectRecord({\n value: root.github,\n ctx,\n keyPath: [\"github\"],\n })\n ensureNoUnknownKeys({\n record: github,\n allowedKeys: [\"enabled\"],\n ctx,\n keyPath: [\"github\"],\n })\n partial.github = {}\n if (github.enabled !== undefined) {\n partial.github.enabled = parseBoolean({\n value: github.enabled,\n ctx,\n keyPath: [\"github\", \"enabled\"],\n })\n }\n }\n\n if (root.hooks !== undefined) {\n const hooks = expectRecord({\n value: root.hooks,\n ctx,\n keyPath: [\"hooks\"],\n })\n ensureNoUnknownKeys({\n record: hooks,\n allowedKeys: [\"enabled\", \"timeoutMs\"],\n ctx,\n keyPath: [\"hooks\"],\n })\n partial.hooks = {}\n if (hooks.enabled !== undefined) {\n partial.hooks.enabled = parseBoolean({\n value: hooks.enabled,\n ctx,\n keyPath: [\"hooks\", \"enabled\"],\n })\n }\n if (hooks.timeoutMs !== undefined) {\n partial.hooks.timeoutMs = parsePositiveInteger({\n value: hooks.timeoutMs,\n ctx,\n keyPath: [\"hooks\", \"timeoutMs\"],\n })\n }\n }\n\n if (root.locks !== undefined) {\n const locks = expectRecord({\n value: root.locks,\n ctx,\n keyPath: [\"locks\"],\n })\n ensureNoUnknownKeys({\n record: locks,\n allowedKeys: [\"timeoutMs\", \"staleLockTTLSeconds\"],\n ctx,\n keyPath: [\"locks\"],\n })\n partial.locks = {}\n if (locks.timeoutMs !== undefined) {\n partial.locks.timeoutMs = parsePositiveInteger({\n value: locks.timeoutMs,\n ctx,\n keyPath: [\"locks\", \"timeoutMs\"],\n })\n }\n if (locks.staleLockTTLSeconds !== undefined) {\n partial.locks.staleLockTTLSeconds = parsePositiveInteger({\n value: locks.staleLockTTLSeconds,\n ctx,\n keyPath: [\"locks\", \"staleLockTTLSeconds\"],\n })\n }\n }\n\n if (root.list !== undefined) {\n const list = expectRecord({\n value: root.list,\n ctx,\n keyPath: [\"list\"],\n })\n ensureNoUnknownKeys({\n record: list,\n allowedKeys: [\"table\"],\n ctx,\n keyPath: [\"list\"],\n })\n partial.list = {}\n if (list.table !== undefined) {\n const table = expectRecord({\n value: list.table,\n ctx,\n keyPath: [\"list\", \"table\"],\n })\n ensureNoUnknownKeys({\n record: table,\n allowedKeys: [\"columns\", \"path\"],\n ctx,\n keyPath: [\"list\", \"table\"],\n })\n partial.list.table = {}\n if (table.columns !== undefined) {\n partial.list.table.columns = parseColumns({\n value: table.columns,\n ctx,\n keyPath: [\"list\", \"table\", \"columns\"],\n })\n }\n if (table.path !== undefined) {\n const pathConfig = expectRecord({\n value: table.path,\n ctx,\n keyPath: [\"list\", \"table\", \"path\"],\n })\n ensureNoUnknownKeys({\n record: pathConfig,\n allowedKeys: [\"truncate\", \"minWidth\"],\n ctx,\n keyPath: [\"list\", \"table\", \"path\"],\n })\n partial.list.table.path = {}\n if (pathConfig.truncate !== undefined) {\n partial.list.table.path.truncate = parseListPathTruncate({\n value: pathConfig.truncate,\n ctx,\n keyPath: [\"list\", \"table\", \"path\", \"truncate\"],\n })\n }\n if (pathConfig.minWidth !== undefined) {\n const minWidth = parsePositiveInteger({\n value: pathConfig.minWidth,\n ctx,\n keyPath: [\"list\", \"table\", \"path\", \"minWidth\"],\n })\n if (minWidth < 8 || minWidth > 200) {\n throwInvalidConfig({\n file: ctx.file,\n keyPath: toKeyPath([\"list\", \"table\", \"path\", \"minWidth\"]),\n reason: \"must be in range 8..200\",\n })\n }\n partial.list.table.path.minWidth = minWidth\n }\n }\n }\n }\n\n if (root.selector !== undefined) {\n const selector = expectRecord({\n value: root.selector,\n ctx,\n keyPath: [\"selector\"],\n })\n ensureNoUnknownKeys({\n record: selector,\n allowedKeys: [\"cd\"],\n ctx,\n keyPath: [\"selector\"],\n })\n partial.selector = {}\n if (selector.cd !== undefined) {\n const cd = expectRecord({\n value: selector.cd,\n ctx,\n keyPath: [\"selector\", \"cd\"],\n })\n ensureNoUnknownKeys({\n record: cd,\n allowedKeys: [\"prompt\", \"surface\", \"tmuxPopupOpts\", \"fzf\"],\n ctx,\n keyPath: [\"selector\", \"cd\"],\n })\n partial.selector.cd = {}\n if (cd.prompt !== undefined) {\n partial.selector.cd.prompt = parseNonEmptyString({\n value: cd.prompt,\n ctx,\n keyPath: [\"selector\", \"cd\", \"prompt\"],\n })\n }\n if (cd.surface !== undefined) {\n partial.selector.cd.surface = parseSelectorSurface({\n value: cd.surface,\n ctx,\n keyPath: [\"selector\", \"cd\", \"surface\"],\n })\n }\n if (cd.tmuxPopupOpts !== undefined) {\n partial.selector.cd.tmuxPopupOpts = parseNonEmptyString({\n value: cd.tmuxPopupOpts,\n ctx,\n keyPath: [\"selector\", \"cd\", \"tmuxPopupOpts\"],\n })\n }\n if (cd.fzf !== undefined) {\n const fzf = expectRecord({\n value: cd.fzf,\n ctx,\n keyPath: [\"selector\", \"cd\", \"fzf\"],\n })\n ensureNoUnknownKeys({\n record: fzf,\n allowedKeys: [\"extraArgs\"],\n ctx,\n keyPath: [\"selector\", \"cd\", \"fzf\"],\n })\n partial.selector.cd.fzf = {}\n if (fzf.extraArgs !== undefined) {\n partial.selector.cd.fzf.extraArgs = parseStringArray({\n value: fzf.extraArgs,\n ctx,\n keyPath: [\"selector\", \"cd\", \"fzf\", \"extraArgs\"],\n })\n }\n }\n }\n }\n\n return partial\n}\n\nconst mergeConfig = (base: ResolvedConfig, partial: PartialConfig): ResolvedConfig => {\n return {\n paths: {\n worktreeRoot: partial.paths?.worktreeRoot ?? base.paths.worktreeRoot,\n },\n git: {\n baseBranch: partial.git?.baseBranch === undefined ? base.git.baseBranch : partial.git.baseBranch,\n baseRemote: partial.git?.baseRemote ?? base.git.baseRemote,\n },\n github: {\n enabled: partial.github?.enabled ?? base.github.enabled,\n },\n hooks: {\n enabled: partial.hooks?.enabled ?? base.hooks.enabled,\n timeoutMs: partial.hooks?.timeoutMs ?? base.hooks.timeoutMs,\n },\n locks: {\n timeoutMs: partial.locks?.timeoutMs ?? base.locks.timeoutMs,\n staleLockTTLSeconds: partial.locks?.staleLockTTLSeconds ?? base.locks.staleLockTTLSeconds,\n },\n list: {\n table: {\n columns: partial.list?.table?.columns ? [...partial.list.table.columns] : [...base.list.table.columns],\n path: {\n truncate: partial.list?.table?.path?.truncate ?? base.list.table.path.truncate,\n minWidth: partial.list?.table?.path?.minWidth ?? base.list.table.path.minWidth,\n },\n },\n },\n selector: {\n cd: {\n prompt: partial.selector?.cd?.prompt ?? base.selector.cd.prompt,\n surface: partial.selector?.cd?.surface ?? base.selector.cd.surface,\n tmuxPopupOpts: partial.selector?.cd?.tmuxPopupOpts ?? base.selector.cd.tmuxPopupOpts,\n fzf: {\n extraArgs: partial.selector?.cd?.fzf?.extraArgs\n ? [...partial.selector.cd.fzf.extraArgs]\n : [...base.selector.cd.fzf.extraArgs],\n },\n },\n },\n }\n}\n\nconst configPathExists = async (filePath: string): Promise<boolean> => {\n try {\n await access(filePath, fsConstants.F_OK)\n return true\n } catch {\n return false\n }\n}\n\nconst resolveLocalConfigPath = (directory: string): string => {\n return join(directory, ...LOCAL_CONFIG_PATH_SEGMENTS)\n}\n\nconst resolveGlobalConfigPath = (): string => {\n const xdgConfigHome = process.env.XDG_CONFIG_HOME\n if (typeof xdgConfigHome === \"string\" && xdgConfigHome.length > 0) {\n return join(resolve(xdgConfigHome), ...GLOBAL_CONFIG_PATH_SEGMENTS)\n }\n return join(homedir(), \".config\", ...GLOBAL_CONFIG_PATH_SEGMENTS)\n}\n\nconst resolveExistingConfigFiles = async ({\n cwd,\n repoRoot,\n}: {\n readonly cwd: string\n readonly repoRoot: string\n}): Promise<ReadonlyArray<string>> => {\n const searchDirectories = await collectConfigSearchDirectories(cwd)\n const localCandidates = searchDirectories.map((directory) => resolveLocalConfigPath(directory))\n const repoRootCandidate = resolveLocalConfigPath(repoRoot)\n const globalCandidate = resolveGlobalConfigPath()\n const lowToHighCandidates = [globalCandidate, repoRootCandidate, ...localCandidates]\n\n const deduped = new Map<string, { path: string; order: number }>()\n for (const [order, candidate] of lowToHighCandidates.entries()) {\n if ((await configPathExists(candidate)) !== true) {\n continue\n }\n const canonical = await realpath(candidate).catch(() => resolve(candidate))\n deduped.set(canonical, {\n path: candidate,\n order,\n })\n }\n\n return [...deduped.values()].sort((a, b) => a.order - b.order).map((entry) => entry.path)\n}\n\nconst validateWorktreeRoot = async ({\n repoRoot,\n config,\n}: {\n readonly repoRoot: string\n readonly config: ResolvedConfig\n}): Promise<void> => {\n const rawWorktreeRoot = config.paths.worktreeRoot\n const resolvedWorktreeRoot = isAbsolute(rawWorktreeRoot)\n ? resolve(rawWorktreeRoot)\n : resolve(repoRoot, rawWorktreeRoot)\n\n try {\n const stat = await lstat(resolvedWorktreeRoot)\n if (stat.isDirectory() !== true) {\n throwInvalidConfig({\n file: \"<resolved>\",\n keyPath: \"paths.worktreeRoot\",\n reason: \"must not point to an existing file\",\n })\n }\n } catch (error) {\n const nodeError = error as NodeJS.ErrnoException\n if (nodeError.code === \"ENOENT\") {\n return\n }\n throw error\n }\n}\n\nconst parseConfigFile = async (file: string): Promise<PartialConfig> => {\n const rawContent = await readFile(file, \"utf8\")\n let parsed: unknown\n try {\n parsed = parse(rawContent)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throwInvalidConfig({\n file,\n keyPath: \"<root>\",\n reason: message,\n })\n }\n return validatePartialConfig({\n rawConfig: parsed,\n ctx: { file },\n })\n}\n\nconst cloneDefaultConfig = (): ResolvedConfig => {\n return mergeConfig(DEFAULT_CONFIG, {})\n}\n\nexport const loadResolvedConfig = async ({\n cwd,\n repoRoot,\n}: LoadResolvedConfigInput): Promise<LoadResolvedConfigResult> => {\n const files = await resolveExistingConfigFiles({ cwd, repoRoot })\n let config = cloneDefaultConfig()\n for (const file of files) {\n const partial = await parseConfigFile(file)\n config = mergeConfig(config, partial)\n }\n\n await validateWorktreeRoot({\n repoRoot,\n config,\n })\n\n return {\n config,\n loadedFiles: files,\n }\n}\n","import { execa } from \"execa\"\nimport { createCliError } from \"../core/errors\"\n\ntype ExecaFailure = Error & {\n readonly stderr?: string\n readonly stdout?: string\n readonly shortMessage?: string\n readonly exitCode?: number\n}\n\nexport type RunGitCommandInput = {\n readonly cwd: string\n readonly args: readonly string[]\n readonly reject?: boolean\n}\n\nexport type RunGitCommandOutput = {\n readonly stdout: string\n readonly stderr: string\n readonly exitCode: number\n}\n\nexport const runGitCommand = async ({ cwd, args, reject = true }: RunGitCommandInput): Promise<RunGitCommandOutput> => {\n try {\n const result = await execa(\"git\", [...args], {\n cwd,\n reject,\n })\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode ?? 0,\n }\n } catch (error) {\n const execaError = error as ExecaFailure\n throw createCliError(\"GIT_COMMAND_FAILED\", {\n message: \"git command failed\",\n details: {\n command: [\"git\", ...args],\n cwd,\n exitCode: execaError.exitCode,\n stdout: execaError.stdout ?? \"\",\n stderr: execaError.stderr ?? \"\",\n shortMessage: execaError.shortMessage ?? execaError.message,\n },\n cause: error,\n })\n }\n}\n\nexport const doesGitRefExist = async (cwd: string, ref: string): Promise<boolean> => {\n const result = await runGitCommand({\n cwd,\n args: [\"show-ref\", \"--verify\", \"--quiet\", ref],\n reject: false,\n })\n return result.exitCode === 0\n}\n","import { createHash } from \"node:crypto\"\nimport { dirname, isAbsolute, join, normalize, relative, resolve, sep } from \"node:path\"\nimport { runGitCommand } from \"../git/exec\"\nimport { createCliError } from \"./errors\"\n\nexport type RepoContext = {\n readonly repoRoot: string\n readonly currentWorktreeRoot: string\n readonly gitCommonDir: string\n}\n\nconst GIT_DIR_NAME = \".git\"\nconst DEFAULT_WORKTREE_ROOT = \".worktree\"\nconst WORKTREE_ID_HASH_LENGTH = 12\nconst WORKTREE_ID_SLUG_MAX_LENGTH = 48\n\nconst resolveRepoRootFromCommonDir = ({\n currentWorktreeRoot,\n gitCommonDir,\n}: {\n readonly currentWorktreeRoot: string\n readonly gitCommonDir: string\n}): string => {\n if (gitCommonDir.endsWith(`/${GIT_DIR_NAME}`)) {\n return dirname(gitCommonDir)\n }\n\n if (gitCommonDir.endsWith(`\\\\${GIT_DIR_NAME}`)) {\n return dirname(gitCommonDir)\n }\n\n return currentWorktreeRoot\n}\n\nexport const resolveRepoContext = async (cwd: string): Promise<RepoContext> => {\n const toplevelResult = await runGitCommand({\n cwd,\n args: [\"rev-parse\", \"--show-toplevel\"],\n reject: false,\n })\n\n if (toplevelResult.exitCode !== 0) {\n throw createCliError(\"NOT_GIT_REPOSITORY\", {\n message: \"Current directory is not inside a Git repository\",\n details: { cwd },\n })\n }\n\n const currentWorktreeRoot = toplevelResult.stdout.trim()\n const commonDirResult = await runGitCommand({\n cwd,\n args: [\"rev-parse\", \"--path-format=absolute\", \"--git-common-dir\"],\n reject: false,\n })\n const gitCommonDir =\n commonDirResult.exitCode === 0 ? commonDirResult.stdout.trim() : join(currentWorktreeRoot, GIT_DIR_NAME)\n\n return {\n repoRoot: resolveRepoRootFromCommonDir({ currentWorktreeRoot, gitCommonDir }),\n currentWorktreeRoot,\n gitCommonDir,\n }\n}\n\nexport const getWorktreeRootPath = (\n repoRoot: string,\n configuredWorktreeRoot: string = DEFAULT_WORKTREE_ROOT,\n): string => {\n if (isAbsolute(configuredWorktreeRoot)) {\n return resolve(configuredWorktreeRoot)\n }\n return resolve(repoRoot, configuredWorktreeRoot)\n}\n\nexport const getWorktreeMetaRootPath = (repoRoot: string): string => {\n return join(repoRoot, \".vde\", \"worktree\")\n}\n\nexport const getHooksDirectoryPath = (repoRoot: string): string => {\n return join(getWorktreeMetaRootPath(repoRoot), \"hooks\")\n}\n\nexport const getLogsDirectoryPath = (repoRoot: string): string => {\n return join(getWorktreeMetaRootPath(repoRoot), \"logs\")\n}\n\nexport const getLocksDirectoryPath = (repoRoot: string): string => {\n return join(getWorktreeMetaRootPath(repoRoot), \"locks\")\n}\n\nexport const getStateDirectoryPath = (repoRoot: string): string => {\n return join(getWorktreeMetaRootPath(repoRoot), \"state\")\n}\n\nexport const branchToWorktreeId = (branch: string): string => {\n const slug =\n branch\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, WORKTREE_ID_SLUG_MAX_LENGTH) || \"branch\"\n const hash = createHash(\"sha256\").update(branch).digest(\"hex\").slice(0, WORKTREE_ID_HASH_LENGTH)\n return `${slug}--${hash}`\n}\n\nexport const branchToWorktreePath = (\n repoRoot: string,\n branch: string,\n configuredWorktreeRoot: string = DEFAULT_WORKTREE_ROOT,\n): string => {\n const worktreeRoot = getWorktreeRootPath(repoRoot, configuredWorktreeRoot)\n const targetPath = join(worktreeRoot, ...branch.split(\"/\"))\n return ensurePathInsideRoot({\n rootPath: worktreeRoot,\n path: targetPath,\n message: \"Path is outside managed worktree root\",\n })\n}\n\nexport const ensurePathInsideRoot = ({\n rootPath,\n path,\n message = \"Path is outside allowed root\",\n}: {\n readonly rootPath: string\n readonly path: string\n readonly message?: string\n}): string => {\n const rel = relative(rootPath, path)\n if (rel === \"\") {\n return path\n }\n if (rel === \"..\" || rel.startsWith(`..${sep}`)) {\n throw createCliError(\"PATH_OUTSIDE_REPO\", {\n message,\n details: { rootPath, path },\n })\n }\n return path\n}\n\nexport const ensurePathInsideRepo = ({\n repoRoot,\n path,\n}: {\n readonly repoRoot: string\n readonly path: string\n}): string => {\n return ensurePathInsideRoot({\n rootPath: repoRoot,\n path,\n message: \"Path is outside repository root\",\n })\n}\n\nexport const resolveRepoRelativePath = ({\n repoRoot,\n relativePath,\n}: {\n readonly repoRoot: string\n readonly relativePath: string\n}): string => {\n if (isAbsolute(relativePath)) {\n throw createCliError(\"ABSOLUTE_PATH_NOT_ALLOWED\", {\n message: \"Absolute path is not allowed\",\n details: { path: relativePath },\n })\n }\n const normalizedRelative = normalize(relativePath)\n const resolved = resolve(repoRoot, normalizedRelative)\n return ensurePathInsideRepo({\n repoRoot,\n path: resolved,\n })\n}\n\nexport const resolvePathFromCwd = ({ cwd, path }: { readonly cwd: string; readonly path: string }): string => {\n if (isAbsolute(path)) {\n return path\n }\n return resolve(cwd, path)\n}\n\nexport const isManagedWorktreePath = ({\n worktreePath,\n managedWorktreeRoot,\n}: {\n readonly worktreePath: string\n readonly managedWorktreeRoot: string\n}): boolean => {\n const rel = relative(managedWorktreeRoot, worktreePath)\n if (rel === \"\" || rel === \".\" || rel === \"..\") {\n return false\n }\n return rel.startsWith(`..${sep}`) !== true\n}\n","import { constants as fsConstants } from \"node:fs\"\nimport { access, appendFile, mkdir } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport { execa } from \"execa\"\nimport { DEFAULT_HOOK_TIMEOUT_MS } from \"./constants\"\nimport { CliError, createCliError } from \"./errors\"\nimport { getHooksDirectoryPath, getLogsDirectoryPath } from \"./paths\"\n\ntype HookPhase = \"pre\" | \"post\"\n\nexport type HookExecutionContext = {\n readonly repoRoot: string\n readonly action: string\n readonly branch?: string | null\n readonly worktreePath?: string\n readonly timeoutMs?: number\n readonly enabled: boolean\n readonly stderr: (line: string) => void\n readonly strictPostHooks?: boolean\n readonly extraEnv?: Record<string, string>\n}\n\ntype HookExecutionError = Error & {\n readonly exitCode?: number\n readonly stderr?: string\n readonly code?: string\n}\n\ntype HookExecutionResult = {\n readonly exitCode: number\n readonly stderr: string\n readonly timedOut: boolean\n readonly startedAt: string\n readonly endedAt: string\n}\n\nconst nowTimestamp = (): string => {\n return new Date().toISOString().replace(/[^\\d]/g, \"\").slice(0, 14)\n}\n\nconst toLogFileName = ({ action, branch }: { readonly action: string; readonly branch?: string | null }): string => {\n const safeBranch = typeof branch === \"string\" && branch.length > 0 ? branch.replace(/[^\\w.-]/g, \"_\") : \"none\"\n return `${nowTimestamp()}_${action}_${safeBranch}.log`\n}\n\nconst hookPath = (repoRoot: string, hookName: string): string => {\n return join(getHooksDirectoryPath(repoRoot), hookName)\n}\n\nconst appendHookLog = async ({\n repoRoot,\n action,\n branch,\n content,\n}: {\n readonly repoRoot: string\n readonly action: string\n readonly branch?: string | null\n readonly content: string\n}): Promise<void> => {\n const logsDir = getLogsDirectoryPath(repoRoot)\n await mkdir(logsDir, { recursive: true })\n const logPath = join(logsDir, toLogFileName({ action, branch }))\n await appendFile(logPath, content, \"utf8\")\n}\n\nconst ensureHookExists = async ({\n path,\n hookName,\n requireExists,\n}: {\n readonly path: string\n readonly hookName: string\n readonly requireExists: boolean\n}): Promise<boolean> => {\n try {\n await access(path, fsConstants.F_OK)\n return true\n } catch {\n if (requireExists) {\n throw createCliError(\"HOOK_NOT_FOUND\", {\n message: `Hook not found: ${hookName}`,\n details: { hook: hookName, path },\n })\n }\n return false\n }\n}\n\nconst ensureHookExecutable = async ({\n path,\n hookName,\n}: {\n readonly path: string\n readonly hookName: string\n}): Promise<void> => {\n try {\n await access(path, fsConstants.X_OK)\n } catch {\n throw createCliError(\"HOOK_NOT_EXECUTABLE\", {\n message: `Hook is not executable: ${hookName}`,\n details: { hook: hookName, path },\n })\n }\n}\n\nconst executeHookProcess = async ({\n path,\n args,\n context,\n}: {\n readonly path: string\n readonly args: readonly string[]\n readonly context: HookExecutionContext\n}): Promise<HookExecutionResult> => {\n const startedAt = new Date().toISOString()\n const result = await execa(path, [...args], {\n cwd: context.worktreePath ?? context.repoRoot,\n env: {\n ...process.env,\n WT_REPO_ROOT: context.repoRoot,\n WT_ACTION: context.action,\n WT_BRANCH: context.branch ?? \"\",\n WT_WORKTREE_PATH: context.worktreePath ?? \"\",\n WT_IS_TTY: process.stdout.isTTY === true ? \"1\" : \"0\",\n WT_TOOL: \"vde-worktree\",\n ...(context.extraEnv ?? {}),\n },\n timeout: context.timeoutMs ?? DEFAULT_HOOK_TIMEOUT_MS,\n reject: false,\n })\n const endedAt = new Date().toISOString()\n return {\n exitCode: result.exitCode ?? 0,\n stderr: result.stderr ?? \"\",\n timedOut: result.timedOut === true,\n startedAt,\n endedAt,\n }\n}\n\nconst writeHookLog = async ({\n repoRoot,\n action,\n branch,\n hookName,\n phase,\n result,\n}: {\n readonly repoRoot: string\n readonly action: string\n readonly branch?: string | null\n readonly hookName: string\n readonly phase: HookPhase\n readonly result: HookExecutionResult\n}): Promise<void> => {\n const logContent = [\n `hook=${hookName}`,\n `phase=${phase}`,\n `start=${result.startedAt}`,\n `end=${result.endedAt}`,\n `exitCode=${String(result.exitCode)}`,\n `timedOut=${result.timedOut ? \"1\" : \"0\"}`,\n `stderr=${result.stderr}`,\n \"\",\n ].join(\"\\n\")\n await appendHookLog({\n repoRoot,\n action,\n branch,\n content: logContent,\n })\n}\n\nconst shouldIgnorePostHookFailure = ({\n phase,\n context,\n}: {\n readonly phase: HookPhase\n readonly context: HookExecutionContext\n}): boolean => {\n return phase === \"post\" && context.strictPostHooks !== true\n}\n\nconst handleIgnoredPostHookFailure = ({\n context,\n hookName,\n message,\n}: {\n readonly context: HookExecutionContext\n readonly hookName: string\n readonly message?: string\n}): void => {\n context.stderr(message ?? `Hook failed: ${hookName}`)\n}\n\nconst runHook = async ({\n phase,\n hookName,\n args,\n context,\n requireExists = false,\n}: {\n readonly phase: HookPhase\n readonly hookName: string\n readonly args: readonly string[]\n readonly context: HookExecutionContext\n readonly requireExists?: boolean\n}): Promise<void> => {\n if (context.enabled !== true) {\n return\n }\n\n const path = hookPath(context.repoRoot, hookName)\n const exists = await ensureHookExists({\n path,\n hookName,\n requireExists,\n })\n if (exists !== true) {\n return\n }\n\n await ensureHookExecutable({\n path,\n hookName,\n })\n\n try {\n const result = await executeHookProcess({\n path,\n args,\n context,\n })\n await writeHookLog({\n repoRoot: context.repoRoot,\n action: context.action,\n branch: context.branch,\n hookName,\n phase,\n result,\n })\n\n if (result.timedOut) {\n throw createCliError(\"HOOK_TIMEOUT\", {\n message: `Hook timed out: ${hookName}`,\n details: {\n hook: hookName,\n timeoutMs: context.timeoutMs ?? DEFAULT_HOOK_TIMEOUT_MS,\n exitCode: result.exitCode,\n stderr: result.stderr,\n },\n })\n }\n\n if (result.exitCode === 0) {\n return\n }\n\n const message = `Hook failed: ${hookName} (exitCode=${String(result.exitCode)})`\n if (shouldIgnorePostHookFailure({ phase, context })) {\n handleIgnoredPostHookFailure({\n context,\n hookName,\n message,\n })\n return\n }\n\n throw createCliError(\"HOOK_FAILED\", {\n message,\n details: {\n hook: hookName,\n exitCode: result.exitCode,\n stderr: result.stderr,\n },\n })\n } catch (error) {\n if (error instanceof CliError) {\n throw error\n }\n\n const hookError = error as HookExecutionError\n if (hookError.code === \"ETIMEDOUT\" || hookError.code === \"ERR_EXECA_TIMEOUT\") {\n throw createCliError(\"HOOK_TIMEOUT\", {\n message: `Hook timed out: ${hookName}`,\n details: {\n hook: hookName,\n timeoutMs: context.timeoutMs ?? DEFAULT_HOOK_TIMEOUT_MS,\n stderr: hookError.stderr ?? \"\",\n },\n cause: error,\n })\n }\n\n if (shouldIgnorePostHookFailure({ phase, context })) {\n handleIgnoredPostHookFailure({\n context,\n hookName,\n })\n return\n }\n\n throw createCliError(\"HOOK_FAILED\", {\n message: `Hook failed: ${hookName}`,\n details: {\n hook: hookName,\n stderr: hookError.stderr ?? hookError.message,\n },\n cause: error,\n })\n }\n}\n\nexport const runPreHook = async ({\n name,\n context,\n}: {\n readonly name: string\n readonly context: HookExecutionContext\n}): Promise<void> => {\n await runHook({\n phase: \"pre\",\n hookName: `pre-${name}`,\n args: [],\n context,\n })\n}\n\nexport const runPostHook = async ({\n name,\n context,\n}: {\n readonly name: string\n readonly context: HookExecutionContext\n}): Promise<void> => {\n await runHook({\n phase: \"post\",\n hookName: `post-${name}`,\n args: [],\n context,\n })\n}\n\nexport const invokeHook = async ({\n hookName,\n args,\n context,\n}: {\n readonly hookName: string\n readonly args: readonly string[]\n readonly context: HookExecutionContext\n}): Promise<void> => {\n await runHook({\n phase: hookName.startsWith(\"pre-\") ? \"pre\" : \"post\",\n hookName,\n args,\n context,\n requireExists: true,\n })\n}\n","import { access, chmod, mkdir, readFile, writeFile } from \"node:fs/promises\"\nimport { constants as fsConstants } from \"node:fs\"\nimport { join, relative, sep } from \"node:path\"\nimport {\n getHooksDirectoryPath,\n getLocksDirectoryPath,\n getLogsDirectoryPath,\n getStateDirectoryPath,\n getWorktreeMetaRootPath,\n} from \"./paths\"\n\nconst EXCLUDE_MARKER = \"# vde-worktree (managed)\"\n\nconst DEFAULT_HOOKS: ReadonlyArray<{ name: string; lines: string[] }> = [\n {\n name: \"post-new\",\n lines: [\n \"#!/usr/bin/env bash\",\n \"set -eu\",\n \"\",\n \"# example:\",\n \"# vde-worktree copy .envrc .claude/settings.local.json\",\n \"\",\n \"exit 0\",\n ],\n },\n {\n name: \"post-switch\",\n lines: [\"#!/usr/bin/env bash\", \"set -eu\", \"\", \"# example:\", \"# vde-worktree link .envrc\", \"\", \"exit 0\"],\n },\n] as const\n\nexport type InitResult = {\n readonly alreadyInitialized: boolean\n}\n\nconst createHookTemplate = async (hooksDir: string, name: string, lines: readonly string[]): Promise<void> => {\n const targetPath = join(hooksDir, name)\n try {\n await access(targetPath, fsConstants.F_OK)\n return\n } catch {\n await writeFile(targetPath, `${lines.join(\"\\n\")}\\n`, \"utf8\")\n await chmod(targetPath, 0o755)\n }\n}\n\nconst isPathInsideOrEqual = ({\n rootPath,\n candidatePath,\n}: {\n readonly rootPath: string\n readonly candidatePath: string\n}): boolean => {\n const rel = relative(rootPath, candidatePath)\n if (rel.length === 0) {\n return true\n }\n return rel !== \"..\" && rel.startsWith(`..${sep}`) !== true\n}\n\nconst toExcludeEntry = ({\n repoRoot,\n managedWorktreeRoot,\n}: {\n readonly repoRoot: string\n readonly managedWorktreeRoot: string\n}): string | null => {\n if (\n isPathInsideOrEqual({\n rootPath: repoRoot,\n candidatePath: managedWorktreeRoot,\n }) !== true\n ) {\n return null\n }\n\n const rel = relative(repoRoot, managedWorktreeRoot).split(sep).join(\"/\")\n const normalized = rel.length === 0 ? \".\" : rel\n return normalized.endsWith(\"/\") ? normalized : `${normalized}/`\n}\n\nconst ensureExcludeBlock = async ({\n repoRoot,\n managedWorktreeRoot,\n}: {\n readonly repoRoot: string\n readonly managedWorktreeRoot: string\n}): Promise<void> => {\n const managedEntry = toExcludeEntry({ repoRoot, managedWorktreeRoot })\n if (managedEntry === null) {\n return\n }\n\n const managedExcludeBlock = `${EXCLUDE_MARKER}\\n${managedEntry}\\n.vde/worktree/\\n`\n const excludePath = join(repoRoot, \".git\", \"info\", \"exclude\")\n let current = \"\"\n try {\n current = await readFile(excludePath, \"utf8\")\n } catch {\n current = \"\"\n }\n\n if (current.includes(managedExcludeBlock)) {\n return\n }\n\n const normalizedCurrent = current.endsWith(\"\\n\") || current.length === 0 ? current : `${current}\\n`\n await writeFile(excludePath, `${normalizedCurrent}${managedExcludeBlock}`, \"utf8\")\n}\n\nexport const isInitialized = async (repoRoot: string): Promise<boolean> => {\n try {\n await access(getWorktreeMetaRootPath(repoRoot), fsConstants.F_OK)\n return true\n } catch {\n return false\n }\n}\n\nexport const initializeRepository = async ({\n repoRoot,\n managedWorktreeRoot,\n}: {\n readonly repoRoot: string\n readonly managedWorktreeRoot: string\n}): Promise<InitResult> => {\n const wasInitialized = await isInitialized(repoRoot)\n await mkdir(managedWorktreeRoot, { recursive: true })\n await mkdir(getHooksDirectoryPath(repoRoot), { recursive: true })\n await mkdir(getLogsDirectoryPath(repoRoot), { recursive: true })\n await mkdir(getLocksDirectoryPath(repoRoot), { recursive: true })\n await mkdir(getStateDirectoryPath(repoRoot), { recursive: true })\n await ensureExcludeBlock({ repoRoot, managedWorktreeRoot })\n\n for (const hook of DEFAULT_HOOKS) {\n await createHookTemplate(getHooksDirectoryPath(repoRoot), hook.name, hook.lines)\n }\n\n return {\n alreadyInitialized: wasInitialized,\n }\n}\n","import { mkdir, open, readFile, rename, rm, writeFile } from \"node:fs/promises\"\nimport { dirname } from \"node:path\"\n\nexport type ParsedJsonRecord<T> = {\n readonly valid: boolean\n readonly record: T | null\n}\n\nexport const parseJsonRecord = <T>({\n content,\n schemaVersion,\n validate,\n}: {\n readonly content: string\n readonly schemaVersion: number\n readonly validate: (candidate: Partial<T>) => candidate is T\n}): ParsedJsonRecord<T> => {\n try {\n const parsed = JSON.parse(content) as Partial<T> & { readonly schemaVersion?: number }\n if (parsed.schemaVersion !== schemaVersion || validate(parsed) !== true) {\n return {\n valid: false,\n record: null,\n }\n }\n return {\n valid: true,\n record: parsed,\n }\n } catch {\n return {\n valid: false,\n record: null,\n }\n }\n}\n\nexport const readJsonRecord = async <T>({\n path,\n schemaVersion,\n validate,\n}: {\n readonly path: string\n readonly schemaVersion: number\n readonly validate: (candidate: Partial<T>) => candidate is T\n}): Promise<ParsedJsonRecord<T> & { readonly path: string; readonly exists: boolean }> => {\n try {\n const content = await readFile(path, \"utf8\")\n return {\n path,\n exists: true,\n ...parseJsonRecord({\n content,\n schemaVersion,\n validate,\n }),\n }\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code\n if (code === \"ENOENT\") {\n return {\n path,\n exists: false,\n valid: true,\n record: null,\n }\n }\n return {\n path,\n exists: true,\n valid: false,\n record: null,\n }\n }\n}\n\nexport const writeJsonAtomically = async ({\n filePath,\n payload,\n ensureDir = false,\n}: {\n readonly filePath: string\n readonly payload: Record<string, unknown>\n readonly ensureDir?: boolean\n}): Promise<void> => {\n if (ensureDir) {\n await mkdir(dirname(filePath), { recursive: true })\n }\n const tmpPath = `${filePath}.tmp-${String(process.pid)}-${String(Date.now())}`\n try {\n await writeFile(tmpPath, `${JSON.stringify(payload)}\\n`, \"utf8\")\n await rename(tmpPath, filePath)\n } catch (error) {\n try {\n await rm(tmpPath, { force: true })\n } catch {\n // best-effort cleanup; keep original write error\n }\n throw error\n }\n}\n\nexport const writeJsonExclusively = async ({\n path,\n payload,\n}: {\n readonly path: string\n readonly payload: Record<string, unknown>\n}): Promise<boolean> => {\n let handle: Awaited<ReturnType<typeof open>> | undefined\n try {\n handle = await open(path, \"wx\")\n await handle.writeFile(`${JSON.stringify(payload)}\\n`, \"utf8\")\n return true\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code\n if (code === \"EEXIST\") {\n return false\n }\n throw error\n } finally {\n if (handle !== undefined) {\n await handle.close()\n }\n }\n}\n","import { constants as fsConstants } from \"node:fs\"\nimport { access, readFile, rm } from \"node:fs/promises\"\nimport { hostname } from \"node:os\"\nimport { join } from \"node:path\"\nimport { DEFAULT_LOCK_TIMEOUT_MS, DEFAULT_STALE_LOCK_TTL_SECONDS } from \"./constants\"\nimport { createCliError } from \"./errors\"\nimport { parseJsonRecord, writeJsonExclusively } from \"./json-storage\"\nimport { getStateDirectoryPath } from \"./paths\"\n\ntype RepoLockFileSchema = {\n readonly schemaVersion: 1\n readonly owner: string\n readonly command: string\n readonly pid: number\n readonly host: string\n readonly startedAt: string\n}\n\ntype AcquireRepoLockOptions = {\n readonly repoRoot: string\n readonly command: string\n readonly timeoutMs?: number\n readonly staleLockTTLSeconds?: number\n}\n\ntype RepoLockHandle = {\n release: () => Promise<void>\n}\n\nconst sleep = async (ms: number): Promise<void> => {\n await new Promise<void>((resolve) => {\n setTimeout(resolve, ms)\n })\n}\n\nconst isProcessAlive = (pid: number): boolean => {\n if (pid <= 0 || Number.isFinite(pid) !== true) {\n return false\n }\n\n try {\n process.kill(pid, 0)\n return true\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code\n if (code === \"ESRCH\") {\n return false\n }\n return true\n }\n}\n\nconst isRepoLockFileSchema = (parsed: Partial<RepoLockFileSchema>): parsed is RepoLockFileSchema => {\n return (\n typeof parsed.owner === \"string\" &&\n typeof parsed.command === \"string\" &&\n typeof parsed.pid === \"number\" &&\n typeof parsed.host === \"string\" &&\n typeof parsed.startedAt === \"string\"\n )\n}\n\nconst lockFilePath = async (repoRoot: string): Promise<string> => {\n const stateDir = getStateDirectoryPath(repoRoot)\n try {\n await access(stateDir, fsConstants.F_OK)\n return join(stateDir, \"repo.lock\")\n } catch {\n return join(repoRoot, \".git\", \"vde-worktree.init.lock\")\n }\n}\n\nconst buildLockPayload = (command: string): RepoLockFileSchema => {\n return {\n schemaVersion: 1,\n owner: \"vde-worktree\",\n command,\n pid: process.pid,\n host: hostname(),\n startedAt: new Date().toISOString(),\n }\n}\n\nconst canRecoverStaleLock = ({\n lock,\n staleLockTTLSeconds,\n}: {\n readonly lock: RepoLockFileSchema | null\n readonly staleLockTTLSeconds: number\n}): boolean => {\n if (lock === null) {\n return true\n }\n\n const startedAtMs = Date.parse(lock.startedAt)\n if (Number.isFinite(startedAtMs) !== true) {\n return true\n }\n\n const staleAtMs = startedAtMs + staleLockTTLSeconds * 1000\n if (staleAtMs > Date.now()) {\n return false\n }\n\n if (lock.host === hostname() && isProcessAlive(lock.pid)) {\n return false\n }\n\n return true\n}\n\nexport const acquireRepoLock = async ({\n repoRoot,\n command,\n timeoutMs = DEFAULT_LOCK_TIMEOUT_MS,\n staleLockTTLSeconds = DEFAULT_STALE_LOCK_TTL_SECONDS,\n}: AcquireRepoLockOptions): Promise<RepoLockHandle> => {\n const path = await lockFilePath(repoRoot)\n const startAt = Date.now()\n const payload = buildLockPayload(command)\n\n while (Date.now() - startAt <= timeoutMs) {\n const created = await writeJsonExclusively({\n path,\n payload,\n })\n if (created) {\n return {\n release: async (): Promise<void> => {\n try {\n await rm(path, { force: true })\n } catch {\n return\n }\n },\n }\n }\n\n let lockContent = \"\"\n try {\n lockContent = await readFile(path, \"utf8\")\n } catch {\n await sleep(100)\n continue\n }\n\n const parsed = parseJsonRecord<RepoLockFileSchema>({\n content: lockContent,\n schemaVersion: 1,\n validate: isRepoLockFileSchema,\n })\n if (canRecoverStaleLock({ lock: parsed.record, staleLockTTLSeconds })) {\n try {\n await rm(path, { force: true })\n } catch {\n throw createCliError(\"REPO_LOCK_STALE_RECOVERY_FAILED\", {\n message: \"Failed to recover stale repo lock\",\n details: { path },\n })\n }\n continue\n }\n\n await sleep(100)\n }\n\n throw createCliError(\"REPO_LOCK_TIMEOUT\", {\n message: \"Timed out while acquiring repo lock\",\n details: { path, timeoutMs },\n })\n}\n\nexport const withRepoLock = async <T>(options: AcquireRepoLockOptions, task: () => Promise<T>): Promise<T> => {\n const handle = await acquireRepoLock(options)\n try {\n return await task()\n } finally {\n await handle.release()\n }\n}\n\nexport const readNumberFromEnvOrDefault = ({\n rawValue,\n defaultValue,\n}: {\n readonly rawValue: unknown\n readonly defaultValue: number\n}): number => {\n if (typeof rawValue !== \"number\" || Number.isFinite(rawValue) !== true) {\n return defaultValue\n }\n return rawValue\n}\n","import { constants as fsConstants } from \"node:fs\"\nimport { access, rm } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport { readJsonRecord, writeJsonAtomically } from \"./json-storage\"\nimport { branchToWorktreeId, getStateDirectoryPath } from \"./paths\"\n\nexport type WorktreeMergeLifecycleRecord = {\n readonly schemaVersion: 2\n readonly branch: string\n readonly worktreeId: string\n readonly baseBranch: string\n readonly everDiverged: boolean\n readonly lastDivergedHead: string | null\n readonly createdAt: string\n readonly updatedAt: string\n}\n\ntype ParsedLifecycle = {\n readonly valid: boolean\n readonly record: WorktreeMergeLifecycleRecord | null\n}\n\nconst lifecycleFilePath = (repoRoot: string, branch: string): string => {\n return join(getStateDirectoryPath(repoRoot), \"branches\", `${branchToWorktreeId(branch)}.json`)\n}\n\nconst hasStateDirectory = async (repoRoot: string): Promise<boolean> => {\n try {\n await access(getStateDirectoryPath(repoRoot), fsConstants.F_OK)\n return true\n } catch {\n return false\n }\n}\n\nconst isWorktreeMergeLifecycleRecord = (\n parsed: Partial<WorktreeMergeLifecycleRecord>,\n): parsed is WorktreeMergeLifecycleRecord => {\n const isLastDivergedHeadValid =\n parsed.lastDivergedHead === null ||\n (typeof parsed.lastDivergedHead === \"string\" && parsed.lastDivergedHead.length > 0)\n\n return (\n typeof parsed.branch === \"string\" &&\n typeof parsed.worktreeId === \"string\" &&\n typeof parsed.baseBranch === \"string\" &&\n typeof parsed.everDiverged === \"boolean\" &&\n isLastDivergedHeadValid &&\n typeof parsed.createdAt === \"string\" &&\n typeof parsed.updatedAt === \"string\"\n )\n}\n\nexport const readWorktreeMergeLifecycle = async ({\n repoRoot,\n branch,\n}: {\n readonly repoRoot: string\n readonly branch: string\n}): Promise<ParsedLifecycle & { path: string; exists: boolean }> => {\n const path = lifecycleFilePath(repoRoot, branch)\n return readJsonRecord<WorktreeMergeLifecycleRecord>({\n path,\n schemaVersion: 2,\n validate: isWorktreeMergeLifecycleRecord,\n })\n}\n\nexport const upsertWorktreeMergeLifecycle = async ({\n repoRoot,\n branch,\n baseBranch,\n observedDivergedHead,\n}: {\n readonly repoRoot: string\n readonly branch: string\n readonly baseBranch: string\n readonly observedDivergedHead: string | null\n}): Promise<WorktreeMergeLifecycleRecord> => {\n const normalizedObservedHead =\n typeof observedDivergedHead === \"string\" && observedDivergedHead.length > 0 ? observedDivergedHead : null\n\n if ((await hasStateDirectory(repoRoot)) !== true) {\n const now = new Date().toISOString()\n return {\n schemaVersion: 2,\n branch,\n worktreeId: branchToWorktreeId(branch),\n baseBranch,\n everDiverged: normalizedObservedHead !== null,\n lastDivergedHead: normalizedObservedHead,\n createdAt: now,\n updatedAt: now,\n }\n }\n\n const current = await readWorktreeMergeLifecycle({ repoRoot, branch })\n if (\n current.valid &&\n current.record !== null &&\n current.record.baseBranch === baseBranch &&\n normalizedObservedHead === null\n ) {\n return current.record\n }\n\n const now = new Date().toISOString()\n const everDiverged = current.record?.everDiverged === true || normalizedObservedHead !== null\n const lastDivergedHead = normalizedObservedHead ?? current.record?.lastDivergedHead ?? null\n const next: WorktreeMergeLifecycleRecord = {\n schemaVersion: 2,\n branch,\n worktreeId: branchToWorktreeId(branch),\n baseBranch,\n everDiverged,\n lastDivergedHead,\n createdAt: current.record?.createdAt ?? now,\n updatedAt: now,\n }\n await writeJsonAtomically({\n filePath: current.path,\n payload: next,\n ensureDir: true,\n })\n return next\n}\n\nexport const moveWorktreeMergeLifecycle = async ({\n repoRoot,\n fromBranch,\n toBranch,\n baseBranch,\n observedDivergedHead,\n}: {\n readonly repoRoot: string\n readonly fromBranch: string\n readonly toBranch: string\n readonly baseBranch: string\n readonly observedDivergedHead: string | null\n}): Promise<WorktreeMergeLifecycleRecord> => {\n const normalizedObservedHead =\n typeof observedDivergedHead === \"string\" && observedDivergedHead.length > 0 ? observedDivergedHead : null\n\n if ((await hasStateDirectory(repoRoot)) !== true) {\n const now = new Date().toISOString()\n return {\n schemaVersion: 2,\n branch: toBranch,\n worktreeId: branchToWorktreeId(toBranch),\n baseBranch,\n everDiverged: normalizedObservedHead !== null,\n lastDivergedHead: normalizedObservedHead,\n createdAt: now,\n updatedAt: now,\n }\n }\n\n const source = await readWorktreeMergeLifecycle({ repoRoot, branch: fromBranch })\n const targetPath = lifecycleFilePath(repoRoot, toBranch)\n const now = new Date().toISOString()\n const everDiverged = source.record?.everDiverged === true || normalizedObservedHead !== null\n const lastDivergedHead = normalizedObservedHead ?? source.record?.lastDivergedHead ?? null\n const next: WorktreeMergeLifecycleRecord = {\n schemaVersion: 2,\n branch: toBranch,\n worktreeId: branchToWorktreeId(toBranch),\n baseBranch,\n everDiverged,\n lastDivergedHead,\n createdAt: source.record?.createdAt ?? now,\n updatedAt: now,\n }\n\n await writeJsonAtomically({\n filePath: targetPath,\n payload: next,\n ensureDir: true,\n })\n\n if (source.path !== targetPath) {\n await rm(source.path, { force: true })\n }\n return next\n}\n\nexport const deleteWorktreeMergeLifecycle = async ({\n repoRoot,\n branch,\n}: {\n readonly repoRoot: string\n readonly branch: string\n}): Promise<void> => {\n const path = lifecycleFilePath(repoRoot, branch)\n await rm(path, { force: true })\n}\n","import { rm } from \"node:fs/promises\"\nimport { hostname } from \"node:os\"\nimport { join } from \"node:path\"\nimport { readJsonRecord, writeJsonAtomically } from \"./json-storage\"\nimport { branchToWorktreeId, getLocksDirectoryPath } from \"./paths\"\n\nexport type WorktreeLockRecord = {\n readonly schemaVersion: 1\n readonly branch: string\n readonly worktreeId: string\n readonly reason: string\n readonly owner: string\n readonly host: string\n readonly pid: number\n readonly createdAt: string\n readonly updatedAt: string\n}\n\ntype ParsedLock = {\n readonly valid: boolean\n readonly record: WorktreeLockRecord | null\n}\n\nexport const isWorktreeLockRecord = (parsed: Partial<WorktreeLockRecord>): parsed is WorktreeLockRecord => {\n return (\n parsed.schemaVersion === 1 &&\n typeof parsed.branch === \"string\" &&\n typeof parsed.worktreeId === \"string\" &&\n typeof parsed.reason === \"string\" &&\n typeof parsed.owner === \"string\" &&\n typeof parsed.host === \"string\" &&\n typeof parsed.pid === \"number\" &&\n typeof parsed.createdAt === \"string\" &&\n typeof parsed.updatedAt === \"string\"\n )\n}\n\nconst lockFilePath = (repoRoot: string, branch: string): string => {\n return join(getLocksDirectoryPath(repoRoot), `${branchToWorktreeId(branch)}.json`)\n}\n\nexport const readWorktreeLock = async ({\n repoRoot,\n branch,\n}: {\n readonly repoRoot: string\n readonly branch: string\n}): Promise<ParsedLock & { path: string; exists: boolean }> => {\n const path = lockFilePath(repoRoot, branch)\n return readJsonRecord<WorktreeLockRecord>({\n path,\n schemaVersion: 1,\n validate: isWorktreeLockRecord,\n })\n}\n\nexport const upsertWorktreeLock = async ({\n repoRoot,\n branch,\n reason,\n owner,\n}: {\n readonly repoRoot: string\n readonly branch: string\n readonly reason: string\n readonly owner: string\n}): Promise<WorktreeLockRecord> => {\n const { path, record } = await readWorktreeLock({ repoRoot, branch })\n const now = new Date().toISOString()\n const next: WorktreeLockRecord = {\n schemaVersion: 1,\n branch,\n worktreeId: branchToWorktreeId(branch),\n reason,\n owner,\n host: hostname(),\n pid: process.pid,\n createdAt: record?.createdAt ?? now,\n updatedAt: now,\n }\n await writeJsonAtomically({\n filePath: path,\n payload: next,\n })\n return next\n}\n\nexport const deleteWorktreeLock = async ({\n repoRoot,\n branch,\n}: {\n readonly repoRoot: string\n readonly branch: string\n}): Promise<void> => {\n const path = lockFilePath(repoRoot, branch)\n await rm(path, { force: true })\n}\n","import { execa } from \"execa\"\n\ntype GhCommandRunnerInput = {\n readonly cwd: string\n readonly args: readonly string[]\n}\n\ntype GhCommandRunnerOutput = {\n readonly exitCode: number\n readonly stdout: string\n readonly stderr: string\n}\n\ntype GhCommandRunner = (input: GhCommandRunnerInput) => Promise<GhCommandRunnerOutput>\n\ntype ExecaLikeError = Error & {\n readonly code?: string\n readonly stderr?: string\n readonly exitCode?: number\n}\n\nexport class GhUnavailableError extends Error {\n readonly code = \"GH_UNAVAILABLE\"\n\n constructor(message = \"gh command is unavailable\") {\n super(message)\n this.name = \"GhUnavailableError\"\n }\n}\n\nexport class GhCommandError extends Error {\n readonly code = \"GH_COMMAND_FAILED\"\n readonly details: {\n readonly exitCode: number\n readonly stderr: string\n }\n\n constructor({ exitCode, stderr }: { readonly exitCode: number; readonly stderr: string }) {\n super(`gh command failed with exitCode=${String(exitCode)}`)\n this.name = \"GhCommandError\"\n this.details = {\n exitCode,\n stderr,\n }\n }\n}\n\ntype ResolvePrByBranchBatchInput = {\n readonly repoRoot: string\n readonly baseBranch: string | null\n readonly branches: readonly (string | null)[]\n readonly enabled?: boolean\n readonly runGh?: GhCommandRunner\n}\n\nexport type PrStatus = \"none\" | \"open\" | \"merged\" | \"closed_unmerged\" | \"unknown\"\nexport type PrState = {\n readonly status: PrStatus\n readonly url: string | null\n}\n\ntype PrSummary = {\n readonly headRefName?: string | null\n readonly state?: string | null\n readonly mergedAt?: string | null\n readonly updatedAt?: string | null\n readonly url?: string | null\n}\n\nconst defaultRunGh: GhCommandRunner = async ({ cwd, args }) => {\n try {\n const result = await execa(\"gh\", [...args], {\n cwd,\n reject: false,\n })\n return {\n exitCode: result.exitCode ?? 0,\n stdout: result.stdout,\n stderr: result.stderr,\n }\n } catch (error) {\n const execaError = error as ExecaLikeError\n if (execaError.code === \"ENOENT\") {\n throw new GhUnavailableError(\"gh command not found\")\n }\n throw error\n }\n}\n\nconst toTargetBranches = ({\n branches,\n baseBranch,\n}: {\n readonly branches: readonly (string | null)[]\n readonly baseBranch: string\n}): string[] => {\n const uniqueBranches = new Set<string>()\n for (const branch of branches) {\n if (typeof branch !== \"string\" || branch.length === 0) {\n continue\n }\n if (branch === baseBranch) {\n continue\n }\n uniqueBranches.add(branch)\n }\n return [...uniqueBranches]\n}\n\nconst buildUnknownPrStateMap = (branches: readonly string[]): Map<string, PrState> => {\n return new Map(\n branches.map((branch) => [\n branch,\n {\n status: \"unknown\",\n url: null,\n },\n ]),\n )\n}\n\nconst parseUpdatedAtMillis = (value: unknown): number => {\n if (typeof value !== \"string\" || value.length === 0) {\n return Number.NEGATIVE_INFINITY\n }\n const parsed = Date.parse(value)\n if (Number.isNaN(parsed)) {\n return Number.NEGATIVE_INFINITY\n }\n return parsed\n}\n\nconst toPrStatus = (record: PrSummary): PrStatus => {\n if (typeof record.mergedAt === \"string\" && record.mergedAt.length > 0) {\n return \"merged\"\n }\n const state = typeof record.state === \"string\" ? record.state.toUpperCase() : \"\"\n if (state === \"MERGED\") {\n return \"merged\"\n }\n if (state === \"OPEN\") {\n return \"open\"\n }\n if (state === \"CLOSED\") {\n return \"closed_unmerged\"\n }\n return \"unknown\"\n}\n\nconst toPrUrl = (record: PrSummary): string | null => {\n if (typeof record.url === \"string\" && record.url.length > 0) {\n return record.url\n }\n return null\n}\n\nconst parsePrStateByBranch = ({\n raw,\n targetBranches,\n}: {\n readonly raw: string\n readonly targetBranches: readonly string[]\n}): Map<string, PrState> | null => {\n try {\n const parsed = JSON.parse(raw) as unknown\n if (Array.isArray(parsed) !== true) {\n return null\n }\n const targetBranchSet = new Set(targetBranches)\n const records = parsed as PrSummary[]\n const latestByBranch = new Map<\n string,\n { updatedAtMillis: number; index: number; status: PrStatus; url: string | null }\n >()\n\n for (const [index, record] of records.entries()) {\n if (typeof record?.headRefName !== \"string\" || record.headRefName.length === 0) {\n continue\n }\n if (targetBranchSet.has(record.headRefName) !== true) {\n continue\n }\n const updatedAtMillis = parseUpdatedAtMillis(record.updatedAt)\n const status = toPrStatus(record)\n const url = toPrUrl(record)\n const current = latestByBranch.get(record.headRefName)\n if (\n current === undefined ||\n updatedAtMillis > current.updatedAtMillis ||\n (updatedAtMillis === current.updatedAtMillis && index > current.index)\n ) {\n latestByBranch.set(record.headRefName, {\n updatedAtMillis,\n index,\n status,\n url,\n })\n }\n }\n\n const result = new Map<string, PrState>()\n for (const branch of targetBranches) {\n const latest = latestByBranch.get(branch)\n if (latest === undefined) {\n result.set(branch, {\n status: \"none\",\n url: null,\n })\n continue\n }\n result.set(branch, {\n status: latest.status,\n url: latest.url,\n })\n }\n return result\n } catch {\n return null\n }\n}\n\nexport const resolvePrStateByBranchBatch = async ({\n repoRoot,\n baseBranch,\n branches,\n enabled = true,\n runGh = defaultRunGh,\n}: ResolvePrByBranchBatchInput): Promise<ReadonlyMap<string, PrState>> => {\n if (baseBranch === null) {\n return new Map()\n }\n\n const targetBranches = toTargetBranches({ branches, baseBranch })\n if (targetBranches.length === 0) {\n return new Map()\n }\n if (enabled !== true) {\n return buildUnknownPrStateMap(targetBranches)\n }\n\n try {\n const searchQuery = targetBranches.map((branch) => `head:${branch}`).join(\" OR \")\n const result = await runGh({\n cwd: repoRoot,\n args: [\n \"pr\",\n \"list\",\n \"--state\",\n \"all\",\n \"--base\",\n baseBranch,\n \"--search\",\n searchQuery,\n \"--limit\",\n \"1000\",\n \"--json\",\n \"headRefName,state,mergedAt,updatedAt,url\",\n ],\n })\n if (result.exitCode !== 0) {\n throw new GhCommandError({\n exitCode: result.exitCode,\n stderr: result.stderr,\n })\n }\n\n const prStatusByBranch = parsePrStateByBranch({\n raw: result.stdout,\n targetBranches,\n })\n if (prStatusByBranch === null) {\n return buildUnknownPrStateMap(targetBranches)\n }\n\n return prStatusByBranch\n } catch (error) {\n if (error instanceof GhUnavailableError || error instanceof GhCommandError) {\n return buildUnknownPrStateMap(targetBranches)\n }\n const execaError = error as ExecaLikeError\n if (execaError.code === \"ENOENT\") {\n return buildUnknownPrStateMap(targetBranches)\n }\n return buildUnknownPrStateMap(targetBranches)\n }\n}\n\nexport const resolvePrStatusByBranchBatch = async (\n input: ResolvePrByBranchBatchInput,\n): Promise<ReadonlyMap<string, PrStatus>> => {\n const prStateByBranch = await resolvePrStateByBranchBatch(input)\n return new Map([...prStateByBranch.entries()].map(([branch, prState]) => [branch, prState.status]))\n}\n\nexport const resolveMergedByPrBatch = async (\n input: ResolvePrByBranchBatchInput,\n): Promise<ReadonlyMap<string, boolean | null>> => {\n const prStateByBranch = await resolvePrStateByBranchBatch(input)\n return new Map(\n [...prStateByBranch.entries()].map(([branch, prState]) => {\n const status = prState.status\n if (status === \"merged\") {\n return [branch, true]\n }\n if (status === \"unknown\") {\n return [branch, null]\n }\n return [branch, false]\n }),\n )\n}\n","import { runGitCommand } from \"./exec\"\n\nexport type GitWorktree = {\n readonly path: string\n readonly head: string\n readonly branch: string | null\n}\n\nconst BRANCH_PREFIX = \"refs/heads/\"\n\nconst parseBranchName = (rawRef: string): string | null => {\n if (rawRef.startsWith(BRANCH_PREFIX)) {\n return rawRef.slice(BRANCH_PREFIX.length)\n }\n return rawRef.length > 0 ? rawRef : null\n}\n\nexport const parseWorktreePorcelain = (raw: string): GitWorktree[] => {\n const tokens = raw.split(\"\\0\")\n const worktrees: GitWorktree[] = []\n\n let currentPath = \"\"\n let currentHead = \"\"\n let currentBranch: string | null = null\n\n const flush = (): void => {\n if (currentPath.length === 0) {\n return\n }\n\n worktrees.push({\n path: currentPath,\n head: currentHead,\n branch: currentBranch,\n })\n currentPath = \"\"\n currentHead = \"\"\n currentBranch = null\n }\n\n for (const token of tokens) {\n if (token.length === 0) {\n flush()\n continue\n }\n\n if (token.startsWith(\"worktree \")) {\n flush()\n currentPath = token.slice(\"worktree \".length)\n continue\n }\n\n if (token.startsWith(\"HEAD \")) {\n currentHead = token.slice(\"HEAD \".length)\n continue\n }\n\n if (token.startsWith(\"branch \")) {\n currentBranch = parseBranchName(token.slice(\"branch \".length))\n continue\n }\n\n if (token === \"detached\") {\n currentBranch = null\n }\n }\n\n flush()\n return worktrees\n}\n\nexport const listGitWorktrees = async (repoRoot: string): Promise<GitWorktree[]> => {\n const result = await runGitCommand({\n cwd: repoRoot,\n args: [\"worktree\", \"list\", \"--porcelain\", \"-z\"],\n })\n return parseWorktreePorcelain(result.stdout)\n}\n","import { join } from \"node:path\"\nimport { runGitCommand } from \"../git/exec\"\nimport { resolvePrStateByBranchBatch, type PrState, type PrStatus } from \"../integrations/gh\"\nimport { type GitWorktree, listGitWorktrees } from \"../git/worktree\"\nimport { readJsonRecord } from \"./json-storage\"\nimport { branchToWorktreeId, getLocksDirectoryPath } from \"./paths\"\nimport { type WorktreeMergeLifecycleRecord, upsertWorktreeMergeLifecycle } from \"./worktree-merge-lifecycle\"\n\ntype LockPayload = {\n readonly schemaVersion: 1\n readonly branch: string\n readonly worktreeId: string\n readonly reason: string\n readonly owner?: string\n}\n\nexport type WorktreeLockState = {\n readonly value: boolean\n readonly reason: string | null\n readonly owner: string | null\n}\n\nexport type WorktreeMergedState = {\n readonly byAncestry: boolean | null\n readonly byPR: boolean | null\n readonly overall: boolean | null\n}\n\nexport type WorktreePrState = {\n readonly status: PrStatus | null\n readonly url: string | null\n}\n\nexport type WorktreeUpstreamState = {\n readonly ahead: number | null\n readonly behind: number | null\n readonly remote: string | null\n}\n\nexport type WorktreeStatus = {\n readonly branch: string | null\n readonly path: string\n readonly head: string\n readonly dirty: boolean\n readonly locked: WorktreeLockState\n readonly merged: WorktreeMergedState\n readonly pr: WorktreePrState\n readonly upstream: WorktreeUpstreamState\n}\n\nconst isLockPayload = (parsed: Partial<LockPayload>): parsed is LockPayload => {\n return (\n typeof parsed.branch === \"string\" &&\n typeof parsed.worktreeId === \"string\" &&\n typeof parsed.reason === \"string\" &&\n parsed.reason.length > 0 &&\n (typeof parsed.owner === \"undefined\" || typeof parsed.owner === \"string\")\n )\n}\n\nconst resolveDirty = async (worktreePath: string): Promise<boolean> => {\n const status = await runGitCommand({\n cwd: worktreePath,\n args: [\"status\", \"--porcelain\"],\n reject: false,\n })\n return status.stdout.trim().length > 0\n}\n\nconst resolveLockState = async ({\n repoRoot,\n branch,\n}: {\n readonly repoRoot: string\n readonly branch: string | null\n}): Promise<WorktreeLockState> => {\n if (branch === null) {\n return { value: false, reason: null, owner: null }\n }\n\n const id = branchToWorktreeId(branch)\n const lockPath = join(getLocksDirectoryPath(repoRoot), `${id}.json`)\n const lock = await readJsonRecord<LockPayload>({\n path: lockPath,\n schemaVersion: 1,\n validate: isLockPayload,\n })\n if (lock.exists !== true) {\n return { value: false, reason: null, owner: null }\n }\n if (lock.valid !== true || lock.record === null) {\n return {\n value: true,\n reason: \"invalid lock metadata\",\n owner: null,\n }\n }\n\n return {\n value: true,\n reason: lock.record.reason,\n owner: typeof lock.record.owner === \"string\" && lock.record.owner.length > 0 ? lock.record.owner : null,\n }\n}\n\nconst WORK_REFLOG_MESSAGE_PATTERN = /^(commit(?: \\([^)]*\\))?|cherry-pick|revert|rebase \\(pick\\)|merge):/\n\ntype MergeLifecycleRepository = {\n readonly upsert: (input: {\n readonly branch: string\n readonly baseBranch: string\n readonly observedDivergedHead: string | null\n }) => Promise<WorktreeMergeLifecycleRecord>\n}\n\ntype MergeProbeRepository = {\n readonly probeAncestry: (input: { readonly branch: string; readonly baseBranch: string }) => Promise<boolean | null>\n readonly probeLifecycleFromReflog: (input: {\n readonly branch: string\n readonly baseBranch: string\n }) => Promise<{ merged: boolean | null; divergedHead: string | null }>\n}\n\nconst resolveAncestryFromExitCode = (exitCode: number): boolean | null => {\n if (exitCode === 0) {\n return true\n }\n if (exitCode === 1) {\n return false\n }\n return null\n}\n\nconst resolveMergedByPr = ({\n branch,\n baseBranch,\n prStateByBranch,\n}: {\n readonly branch: string\n readonly baseBranch: string | null\n readonly prStateByBranch: ReadonlyMap<string, PrState>\n}): boolean | null => {\n const prStatus = branch === baseBranch ? null : (prStateByBranch.get(branch)?.status ?? null)\n if (prStatus === \"merged\") {\n return true\n }\n if (prStatus === \"none\" || prStatus === \"open\" || prStatus === \"closed_unmerged\") {\n return false\n }\n return null\n}\n\nconst hasLifecycleDivergedHead = (\n lifecycle: WorktreeMergeLifecycleRecord,\n): lifecycle is WorktreeMergeLifecycleRecord & { readonly lastDivergedHead: string } => {\n return lifecycle.everDiverged === true && lifecycle.lastDivergedHead !== null\n}\n\nconst parseWorkReflogHeads = (\n reflogOutput: string,\n): { readonly heads: string[]; readonly latestHead: string | null } => {\n const heads: string[] = []\n let latestHead: string | null = null\n\n for (const line of reflogOutput.split(\"\\n\")) {\n const trimmed = line.trim()\n if (trimmed.length === 0) {\n continue\n }\n\n const separatorIndex = trimmed.indexOf(\"\\t\")\n if (separatorIndex <= 0) {\n continue\n }\n\n const head = trimmed.slice(0, separatorIndex).trim()\n const message = trimmed.slice(separatorIndex + 1).trim()\n if (head.length === 0 || WORK_REFLOG_MESSAGE_PATTERN.test(message) !== true) {\n continue\n }\n if (latestHead === null) {\n latestHead = head\n }\n heads.push(head)\n }\n\n return {\n heads,\n latestHead,\n }\n}\n\nconst probeLifecycleFromReflog = async ({\n repoRoot,\n branch,\n baseBranch,\n}: {\n readonly repoRoot: string\n readonly branch: string\n readonly baseBranch: string\n}): Promise<{ merged: boolean | null; divergedHead: string | null }> => {\n const reflog = await runGitCommand({\n cwd: repoRoot,\n args: [\"reflog\", \"show\", \"--format=%H%x09%gs\", branch],\n reject: false,\n })\n if (reflog.exitCode !== 0) {\n return {\n merged: null,\n divergedHead: null,\n }\n }\n\n const parsedHeads = parseWorkReflogHeads(reflog.stdout)\n if (parsedHeads.heads.length === 0) {\n return {\n merged: null,\n divergedHead: null,\n }\n }\n\n for (const head of parsedHeads.heads) {\n const result = await runGitCommand({\n cwd: repoRoot,\n args: [\"merge-base\", \"--is-ancestor\", head, baseBranch],\n reject: false,\n })\n const merged = resolveAncestryFromExitCode(result.exitCode)\n if (merged === true) {\n return {\n merged: true,\n divergedHead: head,\n }\n }\n if (merged === null) {\n return {\n merged: null,\n divergedHead: parsedHeads.latestHead,\n }\n }\n }\n\n return {\n merged: false,\n divergedHead: parsedHeads.latestHead,\n }\n}\n\nconst createMergeLifecycleRepository = ({ repoRoot }: { readonly repoRoot: string }): MergeLifecycleRepository => {\n return {\n upsert: async ({ branch, baseBranch, observedDivergedHead }): Promise<WorktreeMergeLifecycleRecord> => {\n return upsertWorktreeMergeLifecycle({\n repoRoot,\n branch,\n baseBranch,\n observedDivergedHead,\n })\n },\n }\n}\n\nconst createMergeProbeRepository = ({ repoRoot }: { readonly repoRoot: string }): MergeProbeRepository => {\n return {\n probeAncestry: async ({ branch, baseBranch }): Promise<boolean | null> => {\n const result = await runGitCommand({\n cwd: repoRoot,\n args: [\"merge-base\", \"--is-ancestor\", branch, baseBranch],\n reject: false,\n })\n return resolveAncestryFromExitCode(result.exitCode)\n },\n probeLifecycleFromReflog: async ({\n branch,\n baseBranch,\n }): Promise<{ merged: boolean | null; divergedHead: string | null }> => {\n return probeLifecycleFromReflog({\n repoRoot,\n branch,\n baseBranch,\n })\n },\n }\n}\n\nconst resolveMergedState = async ({\n repoRoot,\n branch,\n head,\n baseBranch,\n prStateByBranch,\n}: {\n readonly repoRoot: string\n readonly branch: string | null\n readonly head: string\n readonly baseBranch: string | null\n readonly prStateByBranch: ReadonlyMap<string, PrState>\n}): Promise<WorktreeMergedState> => {\n if (branch === null) {\n return { byAncestry: null, byPR: null, overall: null }\n }\n\n const mergeProbeRepository = createMergeProbeRepository({ repoRoot })\n const mergeLifecycleRepository = createMergeLifecycleRepository({ repoRoot })\n\n const byAncestry = baseBranch === null ? null : await mergeProbeRepository.probeAncestry({ branch, baseBranch })\n\n const byPR = resolveMergedByPr({\n branch,\n baseBranch,\n prStateByBranch,\n })\n\n let byLifecycle: boolean | null = null\n if (baseBranch !== null) {\n const lifecycle = await mergeLifecycleRepository.upsert({\n branch,\n baseBranch,\n observedDivergedHead: byAncestry === false ? head : null,\n })\n if (byAncestry === false) {\n byLifecycle = false\n } else if (byAncestry === true) {\n if (hasLifecycleDivergedHead(lifecycle)) {\n byLifecycle = await mergeProbeRepository.probeAncestry({\n branch: lifecycle.lastDivergedHead,\n baseBranch,\n })\n } else if (byPR === true) {\n byLifecycle = null\n } else {\n const probe = await mergeProbeRepository.probeLifecycleFromReflog({\n branch,\n baseBranch,\n })\n byLifecycle = probe.merged\n if (probe.divergedHead !== null) {\n await mergeLifecycleRepository.upsert({\n branch,\n baseBranch,\n observedDivergedHead: probe.divergedHead,\n })\n }\n }\n }\n }\n\n return {\n byAncestry,\n byPR,\n overall: resolveMergedOverall({\n byAncestry,\n byPR,\n byLifecycle,\n }),\n }\n}\n\nconst resolveWorktreePrState = ({\n branch,\n baseBranch,\n prStateByBranch,\n}: {\n readonly branch: string | null\n readonly baseBranch: string | null\n readonly prStateByBranch: ReadonlyMap<string, PrState>\n}): WorktreePrState => {\n if (branch === null || branch === baseBranch) {\n return { status: null, url: null }\n }\n const prState = prStateByBranch.get(branch)\n return {\n status: prState?.status ?? null,\n url: prState?.url ?? null,\n }\n}\n\nexport const resolveMergedOverall = ({\n byAncestry,\n byPR,\n byLifecycle,\n}: {\n readonly byAncestry: boolean | null\n readonly byPR: boolean | null\n readonly byLifecycle: boolean | null\n}): boolean | null => {\n if (byPR === true || byLifecycle === true) {\n return true\n }\n if (byAncestry === false) {\n return false\n }\n if (byPR === false || byLifecycle === false) {\n return false\n }\n return null\n}\n\nconst resolveUpstreamState = async (worktreePath: string): Promise<WorktreeUpstreamState> => {\n const upstreamRef = await runGitCommand({\n cwd: worktreePath,\n args: [\"rev-parse\", \"--abbrev-ref\", \"--symbolic-full-name\", \"@{upstream}\"],\n reject: false,\n })\n if (upstreamRef.exitCode !== 0) {\n return {\n ahead: null,\n behind: null,\n remote: null,\n }\n }\n\n const distance = await runGitCommand({\n cwd: worktreePath,\n args: [\"rev-list\", \"--left-right\", \"--count\", \"@{upstream}...HEAD\"],\n reject: false,\n })\n\n if (distance.exitCode !== 0) {\n return {\n ahead: null,\n behind: null,\n remote: upstreamRef.stdout.trim(),\n }\n }\n\n const [behindRaw, aheadRaw] = distance.stdout.trim().split(/\\s+/)\n const behind = Number.parseInt(behindRaw ?? \"\", 10)\n const ahead = Number.parseInt(aheadRaw ?? \"\", 10)\n return {\n ahead: Number.isNaN(ahead) ? null : ahead,\n behind: Number.isNaN(behind) ? null : behind,\n remote: upstreamRef.stdout.trim(),\n }\n}\n\nconst enrichWorktree = async ({\n repoRoot,\n worktree,\n baseBranch,\n prStateByBranch,\n}: {\n readonly repoRoot: string\n readonly worktree: GitWorktree\n readonly baseBranch: string | null\n readonly prStateByBranch: ReadonlyMap<string, PrState>\n}): Promise<WorktreeStatus> => {\n const [dirty, locked, merged, upstream] = await Promise.all([\n resolveDirty(worktree.path),\n resolveLockState({ repoRoot, branch: worktree.branch }),\n resolveMergedState({ repoRoot, branch: worktree.branch, head: worktree.head, baseBranch, prStateByBranch }),\n resolveUpstreamState(worktree.path),\n ])\n const pr = resolveWorktreePrState({\n branch: worktree.branch,\n baseBranch,\n prStateByBranch,\n })\n\n return {\n branch: worktree.branch,\n path: worktree.path,\n head: worktree.head,\n dirty,\n locked,\n merged,\n pr,\n upstream,\n }\n}\n\nexport type WorktreeSnapshot = {\n readonly repoRoot: string\n readonly baseBranch: string | null\n readonly worktrees: WorktreeStatus[]\n}\n\ntype CollectWorktreeSnapshotOptions = {\n readonly baseBranch?: string | null\n readonly ghEnabled?: boolean\n readonly noGh?: boolean\n}\n\nexport const collectWorktreeSnapshot = async (\n repoRoot: string,\n { baseBranch = null, ghEnabled = true, noGh = false }: CollectWorktreeSnapshotOptions = {},\n): Promise<WorktreeSnapshot> => {\n const worktrees = await listGitWorktrees(repoRoot)\n const prStateByBranch = await resolvePrStateByBranchBatch({\n repoRoot,\n baseBranch,\n branches: worktrees.map((worktree) => worktree.branch),\n enabled: ghEnabled && noGh !== true,\n })\n const enriched = await Promise.all(\n worktrees.map(async (worktree) => {\n return enrichWorktree({ repoRoot, worktree, baseBranch, prStateByBranch })\n }),\n )\n\n return {\n repoRoot,\n baseBranch,\n worktrees: enriched,\n }\n}\n","import { execa } from \"execa\"\n\nconst FZF_BINARY = \"fzf\"\nconst FZF_CHECK_TIMEOUT_MS = 5_000\nconst RESERVED_FZF_ARGS = new Set([\"prompt\", \"layout\", \"height\", \"border\", \"tmux\"])\nconst ANSI_ESCAPE_SEQUENCE_PATTERN = String.raw`\\u001B\\[[0-?]*[ -/]*[@-~]`\nconst ANSI_ESCAPE_SEQUENCE_REGEX = new RegExp(ANSI_ESCAPE_SEQUENCE_PATTERN, \"g\")\n\ntype ExecaLikeError = Error & {\n readonly code?: string\n readonly exitCode?: number\n readonly timedOut?: boolean\n}\n\ntype RunFzfInput = {\n readonly args: string[]\n readonly input: string\n readonly cwd: string\n readonly env: NodeJS.ProcessEnv\n}\n\ntype RunFzfResult = {\n readonly stdout: string\n}\n\ntype FzfErrorCode =\n | \"FZF_DEPENDENCY_MISSING\"\n | \"FZF_INTERACTIVE_REQUIRED\"\n | \"FZF_INVALID_ARGUMENT\"\n | \"FZF_INVALID_SELECTION\"\n\ntype FzfErrorOptions = {\n readonly code: FzfErrorCode\n readonly message: string\n}\n\nclass FzfError extends Error {\n readonly code: FzfErrorCode\n\n constructor(options: FzfErrorOptions) {\n super(options.message)\n this.name = \"FzfError\"\n this.code = options.code\n }\n}\n\nexport class FzfDependencyError extends FzfError {\n constructor(message = \"fzf is required for interactive selection\") {\n super({\n code: \"FZF_DEPENDENCY_MISSING\",\n message,\n })\n this.name = \"FzfDependencyError\"\n }\n}\n\nexport class FzfInteractiveRequiredError extends FzfError {\n constructor(message = \"fzf selection requires an interactive terminal\") {\n super({\n code: \"FZF_INTERACTIVE_REQUIRED\",\n message,\n })\n this.name = \"FzfInteractiveRequiredError\"\n }\n}\n\nclass FzfInvalidArgumentError extends FzfError {\n constructor(message: string) {\n super({\n code: \"FZF_INVALID_ARGUMENT\",\n message,\n })\n this.name = \"FzfInvalidArgumentError\"\n }\n}\n\nclass FzfInvalidSelectionError extends FzfError {\n constructor(message: string) {\n super({\n code: \"FZF_INVALID_SELECTION\",\n message,\n })\n this.name = \"FzfInvalidSelectionError\"\n }\n}\n\nexport type SelectPathWithFzfResult =\n | {\n readonly status: \"selected\"\n readonly path: string\n }\n | {\n readonly status: \"cancelled\"\n }\n\nexport type SelectPathWithFzfInput = {\n readonly candidates: ReadonlyArray<string>\n readonly prompt?: string\n readonly surface?: \"auto\" | \"inline\" | \"tmux-popup\"\n readonly tmuxPopupOpts?: string\n readonly fzfExtraArgs?: ReadonlyArray<string>\n readonly cwd?: string\n readonly env?: NodeJS.ProcessEnv\n readonly isInteractive?: () => boolean\n readonly checkFzfAvailability?: () => Promise<boolean>\n readonly checkFzfTmuxSupport?: () => Promise<boolean>\n readonly runFzf?: (input: RunFzfInput) => Promise<RunFzfResult>\n}\n\nconst sanitizeCandidate = (value: string): string => value.replace(/[\\r\\n]+/g, \" \").trim()\nconst stripAnsi = (value: string): string => value.replace(ANSI_ESCAPE_SEQUENCE_REGEX, \"\")\nconst stripTrailingNewlines = (value: string): string => value.replace(/[\\r\\n]+$/g, \"\")\n\nconst buildFzfInput = (candidates: ReadonlyArray<string>): string => {\n return candidates\n .map((candidate) => sanitizeCandidate(candidate))\n .filter((candidate) => candidate.length > 0)\n .join(\"\\n\")\n}\n\nconst validateExtraFzfArgs = (fzfExtraArgs: ReadonlyArray<string>): void => {\n for (const arg of fzfExtraArgs) {\n if (typeof arg !== \"string\" || arg.length === 0) {\n throw new FzfInvalidArgumentError(\"Empty value is not allowed for --fzf-arg\")\n }\n\n if (!arg.startsWith(\"--\")) {\n continue\n }\n\n const withoutPrefix = arg.slice(2)\n if (withoutPrefix.length === 0) {\n continue\n }\n\n const optionName = withoutPrefix.split(\"=\")[0]\n if (optionName !== undefined && RESERVED_FZF_ARGS.has(optionName)) {\n throw new FzfInvalidArgumentError(`--fzf-arg cannot override reserved fzf option: --${optionName}`)\n }\n }\n}\n\nconst buildFzfArgs = ({\n prompt,\n fzfExtraArgs,\n}: {\n readonly prompt: string\n readonly fzfExtraArgs: ReadonlyArray<string>\n}): string[] => {\n validateExtraFzfArgs(fzfExtraArgs)\n\n return [`--prompt=${prompt}`, \"--layout=reverse\", \"--height=80%\", \"--border\", ...fzfExtraArgs]\n}\n\nconst defaultCheckFzfAvailability = async (): Promise<boolean> => {\n try {\n await execa(FZF_BINARY, [\"--version\"], {\n timeout: FZF_CHECK_TIMEOUT_MS,\n })\n return true\n } catch (error) {\n const execaError = error as ExecaLikeError\n if (\n execaError.code === \"ENOENT\" ||\n execaError.code === \"ETIMEDOUT\" ||\n execaError.code === \"ERR_EXECA_TIMEOUT\" ||\n execaError.timedOut === true\n ) {\n return false\n }\n throw error\n }\n}\n\nconst defaultCheckFzfTmuxSupport = async (): Promise<boolean> => {\n try {\n const result = await execa(FZF_BINARY, [\"--help\"], {\n timeout: FZF_CHECK_TIMEOUT_MS,\n })\n return result.stdout.includes(\"--tmux\")\n } catch {\n return false\n }\n}\n\nconst defaultRunFzf = async ({ args, input, cwd, env }: RunFzfInput): Promise<RunFzfResult> => {\n const result = await execa(FZF_BINARY, args, {\n input,\n cwd,\n env,\n stderr: \"inherit\",\n })\n return { stdout: result.stdout }\n}\n\nconst ensureFzfAvailable = async (checkFzfAvailability: () => Promise<boolean>): Promise<void> => {\n const available = await checkFzfAvailability()\n if (available) {\n return\n }\n\n throw new FzfDependencyError()\n}\n\nconst shouldTryTmuxPopup = async ({\n surface,\n env,\n checkFzfTmuxSupport,\n}: {\n readonly surface: \"auto\" | \"inline\" | \"tmux-popup\"\n readonly env: NodeJS.ProcessEnv\n readonly checkFzfTmuxSupport: () => Promise<boolean>\n}): Promise<boolean> => {\n if (surface === \"inline\") {\n return false\n }\n if (surface === \"tmux-popup\") {\n return true\n }\n if (typeof env.TMUX !== \"string\" || env.TMUX.length === 0) {\n return false\n }\n try {\n return await checkFzfTmuxSupport()\n } catch {\n return false\n }\n}\n\nconst isTmuxUnknownOptionError = (error: unknown): boolean => {\n const execaError = error as ExecaLikeError & {\n readonly stderr?: string\n readonly stdout?: string\n readonly shortMessage?: string\n }\n const text = [execaError.message, execaError.shortMessage, execaError.stderr, execaError.stdout]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n .join(\"\\n\")\n return /unknown option.*--tmux|--tmux.*unknown option/i.test(text)\n}\n\nexport const selectPathWithFzf = async ({\n candidates,\n prompt = \"worktree> \",\n surface = \"inline\",\n tmuxPopupOpts = \"80%,70%\",\n fzfExtraArgs = [],\n cwd = process.cwd(),\n env = process.env,\n isInteractive = (): boolean => process.stdout.isTTY === true && process.stderr.isTTY === true,\n checkFzfAvailability = defaultCheckFzfAvailability,\n checkFzfTmuxSupport = defaultCheckFzfTmuxSupport,\n runFzf = defaultRunFzf,\n}: SelectPathWithFzfInput): Promise<SelectPathWithFzfResult> => {\n if (candidates.length === 0) {\n throw new FzfInvalidArgumentError(\"No candidates provided for fzf selection\")\n }\n\n if (isInteractive() !== true) {\n throw new FzfInteractiveRequiredError()\n }\n\n await ensureFzfAvailable(checkFzfAvailability)\n const baseArgs = buildFzfArgs({ prompt, fzfExtraArgs })\n const tryTmuxPopup = await shouldTryTmuxPopup({\n surface,\n env,\n checkFzfTmuxSupport,\n })\n const args = tryTmuxPopup ? [...baseArgs, `--tmux=${tmuxPopupOpts}`] : baseArgs\n const input = buildFzfInput(candidates)\n if (input.length === 0) {\n throw new FzfInvalidArgumentError(\"All candidates are empty after sanitization\")\n }\n\n const candidateSet = new Set(input.split(\"\\n\").map((candidate) => stripAnsi(candidate)))\n\n const runWithValidation = async (fzfArgs: string[]): Promise<SelectPathWithFzfResult> => {\n const result = await runFzf({\n args: fzfArgs,\n input,\n cwd,\n env,\n })\n\n const selectedPath = stripAnsi(stripTrailingNewlines(result.stdout))\n if (selectedPath.length === 0) {\n return { status: \"cancelled\" }\n }\n\n if (!candidateSet.has(selectedPath)) {\n throw new FzfInvalidSelectionError(\"fzf returned a value that is not in the candidate list\")\n }\n\n return {\n status: \"selected\",\n path: selectedPath,\n }\n }\n\n try {\n return await runWithValidation(args)\n } catch (error) {\n if (tryTmuxPopup && isTmuxUnknownOptionError(error)) {\n try {\n return await runWithValidation(baseArgs)\n } catch (fallbackError) {\n const fallbackExecaError = fallbackError as ExecaLikeError\n if (fallbackExecaError.exitCode === 130) {\n return { status: \"cancelled\" }\n }\n throw fallbackError\n }\n }\n const execaError = error as ExecaLikeError\n if (execaError.exitCode === 130) {\n return { status: \"cancelled\" }\n }\n throw error\n }\n}\n","import chalk from \"chalk\"\n\nexport enum LogLevel {\n ERROR = 0,\n WARN = 1,\n INFO = 2,\n DEBUG = 3,\n}\n\ntype LoggerOptions = {\n readonly level?: LogLevel\n readonly prefix?: string\n}\n\nexport type Logger = {\n readonly level: LogLevel\n readonly prefix: string\n error: (message: string, error?: Error) => void\n warn: (message: string) => void\n info: (message: string) => void\n debug: (message: string) => void\n success: (message: string) => void\n createChild: (suffix: string) => Logger\n}\n\nconst resolveDefaultLogLevel = (): LogLevel => {\n if (process.env.VDE_WORKTREE_DEBUG === \"true\" || process.env.VDE_DEBUG === \"true\") {\n return LogLevel.DEBUG\n }\n if (process.env.VDE_WORKTREE_VERBOSE === \"true\" || process.env.VDE_VERBOSE === \"true\") {\n return LogLevel.INFO\n }\n return LogLevel.WARN\n}\n\nconst formatMessage = (prefix: string, message: string): string => {\n return prefix ? `${prefix} ${message}` : message\n}\n\nexport const createLogger = (options: LoggerOptions = {}): Logger => {\n const level = options.level ?? resolveDefaultLogLevel()\n const prefix = options.prefix ?? \"\"\n\n const build = (nextPrefix: string, nextLevel: LogLevel): Logger => {\n const resolvedPrefix = nextPrefix\n\n return {\n level: nextLevel,\n prefix: resolvedPrefix,\n error(message: string, error?: Error): void {\n if (nextLevel >= LogLevel.ERROR) {\n console.error(chalk.red(formatMessage(resolvedPrefix, `Error: ${message}`)))\n if (error && (process.env.VDE_WORKTREE_DEBUG === \"true\" || process.env.VDE_DEBUG === \"true\")) {\n console.error(chalk.gray(error.stack))\n }\n }\n },\n warn(message: string): void {\n if (nextLevel >= LogLevel.WARN) {\n console.warn(chalk.yellow(formatMessage(resolvedPrefix, message)))\n }\n },\n info(message: string): void {\n if (nextLevel >= LogLevel.INFO) {\n console.log(formatMessage(resolvedPrefix, message))\n }\n },\n debug(message: string): void {\n if (nextLevel >= LogLevel.DEBUG) {\n console.log(chalk.gray(formatMessage(resolvedPrefix, `[DEBUG] ${message}`)))\n }\n },\n success(message: string): void {\n console.log(chalk.green(formatMessage(resolvedPrefix, message)))\n },\n createChild(suffix: string): Logger {\n const childPrefix = resolvedPrefix ? `${resolvedPrefix} ${suffix}` : suffix\n return build(childPrefix, nextLevel)\n },\n }\n }\n\n return build(prefix, level)\n}\n","export type CommandHandler = () => Promise<number>\n\nexport type CommandHandlerMap = ReadonlyMap<string, CommandHandler>\n\nconst createHandlerMap = (entries: ReadonlyArray<readonly [string, CommandHandler]>): CommandHandlerMap => {\n return new Map(entries)\n}\n\nexport const dispatchCommandHandler = async ({\n command,\n handlers,\n}: {\n readonly command: string\n readonly handlers: CommandHandlerMap\n}): Promise<number | undefined> => {\n const handler = handlers.get(command)\n if (handler === undefined) {\n return undefined\n }\n return await handler()\n}\n\nexport const createEarlyRepoCommandHandlers = ({\n initHandler,\n listHandler,\n statusHandler,\n pathHandler,\n}: {\n readonly initHandler: CommandHandler\n readonly listHandler: CommandHandler\n readonly statusHandler: CommandHandler\n readonly pathHandler: CommandHandler\n}): CommandHandlerMap => {\n return createHandlerMap([\n [\"init\", initHandler],\n [\"list\", listHandler],\n [\"status\", statusHandler],\n [\"path\", pathHandler],\n ])\n}\n\nexport const createWriteCommandHandlers = ({\n newHandler,\n switchHandler,\n}: {\n readonly newHandler: CommandHandler\n readonly switchHandler: CommandHandler\n}): CommandHandlerMap => {\n return createHandlerMap([\n [\"new\", newHandler],\n [\"switch\", switchHandler],\n ])\n}\n\nexport const createWriteMutationHandlers = ({\n mvHandler,\n delHandler,\n}: {\n readonly mvHandler: CommandHandler\n readonly delHandler: CommandHandler\n}): CommandHandlerMap => {\n return createHandlerMap([\n [\"mv\", mvHandler],\n [\"del\", delHandler],\n ])\n}\n\nexport const createWorktreeActionHandlers = ({\n goneHandler,\n getHandler,\n extractHandler,\n}: {\n readonly goneHandler: CommandHandler\n readonly getHandler: CommandHandler\n readonly extractHandler: CommandHandler\n}): CommandHandlerMap => {\n return createHandlerMap([\n [\"gone\", goneHandler],\n [\"get\", getHandler],\n [\"extract\", extractHandler],\n ])\n}\n\nexport const createSynchronizationHandlers = ({\n absorbHandler,\n unabsorbHandler,\n useHandler,\n}: {\n readonly absorbHandler: CommandHandler\n readonly unabsorbHandler: CommandHandler\n readonly useHandler: CommandHandler\n}): CommandHandlerMap => {\n return createHandlerMap([\n [\"absorb\", absorbHandler],\n [\"unabsorb\", unabsorbHandler],\n [\"use\", useHandler],\n ])\n}\n\nexport const createMiscCommandHandlers = ({\n execHandler,\n invokeHandler,\n copyHandler,\n linkHandler,\n lockHandler,\n unlockHandler,\n cdHandler,\n}: {\n readonly execHandler: CommandHandler\n readonly invokeHandler: CommandHandler\n readonly copyHandler: CommandHandler\n readonly linkHandler: CommandHandler\n readonly lockHandler: CommandHandler\n readonly unlockHandler: CommandHandler\n readonly cdHandler: CommandHandler\n}): CommandHandlerMap => {\n return createHandlerMap([\n [\"exec\", execHandler],\n [\"invoke\", invokeHandler],\n [\"copy\", copyHandler],\n [\"link\", linkHandler],\n [\"lock\", lockHandler],\n [\"unlock\", unlockHandler],\n [\"cd\", cdHandler],\n ])\n}\n","import { EXIT_CODE } from \"../../../core/constants\"\nimport { createCliError } from \"../../../core/errors\"\nimport type { CommandContext } from \"../../runtime/command-context\"\n\ntype DispatchHandled = {\n readonly handled: true\n readonly exitCode: number\n}\n\ntype DispatchNotHandled = {\n readonly handled: false\n}\n\nexport type DispatchReadOnlyCommandsResult = DispatchHandled | DispatchNotHandled\n\ntype ReadOnlyCommandContext = Pick<\n CommandContext,\n \"command\" | \"commandArgs\" | \"positionals\" | \"parsedArgs\" | \"jsonEnabled\"\n>\n\nexport type DispatchReadOnlyCommandsInput<CommandHelpEntry, CompletionShell extends string> = ReadOnlyCommandContext & {\n readonly version: string\n readonly availableCommandNames: readonly string[]\n readonly stdout: (line: string) => void\n readonly findCommandHelp: (commandName: string) => CommandHelpEntry | undefined\n readonly renderGeneralHelpText: (input: { readonly version: string }) => string\n readonly renderCommandHelpText: (input: { readonly entry: CommandHelpEntry }) => string\n readonly ensureArgumentCount: (input: {\n readonly command: string\n readonly args: readonly string[]\n readonly min: number\n readonly max: number\n }) => void\n readonly resolveCompletionShell: (value: string) => CompletionShell\n readonly loadCompletionScript: (shell: CompletionShell) => Promise<string>\n readonly resolveCompletionInstallPath: (input: {\n readonly shell: CompletionShell\n readonly requestedPath?: string\n }) => string\n readonly installCompletionScript: (input: {\n readonly content: string\n readonly destinationPath: string\n }) => Promise<void>\n readonly readStringOption: (parsedArgsRecord: Record<string, unknown>, key: string) => string | undefined\n readonly buildJsonSuccess: (input: {\n readonly command: string\n readonly status: \"ok\"\n readonly repoRoot: null\n readonly details: Record<string, unknown>\n }) => Record<string, unknown>\n}\n\nconst handled = (exitCode: number): DispatchHandled => {\n return {\n handled: true,\n exitCode,\n }\n}\n\nconst NOT_HANDLED: DispatchNotHandled = {\n handled: false,\n}\n\nexport const dispatchReadOnlyCommands = async <CommandHelpEntry, CompletionShell extends string>(\n input: DispatchReadOnlyCommandsInput<CommandHelpEntry, CompletionShell>,\n): Promise<DispatchReadOnlyCommandsResult> => {\n if (input.parsedArgs.help === true) {\n const commandHelpTarget = input.command !== \"unknown\" && input.command !== \"help\" ? input.command : null\n if (commandHelpTarget !== null) {\n const entry = input.findCommandHelp(commandHelpTarget)\n if (entry !== undefined) {\n input.stdout(`${input.renderCommandHelpText({ entry })}\\n`)\n return handled(EXIT_CODE.OK)\n }\n }\n input.stdout(`${input.renderGeneralHelpText({ version: input.version })}\\n`)\n return handled(EXIT_CODE.OK)\n }\n\n if (input.parsedArgs.version === true) {\n input.stdout(input.version)\n return handled(EXIT_CODE.OK)\n }\n\n if (input.positionals.length === 0) {\n input.stdout(`${input.renderGeneralHelpText({ version: input.version })}\\n`)\n return handled(EXIT_CODE.OK)\n }\n\n if (input.command === \"help\") {\n const helpTarget = input.positionals[1]\n if (typeof helpTarget !== \"string\" || helpTarget.length === 0) {\n input.stdout(`${input.renderGeneralHelpText({ version: input.version })}\\n`)\n return handled(EXIT_CODE.OK)\n }\n\n const entry = input.findCommandHelp(helpTarget)\n if (entry === undefined) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: `Unknown command for help: ${helpTarget}`,\n details: {\n requested: helpTarget,\n availableCommands: input.availableCommandNames,\n },\n })\n }\n\n input.stdout(`${input.renderCommandHelpText({ entry })}\\n`)\n return handled(EXIT_CODE.OK)\n }\n\n if (input.command === \"completion\") {\n input.ensureArgumentCount({\n command: input.command,\n args: input.commandArgs,\n min: 1,\n max: 1,\n })\n\n const shell = input.resolveCompletionShell(input.commandArgs[0] as string)\n const script = await input.loadCompletionScript(shell)\n\n if (input.parsedArgs.install === true) {\n const destinationPath = input.resolveCompletionInstallPath({\n shell,\n requestedPath: input.readStringOption(input.parsedArgs, \"path\"),\n })\n await input.installCompletionScript({\n content: script,\n destinationPath,\n })\n\n if (input.jsonEnabled) {\n input.stdout(\n JSON.stringify(\n input.buildJsonSuccess({\n command: input.command,\n status: \"ok\",\n repoRoot: null,\n details: {\n shell,\n installed: true,\n path: destinationPath,\n },\n }),\n ),\n )\n return handled(EXIT_CODE.OK)\n }\n\n input.stdout(`installed completion: ${destinationPath}`)\n if (shell === \"zsh\") {\n input.stdout(\"zsh note: ensure completion path is in fpath, then run: autoload -Uz compinit && compinit\")\n }\n return handled(EXIT_CODE.OK)\n }\n\n if (input.jsonEnabled) {\n input.stdout(\n JSON.stringify(\n input.buildJsonSuccess({\n command: input.command,\n status: \"ok\",\n repoRoot: null,\n details: {\n shell,\n installed: false,\n script,\n },\n }),\n ),\n )\n return handled(EXIT_CODE.OK)\n }\n\n input.stdout(script)\n return handled(EXIT_CODE.OK)\n }\n\n return NOT_HANDLED\n}\n","import type { createRequire } from \"node:module\"\n\ntype RequireLike = ReturnType<typeof createRequire>\ntype PackageJsonModule = {\n readonly version: string\n}\ntype ModuleLoadError = Error & {\n readonly code?: string\n}\n\nconst CANDIDATE_PATHS = [\"../package.json\", \"../../package.json\"] as const\n\nconst isModuleNotFoundError = (error: unknown): error is ModuleLoadError => {\n return error instanceof Error && (error as ModuleLoadError).code === \"MODULE_NOT_FOUND\"\n}\n\nexport const loadPackageVersion = (requireFn: RequireLike): string => {\n let lastNotFound: ModuleLoadError | undefined\n\n for (const candidatePath of CANDIDATE_PATHS) {\n try {\n return (requireFn(candidatePath) as PackageJsonModule).version\n } catch (error) {\n if (isModuleNotFoundError(error)) {\n lastNotFound = error\n continue\n }\n\n throw error\n }\n }\n\n throw lastNotFound ?? new Error(`Unable to resolve package version from candidates: ${CANDIDATE_PATHS.join(\", \")}`)\n}\n","import { constants as fsConstants } from \"node:fs\"\nimport { access, cp, mkdir, readFile, readdir, rm, symlink, writeFile } from \"node:fs/promises\"\nimport { createRequire } from \"node:module\"\nimport { homedir } from \"node:os\"\nimport { dirname, join, relative, resolve, sep } from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { Chalk } from \"chalk\"\nimport { parseArgs } from \"citty\"\nimport type { ArgsDef } from \"citty\"\nimport { execa } from \"execa\"\nimport stringWidth from \"string-width\"\nimport { getBorderCharacters, table } from \"table\"\nimport { loadResolvedConfig } from \"../config/loader\"\nimport { LIST_TABLE_COLUMNS, type ListTableColumn, type ResolvedConfig, type SelectorCdSurface } from \"../config/types\"\nimport {\n DEFAULT_HOOK_TIMEOUT_MS,\n DEFAULT_LOCK_TIMEOUT_MS,\n DEFAULT_STALE_LOCK_TTL_SECONDS,\n EXIT_CODE,\n SCHEMA_VERSION,\n WRITE_COMMANDS,\n} from \"../core/constants\"\nimport { createCliError, ensureCliError, type CliError } from \"../core/errors\"\nimport { invokeHook, runPostHook, runPreHook, type HookExecutionContext } from \"../core/hooks\"\nimport { initializeRepository, isInitialized } from \"../core/init\"\nimport {\n branchToWorktreePath,\n ensurePathInsideRoot,\n ensurePathInsideRepo,\n getWorktreeRootPath,\n isManagedWorktreePath,\n resolvePathFromCwd,\n resolveRepoContext,\n resolveRepoRelativePath,\n} from \"../core/paths\"\nimport { readNumberFromEnvOrDefault, withRepoLock } from \"../core/repo-lock\"\nimport {\n deleteWorktreeMergeLifecycle,\n moveWorktreeMergeLifecycle,\n upsertWorktreeMergeLifecycle,\n} from \"../core/worktree-merge-lifecycle\"\nimport { deleteWorktreeLock, readWorktreeLock, upsertWorktreeLock } from \"../core/worktree-lock\"\nimport {\n collectWorktreeSnapshot as collectWorktreeSnapshotBase,\n type WorktreeSnapshot,\n type WorktreeStatus,\n} from \"../core/worktree-state\"\nimport { doesGitRefExist, runGitCommand } from \"../git/exec\"\nimport {\n FzfDependencyError,\n FzfInteractiveRequiredError,\n selectPathWithFzf as defaultSelectPathWithFzf,\n} from \"../integrations/fzf\"\nimport type { SelectPathWithFzfInput, SelectPathWithFzfResult } from \"../integrations/fzf\"\nimport { createLogger, LogLevel, type Logger } from \"../utils/logger\"\nimport {\n createEarlyRepoCommandHandlers,\n createMiscCommandHandlers,\n createSynchronizationHandlers,\n createWorktreeActionHandlers,\n createWriteCommandHandlers,\n createWriteMutationHandlers,\n dispatchCommandHandler,\n} from \"./commands/handler-groups\"\nimport { dispatchReadOnlyCommands } from \"./commands/read/dispatcher\"\nimport { loadPackageVersion } from \"./package-version\"\nimport type { CommandContext } from \"./runtime/command-context\"\n\nexport type CLI = {\n run(args?: string[]): Promise<number>\n}\n\ntype CLIOptions = {\n readonly version?: string\n readonly cwd?: string\n readonly stdout?: (line: string) => void\n readonly stderr?: (line: string) => void\n readonly selectPathWithFzf?: (input: SelectPathWithFzfInput) => Promise<SelectPathWithFzfResult>\n readonly isInteractive?: () => boolean\n}\n\ntype OptionValueKind = \"boolean\" | \"value\"\n\ntype OptionSpec = {\n readonly kind: OptionValueKind\n readonly allowOptionLikeValue: boolean\n readonly allowNegation: boolean\n}\n\ntype OptionSpecs = {\n readonly longOptions: Map<string, OptionSpec>\n readonly shortOptions: Map<string, OptionSpec>\n}\n\ntype CommonRuntime = {\n readonly command: string\n readonly json: boolean\n readonly hooksEnabled: boolean\n readonly ghEnabled: boolean\n readonly strictPostHooks: boolean\n readonly hookTimeoutMs: number\n readonly lockTimeoutMs: number\n readonly allowUnsafe: boolean\n readonly isInteractive: boolean\n}\n\ntype JsonSuccessStatus = \"ok\" | \"created\" | \"existing\" | \"deleted\"\n\ntype JsonSuccess = {\n readonly schemaVersion: number\n readonly command: string\n readonly status: JsonSuccessStatus\n readonly repoRoot: string | null\n readonly [key: string]: unknown\n}\n\ntype ParsedForceFlags = {\n readonly forceDirty: boolean\n readonly allowUnpushed: boolean\n readonly forceUnmerged: boolean\n readonly forceLocked: boolean\n}\n\ntype CompletionShell = \"zsh\" | \"fish\"\n\ntype CommandHelp = {\n readonly name: string\n readonly usage: string\n readonly summary: string\n readonly details: readonly string[]\n readonly options?: readonly string[]\n readonly examples?: readonly string[]\n}\n\ntype CatppuccinTheme = {\n readonly header: (value: string) => string\n readonly branch: (value: string) => string\n readonly branchCurrent: (value: string) => string\n readonly branchDetached: (value: string) => string\n readonly dirty: (value: string) => string\n readonly clean: (value: string) => string\n readonly merged: (value: string) => string\n readonly unmerged: (value: string) => string\n readonly unknown: (value: string) => string\n readonly base: (value: string) => string\n readonly locked: (value: string) => string\n readonly path: (value: string) => string\n readonly muted: (value: string) => string\n readonly value: (value: string) => string\n readonly previewLabel: (value: string) => string\n readonly previewSection: (value: string) => string\n}\n\nconst EXIT_CODE_CANCELLED = 130\n\nconst optionNamesAllowOptionLikeValue = new Set([\"fzfArg\", \"fzf-arg\"])\nconst CD_FZF_EXTRA_ARGS = [\n \"--delimiter=\\t\",\n \"--with-nth=1\",\n \"--preview=printf '%b' {3}\",\n \"--preview-window=right,60%,wrap\",\n \"--ansi\",\n] as const\nconst DEFAULT_LIST_TABLE_COLUMNS = [...LIST_TABLE_COLUMNS]\nconst LIST_TABLE_CELL_HORIZONTAL_PADDING = 2\nconst COMPLETION_SHELLS: readonly CompletionShell[] = [\"zsh\", \"fish\"] as const\nconst COMPLETION_FILE_BY_SHELL: Readonly<Record<CompletionShell, string>> = {\n zsh: \"zsh/_vw\",\n fish: \"fish/vw.fish\",\n}\n\nconst CATPPUCCIN_MOCHA = {\n rosewater: \"#f5e0dc\",\n mauve: \"#cba6f7\",\n red: \"#f38ba8\",\n peach: \"#fab387\",\n yellow: \"#f9e2af\",\n green: \"#a6e3a1\",\n blue: \"#89b4fa\",\n lavender: \"#b4befe\",\n sapphire: \"#74c7ec\",\n text: \"#cdd6f4\",\n subtext0: \"#a6adc8\",\n overlay0: \"#6c7086\",\n} as const\n\nconst identityColor = (value: string): string => value\n\nconst hasDefaultListColumnOrder = (columns: ReadonlyArray<ListTableColumn>): boolean => {\n if (columns.length !== DEFAULT_LIST_TABLE_COLUMNS.length) {\n return false\n }\n return columns.every((column, index) => column === DEFAULT_LIST_TABLE_COLUMNS[index])\n}\n\nconst createCatppuccinTheme = ({ enabled }: { readonly enabled: boolean }): CatppuccinTheme => {\n if (enabled !== true) {\n return {\n header: identityColor,\n branch: identityColor,\n branchCurrent: identityColor,\n branchDetached: identityColor,\n dirty: identityColor,\n clean: identityColor,\n merged: identityColor,\n unmerged: identityColor,\n unknown: identityColor,\n base: identityColor,\n locked: identityColor,\n path: identityColor,\n muted: identityColor,\n value: identityColor,\n previewLabel: identityColor,\n previewSection: identityColor,\n }\n }\n\n const chalk = new Chalk({ level: 3 })\n const color =\n (hex: string) =>\n (value: string): string =>\n chalk.hex(hex)(value)\n\n return {\n header: color(CATPPUCCIN_MOCHA.rosewater),\n branch: color(CATPPUCCIN_MOCHA.lavender),\n branchCurrent: color(CATPPUCCIN_MOCHA.mauve),\n branchDetached: color(CATPPUCCIN_MOCHA.peach),\n dirty: color(CATPPUCCIN_MOCHA.peach),\n clean: color(CATPPUCCIN_MOCHA.green),\n merged: color(CATPPUCCIN_MOCHA.green),\n unmerged: color(CATPPUCCIN_MOCHA.red),\n unknown: color(CATPPUCCIN_MOCHA.yellow),\n base: color(CATPPUCCIN_MOCHA.blue),\n locked: color(CATPPUCCIN_MOCHA.red),\n path: color(CATPPUCCIN_MOCHA.sapphire),\n muted: color(CATPPUCCIN_MOCHA.overlay0),\n value: color(CATPPUCCIN_MOCHA.text),\n previewLabel: color(CATPPUCCIN_MOCHA.mauve),\n previewSection: color(CATPPUCCIN_MOCHA.rosewater),\n }\n}\n\nconst shouldUseAnsiColors = ({ interactive }: { readonly interactive: boolean }): boolean => {\n return interactive === true\n}\n\nconst colorizeCellContent = ({\n cell,\n color,\n}: {\n readonly cell: string\n readonly color: (value: string) => string\n}): string => {\n const matched = /^(\\s*)(.*?)(\\s*)$/.exec(cell)\n if (matched === null) {\n return cell\n }\n const leftPadding = matched[1] ?? \"\"\n const content = matched[2] ?? \"\"\n const rightPadding = matched[3] ?? \"\"\n if (content.length === 0) {\n return cell\n }\n return `${leftPadding}${color(content)}${rightPadding}`\n}\n\nconst colorizeListTableLine = ({ line, theme }: { readonly line: string; readonly theme: CatppuccinTheme }): string => {\n if (line.startsWith(\"┌\") || line.startsWith(\"├\") || line.startsWith(\"└\")) {\n return theme.muted(line)\n }\n if (line.startsWith(\"│\") !== true) {\n return line\n }\n\n const segments = line.split(\"│\")\n if (segments.length < 3) {\n return line\n }\n\n const cells = segments.slice(1, -1)\n if (cells.length !== 8) {\n return line\n }\n\n const headers = cells.map((cell) => cell.trim())\n const isHeaderRow =\n headers[0] === \"branch\" &&\n headers[1] === \"dirty\" &&\n headers[2] === \"merged\" &&\n headers[3] === \"pr\" &&\n headers[4] === \"locked\" &&\n headers[5] === \"ahead\" &&\n headers[6] === \"behind\" &&\n headers[7] === \"path\"\n\n if (isHeaderRow) {\n const nextCells = cells.map((cell) => colorizeCellContent({ cell, color: theme.header }))\n return [segments[0], ...nextCells, segments.at(-1) ?? \"\"].join(\"│\")\n }\n\n const branchCell = cells[0] as string\n const dirtyCell = cells[1] as string\n const mergedCell = cells[2] as string\n const prCell = cells[3] as string\n const lockedCell = cells[4] as string\n const aheadCell = cells[5] as string\n const behindCell = cells[6] as string\n const pathCell = cells[7] as string\n\n const branchColor =\n branchCell.includes(\"(detached)\") === true\n ? theme.branchDetached\n : branchCell.trimStart().startsWith(\"*\")\n ? theme.branchCurrent\n : theme.branch\n const dirtyTrimmed = dirtyCell.trim()\n const dirtyColor = dirtyTrimmed === \"dirty\" ? theme.dirty : dirtyTrimmed === \"clean\" ? theme.clean : theme.value\n const mergedTrimmed = mergedCell.trim()\n const mergedColor =\n mergedTrimmed === \"merged\"\n ? theme.merged\n : mergedTrimmed === \"unmerged\"\n ? theme.unmerged\n : mergedTrimmed === \"-\"\n ? theme.base\n : theme.unknown\n const prTrimmed = prCell.trim()\n const prColor =\n prTrimmed === \"merged\"\n ? theme.merged\n : prTrimmed === \"open\"\n ? theme.value\n : prTrimmed === \"closed_unmerged\"\n ? theme.unmerged\n : prTrimmed === \"none\"\n ? theme.muted\n : prTrimmed === \"-\"\n ? theme.base\n : theme.unknown\n const lockedTrimmed = lockedCell.trim()\n const lockedColor = lockedTrimmed === \"locked\" ? theme.locked : theme.muted\n const aheadTrimmed = aheadCell.trim()\n const aheadValue = Number.parseInt(aheadTrimmed, 10)\n const aheadColor =\n aheadTrimmed === \"-\"\n ? theme.muted\n : Number.isNaN(aheadValue)\n ? theme.value\n : aheadValue > 0\n ? theme.unmerged\n : aheadValue === 0\n ? theme.merged\n : theme.unknown\n const behindTrimmed = behindCell.trim()\n const behindValue = Number.parseInt(behindTrimmed, 10)\n const behindColor =\n behindTrimmed === \"-\"\n ? theme.muted\n : Number.isNaN(behindValue)\n ? theme.value\n : behindValue > 0\n ? theme.unknown\n : behindValue === 0\n ? theme.merged\n : theme.unknown\n\n const nextCells = [\n colorizeCellContent({ cell: branchCell, color: branchColor }),\n colorizeCellContent({ cell: dirtyCell, color: dirtyColor }),\n colorizeCellContent({ cell: mergedCell, color: mergedColor }),\n colorizeCellContent({ cell: prCell, color: prColor }),\n colorizeCellContent({ cell: lockedCell, color: lockedColor }),\n colorizeCellContent({ cell: aheadCell, color: aheadColor }),\n colorizeCellContent({ cell: behindCell, color: behindColor }),\n colorizeCellContent({ cell: pathCell, color: theme.path }),\n ]\n\n return [segments[0], ...nextCells, segments.at(-1) ?? \"\"].join(\"│\")\n}\n\nconst colorizeListTable = ({\n rendered,\n theme,\n}: {\n readonly rendered: string\n readonly theme: CatppuccinTheme\n}): string => {\n return rendered\n .trimEnd()\n .split(\"\\n\")\n .map((line) => colorizeListTableLine({ line, theme }))\n .join(\"\\n\")\n}\n\nconst commandHelpEntries: readonly CommandHelp[] = [\n {\n name: \"init\",\n usage: \"vw init\",\n summary: \"Initialize directories, hooks, and managed exclude entries.\",\n details: [\n \"Creates .worktree and .vde/worktree directories.\",\n \"Appends managed entries to .git/info/exclude (idempotent).\",\n ],\n },\n {\n name: \"list\",\n usage: \"vw list [--json] [--full-path]\",\n summary: \"List worktrees with status metadata.\",\n details: [\n \"Table output includes branch, path, dirty, lock, merged, PR state, and ahead/behind vs base branch.\",\n \"By default, long path values are truncated to fit terminal width.\",\n \"JSON output includes PR status/url and upstream metadata fields.\",\n ],\n options: [\"--full-path\"],\n },\n {\n name: \"status\",\n usage: \"vw status [branch] [--json]\",\n summary: \"Show a single worktree status.\",\n details: [\"Without branch, resolves from current working directory.\"],\n },\n {\n name: \"path\",\n usage: \"vw path <branch> [--json]\",\n summary: \"Print absolute worktree path for the branch.\",\n details: [],\n },\n {\n name: \"new\",\n usage: \"vw new [branch]\",\n summary: \"Create branch + worktree under .worktree.\",\n details: [\"Without branch, generates wip-xxxxxx.\"],\n },\n {\n name: \"switch\",\n usage: \"vw switch <branch>\",\n summary: \"Idempotent branch entrypoint.\",\n details: [\"Reuses existing worktree when present, otherwise creates one.\"],\n },\n {\n name: \"mv\",\n usage: \"vw mv <new-branch>\",\n summary: \"Rename current non-primary worktree branch and move its directory.\",\n details: [\"Requires branch checkout (detached HEAD is rejected).\"],\n },\n {\n name: \"del\",\n usage: \"vw del [branch] [flags]\",\n summary: \"Delete worktree + branch with safety checks.\",\n details: [\n \"Default rejects dirty, locked, unmerged/unknown, or unpushed/unknown states.\",\n \"For non-TTY force usage, --allow-unsafe is required.\",\n ],\n options: [\"--force-dirty\", \"--allow-unpushed\", \"--force-unmerged\", \"--force-locked\", \"--force\", \"--allow-unsafe\"],\n },\n {\n name: \"gone\",\n usage: \"vw gone [--json] [--apply|--dry-run]\",\n summary: \"Bulk cleanup by safety-filtered candidate selection.\",\n details: [\"Default mode is dry-run. Use --apply to delete candidates.\"],\n },\n {\n name: \"get\",\n usage: \"vw get <remote/branch>\",\n summary: \"Fetch remote branch, create tracking local branch if needed, then attach worktree.\",\n details: [\"Example target format: origin/feature/foo.\"],\n },\n {\n name: \"extract\",\n usage: \"vw extract --current [--stash]\",\n summary: \"Extract current primary branch into .worktree and switch primary back to base.\",\n details: [\"Current implementation targets primary worktree extraction flow.\"],\n options: [\"--current\", \"--stash\", \"--from <path>\"],\n },\n {\n name: \"absorb\",\n usage: \"vw absorb <branch> [--from <worktree-name>] [--keep-stash] [--allow-agent --allow-unsafe]\",\n summary: \"Bring non-primary worktree changes (including uncommitted) into primary worktree.\",\n details: [\n \"Stashes source worktree changes, checks out target branch in primary, then applies stash.\",\n \"Non-TTY execution requires --allow-agent and --allow-unsafe.\",\n ],\n options: [\"--from <worktree-name>\", \"--keep-stash\", \"--allow-agent\", \"--allow-unsafe\"],\n },\n {\n name: \"unabsorb\",\n usage: \"vw unabsorb <branch> [--to <worktree-name>] [--keep-stash] [--allow-agent --allow-unsafe]\",\n summary: \"Push primary worktree changes (including uncommitted) into non-primary worktree.\",\n details: [\n \"Stashes primary worktree changes, applies them in target non-primary worktree, then optionally drops stash.\",\n \"Non-TTY execution requires --allow-agent and --allow-unsafe.\",\n ],\n options: [\"--to <worktree-name>\", \"--keep-stash\", \"--allow-agent\", \"--allow-unsafe\"],\n },\n {\n name: \"use\",\n usage: \"vw use <branch> [--allow-shared] [--allow-agent --allow-unsafe]\",\n summary: \"Checkout target branch in primary worktree.\",\n details: [\n \"If target branch is attached by another worktree, --allow-shared is required.\",\n \"Non-TTY execution requires --allow-agent and --allow-unsafe.\",\n ],\n options: [\"--allow-shared\", \"--allow-agent\", \"--allow-unsafe\"],\n },\n {\n name: \"exec\",\n usage: \"vw exec <branch> -- <cmd...>\",\n summary: \"Run command in target branch worktree.\",\n details: [\"Returns exit code 21 when child process exits non-zero.\"],\n },\n {\n name: \"invoke\",\n usage: \"vw invoke <pre-*/post-*> [-- <args...>]\",\n summary: \"Manually run hook script for debugging/operations.\",\n details: [],\n },\n {\n name: \"copy\",\n usage: \"vw copy <repo-relative-path...>\",\n summary: \"Copy repo-root files/dirs to target worktree (typically WT_WORKTREE_PATH).\",\n details: [],\n },\n {\n name: \"link\",\n usage: \"vw link <repo-relative-path...> [--no-fallback]\",\n summary: \"Create symlink from target worktree to repo-root file.\",\n details: [\"On Windows, fallback copy is used unless --no-fallback is set.\"],\n },\n {\n name: \"lock\",\n usage: \"vw lock <branch> [--owner <name>] [--reason <text>]\",\n summary: \"Create/update lock metadata to protect worktree from cleanup/deletion.\",\n details: [],\n },\n {\n name: \"unlock\",\n usage: \"vw unlock <branch> [--owner <name>] [--force]\",\n summary: \"Remove lock metadata with owner/force checks.\",\n details: [],\n },\n {\n name: \"cd\",\n usage: \"vw cd\",\n summary: \"Interactive fzf picker that prints selected worktree absolute path.\",\n details: ['Use with shell: cd \"$(vw cd)\"'],\n options: [\"--prompt <text>\", \"--fzf-arg <arg>\"],\n },\n {\n name: \"completion\",\n usage: \"vw completion <zsh|fish> [--install] [--path <file>]\",\n summary: \"Print or install shell completion scripts.\",\n details: [\n \"Without --install, prints completion script to stdout.\",\n \"With --install, writes completion file to default shell path or --path.\",\n ],\n options: [\"--install\", \"--path <file>\"],\n },\n] as const\n\nconst commandHelpNames = commandHelpEntries.map((entry) => entry.name)\n\nconst splitRawArgsByDoubleDash = (\n args: readonly string[],\n): {\n readonly beforeDoubleDash: string[]\n readonly afterDoubleDash: string[]\n} => {\n const separatorIndex = args.indexOf(\"--\")\n if (separatorIndex < 0) {\n return {\n beforeDoubleDash: [...args],\n afterDoubleDash: [],\n }\n }\n return {\n beforeDoubleDash: args.slice(0, separatorIndex),\n afterDoubleDash: args.slice(separatorIndex + 1),\n }\n}\n\nconst toKebabCase = (value: string): string => {\n return value.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`)\n}\n\nconst toOptionSpec = (kind: OptionValueKind, optionName: string): OptionSpec => {\n return {\n kind,\n allowOptionLikeValue: optionNamesAllowOptionLikeValue.has(optionName),\n allowNegation: kind === \"boolean\",\n }\n}\n\nconst buildOptionSpecs = (argsDef: Readonly<ArgsDef>): OptionSpecs => {\n const longOptions = new Map<string, OptionSpec>()\n const shortOptions = new Map<string, OptionSpec>()\n\n for (const [argName, arg] of Object.entries(argsDef)) {\n if (arg.type === \"positional\") {\n continue\n }\n\n const valueKind: OptionValueKind = arg.type === \"boolean\" ? \"boolean\" : \"value\"\n const kebabName = toKebabCase(argName)\n longOptions.set(argName, toOptionSpec(valueKind, argName))\n longOptions.set(kebabName, toOptionSpec(valueKind, kebabName))\n\n const aliases =\n \"alias\" in arg ? (Array.isArray(arg.alias) ? arg.alias : typeof arg.alias === \"string\" ? [arg.alias] : []) : []\n\n for (const alias of aliases) {\n if (alias.length === 1) {\n shortOptions.set(alias, toOptionSpec(valueKind, alias))\n continue\n }\n\n longOptions.set(alias, toOptionSpec(valueKind, alias))\n const kebabAlias = toKebabCase(alias)\n longOptions.set(kebabAlias, toOptionSpec(valueKind, kebabAlias))\n }\n }\n\n return { longOptions, shortOptions }\n}\n\nconst ensureOptionValueToken = ({\n valueToken,\n optionLabel,\n optionSpec,\n}: {\n readonly valueToken: string\n readonly optionLabel: string\n readonly optionSpec: OptionSpec\n}): void => {\n if (valueToken.length === 0) {\n throw createCliError(\"INVALID_ARGUMENT\", { message: `Missing value for option: ${optionLabel}` })\n }\n if (valueToken.startsWith(\"-\") && optionSpec.allowOptionLikeValue !== true) {\n throw createCliError(\"INVALID_ARGUMENT\", { message: `Missing value for option: ${optionLabel}` })\n }\n}\n\nconst resolveLongOption = ({\n rawOptionName,\n optionSpecs,\n}: {\n readonly rawOptionName: string\n readonly optionSpecs: OptionSpecs\n}):\n | {\n readonly optionSpec: OptionSpec\n readonly optionName: string\n }\n | undefined => {\n const directOptionSpec = optionSpecs.longOptions.get(rawOptionName)\n if (directOptionSpec !== undefined) {\n return {\n optionSpec: directOptionSpec,\n optionName: rawOptionName,\n }\n }\n\n if (rawOptionName.startsWith(\"no-\")) {\n const optionName = rawOptionName.slice(3)\n const negatedOptionSpec = optionSpecs.longOptions.get(optionName)\n if (negatedOptionSpec?.allowNegation === true) {\n return {\n optionSpec: negatedOptionSpec,\n optionName,\n }\n }\n }\n\n return undefined\n}\n\nconst validateLongOptionToken = ({\n args,\n index,\n token,\n optionSpecs,\n}: {\n readonly args: readonly string[]\n readonly index: number\n readonly token: string\n readonly optionSpecs: OptionSpecs\n}): number => {\n const value = token.slice(2)\n if (value.length === 0) {\n return index\n }\n\n const separatorIndex = value.indexOf(\"=\")\n const rawOptionName = separatorIndex >= 0 ? value.slice(0, separatorIndex) : value\n const resolved = resolveLongOption({\n rawOptionName,\n optionSpecs,\n })\n if (resolved === undefined) {\n throw createCliError(\"INVALID_ARGUMENT\", { message: `Unknown option: --${rawOptionName}` })\n }\n\n if (resolved.optionSpec.kind !== \"value\") {\n return index\n }\n\n if (separatorIndex >= 0) {\n const inlineValue = value.slice(separatorIndex + 1)\n if (inlineValue.length === 0) {\n throw createCliError(\"INVALID_ARGUMENT\", { message: `Missing value for option: --${rawOptionName}` })\n }\n return index\n }\n\n const nextToken = args[index + 1]\n if (typeof nextToken !== \"string\") {\n throw createCliError(\"INVALID_ARGUMENT\", { message: `Missing value for option: --${rawOptionName}` })\n }\n ensureOptionValueToken({\n valueToken: nextToken,\n optionLabel: `--${rawOptionName}`,\n optionSpec: resolved.optionSpec,\n })\n return index + 1\n}\n\nconst validateShortOptionToken = ({\n args,\n index,\n token,\n optionSpecs,\n}: {\n readonly args: readonly string[]\n readonly index: number\n readonly token: string\n readonly optionSpecs: OptionSpecs\n}): number => {\n const shortFlags = token.slice(1)\n for (let flagIndex = 0; flagIndex < shortFlags.length; flagIndex += 1) {\n const option = shortFlags[flagIndex]\n if (typeof option !== \"string\" || option.length === 0) {\n continue\n }\n\n const optionSpec = optionSpecs.shortOptions.get(option)\n if (optionSpec === undefined) {\n throw createCliError(\"INVALID_ARGUMENT\", { message: `Unknown option: -${option}` })\n }\n if (optionSpec.kind !== \"value\") {\n continue\n }\n\n if (flagIndex < shortFlags.length - 1) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: `Missing value for option: -${option}`,\n })\n }\n\n const nextToken = args[index + 1]\n if (typeof nextToken !== \"string\") {\n throw createCliError(\"INVALID_ARGUMENT\", { message: `Missing value for option: -${option}` })\n }\n ensureOptionValueToken({\n valueToken: nextToken,\n optionLabel: `-${option}`,\n optionSpec,\n })\n return index + 1\n }\n return index\n}\n\nconst validateRawOptions = (args: readonly string[], optionSpecs: OptionSpecs): void => {\n for (let index = 0; index < args.length; index += 1) {\n const token = args[index]\n if (typeof token !== \"string\") {\n continue\n }\n if (token === \"--\") {\n break\n }\n if (!token.startsWith(\"-\") || token === \"-\") {\n continue\n }\n\n if (token.startsWith(\"--\")) {\n index = validateLongOptionToken({\n args,\n index,\n token,\n optionSpecs,\n })\n continue\n }\n\n index = validateShortOptionToken({\n args,\n index,\n token,\n optionSpecs,\n })\n }\n}\n\nconst getPositionals = (args: { readonly _: unknown[] }): string[] => {\n return args._.filter((value): value is string => typeof value === \"string\")\n}\n\nconst collectOptionValues = ({\n args,\n optionNames,\n}: {\n readonly args: readonly string[]\n readonly optionNames: ReadonlyArray<string>\n}): string[] => {\n const values: string[] = []\n const optionNameSet = new Set(optionNames)\n\n for (let index = 0; index < args.length; index += 1) {\n const token = args[index]\n if (typeof token !== \"string\") {\n continue\n }\n\n if (token === \"--\") {\n break\n }\n\n if (!token.startsWith(\"--\")) {\n continue\n }\n\n const eqIndex = token.indexOf(\"=\")\n const rawName = eqIndex >= 0 ? token.slice(2, eqIndex) : token.slice(2)\n if (optionNameSet.has(rawName) !== true) {\n continue\n }\n\n if (eqIndex >= 0) {\n values.push(token.slice(eqIndex + 1))\n continue\n }\n\n const nextToken = args[index + 1]\n if (typeof nextToken === \"string\") {\n values.push(nextToken)\n index += 1\n }\n }\n\n return values\n}\n\nconst mergeFzfArgs = ({\n defaults,\n extras,\n}: {\n readonly defaults: ReadonlyArray<string>\n readonly extras: ReadonlyArray<string>\n}): string[] => {\n const merged = [...defaults]\n for (const arg of extras) {\n if (merged.includes(arg) !== true) {\n merged.push(arg)\n }\n }\n return merged\n}\n\nconst toNumberOption = ({\n value,\n optionName,\n}: {\n readonly value: unknown\n readonly optionName: string\n}): number | undefined => {\n if (value === undefined) {\n return undefined\n }\n if (typeof value !== \"string\") {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: `${optionName} must be a number`,\n })\n }\n\n const parsed = Number.parseInt(value, 10)\n if (Number.isFinite(parsed) !== true || parsed <= 0) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: `${optionName} must be a positive integer`,\n })\n }\n return parsed\n}\n\nconst ensureArgumentCount = ({\n command,\n args,\n min,\n max,\n}: {\n readonly command: string\n readonly args: readonly string[]\n readonly min: number\n readonly max: number\n}): void => {\n if (args.length < min || args.length > max) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: `${command} expects ${String(min)}-${String(max)} positional argument(s), received ${String(args.length)}`,\n details: { command, args },\n })\n }\n}\n\nconst ensureHasCommandAfterDoubleDash = ({\n command,\n argsAfterDoubleDash,\n}: {\n readonly command: string\n readonly argsAfterDoubleDash: readonly string[]\n}): void => {\n if (argsAfterDoubleDash.length === 0) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: `${command} requires arguments after --`,\n })\n }\n}\n\nconst resolveBaseBranch = async ({\n repoRoot,\n config,\n}: {\n readonly repoRoot: string\n readonly config: ResolvedConfig\n}): Promise<string> => {\n if (typeof config.git.baseBranch === \"string\" && config.git.baseBranch.length > 0) {\n return config.git.baseBranch\n }\n\n const remote = config.git.baseRemote\n const resolved = await runGitCommand({\n cwd: repoRoot,\n args: [\"symbolic-ref\", \"--quiet\", \"--short\", `refs/remotes/${remote}/HEAD`],\n reject: false,\n })\n if (resolved.exitCode === 0) {\n const raw = resolved.stdout.trim()\n const prefix = `${remote}/`\n if (raw.startsWith(prefix)) {\n return raw.slice(prefix.length)\n }\n }\n\n for (const candidate of [\"main\", \"master\"]) {\n if (await doesGitRefExist(repoRoot, `refs/heads/${candidate}`)) {\n return candidate\n }\n }\n\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: \"Unable to resolve base branch from config.yml (baseRemote/HEAD -> main/master).\",\n details: {\n remote,\n },\n })\n}\n\nconst ensureTargetPathWritable = async (targetPath: string): Promise<void> => {\n try {\n await access(targetPath, fsConstants.F_OK)\n } catch {\n await mkdir(dirname(targetPath), { recursive: true })\n return\n }\n\n const entries = await readdir(targetPath)\n if (entries.length > 0) {\n throw createCliError(\"TARGET_PATH_NOT_EMPTY\", {\n message: `Target path is not empty: ${targetPath}`,\n details: { path: targetPath },\n })\n }\n}\n\nconst buildJsonSuccess = ({\n command,\n status,\n repoRoot,\n details,\n}: {\n readonly command: string\n readonly status: JsonSuccessStatus\n readonly repoRoot: string | null\n readonly details?: Record<string, unknown>\n}): JsonSuccess => {\n return {\n schemaVersion: SCHEMA_VERSION,\n command,\n status,\n repoRoot,\n ...(details ?? {}),\n }\n}\n\nconst buildJsonError = ({\n command,\n repoRoot,\n error,\n}: {\n readonly command: string\n readonly repoRoot: string | null\n readonly error: CliError\n}): Record<string, unknown> => {\n return {\n schemaVersion: SCHEMA_VERSION,\n command,\n status: \"error\",\n repoRoot,\n code: error.code,\n message: error.message,\n details: error.details,\n }\n}\n\nconst resolveTargetWorktreeByBranch = ({\n branch,\n worktrees,\n}: {\n readonly branch: string\n readonly worktrees: readonly WorktreeStatus[]\n}): WorktreeStatus => {\n const found = worktrees.find((worktree) => worktree.branch === branch)\n if (found !== undefined) {\n return found\n }\n throw createCliError(\"WORKTREE_NOT_FOUND\", {\n message: `Worktree not found for branch: ${branch}`,\n details: { branch },\n })\n}\n\nconst resolveCurrentWorktree = ({\n snapshot,\n currentWorktreeRoot,\n}: {\n readonly snapshot: WorktreeSnapshot\n readonly currentWorktreeRoot: string\n}): WorktreeStatus => {\n const directMatch = snapshot.worktrees.find((worktree) => worktree.path === currentWorktreeRoot)\n if (directMatch !== undefined) {\n return directMatch\n }\n const containing = snapshot.worktrees.find((worktree) => {\n return currentWorktreeRoot.startsWith(`${worktree.path}${sep}`)\n })\n if (containing !== undefined) {\n return containing\n }\n throw createCliError(\"WORKTREE_NOT_FOUND\", {\n message: \"No worktree found for current location\",\n details: { currentWorktreeRoot },\n })\n}\n\nconst validateInitializedForWrite = async (repoRoot: string): Promise<void> => {\n if (await isInitialized(repoRoot)) {\n return\n }\n throw createCliError(\"NOT_INITIALIZED\", {\n message: \"Repository is not initialized. Run `vde-worktree init` first.\",\n details: { repoRoot },\n })\n}\n\nconst randomWipBranchName = (): string => {\n const random = Math.floor(Math.random() * 1_000_000)\n return `wip-${String(random).padStart(6, \"0\")}`\n}\n\nconst parseForceFlags = (parsedArgs: Record<string, unknown>): ParsedForceFlags => {\n const globalForce = parsedArgs.force === true\n return {\n forceDirty: globalForce || parsedArgs.forceDirty === true,\n allowUnpushed: globalForce || parsedArgs.allowUnpushed === true,\n forceUnmerged: globalForce || parsedArgs.forceUnmerged === true,\n forceLocked: globalForce || parsedArgs.forceLocked === true,\n }\n}\n\nconst hasAnyForceFlag = (flags: ParsedForceFlags): boolean => {\n return flags.forceDirty || flags.allowUnpushed || flags.forceUnmerged || flags.forceLocked\n}\n\nconst ensureUnsafeForNonTty = ({\n runtime,\n reason,\n}: {\n readonly runtime: CommonRuntime\n readonly reason: string\n}): void => {\n if (runtime.isInteractive || runtime.allowUnsafe) {\n return\n }\n throw createCliError(\"UNSAFE_FLAG_REQUIRED\", {\n message: `UNSAFE_FLAG_REQUIRED: ${reason}`,\n })\n}\n\nconst resolveRemoteAndBranch = (\n remoteBranch: string,\n): {\n readonly remote: string\n readonly branch: string\n} => {\n const separatorIndex = remoteBranch.indexOf(\"/\")\n if (separatorIndex <= 0 || separatorIndex >= remoteBranch.length - 1) {\n throw createCliError(\"INVALID_REMOTE_BRANCH_FORMAT\", {\n message: `Invalid remote branch format: ${remoteBranch}`,\n details: { value: remoteBranch },\n })\n }\n return {\n remote: remoteBranch.slice(0, separatorIndex),\n branch: remoteBranch.slice(separatorIndex + 1),\n }\n}\n\nconst resolveCompletionShell = (value: string): CompletionShell => {\n if (COMPLETION_SHELLS.includes(value as CompletionShell)) {\n return value as CompletionShell\n }\n\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: `Unsupported shell for completion: ${value}`,\n details: {\n value,\n supported: COMPLETION_SHELLS,\n },\n })\n}\n\nconst resolveCompletionSourceCandidates = (shell: CompletionShell): string[] => {\n const relativeCompletionFile = COMPLETION_FILE_BY_SHELL[shell]\n const moduleDirectory = dirname(fileURLToPath(import.meta.url))\n return [\n resolve(moduleDirectory, \"..\", \"..\", \"completions\", relativeCompletionFile),\n resolve(moduleDirectory, \"..\", \"completions\", relativeCompletionFile),\n resolve(process.cwd(), \"completions\", relativeCompletionFile),\n ]\n}\n\nconst loadCompletionScript = async (shell: CompletionShell): Promise<string> => {\n const candidates = resolveCompletionSourceCandidates(shell)\n for (const candidate of candidates) {\n try {\n return await readFile(candidate, \"utf8\")\n } catch {\n continue\n }\n }\n\n throw createCliError(\"INTERNAL_ERROR\", {\n message: `Completion template not found for shell: ${shell}`,\n details: {\n shell,\n candidates,\n },\n })\n}\n\nconst resolveDefaultCompletionInstallPath = (shell: CompletionShell): string => {\n const homeDirectory = homedir()\n if (homeDirectory.length === 0) {\n throw createCliError(\"INTERNAL_ERROR\", {\n message: \"Unable to resolve home directory for completion installation\",\n details: {\n shell,\n },\n })\n }\n\n if (shell === \"zsh\") {\n return join(homeDirectory, \".zsh\", \"completions\", \"_vw\")\n }\n return join(homeDirectory, \".config\", \"fish\", \"completions\", \"vw.fish\")\n}\n\nconst resolveCompletionInstallPath = ({\n shell,\n requestedPath,\n}: {\n readonly shell: CompletionShell\n readonly requestedPath?: string\n}): string => {\n if (typeof requestedPath === \"string\" && requestedPath.trim().length > 0) {\n return resolve(requestedPath)\n }\n return resolveDefaultCompletionInstallPath(shell)\n}\n\nconst installCompletionScript = async ({\n content,\n destinationPath,\n}: {\n readonly content: string\n readonly destinationPath: string\n}): Promise<void> => {\n await mkdir(dirname(destinationPath), { recursive: true })\n await writeFile(destinationPath, content, \"utf8\")\n}\n\nconst normalizeHookName = (value: string): string => {\n if (/^(pre|post)-[a-z0-9][a-z0-9-]*$/.test(value) !== true) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: \"hookName must be pre-* or post-*\",\n details: { hookName: value },\n })\n }\n return value\n}\n\nconst defaultOwner = (): string => {\n return process.env.USER ?? process.env.USERNAME ?? \"unknown\"\n}\n\nconst resolveBranchDeleteMode = (forceFlags: ParsedForceFlags): \"-d\" | \"-D\" => {\n if (forceFlags.forceDirty || forceFlags.forceUnmerged || forceFlags.allowUnpushed || forceFlags.forceLocked) {\n return \"-D\"\n }\n return \"-d\"\n}\n\nconst validateDeleteSafety = ({\n target,\n forceFlags,\n}: {\n readonly target: WorktreeStatus\n readonly forceFlags: ParsedForceFlags\n}): void => {\n if (target.dirty && forceFlags.forceDirty !== true) {\n throw createCliError(\"DIRTY_WORKTREE\", {\n message: \"Worktree has uncommitted changes\",\n details: { branch: target.branch, path: target.path },\n })\n }\n if (target.locked.value && forceFlags.forceLocked !== true) {\n throw createCliError(\"LOCKED_WORKTREE\", {\n message: \"Worktree is locked\",\n details: { branch: target.branch, path: target.path, reason: target.locked.reason },\n })\n }\n if (target.merged.overall !== true && forceFlags.forceUnmerged !== true) {\n throw createCliError(\"UNMERGED_WORKTREE\", {\n message: \"Worktree is not merged (or merge state is unknown)\",\n details: { branch: target.branch, path: target.path, merged: target.merged },\n })\n }\n if ((target.upstream.ahead === null || target.upstream.ahead > 0) && forceFlags.allowUnpushed !== true) {\n throw createCliError(\"UNPUSHED_WORKTREE\", {\n message: \"Worktree has unpushed commits (or push state is unknown)\",\n details: { branch: target.branch, path: target.path, upstream: target.upstream },\n })\n }\n}\n\nconst resolveLinkTargetPath = ({\n sourcePath,\n destinationPath,\n}: {\n readonly sourcePath: string\n readonly destinationPath: string\n}): string => {\n return relative(dirname(destinationPath), sourcePath)\n}\n\nconst resolveFileCopyTargets = ({\n repoRoot,\n targetWorktreeRoot,\n relativePath,\n}: {\n readonly repoRoot: string\n readonly targetWorktreeRoot: string\n readonly relativePath: string\n}): {\n readonly sourcePath: string\n readonly destinationPath: string\n readonly relativeFromRoot: string\n} => {\n const sourcePath = resolveRepoRelativePath({\n repoRoot,\n relativePath,\n })\n const relativeFromRoot = relative(repoRoot, sourcePath)\n const destinationPath = ensurePathInsideRoot({\n rootPath: targetWorktreeRoot,\n path: resolve(targetWorktreeRoot, relativeFromRoot),\n message: \"Path is outside target worktree root\",\n })\n return { sourcePath, destinationPath, relativeFromRoot }\n}\n\nconst resolveTargetWorktreeRootForCopyLink = ({\n repoContext,\n snapshot,\n}: {\n readonly repoContext: { currentWorktreeRoot: string }\n readonly snapshot: WorktreeSnapshot\n}): string => {\n const rawTarget = process.env.WT_WORKTREE_PATH ?? repoContext.currentWorktreeRoot\n const resolvedTarget = resolvePathFromCwd({\n cwd: repoContext.currentWorktreeRoot,\n path: rawTarget,\n })\n\n const matched = snapshot.worktrees\n .filter((worktree) => {\n return worktree.path === resolvedTarget || resolvedTarget.startsWith(`${worktree.path}${sep}`)\n })\n .sort((a, b) => b.path.length - a.path.length)[0]\n\n if (matched === undefined) {\n throw createCliError(\"WORKTREE_NOT_FOUND\", {\n message: \"copy/link target worktree not found\",\n details: {\n rawTarget,\n resolvedTarget,\n },\n })\n }\n\n return matched.path\n}\n\nconst ensureBranchIsNotPrimary = ({\n branch,\n baseBranch,\n}: {\n readonly branch: string\n readonly baseBranch: string\n}): void => {\n if (branch !== baseBranch) {\n return\n }\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: \"extract cannot target the base branch\",\n details: { branch, baseBranch },\n })\n}\n\nconst toManagedWorktreeName = ({\n managedWorktreeRoot,\n worktreePath,\n}: {\n readonly managedWorktreeRoot: string\n readonly worktreePath: string\n}): string | null => {\n if (\n isManagedWorktreePath({\n worktreePath,\n managedWorktreeRoot,\n }) !== true\n ) {\n return null\n }\n const relativePath = relative(managedWorktreeRoot, worktreePath)\n return relativePath.split(sep).join(\"/\")\n}\n\nconst resolveManagedWorktreePathFromName = ({\n managedWorktreeRoot,\n optionName,\n worktreeName,\n}: {\n readonly managedWorktreeRoot: string\n readonly optionName: \"--from\" | \"--to\"\n readonly worktreeName: string\n}): string => {\n const normalized = worktreeName.trim()\n if (normalized.length === 0) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: `${optionName} requires non-empty worktree name`,\n details: { optionName, worktreeName },\n })\n }\n\n let resolvedPath: string\n try {\n resolvedPath = resolveRepoRelativePath({\n repoRoot: managedWorktreeRoot,\n relativePath: normalized,\n })\n } catch (error) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: `${optionName} expects vw-managed worktree name`,\n details: { optionName, worktreeName },\n cause: error,\n })\n }\n\n if (resolvedPath === managedWorktreeRoot) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: `${optionName} expects vw-managed worktree name`,\n details: { optionName, worktreeName },\n })\n }\n\n return resolvedPath\n}\n\nconst resolveManagedNonPrimaryWorktreeByBranch = ({\n repoRoot,\n managedWorktreeRoot,\n branch,\n worktrees,\n optionName,\n worktreeName,\n role,\n}: {\n readonly repoRoot: string\n readonly managedWorktreeRoot: string\n readonly branch: string\n readonly worktrees: readonly WorktreeStatus[]\n readonly optionName: \"--from\" | \"--to\"\n readonly worktreeName?: string\n readonly role: \"source\" | \"target\"\n}): WorktreeStatus => {\n const managedCandidates = worktrees.filter((worktree) => {\n return (\n worktree.branch === branch &&\n worktree.path !== repoRoot &&\n toManagedWorktreeName({ managedWorktreeRoot, worktreePath: worktree.path }) !== null\n )\n })\n\n if (typeof worktreeName === \"string\") {\n const resolvedPath = resolveManagedWorktreePathFromName({\n managedWorktreeRoot,\n optionName,\n worktreeName,\n })\n const selected = managedCandidates.find((worktree) => worktree.path === resolvedPath)\n if (selected === undefined) {\n throw createCliError(\"WORKTREE_NOT_FOUND\", {\n message: `${role} worktree not found for branch '${branch}' and name '${worktreeName}'`,\n details: { branch, worktreeName, optionName, role },\n })\n }\n return selected\n }\n\n if (managedCandidates.length === 0) {\n throw createCliError(\"WORKTREE_NOT_FOUND\", {\n message: `No managed ${role} worktree found for branch: ${branch}`,\n details: { branch, role },\n })\n }\n if (managedCandidates.length > 1) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: `Multiple managed ${role} worktrees found; use ${optionName} <worktree-name>`,\n details: {\n branch,\n role,\n optionName,\n candidates: managedCandidates.map((worktree) => {\n return toManagedWorktreeName({ managedWorktreeRoot, worktreePath: worktree.path }) ?? worktree.path\n }),\n },\n })\n }\n return managedCandidates[0]!\n}\n\nconst createStashEntry = async ({\n cwd,\n message,\n}: {\n readonly cwd: string\n readonly message: string\n}): Promise<string> => {\n await runGitCommand({\n cwd,\n args: [\"stash\", \"push\", \"-u\", \"-m\", message],\n })\n const stashTop = await runGitCommand({\n cwd,\n args: [\"rev-parse\", \"--verify\", \"-q\", \"stash@{0}\"],\n reject: false,\n })\n const stashOid = stashTop.stdout.trim()\n if (stashTop.exitCode === 0 && stashOid.length > 0) {\n return stashOid\n }\n throw createCliError(\"INTERNAL_ERROR\", {\n message: \"Failed to resolve created stash entry\",\n details: { cwd, message },\n })\n}\n\nconst restoreStashedChanges = async ({\n cwd,\n stashOid,\n}: {\n readonly cwd: string\n readonly stashOid: string\n}): Promise<void> => {\n const applyResult = await runGitCommand({\n cwd,\n args: [\"stash\", \"apply\", stashOid],\n reject: false,\n })\n if (applyResult.exitCode !== 0) {\n throw createCliError(\"STASH_APPLY_FAILED\", {\n message: \"Failed to auto-restore stashed changes after pre-hook failure\",\n details: { cwd, stashOid },\n })\n }\n await dropStashByOid({ cwd, stashOid })\n}\n\nconst runPreHookWithAutoRestore = async ({\n name,\n context,\n restore,\n}: {\n readonly name: string\n readonly context: HookExecutionContext\n readonly restore?: (() => Promise<void>) | undefined\n}): Promise<void> => {\n try {\n await runPreHook({ name, context })\n } catch (error) {\n if (restore !== undefined) {\n try {\n await restore()\n } catch (restoreError) {\n const hookError = ensureCliError(error)\n const restoreCliError = ensureCliError(restoreError)\n throw createCliError(hookError.code, {\n message: `${hookError.message} (auto-restore failed)`,\n details: {\n ...hookError.details,\n autoRestoreFailed: true,\n autoRestoreError: {\n code: restoreCliError.code,\n message: restoreCliError.message,\n details: restoreCliError.details,\n },\n },\n cause: error,\n })\n }\n }\n throw error\n }\n}\n\nconst resolveStashRefByOid = async ({\n cwd,\n stashOid,\n}: {\n readonly cwd: string\n readonly stashOid: string\n}): Promise<string | null> => {\n const stashList = await runGitCommand({\n cwd,\n args: [\"stash\", \"list\", \"--format=%gd%x09%H\"],\n })\n const lines = stashList.stdout\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n for (const line of lines) {\n const [ref, oid] = line.split(\"\\t\")\n if (typeof ref === \"string\" && typeof oid === \"string\" && ref.length > 0 && oid === stashOid) {\n return ref\n }\n }\n return null\n}\n\nconst dropStashByOid = async ({\n cwd,\n stashOid,\n}: {\n readonly cwd: string\n readonly stashOid: string\n}): Promise<void> => {\n const stashRef = await resolveStashRefByOid({ cwd, stashOid })\n if (stashRef === null) {\n return\n }\n await runGitCommand({\n cwd,\n args: [\"stash\", \"drop\", stashRef],\n })\n}\n\nconst formatDisplayPath = (absolutePath: string): string => {\n const homeDirectory = homedir()\n if (homeDirectory.length === 0) {\n return absolutePath\n }\n if (absolutePath === homeDirectory) {\n return \"~\"\n }\n if (absolutePath.startsWith(`${homeDirectory}${sep}`)) {\n return `~${absolutePath.slice(homeDirectory.length)}`\n }\n return absolutePath\n}\n\nconst encodeCdPreviewField = (value: string): string => {\n return value\n .replace(/\\\\/g, \"\\\\\\\\\")\n .split(\"\\u001b\")\n .join(\"\\\\033\")\n .replace(/\\t/g, \" \")\n .replace(/\\r\\n?/g, \"\\n\")\n .replace(/\\n/g, \"\\\\n\")\n}\n\nconst formatMergedDisplayState = ({\n mergedOverall,\n isBaseBranch,\n baseLabel = \"base\",\n}: {\n readonly mergedOverall: boolean | null\n readonly isBaseBranch: boolean\n readonly baseLabel?: string\n}): string => {\n if (isBaseBranch) {\n return baseLabel\n }\n if (mergedOverall === true) {\n return \"merged\"\n }\n if (mergedOverall === false) {\n return \"unmerged\"\n }\n return \"unknown\"\n}\n\nconst formatMergedColor = ({\n mergedState,\n theme,\n}: {\n readonly mergedState: string\n readonly theme: CatppuccinTheme\n}): string => {\n const normalized = mergedState.toLowerCase()\n if (normalized === \"merged\") {\n return theme.merged(mergedState)\n }\n if (normalized === \"unmerged\") {\n return theme.unmerged(mergedState)\n }\n if (normalized === \"base\") {\n return theme.base(mergedState)\n }\n return theme.unknown(mergedState)\n}\n\nconst formatPrDisplayState = ({\n prStatus,\n isBaseBranch,\n}: {\n readonly prStatus: WorktreeStatus[\"pr\"][\"status\"]\n readonly isBaseBranch: boolean\n}): string => {\n if (isBaseBranch || prStatus === null) {\n return \"-\"\n }\n if (\n prStatus === \"none\" ||\n prStatus === \"open\" ||\n prStatus === \"merged\" ||\n prStatus === \"closed_unmerged\" ||\n prStatus === \"unknown\"\n ) {\n return prStatus\n }\n return \"unknown\"\n}\n\nconst formatListUpstreamCount = (value: number | null): string => {\n if (value === null) {\n return \"-\"\n }\n return String(value)\n}\n\nconst resolveListColumnContentWidth = ({\n rows,\n columnIndex,\n}: {\n readonly rows: readonly (readonly string[])[]\n readonly columnIndex: number\n}): number => {\n return rows.reduce((width, row) => {\n const cell = row[columnIndex] ?? \"\"\n return Math.max(width, stringWidth(cell))\n }, 0)\n}\n\nconst resolveListPathColumnWidth = ({\n rows,\n columns,\n truncateMode,\n fullPath,\n minWidth,\n}: {\n readonly rows: readonly (readonly string[])[]\n readonly columns: ReadonlyArray<ListTableColumn>\n readonly truncateMode: \"auto\" | \"never\"\n readonly fullPath: boolean\n readonly minWidth: number\n}): number | null => {\n const pathColumnIndex = columns.indexOf(\"path\")\n if (pathColumnIndex < 0) {\n return null\n }\n if (fullPath || truncateMode === \"never\") {\n return null\n }\n if (process.stdout.isTTY !== true) {\n return null\n }\n const terminalColumns = process.stdout.columns\n if (typeof terminalColumns !== \"number\" || Number.isFinite(terminalColumns) !== true || terminalColumns <= 0) {\n return null\n }\n\n const measuredNonPathWidth = columns\n .map((_, index) => {\n if (index === pathColumnIndex) {\n return 0\n }\n return resolveListColumnContentWidth({ rows, columnIndex: index })\n })\n .reduce((sum, width) => sum + width, 0)\n const borderWidth = columns.length + 1\n const paddingWidth = columns.length * LIST_TABLE_CELL_HORIZONTAL_PADDING\n const availablePathWidth = Math.floor(terminalColumns) - borderWidth - paddingWidth - measuredNonPathWidth\n\n return Math.max(minWidth, availablePathWidth)\n}\n\nconst resolveAheadBehindAgainstBaseBranch = async ({\n repoRoot,\n baseBranch,\n worktree,\n}: {\n readonly repoRoot: string\n readonly baseBranch: string | null\n readonly worktree: WorktreeStatus\n}): Promise<{\n readonly ahead: number | null\n readonly behind: number | null\n}> => {\n if (baseBranch === null) {\n return { ahead: null, behind: null }\n }\n\n const targetRef = worktree.branch ?? worktree.head\n const distance = await runGitCommand({\n cwd: repoRoot,\n args: [\"rev-list\", \"--left-right\", \"--count\", `${baseBranch}...${targetRef}`],\n reject: false,\n })\n\n if (distance.exitCode !== 0) {\n return { ahead: null, behind: null }\n }\n\n const [behindRaw, aheadRaw] = distance.stdout.trim().split(/\\s+/)\n const behind = Number.parseInt(behindRaw ?? \"\", 10)\n const ahead = Number.parseInt(aheadRaw ?? \"\", 10)\n\n return {\n ahead: Number.isNaN(ahead) ? null : ahead,\n behind: Number.isNaN(behind) ? null : behind,\n }\n}\n\nconst padToDisplayWidth = ({ value, width }: { readonly value: string; readonly width: number }): string => {\n const visibleLength = stringWidth(value)\n if (visibleLength >= width) {\n return value\n }\n return `${value}${\" \".repeat(width - visibleLength)}`\n}\n\nconst buildCdBranchLabel = ({\n worktree,\n currentWorktreeRoot,\n}: {\n readonly worktree: WorktreeStatus\n readonly currentWorktreeRoot: string\n}): string => {\n const isCurrent = worktree.path === currentWorktreeRoot\n return `${isCurrent ? \"*\" : \" \"} ${worktree.branch ?? \"(detached)\"}`\n}\n\nconst buildCdStateSummary = ({\n worktree,\n isBaseBranch,\n theme,\n}: {\n readonly worktree: WorktreeStatus\n readonly isBaseBranch: boolean\n readonly theme: CatppuccinTheme\n}): string => {\n const dirtyLabel = worktree.dirty ? \"DIRTY\" : \"CLEAN\"\n const mergedLabel = formatMergedDisplayState({\n mergedOverall: worktree.merged.overall,\n isBaseBranch,\n }).toUpperCase()\n const lockLabel = worktree.locked.value ? \"LOCK\" : \"OPEN\"\n\n const dirtyBadge = (worktree.dirty ? theme.unmerged : theme.clean)(\n padToDisplayWidth({\n value: dirtyLabel,\n width: 5,\n }),\n )\n const mergedBadge = formatMergedColor({\n mergedState: padToDisplayWidth({\n value: mergedLabel,\n width: 8,\n }),\n theme,\n })\n const lockBadge = (worktree.locked.value ? theme.locked : theme.muted)(\n padToDisplayWidth({\n value: lockLabel,\n width: 4,\n }),\n )\n\n return `${dirtyBadge} ${theme.muted(\"|\")} ${mergedBadge} ${theme.muted(\"|\")} ${lockBadge}`\n}\n\nconst buildCdPreviewText = ({\n worktree,\n baseBranch,\n theme,\n}: {\n readonly worktree: WorktreeStatus\n readonly baseBranch: string | null\n readonly theme: CatppuccinTheme\n}): string => {\n const isBaseBranch = typeof worktree.branch === \"string\" && baseBranch !== null && worktree.branch === baseBranch\n const branchLabel =\n worktree.branch === null\n ? theme.branchDetached(\"(detached)\")\n : isBaseBranch\n ? theme.base(worktree.branch)\n : theme.branch(worktree.branch)\n const pathLabel = theme.path(formatDisplayPath(worktree.path))\n const dirtyValue = worktree.dirty ? theme.unmerged(\"[DIRTY]\") : theme.merged(\"[CLEAN]\")\n const lockedValue = worktree.locked.value ? theme.locked(\"[LOCKED]\") : theme.clean(\"[OPEN]\")\n const mergedState = formatMergedDisplayState({\n mergedOverall: worktree.merged.overall,\n isBaseBranch,\n })\n const mergedValue = formatMergedColor({\n mergedState: mergedState.toUpperCase(),\n theme,\n })\n const remoteValue =\n worktree.upstream.remote === null ? theme.muted(\"none\") : theme.value(worktree.upstream.remote ?? \"none\")\n const aheadValue =\n worktree.upstream.ahead === null\n ? theme.unknown(\"UNKNOWN\")\n : worktree.upstream.ahead > 0\n ? theme.unmerged(String(worktree.upstream.ahead))\n : theme.merged(\"0\")\n const behindValue =\n worktree.upstream.behind === null\n ? theme.unknown(\"UNKNOWN\")\n : worktree.upstream.behind > 0\n ? theme.unknown(String(worktree.upstream.behind))\n : theme.merged(\"0\")\n const divider = theme.muted(\"----------------------------------------\")\n const lines = [\n theme.previewSection(\"WORKTREE\"),\n divider,\n ` ${theme.previewLabel(\"Branch \")}: ${branchLabel}`,\n ` ${theme.previewLabel(\"Path \")}: ${pathLabel}`,\n \"\",\n theme.previewSection(\"STATUS\"),\n divider,\n ` ${theme.previewLabel(\"Dirty \")}: ${dirtyValue}`,\n ` ${theme.previewLabel(\"Locked \")}: ${lockedValue}`,\n ` ${theme.previewLabel(\"Merged \")}: ${mergedValue}`,\n ` ${theme.previewLabel(\"Remote \")}: ${remoteValue}`,\n ` ${theme.previewLabel(\"Ahead \")}: ${aheadValue}`,\n ` ${theme.previewLabel(\"Behind \")}: ${behindValue}`,\n ]\n\n if (worktree.locked.value) {\n lines.push(\"\")\n lines.push(theme.previewSection(\"LOCK\"))\n lines.push(divider)\n if (typeof worktree.locked.reason === \"string\" && worktree.locked.reason.length > 0) {\n lines.push(` ${theme.previewLabel(\"Reason \")}: ${theme.value(worktree.locked.reason)}`)\n }\n if (typeof worktree.locked.owner === \"string\" && worktree.locked.owner.length > 0) {\n lines.push(` ${theme.previewLabel(\"Owner \")}: ${theme.value(worktree.locked.owner)}`)\n }\n }\n\n return lines.join(\"\\n\")\n}\n\nconst buildCdCandidateLine = ({\n worktree,\n baseBranch,\n theme,\n currentWorktreeRoot,\n branchColumnWidth,\n}: {\n readonly worktree: WorktreeStatus\n readonly baseBranch: string | null\n readonly theme: CatppuccinTheme\n readonly currentWorktreeRoot: string\n readonly branchColumnWidth: number\n}): string => {\n const isBaseBranch = typeof worktree.branch === \"string\" && baseBranch !== null && worktree.branch === baseBranch\n const branchLabel = buildCdBranchLabel({\n worktree,\n currentWorktreeRoot,\n })\n const branchLabelPadded = padToDisplayWidth({\n value: branchLabel,\n width: branchColumnWidth,\n })\n const isCurrent = worktree.path === currentWorktreeRoot\n const branchDisplay =\n worktree.branch === null\n ? theme.branchDetached(branchLabelPadded)\n : isCurrent\n ? theme.branchCurrent(branchLabelPadded)\n : isBaseBranch\n ? theme.base(branchLabelPadded)\n : theme.branch(branchLabelPadded)\n const stateSummary = buildCdStateSummary({\n worktree,\n isBaseBranch,\n theme,\n })\n\n return [\n `${branchDisplay} ${stateSummary}`,\n worktree.path,\n encodeCdPreviewField(\n buildCdPreviewText({\n worktree,\n baseBranch,\n theme,\n }),\n ),\n ].join(\"\\t\")\n}\n\nconst resolveCdSelectionPath = (selectedLine: string): string => {\n const parts = selectedLine.split(\"\\t\")\n const rawPath = parts[1]\n if (typeof rawPath === \"string\" && rawPath.length > 0) {\n return rawPath\n }\n return selectedLine\n}\n\nconst containsBranch = ({\n branch,\n worktrees,\n}: {\n readonly branch: string\n readonly worktrees: readonly WorktreeStatus[]\n}): boolean => {\n return worktrees.some((worktree) => worktree.branch === branch)\n}\n\nconst readStringOption = (parsedArgsRecord: Record<string, unknown>, key: string): string | undefined => {\n const value = parsedArgsRecord[key]\n if (typeof value === \"string\") {\n return value\n }\n return undefined\n}\n\nconst findCommandHelp = (commandName: string): CommandHelp | undefined => {\n return commandHelpEntries.find((entry) => entry.name === commandName)\n}\n\nconst renderGeneralHelpText = ({ version }: { readonly version: string }): string => {\n const commandList = commandHelpEntries.map((entry) => ` ${entry.name.padEnd(8)} ${entry.summary}`).join(\"\\n\")\n return [\n \"vde-worktree\",\n \"\",\n \"Usage:\",\n \" vw <command> [options]\",\n \" vde-worktree <command> [options]\",\n \"\",\n `Version: ${version}`,\n \"\",\n \"Commands:\",\n commandList,\n \"\",\n \"Global options:\",\n \" --json Output machine-readable JSON.\",\n \" --verbose Enable verbose logs.\",\n \" --no-hooks Disable hooks for this run (requires --allow-unsafe).\",\n \" --no-gh Disable GitHub CLI based PR status checks for this run.\",\n \" --full-path Disable list table path truncation.\",\n \" --allow-unsafe Explicitly allow unsafe behavior in non-TTY mode.\",\n \" --hook-timeout-ms <ms> Override hook timeout.\",\n \" --lock-timeout-ms <ms> Override repository lock timeout.\",\n \" -h, --help Show help.\",\n \" -v, --version Show version.\",\n \"\",\n \"Help commands:\",\n \" vw help\",\n \" vw help <command>\",\n \" vw <command> --help\",\n \"\",\n \"Examples:\",\n \" vw switch feature/foo\",\n ' cd \"$(vw cd)\"',\n \" vw completion zsh --install\",\n \" vw del feature/foo --force-unmerged --allow-unpushed --allow-unsafe\",\n ].join(\"\\n\")\n}\n\nconst renderCommandHelpText = ({ entry }: { readonly entry: CommandHelp }): string => {\n const lines = [`Command: ${entry.name}`, \"\", \"Usage:\", ` ${entry.usage}`, \"\", \"Summary:\", ` ${entry.summary}`]\n\n if (entry.details.length > 0) {\n lines.push(\"\", \"Details:\")\n for (const detail of entry.details) {\n lines.push(` - ${detail}`)\n }\n }\n\n if (entry.options !== undefined && entry.options.length > 0) {\n lines.push(\"\", \"Options:\")\n for (const option of entry.options) {\n lines.push(` - ${option}`)\n }\n }\n\n if (entry.examples !== undefined && entry.examples.length > 0) {\n lines.push(\"\", \"Examples:\")\n for (const example of entry.examples) {\n lines.push(` ${example}`)\n }\n }\n\n lines.push(\"\", \"Show all commands: vw help\")\n return lines.join(\"\\n\")\n}\n\nconst createHookContext = ({\n runtime,\n repoRoot,\n action,\n branch,\n worktreePath,\n stderr,\n extraEnv,\n}: {\n readonly runtime: CommonRuntime\n readonly repoRoot: string\n readonly action: string\n readonly branch?: string | null\n readonly worktreePath?: string\n readonly stderr: (line: string) => void\n readonly extraEnv?: Record<string, string>\n}): HookExecutionContext => {\n return {\n repoRoot,\n action,\n branch,\n worktreePath,\n timeoutMs: runtime.hookTimeoutMs,\n enabled: runtime.hooksEnabled,\n strictPostHooks: runtime.strictPostHooks,\n stderr,\n extraEnv,\n }\n}\n\nexport const createCli = (options: CLIOptions = {}): CLI => {\n const require = createRequire(import.meta.url)\n const version =\n options.version ??\n ((): string => {\n try {\n return loadPackageVersion(require)\n } catch {\n return \"0.0.0\"\n }\n })()\n\n const runtimeCwd = options.cwd ?? process.cwd()\n const stdout = options.stdout ?? ((line: string): void => console.log(line))\n const stderr = options.stderr ?? ((line: string): void => console.error(line))\n const selectPathWithFzf = options.selectPathWithFzf ?? defaultSelectPathWithFzf\n const isInteractiveFn =\n options.isInteractive ?? ((): boolean => process.stdout.isTTY === true && process.stderr.isTTY === true)\n\n let logger: Logger = createLogger()\n\n const rootArgsDef = {\n command: {\n type: \"positional\",\n description: \"Command name\",\n required: false,\n },\n prompt: {\n type: \"string\",\n valueHint: \"text\",\n description: \"Custom fzf prompt for cd command\",\n },\n fzfArg: {\n type: \"string\",\n valueHint: \"arg\",\n description: \"Additional argument passed to fzf (repeatable)\",\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON on stdout\",\n },\n verbose: {\n type: \"boolean\",\n description: \"Show detailed logs\",\n },\n hooks: {\n type: \"boolean\",\n description: \"Enable hooks (disable with --no-hooks)\",\n default: true,\n },\n gh: {\n type: \"boolean\",\n description: \"Enable GitHub CLI based PR status checks (disable with --no-gh)\",\n default: true,\n },\n fullPath: {\n type: \"boolean\",\n description: \"Disable list table path truncation\",\n },\n allowUnsafe: {\n type: \"boolean\",\n description: \"Allow unsafe operations\",\n },\n strictPostHooks: {\n type: \"boolean\",\n description: \"Fail when post hooks fail\",\n },\n hookTimeoutMs: {\n type: \"string\",\n valueHint: \"ms\",\n description: \"Override hook timeout (ms)\",\n },\n lockTimeoutMs: {\n type: \"string\",\n valueHint: \"ms\",\n description: \"Override lock timeout (ms)\",\n },\n allowAgent: {\n type: \"boolean\",\n description: \"Allow non-TTY execution for use command\",\n },\n allowShared: {\n type: \"boolean\",\n description: \"Allow use checkout when target branch is attached by another worktree\",\n },\n reason: {\n type: \"string\",\n valueHint: \"text\",\n description: \"Reason text for lock command\",\n },\n owner: {\n type: \"string\",\n valueHint: \"owner\",\n description: \"Owner for lock/unlock commands\",\n },\n force: {\n type: \"boolean\",\n description: \"Force operation\",\n },\n forceDirty: {\n type: \"boolean\",\n description: \"Allow dirty worktree for del\",\n },\n allowUnpushed: {\n type: \"boolean\",\n description: \"Allow unpushed commits for del\",\n },\n forceUnmerged: {\n type: \"boolean\",\n description: \"Allow unmerged worktree for del\",\n },\n forceLocked: {\n type: \"boolean\",\n description: \"Allow deleting locked worktree\",\n },\n apply: {\n type: \"boolean\",\n description: \"Apply changes\",\n },\n dryRun: {\n type: \"boolean\",\n description: \"Dry-run mode\",\n },\n current: {\n type: \"boolean\",\n description: \"Use current worktree for extract\",\n },\n from: {\n type: \"string\",\n valueHint: \"value\",\n description: \"For extract: filesystem path. For absorb: managed worktree name.\",\n },\n to: {\n type: \"string\",\n valueHint: \"worktree-name\",\n description: \"Worktree name used by unabsorb --to\",\n },\n stash: {\n type: \"boolean\",\n description: \"Allow stash for extract\",\n },\n keepStash: {\n type: \"boolean\",\n description: \"Keep stash entry after absorb/unabsorb\",\n },\n fallback: {\n type: \"boolean\",\n description: \"Enable fallback behavior (disable with --no-fallback)\",\n default: true,\n },\n install: {\n type: \"boolean\",\n description: \"Install generated artifacts to default location (used by completion command)\",\n },\n path: {\n type: \"string\",\n valueHint: \"path\",\n description: \"Custom file path (used by completion command install)\",\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n },\n version: {\n type: \"boolean\",\n alias: \"v\",\n description: \"Show version\",\n },\n } satisfies ArgsDef\n\n const optionSpecs = buildOptionSpecs(rootArgsDef)\n\n const run = async (rawArgs: string[] = process.argv.slice(2)): Promise<number> => {\n logger = createLogger()\n let command = \"unknown\"\n let jsonEnabled = false\n let repoRootForJson: string | null = null\n\n try {\n const { beforeDoubleDash, afterDoubleDash } = splitRawArgsByDoubleDash(rawArgs)\n validateRawOptions(beforeDoubleDash, optionSpecs)\n const parsedArgs = parseArgs(beforeDoubleDash, rootArgsDef)\n const parsedArgsRecord = parsedArgs as Record<string, unknown>\n const positionals = getPositionals(parsedArgs)\n command = positionals[0] ?? \"unknown\"\n const commandArgs = positionals.slice(1)\n jsonEnabled = parsedArgs.json === true\n const commandContext: CommandContext = {\n command,\n commandArgs,\n positionals,\n parsedArgs: parsedArgsRecord,\n jsonEnabled,\n }\n\n const readOnlyDispatch = await dispatchReadOnlyCommands({\n ...commandContext,\n version,\n availableCommandNames: commandHelpNames,\n stdout,\n findCommandHelp,\n renderGeneralHelpText,\n renderCommandHelpText,\n ensureArgumentCount,\n resolveCompletionShell,\n loadCompletionScript,\n resolveCompletionInstallPath,\n installCompletionScript,\n readStringOption,\n buildJsonSuccess,\n })\n if (readOnlyDispatch.handled) {\n return readOnlyDispatch.exitCode\n }\n\n logger = parsedArgs.verbose === true ? createLogger({ level: LogLevel.INFO }) : createLogger()\n\n const allowUnsafe = parsedArgs.allowUnsafe === true\n if (parsedArgs.hooks === false && allowUnsafe !== true) {\n throw createCliError(\"UNSAFE_FLAG_REQUIRED\", {\n message: \"UNSAFE_FLAG_REQUIRED: --no-hooks requires --allow-unsafe\",\n })\n }\n\n const repoContext = await resolveRepoContext(runtimeCwd)\n const repoRoot = repoContext.repoRoot\n repoRootForJson = repoRoot\n const { config: resolvedConfig } = await loadResolvedConfig({\n cwd: runtimeCwd,\n repoRoot,\n })\n const managedWorktreeRoot = getWorktreeRootPath(repoRoot, resolvedConfig.paths.worktreeRoot)\n\n const runtime: CommonRuntime = {\n command,\n json: jsonEnabled,\n hooksEnabled: parsedArgs.hooks !== false && resolvedConfig.hooks.enabled,\n ghEnabled: parsedArgs.gh !== false && resolvedConfig.github.enabled,\n strictPostHooks: parsedArgs.strictPostHooks === true,\n hookTimeoutMs: readNumberFromEnvOrDefault({\n rawValue:\n toNumberOption({ value: parsedArgs.hookTimeoutMs, optionName: \"--hook-timeout-ms\" }) ??\n resolvedConfig.hooks.timeoutMs,\n defaultValue: DEFAULT_HOOK_TIMEOUT_MS,\n }),\n lockTimeoutMs: readNumberFromEnvOrDefault({\n rawValue:\n toNumberOption({ value: parsedArgs.lockTimeoutMs, optionName: \"--lock-timeout-ms\" }) ??\n resolvedConfig.locks.timeoutMs,\n defaultValue: DEFAULT_LOCK_TIMEOUT_MS,\n }),\n allowUnsafe,\n isInteractive: isInteractiveFn(),\n }\n\n const staleLockTTLSeconds = readNumberFromEnvOrDefault({\n rawValue: resolvedConfig.locks.staleLockTTLSeconds,\n defaultValue: DEFAULT_STALE_LOCK_TTL_SECONDS,\n })\n\n const collectWorktreeSnapshot = async (_ignoredRepoRoot: string): Promise<WorktreeSnapshot> => {\n const baseBranch = await resolveBaseBranch({\n repoRoot,\n config: resolvedConfig,\n })\n return collectWorktreeSnapshotBase(repoRoot, {\n baseBranch,\n ghEnabled: runtime.ghEnabled,\n noGh: runtime.ghEnabled !== true,\n })\n }\n\n const runWriteOperation = async <T>(task: () => Promise<T>): Promise<T> => {\n if (WRITE_COMMANDS.has(command) !== true) {\n return task()\n }\n if (command !== \"init\") {\n await validateInitializedForWrite(repoRoot)\n }\n return withRepoLock(\n {\n repoRoot,\n command,\n timeoutMs: runtime.lockTimeoutMs,\n staleLockTTLSeconds,\n },\n task,\n )\n }\n\n type WorktreeMutationName = \"new\" | \"switch\" | \"mv\" | \"del\"\n\n type WorktreeMutationPlan<TPrecheckResult, TResult> = {\n readonly name: WorktreeMutationName\n readonly branch: string | null\n readonly worktreePath: string\n readonly extraEnv?: Record<string, string>\n readonly precheck: () => Promise<TPrecheckResult>\n readonly runGit: (precheckResult: TPrecheckResult) => Promise<TResult>\n readonly finalize?: (precheckResult: TPrecheckResult, result: TResult) => Promise<void>\n }\n\n const executeWorktreeMutation = async <TPrecheckResult, TResult>({\n name,\n branch,\n worktreePath,\n extraEnv,\n precheck,\n runGit,\n finalize,\n }: WorktreeMutationPlan<TPrecheckResult, TResult>): Promise<TResult> => {\n const precheckResult = await precheck()\n const hookContext = createHookContext({\n runtime,\n repoRoot,\n action: name,\n branch,\n worktreePath,\n stderr,\n extraEnv,\n })\n await runPreHook({ name, context: hookContext })\n const result = await runGit(precheckResult)\n if (finalize !== undefined) {\n await finalize(precheckResult, result)\n }\n await runPostHook({ name, context: hookContext })\n return result\n }\n\n const handleInit = async (): Promise<number> => {\n ensureArgumentCount({ command, args: commandArgs, min: 0, max: 0 })\n const result = await runWriteOperation(async () => {\n const hookContext = createHookContext({\n runtime,\n repoRoot,\n action: \"init\",\n branch: null,\n worktreePath: repoRoot,\n stderr,\n })\n await runPreHook({ name: \"init\", context: hookContext })\n const initialized = await initializeRepository({\n repoRoot,\n managedWorktreeRoot,\n })\n await runPostHook({ name: \"init\", context: hookContext })\n return initialized\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n initialized: true,\n alreadyInitialized: result.alreadyInitialized,\n },\n }),\n ),\n )\n }\n return EXIT_CODE.OK\n }\n\n const handleList = async (): Promise<number> => {\n ensureArgumentCount({ command, args: commandArgs, min: 0, max: 0 })\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n baseBranch: snapshot.baseBranch,\n managedWorktreeRoot,\n worktrees: snapshot.worktrees,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n const theme = createCatppuccinTheme({\n enabled: shouldUseAnsiColors({ interactive: runtime.isInteractive }),\n })\n const columns = resolvedConfig.list.table.columns\n const rows: string[][] = [\n [...columns],\n ...(await Promise.all(\n snapshot.worktrees.map(async (worktree) => {\n const distanceFromBase = await resolveAheadBehindAgainstBaseBranch({\n repoRoot,\n baseBranch: snapshot.baseBranch,\n worktree,\n })\n const isBaseBranch =\n worktree.branch !== null && snapshot.baseBranch !== null && worktree.branch === snapshot.baseBranch\n const mergedState =\n isBaseBranch === true\n ? \"-\"\n : worktree.merged.overall === true\n ? \"merged\"\n : worktree.merged.overall === false\n ? \"unmerged\"\n : \"unknown\"\n const prState = formatPrDisplayState({\n prStatus: worktree.pr.status,\n isBaseBranch,\n })\n const isCurrent = worktree.path === repoContext.currentWorktreeRoot\n const valuesByColumn: Record<ListTableColumn, string> = {\n branch: `${isCurrent ? \"*\" : \" \"} ${worktree.branch ?? \"(detached)\"}`,\n dirty: worktree.dirty ? \"dirty\" : \"clean\",\n merged: mergedState,\n pr: prState,\n locked: worktree.locked.value ? \"locked\" : \"-\",\n ahead: formatListUpstreamCount(distanceFromBase.ahead),\n behind: formatListUpstreamCount(distanceFromBase.behind),\n path: formatDisplayPath(worktree.path),\n }\n return columns.map((column) => valuesByColumn[column])\n }),\n )),\n ]\n\n const pathColumnWidth = resolveListPathColumnWidth({\n rows,\n columns,\n truncateMode: resolvedConfig.list.table.path.truncate,\n fullPath: parsedArgs.fullPath === true,\n minWidth: resolvedConfig.list.table.path.minWidth,\n })\n const pathColumnIndex = columns.indexOf(\"path\")\n const columnsConfig =\n pathColumnWidth === null || pathColumnIndex < 0\n ? undefined\n : {\n [pathColumnIndex]: {\n width: pathColumnWidth,\n truncate: pathColumnWidth,\n },\n }\n const rendered = table(rows, {\n border: getBorderCharacters(\"norc\"),\n drawHorizontalLine: (lineIndex, rowCount) => {\n return lineIndex === 0 || lineIndex === 1 || lineIndex === rowCount\n },\n columns: columnsConfig,\n })\n const colorized = hasDefaultListColumnOrder(columns)\n ? colorizeListTable({\n rendered,\n theme,\n })\n : rendered.trimEnd()\n\n for (const line of colorized.split(\"\\n\")) {\n stdout(line)\n }\n return EXIT_CODE.OK\n }\n\n const handleStatus = async (): Promise<number> => {\n ensureArgumentCount({ command, args: commandArgs, min: 0, max: 1 })\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const targetBranch = commandArgs[0]\n const targetWorktree =\n typeof targetBranch === \"string\" && targetBranch.length > 0\n ? resolveTargetWorktreeByBranch({ branch: targetBranch, worktrees: snapshot.worktrees })\n : resolveCurrentWorktree({\n snapshot,\n currentWorktreeRoot: repoContext.currentWorktreeRoot,\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n worktree: targetWorktree,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n stdout(`branch: ${targetWorktree.branch ?? \"(detached)\"}`)\n stdout(`path: ${formatDisplayPath(targetWorktree.path)}`)\n stdout(`dirty: ${targetWorktree.dirty ? \"true\" : \"false\"}`)\n stdout(`locked: ${targetWorktree.locked.value ? \"true\" : \"false\"}`)\n return EXIT_CODE.OK\n }\n\n const handlePath = async (): Promise<number> => {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n const branch = commandArgs[0] as string\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const target = resolveTargetWorktreeByBranch({ branch, worktrees: snapshot.worktrees })\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n branch,\n path: target.path,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n stdout(target.path)\n return EXIT_CODE.OK\n }\n\n const earlyRepoExitCode = await dispatchCommandHandler({\n command,\n handlers: createEarlyRepoCommandHandlers({\n initHandler: handleInit,\n listHandler: handleList,\n statusHandler: handleStatus,\n pathHandler: handlePath,\n }),\n })\n if (earlyRepoExitCode !== undefined) {\n return earlyRepoExitCode\n }\n\n const handleNew = async (): Promise<number> => {\n ensureArgumentCount({ command, args: commandArgs, min: 0, max: 1 })\n const branch = commandArgs[0] ?? randomWipBranchName()\n const targetPath = branchToWorktreePath(repoRoot, branch, resolvedConfig.paths.worktreeRoot)\n const result = await runWriteOperation(async () => {\n return executeWorktreeMutation({\n name: \"new\",\n branch,\n worktreePath: targetPath,\n precheck: async () => {\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n if (containsBranch({ branch, worktrees: snapshot.worktrees })) {\n throw createCliError(\"BRANCH_ALREADY_ATTACHED\", {\n message: `Branch is already attached to a worktree: ${branch}`,\n details: { branch },\n })\n }\n\n if (await doesGitRefExist(repoRoot, `refs/heads/${branch}`)) {\n throw createCliError(\"BRANCH_ALREADY_EXISTS\", {\n message: `Branch already exists locally: ${branch}`,\n details: { branch },\n })\n }\n\n await ensureTargetPathWritable(targetPath)\n const baseBranch = await resolveBaseBranch({\n repoRoot,\n config: resolvedConfig,\n })\n return { baseBranch }\n },\n runGit: async ({ baseBranch }) => {\n await runGitCommand({\n cwd: repoRoot,\n args: [\"worktree\", \"add\", \"-b\", branch, targetPath, baseBranch],\n })\n return { branch, path: targetPath }\n },\n finalize: async ({ baseBranch }) => {\n await upsertWorktreeMergeLifecycle({\n repoRoot,\n branch,\n baseBranch,\n observedDivergedHead: null,\n })\n },\n })\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"created\",\n repoRoot,\n details: result,\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n stdout(result.path)\n return EXIT_CODE.OK\n }\n\n const handleSwitch = async (): Promise<number> => {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n const branch = commandArgs[0] as string\n const result = await runWriteOperation(async () => {\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const existing = snapshot.worktrees.find((worktree) => worktree.branch === branch)\n if (existing !== undefined) {\n if (snapshot.baseBranch !== null) {\n await upsertWorktreeMergeLifecycle({\n repoRoot,\n branch,\n baseBranch: snapshot.baseBranch,\n observedDivergedHead: null,\n })\n }\n return { status: \"existing\" as const, branch, path: existing.path }\n }\n\n const targetPath = branchToWorktreePath(repoRoot, branch, resolvedConfig.paths.worktreeRoot)\n return executeWorktreeMutation({\n name: \"switch\",\n branch,\n worktreePath: targetPath,\n precheck: async () => {\n await ensureTargetPathWritable(targetPath)\n if (await doesGitRefExist(repoRoot, `refs/heads/${branch}`)) {\n return {\n gitArgs: [\"worktree\", \"add\", targetPath, branch] as const,\n lifecycleBaseBranch: snapshot.baseBranch,\n }\n }\n const baseBranch = await resolveBaseBranch({\n repoRoot,\n config: resolvedConfig,\n })\n return {\n gitArgs: [\"worktree\", \"add\", \"-b\", branch, targetPath, baseBranch] as const,\n lifecycleBaseBranch: baseBranch,\n }\n },\n runGit: async ({ gitArgs }) => {\n await runGitCommand({\n cwd: repoRoot,\n args: [...gitArgs],\n })\n return { status: \"created\" as const, branch, path: targetPath }\n },\n finalize: async ({ lifecycleBaseBranch }) => {\n if (lifecycleBaseBranch !== null) {\n await upsertWorktreeMergeLifecycle({\n repoRoot,\n branch,\n baseBranch: lifecycleBaseBranch,\n observedDivergedHead: null,\n })\n }\n },\n })\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: result.status,\n repoRoot,\n details: {\n branch: result.branch,\n path: result.path,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n stdout(result.path)\n return EXIT_CODE.OK\n }\n\n const writeCommandExitCode = await dispatchCommandHandler({\n command,\n handlers: createWriteCommandHandlers({\n newHandler: handleNew,\n switchHandler: handleSwitch,\n }),\n })\n if (writeCommandExitCode !== undefined) {\n return writeCommandExitCode\n }\n\n const handleMv = async (): Promise<number> => {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n const newBranch = commandArgs[0] as string\n const result = await runWriteOperation(async () => {\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const current = resolveCurrentWorktree({ snapshot, currentWorktreeRoot: repoContext.currentWorktreeRoot })\n const oldBranch = current.branch\n if (oldBranch === null) {\n throw createCliError(\"DETACHED_HEAD\", {\n message: \"mv requires a branch checkout (detached HEAD is not supported)\",\n details: { path: current.path },\n })\n }\n if (current.path === repoRoot) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: \"mv cannot move the primary worktree\",\n details: { path: current.path },\n })\n }\n if (oldBranch === newBranch) {\n return {\n branch: newBranch,\n path: current.path,\n }\n }\n const newPath = branchToWorktreePath(repoRoot, newBranch, resolvedConfig.paths.worktreeRoot)\n return executeWorktreeMutation({\n name: \"mv\",\n branch: newBranch,\n worktreePath: newPath,\n extraEnv: {\n WT_OLD_BRANCH: oldBranch,\n WT_NEW_BRANCH: newBranch,\n },\n precheck: async () => {\n if (containsBranch({ branch: newBranch, worktrees: snapshot.worktrees })) {\n throw createCliError(\"BRANCH_ALREADY_ATTACHED\", {\n message: `Branch is already attached to another worktree: ${newBranch}`,\n details: { branch: newBranch },\n })\n }\n if (await doesGitRefExist(repoRoot, `refs/heads/${newBranch}`)) {\n throw createCliError(\"BRANCH_ALREADY_EXISTS\", {\n message: `Branch already exists locally: ${newBranch}`,\n details: { branch: newBranch },\n })\n }\n\n await ensureTargetPathWritable(newPath)\n return {\n oldBranch,\n currentPath: current.path,\n baseBranch: snapshot.baseBranch,\n }\n },\n runGit: async ({ oldBranch: resolvedOldBranch, currentPath }) => {\n await runGitCommand({\n cwd: currentPath,\n args: [\"branch\", \"-m\", resolvedOldBranch, newBranch],\n })\n await runGitCommand({\n cwd: repoRoot,\n args: [\"worktree\", \"move\", currentPath, newPath],\n })\n return {\n branch: newBranch,\n path: newPath,\n }\n },\n finalize: async ({ oldBranch: resolvedOldBranch, baseBranch }) => {\n if (baseBranch !== null) {\n await moveWorktreeMergeLifecycle({\n repoRoot,\n fromBranch: resolvedOldBranch,\n toBranch: newBranch,\n baseBranch,\n observedDivergedHead: null,\n })\n }\n },\n })\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: result,\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n stdout(result.path)\n return EXIT_CODE.OK\n }\n\n const handleDel = async (): Promise<number> => {\n ensureArgumentCount({ command, args: commandArgs, min: 0, max: 1 })\n const forceFlags = parseForceFlags(parsedArgsRecord)\n if (hasAnyForceFlag(forceFlags)) {\n ensureUnsafeForNonTty({\n runtime,\n reason: \"force flags in non-TTY mode require --allow-unsafe\",\n })\n }\n const branchArg = commandArgs[0]\n\n const result = await runWriteOperation(async () => {\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const target =\n typeof branchArg === \"string\" && branchArg.length > 0\n ? resolveTargetWorktreeByBranch({ branch: branchArg, worktrees: snapshot.worktrees })\n : resolveCurrentWorktree({\n snapshot,\n currentWorktreeRoot: repoContext.currentWorktreeRoot,\n })\n\n if (target.branch === null) {\n throw createCliError(\"DETACHED_HEAD\", {\n message: \"Cannot delete detached worktree without branch\",\n details: { path: target.path },\n })\n }\n if (target.path === repoRoot) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: \"Cannot delete the primary worktree\",\n details: { path: target.path },\n })\n }\n if (\n isManagedWorktreePath({\n worktreePath: target.path,\n managedWorktreeRoot,\n }) !== true\n ) {\n throw createCliError(\"WORKTREE_NOT_FOUND\", {\n message: \"Target branch is not in managed worktree root\",\n details: {\n branch: target.branch,\n path: target.path,\n managedWorktreeRoot,\n },\n })\n }\n const targetBranch = target.branch\n\n return executeWorktreeMutation({\n name: \"del\",\n branch: targetBranch,\n worktreePath: target.path,\n precheck: async () => {\n validateDeleteSafety({\n target,\n forceFlags,\n })\n\n const removeArgs = [\"worktree\", \"remove\", target.path]\n if (forceFlags.forceDirty) {\n removeArgs.push(\"--force\")\n }\n return {\n branch: targetBranch,\n path: target.path,\n removeArgs,\n branchDeleteMode: resolveBranchDeleteMode(forceFlags),\n }\n },\n runGit: async ({ branch: targetBranch, removeArgs, branchDeleteMode, path }) => {\n await runGitCommand({\n cwd: repoRoot,\n args: removeArgs,\n })\n await runGitCommand({\n cwd: repoRoot,\n args: [\"branch\", branchDeleteMode, targetBranch],\n })\n return {\n branch: targetBranch,\n path,\n }\n },\n finalize: async ({ branch: targetBranch }) => {\n await deleteWorktreeLock({ repoRoot, branch: targetBranch })\n await deleteWorktreeMergeLifecycle({ repoRoot, branch: targetBranch })\n },\n })\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"deleted\",\n repoRoot,\n details: result,\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n stdout(result.path)\n return EXIT_CODE.OK\n }\n\n const writeMutationExitCode = await dispatchCommandHandler({\n command,\n handlers: createWriteMutationHandlers({\n mvHandler: handleMv,\n delHandler: handleDel,\n }),\n })\n if (writeMutationExitCode !== undefined) {\n return writeMutationExitCode\n }\n\n const handleGone = async (): Promise<number> => {\n ensureArgumentCount({ command, args: commandArgs, min: 0, max: 0 })\n if (parsedArgs.apply === true && parsedArgs.dryRun === true) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: \"Cannot use --apply and --dry-run together\",\n })\n }\n\n const dryRun = parsedArgs.apply !== true\n const execute = async (): Promise<{ deleted: string[]; candidates: string[]; dryRun: boolean }> => {\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const candidates = snapshot.worktrees\n .filter((worktree) => worktree.branch !== null)\n .filter((worktree) => worktree.path !== repoRoot)\n .filter((worktree) =>\n isManagedWorktreePath({\n worktreePath: worktree.path,\n managedWorktreeRoot,\n }),\n )\n .filter((worktree) => worktree.dirty === false)\n .filter((worktree) => worktree.locked.value === false)\n .filter((worktree) => worktree.merged.overall === true)\n .map((worktree) => worktree.branch as string)\n\n if (dryRun) {\n return {\n deleted: [],\n candidates,\n dryRun: true,\n }\n }\n\n const hookContext = createHookContext({\n runtime,\n repoRoot,\n action: \"gone\",\n branch: null,\n worktreePath: repoRoot,\n stderr,\n })\n await runPreHook({ name: \"gone\", context: hookContext })\n\n const deleted: string[] = []\n for (const branch of candidates) {\n const latestSnapshot = await collectWorktreeSnapshot(repoRoot)\n const target = resolveTargetWorktreeByBranch({\n branch,\n worktrees: latestSnapshot.worktrees,\n })\n await runGitCommand({\n cwd: repoRoot,\n args: [\"worktree\", \"remove\", target.path],\n })\n await runGitCommand({\n cwd: repoRoot,\n args: [\"branch\", \"-d\", branch],\n })\n await deleteWorktreeLock({ repoRoot, branch })\n await deleteWorktreeMergeLifecycle({ repoRoot, branch })\n deleted.push(branch)\n }\n\n await runPostHook({ name: \"gone\", context: hookContext })\n return {\n deleted,\n candidates,\n dryRun: false,\n }\n }\n\n const result = await runWriteOperation(execute)\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n dryRun: result.dryRun,\n candidates: result.candidates,\n deleted: result.deleted,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n const label = result.dryRun ? \"candidates\" : \"deleted\"\n const branches = result.dryRun ? result.candidates : result.deleted\n for (const branch of branches) {\n stdout(`${label}: ${branch}`)\n }\n return EXIT_CODE.OK\n }\n\n const handleGet = async (): Promise<number> => {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n const remoteBranchArg = commandArgs[0] as string\n const { remote, branch } = resolveRemoteAndBranch(remoteBranchArg)\n\n const result = await runWriteOperation(async () => {\n const remoteCheck = await runGitCommand({\n cwd: repoRoot,\n args: [\"remote\", \"get-url\", remote],\n reject: false,\n })\n if (remoteCheck.exitCode !== 0) {\n throw createCliError(\"REMOTE_NOT_FOUND\", {\n message: `Remote not found: ${remote}`,\n details: { remote },\n })\n }\n\n const hookContext = createHookContext({\n runtime,\n repoRoot,\n action: \"get\",\n branch,\n worktreePath: branchToWorktreePath(repoRoot, branch, resolvedConfig.paths.worktreeRoot),\n stderr,\n })\n await runPreHook({ name: \"get\", context: hookContext })\n\n const fetchResult = await runGitCommand({\n cwd: repoRoot,\n args: [\"fetch\", remote, branch],\n reject: false,\n })\n if (fetchResult.exitCode !== 0) {\n throw createCliError(\"REMOTE_BRANCH_NOT_FOUND\", {\n message: `Remote branch not found: ${remote}/${branch}`,\n details: { remote, branch },\n })\n }\n\n if ((await doesGitRefExist(repoRoot, `refs/heads/${branch}`)) !== true) {\n await runGitCommand({\n cwd: repoRoot,\n args: [\"branch\", \"--track\", branch, `${remote}/${branch}`],\n })\n }\n\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const lifecycleBaseBranch = snapshot.baseBranch\n const existing = snapshot.worktrees.find((worktree) => worktree.branch === branch)\n if (existing !== undefined) {\n if (lifecycleBaseBranch !== null) {\n await upsertWorktreeMergeLifecycle({\n repoRoot,\n branch,\n baseBranch: lifecycleBaseBranch,\n observedDivergedHead: null,\n })\n }\n await runPostHook({ name: \"get\", context: hookContext })\n return {\n status: \"existing\" as const,\n branch,\n path: existing.path,\n }\n }\n\n const targetPath = branchToWorktreePath(repoRoot, branch, resolvedConfig.paths.worktreeRoot)\n await ensureTargetPathWritable(targetPath)\n await runGitCommand({\n cwd: repoRoot,\n args: [\"worktree\", \"add\", targetPath, branch],\n })\n if (lifecycleBaseBranch !== null) {\n await upsertWorktreeMergeLifecycle({\n repoRoot,\n branch,\n baseBranch: lifecycleBaseBranch,\n observedDivergedHead: null,\n })\n }\n await runPostHook({ name: \"get\", context: hookContext })\n return {\n status: \"created\" as const,\n branch,\n path: targetPath,\n }\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: result.status,\n repoRoot,\n details: {\n branch: result.branch,\n path: result.path,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n stdout(result.path)\n return EXIT_CODE.OK\n }\n\n const handleExtract = async (): Promise<number> => {\n ensureArgumentCount({ command, args: commandArgs, min: 0, max: 0 })\n const fromPath = typeof parsedArgs.from === \"string\" ? parsedArgs.from : undefined\n if (fromPath !== undefined && parsedArgs.current === true) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: \"extract cannot use --current and --from together\",\n })\n }\n\n const result = await runWriteOperation(async () => {\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const resolvedSourcePathRaw =\n fromPath !== undefined\n ? resolvePathFromCwd({\n cwd: runtimeCwd,\n path: fromPath,\n })\n : repoContext.currentWorktreeRoot\n const resolvedSourcePath = ensurePathInsideRepo({\n repoRoot,\n path: resolvedSourcePathRaw,\n })\n const sourceWorktree =\n snapshot.worktrees.find((worktree) => worktree.path === resolvedSourcePath) ??\n snapshot.worktrees.find((worktree) => resolvedSourcePath.startsWith(`${worktree.path}${sep}`))\n\n if (sourceWorktree === undefined) {\n throw createCliError(\"WORKTREE_NOT_FOUND\", {\n message: \"extract source worktree not found\",\n details: { path: resolvedSourcePath },\n })\n }\n if (sourceWorktree.path !== repoRoot) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: \"extract currently supports only the primary worktree\",\n details: { sourcePath: sourceWorktree.path },\n })\n }\n if (sourceWorktree.branch === null) {\n throw createCliError(\"DETACHED_HEAD\", {\n message: \"extract requires current branch checkout\",\n details: { path: sourceWorktree.path },\n })\n }\n\n const branch = sourceWorktree.branch\n const baseBranch = await resolveBaseBranch({\n repoRoot,\n config: resolvedConfig,\n })\n ensureBranchIsNotPrimary({ branch, baseBranch })\n const targetPath = branchToWorktreePath(repoRoot, branch, resolvedConfig.paths.worktreeRoot)\n await ensureTargetPathWritable(targetPath)\n\n const status = await runGitCommand({\n cwd: repoRoot,\n args: [\"status\", \"--porcelain\"],\n reject: false,\n })\n const dirty = status.stdout.trim().length > 0\n if (dirty && parsedArgs.stash !== true) {\n throw createCliError(\"DIRTY_WORKTREE\", {\n message: \"extract requires clean worktree unless --stash is specified\",\n })\n }\n\n let stashOid: string | null = null\n if (dirty && parsedArgs.stash === true) {\n stashOid = await createStashEntry({\n cwd: repoRoot,\n message: `vde-worktree extract ${branch}`,\n })\n }\n\n const hookContext = createHookContext({\n runtime,\n repoRoot,\n action: \"extract\",\n branch,\n worktreePath: targetPath,\n stderr,\n })\n await runPreHookWithAutoRestore({\n name: \"extract\",\n context: hookContext,\n restore:\n stashOid !== null\n ? async (): Promise<void> => {\n await restoreStashedChanges({\n cwd: repoRoot,\n stashOid,\n })\n }\n : undefined,\n })\n await runGitCommand({\n cwd: repoRoot,\n args: [\"checkout\", baseBranch],\n })\n await runGitCommand({\n cwd: repoRoot,\n args: [\"worktree\", \"add\", targetPath, branch],\n })\n await upsertWorktreeMergeLifecycle({\n repoRoot,\n branch,\n baseBranch,\n observedDivergedHead: null,\n })\n\n if (stashOid !== null) {\n const applyResult = await runGitCommand({\n cwd: targetPath,\n args: [\"stash\", \"apply\", stashOid],\n reject: false,\n })\n if (applyResult.exitCode !== 0) {\n throw createCliError(\"STASH_APPLY_FAILED\", {\n message: \"Failed to apply stash to extracted worktree\",\n details: { stashOid, branch, path: targetPath },\n })\n }\n await dropStashByOid({\n cwd: repoRoot,\n stashOid,\n })\n }\n\n await runPostHook({ name: \"extract\", context: hookContext })\n return {\n branch,\n path: targetPath,\n }\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"created\",\n repoRoot,\n details: result,\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n stdout(result.path)\n return EXIT_CODE.OK\n }\n\n const worktreeActionExitCode = await dispatchCommandHandler({\n command,\n handlers: createWorktreeActionHandlers({\n goneHandler: handleGone,\n getHandler: handleGet,\n extractHandler: handleExtract,\n }),\n })\n if (worktreeActionExitCode !== undefined) {\n return worktreeActionExitCode\n }\n\n const handleAbsorb = async (): Promise<number> => {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n const branch = commandArgs[0] as string\n const fromWorktreeName = typeof parsedArgs.from === \"string\" ? parsedArgs.from : undefined\n const keepStash = parsedArgs.keepStash === true\n if (runtime.isInteractive !== true) {\n if (parsedArgs.allowAgent !== true) {\n throw createCliError(\"UNSAFE_FLAG_REQUIRED\", {\n message: \"UNSAFE_FLAG_REQUIRED: absorb in non-TTY requires --allow-agent\",\n })\n }\n ensureUnsafeForNonTty({\n runtime,\n reason: \"absorb in non-TTY mode requires --allow-unsafe\",\n })\n }\n\n const result = await runWriteOperation(async () => {\n const primaryStatus = await runGitCommand({\n cwd: repoRoot,\n args: [\"status\", \"--porcelain\"],\n reject: false,\n })\n if (primaryStatus.stdout.trim().length > 0) {\n throw createCliError(\"DIRTY_WORKTREE\", {\n message: \"absorb requires clean primary worktree\",\n details: { repoRoot },\n })\n }\n\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const sourceWorktree = resolveManagedNonPrimaryWorktreeByBranch({\n repoRoot,\n managedWorktreeRoot,\n branch,\n worktrees: snapshot.worktrees,\n optionName: \"--from\",\n worktreeName: fromWorktreeName,\n role: \"source\",\n })\n\n const sourceStatus = await runGitCommand({\n cwd: sourceWorktree.path,\n args: [\"status\", \"--porcelain\"],\n reject: false,\n })\n const sourceDirty = sourceStatus.stdout.trim().length > 0\n let stashOid: string | null = null\n if (sourceDirty) {\n stashOid = await createStashEntry({\n cwd: sourceWorktree.path,\n message: `vde-worktree absorb ${branch}`,\n })\n }\n\n const hookContext = createHookContext({\n runtime,\n repoRoot,\n action: \"absorb\",\n branch,\n worktreePath: repoRoot,\n stderr,\n extraEnv: {\n WT_SOURCE_WORKTREE_PATH: sourceWorktree.path,\n },\n })\n await runPreHookWithAutoRestore({\n name: \"absorb\",\n context: hookContext,\n restore:\n stashOid !== null\n ? async (): Promise<void> => {\n await restoreStashedChanges({\n cwd: sourceWorktree.path,\n stashOid,\n })\n }\n : undefined,\n })\n await runGitCommand({\n cwd: repoRoot,\n args: [\"checkout\", \"--ignore-other-worktrees\", branch],\n })\n\n if (stashOid !== null) {\n const applyResult = await runGitCommand({\n cwd: repoRoot,\n args: [\"stash\", \"apply\", stashOid],\n reject: false,\n })\n if (applyResult.exitCode !== 0) {\n throw createCliError(\"STASH_APPLY_FAILED\", {\n message: \"Failed to apply stash to primary worktree\",\n details: { stashOid, branch, sourcePath: sourceWorktree.path, path: repoRoot },\n })\n }\n if (!keepStash) {\n await dropStashByOid({\n cwd: repoRoot,\n stashOid,\n })\n }\n }\n\n await runPostHook({ name: \"absorb\", context: hookContext })\n const stashOutputRef =\n keepStash && stashOid !== null\n ? ((await resolveStashRefByOid({ cwd: repoRoot, stashOid })) ?? stashOid)\n : null\n return {\n branch,\n path: repoRoot,\n sourcePath: sourceWorktree.path,\n stashed: sourceDirty,\n stashRef: stashOutputRef,\n }\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: result,\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n stdout(result.path)\n return EXIT_CODE.OK\n }\n\n const handleUnabsorb = async (): Promise<number> => {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n const branch = commandArgs[0] as string\n const targetWorktreeName = typeof parsedArgs.to === \"string\" ? parsedArgs.to : undefined\n const keepStash = parsedArgs.keepStash === true\n if (runtime.isInteractive !== true) {\n if (parsedArgs.allowAgent !== true) {\n throw createCliError(\"UNSAFE_FLAG_REQUIRED\", {\n message: \"UNSAFE_FLAG_REQUIRED: unabsorb in non-TTY requires --allow-agent\",\n })\n }\n ensureUnsafeForNonTty({\n runtime,\n reason: \"unabsorb in non-TTY mode requires --allow-unsafe\",\n })\n }\n\n const result = await runWriteOperation(async () => {\n const currentBranchResult = await runGitCommand({\n cwd: repoRoot,\n args: [\"branch\", \"--show-current\"],\n reject: false,\n })\n const currentBranch = currentBranchResult.stdout.trim()\n if (currentBranch !== branch) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: \"unabsorb requires primary worktree to be on the target branch\",\n details: { branch, currentBranch },\n })\n }\n\n const primaryStatus = await runGitCommand({\n cwd: repoRoot,\n args: [\"status\", \"--porcelain\"],\n reject: false,\n })\n if (primaryStatus.stdout.trim().length === 0) {\n throw createCliError(\"DIRTY_WORKTREE\", {\n message: \"unabsorb requires dirty primary worktree\",\n details: { repoRoot },\n })\n }\n\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const targetWorktree = resolveManagedNonPrimaryWorktreeByBranch({\n repoRoot,\n managedWorktreeRoot,\n branch,\n worktrees: snapshot.worktrees,\n optionName: \"--to\",\n worktreeName: targetWorktreeName,\n role: \"target\",\n })\n const targetStatus = await runGitCommand({\n cwd: targetWorktree.path,\n args: [\"status\", \"--porcelain\"],\n reject: false,\n })\n if (targetStatus.stdout.trim().length > 0) {\n throw createCliError(\"DIRTY_WORKTREE\", {\n message: \"unabsorb requires clean target worktree\",\n details: { branch, path: targetWorktree.path },\n })\n }\n\n const stashOid = await createStashEntry({\n cwd: repoRoot,\n message: `vde-worktree unabsorb ${branch}`,\n })\n\n const hookContext = createHookContext({\n runtime,\n repoRoot,\n action: \"unabsorb\",\n branch,\n worktreePath: targetWorktree.path,\n stderr,\n extraEnv: {\n WT_SOURCE_WORKTREE_PATH: repoRoot,\n WT_TARGET_WORKTREE_PATH: targetWorktree.path,\n },\n })\n await runPreHookWithAutoRestore({\n name: \"unabsorb\",\n context: hookContext,\n restore: async (): Promise<void> => {\n await restoreStashedChanges({\n cwd: repoRoot,\n stashOid,\n })\n },\n })\n\n const applyResult = await runGitCommand({\n cwd: targetWorktree.path,\n args: [\"stash\", \"apply\", stashOid],\n reject: false,\n })\n if (applyResult.exitCode !== 0) {\n throw createCliError(\"STASH_APPLY_FAILED\", {\n message: \"Failed to apply stash to target worktree\",\n details: { stashOid, branch, sourcePath: repoRoot, targetPath: targetWorktree.path },\n })\n }\n if (!keepStash) {\n await dropStashByOid({\n cwd: repoRoot,\n stashOid,\n })\n }\n\n await runPostHook({ name: \"unabsorb\", context: hookContext })\n const stashOutputRef = keepStash\n ? ((await resolveStashRefByOid({ cwd: repoRoot, stashOid })) ?? stashOid)\n : null\n return {\n branch,\n path: targetWorktree.path,\n sourcePath: repoRoot,\n stashed: true,\n stashRef: stashOutputRef,\n }\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: result,\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n stdout(result.path)\n return EXIT_CODE.OK\n }\n\n const handleUse = async (): Promise<number> => {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n const branch = commandArgs[0] as string\n const allowShared = parsedArgs.allowShared === true\n if (runtime.isInteractive !== true) {\n if (parsedArgs.allowAgent !== true) {\n throw createCliError(\"UNSAFE_FLAG_REQUIRED\", {\n message: \"UNSAFE_FLAG_REQUIRED: use in non-TTY requires --allow-agent\",\n })\n }\n ensureUnsafeForNonTty({\n runtime,\n reason: \"use in non-TTY mode requires --allow-unsafe\",\n })\n }\n\n const result = await runWriteOperation(async () => {\n const status = await runGitCommand({\n cwd: repoRoot,\n args: [\"status\", \"--porcelain\"],\n reject: false,\n })\n if (status.stdout.trim().length > 0) {\n throw createCliError(\"DIRTY_WORKTREE\", {\n message: \"use requires clean primary worktree\",\n details: { repoRoot },\n })\n }\n\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const branchCheckedOutInOtherWorktree = snapshot.worktrees.find((worktree) => {\n return worktree.branch === branch && worktree.path !== repoRoot\n })\n if (branchCheckedOutInOtherWorktree !== undefined && allowShared !== true) {\n throw createCliError(\"BRANCH_IN_USE\", {\n message: [\n `branch '${branch}' is already checked out in another worktree.`,\n ` path: ${branchCheckedOutInOtherWorktree.path}`,\n \"\",\n \"To continue (unsafe), re-run with:\",\n ` vw use ${branch} --allow-shared`,\n \"\",\n \"Risk:\",\n \" multiple worktrees will share the same branch.\",\n ].join(\"\\n\"),\n details: {\n branch,\n path: branchCheckedOutInOtherWorktree.path,\n hint: \"re-run with --allow-shared to continue\",\n risk: \"unsafe: multiple worktrees will share the same branch\",\n },\n })\n }\n if (branchCheckedOutInOtherWorktree !== undefined && allowShared === true) {\n stderr(\n [\n \"warning: --allow-shared enabled.\",\n ` branch: ${branch}`,\n ` path: ${branchCheckedOutInOtherWorktree.path}`,\n \" risk (unsafe): multiple worktrees will share the same branch.\",\n ].join(\"\\n\"),\n )\n }\n const checkoutArgs = branchCheckedOutInOtherWorktree\n ? [\"checkout\", \"--ignore-other-worktrees\", branch]\n : [\"checkout\", branch]\n\n const hookContext = createHookContext({\n runtime,\n repoRoot,\n action: \"use\",\n branch,\n worktreePath: repoRoot,\n stderr,\n })\n await runPreHook({ name: \"use\", context: hookContext })\n await runGitCommand({\n cwd: repoRoot,\n args: checkoutArgs,\n })\n await runPostHook({ name: \"use\", context: hookContext })\n return {\n branch,\n path: repoRoot,\n }\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: result,\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n stdout(result.path)\n return EXIT_CODE.OK\n }\n\n const synchronizationExitCode = await dispatchCommandHandler({\n command,\n handlers: createSynchronizationHandlers({\n absorbHandler: handleAbsorb,\n unabsorbHandler: handleUnabsorb,\n useHandler: handleUse,\n }),\n })\n if (synchronizationExitCode !== undefined) {\n return synchronizationExitCode\n }\n\n const handleExec = async (): Promise<number> => {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n ensureHasCommandAfterDoubleDash({\n command,\n argsAfterDoubleDash: afterDoubleDash,\n })\n const branch = commandArgs[0] as string\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const target = resolveTargetWorktreeByBranch({ branch, worktrees: snapshot.worktrees })\n const executable = afterDoubleDash[0]\n if (typeof executable !== \"string\" || executable.length === 0) {\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: \"exec requires executable after --\",\n })\n }\n\n const child = await execa(executable, afterDoubleDash.slice(1), {\n cwd: target.path,\n stdin: \"inherit\",\n stdout: \"inherit\",\n stderr: \"inherit\",\n reject: false,\n })\n const childExitCode = child.exitCode ?? 0\n if (runtime.json) {\n if (childExitCode === 0) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n branch,\n path: target.path,\n childExitCode,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n stdout(\n JSON.stringify({\n schemaVersion: SCHEMA_VERSION,\n command,\n status: \"error\",\n repoRoot,\n code: \"CHILD_PROCESS_FAILED\",\n message: \"target command exited with non-zero status\",\n details: {\n branch,\n path: target.path,\n childExitCode,\n },\n }),\n )\n return EXIT_CODE.CHILD_PROCESS_FAILED\n }\n return childExitCode === 0 ? EXIT_CODE.OK : EXIT_CODE.CHILD_PROCESS_FAILED\n }\n\n const handleInvoke = async (): Promise<number> => {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n const hookName = normalizeHookName(commandArgs[0] as string)\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const current = resolveCurrentWorktree({\n snapshot,\n currentWorktreeRoot: repoContext.currentWorktreeRoot,\n })\n const hookContext = createHookContext({\n runtime,\n repoRoot,\n action: `invoke:${hookName}`,\n branch: current.branch,\n worktreePath: current.path,\n stderr,\n })\n await invokeHook({\n hookName,\n args: afterDoubleDash,\n context: hookContext,\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n hook: hookName,\n exitCode: 0,\n },\n }),\n ),\n )\n }\n return EXIT_CODE.OK\n }\n\n const handleCopy = async (): Promise<number> => {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: Number.MAX_SAFE_INTEGER })\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const targetWorktreeRoot = resolveTargetWorktreeRootForCopyLink({\n repoContext,\n snapshot,\n })\n\n for (const relativePath of commandArgs) {\n const { sourcePath, destinationPath } = resolveFileCopyTargets({\n repoRoot,\n targetWorktreeRoot,\n relativePath,\n })\n await access(sourcePath, fsConstants.F_OK)\n await mkdir(dirname(destinationPath), { recursive: true })\n await cp(sourcePath, destinationPath, {\n recursive: true,\n force: true,\n errorOnExist: false,\n dereference: false,\n })\n }\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n copied: commandArgs,\n worktreePath: targetWorktreeRoot,\n },\n }),\n ),\n )\n }\n return EXIT_CODE.OK\n }\n\n const handleLink = async (): Promise<number> => {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: Number.MAX_SAFE_INTEGER })\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const targetWorktreeRoot = resolveTargetWorktreeRootForCopyLink({\n repoContext,\n snapshot,\n })\n const fallbackEnabled = parsedArgs.fallback !== false\n\n for (const relativePath of commandArgs) {\n const { sourcePath, destinationPath } = resolveFileCopyTargets({\n repoRoot,\n targetWorktreeRoot,\n relativePath,\n })\n await access(sourcePath, fsConstants.F_OK)\n await rm(destinationPath, { recursive: true, force: true })\n await mkdir(dirname(destinationPath), { recursive: true })\n\n try {\n await symlink(resolveLinkTargetPath({ sourcePath, destinationPath }), destinationPath)\n } catch (error) {\n if (process.platform === \"win32\" && fallbackEnabled) {\n stderr(`symlink failed for ${relativePath}; fallback to copy`)\n await cp(sourcePath, destinationPath, {\n recursive: true,\n force: true,\n errorOnExist: false,\n dereference: false,\n })\n continue\n }\n throw createCliError(\"INVALID_ARGUMENT\", {\n message: `Failed to create symlink for ${relativePath}`,\n cause: error,\n })\n }\n }\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n linked: commandArgs,\n worktreePath: targetWorktreeRoot,\n fallback: fallbackEnabled,\n },\n }),\n ),\n )\n }\n return EXIT_CODE.OK\n }\n\n const handleLock = async (): Promise<number> => {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n const branch = commandArgs[0] as string\n const ownerOption = readStringOption(parsedArgsRecord, \"owner\")\n const reasonOption = readStringOption(parsedArgsRecord, \"reason\")\n const owner = typeof ownerOption === \"string\" && ownerOption.length > 0 ? ownerOption : defaultOwner()\n const reason = typeof reasonOption === \"string\" && reasonOption.length > 0 ? reasonOption : \"locked\"\n\n const result = await runWriteOperation(async () => {\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n resolveTargetWorktreeByBranch({ branch, worktrees: snapshot.worktrees })\n const existing = await readWorktreeLock({ repoRoot, branch })\n if (existing.exists && existing.valid !== true) {\n throw createCliError(\"LOCK_CONFLICT\", {\n message: \"Cannot update lock with invalid metadata; fix or remove lock file first\",\n details: { branch, path: existing.path },\n })\n }\n if (existing.record !== null && existing.record.owner !== owner) {\n throw createCliError(\"LOCK_CONFLICT\", {\n message: \"Lock is owned by another owner\",\n details: { branch, owner: existing.record.owner },\n })\n }\n const lock = await upsertWorktreeLock({\n repoRoot,\n branch,\n reason,\n owner,\n })\n return lock\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n branch,\n locked: {\n value: true,\n reason: result.reason,\n owner: result.owner,\n },\n },\n }),\n ),\n )\n }\n return EXIT_CODE.OK\n }\n\n const handleUnlock = async (): Promise<number> => {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n const branch = commandArgs[0] as string\n const ownerOption = readStringOption(parsedArgsRecord, \"owner\")\n const owner = typeof ownerOption === \"string\" && ownerOption.length > 0 ? ownerOption : defaultOwner()\n const force = parsedArgs.force === true\n\n await runWriteOperation(async () => {\n const existing = await readWorktreeLock({ repoRoot, branch })\n if (existing.exists !== true) {\n return\n }\n if (existing.valid !== true) {\n if (force) {\n await deleteWorktreeLock({ repoRoot, branch })\n return\n }\n throw createCliError(\"LOCK_CONFLICT\", {\n message: \"Lock metadata is invalid; use --force to unlock\",\n details: { branch, path: existing.path },\n })\n }\n if (existing.record !== null && existing.record.owner !== owner && force !== true) {\n throw createCliError(\"LOCK_CONFLICT\", {\n message: \"Lock is owned by another owner. Use --force to unlock.\",\n details: { branch, owner: existing.record.owner },\n })\n }\n await deleteWorktreeLock({ repoRoot, branch })\n })\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n branch,\n locked: {\n value: false,\n reason: null,\n },\n },\n }),\n ),\n )\n }\n return EXIT_CODE.OK\n }\n\n const handleCd = async (): Promise<number> => {\n ensureArgumentCount({ command, args: commandArgs, min: 0, max: 0 })\n const snapshot = await collectWorktreeSnapshot(repoRoot)\n const theme = createCatppuccinTheme({\n enabled: shouldUseAnsiColors({ interactive: runtime.isInteractive || process.stderr.isTTY === true }),\n })\n const branchColumnWidth = snapshot.worktrees.reduce((maxWidth, worktree) => {\n const label = buildCdBranchLabel({\n worktree,\n currentWorktreeRoot: repoContext.currentWorktreeRoot,\n })\n return Math.max(maxWidth, stringWidth(label))\n }, 0)\n const candidates = snapshot.worktrees.map((worktree) =>\n buildCdCandidateLine({\n worktree,\n baseBranch: snapshot.baseBranch,\n theme,\n currentWorktreeRoot: repoContext.currentWorktreeRoot,\n branchColumnWidth,\n }),\n )\n if (candidates.length === 0) {\n throw createCliError(\"WORKTREE_NOT_FOUND\", {\n message: \"No worktree candidates found\",\n })\n }\n\n const promptValue = readStringOption(parsedArgsRecord, \"prompt\")\n const prompt =\n typeof promptValue === \"string\" && promptValue.length > 0 ? promptValue : resolvedConfig.selector.cd.prompt\n const cliFzfExtraArgs = collectOptionValues({\n args: beforeDoubleDash,\n optionNames: [\"fzfArg\", \"fzf-arg\"],\n })\n const mergedConfigFzfArgs = mergeFzfArgs({\n defaults: resolvedConfig.selector.cd.fzf.extraArgs,\n extras: cliFzfExtraArgs,\n })\n const surface: SelectorCdSurface = resolvedConfig.selector.cd.surface\n\n const selection = await selectPathWithFzf({\n candidates,\n prompt,\n fzfExtraArgs: mergeFzfArgs({\n defaults: CD_FZF_EXTRA_ARGS,\n extras: mergedConfigFzfArgs,\n }),\n surface,\n tmuxPopupOpts: resolvedConfig.selector.cd.tmuxPopupOpts,\n cwd: repoRoot,\n isInteractive: () => runtime.isInteractive || process.stderr.isTTY === true,\n }).catch((error: unknown) => {\n if (error instanceof FzfDependencyError || error instanceof FzfInteractiveRequiredError) {\n throw createCliError(\"DEPENDENCY_MISSING\", {\n message: `DEPENDENCY_MISSING: ${error.message}`,\n })\n }\n throw error\n })\n\n if (selection.status === \"cancelled\") {\n return EXIT_CODE_CANCELLED\n }\n const selectedPath = resolveCdSelectionPath(selection.path)\n\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n path: selectedPath,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n stdout(selectedPath)\n return EXIT_CODE.OK\n }\n\n const miscCommandExitCode = await dispatchCommandHandler({\n command,\n handlers: createMiscCommandHandlers({\n execHandler: handleExec,\n invokeHandler: handleInvoke,\n copyHandler: handleCopy,\n linkHandler: handleLink,\n lockHandler: handleLock,\n unlockHandler: handleUnlock,\n cdHandler: handleCd,\n }),\n })\n if (miscCommandExitCode !== undefined) {\n return miscCommandExitCode\n }\n\n throw createCliError(\"UNKNOWN_COMMAND\", {\n message: `Unknown command: ${command}`,\n })\n } catch (error) {\n const cliError = ensureCliError(error)\n if (jsonEnabled) {\n stdout(\n JSON.stringify(\n buildJsonError({\n command,\n repoRoot: repoRootForJson,\n error: cliError,\n }),\n ),\n )\n } else {\n stderr(`[${cliError.code}] ${cliError.message}`)\n logger.debug(JSON.stringify(cliError.details))\n }\n return cliError.exitCode\n }\n }\n\n return { run }\n}\n","#!/usr/bin/env node\nimport { createCli } from \"./cli/index\"\n\nconst main = async (): Promise<void> => {\n const cli = createCli()\n try {\n const exitCode = await cli.run(process.argv.slice(2))\n if (typeof exitCode === \"number\" && exitCode !== 0) {\n process.exit(exitCode)\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(\"Error:\", error.message)\n if (process.env.VDE_WORKTREE_DEBUG === \"true\" || process.env.VDE_DEBUG === \"true\") {\n console.error(error.stack)\n }\n } else {\n console.error(\"An unexpected error occurred:\", String(error))\n }\n\n process.exit(1)\n }\n}\n\nvoid main()\n"],"mappings":"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,WAAW;GACX,aAAa;GACd;EACD,QAAQ;GACN,MAAM;GACN,WAAW;GACX,aAAa;GACd;EACD,MAAM;GACJ,MAAM;GACN,aAAa;GACd;EACD,SAAS;GACP,MAAM;GACN,aAAa;GACd;EACD,OAAO;GACL,MAAM;GACN,aAAa;GACb,SAAS;GACV;EACD,IAAI;GACF,MAAM;GACN,aAAa;GACb,SAAS;GACV;EACD,UAAU;GACR,MAAM;GACN,aAAa;GACd;EACD,aAAa;GACX,MAAM;GACN,aAAa;GACd;EACD,iBAAiB;GACf,MAAM;GACN,aAAa;GACd;EACD,eAAe;GACb,MAAM;GACN,WAAW;GACX,aAAa;GACd;EACD,eAAe;GACb,MAAM;GACN,WAAW;GACX,aAAa;GACd;EACD,YAAY;GACV,MAAM;GACN,aAAa;GACd;EACD,aAAa;GACX,MAAM;GACN,aAAa;GACd;EACD,QAAQ;GACN,MAAM;GACN,WAAW;GACX,aAAa;GACd;EACD,OAAO;GACL,MAAM;GACN,WAAW;GACX,aAAa;GACd;EACD,OAAO;GACL,MAAM;GACN,aAAa;GACd;EACD,YAAY;GACV,MAAM;GACN,aAAa;GACd;EACD,eAAe;GACb,MAAM;GACN,aAAa;GACd;EACD,eAAe;GACb,MAAM;GACN,aAAa;GACd;EACD,aAAa;GACX,MAAM;GACN,aAAa;GACd;EACD,OAAO;GACL,MAAM;GACN,aAAa;GACd;EACD,QAAQ;GACN,MAAM;GACN,aAAa;GACd;EACD,SAAS;GACP,MAAM;GACN,aAAa;GACd;EACD,MAAM;GACJ,MAAM;GACN,WAAW;GACX,aAAa;GACd;EACD,IAAI;GACF,MAAM;GACN,WAAW;GACX,aAAa;GACd;EACD,OAAO;GACL,MAAM;GACN,aAAa;GACd;EACD,WAAW;GACT,MAAM;GACN,aAAa;GACd;EACD,UAAU;GACR,MAAM;GACN,aAAa;GACb,SAAS;GACV;EACD,SAAS;GACP,MAAM;GACN,aAAa;GACd;EACD,MAAM;GACJ,MAAM;GACN,WAAW;GACX,aAAa;GACd;EACD,MAAM;GACJ,MAAM;GACN,OAAO;GACP,aAAa;GACd;EACD,SA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"}