@aku11i/phantom 0.4.0 → 0.6.0
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/README.ja.md +101 -4
- package/README.md +104 -4
- package/dist/phantom.js +595 -126
- package/dist/phantom.js.map +4 -4
- package/package.json +7 -5
package/dist/phantom.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/bin/phantom.ts", "../src/cli/handlers/
|
|
4
|
-
"sourcesContent": ["#!/usr/bin/env node\n\nimport { argv, exit } from \"node:process\";\nimport { createHandler } from \"../cli/handlers/create.ts\";\nimport { deleteHandler } from \"../cli/handlers/delete.ts\";\nimport { execHandler } from \"../cli/handlers/exec.ts\";\nimport { listHandler } from \"../cli/handlers/list.ts\";\nimport { shellHandler } from \"../cli/handlers/shell.ts\";\nimport { versionHandler } from \"../cli/handlers/version.ts\";\nimport { whereHandler } from \"../cli/handlers/where.ts\";\n\ninterface Command {\n name: string;\n description: string;\n subcommands?: Command[];\n handler?: (args: string[]) => void | Promise<void>;\n}\n\nconst commands: Command[] = [\n {\n name: \"create\",\n description: \"Create a new worktree [--shell | --exec <command>]\",\n handler: createHandler,\n },\n {\n name: \"list\",\n description: \"List all worktrees\",\n handler: listHandler,\n },\n {\n name: \"where\",\n description: \"Output the path of a specific worktree\",\n handler: whereHandler,\n },\n {\n name: \"delete\",\n description: \"Delete a worktree (use --force for uncommitted changes)\",\n handler: deleteHandler,\n },\n {\n name: \"exec\",\n description: \"Execute a command in a worktree directory\",\n handler: execHandler,\n },\n {\n name: \"shell\",\n description: \"Open interactive shell in a worktree directory\",\n handler: shellHandler,\n },\n {\n name: \"version\",\n description: \"Display phantom version\",\n handler: versionHandler,\n },\n];\n\nfunction printHelp(commands: Command[]) {\n console.log(\"Usage: phantom <command> [options]\\n\");\n console.log(\"Commands:\");\n for (const cmd of commands) {\n console.log(` ${cmd.name.padEnd(12)} ${cmd.description}`);\n }\n}\n\nfunction findCommand(\n args: string[],\n commands: Command[],\n): { command: Command | null; remainingArgs: string[] } {\n if (args.length === 0) {\n return { command: null, remainingArgs: [] };\n }\n\n const [cmdName, ...rest] = args;\n const command = commands.find((cmd) => cmd.name === cmdName);\n\n if (!command) {\n return { command: null, remainingArgs: args };\n }\n\n if (command.subcommands && rest.length > 0) {\n const { command: subcommand, remainingArgs } = findCommand(\n rest,\n command.subcommands,\n );\n if (subcommand) {\n return { command: subcommand, remainingArgs };\n }\n }\n\n return { command, remainingArgs: rest };\n}\n\nconst args = argv.slice(2);\n\nif (args.length === 0 || args[0] === \"-h\" || args[0] === \"--help\") {\n printHelp(commands);\n exit(0);\n}\n\nif (args[0] === \"--version\" || args[0] === \"-v\") {\n versionHandler();\n exit(0);\n}\n\nconst { command, remainingArgs } = findCommand(args, commands);\n\nif (!command || !command.handler) {\n console.error(`Error: Unknown command '${args.join(\" \")}'\\n`);\n printHelp(commands);\n exit(1);\n}\n\ntry {\n await command.handler(remainingArgs);\n} catch (error) {\n console.error(\n \"Error:\",\n error instanceof Error ? error.message : String(error),\n );\n exit(1);\n}\n", "import { parseArgs } from \"node:util\";\nimport { getGitRoot } from \"../../core/git/libs/get-git-root.ts\";\nimport { execInWorktree } from \"../../core/process/exec.ts\";\nimport { shellInWorktree } from \"../../core/process/shell.ts\";\nimport { isErr, isOk } from \"../../core/types/result.ts\";\nimport { createWorktree as createWorktreeCore } from \"../../core/worktree/create.ts\";\nimport { WorktreeAlreadyExistsError } from \"../../core/worktree/errors.ts\";\nimport { exitCodes, exitWithError, exitWithSuccess } from \"../errors.ts\";\nimport { output } from \"../output.ts\";\n\nexport async function createHandler(args: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args,\n options: {\n shell: {\n type: \"boolean\",\n short: \"s\",\n },\n exec: {\n type: \"string\",\n short: \"x\",\n },\n },\n strict: true,\n allowPositionals: true,\n });\n\n if (positionals.length === 0) {\n exitWithError(\n \"Please provide a name for the new worktree\",\n exitCodes.validationError,\n );\n }\n\n const worktreeName = positionals[0];\n const openShell = values.shell ?? false;\n const execCommand = values.exec;\n\n if (openShell && execCommand) {\n exitWithError(\n \"Cannot use --shell and --exec together\",\n exitCodes.validationError,\n );\n }\n\n try {\n const gitRoot = await getGitRoot();\n const result = await createWorktreeCore(gitRoot, worktreeName);\n\n if (isErr(result)) {\n const exitCode =\n result.error instanceof WorktreeAlreadyExistsError\n ? exitCodes.validationError\n : exitCodes.generalError;\n exitWithError(result.error.message, exitCode);\n }\n\n output.log(result.value.message);\n\n if (execCommand && isOk(result)) {\n output.log(\n `\\nExecuting command in worktree '${worktreeName}': ${execCommand}`,\n );\n\n const shell = process.env.SHELL || \"/bin/sh\";\n const execResult = await execInWorktree(gitRoot, worktreeName, [\n shell,\n \"-c\",\n execCommand,\n ]);\n\n if (isErr(execResult)) {\n output.error(execResult.error.message);\n const exitCode =\n \"exitCode\" in execResult.error\n ? (execResult.error.exitCode ?? exitCodes.generalError)\n : exitCodes.generalError;\n exitWithError(\"\", exitCode);\n }\n\n process.exit(execResult.value.exitCode ?? 0);\n }\n\n if (openShell && isOk(result)) {\n output.log(\n `\\nEntering worktree '${worktreeName}' at ${result.value.path}`,\n );\n output.log(\"Type 'exit' to return to your original directory\\n\");\n\n const shellResult = await shellInWorktree(gitRoot, worktreeName);\n\n if (isErr(shellResult)) {\n output.error(shellResult.error.message);\n const exitCode =\n \"exitCode\" in shellResult.error\n ? (shellResult.error.exitCode ?? exitCodes.generalError)\n : exitCodes.generalError;\n exitWithError(\"\", exitCode);\n }\n\n process.exit(shellResult.value.exitCode ?? 0);\n }\n\n exitWithSuccess();\n } catch (error) {\n exitWithError(\n error instanceof Error ? error.message : String(error),\n exitCodes.generalError,\n );\n }\n}\n", "import { execFile as execFileCallback } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execFile = promisify(execFileCallback);\n\nexport interface GitExecutorOptions {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n}\n\nexport interface GitExecutorResult {\n stdout: string;\n stderr: string;\n}\n\n/**\n * Execute a git command with consistent error handling\n */\nexport async function executeGitCommand(\n args: string[],\n options: GitExecutorOptions = {},\n): Promise<GitExecutorResult> {\n try {\n const result = await execFile(\"git\", args, {\n cwd: options.cwd,\n env: options.env || process.env,\n encoding: \"utf8\",\n });\n\n return {\n stdout: result.stdout.trim(),\n stderr: result.stderr.trim(),\n };\n } catch (error) {\n // Git commands often return non-zero exit codes for normal operations\n // (e.g., `git diff` returns 1 when there are differences)\n // So we need to handle errors carefully\n if (\n error &&\n typeof error === \"object\" &&\n \"stdout\" in error &&\n \"stderr\" in error\n ) {\n const execError = error as {\n stdout: string;\n stderr: string;\n code?: number;\n };\n\n // If we have stderr content, it's likely a real error\n if (execError.stderr?.trim()) {\n throw new Error(execError.stderr.trim());\n }\n\n // Otherwise, return the output even though the exit code was non-zero\n return {\n stdout: execError.stdout?.trim() || \"\",\n stderr: execError.stderr?.trim() || \"\",\n };\n }\n\n throw error;\n }\n}\n\n/**\n * Execute a git command in a specific directory\n */\nexport async function executeGitCommandInDirectory(\n directory: string,\n args: string[],\n): Promise<GitExecutorResult> {\n return executeGitCommand([\"-C\", directory, ...args], {});\n}\n", "import { executeGitCommand } from \"../executor.ts\";\n\nexport async function getGitRoot(): Promise<string> {\n const { stdout } = await executeGitCommand([\"rev-parse\", \"--show-toplevel\"]);\n return stdout;\n}\n", "/**\n * Represents a value that is either successful (Ok) or contains an error (Err).\n * This type is inspired by Rust's Result type and provides type-safe error handling.\n *\n * @template T - The type of the success value\n * @template E - The type of the error value (defaults to Error)\n */\nexport type Result<T, E = Error> =\n | { ok: true; value: T }\n | { ok: false; error: E };\n\n/**\n * Creates a successful Result containing the given value.\n *\n * @template T - The type of the success value\n * @param value - The success value to wrap\n * @returns A Result in the Ok state containing the value\n *\n * @example\n * const result = ok(42);\n * // result: Result<number, never> = { ok: true, value: 42 }\n */\nexport const ok = <T>(value: T): Result<T, never> => ({\n ok: true,\n value,\n});\n\n/**\n * Creates a failed Result containing the given error.\n *\n * @template E - The type of the error value\n * @param error - The error value to wrap\n * @returns A Result in the Err state containing the error\n *\n * @example\n * const result = err(new Error(\"Something went wrong\"));\n * // result: Result<never, Error> = { ok: false, error: Error(...) }\n */\nexport const err = <E>(error: E): Result<never, E> => ({\n ok: false,\n error,\n});\n\n/**\n * Type guard that checks if a Result is in the Ok state.\n *\n * @template T - The type of the success value\n * @template E - The type of the error value\n * @param result - The Result to check\n * @returns True if the Result is Ok, false otherwise\n *\n * @example\n * if (isOk(result)) {\n * console.log(result.value); // TypeScript knows result.value exists\n * }\n */\nexport const isOk = <T, E>(\n result: Result<T, E>,\n): result is { ok: true; value: T } => result.ok;\n\n/**\n * Type guard that checks if a Result is in the Err state.\n *\n * @template T - The type of the success value\n * @template E - The type of the error value\n * @param result - The Result to check\n * @returns True if the Result is Err, false otherwise\n *\n * @example\n * if (isErr(result)) {\n * console.error(result.error); // TypeScript knows result.error exists\n * }\n */\nexport const isErr = <T, E>(\n result: Result<T, E>,\n): result is { ok: false; error: E } => !result.ok;\n", "export class WorktreeError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"WorktreeError\";\n }\n}\n\nexport class WorktreeNotFoundError extends WorktreeError {\n constructor(name: string) {\n super(`Worktree '${name}' not found`);\n this.name = \"WorktreeNotFoundError\";\n }\n}\n\nexport class WorktreeAlreadyExistsError extends WorktreeError {\n constructor(name: string) {\n super(`Worktree '${name}' already exists`);\n this.name = \"WorktreeAlreadyExistsError\";\n }\n}\n\nexport class InvalidWorktreeNameError extends WorktreeError {\n constructor(name: string) {\n super(`Invalid worktree name: '${name}'`);\n this.name = \"InvalidWorktreeNameError\";\n }\n}\n\nexport class GitOperationError extends WorktreeError {\n constructor(operation: string, details: string) {\n super(`Git ${operation} failed: ${details}`);\n this.name = \"GitOperationError\";\n }\n}\n", "import fs from \"node:fs/promises\";\nimport { getPhantomDirectory, getWorktreePath } from \"../paths.ts\";\n\nexport interface ValidationResult {\n exists: boolean;\n path?: string;\n message?: string;\n}\n\nexport async function validateWorktreeExists(\n gitRoot: string,\n name: string,\n): Promise<ValidationResult> {\n const worktreePath = getWorktreePath(gitRoot, name);\n\n try {\n await fs.access(worktreePath);\n return {\n exists: true,\n path: worktreePath,\n };\n } catch {\n return {\n exists: false,\n message: `Worktree '${name}' does not exist`,\n };\n }\n}\n\nexport async function validateWorktreeDoesNotExist(\n gitRoot: string,\n name: string,\n): Promise<ValidationResult> {\n const worktreePath = getWorktreePath(gitRoot, name);\n\n try {\n await fs.access(worktreePath);\n return {\n exists: true,\n message: `Worktree '${name}' already exists`,\n };\n } catch {\n return {\n exists: false,\n path: worktreePath,\n };\n }\n}\n\nexport async function validatePhantomDirectoryExists(\n gitRoot: string,\n): Promise<boolean> {\n const phantomDir = getPhantomDirectory(gitRoot);\n\n try {\n await fs.access(phantomDir);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function listValidWorktrees(gitRoot: string): Promise<string[]> {\n const phantomDir = getPhantomDirectory(gitRoot);\n\n if (!(await validatePhantomDirectoryExists(gitRoot))) {\n return [];\n }\n\n try {\n const entries = await fs.readdir(phantomDir);\n const validWorktrees: string[] = [];\n\n for (const entry of entries) {\n const result = await validateWorktreeExists(gitRoot, entry);\n if (result.exists) {\n validWorktrees.push(entry);\n }\n }\n\n return validWorktrees;\n } catch {\n return [];\n }\n}\n", "import { join } from \"node:path\";\n\nexport function getPhantomDirectory(gitRoot: string): string {\n return join(gitRoot, \".git\", \"phantom\", \"worktrees\");\n}\n\nexport function getWorktreePath(gitRoot: string, name: string): string {\n return join(getPhantomDirectory(gitRoot), name);\n}\n", "import {\n type ChildProcess,\n type SpawnOptions,\n spawn as nodeSpawn,\n} from \"node:child_process\";\nimport { type Result, err, ok } from \"../types/result.ts\";\nimport {\n type ProcessError,\n ProcessExecutionError,\n ProcessSignalError,\n ProcessSpawnError,\n} from \"./errors.ts\";\n\nexport interface SpawnSuccess {\n exitCode: number;\n}\n\nexport interface SpawnConfig {\n command: string;\n args?: string[];\n options?: SpawnOptions;\n}\n\nexport async function spawnProcess(\n config: SpawnConfig,\n): Promise<Result<SpawnSuccess, ProcessError>> {\n return new Promise((resolve) => {\n const { command, args = [], options = {} } = config;\n\n const childProcess: ChildProcess = nodeSpawn(command, args, {\n stdio: \"inherit\",\n ...options,\n });\n\n childProcess.on(\"error\", (error) => {\n resolve(err(new ProcessSpawnError(command, error.message)));\n });\n\n childProcess.on(\"exit\", (code, signal) => {\n if (signal) {\n resolve(err(new ProcessSignalError(signal)));\n } else {\n const exitCode = code ?? 0;\n if (exitCode === 0) {\n resolve(ok({ exitCode }));\n } else {\n resolve(err(new ProcessExecutionError(command, exitCode)));\n }\n }\n });\n });\n}\n", "export class ProcessError extends Error {\n public readonly exitCode?: number;\n\n constructor(message: string, exitCode?: number) {\n super(message);\n this.name = \"ProcessError\";\n this.exitCode = exitCode;\n }\n}\n\nexport class ProcessExecutionError extends ProcessError {\n constructor(command: string, exitCode: number) {\n super(`Command '${command}' failed with exit code ${exitCode}`, exitCode);\n this.name = \"ProcessExecutionError\";\n }\n}\n\nexport class ProcessSignalError extends ProcessError {\n constructor(signal: string) {\n const exitCode = 128 + (signal === \"SIGTERM\" ? 15 : 1);\n super(`Command terminated by signal: ${signal}`, exitCode);\n this.name = \"ProcessSignalError\";\n }\n}\n\nexport class ProcessSpawnError extends ProcessError {\n constructor(command: string, details: string) {\n super(`Error executing command '${command}': ${details}`);\n this.name = \"ProcessSpawnError\";\n }\n}\n", "import { type Result, err } from \"../types/result.ts\";\nimport { WorktreeNotFoundError } from \"../worktree/errors.ts\";\nimport { validateWorktreeExists } from \"../worktree/validate.ts\";\nimport type { ProcessError } from \"./errors.ts\";\nimport { type SpawnSuccess, spawnProcess } from \"./spawn.ts\";\n\nexport type ExecInWorktreeSuccess = SpawnSuccess;\n\nexport async function execInWorktree(\n gitRoot: string,\n worktreeName: string,\n command: string[],\n): Promise<\n Result<ExecInWorktreeSuccess, WorktreeNotFoundError | ProcessError>\n> {\n const validation = await validateWorktreeExists(gitRoot, worktreeName);\n if (!validation.exists) {\n return err(new WorktreeNotFoundError(worktreeName));\n }\n\n const worktreePath = validation.path as string;\n const [cmd, ...args] = command;\n\n return spawnProcess({\n command: cmd,\n args,\n options: {\n cwd: worktreePath,\n },\n });\n}\n", "import { type Result, err } from \"../types/result.ts\";\nimport { WorktreeNotFoundError } from \"../worktree/errors.ts\";\nimport { validateWorktreeExists } from \"../worktree/validate.ts\";\nimport type { ProcessError } from \"./errors.ts\";\nimport { type SpawnSuccess, spawnProcess } from \"./spawn.ts\";\n\nexport type ShellInWorktreeSuccess = SpawnSuccess;\n\nexport async function shellInWorktree(\n gitRoot: string,\n worktreeName: string,\n): Promise<\n Result<ShellInWorktreeSuccess, WorktreeNotFoundError | ProcessError>\n> {\n const validation = await validateWorktreeExists(gitRoot, worktreeName);\n if (!validation.exists) {\n return err(new WorktreeNotFoundError(worktreeName));\n }\n\n const worktreePath = validation.path as string;\n const shell = process.env.SHELL || \"/bin/sh\";\n\n return spawnProcess({\n command: shell,\n args: [],\n options: {\n cwd: worktreePath,\n env: {\n ...process.env,\n PHANTOM: \"1\",\n PHANTOM_NAME: worktreeName,\n PHANTOM_PATH: worktreePath,\n },\n },\n });\n}\n", "import fs from \"node:fs/promises\";\nimport { addWorktree } from \"../git/libs/add-worktree.ts\";\nimport { getPhantomDirectory, getWorktreePath } from \"../paths.ts\";\nimport { type Result, err, ok } from \"../types/result.ts\";\nimport { GitOperationError, WorktreeAlreadyExistsError } from \"./errors.ts\";\nimport { validateWorktreeDoesNotExist } from \"./validate.ts\";\n\nexport interface CreateWorktreeOptions {\n branch?: string;\n commitish?: string;\n}\n\nexport interface CreateWorktreeSuccess {\n message: string;\n path: string;\n}\n\nexport async function createWorktree(\n gitRoot: string,\n name: string,\n options: CreateWorktreeOptions = {},\n): Promise<\n Result<CreateWorktreeSuccess, WorktreeAlreadyExistsError | GitOperationError>\n> {\n const { branch = name, commitish = \"HEAD\" } = options;\n\n const worktreesPath = getPhantomDirectory(gitRoot);\n const worktreePath = getWorktreePath(gitRoot, name);\n\n try {\n await fs.access(worktreesPath);\n } catch {\n await fs.mkdir(worktreesPath, { recursive: true });\n }\n\n const validation = await validateWorktreeDoesNotExist(gitRoot, name);\n if (validation.exists) {\n return err(new WorktreeAlreadyExistsError(name));\n }\n\n try {\n await addWorktree({\n path: worktreePath,\n branch,\n commitish,\n });\n\n return ok({\n message: `Created worktree '${name}' at ${worktreePath}`,\n path: worktreePath,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return err(new GitOperationError(\"worktree add\", errorMessage));\n }\n}\n", "import { executeGitCommand } from \"../executor.ts\";\n\nexport interface AddWorktreeOptions {\n path: string;\n branch: string;\n commitish?: string;\n}\n\nexport async function addWorktree(options: AddWorktreeOptions): Promise<void> {\n const { path, branch, commitish = \"HEAD\" } = options;\n\n await executeGitCommand([\"worktree\", \"add\", path, \"-b\", branch, commitish]);\n}\n", "import type { ChildProcess } from \"node:child_process\";\n\nexport const output = {\n log: (message: string) => {\n console.log(message);\n },\n\n error: (message: string) => {\n console.error(message);\n },\n\n table: (data: unknown) => {\n console.table(data);\n },\n\n processOutput: (proc: ChildProcess) => {\n proc.stdout?.pipe(process.stdout);\n proc.stderr?.pipe(process.stderr);\n },\n};\n", "import { output } from \"./output.ts\";\n\nexport const exitCodes = {\n success: 0,\n generalError: 1,\n notFound: 2,\n validationError: 3,\n} as const;\n\nexport function handleError(\n error: unknown,\n exitCode: number = exitCodes.generalError,\n): never {\n if (error instanceof Error) {\n output.error(error.message);\n } else {\n output.error(String(error));\n }\n process.exit(exitCode);\n}\n\nexport function exitWithSuccess(): never {\n process.exit(exitCodes.success);\n}\n\nexport function exitWithError(\n message: string,\n exitCode: number = exitCodes.generalError,\n): never {\n output.error(message);\n process.exit(exitCode);\n}\n", "import { parseArgs } from \"node:util\";\nimport { getGitRoot } from \"../../core/git/libs/get-git-root.ts\";\nimport { isErr } from \"../../core/types/result.ts\";\nimport { deleteWorktree as deleteWorktreeCore } from \"../../core/worktree/delete.ts\";\nimport {\n WorktreeError,\n WorktreeNotFoundError,\n} from \"../../core/worktree/errors.ts\";\nimport { exitCodes, exitWithError, exitWithSuccess } from \"../errors.ts\";\nimport { output } from \"../output.ts\";\n\nexport async function deleteHandler(args: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args,\n options: {\n force: {\n type: \"boolean\",\n short: \"f\",\n },\n },\n strict: true,\n allowPositionals: true,\n });\n\n if (positionals.length === 0) {\n exitWithError(\n \"Please provide a worktree name to delete\",\n exitCodes.validationError,\n );\n }\n\n const worktreeName = positionals[0];\n const forceDelete = values.force ?? false;\n\n try {\n const gitRoot = await getGitRoot();\n const result = await deleteWorktreeCore(gitRoot, worktreeName, {\n force: forceDelete,\n });\n\n if (isErr(result)) {\n const exitCode =\n result.error instanceof WorktreeNotFoundError\n ? exitCodes.validationError\n : result.error instanceof WorktreeError &&\n result.error.message.includes(\"uncommitted changes\")\n ? exitCodes.validationError\n : exitCodes.generalError;\n exitWithError(result.error.message, exitCode);\n }\n\n output.log(result.value.message);\n exitWithSuccess();\n } catch (error) {\n exitWithError(\n error instanceof Error ? error.message : String(error),\n exitCodes.generalError,\n );\n }\n}\n", "import {\n executeGitCommand,\n executeGitCommandInDirectory,\n} from \"../git/executor.ts\";\nimport { type Result, err, isOk, ok } from \"../types/result.ts\";\nimport {\n GitOperationError,\n WorktreeError,\n WorktreeNotFoundError,\n} from \"./errors.ts\";\nimport { validateWorktreeExists } from \"./validate.ts\";\n\nexport interface DeleteWorktreeOptions {\n force?: boolean;\n}\n\nexport interface DeleteWorktreeSuccess {\n message: string;\n hasUncommittedChanges?: boolean;\n changedFiles?: number;\n}\n\nexport interface WorktreeStatus {\n hasUncommittedChanges: boolean;\n changedFiles: number;\n}\n\nexport async function getWorktreeStatus(\n worktreePath: string,\n): Promise<WorktreeStatus> {\n try {\n const { stdout } = await executeGitCommandInDirectory(worktreePath, [\n \"status\",\n \"--porcelain\",\n ]);\n if (stdout) {\n return {\n hasUncommittedChanges: true,\n changedFiles: stdout.split(\"\\n\").length,\n };\n }\n } catch {\n // If git status fails, assume no changes\n }\n return {\n hasUncommittedChanges: false,\n changedFiles: 0,\n };\n}\n\nexport async function removeWorktree(\n gitRoot: string,\n worktreePath: string,\n force = false,\n): Promise<void> {\n try {\n await executeGitCommand([\"worktree\", \"remove\", worktreePath], {\n cwd: gitRoot,\n });\n } catch (error) {\n // Always try force removal if the regular removal fails\n try {\n await executeGitCommand([\"worktree\", \"remove\", \"--force\", worktreePath], {\n cwd: gitRoot,\n });\n } catch {\n throw new Error(\"Failed to remove worktree\");\n }\n }\n}\n\nexport async function deleteBranch(\n gitRoot: string,\n branchName: string,\n): Promise<Result<boolean, GitOperationError>> {\n try {\n await executeGitCommand([\"branch\", \"-D\", branchName], { cwd: gitRoot });\n return ok(true);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return err(new GitOperationError(\"branch delete\", errorMessage));\n }\n}\n\nexport async function deleteWorktree(\n gitRoot: string,\n name: string,\n options: DeleteWorktreeOptions = {},\n): Promise<\n Result<\n DeleteWorktreeSuccess,\n WorktreeNotFoundError | WorktreeError | GitOperationError\n >\n> {\n const { force = false } = options;\n\n const validation = await validateWorktreeExists(gitRoot, name);\n if (!validation.exists) {\n return err(new WorktreeNotFoundError(name));\n }\n\n const worktreePath = validation.path as string;\n\n const status = await getWorktreeStatus(worktreePath);\n\n if (status.hasUncommittedChanges && !force) {\n return err(\n new WorktreeError(\n `Worktree '${name}' has uncommitted changes (${status.changedFiles} files). Use --force to delete anyway.`,\n ),\n );\n }\n\n try {\n await removeWorktree(gitRoot, worktreePath, force);\n\n const branchName = name;\n const branchResult = await deleteBranch(gitRoot, branchName);\n\n let message: string;\n if (isOk(branchResult)) {\n message = `Deleted worktree '${name}' and its branch '${branchName}'`;\n } else {\n message = `Deleted worktree '${name}'`;\n message += `\\nNote: Branch '${branchName}' could not be deleted: ${branchResult.error.message}`;\n }\n\n if (status.hasUncommittedChanges) {\n message = `Warning: Worktree '${name}' had uncommitted changes (${status.changedFiles} files)\\n${message}`;\n }\n\n return ok({\n message,\n hasUncommittedChanges: status.hasUncommittedChanges,\n changedFiles: status.hasUncommittedChanges\n ? status.changedFiles\n : undefined,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return err(new GitOperationError(\"worktree remove\", errorMessage));\n }\n}\n", "import { parseArgs } from \"node:util\";\nimport { getGitRoot } from \"../../core/git/libs/get-git-root.ts\";\nimport { execInWorktree as execInWorktreeCore } from \"../../core/process/exec.ts\";\nimport { isErr } from \"../../core/types/result.ts\";\nimport { WorktreeNotFoundError } from \"../../core/worktree/errors.ts\";\nimport { exitCodes, exitWithError } from \"../errors.ts\";\n\nexport async function execHandler(args: string[]): Promise<void> {\n const { positionals } = parseArgs({\n args,\n options: {},\n strict: true,\n allowPositionals: true,\n });\n\n if (positionals.length < 2) {\n exitWithError(\n \"Usage: phantom exec <worktree-name> <command> [args...]\",\n exitCodes.validationError,\n );\n }\n\n const [worktreeName, ...commandArgs] = positionals;\n\n try {\n const gitRoot = await getGitRoot();\n const result = await execInWorktreeCore(gitRoot, worktreeName, commandArgs);\n\n if (isErr(result)) {\n const exitCode =\n result.error instanceof WorktreeNotFoundError\n ? exitCodes.notFound\n : result.error.exitCode || exitCodes.generalError;\n exitWithError(result.error.message, exitCode);\n }\n\n process.exit(result.value.exitCode);\n } catch (error) {\n exitWithError(\n error instanceof Error ? error.message : String(error),\n exitCodes.generalError,\n );\n }\n}\n", "import { parseArgs } from \"node:util\";\nimport { getGitRoot } from \"../../core/git/libs/get-git-root.ts\";\nimport { isErr } from \"../../core/types/result.ts\";\nimport { listWorktrees as listWorktreesCore } from \"../../core/worktree/list.ts\";\nimport { exitCodes, exitWithError } from \"../errors.ts\";\nimport { output } from \"../output.ts\";\n\nexport async function listHandler(args: string[] = []): Promise<void> {\n parseArgs({\n args,\n options: {},\n strict: true,\n allowPositionals: false,\n });\n try {\n const gitRoot = await getGitRoot();\n const result = await listWorktreesCore(gitRoot);\n\n if (isErr(result)) {\n exitWithError(\"Failed to list worktrees\", exitCodes.generalError);\n }\n\n const { worktrees, message } = result.value;\n\n if (worktrees.length === 0) {\n output.log(message || \"No worktrees found.\");\n process.exit(exitCodes.success);\n }\n\n const maxNameLength = Math.max(...worktrees.map((wt) => wt.name.length));\n\n for (const worktree of worktrees) {\n const paddedName = worktree.name.padEnd(maxNameLength + 2);\n const branchInfo = worktree.branch ? `(${worktree.branch})` : \"\";\n const status = !worktree.isClean ? \" [dirty]\" : \"\";\n\n output.log(`${paddedName} ${branchInfo}${status}`);\n }\n\n process.exit(exitCodes.success);\n } catch (error) {\n exitWithError(\n error instanceof Error ? error.message : String(error),\n exitCodes.generalError,\n );\n }\n}\n", "import { executeGitCommandInDirectory } from \"../git/executor.ts\";\nimport { getWorktreePath } from \"../paths.ts\";\nimport { type Result, ok } from \"../types/result.ts\";\nimport {\n listValidWorktrees,\n validatePhantomDirectoryExists,\n} from \"./validate.ts\";\n\nexport interface WorktreeInfo {\n name: string;\n path: string;\n branch: string;\n isClean: boolean;\n}\n\nexport interface ListWorktreesSuccess {\n worktrees: WorktreeInfo[];\n message?: string;\n}\n\nexport async function getWorktreeBranch(worktreePath: string): Promise<string> {\n try {\n const { stdout } = await executeGitCommandInDirectory(worktreePath, [\n \"branch\",\n \"--show-current\",\n ]);\n return stdout || \"(detached HEAD)\";\n } catch {\n return \"unknown\";\n }\n}\n\nexport async function getWorktreeStatus(\n worktreePath: string,\n): Promise<boolean> {\n try {\n const { stdout } = await executeGitCommandInDirectory(worktreePath, [\n \"status\",\n \"--porcelain\",\n ]);\n return !stdout; // Clean if no output\n } catch {\n // If git status fails, assume clean\n return true;\n }\n}\n\nexport async function getWorktreeInfo(\n gitRoot: string,\n name: string,\n): Promise<WorktreeInfo> {\n const worktreePath = getWorktreePath(gitRoot, name);\n\n const [branch, isClean] = await Promise.all([\n getWorktreeBranch(worktreePath),\n getWorktreeStatus(worktreePath),\n ]);\n\n return {\n name,\n path: worktreePath,\n branch,\n isClean,\n };\n}\n\nexport async function listWorktrees(\n gitRoot: string,\n): Promise<Result<ListWorktreesSuccess, never>> {\n if (!(await validatePhantomDirectoryExists(gitRoot))) {\n return ok({\n worktrees: [],\n message: \"No worktrees found (worktrees directory doesn't exist)\",\n });\n }\n\n const worktreeNames = await listValidWorktrees(gitRoot);\n\n if (worktreeNames.length === 0) {\n return ok({\n worktrees: [],\n message: \"No worktrees found\",\n });\n }\n\n try {\n const worktrees = await Promise.all(\n worktreeNames.map((name) => getWorktreeInfo(gitRoot, name)),\n );\n\n return ok({\n worktrees,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to list worktrees: ${errorMessage}`);\n }\n}\n", "import { parseArgs } from \"node:util\";\nimport { getGitRoot } from \"../../core/git/libs/get-git-root.ts\";\nimport { shellInWorktree as shellInWorktreeCore } from \"../../core/process/shell.ts\";\nimport { isErr } from \"../../core/types/result.ts\";\nimport { WorktreeNotFoundError } from \"../../core/worktree/errors.ts\";\nimport { validateWorktreeExists } from \"../../core/worktree/validate.ts\";\nimport { exitCodes, exitWithError } from \"../errors.ts\";\nimport { output } from \"../output.ts\";\n\nexport async function shellHandler(args: string[]): Promise<void> {\n const { positionals } = parseArgs({\n args,\n options: {},\n strict: true,\n allowPositionals: true,\n });\n\n if (positionals.length === 0) {\n exitWithError(\n \"Usage: phantom shell <worktree-name>\",\n exitCodes.validationError,\n );\n }\n\n const worktreeName = positionals[0];\n\n try {\n const gitRoot = await getGitRoot();\n\n // Get worktree path for display\n const validation = await validateWorktreeExists(gitRoot, worktreeName);\n if (!validation.exists) {\n exitWithError(\n validation.message || `Worktree '${worktreeName}' not found`,\n exitCodes.generalError,\n );\n }\n\n output.log(`Entering worktree '${worktreeName}' at ${validation.path}`);\n output.log(\"Type 'exit' to return to your original directory\\n\");\n\n const result = await shellInWorktreeCore(gitRoot, worktreeName);\n\n if (isErr(result)) {\n const exitCode =\n result.error instanceof WorktreeNotFoundError\n ? exitCodes.notFound\n : result.error.exitCode || exitCodes.generalError;\n exitWithError(result.error.message, exitCode);\n }\n\n process.exit(result.value.exitCode);\n } catch (error) {\n exitWithError(\n error instanceof Error ? error.message : String(error),\n exitCodes.generalError,\n );\n }\n}\n", "import { parseArgs } from \"node:util\";\nimport { getVersion } from \"../../core/version.ts\";\nimport { exitWithSuccess } from \"../errors.ts\";\nimport { output } from \"../output.ts\";\n\nexport function versionHandler(args: string[] = []): void {\n parseArgs({\n args,\n options: {},\n strict: true,\n allowPositionals: false,\n });\n const version = getVersion();\n output.log(`Phantom v${version}`);\n exitWithSuccess();\n}\n", "{\n \"name\": \"@aku11i/phantom\",\n \"packageManager\": \"pnpm@10.8.1\",\n \"version\": \"0.4.0\",\n \"description\": \"A powerful CLI tool for managing Git worktrees for parallel development\",\n \"keywords\": [\n \"git\",\n \"worktree\",\n \"cli\",\n \"phantom\",\n \"workspace\",\n \"development\",\n \"parallel\"\n ],\n \"homepage\": \"https://github.com/aku11i/phantom#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/aku11i/phantom/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/aku11i/phantom.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"aku11i\",\n \"type\": \"module\",\n \"bin\": {\n \"phantom\": \"./dist/phantom.js\"\n },\n \"scripts\": {\n \"start\": \"node ./src/bin/phantom.ts\",\n \"phantom\": \"node ./src/bin/phantom.ts\",\n \"build\": \"node build.ts\",\n \"type-check\": \"tsgo --noEmit\",\n \"test\": \"node --test --experimental-strip-types --experimental-test-module-mocks src/**/*.test.ts\",\n \"lint\": \"biome check .\",\n \"fix\": \"biome check --write .\",\n \"ready\": \"pnpm fix && pnpm type-check && pnpm test\",\n \"ready:check\": \"pnpm lint && pnpm type-check && pnpm test\",\n \"prepublishOnly\": \"pnpm ready:check && pnpm build\"\n },\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"files\": [\n \"dist/\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"devDependencies\": {\n \"@biomejs/biome\": \"^1.9.4\",\n \"@types/node\": \"^22.15.29\",\n \"@typescript/native-preview\": \"7.0.0-dev.20250602.1\",\n \"esbuild\": \"^0.25.5\",\n \"typescript\": \"^5.8.3\"\n }\n}\n", "import packageJson from \"../../package.json\" with { type: \"json\" };\n\nexport function getVersion(): string {\n return packageJson.version;\n}\n", "import { parseArgs } from \"node:util\";\nimport { getGitRoot } from \"../../core/git/libs/get-git-root.ts\";\nimport { isErr } from \"../../core/types/result.ts\";\nimport { whereWorktree as whereWorktreeCore } from \"../../core/worktree/where.ts\";\nimport { exitCodes, exitWithError, exitWithSuccess } from \"../errors.ts\";\nimport { output } from \"../output.ts\";\n\nexport async function whereHandler(args: string[]): Promise<void> {\n const { positionals } = parseArgs({\n args,\n options: {},\n strict: true,\n allowPositionals: true,\n });\n\n if (positionals.length === 0) {\n exitWithError(\"Please provide a worktree name\", exitCodes.validationError);\n }\n\n const worktreeName = positionals[0];\n\n try {\n const gitRoot = await getGitRoot();\n const result = await whereWorktreeCore(gitRoot, worktreeName);\n\n if (isErr(result)) {\n exitWithError(result.error.message, exitCodes.notFound);\n }\n\n output.log(result.value.path);\n exitWithSuccess();\n } catch (error) {\n exitWithError(\n error instanceof Error ? error.message : String(error),\n exitCodes.generalError,\n );\n }\n}\n", "import { type Result, err, ok } from \"../types/result.ts\";\nimport { WorktreeNotFoundError } from \"./errors.ts\";\nimport { validateWorktreeExists } from \"./validate.ts\";\n\nexport interface WhereWorktreeSuccess {\n path: string;\n}\n\nexport async function whereWorktree(\n gitRoot: string,\n name: string,\n): Promise<Result<WhereWorktreeSuccess, WorktreeNotFoundError>> {\n const validation = await validateWorktreeExists(gitRoot, name);\n\n if (!validation.exists) {\n return err(new WorktreeNotFoundError(name));\n }\n\n return ok({\n path: validation.path as string,\n });\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["args", "command", "command", "args", "command", "args", "fs", "fs", "args", "parseArgs", "args", "parseArgs", "parseArgs", "args", "parseArgs", "parseArgs", "getWorktreeStatus", "args", "parseArgs", "parseArgs", "args", "parseArgs", "parseArgs", "args", "parseArgs", "parseArgs", "args", "parseArgs", "commands", "args", "command", "remainingArgs"]
|
|
3
|
+
"sources": ["../src/bin/phantom.ts", "../src/cli/handlers/attach.ts", "../src/core/git/libs/get-git-root.ts", "../src/core/git/executor.ts", "../src/core/types/result.ts", "../src/core/worktree/errors.ts", "../src/core/worktree/validate.ts", "../src/core/paths.ts", "../src/core/process/spawn.ts", "../src/core/process/errors.ts", "../src/core/process/exec.ts", "../src/core/process/shell.ts", "../src/core/worktree/attach.ts", "../src/core/git/libs/attach-worktree.ts", "../src/core/git/libs/branch-exists.ts", "../src/cli/output.ts", "../src/cli/errors.ts", "../src/cli/handlers/create.ts", "../src/core/config/loader.ts", "../src/core/utils/type-guards.ts", "../src/core/config/validate.ts", "../src/core/process/tmux.ts", "../src/core/worktree/create.ts", "../src/core/git/libs/add-worktree.ts", "../src/core/worktree/file-copier.ts", "../src/cli/handlers/delete.ts", "../src/core/git/libs/list-worktrees.ts", "../src/core/git/libs/get-current-worktree.ts", "../src/core/worktree/delete.ts", "../src/cli/handlers/exec.ts", "../src/cli/handlers/list.ts", "../src/core/worktree/list.ts", "../src/cli/handlers/shell.ts", "../src/cli/handlers/version.ts", "../package.json", "../src/core/version.ts", "../src/cli/handlers/where.ts", "../src/core/worktree/where.ts"],
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\n\nimport { argv, exit } from \"node:process\";\nimport { attachHandler } from \"../cli/handlers/attach.ts\";\nimport { createHandler } from \"../cli/handlers/create.ts\";\nimport { deleteHandler } from \"../cli/handlers/delete.ts\";\nimport { execHandler } from \"../cli/handlers/exec.ts\";\nimport { listHandler } from \"../cli/handlers/list.ts\";\nimport { shellHandler } from \"../cli/handlers/shell.ts\";\nimport { versionHandler } from \"../cli/handlers/version.ts\";\nimport { whereHandler } from \"../cli/handlers/where.ts\";\n\ninterface Command {\n name: string;\n description: string;\n subcommands?: Command[];\n handler?: (args: string[]) => void | Promise<void>;\n}\n\nconst commands: Command[] = [\n {\n name: \"create\",\n description:\n \"Create a new worktree [--shell | --exec <command> | --tmux | --tmux-vertical | --tmux-horizontal] [--copy-file <file>]...\",\n handler: createHandler,\n },\n {\n name: \"attach\",\n description: \"Attach to an existing branch [--shell | --exec <command>]\",\n handler: attachHandler,\n },\n {\n name: \"list\",\n description: \"List all worktrees\",\n handler: listHandler,\n },\n {\n name: \"where\",\n description: \"Output the path of a specific worktree\",\n handler: whereHandler,\n },\n {\n name: \"delete\",\n description: \"Delete a worktree (use --force for uncommitted changes)\",\n handler: deleteHandler,\n },\n {\n name: \"exec\",\n description: \"Execute a command in a worktree directory\",\n handler: execHandler,\n },\n {\n name: \"shell\",\n description: \"Open interactive shell in a worktree directory\",\n handler: shellHandler,\n },\n {\n name: \"version\",\n description: \"Display phantom version\",\n handler: versionHandler,\n },\n];\n\nfunction printHelp(commands: Command[]) {\n console.log(\"Usage: phantom <command> [options]\\n\");\n console.log(\"Commands:\");\n for (const cmd of commands) {\n console.log(` ${cmd.name.padEnd(12)} ${cmd.description}`);\n }\n}\n\nfunction findCommand(\n args: string[],\n commands: Command[],\n): { command: Command | null; remainingArgs: string[] } {\n if (args.length === 0) {\n return { command: null, remainingArgs: [] };\n }\n\n const [cmdName, ...rest] = args;\n const command = commands.find((cmd) => cmd.name === cmdName);\n\n if (!command) {\n return { command: null, remainingArgs: args };\n }\n\n if (command.subcommands && rest.length > 0) {\n const { command: subcommand, remainingArgs } = findCommand(\n rest,\n command.subcommands,\n );\n if (subcommand) {\n return { command: subcommand, remainingArgs };\n }\n }\n\n return { command, remainingArgs: rest };\n}\n\nconst args = argv.slice(2);\n\nif (args.length === 0 || args[0] === \"-h\" || args[0] === \"--help\") {\n printHelp(commands);\n exit(0);\n}\n\nif (args[0] === \"--version\" || args[0] === \"-v\") {\n versionHandler();\n exit(0);\n}\n\nconst { command, remainingArgs } = findCommand(args, commands);\n\nif (!command || !command.handler) {\n console.error(`Error: Unknown command '${args.join(\" \")}'\\n`);\n printHelp(commands);\n exit(1);\n}\n\ntry {\n await command.handler(remainingArgs);\n} catch (error) {\n console.error(\n \"Error:\",\n error instanceof Error ? error.message : String(error),\n );\n exit(1);\n}\n", "import { parseArgs } from \"node:util\";\nimport { getGitRoot } from \"../../core/git/libs/get-git-root.ts\";\nimport { execInWorktree } from \"../../core/process/exec.ts\";\nimport { shellInWorktree } from \"../../core/process/shell.ts\";\nimport { isErr } from \"../../core/types/result.ts\";\nimport { attachWorktreeCore } from \"../../core/worktree/attach.ts\";\nimport {\n BranchNotFoundError,\n WorktreeAlreadyExistsError,\n} from \"../../core/worktree/errors.ts\";\nimport { exitCodes, exitWithError } from \"../errors.ts\";\nimport { output } from \"../output.ts\";\n\nexport async function attachHandler(args: string[]): Promise<void> {\n const { positionals, values } = parseArgs({\n args,\n strict: true,\n allowPositionals: true,\n options: {\n shell: {\n type: \"boolean\",\n short: \"s\",\n },\n exec: {\n type: \"string\",\n short: \"e\",\n },\n },\n });\n\n if (positionals.length === 0) {\n exitWithError(\n \"Missing required argument: branch name\",\n exitCodes.validationError,\n );\n }\n\n const [branchName] = positionals;\n\n if (values.shell && values.exec) {\n exitWithError(\n \"Cannot use both --shell and --exec options\",\n exitCodes.validationError,\n );\n }\n\n const gitRoot = await getGitRoot();\n const result = await attachWorktreeCore(gitRoot, branchName);\n\n if (isErr(result)) {\n const error = result.error;\n if (error instanceof WorktreeAlreadyExistsError) {\n exitWithError(error.message, exitCodes.validationError);\n }\n if (error instanceof BranchNotFoundError) {\n exitWithError(error.message, exitCodes.notFound);\n }\n exitWithError(error.message, exitCodes.generalError);\n }\n\n const worktreePath = result.value;\n output.log(`Attached phantom: ${branchName}`);\n\n if (values.shell) {\n const shellResult = await shellInWorktree(gitRoot, branchName);\n if (isErr(shellResult)) {\n exitWithError(shellResult.error.message, exitCodes.generalError);\n }\n } else if (values.exec) {\n const execResult = await execInWorktree(\n gitRoot,\n branchName,\n values.exec.split(\" \"),\n );\n if (isErr(execResult)) {\n exitWithError(execResult.error.message, exitCodes.generalError);\n }\n }\n}\n", "import { dirname, resolve } from \"node:path\";\nimport { executeGitCommand } from \"../executor.ts\";\n\nexport async function getGitRoot(): Promise<string> {\n const { stdout } = await executeGitCommand([\"rev-parse\", \"--git-common-dir\"]);\n\n if (stdout.endsWith(\"/.git\") || stdout === \".git\") {\n return resolve(process.cwd(), dirname(stdout));\n }\n\n const { stdout: toplevel } = await executeGitCommand([\n \"rev-parse\",\n \"--show-toplevel\",\n ]);\n return toplevel;\n}\n", "import { execFile as execFileCallback } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execFile = promisify(execFileCallback);\n\nexport interface GitExecutorOptions {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n}\n\nexport interface GitExecutorResult {\n stdout: string;\n stderr: string;\n}\n\n/**\n * Execute a git command with consistent error handling\n */\nexport async function executeGitCommand(\n args: string[],\n options: GitExecutorOptions = {},\n): Promise<GitExecutorResult> {\n try {\n const result = await execFile(\"git\", args, {\n cwd: options.cwd,\n env: options.env || process.env,\n encoding: \"utf8\",\n });\n\n return {\n stdout: result.stdout.trim(),\n stderr: result.stderr.trim(),\n };\n } catch (error) {\n // Git commands often return non-zero exit codes for normal operations\n // (e.g., `git diff` returns 1 when there are differences)\n // So we need to handle errors carefully\n if (\n error &&\n typeof error === \"object\" &&\n \"stdout\" in error &&\n \"stderr\" in error\n ) {\n const execError = error as {\n stdout: string;\n stderr: string;\n code?: number;\n };\n\n // If we have stderr content, it's likely a real error\n if (execError.stderr?.trim()) {\n throw new Error(execError.stderr.trim());\n }\n\n // Otherwise, return the output even though the exit code was non-zero\n return {\n stdout: execError.stdout?.trim() || \"\",\n stderr: execError.stderr?.trim() || \"\",\n };\n }\n\n throw error;\n }\n}\n\n/**\n * Execute a git command in a specific directory\n */\nexport async function executeGitCommandInDirectory(\n directory: string,\n args: string[],\n): Promise<GitExecutorResult> {\n return executeGitCommand([\"-C\", directory, ...args], {});\n}\n", "/**\n * Represents a value that is either successful (Ok) or contains an error (Err).\n * This type is inspired by Rust's Result type and provides type-safe error handling.\n *\n * @template T - The type of the success value\n * @template E - The type of the error value (defaults to Error)\n */\nexport type Result<T, E = Error> =\n | { ok: true; value: T }\n | { ok: false; error: E };\n\n/**\n * Creates a successful Result containing the given value.\n *\n * @template T - The type of the success value\n * @param value - The success value to wrap\n * @returns A Result in the Ok state containing the value\n *\n * @example\n * const result = ok(42);\n * // result: Result<number, never> = { ok: true, value: 42 }\n */\nexport const ok = <T>(value: T): Result<T, never> => ({\n ok: true,\n value,\n});\n\n/**\n * Creates a failed Result containing the given error.\n *\n * @template E - The type of the error value\n * @param error - The error value to wrap\n * @returns A Result in the Err state containing the error\n *\n * @example\n * const result = err(new Error(\"Something went wrong\"));\n * // result: Result<never, Error> = { ok: false, error: Error(...) }\n */\nexport const err = <E>(error: E): Result<never, E> => ({\n ok: false,\n error,\n});\n\n/**\n * Type guard that checks if a Result is in the Ok state.\n *\n * @template T - The type of the success value\n * @template E - The type of the error value\n * @param result - The Result to check\n * @returns True if the Result is Ok, false otherwise\n *\n * @example\n * if (isOk(result)) {\n * console.log(result.value); // TypeScript knows result.value exists\n * }\n */\nexport const isOk = <T, E>(\n result: Result<T, E>,\n): result is { ok: true; value: T } => result.ok;\n\n/**\n * Type guard that checks if a Result is in the Err state.\n *\n * @template T - The type of the success value\n * @template E - The type of the error value\n * @param result - The Result to check\n * @returns True if the Result is Err, false otherwise\n *\n * @example\n * if (isErr(result)) {\n * console.error(result.error); // TypeScript knows result.error exists\n * }\n */\nexport const isErr = <T, E>(\n result: Result<T, E>,\n): result is { ok: false; error: E } => !result.ok;\n", "export class WorktreeError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"WorktreeError\";\n }\n}\n\nexport class WorktreeNotFoundError extends WorktreeError {\n constructor(name: string) {\n super(`Worktree '${name}' not found`);\n this.name = \"WorktreeNotFoundError\";\n }\n}\n\nexport class WorktreeAlreadyExistsError extends WorktreeError {\n constructor(name: string) {\n super(`Worktree '${name}' already exists`);\n this.name = \"WorktreeAlreadyExistsError\";\n }\n}\n\nexport class InvalidWorktreeNameError extends WorktreeError {\n constructor(name: string) {\n super(`Invalid worktree name: '${name}'`);\n this.name = \"InvalidWorktreeNameError\";\n }\n}\n\nexport class GitOperationError extends WorktreeError {\n constructor(operation: string, details: string) {\n super(`Git ${operation} failed: ${details}`);\n this.name = \"GitOperationError\";\n }\n}\n\nexport class BranchNotFoundError extends WorktreeError {\n constructor(branchName: string) {\n super(`Branch '${branchName}' not found`);\n this.name = \"BranchNotFoundError\";\n }\n}\n", "import fs from \"node:fs/promises\";\nimport { getPhantomDirectory, getWorktreePath } from \"../paths.ts\";\nimport { type Result, err, ok } from \"../types/result.ts\";\n\nexport interface ValidationResult {\n exists: boolean;\n path?: string;\n message?: string;\n}\n\nexport async function validateWorktreeExists(\n gitRoot: string,\n name: string,\n): Promise<ValidationResult> {\n const worktreePath = getWorktreePath(gitRoot, name);\n\n try {\n await fs.access(worktreePath);\n return {\n exists: true,\n path: worktreePath,\n };\n } catch {\n return {\n exists: false,\n message: `Worktree '${name}' does not exist`,\n };\n }\n}\n\nexport async function validateWorktreeDoesNotExist(\n gitRoot: string,\n name: string,\n): Promise<ValidationResult> {\n const worktreePath = getWorktreePath(gitRoot, name);\n\n try {\n await fs.access(worktreePath);\n return {\n exists: true,\n message: `Worktree '${name}' already exists`,\n };\n } catch {\n return {\n exists: false,\n path: worktreePath,\n };\n }\n}\n\nexport async function validatePhantomDirectoryExists(\n gitRoot: string,\n): Promise<boolean> {\n const phantomDir = getPhantomDirectory(gitRoot);\n\n try {\n await fs.access(phantomDir);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function validateWorktreeName(name: string): Result<void, Error> {\n if (!name || name.trim() === \"\") {\n return err(new Error(\"Phantom name cannot be empty\"));\n }\n\n if (name.includes(\"/\")) {\n return err(new Error(\"Phantom name cannot contain slashes\"));\n }\n\n if (name.startsWith(\".\")) {\n return err(new Error(\"Phantom name cannot start with a dot\"));\n }\n\n return ok(undefined);\n}\n", "import { join } from \"node:path\";\n\nexport function getPhantomDirectory(gitRoot: string): string {\n return join(gitRoot, \".git\", \"phantom\", \"worktrees\");\n}\n\nexport function getWorktreePath(gitRoot: string, name: string): string {\n return join(getPhantomDirectory(gitRoot), name);\n}\n", "import {\n type ChildProcess,\n type SpawnOptions,\n spawn as nodeSpawn,\n} from \"node:child_process\";\nimport { type Result, err, ok } from \"../types/result.ts\";\nimport {\n type ProcessError,\n ProcessExecutionError,\n ProcessSignalError,\n ProcessSpawnError,\n} from \"./errors.ts\";\n\nexport interface SpawnSuccess {\n exitCode: number;\n}\n\nexport interface SpawnConfig {\n command: string;\n args?: string[];\n options?: SpawnOptions;\n}\n\nexport async function spawnProcess(\n config: SpawnConfig,\n): Promise<Result<SpawnSuccess, ProcessError>> {\n return new Promise((resolve) => {\n const { command, args = [], options = {} } = config;\n\n const childProcess: ChildProcess = nodeSpawn(command, args, {\n stdio: \"inherit\",\n ...options,\n });\n\n childProcess.on(\"error\", (error) => {\n resolve(err(new ProcessSpawnError(command, error.message)));\n });\n\n childProcess.on(\"exit\", (code, signal) => {\n if (signal) {\n resolve(err(new ProcessSignalError(signal)));\n } else {\n const exitCode = code ?? 0;\n if (exitCode === 0) {\n resolve(ok({ exitCode }));\n } else {\n resolve(err(new ProcessExecutionError(command, exitCode)));\n }\n }\n });\n });\n}\n", "export class ProcessError extends Error {\n public readonly exitCode?: number;\n\n constructor(message: string, exitCode?: number) {\n super(message);\n this.name = \"ProcessError\";\n this.exitCode = exitCode;\n }\n}\n\nexport class ProcessExecutionError extends ProcessError {\n constructor(command: string, exitCode: number) {\n super(`Command '${command}' failed with exit code ${exitCode}`, exitCode);\n this.name = \"ProcessExecutionError\";\n }\n}\n\nexport class ProcessSignalError extends ProcessError {\n constructor(signal: string) {\n const exitCode = 128 + (signal === \"SIGTERM\" ? 15 : 1);\n super(`Command terminated by signal: ${signal}`, exitCode);\n this.name = \"ProcessSignalError\";\n }\n}\n\nexport class ProcessSpawnError extends ProcessError {\n constructor(command: string, details: string) {\n super(`Error executing command '${command}': ${details}`);\n this.name = \"ProcessSpawnError\";\n }\n}\n", "import { type Result, err } from \"../types/result.ts\";\nimport { WorktreeNotFoundError } from \"../worktree/errors.ts\";\nimport { validateWorktreeExists } from \"../worktree/validate.ts\";\nimport type { ProcessError } from \"./errors.ts\";\nimport { type SpawnSuccess, spawnProcess } from \"./spawn.ts\";\n\nexport type ExecInWorktreeSuccess = SpawnSuccess;\n\nexport async function execInWorktree(\n gitRoot: string,\n worktreeName: string,\n command: string[],\n): Promise<\n Result<ExecInWorktreeSuccess, WorktreeNotFoundError | ProcessError>\n> {\n const validation = await validateWorktreeExists(gitRoot, worktreeName);\n if (!validation.exists) {\n return err(new WorktreeNotFoundError(worktreeName));\n }\n\n const worktreePath = validation.path as string;\n const [cmd, ...args] = command;\n\n return spawnProcess({\n command: cmd,\n args,\n options: {\n cwd: worktreePath,\n },\n });\n}\n", "import { type Result, err } from \"../types/result.ts\";\nimport { WorktreeNotFoundError } from \"../worktree/errors.ts\";\nimport { validateWorktreeExists } from \"../worktree/validate.ts\";\nimport type { ProcessError } from \"./errors.ts\";\nimport { type SpawnSuccess, spawnProcess } from \"./spawn.ts\";\n\nexport type ShellInWorktreeSuccess = SpawnSuccess;\n\nexport async function shellInWorktree(\n gitRoot: string,\n worktreeName: string,\n): Promise<\n Result<ShellInWorktreeSuccess, WorktreeNotFoundError | ProcessError>\n> {\n const validation = await validateWorktreeExists(gitRoot, worktreeName);\n if (!validation.exists) {\n return err(new WorktreeNotFoundError(worktreeName));\n }\n\n const worktreePath = validation.path as string;\n const shell = process.env.SHELL || \"/bin/sh\";\n\n return spawnProcess({\n command: shell,\n args: [],\n options: {\n cwd: worktreePath,\n env: {\n ...process.env,\n PHANTOM: \"1\",\n PHANTOM_NAME: worktreeName,\n PHANTOM_PATH: worktreePath,\n },\n },\n });\n}\n", "import { existsSync } from \"node:fs\";\nimport { attachWorktree } from \"../git/libs/attach-worktree.ts\";\nimport { branchExists } from \"../git/libs/branch-exists.ts\";\nimport { getWorktreePath } from \"../paths.ts\";\nimport type { Result } from \"../types/result.ts\";\nimport { err, isErr, ok } from \"../types/result.ts\";\nimport { BranchNotFoundError, WorktreeAlreadyExistsError } from \"./errors.ts\";\nimport { validateWorktreeName } from \"./validate.ts\";\n\nexport async function attachWorktreeCore(\n gitRoot: string,\n name: string,\n): Promise<Result<string, Error>> {\n const validation = validateWorktreeName(name);\n if (isErr(validation)) {\n return validation;\n }\n\n const worktreePath = getWorktreePath(gitRoot, name);\n if (existsSync(worktreePath)) {\n return err(new WorktreeAlreadyExistsError(name));\n }\n\n const branchCheckResult = await branchExists(gitRoot, name);\n if (isErr(branchCheckResult)) {\n return err(branchCheckResult.error);\n }\n\n if (!branchCheckResult.value) {\n return err(new BranchNotFoundError(name));\n }\n\n const attachResult = await attachWorktree(gitRoot, worktreePath, name);\n if (isErr(attachResult)) {\n return err(attachResult.error);\n }\n\n return ok(worktreePath);\n}\n", "import type { Result } from \"../../types/result.ts\";\nimport { err, ok } from \"../../types/result.ts\";\nimport { executeGitCommand } from \"../executor.ts\";\n\nexport async function attachWorktree(\n gitRoot: string,\n worktreePath: string,\n branchName: string,\n): Promise<Result<void, Error>> {\n try {\n await executeGitCommand([\"worktree\", \"add\", worktreePath, branchName], {\n cwd: gitRoot,\n });\n return ok(undefined);\n } catch (error) {\n return err(\n error instanceof Error\n ? error\n : new Error(`Failed to attach worktree: ${String(error)}`),\n );\n }\n}\n", "import type { Result } from \"../../types/result.ts\";\nimport { err, isErr, ok } from \"../../types/result.ts\";\nimport { executeGitCommand } from \"../executor.ts\";\n\nexport async function branchExists(\n gitRoot: string,\n branchName: string,\n): Promise<Result<boolean, Error>> {\n try {\n await executeGitCommand(\n [\"show-ref\", \"--verify\", \"--quiet\", `refs/heads/${branchName}`],\n { cwd: gitRoot },\n );\n return ok(true);\n } catch (error) {\n if (error && typeof error === \"object\" && \"code\" in error) {\n const execError = error as { code?: number; message?: string };\n if (execError.code === 1) {\n return ok(false);\n }\n }\n return err(\n new Error(\n `Failed to check branch existence: ${\n error instanceof Error ? error.message : String(error)\n }`,\n ),\n );\n }\n}\n", "import type { ChildProcess } from \"node:child_process\";\n\nexport const output = {\n log: (message: string) => {\n console.log(message);\n },\n\n error: (message: string) => {\n console.error(message);\n },\n\n warn: (message: string) => {\n console.warn(message);\n },\n\n table: (data: unknown) => {\n console.table(data);\n },\n\n processOutput: (proc: ChildProcess) => {\n proc.stdout?.pipe(process.stdout);\n proc.stderr?.pipe(process.stderr);\n },\n};\n", "import { output } from \"./output.ts\";\n\nexport const exitCodes = {\n success: 0,\n generalError: 1,\n notFound: 2,\n validationError: 3,\n} as const;\n\nexport function handleError(\n error: unknown,\n exitCode: number = exitCodes.generalError,\n): never {\n if (error instanceof Error) {\n output.error(error.message);\n } else {\n output.error(String(error));\n }\n process.exit(exitCode);\n}\n\nexport function exitWithSuccess(): never {\n process.exit(exitCodes.success);\n}\n\nexport function exitWithError(\n message: string,\n exitCode: number = exitCodes.generalError,\n): never {\n output.error(message);\n process.exit(exitCode);\n}\n", "import { parseArgs } from \"node:util\";\nimport {\n ConfigNotFoundError,\n ConfigParseError,\n loadConfig,\n} from \"../../core/config/loader.ts\";\nimport { ConfigValidationError } from \"../../core/config/validate.ts\";\nimport { getGitRoot } from \"../../core/git/libs/get-git-root.ts\";\nimport { execInWorktree } from \"../../core/process/exec.ts\";\nimport { shellInWorktree } from \"../../core/process/shell.ts\";\nimport { executeTmuxCommand, isInsideTmux } from \"../../core/process/tmux.ts\";\nimport { isErr, isOk } from \"../../core/types/result.ts\";\nimport { createWorktree as createWorktreeCore } from \"../../core/worktree/create.ts\";\nimport { WorktreeAlreadyExistsError } from \"../../core/worktree/errors.ts\";\nimport { exitCodes, exitWithError, exitWithSuccess } from \"../errors.ts\";\nimport { output } from \"../output.ts\";\n\nexport async function createHandler(args: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args,\n options: {\n shell: {\n type: \"boolean\",\n short: \"s\",\n },\n exec: {\n type: \"string\",\n short: \"x\",\n },\n tmux: {\n type: \"boolean\",\n short: \"t\",\n },\n \"tmux-vertical\": {\n type: \"boolean\",\n },\n \"tmux-v\": {\n type: \"boolean\",\n },\n \"tmux-horizontal\": {\n type: \"boolean\",\n },\n \"tmux-h\": {\n type: \"boolean\",\n },\n \"copy-file\": {\n type: \"string\",\n multiple: true,\n },\n },\n strict: true,\n allowPositionals: true,\n });\n\n if (positionals.length === 0) {\n exitWithError(\n \"Please provide a name for the new worktree\",\n exitCodes.validationError,\n );\n }\n\n const worktreeName = positionals[0];\n const openShell = values.shell ?? false;\n const execCommand = values.exec;\n const copyFileOptions = values[\"copy-file\"];\n\n // Determine tmux option\n const tmuxOption =\n values.tmux ||\n values[\"tmux-vertical\"] ||\n values[\"tmux-v\"] ||\n values[\"tmux-horizontal\"] ||\n values[\"tmux-h\"];\n\n let tmuxDirection: \"new\" | \"vertical\" | \"horizontal\" | undefined;\n if (values.tmux) {\n tmuxDirection = \"new\";\n } else if (values[\"tmux-vertical\"] || values[\"tmux-v\"]) {\n tmuxDirection = \"vertical\";\n } else if (values[\"tmux-horizontal\"] || values[\"tmux-h\"]) {\n tmuxDirection = \"horizontal\";\n }\n\n if (\n [openShell, execCommand !== undefined, tmuxOption].filter(Boolean).length >\n 1\n ) {\n exitWithError(\n \"Cannot use --shell, --exec, and --tmux options together\",\n exitCodes.validationError,\n );\n }\n\n if (tmuxOption && !(await isInsideTmux())) {\n exitWithError(\n \"The --tmux option can only be used inside a tmux session\",\n exitCodes.validationError,\n );\n }\n\n try {\n const gitRoot = await getGitRoot();\n\n let filesToCopy: string[] = [];\n\n // Load files from config\n const configResult = await loadConfig(gitRoot);\n if (isOk(configResult)) {\n if (configResult.value.postCreate?.copyFiles) {\n filesToCopy = [...configResult.value.postCreate.copyFiles];\n }\n } else {\n // Display warning for validation and parse errors\n if (configResult.error instanceof ConfigValidationError) {\n output.warn(`Configuration warning: ${configResult.error.message}`);\n } else if (configResult.error instanceof ConfigParseError) {\n output.warn(`Configuration warning: ${configResult.error.message}`);\n }\n // ConfigNotFoundError remains silent as the config file is optional\n }\n\n // Add files from CLI options\n if (copyFileOptions && copyFileOptions.length > 0) {\n const cliFiles = Array.isArray(copyFileOptions)\n ? copyFileOptions\n : [copyFileOptions];\n // Merge with config files, removing duplicates\n filesToCopy = [...new Set([...filesToCopy, ...cliFiles])];\n }\n\n const result = await createWorktreeCore(gitRoot, worktreeName, {\n copyFiles: filesToCopy.length > 0 ? filesToCopy : undefined,\n });\n\n if (isErr(result)) {\n const exitCode =\n result.error instanceof WorktreeAlreadyExistsError\n ? exitCodes.validationError\n : exitCodes.generalError;\n exitWithError(result.error.message, exitCode);\n }\n\n output.log(result.value.message);\n\n if (result.value.copyError) {\n output.error(\n `\\nWarning: Failed to copy some files: ${result.value.copyError}`,\n );\n }\n\n if (execCommand && isOk(result)) {\n output.log(\n `\\nExecuting command in worktree '${worktreeName}': ${execCommand}`,\n );\n\n const shell = process.env.SHELL || \"/bin/sh\";\n const execResult = await execInWorktree(gitRoot, worktreeName, [\n shell,\n \"-c\",\n execCommand,\n ]);\n\n if (isErr(execResult)) {\n output.error(execResult.error.message);\n const exitCode =\n \"exitCode\" in execResult.error\n ? (execResult.error.exitCode ?? exitCodes.generalError)\n : exitCodes.generalError;\n exitWithError(\"\", exitCode);\n }\n\n process.exit(execResult.value.exitCode ?? 0);\n }\n\n if (openShell && isOk(result)) {\n output.log(\n `\\nEntering worktree '${worktreeName}' at ${result.value.path}`,\n );\n output.log(\"Type 'exit' to return to your original directory\\n\");\n\n const shellResult = await shellInWorktree(gitRoot, worktreeName);\n\n if (isErr(shellResult)) {\n output.error(shellResult.error.message);\n const exitCode =\n \"exitCode\" in shellResult.error\n ? (shellResult.error.exitCode ?? exitCodes.generalError)\n : exitCodes.generalError;\n exitWithError(\"\", exitCode);\n }\n\n process.exit(shellResult.value.exitCode ?? 0);\n }\n\n if (tmuxDirection && isOk(result)) {\n output.log(\n `\\nOpening worktree '${worktreeName}' in tmux ${tmuxDirection === \"new\" ? \"window\" : \"pane\"}...`,\n );\n\n const shell = process.env.SHELL || \"/bin/sh\";\n\n const tmuxResult = await executeTmuxCommand({\n direction: tmuxDirection,\n command: shell,\n cwd: result.value.path,\n env: {\n PHANTOM: \"1\",\n PHANTOM_NAME: worktreeName,\n PHANTOM_PATH: result.value.path,\n },\n });\n\n if (isErr(tmuxResult)) {\n output.error(tmuxResult.error.message);\n const exitCode =\n \"exitCode\" in tmuxResult.error\n ? (tmuxResult.error.exitCode ?? exitCodes.generalError)\n : exitCodes.generalError;\n exitWithError(\"\", exitCode);\n }\n }\n\n exitWithSuccess();\n } catch (error) {\n exitWithError(\n error instanceof Error ? error.message : String(error),\n exitCodes.generalError,\n );\n }\n}\n", "import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { type Result, err, ok } from \"../types/result.ts\";\nimport { type ConfigValidationError, validateConfig } from \"./validate.ts\";\n\nexport interface PhantomConfig {\n postCreate?: {\n copyFiles?: string[];\n };\n}\n\nexport class ConfigNotFoundError extends Error {\n constructor() {\n super(\"phantom.config.json not found\");\n this.name = \"ConfigNotFoundError\";\n }\n}\n\nexport class ConfigParseError extends Error {\n constructor(message: string) {\n super(`Failed to parse phantom.config.json: ${message}`);\n this.name = \"ConfigParseError\";\n }\n}\n\nexport async function loadConfig(\n gitRoot: string,\n): Promise<\n Result<\n PhantomConfig,\n ConfigNotFoundError | ConfigParseError | ConfigValidationError\n >\n> {\n const configPath = path.join(gitRoot, \"phantom.config.json\");\n\n try {\n const content = await fs.readFile(configPath, \"utf-8\");\n try {\n const parsed = JSON.parse(content);\n const validationResult = validateConfig(parsed);\n\n if (!validationResult.ok) {\n return err(validationResult.error);\n }\n\n return ok(validationResult.value);\n } catch (error) {\n return err(\n new ConfigParseError(\n error instanceof Error ? error.message : String(error),\n ),\n );\n }\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return err(new ConfigNotFoundError());\n }\n throw error;\n }\n}\n", "export function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n", "import { type Result, err, ok } from \"../types/result.ts\";\nimport { isObject } from \"../utils/type-guards.ts\";\nimport type { PhantomConfig } from \"./loader.ts\";\n\nexport class ConfigValidationError extends Error {\n constructor(message: string) {\n super(`Invalid phantom.config.json: ${message}`);\n this.name = \"ConfigValidationError\";\n }\n}\n\nexport function validateConfig(\n config: unknown,\n): Result<PhantomConfig, ConfigValidationError> {\n if (!isObject(config)) {\n return err(new ConfigValidationError(\"Configuration must be an object\"));\n }\n\n const cfg = config;\n\n if (cfg.postCreate !== undefined) {\n if (!isObject(cfg.postCreate)) {\n return err(new ConfigValidationError(\"postCreate must be an object\"));\n }\n\n const postCreate = cfg.postCreate;\n if (postCreate.copyFiles !== undefined) {\n if (!Array.isArray(postCreate.copyFiles)) {\n return err(\n new ConfigValidationError(\"postCreate.copyFiles must be an array\"),\n );\n }\n\n if (!postCreate.copyFiles.every((f: unknown) => typeof f === \"string\")) {\n return err(\n new ConfigValidationError(\n \"postCreate.copyFiles must contain only strings\",\n ),\n );\n }\n }\n }\n\n return ok(config as PhantomConfig);\n}\n", "import type { Result } from \"../types/result.ts\";\nimport type { ProcessError } from \"./errors.ts\";\nimport { type SpawnSuccess, spawnProcess } from \"./spawn.ts\";\n\nexport type TmuxSplitDirection = \"new\" | \"vertical\" | \"horizontal\";\n\nexport interface TmuxOptions {\n direction: TmuxSplitDirection;\n command: string;\n cwd?: string;\n env?: Record<string, string>;\n}\n\nexport type TmuxSuccess = SpawnSuccess;\n\nexport async function isInsideTmux(): Promise<boolean> {\n return process.env.TMUX !== undefined;\n}\n\nexport async function executeTmuxCommand(\n options: TmuxOptions,\n): Promise<Result<TmuxSuccess, ProcessError>> {\n const { direction, command, cwd, env } = options;\n\n const tmuxArgs: string[] = [];\n\n switch (direction) {\n case \"new\":\n tmuxArgs.push(\"new-window\");\n break;\n case \"vertical\":\n tmuxArgs.push(\"split-window\", \"-v\");\n break;\n case \"horizontal\":\n tmuxArgs.push(\"split-window\", \"-h\");\n break;\n }\n\n if (cwd) {\n tmuxArgs.push(\"-c\", cwd);\n }\n\n // Add environment variables safely\n if (env) {\n for (const [key, value] of Object.entries(env)) {\n tmuxArgs.push(\"-e\", `${key}=${value}`);\n }\n }\n\n tmuxArgs.push(command);\n\n const result = await spawnProcess({\n command: \"tmux\",\n args: tmuxArgs,\n });\n\n return result;\n}\n", "import fs from \"node:fs/promises\";\nimport { addWorktree } from \"../git/libs/add-worktree.ts\";\nimport { getPhantomDirectory, getWorktreePath } from \"../paths.ts\";\nimport { type Result, err, isErr, isOk, ok } from \"../types/result.ts\";\nimport { GitOperationError, WorktreeAlreadyExistsError } from \"./errors.ts\";\nimport { copyFiles } from \"./file-copier.ts\";\nimport {\n validateWorktreeDoesNotExist,\n validateWorktreeName,\n} from \"./validate.ts\";\n\nexport interface CreateWorktreeOptions {\n branch?: string;\n commitish?: string;\n copyFiles?: string[];\n}\n\nexport interface CreateWorktreeSuccess {\n message: string;\n path: string;\n copiedFiles?: string[];\n skippedFiles?: string[];\n copyError?: string;\n}\n\nexport async function createWorktree(\n gitRoot: string,\n name: string,\n options: CreateWorktreeOptions = {},\n): Promise<\n Result<CreateWorktreeSuccess, WorktreeAlreadyExistsError | GitOperationError>\n> {\n const nameValidation = validateWorktreeName(name);\n if (isErr(nameValidation)) {\n return nameValidation;\n }\n\n const { branch = name, commitish = \"HEAD\" } = options;\n\n const worktreesPath = getPhantomDirectory(gitRoot);\n const worktreePath = getWorktreePath(gitRoot, name);\n\n try {\n await fs.access(worktreesPath);\n } catch {\n await fs.mkdir(worktreesPath, { recursive: true });\n }\n\n const validation = await validateWorktreeDoesNotExist(gitRoot, name);\n if (validation.exists) {\n return err(new WorktreeAlreadyExistsError(name));\n }\n\n try {\n await addWorktree({\n path: worktreePath,\n branch,\n commitish,\n });\n\n let copiedFiles: string[] | undefined;\n let skippedFiles: string[] | undefined;\n let copyError: string | undefined;\n\n if (options.copyFiles && options.copyFiles.length > 0) {\n const copyResult = await copyFiles(\n gitRoot,\n worktreePath,\n options.copyFiles,\n );\n\n if (isOk(copyResult)) {\n copiedFiles = copyResult.value.copiedFiles;\n skippedFiles = copyResult.value.skippedFiles;\n } else {\n copyError = copyResult.error.message;\n }\n }\n\n return ok({\n message: `Created worktree '${name}' at ${worktreePath}`,\n path: worktreePath,\n copiedFiles,\n skippedFiles,\n copyError,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return err(new GitOperationError(\"worktree add\", errorMessage));\n }\n}\n", "import { executeGitCommand } from \"../executor.ts\";\n\nexport interface AddWorktreeOptions {\n path: string;\n branch: string;\n commitish?: string;\n}\n\nexport async function addWorktree(options: AddWorktreeOptions): Promise<void> {\n const { path, branch, commitish = \"HEAD\" } = options;\n\n await executeGitCommand([\"worktree\", \"add\", path, \"-b\", branch, commitish]);\n}\n", "import { copyFile, mkdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { type Result, err, ok } from \"../types/result.ts\";\n\nexport interface CopyFileResult {\n copiedFiles: string[];\n skippedFiles: string[];\n}\n\nexport class FileCopyError extends Error {\n public readonly file: string;\n\n constructor(file: string, message: string) {\n super(`Failed to copy ${file}: ${message}`);\n this.name = \"FileCopyError\";\n this.file = file;\n }\n}\n\nexport async function copyFiles(\n sourceDir: string,\n targetDir: string,\n files: string[],\n): Promise<Result<CopyFileResult, FileCopyError>> {\n const copiedFiles: string[] = [];\n const skippedFiles: string[] = [];\n\n for (const file of files) {\n const sourcePath = path.join(sourceDir, file);\n const targetPath = path.join(targetDir, file);\n\n try {\n const stats = await stat(sourcePath);\n if (!stats.isFile()) {\n skippedFiles.push(file);\n continue;\n }\n\n const targetDirPath = path.dirname(targetPath);\n await mkdir(targetDirPath, { recursive: true });\n\n await copyFile(sourcePath, targetPath);\n copiedFiles.push(file);\n } catch (error) {\n if (\n error instanceof Error &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n skippedFiles.push(file);\n } else {\n return err(\n new FileCopyError(\n file,\n error instanceof Error ? error.message : String(error),\n ),\n );\n }\n }\n }\n\n return ok({ copiedFiles, skippedFiles });\n}\n", "import { parseArgs } from \"node:util\";\nimport { getCurrentWorktree } from \"../../core/git/libs/get-current-worktree.ts\";\nimport { getGitRoot } from \"../../core/git/libs/get-git-root.ts\";\nimport { isErr } from \"../../core/types/result.ts\";\nimport { deleteWorktree as deleteWorktreeCore } from \"../../core/worktree/delete.ts\";\nimport {\n WorktreeError,\n WorktreeNotFoundError,\n} from \"../../core/worktree/errors.ts\";\nimport { exitCodes, exitWithError, exitWithSuccess } from \"../errors.ts\";\nimport { output } from \"../output.ts\";\n\nexport async function deleteHandler(args: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args,\n options: {\n force: {\n type: \"boolean\",\n short: \"f\",\n },\n current: {\n type: \"boolean\",\n },\n },\n strict: true,\n allowPositionals: true,\n });\n\n const deleteCurrent = values.current ?? false;\n\n if (positionals.length === 0 && !deleteCurrent) {\n exitWithError(\n \"Please provide a worktree name to delete or use --current to delete the current worktree\",\n exitCodes.validationError,\n );\n }\n\n if (positionals.length > 0 && deleteCurrent) {\n exitWithError(\n \"Cannot specify both a worktree name and --current option\",\n exitCodes.validationError,\n );\n }\n\n const forceDelete = values.force ?? false;\n\n try {\n const gitRoot = await getGitRoot();\n\n let worktreeName: string;\n if (deleteCurrent) {\n const currentWorktree = await getCurrentWorktree(gitRoot);\n if (!currentWorktree) {\n exitWithError(\n \"Not in a worktree directory. The --current option can only be used from within a worktree.\",\n exitCodes.validationError,\n );\n }\n worktreeName = currentWorktree;\n } else {\n worktreeName = positionals[0];\n }\n\n const result = await deleteWorktreeCore(gitRoot, worktreeName, {\n force: forceDelete,\n });\n\n if (isErr(result)) {\n const exitCode =\n result.error instanceof WorktreeNotFoundError\n ? exitCodes.validationError\n : result.error instanceof WorktreeError &&\n result.error.message.includes(\"uncommitted changes\")\n ? exitCodes.validationError\n : exitCodes.generalError;\n exitWithError(result.error.message, exitCode);\n }\n\n output.log(result.value.message);\n exitWithSuccess();\n } catch (error) {\n exitWithError(\n error instanceof Error ? error.message : String(error),\n exitCodes.generalError,\n );\n }\n}\n", "import { executeGitCommand } from \"../executor.ts\";\n\nexport interface GitWorktree {\n path: string;\n branch: string;\n head: string;\n isLocked: boolean;\n isPrunable: boolean;\n}\n\nexport async function listWorktrees(gitRoot: string): Promise<GitWorktree[]> {\n const { stdout } = await executeGitCommand([\n \"worktree\",\n \"list\",\n \"--porcelain\",\n ]);\n\n const worktrees: GitWorktree[] = [];\n let currentWorktree: Partial<GitWorktree> = {};\n\n const lines = stdout.split(\"\\n\").filter((line) => line.length > 0);\n\n for (const line of lines) {\n if (line.startsWith(\"worktree \")) {\n if (currentWorktree.path) {\n worktrees.push(currentWorktree as GitWorktree);\n }\n currentWorktree = {\n path: line.substring(\"worktree \".length),\n isLocked: false,\n isPrunable: false,\n };\n } else if (line.startsWith(\"HEAD \")) {\n currentWorktree.head = line.substring(\"HEAD \".length);\n } else if (line.startsWith(\"branch \")) {\n const fullBranch = line.substring(\"branch \".length);\n currentWorktree.branch = fullBranch.startsWith(\"refs/heads/\")\n ? fullBranch.substring(\"refs/heads/\".length)\n : fullBranch;\n } else if (line === \"detached\") {\n currentWorktree.branch = \"(detached HEAD)\";\n } else if (line === \"locked\") {\n currentWorktree.isLocked = true;\n } else if (line === \"prunable\") {\n currentWorktree.isPrunable = true;\n }\n }\n\n if (currentWorktree.path) {\n worktrees.push(currentWorktree as GitWorktree);\n }\n\n return worktrees;\n}\n", "import { executeGitCommand } from \"../executor.ts\";\nimport { listWorktrees } from \"./list-worktrees.ts\";\n\nexport async function getCurrentWorktree(\n gitRoot: string,\n): Promise<string | null> {\n try {\n const { stdout: currentPath } = await executeGitCommand([\n \"rev-parse\",\n \"--show-toplevel\",\n ]);\n\n const currentPathTrimmed = currentPath.trim();\n\n const worktrees = await listWorktrees(gitRoot);\n\n const currentWorktree = worktrees.find(\n (wt) => wt.path === currentPathTrimmed,\n );\n\n if (!currentWorktree || currentWorktree.path === gitRoot) {\n return null;\n }\n\n return currentWorktree.branch;\n } catch {\n return null;\n }\n}\n", "import {\n executeGitCommand,\n executeGitCommandInDirectory,\n} from \"../git/executor.ts\";\nimport { type Result, err, isOk, ok } from \"../types/result.ts\";\nimport {\n GitOperationError,\n WorktreeError,\n WorktreeNotFoundError,\n} from \"./errors.ts\";\nimport { validateWorktreeExists } from \"./validate.ts\";\n\nexport interface DeleteWorktreeOptions {\n force?: boolean;\n}\n\nexport interface DeleteWorktreeSuccess {\n message: string;\n hasUncommittedChanges?: boolean;\n changedFiles?: number;\n}\n\nexport interface WorktreeStatus {\n hasUncommittedChanges: boolean;\n changedFiles: number;\n}\n\nexport async function getWorktreeStatus(\n worktreePath: string,\n): Promise<WorktreeStatus> {\n try {\n const { stdout } = await executeGitCommandInDirectory(worktreePath, [\n \"status\",\n \"--porcelain\",\n ]);\n if (stdout) {\n return {\n hasUncommittedChanges: true,\n changedFiles: stdout.split(\"\\n\").length,\n };\n }\n } catch {\n // If git status fails, assume no changes\n }\n return {\n hasUncommittedChanges: false,\n changedFiles: 0,\n };\n}\n\nexport async function removeWorktree(\n gitRoot: string,\n worktreePath: string,\n force = false,\n): Promise<void> {\n try {\n await executeGitCommand([\"worktree\", \"remove\", worktreePath], {\n cwd: gitRoot,\n });\n } catch (error) {\n // Always try force removal if the regular removal fails\n try {\n await executeGitCommand([\"worktree\", \"remove\", \"--force\", worktreePath], {\n cwd: gitRoot,\n });\n } catch {\n throw new Error(\"Failed to remove worktree\");\n }\n }\n}\n\nexport async function deleteBranch(\n gitRoot: string,\n branchName: string,\n): Promise<Result<boolean, GitOperationError>> {\n try {\n await executeGitCommand([\"branch\", \"-D\", branchName], { cwd: gitRoot });\n return ok(true);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return err(new GitOperationError(\"branch delete\", errorMessage));\n }\n}\n\nexport async function deleteWorktree(\n gitRoot: string,\n name: string,\n options: DeleteWorktreeOptions = {},\n): Promise<\n Result<\n DeleteWorktreeSuccess,\n WorktreeNotFoundError | WorktreeError | GitOperationError\n >\n> {\n const { force = false } = options;\n\n const validation = await validateWorktreeExists(gitRoot, name);\n if (!validation.exists) {\n return err(new WorktreeNotFoundError(name));\n }\n\n const worktreePath = validation.path as string;\n\n const status = await getWorktreeStatus(worktreePath);\n\n if (status.hasUncommittedChanges && !force) {\n return err(\n new WorktreeError(\n `Worktree '${name}' has uncommitted changes (${status.changedFiles} files). Use --force to delete anyway.`,\n ),\n );\n }\n\n try {\n await removeWorktree(gitRoot, worktreePath, force);\n\n const branchName = name;\n const branchResult = await deleteBranch(gitRoot, branchName);\n\n let message: string;\n if (isOk(branchResult)) {\n message = `Deleted worktree '${name}' and its branch '${branchName}'`;\n } else {\n message = `Deleted worktree '${name}'`;\n message += `\\nNote: Branch '${branchName}' could not be deleted: ${branchResult.error.message}`;\n }\n\n if (status.hasUncommittedChanges) {\n message = `Warning: Worktree '${name}' had uncommitted changes (${status.changedFiles} files)\\n${message}`;\n }\n\n return ok({\n message,\n hasUncommittedChanges: status.hasUncommittedChanges,\n changedFiles: status.hasUncommittedChanges\n ? status.changedFiles\n : undefined,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return err(new GitOperationError(\"worktree remove\", errorMessage));\n }\n}\n", "import { parseArgs } from \"node:util\";\nimport { getGitRoot } from \"../../core/git/libs/get-git-root.ts\";\nimport { execInWorktree as execInWorktreeCore } from \"../../core/process/exec.ts\";\nimport { isErr } from \"../../core/types/result.ts\";\nimport { WorktreeNotFoundError } from \"../../core/worktree/errors.ts\";\nimport { exitCodes, exitWithError } from \"../errors.ts\";\n\nexport async function execHandler(args: string[]): Promise<void> {\n const { positionals } = parseArgs({\n args,\n options: {},\n strict: true,\n allowPositionals: true,\n });\n\n if (positionals.length < 2) {\n exitWithError(\n \"Usage: phantom exec <worktree-name> <command> [args...]\",\n exitCodes.validationError,\n );\n }\n\n const [worktreeName, ...commandArgs] = positionals;\n\n try {\n const gitRoot = await getGitRoot();\n const result = await execInWorktreeCore(gitRoot, worktreeName, commandArgs);\n\n if (isErr(result)) {\n const exitCode =\n result.error instanceof WorktreeNotFoundError\n ? exitCodes.notFound\n : result.error.exitCode || exitCodes.generalError;\n exitWithError(result.error.message, exitCode);\n }\n\n process.exit(result.value.exitCode);\n } catch (error) {\n exitWithError(\n error instanceof Error ? error.message : String(error),\n exitCodes.generalError,\n );\n }\n}\n", "import { parseArgs } from \"node:util\";\nimport { getGitRoot } from \"../../core/git/libs/get-git-root.ts\";\nimport { isErr } from \"../../core/types/result.ts\";\nimport { listWorktrees as listWorktreesCore } from \"../../core/worktree/list.ts\";\nimport { exitCodes, exitWithError } from \"../errors.ts\";\nimport { output } from \"../output.ts\";\n\nexport async function listHandler(args: string[] = []): Promise<void> {\n parseArgs({\n args,\n options: {},\n strict: true,\n allowPositionals: false,\n });\n try {\n const gitRoot = await getGitRoot();\n const result = await listWorktreesCore(gitRoot);\n\n if (isErr(result)) {\n exitWithError(\"Failed to list worktrees\", exitCodes.generalError);\n }\n\n const { worktrees, message } = result.value;\n\n if (worktrees.length === 0) {\n output.log(message || \"No worktrees found.\");\n process.exit(exitCodes.success);\n }\n\n const maxNameLength = Math.max(...worktrees.map((wt) => wt.name.length));\n\n for (const worktree of worktrees) {\n const paddedName = worktree.name.padEnd(maxNameLength + 2);\n const branchInfo = worktree.branch ? `(${worktree.branch})` : \"\";\n const status = !worktree.isClean ? \" [dirty]\" : \"\";\n\n output.log(`${paddedName} ${branchInfo}${status}`);\n }\n\n process.exit(exitCodes.success);\n } catch (error) {\n exitWithError(\n error instanceof Error ? error.message : String(error),\n exitCodes.generalError,\n );\n }\n}\n", "import { executeGitCommandInDirectory } from \"../git/executor.ts\";\nimport { listWorktrees as gitListWorktrees } from \"../git/libs/list-worktrees.ts\";\nimport { getPhantomDirectory, getWorktreePath } from \"../paths.ts\";\nimport { type Result, ok } from \"../types/result.ts\";\n\nexport interface WorktreeInfo {\n name: string;\n path: string;\n branch: string;\n isClean: boolean;\n}\n\nexport interface ListWorktreesSuccess {\n worktrees: WorktreeInfo[];\n message?: string;\n}\n\nexport async function getWorktreeBranch(worktreePath: string): Promise<string> {\n try {\n const { stdout } = await executeGitCommandInDirectory(worktreePath, [\n \"branch\",\n \"--show-current\",\n ]);\n return stdout || \"(detached HEAD)\";\n } catch {\n return \"unknown\";\n }\n}\n\nexport async function getWorktreeStatus(\n worktreePath: string,\n): Promise<boolean> {\n try {\n const { stdout } = await executeGitCommandInDirectory(worktreePath, [\n \"status\",\n \"--porcelain\",\n ]);\n return !stdout; // Clean if no output\n } catch {\n // If git status fails, assume clean\n return true;\n }\n}\n\nexport async function getWorktreeInfo(\n gitRoot: string,\n name: string,\n): Promise<WorktreeInfo> {\n const worktreePath = getWorktreePath(gitRoot, name);\n\n const [branch, isClean] = await Promise.all([\n getWorktreeBranch(worktreePath),\n getWorktreeStatus(worktreePath),\n ]);\n\n return {\n name,\n path: worktreePath,\n branch,\n isClean,\n };\n}\n\nexport async function listWorktrees(\n gitRoot: string,\n): Promise<Result<ListWorktreesSuccess, never>> {\n try {\n const gitWorktrees = await gitListWorktrees(gitRoot);\n const phantomDir = getPhantomDirectory(gitRoot);\n\n const phantomWorktrees = gitWorktrees.filter((worktree) =>\n worktree.path.startsWith(phantomDir),\n );\n\n if (phantomWorktrees.length === 0) {\n return ok({\n worktrees: [],\n message: \"No worktrees found\",\n });\n }\n\n const worktrees = await Promise.all(\n phantomWorktrees.map(async (gitWorktree) => {\n const name = gitWorktree.path.substring(phantomDir.length + 1);\n const isClean = await getWorktreeStatus(gitWorktree.path);\n\n return {\n name,\n path: gitWorktree.path,\n branch: gitWorktree.branch || \"(detached HEAD)\",\n isClean,\n };\n }),\n );\n\n return ok({\n worktrees,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to list worktrees: ${errorMessage}`);\n }\n}\n", "import { parseArgs } from \"node:util\";\nimport { getGitRoot } from \"../../core/git/libs/get-git-root.ts\";\nimport { shellInWorktree as shellInWorktreeCore } from \"../../core/process/shell.ts\";\nimport { isErr } from \"../../core/types/result.ts\";\nimport { WorktreeNotFoundError } from \"../../core/worktree/errors.ts\";\nimport { validateWorktreeExists } from \"../../core/worktree/validate.ts\";\nimport { exitCodes, exitWithError } from \"../errors.ts\";\nimport { output } from \"../output.ts\";\n\nexport async function shellHandler(args: string[]): Promise<void> {\n const { positionals } = parseArgs({\n args,\n options: {},\n strict: true,\n allowPositionals: true,\n });\n\n if (positionals.length === 0) {\n exitWithError(\n \"Usage: phantom shell <worktree-name>\",\n exitCodes.validationError,\n );\n }\n\n const worktreeName = positionals[0];\n\n try {\n const gitRoot = await getGitRoot();\n\n // Get worktree path for display\n const validation = await validateWorktreeExists(gitRoot, worktreeName);\n if (!validation.exists) {\n exitWithError(\n validation.message || `Worktree '${worktreeName}' not found`,\n exitCodes.generalError,\n );\n }\n\n output.log(`Entering worktree '${worktreeName}' at ${validation.path}`);\n output.log(\"Type 'exit' to return to your original directory\\n\");\n\n const result = await shellInWorktreeCore(gitRoot, worktreeName);\n\n if (isErr(result)) {\n const exitCode =\n result.error instanceof WorktreeNotFoundError\n ? exitCodes.notFound\n : result.error.exitCode || exitCodes.generalError;\n exitWithError(result.error.message, exitCode);\n }\n\n process.exit(result.value.exitCode);\n } catch (error) {\n exitWithError(\n error instanceof Error ? error.message : String(error),\n exitCodes.generalError,\n );\n }\n}\n", "import { parseArgs } from \"node:util\";\nimport { getVersion } from \"../../core/version.ts\";\nimport { exitWithSuccess } from \"../errors.ts\";\nimport { output } from \"../output.ts\";\n\nexport function versionHandler(args: string[] = []): void {\n parseArgs({\n args,\n options: {},\n strict: true,\n allowPositionals: false,\n });\n const version = getVersion();\n output.log(`Phantom v${version}`);\n exitWithSuccess();\n}\n", "{\n \"name\": \"@aku11i/phantom\",\n \"packageManager\": \"pnpm@10.8.1\",\n \"version\": \"0.6.0\",\n \"description\": \"A powerful CLI tool for managing Git worktrees for parallel development\",\n \"keywords\": [\n \"git\",\n \"worktree\",\n \"cli\",\n \"phantom\",\n \"workspace\",\n \"development\",\n \"parallel\"\n ],\n \"homepage\": \"https://github.com/aku11i/phantom#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/aku11i/phantom/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/aku11i/phantom.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"aku11i\",\n \"type\": \"module\",\n \"bin\": {\n \"phantom\": \"./dist/phantom.js\"\n },\n \"scripts\": {\n \"start\": \"node ./src/bin/phantom.ts\",\n \"phantom\": \"node ./src/bin/phantom.ts\",\n \"build\": \"node build.ts\",\n \"typecheck\": \"tsgo --noEmit\",\n \"test\": \"node --test --experimental-strip-types --experimental-test-module-mocks \\\"src/**/*.test.js\\\"\",\n \"test:coverage\": \"node --experimental-test-coverage --test --experimental-strip-types --experimental-test-module-mocks \\\"src/**/*.test.js\\\"\",\n \"test:file\": \"node --test --experimental-strip-types --experimental-test-module-mocks\",\n \"lint\": \"biome check .\",\n \"fix\": \"biome check --write .\",\n \"ready\": \"pnpm fix && pnpm typecheck && pnpm test\",\n \"ready:check\": \"pnpm lint && pnpm typecheck && pnpm test\",\n \"prepublishOnly\": \"pnpm ready:check && pnpm build\"\n },\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"files\": [\n \"dist/\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"devDependencies\": {\n \"@biomejs/biome\": \"^1.9.4\",\n \"@types/node\": \"^22.15.29\",\n \"@typescript/native-preview\": \"7.0.0-dev.20250602.1\",\n \"esbuild\": \"^0.25.5\",\n \"typescript\": \"^5.8.3\"\n }\n}\n", "import packageJson from \"../../package.json\" with { type: \"json\" };\n\nexport function getVersion(): string {\n return packageJson.version;\n}\n", "import { parseArgs } from \"node:util\";\nimport { getGitRoot } from \"../../core/git/libs/get-git-root.ts\";\nimport { isErr } from \"../../core/types/result.ts\";\nimport { whereWorktree as whereWorktreeCore } from \"../../core/worktree/where.ts\";\nimport { exitCodes, exitWithError, exitWithSuccess } from \"../errors.ts\";\nimport { output } from \"../output.ts\";\n\nexport async function whereHandler(args: string[]): Promise<void> {\n const { positionals } = parseArgs({\n args,\n options: {},\n strict: true,\n allowPositionals: true,\n });\n\n if (positionals.length === 0) {\n exitWithError(\"Please provide a worktree name\", exitCodes.validationError);\n }\n\n const worktreeName = positionals[0];\n\n try {\n const gitRoot = await getGitRoot();\n const result = await whereWorktreeCore(gitRoot, worktreeName);\n\n if (isErr(result)) {\n exitWithError(result.error.message, exitCodes.notFound);\n }\n\n output.log(result.value.path);\n exitWithSuccess();\n } catch (error) {\n exitWithError(\n error instanceof Error ? error.message : String(error),\n exitCodes.generalError,\n );\n }\n}\n", "import { type Result, err, ok } from \"../types/result.ts\";\nimport { WorktreeNotFoundError } from \"./errors.ts\";\nimport { validateWorktreeExists } from \"./validate.ts\";\n\nexport interface WhereWorktreeSuccess {\n path: string;\n}\n\nexport async function whereWorktree(\n gitRoot: string,\n name: string,\n): Promise<Result<WhereWorktreeSuccess, WorktreeNotFoundError>> {\n const validation = await validateWorktreeExists(gitRoot, name);\n\n if (!validation.exists) {\n return err(new WorktreeNotFoundError(name));\n }\n\n return ok({\n path: validation.path as string,\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["args", "command", "resolve", "command", "args", "command", "args", "args", "parseArgs", "fs", "fs", "command", "fs", "path", "path", "path", "fs", "args", "parseArgs", "parseArgs", "args", "parseArgs", "parseArgs", "args", "parseArgs", "parseArgs", "getWorktreeStatus", "listWorktrees", "getWorktreeStatus", "args", "parseArgs", "listWorktrees", "parseArgs", "args", "parseArgs", "parseArgs", "args", "parseArgs", "parseArgs", "args", "parseArgs", "commands", "args", "command", "remainingArgs"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aku11i/phantom",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "A powerful CLI tool for managing Git worktrees for parallel development",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"git",
|
|
@@ -44,11 +44,13 @@
|
|
|
44
44
|
"start": "node ./src/bin/phantom.ts",
|
|
45
45
|
"phantom": "node ./src/bin/phantom.ts",
|
|
46
46
|
"build": "node build.ts",
|
|
47
|
-
"
|
|
48
|
-
"test": "node --test --experimental-strip-types --experimental-test-module-mocks src/**/*.test.
|
|
47
|
+
"typecheck": "tsgo --noEmit",
|
|
48
|
+
"test": "node --test --experimental-strip-types --experimental-test-module-mocks \"src/**/*.test.js\"",
|
|
49
|
+
"test:coverage": "node --experimental-test-coverage --test --experimental-strip-types --experimental-test-module-mocks \"src/**/*.test.js\"",
|
|
50
|
+
"test:file": "node --test --experimental-strip-types --experimental-test-module-mocks",
|
|
49
51
|
"lint": "biome check .",
|
|
50
52
|
"fix": "biome check --write .",
|
|
51
|
-
"ready": "pnpm fix && pnpm
|
|
52
|
-
"ready:check": "pnpm lint && pnpm
|
|
53
|
+
"ready": "pnpm fix && pnpm typecheck && pnpm test",
|
|
54
|
+
"ready:check": "pnpm lint && pnpm typecheck && pnpm test"
|
|
53
55
|
}
|
|
54
56
|
}
|