vde-worktree 0.0.3 → 0.0.4
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.
- package/dist/index.mjs +22 -15
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.mjs
CHANGED
|
@@ -7,7 +7,7 @@ import { dirname, isAbsolute, join, normalize, relative, resolve, sep } from "no
|
|
|
7
7
|
import { fileURLToPath } from "node:url";
|
|
8
8
|
import { parseArgs } from "citty";
|
|
9
9
|
import { execa } from "execa";
|
|
10
|
-
import
|
|
10
|
+
import { getBorderCharacters, table } from "table";
|
|
11
11
|
import chalk from "chalk";
|
|
12
12
|
|
|
13
13
|
//#region src/core/constants.ts
|
|
@@ -1728,11 +1728,6 @@ const formatDisplayPath = (absolutePath) => {
|
|
|
1728
1728
|
if (absolutePath.startsWith(`${homeDirectory}${sep}`)) return `~${absolutePath.slice(homeDirectory.length)}`;
|
|
1729
1729
|
return absolutePath;
|
|
1730
1730
|
};
|
|
1731
|
-
const padEndByWidth = (value, targetWidth) => {
|
|
1732
|
-
const width = stringWidth(value);
|
|
1733
|
-
if (width >= targetWidth) return value;
|
|
1734
|
-
return `${value}${" ".repeat(targetWidth - width)}`;
|
|
1735
|
-
};
|
|
1736
1731
|
const containsBranch = ({ branch, worktrees }) => {
|
|
1737
1732
|
return worktrees.some((worktree) => worktree.branch === branch);
|
|
1738
1733
|
};
|
|
@@ -2169,16 +2164,28 @@ const createCli = (options = {}) => {
|
|
|
2169
2164
|
})));
|
|
2170
2165
|
return EXIT_CODE.OK;
|
|
2171
2166
|
}
|
|
2172
|
-
const
|
|
2173
|
-
|
|
2174
|
-
|
|
2175
|
-
|
|
2176
|
-
|
|
2167
|
+
const rendered = table([[
|
|
2168
|
+
"branch",
|
|
2169
|
+
"dirty",
|
|
2170
|
+
"merged",
|
|
2171
|
+
"locked",
|
|
2172
|
+
"path"
|
|
2173
|
+
], ...snapshot.worktrees.map((worktree) => {
|
|
2174
|
+
const mergedState = (worktree.branch !== null && snapshot.baseBranch !== null && worktree.branch === snapshot.baseBranch) === true ? "-" : worktree.merged.overall === true ? "merged" : worktree.merged.overall === false ? "unmerged" : "unknown";
|
|
2175
|
+
return [
|
|
2176
|
+
`${worktree.path === repoContext.currentWorktreeRoot ? "*" : " "} ${worktree.branch ?? "(detached)"}`,
|
|
2177
|
+
worktree.dirty ? "dirty" : "clean",
|
|
2178
|
+
mergedState,
|
|
2179
|
+
worktree.locked.value ? "locked" : "-",
|
|
2180
|
+
formatDisplayPath(worktree.path)
|
|
2181
|
+
];
|
|
2182
|
+
})], {
|
|
2183
|
+
border: getBorderCharacters("norc"),
|
|
2184
|
+
drawHorizontalLine: (lineIndex, rowCount) => {
|
|
2185
|
+
return lineIndex === 0 || lineIndex === 1 || lineIndex === rowCount;
|
|
2186
|
+
}
|
|
2177
2187
|
});
|
|
2178
|
-
const
|
|
2179
|
-
return Math.max(max, stringWidth(row.branch));
|
|
2180
|
-
}, 0);
|
|
2181
|
-
for (const row of rows) stdout(`${padEndByWidth(row.branch, branchWidth)} ${row.path}`);
|
|
2188
|
+
for (const line of rendered.trimEnd().split("\n")) stdout(line);
|
|
2182
2189
|
return EXIT_CODE.OK;
|
|
2183
2190
|
}
|
|
2184
2191
|
if (command === "status") {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["fsConstants","fsConstants","lockFilePath","fsConstants","fsConstants","resolveBaseBranch","fsConstants","fsConstants","selectPathWithFzf","defaultSelectPathWithFzf"],"sources":["../src/core/constants.ts","../src/core/errors.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-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 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.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 | \"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 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 { 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 { 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\"\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 = (repoRoot: string): string => {\n return join(repoRoot, \".worktree\")\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 return encodeURIComponent(branch)\n}\n\nexport const branchToWorktreePath = (repoRoot: string, branch: string): string => {\n return join(getWorktreeRootPath(repoRoot), branchToWorktreeId(branch))\n}\n\nexport const ensurePathInsideRepo = ({\n repoRoot,\n path,\n}: {\n readonly repoRoot: string\n readonly path: string\n}): string => {\n const rel = relative(repoRoot, path)\n if (rel === \"\") {\n return path\n }\n if (rel === \"..\" || rel.startsWith(`..${sep}`)) {\n throw createCliError(\"PATH_OUTSIDE_REPO\", {\n message: \"Path is outside repository root\",\n details: { repoRoot, path },\n })\n }\n return path\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","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 } from \"node:path\"\nimport {\n getHooksDirectoryPath,\n getLocksDirectoryPath,\n getLogsDirectoryPath,\n getStateDirectoryPath,\n getWorktreeMetaRootPath,\n getWorktreeRootPath,\n} from \"./paths\"\n\nconst MANAGED_EXCLUDE_BLOCK = `# vde-worktree (managed)\\n.worktree/\\n.vde/worktree/\\n`\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 ensureExcludeBlock = async (repoRoot: string): Promise<void> => {\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(MANAGED_EXCLUDE_BLOCK)) {\n return\n }\n\n const normalizedCurrent = current.endsWith(\"\\n\") || current.length === 0 ? current : `${current}\\n`\n await writeFile(excludePath, `${normalizedCurrent}${MANAGED_EXCLUDE_BLOCK}`, \"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 (repoRoot: string): Promise<InitResult> => {\n const wasInitialized = await isInitialized(repoRoot)\n await mkdir(getWorktreeRootPath(repoRoot), { 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)\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, 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 ResolveMergedByPrInput = {\n readonly repoRoot: string\n readonly branch: string\n readonly enabled?: boolean\n readonly runGh?: GhCommandRunner\n}\n\ntype PrSummary = {\n readonly mergedAt?: 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 parseMergedResult = (raw: string): boolean | null => {\n try {\n const parsed = JSON.parse(raw) as unknown\n if (Array.isArray(parsed) !== true) {\n return null\n }\n const records = parsed as PrSummary[]\n if (records.length === 0) {\n return false\n }\n\n return records.some((record) => typeof record?.mergedAt === \"string\" && record.mergedAt.length > 0)\n } catch {\n return null\n }\n}\n\nexport const resolveMergedByPr = async ({\n repoRoot,\n branch,\n enabled = true,\n runGh = defaultRunGh,\n}: ResolveMergedByPrInput): Promise<boolean | null> => {\n if (enabled !== true) {\n return null\n }\n\n try {\n const result = await runGh({\n cwd: repoRoot,\n args: [\"pr\", \"list\", \"--state\", \"merged\", \"--head\", branch, \"--limit\", \"1\", \"--json\", \"mergedAt\"],\n })\n if (result.exitCode !== 0) {\n return null\n }\n\n return parseMergedResult(result.stdout)\n } catch (error) {\n const execaError = error as ExecaLikeError\n if (execaError.code === \"ENOENT\") {\n return null\n }\n return null\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 { doesGitRefExist, runGitCommand } from \"../git/exec\"\nimport { resolveMergedByPr } from \"../integrations/gh\"\nimport { type GitWorktree, listGitWorktrees } from \"../git/worktree\"\nimport { branchToWorktreeId, getLocksDirectoryPath } from \"./paths\"\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 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 upstream: WorktreeUpstreamState\n}\n\nconst resolveBaseBranch = async (repoRoot: string): Promise<string | null> => {\n const explicit = await runGitCommand({\n cwd: repoRoot,\n args: [\"config\", \"--get\", \"vde-worktree.baseBranch\"],\n reject: false,\n })\n if (explicit.exitCode === 0 && explicit.stdout.trim().length > 0) {\n return explicit.stdout.trim()\n }\n\n for (const candidate of [\"main\", \"master\"]) {\n if (await doesGitRefExist(repoRoot, `refs/heads/${candidate}`)) {\n return candidate\n }\n }\n return null\n}\n\nconst resolveEnableGh = async (repoRoot: string): Promise<boolean> => {\n const result = await runGitCommand({\n cwd: repoRoot,\n args: [\"config\", \"--bool\", \"--get\", \"vde-worktree.enableGh\"],\n reject: false,\n })\n if (result.exitCode !== 0) {\n return true\n }\n const value = result.stdout.trim().toLowerCase()\n if (value === \"false\" || value === \"no\" || value === \"off\" || value === \"0\") {\n return false\n }\n return true\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 resolveMergedState = async ({\n repoRoot,\n branch,\n baseBranch,\n enableGh,\n}: {\n readonly repoRoot: string\n readonly branch: string | null\n readonly baseBranch: string | null\n readonly enableGh: boolean\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 byPR = await resolveMergedByPr({\n repoRoot,\n branch,\n enabled: enableGh,\n })\n\n return {\n byAncestry,\n byPR,\n overall: resolveMergedOverall({\n byAncestry,\n byPR,\n }),\n }\n}\n\nexport const resolveMergedOverall = ({\n byAncestry,\n byPR,\n}: {\n readonly byAncestry: boolean | null\n readonly byPR: boolean | null\n}): boolean | null => {\n if (byPR === true) {\n return true\n }\n if (byPR === false) {\n return false\n }\n return byAncestry\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 enableGh,\n}: {\n readonly repoRoot: string\n readonly worktree: GitWorktree\n readonly baseBranch: string | null\n readonly enableGh: boolean\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, baseBranch, enableGh }),\n resolveUpstreamState(worktree.path),\n ])\n\n return {\n branch: worktree.branch,\n path: worktree.path,\n head: worktree.head,\n dirty,\n locked,\n merged,\n upstream,\n }\n}\n\nexport type WorktreeSnapshot = {\n readonly repoRoot: string\n readonly baseBranch: string | null\n readonly worktrees: WorktreeStatus[]\n}\n\nexport const collectWorktreeSnapshot = async (repoRoot: string): Promise<WorktreeSnapshot> => {\n const [baseBranch, worktrees, enableGh] = await Promise.all([\n resolveBaseBranch(repoRoot),\n listGitWorktrees(repoRoot),\n resolveEnableGh(repoRoot),\n ])\n const enriched = await Promise.all(\n worktrees.map(async (worktree) => {\n return enrichWorktree({ repoRoot, worktree, baseBranch, enableGh })\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\"])\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 fzfExtraArgs?: ReadonlyArray<string>\n readonly cwd?: string\n readonly env?: NodeJS.ProcessEnv\n readonly isInteractive?: () => boolean\n readonly checkFzfAvailability?: () => Promise<boolean>\n readonly runFzf?: (input: RunFzfInput) => Promise<RunFzfResult>\n}\n\nconst sanitizeCandidate = (value: string): string => value.replace(/[\\t\\r\\n]+/g, \" \").trim()\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 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\nexport const selectPathWithFzf = async ({\n candidates,\n prompt = \"worktree> \",\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 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 args = buildFzfArgs({ prompt, fzfExtraArgs })\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\"))\n\n try {\n const result = await runFzf({\n args,\n input,\n cwd,\n env,\n })\n\n const selectedPath = result.stdout.trim()\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 } catch (error) {\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 { parseArgs } from \"citty\"\nimport type { ArgsDef } from \"citty\"\nimport { execa } from \"execa\"\nimport stringWidth from \"string-width\"\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 ensurePathInsideRepo,\n resolvePathFromCwd,\n resolveRepoContext,\n resolveRepoRelativePath,\n} from \"../core/paths\"\nimport { readNumberFromEnvOrDefault, withRepoLock } from \"../core/repo-lock\"\nimport { deleteWorktreeLock, readWorktreeLock, upsertWorktreeLock } from \"../core/worktree-lock\"\nimport { collectWorktreeSnapshot, type WorktreeSnapshot, type WorktreeStatus } 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 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\nconst EXIT_CODE_CANCELLED = 130\n\nconst optionNamesAllowOptionLikeValue = new Set([\"fzfArg\", \"fzf-arg\"])\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 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]\",\n summary: \"List worktrees with status metadata.\",\n details: [\"Includes branch, path, dirty, lock, merged, and upstream fields.\"],\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: \"use\",\n usage: \"vw use <branch> [--allow-agent --allow-unsafe]\",\n summary: \"Checkout target branch in primary worktree.\",\n details: [\"Non-TTY execution requires --allow-agent and --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 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 readGitConfigInt = async (repoRoot: string, key: string): Promise<number | undefined> => {\n const result = await runGitCommand({\n cwd: repoRoot,\n args: [\"config\", \"--get\", key],\n reject: false,\n })\n if (result.exitCode !== 0) {\n return undefined\n }\n\n const parsed = Number.parseInt(result.stdout.trim(), 10)\n return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined\n}\n\nconst readGitConfigBoolean = async (repoRoot: string, key: string): Promise<boolean | undefined> => {\n const result = await runGitCommand({\n cwd: repoRoot,\n args: [\"config\", \"--bool\", \"--get\", key],\n reject: false,\n })\n if (result.exitCode !== 0) {\n return undefined\n }\n\n const value = result.stdout.trim().toLowerCase()\n if (value === \"true\" || value === \"yes\" || value === \"on\" || value === \"1\") {\n return true\n }\n if (value === \"false\" || value === \"no\" || value === \"off\" || value === \"0\") {\n return false\n }\n return undefined\n}\n\nconst resolveConfiguredBaseRemote = async (repoRoot: string): Promise<string> => {\n const configured = await runGitCommand({\n cwd: repoRoot,\n args: [\"config\", \"--get\", \"vde-worktree.baseRemote\"],\n reject: false,\n })\n if (configured.exitCode === 0 && configured.stdout.trim().length > 0) {\n return configured.stdout.trim()\n }\n return \"origin\"\n}\n\nconst resolveBaseBranch = async (repoRoot: string): Promise<string> => {\n const configured = await runGitCommand({\n cwd: repoRoot,\n args: [\"config\", \"--get\", \"vde-worktree.baseBranch\"],\n reject: false,\n })\n if (configured.exitCode === 0 && configured.stdout.trim().length > 0) {\n return configured.stdout.trim()\n }\n\n const configuredRemote = await resolveConfiguredBaseRemote(repoRoot)\n const remotesToProbe = [configuredRemote, \"origin\", \"upstream\"].filter((value, index, arr) => {\n return arr.indexOf(value) === index\n })\n\n for (const remote of remotesToProbe) {\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 continue\n }\n\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. Configure vde-worktree.baseBranch.\",\n })\n}\n\nconst ensureTargetPathWritable = async (targetPath: string): Promise<void> => {\n try {\n await access(targetPath, fsConstants.F_OK)\n } catch {\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 worktreePath,\n relativePath,\n}: {\n readonly repoRoot: string\n readonly worktreePath: 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 = ensurePathInsideRepo({\n repoRoot,\n path: resolve(worktreePath, relativeFromRoot),\n })\n return { sourcePath, destinationPath, relativeFromRoot }\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 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 padEndByWidth = (value: string, targetWidth: number): string => {\n const width = stringWidth(value)\n if (width >= targetWidth) {\n return value\n }\n return `${value}${\" \".repeat(targetWidth - width)}`\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 \" --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 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 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: \"path\",\n description: \"Path used by extract --from\",\n },\n stash: {\n type: \"boolean\",\n description: \"Allow stash for extract\",\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\n const configuredHookTimeoutMs = await readGitConfigInt(repoRoot, \"vde-worktree.hookTimeoutMs\")\n const configuredLockTimeoutMs = await readGitConfigInt(repoRoot, \"vde-worktree.lockTimeoutMs\")\n const configuredStaleTTL = await readGitConfigInt(repoRoot, \"vde-worktree.staleLockTTLSeconds\")\n const configuredHooksEnabled = await readGitConfigBoolean(repoRoot, \"vde-worktree.hooksEnabled\")\n\n const runtime: CommonRuntime = {\n command,\n json: jsonEnabled,\n hooksEnabled: parsedArgs.hooks !== false && configuredHooksEnabled !== false,\n strictPostHooks: parsedArgs.strictPostHooks === true,\n hookTimeoutMs: readNumberFromEnvOrDefault({\n rawValue:\n toNumberOption({ value: parsedArgs.hookTimeoutMs, optionName: \"--hook-timeout-ms\" }) ??\n configuredHookTimeoutMs,\n defaultValue: DEFAULT_HOOK_TIMEOUT_MS,\n }),\n lockTimeoutMs: readNumberFromEnvOrDefault({\n rawValue:\n toNumberOption({ value: parsedArgs.lockTimeoutMs, optionName: \"--lock-timeout-ms\" }) ??\n configuredLockTimeoutMs,\n defaultValue: DEFAULT_LOCK_TIMEOUT_MS,\n }),\n allowUnsafe,\n isInteractive: isInteractiveFn(),\n }\n\n const staleLockTTLSeconds = readNumberFromEnvOrDefault({\n rawValue: configuredStaleTTL,\n defaultValue: DEFAULT_STALE_LOCK_TTL_SECONDS,\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(repoRoot)\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 worktrees: snapshot.worktrees,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n const rows = snapshot.worktrees.map((worktree) => {\n return {\n branch: worktree.branch ?? \"(detached)\",\n path: formatDisplayPath(worktree.path),\n }\n })\n const branchWidth = rows.reduce((max, row) => {\n return Math.max(max, stringWidth(row.branch))\n }, 0)\n\n for (const row of rows) {\n stdout(`${padEndByWidth(row.branch, branchWidth)} ${row.path}`)\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)\n await ensureTargetPathWritable(targetPath)\n const baseBranch = await resolveBaseBranch(repoRoot)\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 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 return { status: \"existing\" as const, branch, path: existing.path }\n }\n\n const targetPath = branchToWorktreePath(repoRoot, branch)\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 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(repoRoot)\n await runGitCommand({\n cwd: repoRoot,\n args: [\"worktree\", \"add\", \"-b\", branch, targetPath, baseBranch],\n })\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)\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 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\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\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) => worktree.dirty === false)\n .filter((worktree) => worktree.locked.value === false)\n .filter((worktree) => worktree.merged.overall === true)\n .filter((worktree) => worktree.upstream.ahead === 0)\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 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),\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 existing = snapshot.worktrees.find((worktree) => worktree.branch === branch)\n if (existing !== undefined) {\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)\n await ensureTargetPathWritable(targetPath)\n await runGitCommand({\n cwd: repoRoot,\n args: [\"worktree\", \"add\", targetPath, branch],\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(repoRoot)\n ensureBranchIsNotPrimary({ branch, baseBranch })\n const targetPath = branchToWorktreePath(repoRoot, branch)\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 stashRef: string | null = null\n if (dirty && parsedArgs.stash === true) {\n await runGitCommand({\n cwd: repoRoot,\n args: [\"stash\", \"push\", \"-u\", \"-m\", `vde-worktree extract ${branch}`],\n })\n const stashTop = await runGitCommand({\n cwd: repoRoot,\n args: [\"stash\", \"list\", \"--max-count=1\", \"--format=%gd\"],\n })\n stashRef = stashTop.stdout.trim().length > 0 ? stashTop.stdout.trim() : null\n }\n\n const hookContext = createHookContext({\n runtime,\n repoRoot,\n action: \"extract\",\n branch,\n worktreePath: targetPath,\n stderr,\n })\n await runPreHook({ name: \"extract\", context: hookContext })\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\n if (stashRef !== null) {\n const applyResult = await runGitCommand({\n cwd: targetPath,\n args: [\"stash\", \"apply\", stashRef],\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: { stashRef, branch, path: targetPath },\n })\n }\n await runGitCommand({\n cwd: repoRoot,\n args: [\"stash\", \"drop\", stashRef],\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 === \"use\") {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n const branch = commandArgs[0] as string\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 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: [\"checkout\", branch],\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 worktreePath = ensurePathInsideRepo({\n repoRoot,\n path: resolvePathFromCwd({\n cwd: repoContext.currentWorktreeRoot,\n path: process.env.WT_WORKTREE_PATH ?? \".\",\n }),\n })\n\n for (const relativePath of commandArgs) {\n const { sourcePath, destinationPath } = resolveFileCopyTargets({\n repoRoot,\n worktreePath,\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,\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 worktreePath = ensurePathInsideRepo({\n repoRoot,\n path: resolvePathFromCwd({\n cwd: repoContext.currentWorktreeRoot,\n path: process.env.WT_WORKTREE_PATH ?? \".\",\n }),\n })\n const fallbackEnabled = parsedArgs.fallback !== false\n\n for (const relativePath of commandArgs) {\n const { sourcePath, destinationPath } = resolveFileCopyTargets({\n repoRoot,\n worktreePath,\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,\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 candidates = snapshot.worktrees.map((worktree) => worktree.path)\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 = typeof promptValue === \"string\" && promptValue.length > 0 ? promptValue : \"worktree> \"\n const fzfExtraArgs = collectOptionValues({\n args: beforeDoubleDash,\n optionNames: [\"fzfArg\", \"fzf-arg\"],\n })\n\n const selection = await selectPathWithFzf({\n candidates,\n prompt,\n fzfExtraArgs,\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\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n path: selection.path,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n stdout(selection.path)\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","lockFilePath","fsConstants","fsConstants","resolveBaseBranch","fsConstants","fsConstants","selectPathWithFzf","defaultSelectPathWithFzf"],"sources":["../src/core/constants.ts","../src/core/errors.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-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 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.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 | \"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 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 { 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 { 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\"\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 = (repoRoot: string): string => {\n return join(repoRoot, \".worktree\")\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 return encodeURIComponent(branch)\n}\n\nexport const branchToWorktreePath = (repoRoot: string, branch: string): string => {\n return join(getWorktreeRootPath(repoRoot), branchToWorktreeId(branch))\n}\n\nexport const ensurePathInsideRepo = ({\n repoRoot,\n path,\n}: {\n readonly repoRoot: string\n readonly path: string\n}): string => {\n const rel = relative(repoRoot, path)\n if (rel === \"\") {\n return path\n }\n if (rel === \"..\" || rel.startsWith(`..${sep}`)) {\n throw createCliError(\"PATH_OUTSIDE_REPO\", {\n message: \"Path is outside repository root\",\n details: { repoRoot, path },\n })\n }\n return path\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","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 } from \"node:path\"\nimport {\n getHooksDirectoryPath,\n getLocksDirectoryPath,\n getLogsDirectoryPath,\n getStateDirectoryPath,\n getWorktreeMetaRootPath,\n getWorktreeRootPath,\n} from \"./paths\"\n\nconst MANAGED_EXCLUDE_BLOCK = `# vde-worktree (managed)\\n.worktree/\\n.vde/worktree/\\n`\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 ensureExcludeBlock = async (repoRoot: string): Promise<void> => {\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(MANAGED_EXCLUDE_BLOCK)) {\n return\n }\n\n const normalizedCurrent = current.endsWith(\"\\n\") || current.length === 0 ? current : `${current}\\n`\n await writeFile(excludePath, `${normalizedCurrent}${MANAGED_EXCLUDE_BLOCK}`, \"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 (repoRoot: string): Promise<InitResult> => {\n const wasInitialized = await isInitialized(repoRoot)\n await mkdir(getWorktreeRootPath(repoRoot), { 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)\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, 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 ResolveMergedByPrInput = {\n readonly repoRoot: string\n readonly branch: string\n readonly enabled?: boolean\n readonly runGh?: GhCommandRunner\n}\n\ntype PrSummary = {\n readonly mergedAt?: 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 parseMergedResult = (raw: string): boolean | null => {\n try {\n const parsed = JSON.parse(raw) as unknown\n if (Array.isArray(parsed) !== true) {\n return null\n }\n const records = parsed as PrSummary[]\n if (records.length === 0) {\n return false\n }\n\n return records.some((record) => typeof record?.mergedAt === \"string\" && record.mergedAt.length > 0)\n } catch {\n return null\n }\n}\n\nexport const resolveMergedByPr = async ({\n repoRoot,\n branch,\n enabled = true,\n runGh = defaultRunGh,\n}: ResolveMergedByPrInput): Promise<boolean | null> => {\n if (enabled !== true) {\n return null\n }\n\n try {\n const result = await runGh({\n cwd: repoRoot,\n args: [\"pr\", \"list\", \"--state\", \"merged\", \"--head\", branch, \"--limit\", \"1\", \"--json\", \"mergedAt\"],\n })\n if (result.exitCode !== 0) {\n return null\n }\n\n return parseMergedResult(result.stdout)\n } catch (error) {\n const execaError = error as ExecaLikeError\n if (execaError.code === \"ENOENT\") {\n return null\n }\n return null\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 { doesGitRefExist, runGitCommand } from \"../git/exec\"\nimport { resolveMergedByPr } from \"../integrations/gh\"\nimport { type GitWorktree, listGitWorktrees } from \"../git/worktree\"\nimport { branchToWorktreeId, getLocksDirectoryPath } from \"./paths\"\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 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 upstream: WorktreeUpstreamState\n}\n\nconst resolveBaseBranch = async (repoRoot: string): Promise<string | null> => {\n const explicit = await runGitCommand({\n cwd: repoRoot,\n args: [\"config\", \"--get\", \"vde-worktree.baseBranch\"],\n reject: false,\n })\n if (explicit.exitCode === 0 && explicit.stdout.trim().length > 0) {\n return explicit.stdout.trim()\n }\n\n for (const candidate of [\"main\", \"master\"]) {\n if (await doesGitRefExist(repoRoot, `refs/heads/${candidate}`)) {\n return candidate\n }\n }\n return null\n}\n\nconst resolveEnableGh = async (repoRoot: string): Promise<boolean> => {\n const result = await runGitCommand({\n cwd: repoRoot,\n args: [\"config\", \"--bool\", \"--get\", \"vde-worktree.enableGh\"],\n reject: false,\n })\n if (result.exitCode !== 0) {\n return true\n }\n const value = result.stdout.trim().toLowerCase()\n if (value === \"false\" || value === \"no\" || value === \"off\" || value === \"0\") {\n return false\n }\n return true\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 resolveMergedState = async ({\n repoRoot,\n branch,\n baseBranch,\n enableGh,\n}: {\n readonly repoRoot: string\n readonly branch: string | null\n readonly baseBranch: string | null\n readonly enableGh: boolean\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 byPR = await resolveMergedByPr({\n repoRoot,\n branch,\n enabled: enableGh,\n })\n\n return {\n byAncestry,\n byPR,\n overall: resolveMergedOverall({\n byAncestry,\n byPR,\n }),\n }\n}\n\nexport const resolveMergedOverall = ({\n byAncestry,\n byPR,\n}: {\n readonly byAncestry: boolean | null\n readonly byPR: boolean | null\n}): boolean | null => {\n if (byPR === true) {\n return true\n }\n if (byPR === false) {\n return false\n }\n return byAncestry\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 enableGh,\n}: {\n readonly repoRoot: string\n readonly worktree: GitWorktree\n readonly baseBranch: string | null\n readonly enableGh: boolean\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, baseBranch, enableGh }),\n resolveUpstreamState(worktree.path),\n ])\n\n return {\n branch: worktree.branch,\n path: worktree.path,\n head: worktree.head,\n dirty,\n locked,\n merged,\n upstream,\n }\n}\n\nexport type WorktreeSnapshot = {\n readonly repoRoot: string\n readonly baseBranch: string | null\n readonly worktrees: WorktreeStatus[]\n}\n\nexport const collectWorktreeSnapshot = async (repoRoot: string): Promise<WorktreeSnapshot> => {\n const [baseBranch, worktrees, enableGh] = await Promise.all([\n resolveBaseBranch(repoRoot),\n listGitWorktrees(repoRoot),\n resolveEnableGh(repoRoot),\n ])\n const enriched = await Promise.all(\n worktrees.map(async (worktree) => {\n return enrichWorktree({ repoRoot, worktree, baseBranch, enableGh })\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\"])\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 fzfExtraArgs?: ReadonlyArray<string>\n readonly cwd?: string\n readonly env?: NodeJS.ProcessEnv\n readonly isInteractive?: () => boolean\n readonly checkFzfAvailability?: () => Promise<boolean>\n readonly runFzf?: (input: RunFzfInput) => Promise<RunFzfResult>\n}\n\nconst sanitizeCandidate = (value: string): string => value.replace(/[\\t\\r\\n]+/g, \" \").trim()\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 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\nexport const selectPathWithFzf = async ({\n candidates,\n prompt = \"worktree> \",\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 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 args = buildFzfArgs({ prompt, fzfExtraArgs })\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\"))\n\n try {\n const result = await runFzf({\n args,\n input,\n cwd,\n env,\n })\n\n const selectedPath = result.stdout.trim()\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 } catch (error) {\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 { parseArgs } from \"citty\"\nimport type { ArgsDef } from \"citty\"\nimport { execa } from \"execa\"\nimport { getBorderCharacters, table } from \"table\"\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 ensurePathInsideRepo,\n resolvePathFromCwd,\n resolveRepoContext,\n resolveRepoRelativePath,\n} from \"../core/paths\"\nimport { readNumberFromEnvOrDefault, withRepoLock } from \"../core/repo-lock\"\nimport { deleteWorktreeLock, readWorktreeLock, upsertWorktreeLock } from \"../core/worktree-lock\"\nimport { collectWorktreeSnapshot, type WorktreeSnapshot, type WorktreeStatus } 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 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\nconst EXIT_CODE_CANCELLED = 130\n\nconst optionNamesAllowOptionLikeValue = new Set([\"fzfArg\", \"fzf-arg\"])\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 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]\",\n summary: \"List worktrees with status metadata.\",\n details: [\"Includes branch, path, dirty, lock, merged, and upstream fields.\"],\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: \"use\",\n usage: \"vw use <branch> [--allow-agent --allow-unsafe]\",\n summary: \"Checkout target branch in primary worktree.\",\n details: [\"Non-TTY execution requires --allow-agent and --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 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 readGitConfigInt = async (repoRoot: string, key: string): Promise<number | undefined> => {\n const result = await runGitCommand({\n cwd: repoRoot,\n args: [\"config\", \"--get\", key],\n reject: false,\n })\n if (result.exitCode !== 0) {\n return undefined\n }\n\n const parsed = Number.parseInt(result.stdout.trim(), 10)\n return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined\n}\n\nconst readGitConfigBoolean = async (repoRoot: string, key: string): Promise<boolean | undefined> => {\n const result = await runGitCommand({\n cwd: repoRoot,\n args: [\"config\", \"--bool\", \"--get\", key],\n reject: false,\n })\n if (result.exitCode !== 0) {\n return undefined\n }\n\n const value = result.stdout.trim().toLowerCase()\n if (value === \"true\" || value === \"yes\" || value === \"on\" || value === \"1\") {\n return true\n }\n if (value === \"false\" || value === \"no\" || value === \"off\" || value === \"0\") {\n return false\n }\n return undefined\n}\n\nconst resolveConfiguredBaseRemote = async (repoRoot: string): Promise<string> => {\n const configured = await runGitCommand({\n cwd: repoRoot,\n args: [\"config\", \"--get\", \"vde-worktree.baseRemote\"],\n reject: false,\n })\n if (configured.exitCode === 0 && configured.stdout.trim().length > 0) {\n return configured.stdout.trim()\n }\n return \"origin\"\n}\n\nconst resolveBaseBranch = async (repoRoot: string): Promise<string> => {\n const configured = await runGitCommand({\n cwd: repoRoot,\n args: [\"config\", \"--get\", \"vde-worktree.baseBranch\"],\n reject: false,\n })\n if (configured.exitCode === 0 && configured.stdout.trim().length > 0) {\n return configured.stdout.trim()\n }\n\n const configuredRemote = await resolveConfiguredBaseRemote(repoRoot)\n const remotesToProbe = [configuredRemote, \"origin\", \"upstream\"].filter((value, index, arr) => {\n return arr.indexOf(value) === index\n })\n\n for (const remote of remotesToProbe) {\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 continue\n }\n\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. Configure vde-worktree.baseBranch.\",\n })\n}\n\nconst ensureTargetPathWritable = async (targetPath: string): Promise<void> => {\n try {\n await access(targetPath, fsConstants.F_OK)\n } catch {\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 worktreePath,\n relativePath,\n}: {\n readonly repoRoot: string\n readonly worktreePath: 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 = ensurePathInsideRepo({\n repoRoot,\n path: resolve(worktreePath, relativeFromRoot),\n })\n return { sourcePath, destinationPath, relativeFromRoot }\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 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 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 \" --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 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 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: \"path\",\n description: \"Path used by extract --from\",\n },\n stash: {\n type: \"boolean\",\n description: \"Allow stash for extract\",\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\n const configuredHookTimeoutMs = await readGitConfigInt(repoRoot, \"vde-worktree.hookTimeoutMs\")\n const configuredLockTimeoutMs = await readGitConfigInt(repoRoot, \"vde-worktree.lockTimeoutMs\")\n const configuredStaleTTL = await readGitConfigInt(repoRoot, \"vde-worktree.staleLockTTLSeconds\")\n const configuredHooksEnabled = await readGitConfigBoolean(repoRoot, \"vde-worktree.hooksEnabled\")\n\n const runtime: CommonRuntime = {\n command,\n json: jsonEnabled,\n hooksEnabled: parsedArgs.hooks !== false && configuredHooksEnabled !== false,\n strictPostHooks: parsedArgs.strictPostHooks === true,\n hookTimeoutMs: readNumberFromEnvOrDefault({\n rawValue:\n toNumberOption({ value: parsedArgs.hookTimeoutMs, optionName: \"--hook-timeout-ms\" }) ??\n configuredHookTimeoutMs,\n defaultValue: DEFAULT_HOOK_TIMEOUT_MS,\n }),\n lockTimeoutMs: readNumberFromEnvOrDefault({\n rawValue:\n toNumberOption({ value: parsedArgs.lockTimeoutMs, optionName: \"--lock-timeout-ms\" }) ??\n configuredLockTimeoutMs,\n defaultValue: DEFAULT_LOCK_TIMEOUT_MS,\n }),\n allowUnsafe,\n isInteractive: isInteractiveFn(),\n }\n\n const staleLockTTLSeconds = readNumberFromEnvOrDefault({\n rawValue: configuredStaleTTL,\n defaultValue: DEFAULT_STALE_LOCK_TTL_SECONDS,\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(repoRoot)\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 worktrees: snapshot.worktrees,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n\n const rows: string[][] = [\n [\"branch\", \"dirty\", \"merged\", \"locked\", \"path\"],\n ...snapshot.worktrees.map((worktree) => {\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 isCurrent = worktree.path === repoContext.currentWorktreeRoot\n return [\n `${isCurrent ? \"*\" : \" \"} ${worktree.branch ?? \"(detached)\"}`,\n worktree.dirty ? \"dirty\" : \"clean\",\n mergedState,\n worktree.locked.value ? \"locked\" : \"-\",\n formatDisplayPath(worktree.path),\n ]\n }),\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 })\n\n for (const line of rendered.trimEnd().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)\n await ensureTargetPathWritable(targetPath)\n const baseBranch = await resolveBaseBranch(repoRoot)\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 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 return { status: \"existing\" as const, branch, path: existing.path }\n }\n\n const targetPath = branchToWorktreePath(repoRoot, branch)\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 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(repoRoot)\n await runGitCommand({\n cwd: repoRoot,\n args: [\"worktree\", \"add\", \"-b\", branch, targetPath, baseBranch],\n })\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)\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 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\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\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) => worktree.dirty === false)\n .filter((worktree) => worktree.locked.value === false)\n .filter((worktree) => worktree.merged.overall === true)\n .filter((worktree) => worktree.upstream.ahead === 0)\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 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),\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 existing = snapshot.worktrees.find((worktree) => worktree.branch === branch)\n if (existing !== undefined) {\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)\n await ensureTargetPathWritable(targetPath)\n await runGitCommand({\n cwd: repoRoot,\n args: [\"worktree\", \"add\", targetPath, branch],\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(repoRoot)\n ensureBranchIsNotPrimary({ branch, baseBranch })\n const targetPath = branchToWorktreePath(repoRoot, branch)\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 stashRef: string | null = null\n if (dirty && parsedArgs.stash === true) {\n await runGitCommand({\n cwd: repoRoot,\n args: [\"stash\", \"push\", \"-u\", \"-m\", `vde-worktree extract ${branch}`],\n })\n const stashTop = await runGitCommand({\n cwd: repoRoot,\n args: [\"stash\", \"list\", \"--max-count=1\", \"--format=%gd\"],\n })\n stashRef = stashTop.stdout.trim().length > 0 ? stashTop.stdout.trim() : null\n }\n\n const hookContext = createHookContext({\n runtime,\n repoRoot,\n action: \"extract\",\n branch,\n worktreePath: targetPath,\n stderr,\n })\n await runPreHook({ name: \"extract\", context: hookContext })\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\n if (stashRef !== null) {\n const applyResult = await runGitCommand({\n cwd: targetPath,\n args: [\"stash\", \"apply\", stashRef],\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: { stashRef, branch, path: targetPath },\n })\n }\n await runGitCommand({\n cwd: repoRoot,\n args: [\"stash\", \"drop\", stashRef],\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 === \"use\") {\n ensureArgumentCount({ command, args: commandArgs, min: 1, max: 1 })\n const branch = commandArgs[0] as string\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 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: [\"checkout\", branch],\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 worktreePath = ensurePathInsideRepo({\n repoRoot,\n path: resolvePathFromCwd({\n cwd: repoContext.currentWorktreeRoot,\n path: process.env.WT_WORKTREE_PATH ?? \".\",\n }),\n })\n\n for (const relativePath of commandArgs) {\n const { sourcePath, destinationPath } = resolveFileCopyTargets({\n repoRoot,\n worktreePath,\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,\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 worktreePath = ensurePathInsideRepo({\n repoRoot,\n path: resolvePathFromCwd({\n cwd: repoContext.currentWorktreeRoot,\n path: process.env.WT_WORKTREE_PATH ?? \".\",\n }),\n })\n const fallbackEnabled = parsedArgs.fallback !== false\n\n for (const relativePath of commandArgs) {\n const { sourcePath, destinationPath } = resolveFileCopyTargets({\n repoRoot,\n worktreePath,\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,\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 candidates = snapshot.worktrees.map((worktree) => worktree.path)\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 = typeof promptValue === \"string\" && promptValue.length > 0 ? promptValue : \"worktree> \"\n const fzfExtraArgs = collectOptionValues({\n args: beforeDoubleDash,\n optionNames: [\"fzfArg\", \"fzf-arg\"],\n })\n\n const selection = await selectPathWithFzf({\n candidates,\n prompt,\n fzfExtraArgs,\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\n if (runtime.json) {\n stdout(\n JSON.stringify(\n buildJsonSuccess({\n command,\n status: \"ok\",\n repoRoot,\n details: {\n path: selection.path,\n },\n }),\n ),\n )\n return EXIT_CODE.OK\n }\n stdout(selection.path)\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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vde-worktree",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"description": "Git worktree manager with safe defaults for humans and coding agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "pnpm@10.28.2",
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"chalk": "^5.4.1",
|
|
61
61
|
"citty": "^0.2.0",
|
|
62
62
|
"execa": "^9.6.0",
|
|
63
|
-
"
|
|
63
|
+
"table": "^6.9.0"
|
|
64
64
|
},
|
|
65
65
|
"devDependencies": {
|
|
66
66
|
"@eslint/js": "^9.35.0",
|